feat: nuxt-loading enhancenments (#3891)

This commit is contained in:
Pim 2018-10-29 16:48:40 +01:00 committed by Pooya Parsa
parent d4a370cecc
commit 72961acabd
7 changed files with 401 additions and 75 deletions

View File

@ -30,6 +30,11 @@ module.exports = {
'examples/.*' 'examples/.*'
], ],
transform: {
'^.+\\.js$': 'babel-jest',
'.*\\.(vue)$': 'vue-jest'
},
transformIgnorePatterns: [ transformIgnorePatterns: [
'/node_modules/', '/node_modules/',
'/dist/' '/dist/'

View File

@ -68,6 +68,7 @@
"rollup-plugin-license": "^0.7.0", "rollup-plugin-license": "^0.7.0",
"rollup-plugin-node-resolve": "^3.4.0", "rollup-plugin-node-resolve": "^3.4.0",
"rollup-plugin-replace": "^2.1.0", "rollup-plugin-replace": "^2.1.0",
"sort-package-json": "^1.16.0" "sort-package-json": "^1.16.0",
"vue-jest": "^2.6.0"
} }
} }

View File

@ -1,115 +1,177 @@
<template>
<div
class="nuxt-progress"
:style="{
'width': percent + '%',
'height': height,
'background-color': canSuccess ? color : failedColor,
'opacity': show ? 1 : 0
}"
/>
</template>
<script> <script>
import Vue from 'vue'
export default { export default {
name: 'nuxt-loading', name: 'nuxt-loading',
data() { data() {
return { return {
percent: 0, percent: 0,
show: false, show: false,
canSuccess: true, canSucceed: true,
reversed: false,
skipTimerCount: 0,
rtl: <%= loading.rtl || false %>,
throttle: <%= loading.throttle || 200 %>, throttle: <%= loading.throttle || 200 %>,
duration: <%= loading.duration || 1000 %>, duration: <%= loading.duration || 3000 %>,
height: '<%= loading.height %>', continuous: <%= loading.continuous || false %>
color: '<%= loading.color %>',
failedColor: '<%= loading.failedColor %>'
} }
}, },
computed: {
left() {
if (!this.continuous && !this.rtl) {
return false
}
return this.rtl
? (this.reversed ? '0px' : 'auto')
: (!this.reversed ? '0px' : 'auto')
}
},
beforeDestroy() {
this.clear()
},
methods: { methods: {
start() { clear() {
this.canSuccess = true
if (this._throttle) {
clearTimeout(this._throttle)
}
if (this._timer) {
clearInterval(this._timer) clearInterval(this._timer)
clearTimeout(this._throttle)
this._timer = null this._timer = null
},
start() {
this.clear()
this.percent = 0 this.percent = 0
this.reversed = false
this.skipTimerCount = 0
this.canSucceed = true
if (this.throttle) {
this._throttle = setTimeout(() => this.startTimer(), this.throttle)
} else {
this.startTimer()
} }
this._throttle = setTimeout(() => {
this.show = true
this._cut = 10000 / Math.floor(this.duration)
this._timer = setInterval(() => {
this.increase(this._cut * Math.random())
if (this.percent > 95) {
this.finish()
}
}, 100)
}, this.throttle)
return this return this
}, },
set(num) { set(num) {
this.show = true this.show = true
this.canSuccess = true this.canSucceed = true
this.percent = Math.floor(num) this.percent = Math.min(100, Math.max(0, Math.floor(num)))
return this return this
}, },
get() { get() {
return Math.floor(this.percent) return this.percent
}, },
increase(num) { increase(num) {
this.percent = this.percent + Math.floor(num) this.percent = Math.min(100, Math.floor(this.percent + num))
return this return this
}, },
decrease(num) { decrease(num) {
this.percent = this.percent - Math.floor(num) this.percent = Math.max(0, Math.floor(this.percent - num))
return this
},
finish() {
this.percent = 100
this.hide()
return this return this
}, },
pause() { pause() {
clearInterval(this._timer) clearInterval(this._timer)
return this return this
}, },
resume() {
this.startTimer()
return this
},
finish() {
this.percent = this.reversed ? 0 : 100
this.hide()
return this
},
hide() { hide() {
clearInterval(this._timer) this.clear()
this._timer = null
clearTimeout(this._throttle)
this._throttle = null
setTimeout(() => { setTimeout(() => {
this.show = false this.show = false
Vue.nextTick(() => { this.$nextTick(() => {
setTimeout(() => {
this.percent = 0 this.percent = 0
}, 200) this.reversed = false
}) })
}, 500) }, 500)
return this return this
}, },
fail() { fail() {
this.canSuccess = false this.canSucceed = false
return this return this
},
startTimer() {
if (!this.show) {
this.show = true
} }
if (typeof this._cut === 'undefined') {
this._cut = 10000 / Math.floor(this.duration)
}
this._timer = setInterval(() => {
/**
* When reversing direction skip one timers
* so 0, 100 are displayed for two iterations
* also disable css width transitioning
* which otherwise interferes and shows
* a jojo effect
*/
if (this.skipTimerCount > 0) {
this.skipTimerCount--
return
}
if (this.reversed) {
this.decrease(this._cut)
} else {
this.increase(this._cut)
}
if (this.continuous) {
if (this.percent >= 100) {
this.skipTimerCount = 1
this.reversed = !this.reversed
} else if (this.percent <= 0) {
this.skipTimerCount = 1
this.reversed = !this.reversed
}
}
}, 100)
}
},
render(h) {
let el = h(false)
if (this.show) {
el = h('div', {
staticClass: 'nuxt-progress',
class: {
'nuxt-progress-notransition': this.skipTimerCount > 0,
'nuxt-progress-failed': !this.canSucceed
},
style: {
'width': this.percent + '%',
'left': this.left
}
})
}
return el
} }
} }
</script> </script>
<% if (loading && loading.css) { %>
<style> <style>
.nuxt-progress { .nuxt-progress {
position: fixed; position: fixed;
top: 0px; top: 0px;
left: <%= loading.rtl === true ? 'auto' : '0px' %>; left: <%= loading.rtl === true ? 'auto' : '0px' %>;
right: 0px; right: 0px;
height: 2px; height: <%= loading.height %>;
width: 0%; width: 0%;
transition: width 0.2s, opacity 0.4s;
opacity: 1; opacity: 1;
background-color: #efc14e; transition: width 0.1s, opacity 0.4s;
background-color: <%= loading.color %>;
z-index: 999999; z-index: 999999;
} }
</style>
.nuxt-progress.nuxt-progress-notransition {
transition: none;
}
.nuxt-progress-failed {
background-color: <%= loading.failedColor %>;
}
</style><% } %>

View File

@ -85,7 +85,9 @@ export default {
height: '2px', height: '2px',
throttle: 200, throttle: 200,
duration: 5000, duration: 5000,
rtl: false continuous: false,
rtl: false,
css: true
}, },
loadingIndicator: 'default', loadingIndicator: 'default',
transition: { transition: {

View File

@ -1,5 +1,5 @@
import Browser from '../utils/browser' import Browser from '../utils/browser'
import { loadFixture, getPort, Nuxt } from '../utils' import { loadFixture, getPort, Nuxt, waitFor } from '../utils'
let port let port
const browser = new Browser() const browser = new Browser()
@ -28,10 +28,12 @@ describe('basic browser', () => {
}) })
test('/noloading', async () => { test('/noloading', async () => {
const { hook } = await page.nuxt.navigate('/noloading') const { hook } = await page.nuxt.navigate('/noloading', false)
const loading = await page.nuxt.loadingData() await waitFor(nuxt.options.loading.throttle + 100)
let loading = await page.nuxt.loadingData()
expect(loading.show).toBe(true) expect(loading.show).toBe(true)
await hook await hook
loading = await page.nuxt.loadingData()
expect(loading.show).toBe(true) expect(loading.show).toBe(true)
await page.waitForFunction( await page.waitForFunction(
`$nuxt.$loading.$data.show === false` `$nuxt.$loading.$data.show === false`

View File

@ -0,0 +1,130 @@
import { resolve } from 'path'
import { promisify } from 'util'
import Vue from 'vue'
import { loadFixture, waitFor } from '../utils'
const renderer = require('vue-server-renderer').createRenderer()
const renderToString = promisify(renderer.renderToString)
let componentDir
describe('components', () => {
beforeAll(async () => {
const config = await loadFixture('basic')
componentDir = resolve(config.rootDir, '.nuxt/components')
})
describe('nuxt-loading', () => {
let VueComponent
beforeAll(async () => {
const Component = (await import(resolve(componentDir, 'nuxt-loading.vue'))).default
VueComponent = Vue.extend(Component)
})
test('removed when not loading', async () => {
const component = new VueComponent().$mount()
const str = await renderToString(component)
expect(str).toBe('<!---->')
})
test('added when loading', async () => {
const component = new VueComponent().$mount()
component.throttle = 0
component.start()
const str = await renderToString(component)
expect(str).toBe('<div data-server-rendered="true" class="nuxt-progress" style="width:0%;left:false;"></div>')
component.clear()
})
test('percentage changed after 1s', async () => {
jest.useRealTimers()
const component = new VueComponent().$mount()
component.duration = 2000
component.throttle = 0
component.start()
await waitFor(250)
const str = await renderToString(component)
expect(str).not.toBe('<!---->')
expect(str).not.toBe('<div data-server-rendered="true" class="nuxt-progress" style="width:0%;left:false;"></div>')
expect(component.$data.percent).not.toBe(0)
component.clear()
})
test('can be finished', async () => {
jest.useFakeTimers()
const component = new VueComponent().$mount()
component.throttle = 0
component.start()
component.finish()
let str = await renderToString(component)
expect(str).toBe('<div data-server-rendered="true" class="nuxt-progress" style="width:100%;left:false;"></div>')
expect(component.$data.percent).toBe(100)
jest.runAllTimers()
str = await renderToString(component)
expect(str).toBe('<!---->')
expect(component.$data.percent).toBe(0)
component.clear()
jest.useRealTimers()
})
test('can fail', async () => {
const component = new VueComponent().$mount()
component.set(50)
component.fail()
const str = await renderToString(component)
expect(str).toBe('<div data-server-rendered="true" class="nuxt-progress nuxt-progress-failed" style="width:50%;left:false;"></div>')
})
test('not shown until throttle', async () => {
const component = new VueComponent().$mount()
component.duration = 2000
component.throttle = 1000
component.start()
await waitFor(300)
let str = await renderToString(component)
expect(str).toBe('<!---->')
await waitFor(1000)
str = await renderToString(component)
expect(str).not.toBe('<!---->')
expect(str).not.toBe('<div data-server-rendered="true" class="nuxt-progress" style="width:0%;left:false;"></div>')
component.clear()
})
test('can pause and resume', async () => {
const component = new VueComponent().$mount()
component.duration = 2000
component.throttle = 0
component.start()
await waitFor(250)
let str = await renderToString(component)
expect(str).not.toBe('<!---->')
component.pause()
await waitFor(500)
const str2 = await renderToString(component)
expect(str2).toBe(str)
component.resume()
await waitFor(500)
str = await renderToString(component)
expect(str).not.toBe('<!---->')
expect(str).not.toBe(str2)
component.clear()
})
test('continues after duration', async () => {
const component = new VueComponent().$mount()
component.continuous = true
component.duration = 500
component.throttle = 0
component.start()
await waitFor(850)
const str = await renderToString(component)
expect(str).not.toBe('<!---->')
expect(str).not.toBe('<div data-server-rendered="true" class="nuxt-progress" style="width:100%;left:false;"></div>')
expect(str).not.toBe('<div data-server-rendered="true" class="nuxt-progress" style="width:100%;left:auto;"></div>')
expect(str).not.toBe('<div data-server-rendered="true" class="nuxt-progress nuxt-progress-notransition" style="width:100%;left:false;"></div>')
expect(str).not.toBe('<div data-server-rendered="true" class="nuxt-progress nuxt-progress-notransition" style="width:100%;left:auto;"></div>')
component.clear()
})
})
})

142
yarn.lock
View File

@ -1391,11 +1391,26 @@
resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
"@types/node@*": "@types/node@*", "@types/node@^10.11.7":
version "10.12.0" version "10.12.0"
resolved "https://registry.npmjs.org/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235" resolved "https://registry.npmjs.org/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235"
integrity sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ== integrity sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==
"@types/semver@^5.5.0":
version "5.5.0"
resolved "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45"
integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==
"@types/strip-bom@^3.0.0":
version "3.0.0"
resolved "http://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2"
integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=
"@types/strip-json-comments@0.0.30":
version "0.0.30"
resolved "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1"
integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==
"@vue/component-compiler-utils@^2.0.0": "@vue/component-compiler-utils@^2.0.0":
version "2.2.0" version "2.2.0"
resolved "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.2.0.tgz#bbbb7ed38a9a8a7c93abe7ef2e54a90a04b631b4" resolved "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.2.0.tgz#bbbb7ed38a9a8a7c93abe7ef2e54a90a04b631b4"
@ -2107,6 +2122,24 @@ babel-plugin-syntax-object-rest-spread@^6.13.0:
resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
babel-plugin-transform-es2015-modules-commonjs@^6.26.0:
version "6.26.2"
resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
dependencies:
babel-plugin-transform-strict-mode "^6.24.1"
babel-runtime "^6.26.0"
babel-template "^6.26.0"
babel-types "^6.26.0"
babel-plugin-transform-strict-mode@^6.24.1:
version "6.24.1"
resolved "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=
dependencies:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-plugin-transform-vue-jsx@^4.0.1: babel-plugin-transform-vue-jsx@^4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.npmjs.org/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-4.0.1.tgz#2c8bddce87a6ef09eaa59869ff1bfbeeafc5f88d" resolved "https://registry.npmjs.org/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-4.0.1.tgz#2c8bddce87a6ef09eaa59869ff1bfbeeafc5f88d"
@ -2169,7 +2202,7 @@ babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0:
invariant "^2.2.2" invariant "^2.2.2"
lodash "^4.17.4" lodash "^4.17.4"
babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0: babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0:
version "6.26.0" version "6.26.0"
resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
@ -2765,6 +2798,11 @@ cliui@^4.0.0:
strip-ansi "^4.0.0" strip-ansi "^4.0.0"
wrap-ansi "^2.0.0" wrap-ansi "^2.0.0"
clone@2.x:
version "2.1.2"
resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
clone@^1.0.2: clone@^1.0.2:
version "1.0.4" version "1.0.4"
resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
@ -2872,7 +2910,7 @@ commander@2.17.x, commander@~2.17.1:
resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
commander@^2.18.0: commander@^2.18.0, commander@^2.19.0:
version "2.19.0" version "2.19.0"
resolved "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" resolved "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
@ -2940,7 +2978,7 @@ concat-stream@1.6.2, concat-stream@^1.5.0, concat-stream@^1.6.0:
readable-stream "^2.2.2" readable-stream "^2.2.2"
typedarray "^0.0.6" typedarray "^0.0.6"
config-chain@^1.1.11: config-chain@^1.1.11, config-chain@~1.1.5:
version "1.1.12" version "1.1.12"
resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
@ -3335,6 +3373,16 @@ css-what@2.1:
resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0= integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0=
css@^2.1.0:
version "2.2.4"
resolved "https://registry.npmjs.org/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
dependencies:
inherits "^2.0.3"
source-map "^0.6.1"
source-map-resolve "^0.5.2"
urix "^0.1.0"
cssdb@^3.2.1: cssdb@^3.2.1:
version "3.2.1" version "3.2.1"
resolved "https://registry.npmjs.org/cssdb/-/cssdb-3.2.1.tgz#65e7dc90be476ce5b6e567b19f3bd73a8c66bcb5" resolved "https://registry.npmjs.org/cssdb/-/cssdb-3.2.1.tgz#65e7dc90be476ce5b6e567b19f3bd73a8c66bcb5"
@ -3876,6 +3924,18 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0" jsbn "~0.1.0"
safer-buffer "^2.1.0" safer-buffer "^2.1.0"
editorconfig@^0.15.0:
version "0.15.2"
resolved "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.2.tgz#047be983abb9ab3c2eefe5199cb2b7c5689f0702"
integrity sha512-GWjSI19PVJAM9IZRGOS+YKI8LN+/sjkSjNyvxL5ucqP9/IqtYNXBaQ/6c/hkPNYQHyOHra2KoXZI/JVpuqwmcQ==
dependencies:
"@types/node" "^10.11.7"
"@types/semver" "^5.5.0"
commander "^2.19.0"
lru-cache "^4.1.3"
semver "^5.6.0"
sigmund "^1.0.1"
ee-first@1.1.1: ee-first@1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -4441,6 +4501,13 @@ extglob@^2.0.4:
snapdragon "^0.8.1" snapdragon "^0.8.1"
to-regex "^3.0.1" to-regex "^3.0.1"
extract-from-css@^0.4.4:
version "0.4.4"
resolved "https://registry.npmjs.org/extract-from-css/-/extract-from-css-0.4.4.tgz#1ea7df2e7c7c6eb9922fa08e8adaea486f6f8f92"
integrity sha1-HqffLnx8brmSL6COitrqSG9vj5I=
dependencies:
css "^2.1.0"
extract-zip@^1.6.6: extract-zip@^1.6.6:
version "1.6.7" version "1.6.7"
resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9"
@ -4605,6 +4672,14 @@ finalhandler@1.1.1, finalhandler@^1.1.1:
statuses "~1.4.0" statuses "~1.4.0"
unpipe "~1.0.0" unpipe "~1.0.0"
find-babel-config@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355"
integrity sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=
dependencies:
json5 "^0.5.1"
path-exists "^3.0.0"
find-cache-dir@^1.0.0: find-cache-dir@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
@ -6207,6 +6282,16 @@ jest@^23.6.0:
import-local "^1.0.0" import-local "^1.0.0"
jest-cli "^23.6.0" jest-cli "^23.6.0"
js-beautify@^1.6.14:
version "1.8.8"
resolved "https://registry.npmjs.org/js-beautify/-/js-beautify-1.8.8.tgz#1eb175b73a3571a5f1ed8d98e7cf2b05bfa98471"
integrity sha512-qVNq7ZZ7ZbLdzorvSlRDadS0Rh5oyItaE95v6I4wbbuSiijxn7SnnsV6dvKlcXuO2jX7lK8tn9fBulx34K/Ejg==
dependencies:
config-chain "~1.1.5"
editorconfig "^0.15.0"
mkdirp "~0.5.0"
nopt "~4.0.1"
js-levenshtein@^1.1.3: js-levenshtein@^1.1.3:
version "1.1.4" version "1.1.4"
resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e"
@ -6643,7 +6728,7 @@ lodash@4.17.9:
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.9.tgz#9c056579af0bdbb4322e23c836df13ef2b271cb7" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.9.tgz#9c056579af0bdbb4322e23c836df13ef2b271cb7"
integrity sha512-vuRLquvot5sKUldMBumG0YqLvX6m/RGBBOmqb3CWR/MC/QvvD1cTH1fOqxz2FJAQeoExeUdX5Gu9vP2EP6ik+Q== integrity sha512-vuRLquvot5sKUldMBumG0YqLvX6m/RGBBOmqb3CWR/MC/QvvD1cTH1fOqxz2FJAQeoExeUdX5Gu9vP2EP6ik+Q==
lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1: lodash@4.x, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1:
version "4.17.11" version "4.17.11"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
@ -7171,6 +7256,14 @@ no-case@^2.2.0:
dependencies: dependencies:
lower-case "^1.1.1" lower-case "^1.1.1"
node-cache@^4.1.1:
version "4.2.0"
resolved "https://registry.npmjs.org/node-cache/-/node-cache-4.2.0.tgz#48ac796a874e762582692004a376d26dfa875811"
integrity sha512-obRu6/f7S024ysheAjoYFEEBqqDWv4LOMNJEuO8vMeEw2AT4z+NCzO4hlc2lhI4vATzbCQv6kke9FVdx0RbCOw==
dependencies:
clone "2.x"
lodash "4.x"
node-fetch-npm@^2.0.2: node-fetch-npm@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" resolved "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7"
@ -7282,7 +7375,7 @@ node-releases@^1.0.0-alpha.14:
dependencies: dependencies:
abbrev "1" abbrev "1"
nopt@^4.0.1: nopt@^4.0.1, nopt@~4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
@ -9580,7 +9673,7 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0" ajv-errors "^1.0.0"
ajv-keywords "^3.1.0" ajv-keywords "^3.1.0"
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
version "5.6.0" version "5.6.0"
resolved "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" resolved "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
@ -9699,6 +9792,11 @@ shellwords@^0.1.1:
resolved "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" resolved "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
sigmund@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
signal-exit@^3.0.0, signal-exit@^3.0.2: signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@ -9809,7 +9907,7 @@ source-list-map@^2.0.0:
resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
source-map-resolve@^0.5.0: source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
version "0.5.2" version "0.5.2"
resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
@ -10115,7 +10213,7 @@ strip-indent@^2.0.0:
resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: strip-json-comments@^2.0.0, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
@ -10455,6 +10553,16 @@ tryer@^1.0.0:
resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
tsconfig@^7.0.0:
version "7.0.0"
resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7"
integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==
dependencies:
"@types/strip-bom" "^3.0.0"
"@types/strip-json-comments" "0.0.30"
strip-bom "^3.0.0"
strip-json-comments "^2.0.0"
tslib@^1.9.0: tslib@^1.9.0:
version "1.9.3" version "1.9.3"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
@ -10786,6 +10894,22 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.1.tgz#b2d3d95402a811602380783ea4f566eb875569a2" resolved "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.1.tgz#b2d3d95402a811602380783ea4f566eb875569a2"
integrity sha512-AA86yKZ5uOKz87/q1UpngEXhbRkaYg1b7HMMVRobNV1IVKqZe8oLIzo6iMocVwZXnYitlGwf2k4ZRLOZlS8oPQ== integrity sha512-AA86yKZ5uOKz87/q1UpngEXhbRkaYg1b7HMMVRobNV1IVKqZe8oLIzo6iMocVwZXnYitlGwf2k4ZRLOZlS8oPQ==
vue-jest@^2.6.0:
version "2.6.0"
resolved "https://registry.npmjs.org/vue-jest/-/vue-jest-2.6.0.tgz#23dc99a4dce0bb59fea3946e1317b234968cf12a"
integrity sha512-kVgKGcycJ1ce3tUc48JKFSSXsbRNy5QOCAcK9k1aYDRD0m6tTbbFm8Q8yGkfsXLyFeUsvO1OEgsCYxZeD5GL2g==
dependencies:
babel-plugin-transform-es2015-modules-commonjs "^6.26.0"
chalk "^2.1.0"
extract-from-css "^0.4.4"
find-babel-config "^1.1.0"
js-beautify "^1.6.14"
node-cache "^4.1.1"
object-assign "^4.1.1"
source-map "^0.5.6"
tsconfig "^7.0.0"
vue-template-es2015-compiler "^1.6.0"
vue-loader@^15.4.2: vue-loader@^15.4.2:
version "15.4.2" version "15.4.2"
resolved "https://registry.npmjs.org/vue-loader/-/vue-loader-15.4.2.tgz#812bb26e447dd3b84c485eb634190d914ce125e2" resolved "https://registry.npmjs.org/vue-loader/-/vue-loader-15.4.2.tgz#812bb26e447dd3b84c485eb634190d914ce125e2"