Browse Source

refactor: vuex re-org + modal-create-page

NGPixel 8 years ago
parent
commit
f075c266ef

+ 10 - 0
client/js/app.js

@@ -4,9 +4,11 @@
 /* eslint-disable no-new */
 
 import $ from 'jquery'
+import _ from 'lodash'
 import Vue from 'vue'
 import VueResource from 'vue-resource'
 import VueClipboards from 'vue-clipboards'
+import VueLodash from 'vue-lodash'
 import store from './store'
 import io from 'socket-io-client'
 import i18next from 'i18next'
@@ -15,6 +17,12 @@ import VueI18Next from '@panter/vue-i18next'
 import 'jquery-smooth-scroll'
 import 'jquery-sticky'
 
+// ====================================
+// Load Helpers
+// ====================================
+
+import helpers from './helpers'
+
 // ====================================
 // Load Vue Components
 // ====================================
@@ -40,6 +48,7 @@ import sourceViewComponent from './pages/source-view.component.js'
 Vue.use(VueResource)
 Vue.use(VueClipboards)
 Vue.use(VueI18Next)
+Vue.use(VueLodash, _)
 
 i18next
   .use(i18nextXHR)
@@ -78,6 +87,7 @@ $(() => {
 
   const i18n = new VueI18Next(i18next)
   new Vue({
+    mixins: [helpers],
     components: {
       alert: alertComponent,
       adminProfile: adminProfileComponent,

+ 13 - 14
client/js/components/modal-create-page.vue

@@ -1,12 +1,12 @@
 <template lang="pug">
-  .modal(v-if='isShown')
+  .modal(v-bind:class='{ "is-active": isShown }')
     .modal-background
     .modal-container
       .modal-content
         header.is-light-blue Create New Document
         section
           label.label Enter the new document path:
-          p.control.is-fullwidth(v-class='{ "is-loading": isLoading }')
+          p.control.is-fullwidth(v-bind:class='{ "is-loading": isLoading }')
             input.input(type='text', placeholder='page-name', v-model='entrypath', autofocus)
             span.help.is-danger(v-show='isInvalid') This document path is invalid!
         footer
@@ -15,30 +15,29 @@
 </template>
 
 <script>
-  import { isEmpty } from 'lodash'
-  // import { makeSafePath } from '../helpers/pages'
   import { mapState } from 'vuex'
 
   export default {
-    name: 'modal-create',
+    name: 'modal-create-page',
+    props: ['basepath'],
     data () {
       return {
         isLoading: false
       }
     },
-    computed: mapState('createPage', {
-      entrypath: '',
-      isShown: 'shown',
-      isInvalid: 'invalid'
-    }),
+    computed: {
+      entrypath () { return this.$store.state.modalCreatePage.entrypath }
+      isShown () { return this.$store.state.modalCreatePage.shown }
+      isInvalid () { return this.$store.state.modalCreatePage.invalid }
+    },
     methods: {
       cancel: function () {
-        this.$store.dispatch('createPageClose')
+        this.$store.dispatch('modalCreatePage/close')
       },
       create: function () {
         this.isInvalid = false
-        let newDocPath = makeSafePath(this.entrypath)
-        if (isEmpty(newDocPath)) {
+        let newDocPath = this.helpers.pages.makeSafePath(this.entrypath)
+        if (this._.isEmpty(newDocPath)) {
           this.$store.createPage.commit('')
         } else {
           this.isLoading = true
@@ -47,7 +46,7 @@
       }
     },
     mounted () {
-      // this.entrypath = currentBasePath + '/new-page'
+      this.$store.commit('modalCreatePage/pathChange', this.basepath + '/new-page')
     }
   }
 </script>

+ 3 - 3
client/js/components/modal-create-user.vue

@@ -36,7 +36,7 @@
 
 <script>
   export default {
-    name: 'admin-users-create',
+    name: 'modal-create-user',
     data () {
       return {
         email: '',
@@ -48,12 +48,12 @@
     },
     computed: {
       isShown () {
-        return this.$store.state.adminUsersCreate.shown
+        return this.$store.state.modalCreateUser.shown
       }
     },
     methods: {
       cancel () {
-        this.$store.dispatch('adminUsersCreateClose')
+        this.$store.dispatch('modalCreateUser/close')
         this.email = ''
         this.provider = 'local'
       },

+ 3 - 3
client/js/components/page-loader.js

@@ -1,13 +1,13 @@
 'use strict'
 
 import $ from 'jquery'
-import delay from 'lodash/delay'
+import _ from 'lodash'
 
 module.exports = {
 
-  complete () {
+  complete() {
     $('#page-loader').addClass('is-loaded')
-    delay(() => {
+    _.delay(() => {
       $('#page-loader').addClass('is-hidden')
     }, 1100)
   }

+ 1 - 2
client/js/components/search.vue

@@ -18,7 +18,6 @@
 </template>
 
 <script>
-  import * as _ from 'lodash'
   import * as $ from 'jquery'
 
   export default {
@@ -44,7 +43,7 @@
           socket.emit('search', { terms: val }, (data) => {
             self.searchres = data.match
             self.searchsuggest = data.suggest
-            self.searchmovearr = _.concat([], self.searchres, self.searchsuggest)
+            self.searchmovearr = self._.concat([], self.searchres, self.searchsuggest)
             if (self.searchload > 0) { self.searchload-- }
           })
         } else {

+ 6 - 8
client/js/components/tree.vue

@@ -15,8 +15,6 @@
 </template>
 
 <script>
-  import * as _ from 'lodash'
-
   export default {
     name: '',
     data () {
@@ -31,9 +29,9 @@
         self.$nextTick(() => {
           socket.emit('treeFetch', { basePath }, (data) => {
             if (self.tree.length > 0) {
-              let branch = _.last(self.tree)
+              let branch = self._.last(self.tree)
               branch.hasChildren = true
-              _.find(branch.pages, { _id: basePath }).isActive = true
+              self._.find(branch.pages, { _id: basePath }).isActive = true
             }
             self.tree.push({
               hasChildren: false,
@@ -49,14 +47,14 @@
       unfold (entryPath) {
         let self = this
         let lastIndex = 0
-        _.forEach(self.tree, branch => {
+        self._.forEach(self.tree, branch => {
           lastIndex++
-          if (_.find(branch.pages, { _id: entryPath }) !== undefined) {
+          if (self._.find(branch.pages, { _id: entryPath }) !== undefined) {
             return false
           }
         })
-        self.tree = _.slice(self.tree, 0, lastIndex)
-        let branch = _.last(self.tree)
+        self.tree = self._.slice(self.tree, 0, lastIndex)
+        let branch = self._.last(self.tree)
         branch.hasChildren = false
         branch.pages.forEach(page => {
           page.isActive = false

+ 8 - 0
client/js/helpers/index.js

@@ -0,0 +1,8 @@
+'use strict'
+
+export default {
+  helpers: {
+    form: require('./form'),
+    pages: require('./pages')
+  }
+}

+ 8 - 4
client/js/store/modules/modal-create-page.js

@@ -1,15 +1,19 @@
 'use strict'
 
 export default {
+  namespaced: true,
   state: {
-    shown: false
+    entrypath: '',
+    shown: false,
+    invalid: false
   },
   getters: {},
   mutations: {
-    shownChange: (state, shownState) => { state.shown = shownState }
+    shownChange: (state, shownState) => { state.shown = shownState },
+    pathChange: (state, newpath) => { state.entrypath = newpath }
   },
   actions: {
-    adminUsersCreateOpen({ commit }) { commit('shownChange', true) },
-    adminUsersCreateClose({ commit }) { commit('shownChange', false) }
+    open({ commit }) { commit('shownChange', true) },
+    close({ commit }) { commit('shownChange', false) }
   }
 }

+ 3 - 2
client/js/store/modules/modal-create-user.js

@@ -1,6 +1,7 @@
 'use strict'
 
 export default {
+  namespaced: true,
   state: {
     shown: false
   },
@@ -9,7 +10,7 @@ export default {
     shownChange: (state, shownState) => { state.shown = shownState }
   },
   actions: {
-    adminUsersCreateOpen({ commit }) { commit('shownChange', true) },
-    adminUsersCreateClose({ commit }) { commit('shownChange', false) }
+    open({ commit }) { commit('shownChange', true) },
+    close({ commit }) { commit('shownChange', false) }
   }
 }

+ 31 - 25
fuse.js

@@ -46,6 +46,32 @@ if (args.d) {
   console.info(colors.bgWhite.black(' Starting Fuse in BUILD mode... '))
 }
 
+// ======================================================
+// BUILD VARS
+// ======================================================
+
+const ALIASES = {
+  'brace-ext-modelist': 'brace/ext/modelist.js',
+  'simplemde': 'simplemde/dist/simplemde.min.js',
+  'socket-io-client': 'socket.io-client/dist/socket.io.js',
+  'vue': (dev) ? 'vue/dist/vue.js' : 'vue/dist/vue.min.js',
+  'vue-lodash': 'vue-lodash/dist/vue-lodash.min.js'
+}
+const SHIMS = {
+  _preinit: {
+    source: '.build/_preinit.js',
+    exports: '_preinit'
+  },
+  jquery: {
+    source: 'node_modules/jquery/dist/jquery.js',
+    exports: '$'
+  },
+  mathjax: {
+    source: 'node_modules/mathjax/MathJax.js',
+    exports: 'MathJax'
+  }
+}
+
 // ======================================================
 // Global Tasks
 // ======================================================
@@ -191,27 +217,6 @@ let globalTasks = Promise.mapSeries([
 // Fuse Tasks
 // ======================================================
 
-const ALIASES = {
-  'brace-ext-modelist': 'brace/ext/modelist.js',
-  'simplemde': 'simplemde/dist/simplemde.min.js',
-  'socket-io-client': 'socket.io-client/dist/socket.io.js',
-  'vue': (dev) ? 'vue/dist/vue.js' : 'vue/dist/vue.min.js'
-}
-const SHIMS = {
-  _preinit: {
-    source: '.build/_preinit.js',
-    exports: '_preinit'
-  },
-  jquery: {
-    source: 'node_modules/jquery/dist/jquery.js',
-    exports: '$'
-  },
-  mathjax: {
-    source: 'node_modules/mathjax/MathJax.js',
-    exports: 'MathJax'
-  }
-}
-
 globalTasks.then(() => {
   let fuse = fsbx.FuseBox.init({
     homeDir: './client',
@@ -222,7 +227,7 @@ globalTasks.then(() => {
       fsbx.EnvPlugin({ NODE_ENV: (dev) ? 'development' : 'production' }),
       fsbx.VuePlugin(),
       ['.scss', fsbx.SassPlugin({ outputStyle: (dev) ? 'nested' : 'compressed' }), fsbx.CSSPlugin()],
-      fsbx.BabelPlugin({ comments: false, presets: ['es2015'] }),
+      dev && fsbx.BabelPlugin({ comments: false, presets: ['es2015'] }),
       fsbx.JSONPlugin(),
       !dev && fsbx.UglifyESPlugin({
         compress: { unused: false },
@@ -240,13 +245,14 @@ globalTasks.then(() => {
     })
   }
 
-  const bundleLibs = fuse.bundle('libs').instructions('~ index.js - brace')
-  const bundleApp = fuse.bundle('app').instructions('!> [index.js]')
+  // const bundleLibs = fuse.bundle('libs').instructions('~ index.js - brace')
+  // const bundleApp = fuse.bundle('app').instructions('!> [index.js]')
+  const bundleApp = fuse.bundle('app').instructions('> index.js')
   const bundleSetup = fuse.bundle('configure').instructions('> configure.js')
 
   switch (mode) {
     case 'dev':
-      bundleLibs.watch()
+      // bundleLibs.watch()
       bundleApp.watch()
       break
     case 'dev-configure':

+ 3 - 1
package.json

@@ -139,7 +139,7 @@
     "eslint-plugin-node": "latest",
     "eslint-plugin-promise": "latest",
     "eslint-plugin-standard": "latest",
-    "fuse-box": "^2.0.0",
+    "fuse-box": "2.1.0-beta.10",
     "i18next-xhr-backend": "^1.4.1",
     "jest": "latest",
     "jquery": "^3.2.1",
@@ -147,6 +147,7 @@
     "jquery-simple-upload": "^1.0.0",
     "jquery-smooth-scroll": "^2.2.0",
     "jquery-sticky": "^1.0.4",
+    "lodash-cli": "^4.17.4",
     "lodash-es": "^4.17.4",
     "mathjax": "^2.7.1",
     "node-sass": "latest",
@@ -159,6 +160,7 @@
     "vee-validate": "^2.0.0-rc.3",
     "vue": "^2.3.3",
     "vue-clipboards": "^1.0.0",
+    "vue-lodash": "^1.0.3",
     "vue-resource": "^1.3.3",
     "vue-template-compiler": "^2.3.3",
     "vue-template-es2015-compiler": "^1.5.2",

+ 1 - 1
server/views/auth/login.pug

@@ -18,7 +18,7 @@ html(data-logic='login')
     link(rel='manifest', href='/manifest.json')
 
     // JS / CSS
-    script(type='text/javascript', src='/js/libs.min.js')
+    //- script(type='text/javascript', src='/js/libs.min.js')
     script(type='text/javascript', src='/js/app.min.js')
 
   body

+ 1 - 1
server/views/error-forbidden.pug

@@ -18,7 +18,7 @@ html(data-logic='error')
     link(rel='manifest', href='/manifest.json')
 
     // JS / CSS
-    script(type='text/javascript', src='/js/libs.min.js')
+    //- script(type='text/javascript', src='/js/libs.min.js')
     script(type='text/javascript', src='/js/app.min.js')
 
   body(class='is-forbidden')

+ 1 - 1
server/views/error-notexist.pug

@@ -18,7 +18,7 @@ html(data-logic='error')
     link(rel='manifest', href='/manifest.json')
 
     // JS / CSS
-    script(type='text/javascript', src='/js/libs.min.js')
+    //- script(type='text/javascript', src='/js/libs.min.js')
     script(type='text/javascript', src='/js/app.min.js')
 
   body(class='is-notexist')

+ 1 - 1
server/views/error.pug

@@ -18,7 +18,7 @@ html(data-logic='error')
     link(rel='manifest', href='/manifest.json')
 
     // JS / CSS
-    script(type='text/javascript', src='/js/libs.min.js')
+    //- script(type='text/javascript', src='/js/libs.min.js')
     script(type='text/javascript', src='/js/app.min.js')
 
   body(class='is-error')

+ 1 - 1
server/views/layout.pug

@@ -23,7 +23,7 @@ html
       var siteRoot = '!{appconfig.host}';
 
     //- JS / CSS
-    script(type='text/javascript', src='/js/libs.min.js')
+    //- script(type='text/javascript', src='/js/libs.min.js')
     script(type='text/javascript', src='/js/app.min.js')
 
     block head

+ 2 - 2
server/views/pages/admin/users.pug

@@ -3,7 +3,7 @@ extends ./_layout.pug
 block rootNavRight
   loading-spinner
   .nav-item
-    a.button(v-on:click='$store.dispatch("adminUsersCreateOpen")')
+    a.button(v-on:click='$store.dispatch("modalCreateUser/open")')
       i.icon-plus
       span= t('admin:users.createauthorize')
 
@@ -43,4 +43,4 @@ block adminContent
           td.is-centered= moment(usr.createdAt).format('lll')
           td.is-centered= moment(usr.updatedAt).format('lll')
 
-  admin-users-create
+  modal-create-user

+ 2 - 4
server/views/pages/view.pug

@@ -25,13 +25,12 @@ block rootNavRight
       a.button(href='/edit/' + pageData.meta.path)
         i.icon-document-text
         span= t('nav.edit')
-      a.button.btn-create-prompt
+      a.button(v-on:click='$store.dispatch("modalCreatePage/open")')
         i.icon-plus
         span= t('nav.create')
 
 block content
 
-  //- #page-type-view.page-type-container(data-entrypath=pageData.meta.path)
   content-view(inline-template)
     .container.is-fluid.has-mkcontent
       .columns.is-gapless
@@ -82,6 +81,5 @@ block content
           .content.mkcontent
             != pageData.html
 
-  include ../modals/create.pug
-  include ../modals/move.pug
+  modal-create-page(basepath=pageData.meta.path)
   anchor

+ 101 - 41
yarn.lock

@@ -338,6 +338,10 @@ async@2.1.4, async@^2.1.4:
   dependencies:
     lodash "^4.14.0"
 
+async@~0.2.6:
+  version "0.2.10"
+  resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+
 async@~0.9.0:
   version "0.9.2"
   resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
@@ -722,7 +726,7 @@ babel-plugin-transform-strict-mode@^6.24.1:
     babel-runtime "^6.22.0"
     babel-types "^6.24.1"
 
-babel-polyfill@^6.23.0:
+babel-polyfill@6.23.0, babel-polyfill@^6.23.0:
   version "6.23.0"
   resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
   dependencies:
@@ -1108,7 +1112,7 @@ center-align@^0.1.1:
     align-text "^0.1.3"
     lazy-cache "^1.0.3"
 
-chalk@^1.0.0, chalk@^1.1, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
+chalk@1.1.3, chalk@^1.0.0, chalk@^1.1, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
   dependencies:
@@ -1261,6 +1265,12 @@ cliui@^3.2.0:
     strip-ansi "^3.0.1"
     wrap-ansi "^2.0.0"
 
+closure-compiler@0.2.12:
+  version "0.2.12"
+  resolved "https://registry.yarnpkg.com/closure-compiler/-/closure-compiler-0.2.12.tgz#6c3087cad12742c79e47f0ce50e87af91cf8e171"
+  dependencies:
+    google-closure-compiler "20150901.x"
+
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -1834,6 +1844,12 @@ encodeurl@~1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
 
+encoding@^0.1.11:
+  version "0.1.12"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+  dependencies:
+    iconv-lite "~0.4.13"
+
 end-of-stream@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e"
@@ -2595,9 +2611,9 @@ functional-red-black-tree@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
 
-fuse-box@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/fuse-box/-/fuse-box-2.0.0.tgz#b5a712c91e2266af41b3045e6ed341d64aafb992"
+fuse-box@2.1.0-beta.10:
+  version "2.1.0-beta.10"
+  resolved "https://registry.yarnpkg.com/fuse-box/-/fuse-box-2.1.0-beta.10.tgz#37a3eced1aaa3e665a848af6523f3b87f39e6cbc"
   dependencies:
     acorn "^4.0.3"
     acorn-es7 "^0.1.0"
@@ -2616,6 +2632,7 @@ fuse-box@^2.0.0:
     ieee754 "^1.1.8"
     inquirer "^3.0.6"
     mustache "^2.3.0"
+    opencollective "^1.0.3"
     postcss "^6.0.1"
     pretty-time "^0.2.0"
     prettysize "0.0.3"
@@ -2710,24 +2727,24 @@ glob-parent@^2.0.0:
   dependencies:
     is-glob "^2.0.0"
 
-glob@^6.0.1:
-  version "6.0.4"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+glob@7.1.1, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@~7.1.1:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
   dependencies:
+    fs.realpath "^1.0.0"
     inflight "^1.0.4"
     inherits "2"
-    minimatch "2 || 3"
+    minimatch "^3.0.2"
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@~7.1.1:
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
+glob@^6.0.1:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
   dependencies:
-    fs.realpath "^1.0.0"
     inflight "^1.0.4"
     inherits "2"
-    minimatch "^3.0.2"
+    minimatch "2 || 3"
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
@@ -2767,6 +2784,10 @@ good-listener@^1.2.0:
   dependencies:
     delegate "^3.1.2"
 
+google-closure-compiler@20150901.x:
+  version "20150901.0.0"
+  resolved "https://registry.yarnpkg.com/google-closure-compiler/-/google-closure-compiler-20150901.0.0.tgz#3d01c6cade65790a9bfb4e30b2158b7635acbade"
+
 got@^3.2.0:
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca"
@@ -2996,7 +3017,7 @@ iconv-lite@0.4.13:
   version "0.4.13"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
 
-iconv-lite@0.4.15:
+iconv-lite@0.4.15, iconv-lite@~0.4.13:
   version "0.4.15"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
 
@@ -3079,6 +3100,24 @@ inquirer@1.0.3:
     strip-ansi "^3.0.0"
     through "^2.3.6"
 
+inquirer@3.0.6, inquirer@^3.0.6:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    chalk "^1.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.1"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx "^4.1.0"
+    string-width "^2.0.0"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
 inquirer@^0.12.0:
   version "0.12.0"
   resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
@@ -3097,24 +3136,6 @@ inquirer@^0.12.0:
     strip-ansi "^3.0.0"
     through "^2.3.6"
 
-inquirer@^3.0.6:
-  version "3.0.6"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347"
-  dependencies:
-    ansi-escapes "^1.1.0"
-    chalk "^1.0.0"
-    cli-cursor "^2.1.0"
-    cli-width "^2.0.0"
-    external-editor "^2.0.1"
-    figures "^2.0.0"
-    lodash "^4.3.0"
-    mute-stream "0.0.7"
-    run-async "^2.2.0"
-    rx "^4.1.0"
-    string-width "^2.0.0"
-    strip-ansi "^3.0.0"
-    through "^2.3.6"
-
 interpret@^1.0.0:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
@@ -3304,7 +3325,7 @@ is-retry-allowed@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
 
-is-stream@^1.0.0, is-stream@^1.1.0:
+is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
 
@@ -4005,6 +4026,16 @@ locate-path@^2.0.0:
     p-locate "^2.0.0"
     path-exists "^3.0.0"
 
+lodash-cli@^4.17.4:
+  version "4.17.4"
+  resolved "https://registry.yarnpkg.com/lodash-cli/-/lodash-cli-4.17.4.tgz#23b727cd0e91e28484fafda1521900a8a811df81"
+  dependencies:
+    closure-compiler "0.2.12"
+    glob "7.1.1"
+    lodash "4.17.4"
+    semver "5.3.0"
+    uglify-js "2.7.5"
+
 lodash-es@^4.17.4:
   version "4.17.4"
   resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7"
@@ -4183,7 +4214,7 @@ lodash.uniq@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
 
-lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0:
+lodash@4.17.4, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0:
   version "4.17.4"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
 
@@ -4418,7 +4449,7 @@ minimist@0.0.8, minimist@~0.0.1:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
 
-minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
@@ -4627,6 +4658,13 @@ node-abi@^2.0.0:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.0.2.tgz#00f3e0a58100eb480133b48c99a32cc1f9e6c93e"
 
+node-fetch@1.6.3:
+  version "1.6.3"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
+  dependencies:
+    encoding "^0.1.11"
+    is-stream "^1.0.1"
+
 node-graceful@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/node-graceful/-/node-graceful-0.2.3.tgz#ab120e1eed8c0c2b5e2ac874bf2754519c3fa942"
@@ -4863,6 +4901,24 @@ open@^0.0.5:
   version "0.0.5"
   resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc"
 
+opencollective@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1"
+  dependencies:
+    babel-polyfill "6.23.0"
+    chalk "1.1.3"
+    inquirer "3.0.6"
+    minimist "1.2.0"
+    node-fetch "1.6.3"
+    opn "4.0.2"
+
+opn@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
+  dependencies:
+    object-assign "^4.0.1"
+    pinkie-promise "^2.0.0"
+
 optimist@^0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
@@ -6808,14 +6864,14 @@ uglify-es@^3.0.10:
     commander "~2.9.0"
     source-map "~0.5.1"
 
-uglify-js@^2.6, uglify-js@^2.6.1:
-  version "2.8.24"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.24.tgz#48eb5175cf32e22ec11a47e638d7c8b4e0faf2dd"
+uglify-js@2.7.5, uglify-js@^2.6, uglify-js@^2.6.1:
+  version "2.7.5"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8"
   dependencies:
+    async "~0.2.6"
     source-map "~0.5.1"
-    yargs "~3.10.0"
-  optionalDependencies:
     uglify-to-browserify "~1.0.0"
+    yargs "~3.10.0"
 
 uglify-to-browserify@~1.0.0:
   version "1.0.2"
@@ -7043,6 +7099,10 @@ vue-clipboards@^1.0.0:
   dependencies:
     clipboard "^1.5.15"
 
+vue-lodash@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/vue-lodash/-/vue-lodash-1.0.3.tgz#777ef3e190a4cdde0d211a614e52a0b38659c13f"
+
 vue-resource@^1.3.3:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/vue-resource/-/vue-resource-1.3.3.tgz#6f12cfc77cccd47fb7e07aff6c42d75e34005992"