From 06bbf7713e78fcd05c0ab143a303e15105b5e885 Mon Sep 17 00:00:00 2001 From: Justin Moen Date: Wed, 27 Dec 2017 00:16:43 -0600 Subject: [PATCH 001/123] Use same throughout docs (#8) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32d415d..a6bc839 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,7 @@ Stops the given loader. ```js import { createActionHelpers } from 'vuex-loading' const { startLoading, endLoading } = createActionHelpers({ - moduleName: 'loader' + moduleName: 'loading' }); ``` From 5819dab3554e1d1bded31c1d1e049715a3423c30 Mon Sep 17 00:00:00 2001 From: Igor Date: Thu, 18 Jan 2018 08:52:13 +0200 Subject: [PATCH 002/123] make vuex optional, big refactoring (#5) * vuex-loading refactored to vue-loading. Add ability to use VueLoading without vuex. Plugin registration rework * VueLoading constructor options --- .babelrc | 3 - README.md | 119 ++++++++----- examples/default-example/index.js | 14 ++ examples/default-example/main.vue | 156 ++++++++++++++++ examples/vuex-example/index.js | 20 +++ examples/vuex-example/main.vue | 154 ++++++++++++++++ package.json | 5 +- resources/vuex-dev-tools.png | Bin 0 -> 117385 bytes src/spinners/heart.js | 15 -- src/spinners/heart.vue | 32 ++++ src/spinners/{spinner.js => spinner.vue} | 81 +++++---- src/v-loading.vue | 27 +++ src/vue-loading.js | 217 +++++++++++++++++++++++ src/vuex-loading.js | 164 ----------------- 14 files changed, 745 insertions(+), 262 deletions(-) delete mode 100644 .babelrc create mode 100644 examples/default-example/index.js create mode 100644 examples/default-example/main.vue create mode 100644 examples/vuex-example/index.js create mode 100644 examples/vuex-example/main.vue create mode 100644 resources/vuex-dev-tools.png delete mode 100644 src/spinners/heart.js create mode 100644 src/spinners/heart.vue rename src/spinners/{spinner.js => spinner.vue} (52%) create mode 100644 src/v-loading.vue create mode 100644 src/vue-loading.js delete mode 100644 src/vuex-loading.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 002b4aa..0000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["env"] -} diff --git a/README.md b/README.md index a6bc839..fdc959f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Multiple Process Loader Management for [Vue](http://vuejs.org/) and [Vuex](http: ## Requirements - [Vue.js](https://vuejs.org) (v2.0.0+) -- [Vuex](http://vuex.vuejs.org) (v2.0.0+) +- Optional - [Vuex](http://vuex.vuejs.org) (v2.0.0+) ## Installation @@ -24,66 +24,74 @@ $ yarn add vuex-loading ## Usage ```js -import { createVuexLoader } from 'vuex-loading' - -const VuexLoading = createVuexLoader({ - // The Vuex module name, 'loading' by default. - moduleName: 'loading', - // The Vue component name, 'v-loading' by default. - componentName: 'v-loading', - // Vue component class name, 'v-loading' by default. - className: 'v-loading', -}); +import VueLoading from 'vuex-loading' Vue.use(Vuex) -Vue.use(VuexLoading) +Vue.use(VuexLoading) // add VueLoading as Vue plugin +``` + +Then you should register `VueLoading` module: -const store = new Vuex.Store({ - plugins: [VuexLoading.Store], +```js +new Vue({ + el: '#app', + store, + vueLoading: new VueLoading({registerComponents: false}), // configure VueLoading here }); ``` -Then you should register loading module: +## Usage with vuex + +Simply set `useVuex` parameter to `true` and optionally override +`moduleName` + +```js +import VueLoading from 'vuex-loading' + +Vue.use(Vuex) +Vue.use(VuexLoading) // add VueLoading as Vue plugin +``` + +Then you should register `vueLoading` module: ```js new Vue({ el: '#app', store, - computed: { - ...mapGetters('loading', [ - /* - `isLoading` returns a function with a parameter of loader name. - e.g. `isLoading('creating user')` will return you a boolean value. - */ - 'isLoading', - /* - `anyLoading` returns a boolean value if any loader name exists on store. - */ - 'anyLoading', - ]) - }, - methods: { - startLoading() { - /* - VuexLoading registers $startLoading method with loader name. - When you start a loader, it pushes the loader name to loading state. - */ - this.$startLoading('fetching data'); - }, - endLoading() { - /* - VuexLoading registers $startLoading method with loader name. - When you stop a loader, it pulls the loader name from loading state. - */ - this.$endLoading('fetching data'); - }, - }, + vueLoading: new VueLoading({useVuex: true, moduleName: 'vuex-example-module'}), // configure VueLoading here }); ``` +Now `VueLoading` will use `Vuex` store for data management +which can be traced in `Vue dev tools` + + + +## VueLoading options + +You can use this options for customize VueLoading behavior + +#### `useVuex` + +boolean value, false by default, use this value for enabling +integration with `Vuex` store + +When this value is true `VueLoading` will store data in `Vuex` store +and all changes to this data will be made by dispatching actions to store + +#### `moduleName` + +string value, `loading` by default. +Name for `Vuex` store if `useVuex` set to true, otherwise not used. + +#### `registerComponents` + +boolean value, true by default, register `v-loading` components. + ## Global Template Helpers **vuex-loading** provides some helpers to you to use in your templates. +All features can be obtained from $loading property in Vue components #### `$anyLoading` @@ -91,7 +99,7 @@ Returns boolean value if any loader exists in page. ```html ``` @@ -101,7 +109,7 @@ Returns boolean value if given loader exists in page. ```html ``` @@ -111,7 +119,7 @@ Starts the given loader. ```html ``` @@ -121,7 +129,7 @@ Stops the given loader. ```html ``` @@ -195,6 +203,16 @@ export default { ## Using `v-loading` Component +If you disable `registerComponents` option then +import and add `v-loading` into components + +```js +import vLoading from 'vuex-loading/v-loading.vue' +components: { + 'v-loading': vLoading +} +``` + In template, you should wrap your content with `v-loading` component to show loading on it. ```html @@ -310,6 +328,11 @@ You need to put them into a `template` tag. Please see `example` for more detailed example. +## Run example + +Use `npm run dev-vuex` or `npm run dev-default` commands +for running examples locally. + ## License MIT © [Fatih Kadir Akın](https://github.com/f) diff --git a/examples/default-example/index.js b/examples/default-example/index.js new file mode 100644 index 0000000..07a3c0d --- /dev/null +++ b/examples/default-example/index.js @@ -0,0 +1,14 @@ +import Vue from 'vue'; +import VueLoading from '../../src/vue-loading'; + +import main from './main.vue' + +Vue.use(VueLoading); + +new Vue({ + el: '#app', + vueLoading: new VueLoading({registerComponents: false}), + render: function (createElement) { + return createElement(main) + } +}); diff --git a/examples/default-example/main.vue b/examples/default-example/main.vue new file mode 100644 index 0000000..97ba2bd --- /dev/null +++ b/examples/default-example/main.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/examples/vuex-example/index.js b/examples/vuex-example/index.js new file mode 100644 index 0000000..ea18195 --- /dev/null +++ b/examples/vuex-example/index.js @@ -0,0 +1,20 @@ +import Vue from 'vue'; +import Vuex from 'vuex'; +import VueLoading from '../../src/vue-loading'; + +import main from './main.vue' + +Vue.use(VueLoading); +Vue.use(Vuex); + +const store = new Vuex.Store({}); + +const vueLoading = new VueLoading({useVuex: true, moduleName: 'vuex-example-module'}) +new Vue({ + el: '#app', + store, + vueLoading: vueLoading, + render: function (createElement) { + return createElement(main) + } +}); diff --git a/examples/vuex-example/main.vue b/examples/vuex-example/main.vue new file mode 100644 index 0000000..1d25085 --- /dev/null +++ b/examples/vuex-example/main.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/package.json b/package.json index 1b83daf..a7dc094 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,9 @@ "scripts": { "build": "rollup --environment NODE_ENV:production -c build/rollup.config.js && uglifyjs dist/vuex-loading.js --comments -o dist/vuex-loading.min.js", "test": "exit 0;", - "precommit": "lint-staged" + "precommit": "lint-staged", + "dev-vuex": "poi examples/vuex-example/index.js", + "dev-default": "poi examples/default-example/index.js" }, "lint-staged": { "src/**/*.js": [ @@ -47,6 +49,7 @@ "eslint": "^4.2.0", "husky": "^0.14.3", "lint-staged": "^4.0.1", + "poi": "^9.5.4", "prettier": "^1.1.0", "rollup": "^0.45.1", "rollup-plugin-buble": "^0.15.0", diff --git a/resources/vuex-dev-tools.png b/resources/vuex-dev-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..707a9a9b16a042db5ae8564dcfbf3a23b3278a92 GIT binary patch literal 117385 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�rgcTk1<{SgcWHnTE1P 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%0D~nk=o_{S5(DyKPZ!-U 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 literal 0 HcmV?d00001 diff --git a/src/spinners/heart.js b/src/spinners/heart.js deleted file mode 100644 index dcd27de..0000000 --- a/src/spinners/heart.js +++ /dev/null @@ -1,15 +0,0 @@ -export default { - props: { - width: { - type: String, - default: '100' - }, - height: { - type: String, - default: '100' - } - }, - template: ` - - ` -}; diff --git a/src/spinners/heart.vue b/src/spinners/heart.vue new file mode 100644 index 0000000..d13976f --- /dev/null +++ b/src/spinners/heart.vue @@ -0,0 +1,32 @@ + + \ No newline at end of file diff --git a/src/spinners/spinner.js b/src/spinners/spinner.vue similarity index 52% rename from src/spinners/spinner.js rename to src/spinners/spinner.vue index bbd32a7..84814a0 100644 --- a/src/spinners/spinner.js +++ b/src/spinners/spinner.vue @@ -1,67 +1,86 @@ -export default { - props: { - width: { - type: String, - default: '100' - }, - height: { - type: String, - default: '100' - } - }, - template: ` - + + \ No newline at end of file diff --git a/src/v-loading.vue b/src/v-loading.vue new file mode 100644 index 0000000..88b3510 --- /dev/null +++ b/src/v-loading.vue @@ -0,0 +1,27 @@ +
+ + + + {{ message }} + + +
+ + \ No newline at end of file diff --git a/src/vue-loading.js b/src/vue-loading.js new file mode 100644 index 0000000..111da35 --- /dev/null +++ b/src/vue-loading.js @@ -0,0 +1,217 @@ +import vLoading from './v-loading.vue'; + +export let _Vue; + +const mutations = { + LOAD: 'LOAD', + END: 'END' +}; + +const uniq = array => { + return array.filter((el, index, arr) => index == arr.indexOf(el)); +}; + +export default class VueLoading { + constructor(options = {}) { + const { + useVuex = false, + moduleName = 'loading', + registerComponents = true + } = options; // unpack options into defaults + + this.useVuex = useVuex; + this.moduleName = moduleName; + this.registerComponents = registerComponents; + this.initialized = false; + this.store = null; + } + + init(Vue /* Vue component instance */, store /* Vuex store */) { + if (process.env.NODE_ENV !== 'production' && !install.installed) { + console.warn( + `not installed. Make sure to call \`Vue.use(VueLoading)\` ` + + `before init root instance.` + ); + } + + // already initialized. + if (this.initialized) { + return; + } + + if (this.registerComponents) { + Vue.component(vLoading.name, vLoading); + } + + // some of getters can be used without vuex, for sharing code create module definition here + const storeModule = { + namespaced: true, + state: { + activeLoaders: [] + }, + getters: { + isLoading: state => loaderMessage => + state.activeLoaders.indexOf(loaderMessage) > -1, + anyLoading: state => state.activeLoaders.length > 0 + }, + actions: { + load: ({ commit }, loaderMessage) => + commit(mutations.LOAD, loaderMessage), + end: ({ commit }, loaderMessage) => commit(mutations.END, loaderMessage) + }, + mutations: { + [mutations.LOAD](state, loaderMessage) { + state.activeLoaders.push(loaderMessage); + state.activeLoaders = uniq(state.activeLoaders); + }, + [mutations.END](state, loaderMessage) { + state.activeLoaders = uniq(state.activeLoaders).filter( + p => p !== loaderMessage + ); + } + } + }; + if (this.useVuex) { + const moduleName = this.moduleName; + this.storage = new Vue({ + computed: { + isLoading() { + if (!store) { + throw new Error('Vuex not initialized.'); + } + return store.getters[`${moduleName}/isLoading`]; + }, + anyLoading() { + if (!store) { + throw new Error('Vuex not initialized.'); + } + return store.getters[`${moduleName}/anyLoading`]; + } + } + }); + + this.store = store; + store.registerModule(moduleName, storeModule); + } else { + // no vuex + this.storage = new Vue({ + data: { + activeLoaders: [] + }, + computed: { + isLoading() { + const state = this; + return storeModule.getters.isLoading(state); + }, + anyLoading() { + const state = this; + return storeModule.getters.anyLoading(state); + } + }, + methods: { + startLoading(loaderMessage) { + const state = this; + storeModule.mutations[mutations.LOAD](state, loaderMessage); + }, + endLoading(loaderMessage) { + const state = this; + storeModule.mutations[mutations.END](state, loaderMessage); + } + } + }); + } + this.initialized = true; + } + + get anyLoading() { + return this.storage.anyLoading; + } + + isLoading(loaderMessage) { + return this.storage.isLoading(loaderMessage); + } + + startLoading(loaderMessage) { + if (this.useVuex) { + this.store.dispatch(`${this.moduleName}/load`, loaderMessage, { + root: true + }); + } else { + this.storage.startLoading(loaderMessage); + } + } + + endLoading(loaderMessage) { + if (this.useVuex) { + this.store.dispatch(`${this.moduleName}/end`, loaderMessage, { + root: true + }); + } else { + this.storage.endLoading(loaderMessage); + } + } +} + +export function install(Vue) { + if (install.installed && _Vue && Vue === _Vue) { + if (process.env.NODE_ENV !== 'production') { + console.warn( + '[vue-loading] already installed. Vue.use(VueLoading) should be called only once.' + ); + } + return; + } + _Vue = Vue; + install.installed = true; + // applyMixin + Vue.mixin({ + /** + * VueLoading init hook, injected into each instances init hooks list. + */ + beforeCreate() { + const options = this.$options; + if (options.vueLoading) { + this.$loading = + typeof options.vueLoading === 'function' + ? new options.vueLoading() + : options.vueLoading; + this.$loading.init(Vue, options.store); // store injection + } else if (options.parent && options.parent.$loading) { + this.$loading = options.parent.$loading; + this.$loading.init(Vue, options.parent.$store); + } + } + }); +} + +export function createActionHelpers({ moduleName }) { + const start = function(dispatcher, loaderMessage) { + dispatcher(`${moduleName}/load`, loaderMessage, { root: true }); + }; + const end = function(dispatcher, loaderMessage) { + dispatcher(`${moduleName}/end`, loaderMessage, { root: true }); + }; + return { + // start and stop helpers for async processes + startLoading(dispatcher, loaderMessage, callback) { + start(dispatcher, loaderMessage); + if (!callback) return; + return new Promise((resolve, reject) => { + callback() + .then(response => { + resolve(response); + end(dispatcher, loaderMessage); + }) + .catch(response => { + reject(response); + end(dispatcher, loaderMessage); + }); + }); + }, + endLoading(dispatcher, loaderMessage) { + end(dispatcher, loaderMessage); + } + }; +} + +VueLoading.install = install; diff --git a/src/vuex-loading.js b/src/vuex-loading.js deleted file mode 100644 index 2baadd2..0000000 --- a/src/vuex-loading.js +++ /dev/null @@ -1,164 +0,0 @@ -import spinner from './spinners/spinner'; -import heart from './spinners/heart'; - -const mutations = { - LOAD: 'LOAD', - END: 'END' -}; - -const spinners = { - spinner, - heart -}; - -// Base Utils -const uniq = array => { - return array.filter((el, index, arr) => index == arr.indexOf(el)); -}; - -function createComponent({ componentName, moduleName, className }) { - return { - template: ` -
- - - <${componentName}-spinner :width="width || '1em'" :height="height || '1em'" /> - - {{ message }} - - -
- `, - props: ['when', 'loader', 'message', 'height', 'width'], - computed: { - isLoading() { - const store = this.$store; - if (!store) { - throw new Error('Vuex not initialized.'); - } - return store.getters[`${moduleName}/isLoading`]; - }, - anyLoading() { - const store = this.$store; - if (!store) { - throw new Error('Vuex not initialized.'); - } - return store.getters[`${moduleName}/anyLoading`]; - }, - status() { - if (this.when) { - return this.when; - } - if (this.loader) { - return this.isLoading(this.loader); - } - return this.anyLoading; - } - } - }; -} - -// Vuex store to collect loadings -const createStore = function(moduleName) { - return function(store) { - store.registerModule(moduleName, { - namespaced: true, - state: { - activeLoaders: [] - }, - getters: { - isLoading: state => loaderMessage => - state.activeLoaders.indexOf(loaderMessage) > -1, - anyLoading: state => state.activeLoaders.length > 0 - }, - actions: { - load: ({ commit }, loaderMessage) => - commit(mutations.LOAD, loaderMessage), - end: ({ commit }, loaderMessage) => commit(mutations.END, loaderMessage) - }, - mutations: { - [mutations.LOAD](state, loaderMessage) { - state.activeLoaders.push(loaderMessage); - state.activeLoaders = uniq(state.activeLoaders); - }, - [mutations.END](state, loaderMessage) { - state.activeLoaders = uniq(state.activeLoaders).filter( - p => p !== loaderMessage - ); - } - } - }); - }; -}; - -// Vue plugin -const createInstaller = function({ moduleName, componentName, className }) { - return function(Vue) { - Vue.prototype.$startLoading = function(loaderMessage) { - this.$store.dispatch(`${moduleName}/load`, loaderMessage, { root: true }); - }; - Vue.prototype.$endLoading = function(loaderMessage) { - this.$store.dispatch(`${moduleName}/end`, loaderMessage, { root: true }); - }; - Vue.prototype.$isLoading = function(loaderMessage) { - return this.$store.getters[`${moduleName}/isLoading`](loaderMessage); - }; - Vue.prototype.$anyLoading = function() { - return this.$store.getters[`${moduleName}/anyLoading`]; - }; - - Vue.component( - componentName, - createComponent({ componentName, moduleName, className }) - ); - Object.keys(spinners).forEach(spinner => { - Vue.component(`${componentName}-${spinner}`, spinners[spinner]); - }); - }; -}; - -function createVuexLoader({ - moduleName = 'loading', - componentName = 'v-loading', - className = 'v-loading' -}) { - return { - install: createInstaller({ moduleName, componentName, className }), - Store: createStore(moduleName) - }; -} - -function createActionHelpers({ moduleName }) { - const start = function(dispatcher, loaderMessage) { - dispatcher(`${moduleName}/load`, loaderMessage, { root: true }); - }; - const end = function(dispatcher, loaderMessage) { - dispatcher(`${moduleName}/end`, loaderMessage, { root: true }); - }; - return { - // start and stop helpers for async processes - startLoading(dispatcher, loaderMessage, callback) { - start(dispatcher, loaderMessage); - if (!callback) return; - return new Promise((resolve, reject) => { - callback() - .then(response => { - resolve(response); - end(dispatcher, loaderMessage); - }) - .catch(response => { - reject(response); - end(dispatcher, loaderMessage); - }); - }); - }, - endLoading(dispatcher, loaderMessage) { - end(dispatcher, loaderMessage); - } - }; -} - -export default { - createVuexLoader, - createActionHelpers -}; From dfc628388a1fb6229ab5f9ebe6c0fb1a037b1e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20Kadir=20Ak=C4=B1n?= Date: Thu, 18 Jan 2018 10:13:52 +0300 Subject: [PATCH 003/123] some make up --- README.md | 28 +- build/rollup.config.js | 21 - dist/vuex-loading.js | 213 - dist/vuex-loading.min.js | 11 - example/bundle.js | 12761 ------------------------------------ example/index.html | 117 - example/index.js | 41 - example/package-lock.json | 4819 -------------- example/package.json | 18 - example/webpack.config.js | 32 - example/yarn.lock | 3282 ---------- package.json | 4 +- src/v-loading.vue | 42 +- yarn.lock | 7388 ++++++++++++++++++--- 14 files changed, 6669 insertions(+), 22108 deletions(-) delete mode 100644 build/rollup.config.js delete mode 100644 dist/vuex-loading.js delete mode 100644 dist/vuex-loading.min.js delete mode 100644 example/bundle.js delete mode 100644 example/index.html delete mode 100644 example/index.js delete mode 100644 example/package-lock.json delete mode 100644 example/package.json delete mode 100644 example/webpack.config.js delete mode 100644 example/yarn.lock diff --git a/README.md b/README.md index fdc959f..01b5feb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # ⌛️ vuex-loading -Multiple Process Loader Management for [Vue](http://vuejs.org/) and [Vuex](http://vuex.vuejs.org/). +Multiple Process Loader Management for [Vue](http://vuejs.org/) and (optionally) [Vuex](http://vuex.vuejs.org/). + +> Even it's named as "vuex-loading", Vuex is now completely optional. @@ -11,7 +13,9 @@ Multiple Process Loader Management for [Vue](http://vuejs.org/) and [Vuex](http: ## Requirements - [Vue.js](https://vuejs.org) (v2.0.0+) -- Optional - [Vuex](http://vuex.vuejs.org) (v2.0.0+) + +## Power supplies +- [Vuex](http://vuex.vuejs.org), optionally (v2.0.0+) ## Installation @@ -26,8 +30,7 @@ $ yarn add vuex-loading ```js import VueLoading from 'vuex-loading' -Vue.use(Vuex) -Vue.use(VuexLoading) // add VueLoading as Vue plugin +Vue.use(VueLoading) // add VueLoading as Vue plugin ``` Then you should register `VueLoading` module: @@ -40,7 +43,7 @@ new Vue({ }); ``` -## Usage with vuex +## Usage with Vuex Simply set `useVuex` parameter to `true` and optionally override `moduleName` @@ -49,7 +52,7 @@ Simply set `useVuex` parameter to `true` and optionally override import VueLoading from 'vuex-loading' Vue.use(Vuex) -Vue.use(VuexLoading) // add VueLoading as Vue plugin +Vue.use(VueLoading) // add VueLoading as Vue plugin ``` Then you should register `vueLoading` module: @@ -58,12 +61,12 @@ Then you should register `vueLoading` module: new Vue({ el: '#app', store, - vueLoading: new VueLoading({useVuex: true, moduleName: 'vuex-example-module'}), // configure VueLoading here + vueLoading: new VueLoading({ useVuex: true, moduleName: 'vuex-example-module' }), // configure VueLoading here }); ``` Now `VueLoading` will use `Vuex` store for data management -which can be traced in `Vue dev tools` +which can be traced in `Vue DevTools` @@ -73,7 +76,7 @@ You can use this options for customize VueLoading behavior #### `useVuex` -boolean value, false by default, use this value for enabling +boolean value, `false` by default, use this value for enabling integration with `Vuex` store When this value is true `VueLoading` will store data in `Vuex` store @@ -209,7 +212,7 @@ import and add `v-loading` into components ```js import vLoading from 'vuex-loading/v-loading.vue' components: { - 'v-loading': vLoading + 'v-loading': vLoading } ``` @@ -333,6 +336,11 @@ Please see `example` for more detailed example. Use `npm run dev-vuex` or `npm run dev-default` commands for running examples locally. +## Contributors + +- Fatih Kadir Akın, (creator) +- Igor, (maintainer, made Vuex-free) + ## License MIT © [Fatih Kadir Akın](https://github.com/f) diff --git a/build/rollup.config.js b/build/rollup.config.js deleted file mode 100644 index 77b01c9..0000000 --- a/build/rollup.config.js +++ /dev/null @@ -1,21 +0,0 @@ -const buble = require('rollup-plugin-buble') -const pkg = require('../package.json') - -module.exports = { - entry: 'src/vuex-loading.js', - dest: pkg.main, - format: 'umd', - plugins: [buble()], - moduleName: 'createVuexLoader', - banner: -`/** - * @license - * - * vuex-loading v${process.env.VERSION || pkg.version} - * - * (c) ${new Date().getFullYear()} Fatih Kadir Akın - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */` -} \ No newline at end of file diff --git a/dist/vuex-loading.js b/dist/vuex-loading.js deleted file mode 100644 index 13a69ca..0000000 --- a/dist/vuex-loading.js +++ /dev/null @@ -1,213 +0,0 @@ -/** - * @license - * - * vuex-loading v0.1.14 - * - * (c) 2017 Fatih Kadir Akın - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.createVuexLoader = factory()); -}(this, (function () { 'use strict'; - -var spinner = { - props: { - width: { - type: String, - default: '100' - }, - height: { - type: String, - default: '100' - } - }, - template: "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n " -}; - -var heart = { - props: { - width: { - type: String, - default: '100' - }, - height: { - type: String, - default: '100' - } - }, - template: "\n \n " -}; - -var mutations = { - LOAD: 'LOAD', - END: 'END' -}; - -var spinners = { - spinner: spinner, - heart: heart -}; - -// Base Utils -var uniq = function (array) { - return array.filter(function (el, index, arr) { return index == arr.indexOf(el); }); -}; - -function createComponent(ref) { - var componentName = ref.componentName; - var moduleName = ref.moduleName; - var className = ref.className; - - return { - template: ("\n
\n \n \n <" + componentName + "-spinner :width=\"width || '1em'\" :height=\"height || '1em'\" />\n \n {{ message }}\n \n \n
\n "), - props: ['when', 'loader', 'message', 'height', 'width'], - computed: { - isLoading: function isLoading() { - var store = this.$store; - if (!store) { - throw new Error('Vuex not initialized.'); - } - return store.getters[(moduleName + "/isLoading")]; - }, - anyLoading: function anyLoading() { - var store = this.$store; - if (!store) { - throw new Error('Vuex not initialized.'); - } - return store.getters[(moduleName + "/anyLoading")]; - }, - status: function status() { - if (this.when) { - return this.when; - } - if (this.loader) { - return this.isLoading(this.loader); - } - return this.anyLoading; - } - } - }; -} - -// Vuex store to collect loadings -var createStore = function(moduleName) { - return function(store) { - store.registerModule(moduleName, { - namespaced: true, - state: { - activeLoaders: [] - }, - getters: { - isLoading: function (state) { return function (loaderMessage) { return state.activeLoaders.indexOf(loaderMessage) > -1; }; }, - anyLoading: function (state) { return state.activeLoaders.length > 0; } - }, - actions: { - load: function (ref, loaderMessage) { - var commit = ref.commit; - - return commit(mutations.LOAD, loaderMessage); - }, - end: function (ref, loaderMessage) { - var commit = ref.commit; - - return commit(mutations.END, loaderMessage); - } - }, - mutations: ( obj = {}, obj[mutations.LOAD] = function (state, loaderMessage) { - state.activeLoaders.push(loaderMessage); - state.activeLoaders = uniq(state.activeLoaders); - }, obj[mutations.END] = function (state, loaderMessage) { - state.activeLoaders = uniq(state.activeLoaders).filter( - function (p) { return p !== loaderMessage; } - ); - }, obj ) - }); - var obj; - }; -}; - -// Vue plugin -var createInstaller = function(ref) { - var moduleName = ref.moduleName; - var componentName = ref.componentName; - var className = ref.className; - - return function(Vue) { - Vue.prototype.$startLoading = function(loaderMessage) { - this.$store.dispatch((moduleName + "/load"), loaderMessage, { root: true }); - }; - Vue.prototype.$endLoading = function(loaderMessage) { - this.$store.dispatch((moduleName + "/end"), loaderMessage, { root: true }); - }; - Vue.prototype.$isLoading = function(loaderMessage) { - return this.$store.getters[(moduleName + "/isLoading")](loaderMessage); - }; - Vue.prototype.$anyLoading = function() { - return this.$store.getters[(moduleName + "/anyLoading")]; - }; - - Vue.component( - componentName, - createComponent({ componentName: componentName, moduleName: moduleName, className: className }) - ); - Object.keys(spinners).forEach(function (spinner$$1) { - Vue.component((componentName + "-" + spinner$$1), spinners[spinner$$1]); - }); - }; -}; - -function createVuexLoader(ref) { - var moduleName = ref.moduleName; if ( moduleName === void 0 ) moduleName = 'loading'; - var componentName = ref.componentName; if ( componentName === void 0 ) componentName = 'v-loading'; - var className = ref.className; if ( className === void 0 ) className = 'v-loading'; - - return { - install: createInstaller({ moduleName: moduleName, componentName: componentName, className: className }), - Store: createStore(moduleName) - }; -} - -function createActionHelpers(ref) { - var moduleName = ref.moduleName; - - var start = function(dispatcher, loaderMessage) { - dispatcher((moduleName + "/load"), loaderMessage, { root: true }); - }; - var end = function(dispatcher, loaderMessage) { - dispatcher((moduleName + "/end"), loaderMessage, { root: true }); - }; - return { - // start and stop helpers for async processes - startLoading: function startLoading(dispatcher, loaderMessage, callback) { - start(dispatcher, loaderMessage); - if (!callback) { return; } - return new Promise(function (resolve, reject) { - callback() - .then(function (response) { - resolve(response); - end(dispatcher, loaderMessage); - }) - .catch(function (response) { - reject(response); - end(dispatcher, loaderMessage); - }); - }); - }, - endLoading: function endLoading(dispatcher, loaderMessage) { - end(dispatcher, loaderMessage); - } - }; -} - -var vuexLoading = { - createVuexLoader: createVuexLoader, - createActionHelpers: createActionHelpers -}; - -return vuexLoading; - -}))); diff --git a/dist/vuex-loading.min.js b/dist/vuex-loading.min.js deleted file mode 100644 index f904656..0000000 --- a/dist/vuex-loading.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @license - * - * vuex-loading v0.1.14 - * - * (c) 2017 Fatih Kadir Akın - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -(function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory():typeof define==="function"&&define.amd?define(factory):global.createVuexLoader=factory()})(this,function(){"use strict";var spinner={props:{width:{type:String,default:"100"},height:{type:String,default:"100"}},template:'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n '};var heart={props:{width:{type:String,default:"100"},height:{type:String,default:"100"}},template:'\n \n '};var mutations={LOAD:"LOAD",END:"END"};var spinners={spinner:spinner,heart:heart};var uniq=function(array){return array.filter(function(el,index,arr){return index==arr.indexOf(el)})};function createComponent(ref){var componentName=ref.componentName;var moduleName=ref.moduleName;var className=ref.className;return{template:"\n
\n \n \n <"+componentName+"-spinner :width=\"width || '1em'\" :height=\"height || '1em'\" />\n \n {{ message }}\n \n \n
\n ",props:["when","loader","message","height","width"],computed:{isLoading:function isLoading(){var store=this.$store;if(!store){throw new Error("Vuex not initialized.")}return store.getters[moduleName+"/isLoading"]},anyLoading:function anyLoading(){var store=this.$store;if(!store){throw new Error("Vuex not initialized.")}return store.getters[moduleName+"/anyLoading"]},status:function status(){if(this.when){return this.when}if(this.loader){return this.isLoading(this.loader)}return this.anyLoading}}}}var createStore=function(moduleName){return function(store){store.registerModule(moduleName,{namespaced:true,state:{activeLoaders:[]},getters:{isLoading:function(state){return function(loaderMessage){return state.activeLoaders.indexOf(loaderMessage)>-1}},anyLoading:function(state){return state.activeLoaders.length>0}},actions:{load:function(ref,loaderMessage){var commit=ref.commit;return commit(mutations.LOAD,loaderMessage)},end:function(ref,loaderMessage){var commit=ref.commit;return commit(mutations.END,loaderMessage)}},mutations:(obj={},obj[mutations.LOAD]=function(state,loaderMessage){state.activeLoaders.push(loaderMessage);state.activeLoaders=uniq(state.activeLoaders)},obj[mutations.END]=function(state,loaderMessage){state.activeLoaders=uniq(state.activeLoaders).filter(function(p){return p!==loaderMessage})},obj)});var obj}};var createInstaller=function(ref){var moduleName=ref.moduleName;var componentName=ref.componentName;var className=ref.className;return function(Vue){Vue.prototype.$startLoading=function(loaderMessage){this.$store.dispatch(moduleName+"/load",loaderMessage,{root:true})};Vue.prototype.$endLoading=function(loaderMessage){this.$store.dispatch(moduleName+"/end",loaderMessage,{root:true})};Vue.prototype.$isLoading=function(loaderMessage){return this.$store.getters[moduleName+"/isLoading"](loaderMessage)};Vue.prototype.$anyLoading=function(){return this.$store.getters[moduleName+"/anyLoading"]};Vue.component(componentName,createComponent({componentName:componentName,moduleName:moduleName,className:className}));Object.keys(spinners).forEach(function(spinner$$1){Vue.component(componentName+"-"+spinner$$1,spinners[spinner$$1])})}};function createVuexLoader(ref){var moduleName=ref.moduleName;if(moduleName===void 0)moduleName="loading";var componentName=ref.componentName;if(componentName===void 0)componentName="v-loading";var className=ref.className;if(className===void 0)className="v-loading";return{install:createInstaller({moduleName:moduleName,componentName:componentName,className:className}),Store:createStore(moduleName)}}function createActionHelpers(ref){var moduleName=ref.moduleName;var start=function(dispatcher,loaderMessage){dispatcher(moduleName+"/load",loaderMessage,{root:true})};var end=function(dispatcher,loaderMessage){dispatcher(moduleName+"/end",loaderMessage,{root:true})};return{startLoading:function startLoading(dispatcher,loaderMessage,callback){start(dispatcher,loaderMessage);if(!callback){return}return new Promise(function(resolve,reject){callback().then(function(response){resolve(response);end(dispatcher,loaderMessage)}).catch(function(response){reject(response);end(dispatcher,loaderMessage)})})},endLoading:function endLoading(dispatcher,loaderMessage){end(dispatcher,loaderMessage)}}}var vuexLoading={createVuexLoader:createVuexLoader,createActionHelpers:createActionHelpers};return vuexLoading}); \ No newline at end of file diff --git a/example/bundle.js b/example/bundle.js deleted file mode 100644 index 9f0b4a8..0000000 --- a/example/bundle.js +++ /dev/null @@ -1,12761 +0,0 @@ -/******/ (function(modules) { - // webpackBootstrap - /******/ // The module cache - /******/ var installedModules = {}; // The require function - /******/ - /******/ /******/ function __webpack_require__(moduleId) { - /******/ - /******/ // Check if module is in cache - /******/ if (installedModules[moduleId]) { - /******/ return installedModules[moduleId].exports; - /******/ - } // Create a new module (and put it into the cache) - /******/ /******/ var module = (installedModules[moduleId] = { - /******/ i: moduleId, - /******/ l: false, - /******/ exports: {} - /******/ - }); // Execute the module function - /******/ - /******/ /******/ modules[moduleId].call( - module.exports, - module, - module.exports, - __webpack_require__ - ); // Flag the module as loaded - /******/ - /******/ /******/ module.l = true; // Return the exports of the module - /******/ - /******/ /******/ return module.exports; - /******/ - } // expose the modules object (__webpack_modules__) - /******/ - /******/ - /******/ /******/ __webpack_require__.m = modules; // expose the module cache - /******/ - /******/ /******/ __webpack_require__.c = installedModules; // define getter function for harmony exports - /******/ - /******/ /******/ __webpack_require__.d = function(exports, name, getter) { - /******/ if (!__webpack_require__.o(exports, name)) { - /******/ Object.defineProperty(exports, name, { - /******/ configurable: false, - /******/ enumerable: true, - /******/ get: getter - /******/ - }); - /******/ - } - /******/ - }; // getDefaultExport function for compatibility with non-harmony modules - /******/ - /******/ /******/ __webpack_require__.n = function(module) { - /******/ var getter = - module && module.__esModule - ? /******/ function getDefault() { - return module['default']; - } - : /******/ function getModuleExports() { - return module; - }; - /******/ __webpack_require__.d(getter, 'a', getter); - /******/ return getter; - /******/ - }; // Object.prototype.hasOwnProperty.call - /******/ - /******/ /******/ __webpack_require__.o = function(object, property) { - return Object.prototype.hasOwnProperty.call(object, property); - }; // __webpack_public_path__ - /******/ - /******/ /******/ __webpack_require__.p = ''; // Load entry module and return exports - /******/ - /******/ /******/ return __webpack_require__((__webpack_require__.s = 1)); - /******/ -})( - /************************************************************************/ - /******/ [ - /* 0 */ - /***/ function(module, exports) { - // shim for using process in browser - var process = (module.exports = {}); - - // cached from whatever global is present so that test runners that stub it - // don't break things. But we need to wrap it in a try catch in case it is - // wrapped in strict mode code which doesn't define any globals. It's inside a - // function because try/catches deoptimize in certain engines. - - var cachedSetTimeout; - var cachedClearTimeout; - - function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); - } - function defaultClearTimeout() { - throw new Error('clearTimeout has not been defined'); - } - (function() { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } - })(); - function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ( - (cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && - setTimeout - ) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch (e) { - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch (e) { - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - } - function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ( - (cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && - clearTimeout - ) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e) { - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e) { - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - } - var queue = []; - var draining = false; - var currentQueue; - var queueIndex = -1; - - function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } - } - - function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while (len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); - } - - process.nextTick = function(fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } - }; - - // v8 likes predictible objects - function Item(fun, array) { - this.fun = fun; - this.array = array; - } - Item.prototype.run = function() { - this.fun.apply(null, this.array); - }; - process.title = 'browser'; - process.browser = true; - process.env = {}; - process.argv = []; - process.version = ''; // empty string to avoid regexp issues - process.versions = {}; - - function noop() {} - - process.on = noop; - process.addListener = noop; - process.once = noop; - process.off = noop; - process.removeListener = noop; - process.removeAllListeners = noop; - process.emit = noop; - process.prependListener = noop; - process.prependOnceListener = noop; - - process.listeners = function(name) { - return []; - }; - - process.binding = function(name) { - throw new Error('process.binding is not supported'); - }; - - process.cwd = function() { - return '/'; - }; - process.chdir = function(dir) { - throw new Error('process.chdir is not supported'); - }; - process.umask = function() { - return 0; - }; - - /***/ - }, - /* 1 */ - /***/ function(module, exports, __webpack_require__) { - __webpack_require__(2); - module.exports = __webpack_require__(7); - - /***/ - }, - /* 2 */ - /***/ function(module, __webpack_exports__, __webpack_require__) { - 'use strict'; - Object.defineProperty(__webpack_exports__, '__esModule', { value: true }); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_vue__ = __webpack_require__( - 3 - ); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_vuex__ = __webpack_require__( - 5 - ); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_vuex_loading__ = __webpack_require__( - 6 - ); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_vuex_loading___default = __webpack_require__.n( - __WEBPACK_IMPORTED_MODULE_2_vuex_loading__ - ); - - const VuexLoading = Object( - __WEBPACK_IMPORTED_MODULE_2_vuex_loading__['createVuexLoader'] - )({ - moduleName: 'loading', - componentName: 'my-loading', - className: 'my-loading' - }); - - __WEBPACK_IMPORTED_MODULE_0_vue__['a' /* default */].use( - __WEBPACK_IMPORTED_MODULE_1_vuex__['a' /* default */] - ); - __WEBPACK_IMPORTED_MODULE_0_vue__['a' /* default */].use(VuexLoading); - - const store = new __WEBPACK_IMPORTED_MODULE_1_vuex__['a' /* default */] - .Store({ - plugins: [VuexLoading.Store] - }); - - new __WEBPACK_IMPORTED_MODULE_0_vue__['a' /* default */]({ - el: '#app', - store, - data() { - return { - loaders: ['a', 'c', 'b', 'a', 'b', 'a', 'c', 'a', 'c', 'a', 'b'] - }; - }, - methods: { - writeCode() { - this.$startLoading('writing code'); - }, - endLoading() { - this.$endLoading('writing code'); - }, - toggleLoader(loader) { - if (this.$isLoading(loader)) { - this.$endLoading(loader); - } else { - this.$startLoading(loader); - } - } - } - }); - - /***/ - }, - /* 3 */ - /***/ function(module, __webpack_exports__, __webpack_require__) { - 'use strict'; - /* WEBPACK VAR INJECTION */ (function(process, global) { - /*! - * Vue.js v2.4.1 - * (c) 2014-2017 Evan You - * Released under the MIT License. - */ - /* */ - - // these helpers produces better vm code in JS engines due to their - // explicitness and function inlining - function isUndef(v) { - return v === undefined || v === null; - } - - function isDef(v) { - return v !== undefined && v !== null; - } - - function isTrue(v) { - return v === true; - } - - function isFalse(v) { - return v === false; - } - - /** - * Check if value is primitive - */ - function isPrimitive(value) { - return typeof value === 'string' || typeof value === 'number'; - } - - /** - * Quick object check - this is primarily used to tell - * Objects from primitive values when we know the value - * is a JSON-compliant type. - */ - function isObject(obj) { - return obj !== null && typeof obj === 'object'; - } - - var _toString = Object.prototype.toString; - - /** - * Strict object type check. Only returns true - * for plain JavaScript objects. - */ - function isPlainObject(obj) { - return _toString.call(obj) === '[object Object]'; - } - - function isRegExp(v) { - return _toString.call(v) === '[object RegExp]'; - } - - /** - * Check if val is a valid array index. - */ - function isValidArrayIndex(val) { - var n = parseFloat(val); - return n >= 0 && Math.floor(n) === n && isFinite(val); - } - - /** - * Convert a value to a string that is actually rendered. - */ - function toString(val) { - return val == null - ? '' - : typeof val === 'object' - ? JSON.stringify(val, null, 2) - : String(val); - } - - /** - * Convert a input value to a number for persistence. - * If the conversion fails, return original string. - */ - function toNumber(val) { - var n = parseFloat(val); - return isNaN(n) ? val : n; - } - - /** - * Make a map and return a function for checking if a key - * is in that map. - */ - function makeMap(str, expectsLowerCase) { - var map = Object.create(null); - var list = str.split(','); - for (var i = 0; i < list.length; i++) { - map[list[i]] = true; - } - return expectsLowerCase - ? function(val) { - return map[val.toLowerCase()]; - } - : function(val) { - return map[val]; - }; - } - - /** - * Check if a tag is a built-in tag. - */ - var isBuiltInTag = makeMap('slot,component', true); - - /** - * Check if a attribute is a reserved attribute. - */ - var isReservedAttribute = makeMap('key,ref,slot,is'); - - /** - * Remove an item from an array - */ - function remove(arr, item) { - if (arr.length) { - var index = arr.indexOf(item); - if (index > -1) { - return arr.splice(index, 1); - } - } - } - - /** - * Check whether the object has the property. - */ - var hasOwnProperty = Object.prototype.hasOwnProperty; - function hasOwn(obj, key) { - return hasOwnProperty.call(obj, key); - } - - /** - * Create a cached version of a pure function. - */ - function cached(fn) { - var cache = Object.create(null); - return function cachedFn(str) { - var hit = cache[str]; - return hit || (cache[str] = fn(str)); - }; - } - - /** - * Camelize a hyphen-delimited string. - */ - var camelizeRE = /-(\w)/g; - var camelize = cached(function(str) { - return str.replace(camelizeRE, function(_, c) { - return c ? c.toUpperCase() : ''; - }); - }); - - /** - * Capitalize a string. - */ - var capitalize = cached(function(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - }); - - /** - * Hyphenate a camelCase string. - */ - var hyphenateRE = /([^-])([A-Z])/g; - var hyphenate = cached(function(str) { - return str - .replace(hyphenateRE, '$1-$2') - .replace(hyphenateRE, '$1-$2') - .toLowerCase(); - }); - - /** - * Simple bind, faster than native - */ - function bind(fn, ctx) { - function boundFn(a) { - var l = arguments.length; - return l - ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) - : fn.call(ctx); - } - // record original fn length - boundFn._length = fn.length; - return boundFn; - } - - /** - * Convert an Array-like object to a real Array. - */ - function toArray(list, start) { - start = start || 0; - var i = list.length - start; - var ret = new Array(i); - while (i--) { - ret[i] = list[i + start]; - } - return ret; - } - - /** - * Mix properties into target object. - */ - function extend(to, _from) { - for (var key in _from) { - to[key] = _from[key]; - } - return to; - } - - /** - * Merge an Array of Objects into a single Object. - */ - function toObject(arr) { - var res = {}; - for (var i = 0; i < arr.length; i++) { - if (arr[i]) { - extend(res, arr[i]); - } - } - return res; - } - - /** - * Perform no operation. - * Stubbing args to make Flow happy without leaving useless transpiled code - * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/) - */ - function noop(a, b, c) {} - - /** - * Always return false. - */ - var no = function(a, b, c) { - return false; - }; - - /** - * Return same value - */ - var identity = function(_) { - return _; - }; - - /** - * Generate a static keys string from compiler modules. - */ - function genStaticKeys(modules) { - return modules - .reduce(function(keys, m) { - return keys.concat(m.staticKeys || []); - }, []) - .join(','); - } - - /** - * Check if two values are loosely equal - that is, - * if they are plain objects, do they have the same shape? - */ - function looseEqual(a, b) { - var isObjectA = isObject(a); - var isObjectB = isObject(b); - if (isObjectA && isObjectB) { - try { - return JSON.stringify(a) === JSON.stringify(b); - } catch (e) { - // possible circular reference - return a === b; - } - } else if (!isObjectA && !isObjectB) { - return String(a) === String(b); - } else { - return false; - } - } - - function looseIndexOf(arr, val) { - for (var i = 0; i < arr.length; i++) { - if (looseEqual(arr[i], val)) { - return i; - } - } - return -1; - } - - /** - * Ensure a function is called only once. - */ - function once(fn) { - var called = false; - return function() { - if (!called) { - called = true; - fn.apply(this, arguments); - } - }; - } - - var SSR_ATTR = 'data-server-rendered'; - - var ASSET_TYPES = ['component', 'directive', 'filter']; - - var LIFECYCLE_HOOKS = [ - 'beforeCreate', - 'created', - 'beforeMount', - 'mounted', - 'beforeUpdate', - 'updated', - 'beforeDestroy', - 'destroyed', - 'activated', - 'deactivated' - ]; - - /* */ - - var config = { - /** - * Option merge strategies (used in core/util/options) - */ - optionMergeStrategies: Object.create(null), - - /** - * Whether to suppress warnings. - */ - silent: false, - - /** - * Show production mode tip message on boot? - */ - productionTip: process.env.NODE_ENV !== 'production', - - /** - * Whether to enable devtools - */ - devtools: process.env.NODE_ENV !== 'production', - - /** - * Whether to record perf - */ - performance: false, - - /** - * Error handler for watcher errors - */ - errorHandler: null, - - /** - * Warn handler for watcher warns - */ - warnHandler: null, - - /** - * Ignore certain custom elements - */ - ignoredElements: [], - - /** - * Custom user key aliases for v-on - */ - keyCodes: Object.create(null), - - /** - * Check if a tag is reserved so that it cannot be registered as a - * component. This is platform-dependent and may be overwritten. - */ - isReservedTag: no, - - /** - * Check if an attribute is reserved so that it cannot be used as a component - * prop. This is platform-dependent and may be overwritten. - */ - isReservedAttr: no, - - /** - * Check if a tag is an unknown element. - * Platform-dependent. - */ - isUnknownElement: no, - - /** - * Get the namespace of an element - */ - getTagNamespace: noop, - - /** - * Parse the real tag name for the specific platform. - */ - parsePlatformTagName: identity, - - /** - * Check if an attribute must be bound using property, e.g. value - * Platform-dependent. - */ - mustUseProp: no, - - /** - * Exposed for legacy reasons - */ - _lifecycleHooks: LIFECYCLE_HOOKS - }; - - /* */ - - var emptyObject = Object.freeze({}); - - /** - * Check if a string starts with $ or _ - */ - function isReserved(str) { - var c = (str + '').charCodeAt(0); - return c === 0x24 || c === 0x5f; - } - - /** - * Define a property. - */ - function def(obj, key, val, enumerable) { - Object.defineProperty(obj, key, { - value: val, - enumerable: !!enumerable, - writable: true, - configurable: true - }); - } - - /** - * Parse simple path. - */ - var bailRE = /[^\w.$]/; - function parsePath(path) { - if (bailRE.test(path)) { - return; - } - var segments = path.split('.'); - return function(obj) { - for (var i = 0; i < segments.length; i++) { - if (!obj) { - return; - } - obj = obj[segments[i]]; - } - return obj; - }; - } - - /* */ - - var warn = noop; - var tip = noop; - var formatComponentName = null; // work around flow check - - if (process.env.NODE_ENV !== 'production') { - var hasConsole = typeof console !== 'undefined'; - var classifyRE = /(?:^|[-_])(\w)/g; - var classify = function(str) { - return str - .replace(classifyRE, function(c) { - return c.toUpperCase(); - }) - .replace(/[-_]/g, ''); - }; - - warn = function(msg, vm) { - var trace = vm ? generateComponentTrace(vm) : ''; - - if (config.warnHandler) { - config.warnHandler.call(null, msg, vm, trace); - } else if (hasConsole && !config.silent) { - console.error('[Vue warn]: ' + msg + trace); - } - }; - - tip = function(msg, vm) { - if (hasConsole && !config.silent) { - console.warn( - '[Vue tip]: ' + msg + (vm ? generateComponentTrace(vm) : '') - ); - } - }; - - formatComponentName = function(vm, includeFile) { - if (vm.$root === vm) { - return ''; - } - var name = - typeof vm === 'string' - ? vm - : typeof vm === 'function' && vm.options - ? vm.options.name - : vm._isVue - ? vm.$options.name || vm.$options._componentTag - : vm.name; - - var file = vm._isVue && vm.$options.__file; - if (!name && file) { - var match = file.match(/([^/\\]+)\.vue$/); - name = match && match[1]; - } - - return ( - (name ? '<' + classify(name) + '>' : '') + - (file && includeFile !== false ? ' at ' + file : '') - ); - }; - - var repeat = function(str, n) { - var res = ''; - while (n) { - if (n % 2 === 1) { - res += str; - } - if (n > 1) { - str += str; - } - n >>= 1; - } - return res; - }; - - var generateComponentTrace = function(vm) { - if (vm._isVue && vm.$parent) { - var tree = []; - var currentRecursiveSequence = 0; - while (vm) { - if (tree.length > 0) { - var last = tree[tree.length - 1]; - if (last.constructor === vm.constructor) { - currentRecursiveSequence++; - vm = vm.$parent; - continue; - } else if (currentRecursiveSequence > 0) { - tree[tree.length - 1] = [last, currentRecursiveSequence]; - currentRecursiveSequence = 0; - } - } - tree.push(vm); - vm = vm.$parent; - } - return ( - '\n\nfound in\n\n' + - tree - .map(function(vm, i) { - return ( - '' + - (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + - (Array.isArray(vm) - ? formatComponentName(vm[0]) + - '... (' + - vm[1] + - ' recursive calls)' - : formatComponentName(vm)) - ); - }) - .join('\n') - ); - } else { - return '\n\n(found in ' + formatComponentName(vm) + ')'; - } - }; - } - - /* */ - - function handleError(err, vm, info) { - if (config.errorHandler) { - config.errorHandler.call(null, err, vm, info); - } else { - if (process.env.NODE_ENV !== 'production') { - warn('Error in ' + info + ': "' + err.toString() + '"', vm); - } - /* istanbul ignore else */ - if (inBrowser && typeof console !== 'undefined') { - console.error(err); - } else { - throw err; - } - } - } - - /* */ - /* globals MutationObserver */ - - // can we use __proto__? - var hasProto = '__proto__' in {}; - - // Browser environment sniffing - var inBrowser = typeof window !== 'undefined'; - var UA = inBrowser && window.navigator.userAgent.toLowerCase(); - var isIE = UA && /msie|trident/.test(UA); - var isIE9 = UA && UA.indexOf('msie 9.0') > 0; - var isEdge = UA && UA.indexOf('edge/') > 0; - var isAndroid = UA && UA.indexOf('android') > 0; - var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA); - var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; - - // Firefix has a "watch" function on Object.prototype... - var nativeWatch = {}.watch; - - var supportsPassive = false; - if (inBrowser) { - try { - var opts = {}; - Object.defineProperty(opts, 'passive', { - get: function get() { - /* istanbul ignore next */ - supportsPassive = true; - } - }); // https://github.com/facebook/flow/issues/285 - window.addEventListener('test-passive', null, opts); - } catch (e) {} - } - - // this needs to be lazy-evaled because vue may be required before - // vue-server-renderer can set VUE_ENV - var _isServer; - var isServerRendering = function() { - if (_isServer === undefined) { - /* istanbul ignore if */ - if (!inBrowser && typeof global !== 'undefined') { - // detect presence of vue-server-renderer and avoid - // Webpack shimming the process - _isServer = global['process'].env.VUE_ENV === 'server'; - } else { - _isServer = false; - } - } - return _isServer; - }; - - // detect devtools - var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; - - /* istanbul ignore next */ - function isNative(Ctor) { - return ( - typeof Ctor === 'function' && /native code/.test(Ctor.toString()) - ); - } - - var hasSymbol = - typeof Symbol !== 'undefined' && - isNative(Symbol) && - typeof Reflect !== 'undefined' && - isNative(Reflect.ownKeys); - - /** - * Defer a task to execute it asynchronously. - */ - var nextTick = (function() { - var callbacks = []; - var pending = false; - var timerFunc; - - function nextTickHandler() { - pending = false; - var copies = callbacks.slice(0); - callbacks.length = 0; - for (var i = 0; i < copies.length; i++) { - copies[i](); - } - } - - // the nextTick behavior leverages the microtask queue, which can be accessed - // via either native Promise.then or MutationObserver. - // MutationObserver has wider support, however it is seriously bugged in - // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It - // completely stops working after triggering a few times... so, if native - // Promise is available, we will use it: - /* istanbul ignore if */ - if (typeof Promise !== 'undefined' && isNative(Promise)) { - var p = Promise.resolve(); - var logError = function(err) { - console.error(err); - }; - timerFunc = function() { - p.then(nextTickHandler).catch(logError); - // in problematic UIWebViews, Promise.then doesn't completely break, but - // it can get stuck in a weird state where callbacks are pushed into the - // microtask queue but the queue isn't being flushed, until the browser - // needs to do some other work, e.g. handle a timer. Therefore we can - // "force" the microtask queue to be flushed by adding an empty timer. - if (isIOS) { - setTimeout(noop); - } - }; - } else if ( - typeof MutationObserver !== 'undefined' && - (isNative(MutationObserver) || - // PhantomJS and iOS 7.x - MutationObserver.toString() === - '[object MutationObserverConstructor]') - ) { - // use MutationObserver where native Promise is not available, - // e.g. PhantomJS IE11, iOS7, Android 4.4 - var counter = 1; - var observer = new MutationObserver(nextTickHandler); - var textNode = document.createTextNode(String(counter)); - observer.observe(textNode, { - characterData: true - }); - timerFunc = function() { - counter = (counter + 1) % 2; - textNode.data = String(counter); - }; - } else { - // fallback to setTimeout - /* istanbul ignore next */ - timerFunc = function() { - setTimeout(nextTickHandler, 0); - }; - } - - return function queueNextTick(cb, ctx) { - var _resolve; - callbacks.push(function() { - if (cb) { - try { - cb.call(ctx); - } catch (e) { - handleError(e, ctx, 'nextTick'); - } - } else if (_resolve) { - _resolve(ctx); - } - }); - if (!pending) { - pending = true; - timerFunc(); - } - if (!cb && typeof Promise !== 'undefined') { - return new Promise(function(resolve, reject) { - _resolve = resolve; - }); - } - }; - })(); - - var _Set; - /* istanbul ignore if */ - if (typeof Set !== 'undefined' && isNative(Set)) { - // use native Set when available. - _Set = Set; - } else { - // a non-standard Set polyfill that only works with primitive keys. - _Set = (function() { - function Set() { - this.set = Object.create(null); - } - Set.prototype.has = function has(key) { - return this.set[key] === true; - }; - Set.prototype.add = function add(key) { - this.set[key] = true; - }; - Set.prototype.clear = function clear() { - this.set = Object.create(null); - }; - - return Set; - })(); - } - - /* */ - - var uid = 0; - - /** - * A dep is an observable that can have multiple - * directives subscribing to it. - */ - var Dep = function Dep() { - this.id = uid++; - this.subs = []; - }; - - Dep.prototype.addSub = function addSub(sub) { - this.subs.push(sub); - }; - - Dep.prototype.removeSub = function removeSub(sub) { - remove(this.subs, sub); - }; - - Dep.prototype.depend = function depend() { - if (Dep.target) { - Dep.target.addDep(this); - } - }; - - Dep.prototype.notify = function notify() { - // stabilize the subscriber list first - var subs = this.subs.slice(); - for (var i = 0, l = subs.length; i < l; i++) { - subs[i].update(); - } - }; - - // the current target watcher being evaluated. - // this is globally unique because there could be only one - // watcher being evaluated at any time. - Dep.target = null; - var targetStack = []; - - function pushTarget(_target) { - if (Dep.target) { - targetStack.push(Dep.target); - } - Dep.target = _target; - } - - function popTarget() { - Dep.target = targetStack.pop(); - } - - /* - * not type checking this file because flow doesn't play well with - * dynamically accessing methods on Array prototype - */ - - var arrayProto = Array.prototype; - var arrayMethods = Object.create(arrayProto); - [ - 'push', - 'pop', - 'shift', - 'unshift', - 'splice', - 'sort', - 'reverse' - ].forEach(function(method) { - // cache original method - var original = arrayProto[method]; - def(arrayMethods, method, function mutator() { - var args = [], - len = arguments.length; - while (len--) args[len] = arguments[len]; - - var result = original.apply(this, args); - var ob = this.__ob__; - var inserted; - switch (method) { - case 'push': - case 'unshift': - inserted = args; - break; - case 'splice': - inserted = args.slice(2); - break; - } - if (inserted) { - ob.observeArray(inserted); - } - // notify change - ob.dep.notify(); - return result; - }); - }); - - /* */ - - var arrayKeys = Object.getOwnPropertyNames(arrayMethods); - - /** - * By default, when a reactive property is set, the new value is - * also converted to become reactive. However when passing down props, - * we don't want to force conversion because the value may be a nested value - * under a frozen data structure. Converting it would defeat the optimization. - */ - var observerState = { - shouldConvert: true - }; - - /** - * Observer class that are attached to each observed - * object. Once attached, the observer converts target - * object's property keys into getter/setters that - * collect dependencies and dispatches updates. - */ - var Observer = function Observer(value) { - this.value = value; - this.dep = new Dep(); - this.vmCount = 0; - def(value, '__ob__', this); - if (Array.isArray(value)) { - var augment = hasProto ? protoAugment : copyAugment; - augment(value, arrayMethods, arrayKeys); - this.observeArray(value); - } else { - this.walk(value); - } - }; - - /** - * Walk through each property and convert them into - * getter/setters. This method should only be called when - * value type is Object. - */ - Observer.prototype.walk = function walk(obj) { - var keys = Object.keys(obj); - for (var i = 0; i < keys.length; i++) { - defineReactive$$1(obj, keys[i], obj[keys[i]]); - } - }; - - /** - * Observe a list of Array items. - */ - Observer.prototype.observeArray = function observeArray(items) { - for (var i = 0, l = items.length; i < l; i++) { - observe(items[i]); - } - }; - - // helpers - - /** - * Augment an target Object or Array by intercepting - * the prototype chain using __proto__ - */ - function protoAugment(target, src, keys) { - /* eslint-disable no-proto */ - target.__proto__ = src; - /* eslint-enable no-proto */ - } - - /** - * Augment an target Object or Array by defining - * hidden properties. - */ - /* istanbul ignore next */ - function copyAugment(target, src, keys) { - for (var i = 0, l = keys.length; i < l; i++) { - var key = keys[i]; - def(target, key, src[key]); - } - } - - /** - * Attempt to create an observer instance for a value, - * returns the new observer if successfully observed, - * or the existing observer if the value already has one. - */ - function observe(value, asRootData) { - if (!isObject(value)) { - return; - } - var ob; - if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { - ob = value.__ob__; - } else if ( - observerState.shouldConvert && - !isServerRendering() && - (Array.isArray(value) || isPlainObject(value)) && - Object.isExtensible(value) && - !value._isVue - ) { - ob = new Observer(value); - } - if (asRootData && ob) { - ob.vmCount++; - } - return ob; - } - - /** - * Define a reactive property on an Object. - */ - function defineReactive$$1(obj, key, val, customSetter, shallow) { - var dep = new Dep(); - - var property = Object.getOwnPropertyDescriptor(obj, key); - if (property && property.configurable === false) { - return; - } - - // cater for pre-defined getter/setters - var getter = property && property.get; - var setter = property && property.set; - - var childOb = !shallow && observe(val); - Object.defineProperty(obj, key, { - enumerable: true, - configurable: true, - get: function reactiveGetter() { - var value = getter ? getter.call(obj) : val; - if (Dep.target) { - dep.depend(); - if (childOb) { - childOb.dep.depend(); - } - if (Array.isArray(value)) { - dependArray(value); - } - } - return value; - }, - set: function reactiveSetter(newVal) { - var value = getter ? getter.call(obj) : val; - /* eslint-disable no-self-compare */ - if (newVal === value || (newVal !== newVal && value !== value)) { - return; - } - /* eslint-enable no-self-compare */ - if (process.env.NODE_ENV !== 'production' && customSetter) { - customSetter(); - } - if (setter) { - setter.call(obj, newVal); - } else { - val = newVal; - } - childOb = !shallow && observe(newVal); - dep.notify(); - } - }); - } - - /** - * Set a property on an object. Adds the new property and - * triggers change notification if the property doesn't - * already exist. - */ - function set(target, key, val) { - if (Array.isArray(target) && isValidArrayIndex(key)) { - target.length = Math.max(target.length, key); - target.splice(key, 1, val); - return val; - } - if (hasOwn(target, key)) { - target[key] = val; - return val; - } - var ob = target.__ob__; - if (target._isVue || (ob && ob.vmCount)) { - process.env.NODE_ENV !== 'production' && - warn( - 'Avoid adding reactive properties to a Vue instance or its root $data ' + - 'at runtime - declare it upfront in the data option.' - ); - return val; - } - if (!ob) { - target[key] = val; - return val; - } - defineReactive$$1(ob.value, key, val); - ob.dep.notify(); - return val; - } - - /** - * Delete a property and trigger change if necessary. - */ - function del(target, key) { - if (Array.isArray(target) && isValidArrayIndex(key)) { - target.splice(key, 1); - return; - } - var ob = target.__ob__; - if (target._isVue || (ob && ob.vmCount)) { - process.env.NODE_ENV !== 'production' && - warn( - 'Avoid deleting properties on a Vue instance or its root $data ' + - '- just set it to null.' - ); - return; - } - if (!hasOwn(target, key)) { - return; - } - delete target[key]; - if (!ob) { - return; - } - ob.dep.notify(); - } - - /** - * Collect dependencies on array elements when the array is touched, since - * we cannot intercept array element access like property getters. - */ - function dependArray(value) { - for (var e = void 0, i = 0, l = value.length; i < l; i++) { - e = value[i]; - e && e.__ob__ && e.__ob__.dep.depend(); - if (Array.isArray(e)) { - dependArray(e); - } - } - } - - /* */ - - /** - * Option overwriting strategies are functions that handle - * how to merge a parent option value and a child option - * value into the final value. - */ - var strats = config.optionMergeStrategies; - - /** - * Options with restrictions - */ - if (process.env.NODE_ENV !== 'production') { - strats.el = strats.propsData = function(parent, child, vm, key) { - if (!vm) { - warn( - 'option "' + - key + - '" can only be used during instance ' + - 'creation with the `new` keyword.' - ); - } - return defaultStrat(parent, child); - }; - } - - /** - * Helper that recursively merges two data objects together. - */ - function mergeData(to, from) { - if (!from) { - return to; - } - var key, toVal, fromVal; - var keys = Object.keys(from); - for (var i = 0; i < keys.length; i++) { - key = keys[i]; - toVal = to[key]; - fromVal = from[key]; - if (!hasOwn(to, key)) { - set(to, key, fromVal); - } else if (isPlainObject(toVal) && isPlainObject(fromVal)) { - mergeData(toVal, fromVal); - } - } - return to; - } - - /** - * Data - */ - function mergeDataOrFn(parentVal, childVal, vm) { - if (!vm) { - // in a Vue.extend merge, both should be functions - if (!childVal) { - return parentVal; - } - if (!parentVal) { - return childVal; - } - // when parentVal & childVal are both present, - // we need to return a function that returns the - // merged result of both functions... no need to - // check if parentVal is a function here because - // it has to be a function to pass previous merges. - return function mergedDataFn() { - return mergeData( - typeof childVal === 'function' ? childVal.call(this) : childVal, - parentVal.call(this) - ); - }; - } else if (parentVal || childVal) { - return function mergedInstanceDataFn() { - // instance merge - var instanceData = - typeof childVal === 'function' ? childVal.call(vm) : childVal; - var defaultData = - typeof parentVal === 'function' - ? parentVal.call(vm) - : undefined; - if (instanceData) { - return mergeData(instanceData, defaultData); - } else { - return defaultData; - } - }; - } - } - - strats.data = function(parentVal, childVal, vm) { - if (!vm) { - if (childVal && typeof childVal !== 'function') { - process.env.NODE_ENV !== 'production' && - warn( - 'The "data" option should be a function ' + - 'that returns a per-instance value in component ' + - 'definitions.', - vm - ); - - return parentVal; - } - return mergeDataOrFn.call(this, parentVal, childVal); - } - - return mergeDataOrFn(parentVal, childVal, vm); - }; - - /** - * Hooks and props are merged as arrays. - */ - function mergeHook(parentVal, childVal) { - return childVal - ? parentVal - ? parentVal.concat(childVal) - : Array.isArray(childVal) ? childVal : [childVal] - : parentVal; - } - - LIFECYCLE_HOOKS.forEach(function(hook) { - strats[hook] = mergeHook; - }); - - /** - * Assets - * - * When a vm is present (instance creation), we need to do - * a three-way merge between constructor options, instance - * options and parent options. - */ - function mergeAssets(parentVal, childVal) { - var res = Object.create(parentVal || null); - return childVal ? extend(res, childVal) : res; - } - - ASSET_TYPES.forEach(function(type) { - strats[type + 's'] = mergeAssets; - }); - - /** - * Watchers. - * - * Watchers hashes should not overwrite one - * another, so we merge them as arrays. - */ - strats.watch = function(parentVal, childVal) { - // work around Firefox's Object.prototype.watch... - if (parentVal === nativeWatch) { - parentVal = undefined; - } - if (childVal === nativeWatch) { - childVal = undefined; - } - /* istanbul ignore if */ - if (!childVal) { - return Object.create(parentVal || null); - } - if (!parentVal) { - return childVal; - } - var ret = {}; - extend(ret, parentVal); - for (var key in childVal) { - var parent = ret[key]; - var child = childVal[key]; - if (parent && !Array.isArray(parent)) { - parent = [parent]; - } - ret[key] = parent - ? parent.concat(child) - : Array.isArray(child) ? child : [child]; - } - return ret; - }; - - /** - * Other object hashes. - */ - strats.props = strats.methods = strats.inject = strats.computed = function( - parentVal, - childVal - ) { - if (!childVal) { - return Object.create(parentVal || null); - } - if (!parentVal) { - return childVal; - } - var ret = Object.create(null); - extend(ret, parentVal); - extend(ret, childVal); - return ret; - }; - strats.provide = mergeDataOrFn; - - /** - * Default strategy. - */ - var defaultStrat = function(parentVal, childVal) { - return childVal === undefined ? parentVal : childVal; - }; - - /** - * Validate component names - */ - function checkComponents(options) { - for (var key in options.components) { - var lower = key.toLowerCase(); - if (isBuiltInTag(lower) || config.isReservedTag(lower)) { - warn( - 'Do not use built-in or reserved HTML elements as component ' + - 'id: ' + - key - ); - } - } - } - - /** - * Ensure all props option syntax are normalized into the - * Object-based format. - */ - function normalizeProps(options) { - var props = options.props; - if (!props) { - return; - } - var res = {}; - var i, val, name; - if (Array.isArray(props)) { - i = props.length; - while (i--) { - val = props[i]; - if (typeof val === 'string') { - name = camelize(val); - res[name] = { type: null }; - } else if (process.env.NODE_ENV !== 'production') { - warn('props must be strings when using array syntax.'); - } - } - } else if (isPlainObject(props)) { - for (var key in props) { - val = props[key]; - name = camelize(key); - res[name] = isPlainObject(val) ? val : { type: val }; - } - } - options.props = res; - } - - /** - * Normalize all injections into Object-based format - */ - function normalizeInject(options) { - var inject = options.inject; - if (Array.isArray(inject)) { - var normalized = (options.inject = {}); - for (var i = 0; i < inject.length; i++) { - normalized[inject[i]] = inject[i]; - } - } - } - - /** - * Normalize raw function directives into object format. - */ - function normalizeDirectives(options) { - var dirs = options.directives; - if (dirs) { - for (var key in dirs) { - var def = dirs[key]; - if (typeof def === 'function') { - dirs[key] = { bind: def, update: def }; - } - } - } - } - - /** - * Merge two option objects into a new one. - * Core utility used in both instantiation and inheritance. - */ - function mergeOptions(parent, child, vm) { - if (process.env.NODE_ENV !== 'production') { - checkComponents(child); - } - - if (typeof child === 'function') { - child = child.options; - } - - normalizeProps(child); - normalizeInject(child); - normalizeDirectives(child); - var extendsFrom = child.extends; - if (extendsFrom) { - parent = mergeOptions(parent, extendsFrom, vm); - } - if (child.mixins) { - for (var i = 0, l = child.mixins.length; i < l; i++) { - parent = mergeOptions(parent, child.mixins[i], vm); - } - } - var options = {}; - var key; - for (key in parent) { - mergeField(key); - } - for (key in child) { - if (!hasOwn(parent, key)) { - mergeField(key); - } - } - function mergeField(key) { - var strat = strats[key] || defaultStrat; - options[key] = strat(parent[key], child[key], vm, key); - } - return options; - } - - /** - * Resolve an asset. - * This function is used because child instances need access - * to assets defined in its ancestor chain. - */ - function resolveAsset(options, type, id, warnMissing) { - /* istanbul ignore if */ - if (typeof id !== 'string') { - return; - } - var assets = options[type]; - // check local registration variations first - if (hasOwn(assets, id)) { - return assets[id]; - } - var camelizedId = camelize(id); - if (hasOwn(assets, camelizedId)) { - return assets[camelizedId]; - } - var PascalCaseId = capitalize(camelizedId); - if (hasOwn(assets, PascalCaseId)) { - return assets[PascalCaseId]; - } - // fallback to prototype chain - var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; - if (process.env.NODE_ENV !== 'production' && warnMissing && !res) { - warn('Failed to resolve ' + type.slice(0, -1) + ': ' + id, options); - } - return res; - } - - /* */ - - function validateProp(key, propOptions, propsData, vm) { - var prop = propOptions[key]; - var absent = !hasOwn(propsData, key); - var value = propsData[key]; - // handle boolean props - if (isType(Boolean, prop.type)) { - if (absent && !hasOwn(prop, 'default')) { - value = false; - } else if ( - !isType(String, prop.type) && - (value === '' || value === hyphenate(key)) - ) { - value = true; - } - } - // check default value - if (value === undefined) { - value = getPropDefaultValue(vm, prop, key); - // since the default value is a fresh copy, - // make sure to observe it. - var prevShouldConvert = observerState.shouldConvert; - observerState.shouldConvert = true; - observe(value); - observerState.shouldConvert = prevShouldConvert; - } - if (process.env.NODE_ENV !== 'production') { - assertProp(prop, key, value, vm, absent); - } - return value; - } - - /** - * Get the default value of a prop. - */ - function getPropDefaultValue(vm, prop, key) { - // no default, return undefined - if (!hasOwn(prop, 'default')) { - return undefined; - } - var def = prop.default; - // warn against non-factory defaults for Object & Array - if (process.env.NODE_ENV !== 'production' && isObject(def)) { - warn( - 'Invalid default value for prop "' + - key + - '": ' + - 'Props with type Object/Array must use a factory function ' + - 'to return the default value.', - vm - ); - } - // the raw prop value was also undefined from previous render, - // return previous default value to avoid unnecessary watcher trigger - if ( - vm && - vm.$options.propsData && - vm.$options.propsData[key] === undefined && - vm._props[key] !== undefined - ) { - return vm._props[key]; - } - // call factory function for non-Function types - // a value is Function if its prototype is function even across different execution context - return typeof def === 'function' && getType(prop.type) !== 'Function' - ? def.call(vm) - : def; - } - - /** - * Assert whether a prop is valid. - */ - function assertProp(prop, name, value, vm, absent) { - if (prop.required && absent) { - warn('Missing required prop: "' + name + '"', vm); - return; - } - if (value == null && !prop.required) { - return; - } - var type = prop.type; - var valid = !type || type === true; - var expectedTypes = []; - if (type) { - if (!Array.isArray(type)) { - type = [type]; - } - for (var i = 0; i < type.length && !valid; i++) { - var assertedType = assertType(value, type[i]); - expectedTypes.push(assertedType.expectedType || ''); - valid = assertedType.valid; - } - } - if (!valid) { - warn( - 'Invalid prop: type check failed for prop "' + - name + - '".' + - ' Expected ' + - expectedTypes.map(capitalize).join(', ') + - ', got ' + - Object.prototype.toString.call(value).slice(8, -1) + - '.', - vm - ); - return; - } - var validator = prop.validator; - if (validator) { - if (!validator(value)) { - warn( - 'Invalid prop: custom validator check failed for prop "' + - name + - '".', - vm - ); - } - } - } - - var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/; - - function assertType(value, type) { - var valid; - var expectedType = getType(type); - if (simpleCheckRE.test(expectedType)) { - valid = typeof value === expectedType.toLowerCase(); - } else if (expectedType === 'Object') { - valid = isPlainObject(value); - } else if (expectedType === 'Array') { - valid = Array.isArray(value); - } else { - valid = value instanceof type; - } - return { - valid: valid, - expectedType: expectedType - }; - } - - /** - * Use function string name to check built-in types, - * because a simple equality check will fail when running - * across different vms / iframes. - */ - function getType(fn) { - var match = fn && fn.toString().match(/^\s*function (\w+)/); - return match ? match[1] : ''; - } - - function isType(type, fn) { - if (!Array.isArray(fn)) { - return getType(fn) === getType(type); - } - for (var i = 0, len = fn.length; i < len; i++) { - if (getType(fn[i]) === getType(type)) { - return true; - } - } - /* istanbul ignore next */ - return false; - } - - /* */ - - var mark; - var measure; - - if (process.env.NODE_ENV !== 'production') { - var perf = inBrowser && window.performance; - /* istanbul ignore if */ - if ( - perf && - perf.mark && - perf.measure && - perf.clearMarks && - perf.clearMeasures - ) { - mark = function(tag) { - return perf.mark(tag); - }; - measure = function(name, startTag, endTag) { - perf.measure(name, startTag, endTag); - perf.clearMarks(startTag); - perf.clearMarks(endTag); - perf.clearMeasures(name); - }; - } - } - - /* not type checking this file because flow doesn't play well with Proxy */ - - var initProxy; - - if (process.env.NODE_ENV !== 'production') { - var allowedGlobals = makeMap( - 'Infinity,undefined,NaN,isFinite,isNaN,' + - 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + - 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' + - 'require' // for Webpack/Browserify - ); - - var warnNonPresent = function(target, key) { - warn( - 'Property or method "' + - key + - '" is not defined on the instance but ' + - 'referenced during render. Make sure to declare reactive data ' + - 'properties in the data option.', - target - ); - }; - - var hasProxy = - typeof Proxy !== 'undefined' && - Proxy.toString().match(/native code/); - - if (hasProxy) { - var isBuiltInModifier = makeMap( - 'stop,prevent,self,ctrl,shift,alt,meta' - ); - config.keyCodes = new Proxy(config.keyCodes, { - set: function set(target, key, value) { - if (isBuiltInModifier(key)) { - warn( - 'Avoid overwriting built-in modifier in config.keyCodes: .' + - key - ); - return false; - } else { - target[key] = value; - return true; - } - } - }); - } - - var hasHandler = { - has: function has(target, key) { - var has = key in target; - var isAllowed = allowedGlobals(key) || key.charAt(0) === '_'; - if (!has && !isAllowed) { - warnNonPresent(target, key); - } - return has || !isAllowed; - } - }; - - var getHandler = { - get: function get(target, key) { - if (typeof key === 'string' && !(key in target)) { - warnNonPresent(target, key); - } - return target[key]; - } - }; - - initProxy = function initProxy(vm) { - if (hasProxy) { - // determine which proxy handler to use - var options = vm.$options; - var handlers = - options.render && options.render._withStripped - ? getHandler - : hasHandler; - vm._renderProxy = new Proxy(vm, handlers); - } else { - vm._renderProxy = vm; - } - }; - } - - /* */ - - var VNode = function VNode( - tag, - data, - children, - text, - elm, - context, - componentOptions, - asyncFactory - ) { - this.tag = tag; - this.data = data; - this.children = children; - this.text = text; - this.elm = elm; - this.ns = undefined; - this.context = context; - this.functionalContext = undefined; - this.key = data && data.key; - this.componentOptions = componentOptions; - this.componentInstance = undefined; - this.parent = undefined; - this.raw = false; - this.isStatic = false; - this.isRootInsert = true; - this.isComment = false; - this.isCloned = false; - this.isOnce = false; - this.asyncFactory = asyncFactory; - this.asyncMeta = undefined; - this.isAsyncPlaceholder = false; - }; - - var prototypeAccessors = { child: {} }; - - // DEPRECATED: alias for componentInstance for backwards compat. - /* istanbul ignore next */ - prototypeAccessors.child.get = function() { - return this.componentInstance; - }; - - Object.defineProperties(VNode.prototype, prototypeAccessors); - - var createEmptyVNode = function(text) { - if (text === void 0) text = ''; - - var node = new VNode(); - node.text = text; - node.isComment = true; - return node; - }; - - function createTextVNode(val) { - return new VNode(undefined, undefined, undefined, String(val)); - } - - // optimized shallow clone - // used for static nodes and slot nodes because they may be reused across - // multiple renders, cloning them avoids errors when DOM manipulations rely - // on their elm reference. - function cloneVNode(vnode) { - var cloned = new VNode( - vnode.tag, - vnode.data, - vnode.children, - vnode.text, - vnode.elm, - vnode.context, - vnode.componentOptions, - vnode.asyncFactory - ); - cloned.ns = vnode.ns; - cloned.isStatic = vnode.isStatic; - cloned.key = vnode.key; - cloned.isComment = vnode.isComment; - cloned.isCloned = true; - return cloned; - } - - function cloneVNodes(vnodes) { - var len = vnodes.length; - var res = new Array(len); - for (var i = 0; i < len; i++) { - res[i] = cloneVNode(vnodes[i]); - } - return res; - } - - /* */ - - var normalizeEvent = cached(function(name) { - var passive = name.charAt(0) === '&'; - name = passive ? name.slice(1) : name; - var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first - name = once$$1 ? name.slice(1) : name; - var capture = name.charAt(0) === '!'; - name = capture ? name.slice(1) : name; - return { - name: name, - once: once$$1, - capture: capture, - passive: passive - }; - }); - - function createFnInvoker(fns) { - function invoker() { - var arguments$1 = arguments; - - var fns = invoker.fns; - if (Array.isArray(fns)) { - var cloned = fns.slice(); - for (var i = 0; i < cloned.length; i++) { - cloned[i].apply(null, arguments$1); - } - } else { - // return handler return value for single handlers - return fns.apply(null, arguments); - } - } - invoker.fns = fns; - return invoker; - } - - function updateListeners(on, oldOn, add, remove$$1, vm) { - var name, cur, old, event; - for (name in on) { - cur = on[name]; - old = oldOn[name]; - event = normalizeEvent(name); - if (isUndef(cur)) { - process.env.NODE_ENV !== 'production' && - warn( - 'Invalid handler for event "' + - event.name + - '": got ' + - String(cur), - vm - ); - } else if (isUndef(old)) { - if (isUndef(cur.fns)) { - cur = on[name] = createFnInvoker(cur); - } - add(event.name, cur, event.once, event.capture, event.passive); - } else if (cur !== old) { - old.fns = cur; - on[name] = old; - } - } - for (name in oldOn) { - if (isUndef(on[name])) { - event = normalizeEvent(name); - remove$$1(event.name, oldOn[name], event.capture); - } - } - } - - /* */ - - function mergeVNodeHook(def, hookKey, hook) { - var invoker; - var oldHook = def[hookKey]; - - function wrappedHook() { - hook.apply(this, arguments); - // important: remove merged hook to ensure it's called only once - // and prevent memory leak - remove(invoker.fns, wrappedHook); - } - - if (isUndef(oldHook)) { - // no existing hook - invoker = createFnInvoker([wrappedHook]); - } else { - /* istanbul ignore if */ - if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { - // already a merged invoker - invoker = oldHook; - invoker.fns.push(wrappedHook); - } else { - // existing plain hook - invoker = createFnInvoker([oldHook, wrappedHook]); - } - } - - invoker.merged = true; - def[hookKey] = invoker; - } - - /* */ - - function extractPropsFromVNodeData(data, Ctor, tag) { - // we are only extracting raw values here. - // validation and default values are handled in the child - // component itself. - var propOptions = Ctor.options.props; - if (isUndef(propOptions)) { - return; - } - var res = {}; - var attrs = data.attrs; - var props = data.props; - if (isDef(attrs) || isDef(props)) { - for (var key in propOptions) { - var altKey = hyphenate(key); - if (process.env.NODE_ENV !== 'production') { - var keyInLowerCase = key.toLowerCase(); - if ( - key !== keyInLowerCase && - attrs && - hasOwn(attrs, keyInLowerCase) - ) { - tip( - 'Prop "' + - keyInLowerCase + - '" is passed to component ' + - formatComponentName(tag || Ctor) + - ', but the declared prop name is' + - ' "' + - key + - '". ' + - 'Note that HTML attributes are case-insensitive and camelCased ' + - 'props need to use their kebab-case equivalents when using in-DOM ' + - 'templates. You should probably use "' + - altKey + - '" instead of "' + - key + - '".' - ); - } - } - checkProp(res, props, key, altKey, true) || - checkProp(res, attrs, key, altKey, false); - } - } - return res; - } - - function checkProp(res, hash, key, altKey, preserve) { - if (isDef(hash)) { - if (hasOwn(hash, key)) { - res[key] = hash[key]; - if (!preserve) { - delete hash[key]; - } - return true; - } else if (hasOwn(hash, altKey)) { - res[key] = hash[altKey]; - if (!preserve) { - delete hash[altKey]; - } - return true; - } - } - return false; - } - - /* */ - - // The template compiler attempts to minimize the need for normalization by - // statically analyzing the template at compile time. - // - // For plain HTML markup, normalization can be completely skipped because the - // generated render function is guaranteed to return Array. There are - // two cases where extra normalization is needed: - - // 1. When the children contains components - because a functional component - // may return an Array instead of a single root. In this case, just a simple - // normalization is needed - if any child is an Array, we flatten the whole - // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep - // because functional components already normalize their own children. - function simpleNormalizeChildren(children) { - for (var i = 0; i < children.length; i++) { - if (Array.isArray(children[i])) { - return Array.prototype.concat.apply([], children); - } - } - return children; - } - - // 2. When the children contains constructs that always generated nested Arrays, - // e.g.