chore: merge dev

This commit is contained in:
Guillaume Chau
2018-04-28 15:33:24 +02:00
78 changed files with 869 additions and 272 deletions
+52
View File
@@ -1,3 +1,55 @@
<a name="3.0.0-beta.9"></a>
# [3.0.0-beta.9](https://github.com/vuejs/vue-cli/compare/v3.0.0-beta.8...v3.0.0-beta.9) (2018-04-28)
### Bug Fixes
* **dependencies:** add deepmerge dependencies ([#1188](https://github.com/vuejs/vue-cli/issues/1188)) ([67fa39d](https://github.com/vuejs/vue-cli/commit/67fa39d)), closes [#1187](https://github.com/vuejs/vue-cli/issues/1187)
<a name="3.0.0-beta.8"></a>
# [3.0.0-beta.8](https://github.com/vuejs/vue-cli/compare/v3.0.0-beta.7...v3.0.0-beta.8) (2018-04-27)
### Bug Fixes
* --target lib/wc should overwrite user entry/output ([92e136a](https://github.com/vuejs/vue-cli/commit/92e136a)), closes [#1072](https://github.com/vuejs/vue-cli/issues/1072)
* add name to chunk file output ([#1173](https://github.com/vuejs/vue-cli/issues/1173)) ([1fc9593](https://github.com/vuejs/vue-cli/commit/1fc9593))
* allow user to define testMatch in package.json ([#1069](https://github.com/vuejs/vue-cli/issues/1069)) ([cac18f2](https://github.com/vuejs/vue-cli/commit/cac18f2)), closes [#1067](https://github.com/vuejs/vue-cli/issues/1067)
* avoid emoji length problem in update log (close [#835](https://github.com/vuejs/vue-cli/issues/835)) ([fb7ccb6](https://github.com/vuejs/vue-cli/commit/fb7ccb6))
* css.extract options handling ([8e72943](https://github.com/vuejs/vue-cli/commit/8e72943)), closes [#1061](https://github.com/vuejs/vue-cli/issues/1061)
* deep merge objects when extending package.json via plugins ([#1070](https://github.com/vuejs/vue-cli/issues/1070)) ([6af7bbe](https://github.com/vuejs/vue-cli/commit/6af7bbe)), closes [#1053](https://github.com/vuejs/vue-cli/issues/1053)
* include test -> tests for eslint-loader ([3d29458](https://github.com/vuejs/vue-cli/commit/3d29458))
* pass all parameters to onProxyReq in proxy configuration ([#1083](https://github.com/vuejs/vue-cli/issues/1083)) ([65ee2fa](https://github.com/vuejs/vue-cli/commit/65ee2fa))
* **build:** copy plugin should be loaded in all cases ([87892a5](https://github.com/vuejs/vue-cli/commit/87892a5)), closes [#1073](https://github.com/vuejs/vue-cli/issues/1073)
* **build-wc:** honor custom component name for single file wc builds ([#1182](https://github.com/vuejs/vue-cli/issues/1182)) ([2b236e0](https://github.com/vuejs/vue-cli/commit/2b236e0)), closes [#1146](https://github.com/vuejs/vue-cli/issues/1146)
* **cli:** fix invoke glob node_modules ignore pattern ([#1004](https://github.com/vuejs/vue-cli/issues/1004)) ([708cde9](https://github.com/vuejs/vue-cli/commit/708cde9))
* **cli-service:** should not add a leading slash to baseUrl when it is absolute ([#1172](https://github.com/vuejs/vue-cli/issues/1172)) ([abb82ab](https://github.com/vuejs/vue-cli/commit/abb82ab)), closes [#1084](https://github.com/vuejs/vue-cli/issues/1084)
* **eslint:** fix --no-fix flag when linting with typescript plugin ([#1115](https://github.com/vuejs/vue-cli/issues/1115)) ([83171e4](https://github.com/vuejs/vue-cli/commit/83171e4))
* **serve:** don't set header origin if using an agent ([#1179](https://github.com/vuejs/vue-cli/issues/1179)) ([79bc088](https://github.com/vuejs/vue-cli/commit/79bc088))
* **typescript:** fix invalid tsconfig.json ([#1036](https://github.com/vuejs/vue-cli/issues/1036)) ([c49eeb7](https://github.com/vuejs/vue-cli/commit/c49eeb7))
* **typescript,babel:** tests path for babel and typescript plugins ([#1058](https://github.com/vuejs/vue-cli/issues/1058)) ([b285b0b](https://github.com/vuejs/vue-cli/commit/b285b0b))
* validate project name ([#1039](https://github.com/vuejs/vue-cli/issues/1039)) ([78ed155](https://github.com/vuejs/vue-cli/commit/78ed155)), closes [#1024](https://github.com/vuejs/vue-cli/issues/1024)
* vue invoke should delete renamed/removed files ([#1049](https://github.com/vuejs/vue-cli/issues/1049)) ([c648301](https://github.com/vuejs/vue-cli/commit/c648301))
* **unit-jest:** handle static asset imports ([#1180](https://github.com/vuejs/vue-cli/issues/1180)) ([be3bede](https://github.com/vuejs/vue-cli/commit/be3bede))
### Features
* **babel:** expose loose option ([7a125d4](https://github.com/vuejs/vue-cli/commit/7a125d4))
* **cli:** skip git if already in a git repo, add --skipGit option ([23480ae](https://github.com/vuejs/vue-cli/commit/23480ae)), closes [#967](https://github.com/vuejs/vue-cli/issues/967)
* **e2e-nightwatch:** allow using custom config via --config flag ([#1016](https://github.com/vuejs/vue-cli/issues/1016)) ([e4d67d6](https://github.com/vuejs/vue-cli/commit/e4d67d6))
* **inspect:** add a -v/--verbose flag to inspect command to output full functions ([#1175](https://github.com/vuejs/vue-cli/issues/1175)) ([6ca86aa](https://github.com/vuejs/vue-cli/commit/6ca86aa)), closes [#1157](https://github.com/vuejs/vue-cli/issues/1157)
* allow specifying proxy when creating project ([b1512be](https://github.com/vuejs/vue-cli/commit/b1512be)), closes [#1009](https://github.com/vuejs/vue-cli/issues/1009)
* support custom initial commit message ([#1116](https://github.com/vuejs/vue-cli/issues/1116)) ([11ccf64](https://github.com/vuejs/vue-cli/commit/11ccf64))
* warn when user modifies output.path directly ([81d29ab](https://github.com/vuejs/vue-cli/commit/81d29ab))
* **plugin-api:** allow non-semver versioned dependencies ([#1184](https://github.com/vuejs/vue-cli/issues/1184)) ([0f76b8e](https://github.com/vuejs/vue-cli/commit/0f76b8e)), closes [#1177](https://github.com/vuejs/vue-cli/issues/1177)
* **pwa:** Make injected meta tags configurable and change defaults ([#961](https://github.com/vuejs/vue-cli/issues/961)) ([36f954b](https://github.com/vuejs/vue-cli/commit/36f954b))
* **typescript:** improve tsx support ([#1168](https://github.com/vuejs/vue-cli/issues/1168)) ([3aa3743](https://github.com/vuejs/vue-cli/commit/3aa3743))
<a name="3.0.0-beta.7"></a>
# [3.0.0-beta.7](https://github.com/vuejs/vue-cli/compare/v3.0.0-beta.6...v3.0.0-beta.7) (2018-04-25)
+4 -1
View File
@@ -61,12 +61,15 @@ create a new project powered by vue-cli-service
Options:
-p, --preset <presetName> Skip prompts and use saved preset
-p, --preset <presetName> Skip prompts and use saved or remote preset
-d, --default Skip prompts and use default preset
-i, --inlinePreset <json> Skip prompts and use inline JSON string as preset
-m, --packageManager <command> Use specified npm client when installing dependencies
-r, --registry <url> Use specified npm registry when installing dependencies (only for npm)
-g, --git [message] Force / skip git intialization, optionally specify initial commit message
-f, --force Overwrite target directory if it exists
-c, --clone Use git clone when fetching remote preset
-x, --proxy Use specified proxy when creating project
-h, --help output usage information
```
+1
View File
@@ -40,6 +40,7 @@ module.exports = {
// CSS related options
css: {
// extract CSS in components into a single CSS file (only in production)
// can also be an object of options to pass to extract-text-webpack-plugin
extract: true,
// enable CSS source maps?
+1 -1
View File
@@ -2,5 +2,5 @@
"lerna": "2.5.1",
"npmClient": "yarn",
"useWorkspaces": true,
"version": "3.0.0-beta.7"
"version": "3.0.0-beta.9"
}
+4
View File
@@ -50,3 +50,7 @@ This is the default Babel preset used in all Vue CLI projects.
- **jsx**
Default: `true`. Set to `false` to disable JSX support.
- **loose**
Default: `false`. Setting this to `true` will generate code that is more performant but less spec-compliant.
+15 -6
View File
@@ -14,12 +14,20 @@ module.exports = (context, options = {}) => {
)
}
const {
loose = false,
useBuiltIns = 'usage',
modules = false,
targets,
decoratorsLegacy
} = options
const envOptions = {
modules: options.modules || false,
targets: options.targets,
useBuiltIns: typeof options.useBuiltIns === 'undefined' ? 'usage' : options.useBuiltIns
loose,
modules,
targets,
useBuiltIns
}
delete envOptions.jsx
// target running node version (this is set by unit testing plugins)
if (process.env.VUE_CLI_BABEL_TARGET_NODE) {
envOptions.targets = { node: 'current' }
@@ -37,8 +45,9 @@ module.exports = (context, options = {}) => {
// stage 2. This includes some important transforms, e.g. dynamic import
// and rest object spread.
presets.push([require('@babel/preset-stage-2'), {
useBuiltIns: true,
decoratorsLegacy: options.decoratorsLegacy !== false
loose,
useBuiltIns: useBuiltIns !== false,
decoratorsLegacy: decoratorsLegacy !== false
}])
// transform runtime, but only for helpers
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/babel-preset-app",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "babel-preset-app for vue-cli",
"main": "index.js",
"publishConfig": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-init",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "init addon for vue-cli",
"main": "index.js",
"publishConfig": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-overlay",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "error overlay & dev server middleware for vue-cli",
"main": "dist/client.js",
"files": [
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-plugin-babel",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "babel plugin for vue-cli",
"main": "index.js",
"repository": {
@@ -20,7 +20,7 @@
"homepage": "https://github.com/vuejs/vue-cli/packages/@vue/cli-plugin-babel#readme",
"dependencies": {
"@babel/core": "7.0.0-beta.46",
"@vue/babel-preset-app": "^3.0.0-beta.7",
"@vue/babel-preset-app": "^3.0.0-beta.9",
"babel-loader": "^8.0.0-0"
},
"publishConfig": {
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-plugin-e2e-cypress",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "e2e-cypress plugin for vue-cli",
"main": "index.js",
"repository": {
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-plugin-e2e-nightwatch",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "e2e-nightwatch plugin for vue-cli",
"main": "index.js",
"repository": {
+2 -2
View File
@@ -23,11 +23,11 @@
ESLint can be configured via `.eslintrc` or the `eslintConfig` field in `package.json`.
Lint-on-save during development with `eslint-loader` can be enabled with the `lintOnSave` option in `vue.config.js`:
Lint-on-save during development with `eslint-loader` is enabled by default. It can be disabled with the `lintOnSave` option in `vue.config.js`:
``` js
module.exports = {
lintOnSave: true
lintOnSave: false
}
```
@@ -1,4 +1,4 @@
jest.setTimeout(30000)
jest.setTimeout(35000)
const path = require('path')
const { linkBin } = require('@vue/cli/lib/util/linkBin')
@@ -21,7 +21,7 @@ test('should work', async () => {
lintOn: 'commit'
}
}
})
}, null, true /* initGit */)
const { read, write, run } = project
// should've applied airbnb autofix
const main = await read('src/main.js')
@@ -90,3 +90,33 @@ test('should work', async () => {
await donePromise
})
test('should not fix with --no-fix option', async () => {
const project = await create('eslint-nofix', {
plugins: {
'@vue/cli-plugin-babel': {},
'@vue/cli-plugin-eslint': {
config: 'airbnb',
lintOn: 'commit'
}
}
})
const { read, write, run } = project
// should've applied airbnb autofix
const main = await read('src/main.js')
expect(main).toMatch(';')
// remove semicolons
const updatedMain = main.replace(/;/g, '')
await write('src/main.js', updatedMain)
// lint with no fix should fail
try {
await run('vue-cli-service lint --no-fix')
} catch (e) {
expect(e.code).toBe(1)
expect(e.failed).toBeTruthy()
}
// files should not have been fixed
expect(await read('src/main.js')).not.toMatch(';')
})
+6 -6
View File
@@ -17,17 +17,17 @@ module.exports = (api, { config, lintOn = [] }) => {
if (config === 'airbnb') {
pkg.eslintConfig.extends.push('@vue/airbnb')
Object.assign(pkg.devDependencies, {
'@vue/eslint-config-airbnb': '^3.0.0-beta.7'
'@vue/eslint-config-airbnb': '^3.0.0-beta.9'
})
} else if (config === 'standard') {
pkg.eslintConfig.extends.push('@vue/standard')
Object.assign(pkg.devDependencies, {
'@vue/eslint-config-standard': '^3.0.0-beta.7'
'@vue/eslint-config-standard': '^3.0.0-beta.9'
})
} else if (config === 'prettier') {
pkg.eslintConfig.extends.push('@vue/prettier')
Object.assign(pkg.devDependencies, {
'@vue/eslint-config-prettier': '^3.0.0-beta.7'
'@vue/eslint-config-prettier': '^3.0.0-beta.9'
})
} else {
// default
@@ -38,7 +38,7 @@ module.exports = (api, { config, lintOn = [] }) => {
if (api.hasPlugin('typescript')) {
pkg.eslintConfig.extends.push('@vue/typescript')
Object.assign(pkg.devDependencies, {
'@vue/eslint-config-typescript': '^3.0.0-beta.7'
'@vue/eslint-config-typescript': '^3.0.0-beta.9'
})
}
@@ -73,7 +73,7 @@ module.exports = (api, { config, lintOn = [] }) => {
}
}
api.render(files => {
files['tests/unit/.eslintrc'] = JSON.stringify(config, null, 2)
files['tests/unit/.eslintrc.js'] = api.genJSConfig(config)
})
} else if (api.hasPlugin('unit-jest')) {
const config = {
@@ -85,7 +85,7 @@ module.exports = (api, { config, lintOn = [] }) => {
}
}
api.render(files => {
files['tests/unit/.eslintrc'] = JSON.stringify(config, null, 2)
files['tests/unit/.eslintrc.js'] = api.genJSConfig(config)
})
}
+1 -1
View File
@@ -7,7 +7,7 @@ module.exports = (api, { lintOnSave }) => {
.pre()
.include
.add(api.resolve('src'))
.add(api.resolve('test'))
.add(api.resolve('tests'))
.end()
.test(/\.(vue|(j|t)sx?)$/)
.use('eslint-loader')
-4
View File
@@ -7,10 +7,6 @@ module.exports = function lint (args = {}, api) {
const { log, done, exit } = require('@vue/cli-shared-utils')
const files = args._ && args._.length ? args._ : ['src', 'tests', '*.js']
if (args['no-fix']) {
args.fix = false
delete args['no-fix']
}
const config = Object.assign({}, options, {
fix: true,
cwd
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-plugin-eslint",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "eslint plugin for vue-cli",
"main": "index.js",
"repository": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-plugin-pwa",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "pwa plugin for vue-cli",
"main": "index.js",
"repository": {
@@ -32,3 +32,38 @@ test('should work', async () => {
// test if tslint is fixing vue files properly
expect(lintedApp).toBe(app)
})
test('should not fix with --no-fix option', async () => {
const project = await create('ts-lint-nofix', {
plugins: {
'@vue/cli-plugin-typescript': {
tsLint: true
}
}
})
const { read, write, run } = project
const main = await read('src/main.ts')
expect(main).toMatch(';')
const app = await read('src/App.vue')
expect(main).toMatch(';')
// remove semicolons
const updatedMain = main.replace(/;/g, '')
await write('src/main.ts', updatedMain)
// for Vue file, only remove semis in script section
const updatedApp = app.replace(/<script(.|\n)*\/script>/, $ => {
return $.replace(/;/g, '')
})
await write('src/App.vue', updatedApp)
// lint with no fix should fail
try {
await run('vue-cli-service lint --no-fix')
} catch (e) {
expect(e.code).toBe(1)
expect(e.failed).toBeTruthy()
}
// files should not have been fixed
expect(await read('src/main.ts')).not.toMatch(';')
expect((await read('src/App.vue')).match(/<script(.|\n)*\/script>/)[1]).not.toMatch(';')
})
@@ -112,7 +112,7 @@ module.exports = (api, {
// delete all js files that have a ts file of the same name
// and simply rename other js files to ts
const jsRE = /\.js$/
const excludeRE = /^tests\/e2e\/|\.config\.js$/
const excludeRE = /^tests\/e2e\/|(\.config|rc)\.js$/
const convertLintFlags = require('../lib/convertLintFlags')
api.postProcessFiles(files => {
for (const file in files) {
@@ -1,4 +1,17 @@
import Vue, { VNode } from 'vue'
declare module '*.vue' {
import Vue from 'vue';
export default Vue;
export default Vue
}
declare global {
namespace JSX {
// tslint:disable no-empty-interface
interface Element extends VNode {}
// tslint:disable no-empty-interface
interface ElementClass extends Vue {}
interface IntrinsicElements {
[elem: string]: any
}
}
}
@@ -28,8 +28,10 @@
},
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"tests/**/*.ts"
"tests/**/*.ts",
"tests/**/*.tsx"
],
"exclude": [
"node_modules"
@@ -8,7 +8,7 @@ module.exports = function lint (args = {}, api, silent) {
const vueCompiler = require('vue-template-compiler')
const options = {
fix: !args['no-fix'],
fix: args['fix'] !== false,
formatter: args.format || 'codeFrame',
formattersDirectory: args['formatters-dir'],
rulesDirectory: args['rules-dir']
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-plugin-typescript",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "typescript plugin for vue-cli",
"main": "index.js",
"repository": {
@@ -18,7 +18,7 @@ test('base', async () => {
expect(pkg.scripts.test).toBeTruthy()
expect(pkg.devDependencies).toHaveProperty('@vue/test-utils')
expect(pkg.devDependencies).toHaveProperty('babel-jest')
expect(files['tests/unit/.eslintrc']).toMatch('"jest": true')
expect(files['tests/unit/.eslintrc.js']).toMatch('jest: true')
const spec = files['tests/unit/HelloWorld.spec.js']
expect(spec).toMatch(`expect(wrapper.text()).toMatch(msg)`)
@@ -19,7 +19,8 @@ module.exports = api => {
],
'transform': {
// process *.vue files with vue-jest
'^.+\\.vue$': 'vue-jest'
'^.+\\.vue$': 'vue-jest',
'.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub'
},
// support the same @ -> src alias mapping in source code
'moduleNameMapper': {
@@ -65,12 +66,12 @@ module.exports = api => {
if (api.hasPlugin('eslint')) {
api.render(files => {
files['tests/unit/.eslintrc'] = JSON.stringify({
files['tests/unit/.eslintrc.js'] = api.genJSConfig({
env: { jest: true },
rules: {
'import/no-extraneous-dependencies': 'off'
}
}, null, 2)
})
})
}
}
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-plugin-unit-jest",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "unit-jest plugin for vue-cli",
"main": "index.js",
"repository": {
@@ -25,6 +25,7 @@
"execa": "^0.9.0",
"jest": "^22.4.3",
"jest-serializer-vue": "^1.0.0",
"jest-transform-stub": "^1.0.0",
"vue-jest": "^2.5.0"
},
"devDependencies": {
@@ -28,10 +28,6 @@
All [mocha-webpack command line options](http://zinserjan.github.io/mocha-webpack/docs/installation/cli-usage.html) are also supported.
## Configuration
Jest can be configured via `jest.config.js` in your project root, or the `jest` field in `package.json`.
## Installing in an Already Created Project
``` sh
@@ -17,7 +17,7 @@ test('base', async () => {
expect(pkg.scripts.test).toBeTruthy()
expect(pkg.devDependencies).toHaveProperty('@vue/test-utils')
expect(files['tests/unit/.eslintrc']).toMatch('"mocha": true')
expect(files['tests/unit/.eslintrc.js']).toMatch('mocha: true')
const spec = files['tests/unit/HelloWorld.spec.js']
expect(spec).toMatch(`import { expect } from 'chai'`)
@@ -15,12 +15,12 @@ module.exports = api => {
if (api.hasPlugin('eslint')) {
api.render(files => {
files['tests/unit/.eslintrc'] = JSON.stringify({
files['tests/unit/.eslintrc.js'] = api.genJSConfig({
env: { mocha: true },
rules: {
'import/no-extraneous-dependencies': 'off'
}
}, null, 2)
})
})
}
}
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-plugin-unit-mocha",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "mocha unit testing plugin for vue-cli",
"main": "index.js",
"repository": {
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-service-global",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "vue-cli-service global addon for vue-cli",
"main": "index.js",
"publishConfig": {
@@ -21,12 +21,10 @@
},
"homepage": "https://github.com/vuejs/vue-cli/packages/@vue/cli-build#readme",
"dependencies": {
"@vue/babel-preset-app": "^3.0.0-beta.7",
"@vue/cli-plugin-babel": "^3.0.0-beta.7",
"@vue/cli-plugin-eslint": "^3.0.0-beta.7",
"@vue/cli-service": "^3.0.0-beta.7",
"@vue/cli-ui": "^3.0.0-beta.7",
"@vue/cli-ui-addon-webpack": "^3.0.0-beta.7",
"@vue/babel-preset-app": "^3.0.0-beta.9",
"@vue/cli-plugin-babel": "^3.0.0-beta.9",
"@vue/cli-plugin-eslint": "^3.0.0-beta.9",
"@vue/cli-service": "^3.0.0-beta.9",
"chalk": "^2.4.0",
"eslint-plugin-vue": "^4.3.0",
"resolve": "^1.7.1",
@@ -32,7 +32,7 @@ test('loading plugins from package.json', () => {
mockPkg({
devDependencies: {
'bar': '^1.0.0',
'@vue/cli-plugin-babel': '^3.0.0-beta.7',
'@vue/cli-plugin-babel': '^3.0.0-beta.9',
'vue-cli-plugin-foo': '^1.0.0'
}
})
@@ -52,6 +52,18 @@ test('load project options from package.json', () => {
expect(service.projectOptions.lintOnSave).toBe(true)
})
test('handle option baseUrl and outputDir correctly', () => {
mockPkg({
vue: {
baseUrl: 'https://foo.com/bar',
outputDir: '/public/'
}
})
const service = createMockService()
expect(service.projectOptions.baseUrl).toBe('https://foo.com/bar/')
expect(service.projectOptions.outputDir).toBe('public')
})
test('load project options from vue.config.js', () => {
process.env.VUE_CLI_SERVICE_CONFIG_PATH = `/vue.config.js`
fs.writeFileSync('/vue.config.js', `module.exports = { lintOnSave: false }`)
@@ -1,4 +1,4 @@
jest.setTimeout(15000)
jest.setTimeout(30000)
const path = require('path')
const portfinder = require('portfinder')
@@ -8,6 +8,7 @@ const create = require('@vue/cli-test-utils/createTestProject')
const launchPuppeteer = require('@vue/cli-test-utils/launchPuppeteer')
let server, browser, page
test('build as wc', async () => {
const project = await create('build-wc', defaultPreset)
@@ -53,7 +54,42 @@ test('build as wc', async () => {
expect(h3Text).toMatch('Installed CLI Plugins')
})
afterAll(async () => {
test('build as single wc', async () => {
const project = await create('build-single-wc', defaultPreset)
const { stdout } = await project.run(`vue-cli-service build --target wc --name single-wc`)
expect(stdout).toMatch('Build complete.')
expect(project.has('dist/demo.html')).toBe(true)
expect(project.has('dist/single-wc.js')).toBe(true)
expect(project.has('dist/single-wc.min.js')).toBe(true)
const port = await portfinder.getPortPromise()
server = createServer({ root: path.join(project.dir, 'dist') })
await new Promise((resolve, reject) => {
server.listen(port, err => {
if (err) return reject(err)
resolve()
})
})
const launched = await launchPuppeteer(`http://localhost:${port}/demo.html`)
browser = launched.browser
page = launched.page
const styleCount = await page.evaluate(() => {
return document.querySelector('single-wc').shadowRoot.querySelectorAll('style').length
})
expect(styleCount).toBe(2) // should contain styles from both app and child
const h1Text = await page.evaluate(() => {
return document.querySelector('single-wc').shadowRoot.querySelector('h1').textContent
})
expect(h1Text).toMatch('Welcome to Your Vue.js App')
})
afterEach(async () => {
await browser.close()
server.close()
})
+13 -1
View File
@@ -1,4 +1,5 @@
const path = require('path')
const chalk = require('chalk')
const { matchesPluginId } = require('@vue/cli-shared-utils')
class PluginAPI {
@@ -114,7 +115,18 @@ class PluginAPI {
* @return {object} Raw webpack config.
*/
resolveWebpackConfig (chainableConfig) {
return this.service.resolveWebpackConfig(chainableConfig)
const config = this.service.resolveWebpackConfig(chainableConfig)
// performa a few warning checks
const options = this.service.projectOptions
if (config.output.path !== this.resolve(options.outputDir)) {
console.error(chalk.red(
`\n\nConfiguration Error: ` +
`Avoid modifying webpack output.path directly. ` +
`Use the "outputDir" option instead.\n`
))
process.exit(1)
}
return config
}
/**
+6 -4
View File
@@ -222,10 +222,12 @@ module.exports = class Service {
}
function ensureSlash (config, key) {
if (typeof config[key] === 'string') {
config[key] = config[key]
.replace(/^([^/.])/, '/$1')
.replace(/([^/])$/, '$1/')
let val = config[key]
if (typeof val === 'string') {
if (!/^https?:/.test(val)) {
val = val.replace(/^([^/.])/, '/$1')
}
config[key] = val.replace(/([^/])$/, '$1/')
}
}
@@ -1,3 +1,14 @@
import Component from '~entry'
;(function () {
if (typeof window !== 'undefined') {
let i
if ((i = window.document.currentScript) && (i = i.src.match(/(.+\/)[^/]+\.js$/))) {
__webpack_public_path__ = i[1] // eslint-disable-line
}
} else {
__webpack_public_path__ = '/' // eslint-disable-line
}
})()
export default Component
import mod from '~entry'
export default mod
export * from '~entry'
@@ -14,31 +14,6 @@ module.exports = (api, { entry, name }, options) => {
function genConfig (format, postfix = format, genHTML) {
const config = api.resolveChainableWebpackConfig()
config.entryPoints.clear()
const entryName = `${libName}.${postfix}`
// set proxy entry for *.vue files
if (/\.vue$/.test(entry)) {
config
.entry(entryName)
.add(require.resolve('./entry-lib.js'))
config.resolve
.alias
.set('~entry', api.resolve(entry))
} else {
config
.entry(entryName)
.add(api.resolve(entry))
}
config.output
.filename(`${entryName}.js`)
.chunkFilename(`${entryName}.[id].js`)
.library(libName)
.libraryExport('default')
.libraryTarget(format)
// use relative publicPath so this can be deployed anywhere
.publicPath('./')
// adjust css output name so they write to the same file
if (options.css.extract !== false) {
config
@@ -76,7 +51,32 @@ module.exports = (api, { entry, name }, options) => {
}])
}
return api.resolveWebpackConfig(config)
// resolve entry/output
const entryName = `${libName}.${postfix}`
config.resolve
.alias
.set('~entry', api.resolve(entry))
// set entry/output after user configureWebpack hooks are applied
const rawConfig = api.resolveWebpackConfig(config)
rawConfig.entry = {
[entryName]: require.resolve('./entry-lib.js')
}
Object.assign(rawConfig.output, {
filename: `${entryName}.js`,
chunkFilename: `${entryName}.[id].js`,
library: libName,
libraryExport: 'default',
libraryTarget: format,
// use dynamic publicPath so this can be deployed anywhere
// the actual path will be determined at runtime by checking
// document.currentScript.src.
publicPath: ''
})
return rawConfig
}
return [
@@ -18,6 +18,7 @@ module.exports = (api, { target, entry, name }) => {
// generate dynamic entry based on glob files
const resolvedFiles = require('globby').sync([entry], { cwd: api.resolve('.') })
if (!resolvedFiles.length) {
abort(`entry pattern "${entry}" did not match any files.`)
}
@@ -38,22 +39,11 @@ module.exports = (api, { target, entry, name }) => {
}
}
const dynamicEntry = resolveEntry(prefix, resolvedFiles, isAsync)
const dynamicEntry = resolveEntry(prefix, libName, resolvedFiles, isAsync)
function genConfig (minify, genHTML) {
const config = api.resolveChainableWebpackConfig()
config.entryPoints.clear()
const entryName = `${libName}${minify ? `.min` : ``}`
// set proxy entry for *.vue files
config
.entry(entryName)
.add(dynamicEntry)
config.resolve
.alias
.set('~root', api.resolve('.'))
// make sure not to transpile wc-wrapper
config.module
.rule('js')
@@ -65,14 +55,6 @@ module.exports = (api, { target, entry, name }) => {
config.plugins.delete('uglify')
}
config.output
.filename(`${entryName}.js`)
.chunkFilename(`${libName}.[id]${minify ? `.min` : ``}.js`)
// use dynamic publicPath so this can be deployed anywhere
// the actual path will be determined at runtime by checking
// document.currentScript.src.
.publicPath('')
// externalize Vue in case user imports it
config
.externals({
@@ -104,13 +86,40 @@ module.exports = (api, { target, entry, name }) => {
inject: false,
filename: 'demo.html',
libName,
components: resolvedFiles.map(file => {
return fileToComponentName(prefix, file).kebabName
})
components:
prefix === ''
? [libName]
: resolvedFiles.map(file => {
return fileToComponentName(prefix, file).kebabName
})
}])
}
return api.resolveWebpackConfig(config)
// set entry/output last so it takes higher priority than user
// configureWebpack hooks
// set proxy entry for *.vue files
config.resolve
.alias
.set('~root', api.resolve('.'))
const rawConfig = api.resolveWebpackConfig(config)
const entryName = `${libName}${minify ? `.min` : ``}`
rawConfig.entry = {
[entryName]: dynamicEntry
}
Object.assign(rawConfig.output, {
filename: `${entryName}.js`,
chunkFilename: `${libName}.[id]${minify ? `.min` : ``}.js`,
// use dynamic publicPath so this can be deployed anywhere
// the actual path will be determined at runtime by checking
// document.currentScript.src.
publicPath: ''
})
return rawConfig
}
return [
@@ -11,6 +11,22 @@ const hyphenate = str => {
return str.replace(hyphenateRE, '-$1').toLowerCase()
}
/**
* Creates the script to add the component to the custom elements
* @param {string} prefix The prefix for the component library
* @param {string} component The component name for single entry builds, component file for multi-entry builds
* @param {string} file The file for the component
* @param {boolean} async Whether to load component async or not
*/
const createElement = (prefix, component, file, async) => {
const { camelName, kebabName } = exports.fileToComponentName(prefix, component)
return async
? `window.customElements.define('${kebabName}', wrap(Vue, () => import('~root/${file}')))\n`
: `import ${camelName} from '~root/${file}'\n` +
`window.customElements.define('${kebabName}', wrap(Vue, ${camelName}))\n`
}
exports.fileToComponentName = (prefix, file) => {
const basename = path.basename(file).replace(/\.(jsx?|vue)$/, '')
const camelName = camelize(basename)
@@ -22,8 +38,13 @@ exports.fileToComponentName = (prefix, file) => {
}
}
exports.resolveEntry = (prefix, files, async) => {
exports.resolveEntry = (prefix, libName, files, async) => {
const filePath = path.resolve(__dirname, 'entry-wc.js')
const elements =
prefix === ''
? [createElement('', libName, files[0])]
: files.map(file => createElement(prefix, file, file, async)).join('\n')
const content = `
import Vue from 'vue'
import wrap from '@vue/web-component-wrapper'
@@ -40,15 +61,7 @@ import 'vue-loader/lib/runtime/component-normalizer'
}
})()
${files.map(file => {
const { camelName, kebabName } = exports.fileToComponentName(prefix, file)
return async
? `window.customElements.define('${kebabName}', wrap(Vue, () => import('~root/${file}')))\n`
: (
`import ${camelName} from '~root/${file}'\n` +
`window.customElements.define('${kebabName}', wrap(Vue, ${camelName}))\n`
)
}).join('\n')}`.trim()
${elements}`.trim()
fs.writeFileSync(filePath, content)
return filePath
}
@@ -3,7 +3,8 @@ module.exports = (api, options) => {
description: 'inspect internal webpack config',
usage: 'vue-cli-service inspect [options] [...paths]',
options: {
'--mode': 'specify env mode (default: development)'
'--mode': 'specify env mode (default: development)',
'--verbose': 'show full function definitions in output'
}
}, args => {
api.setMode(args.mode || 'development')
@@ -27,13 +28,15 @@ module.exports = (api, options) => {
const pluginRE = /(?:function|class) (\w+Plugin)/
console.log(stringify(res, (value, indent, stringify) => {
if (typeof value === 'function' && value.toString().length > 100) {
return `function () { /* omitted long function */ }`
}
if (value && typeof value.constructor === 'function') {
const match = value.constructor.toString().match(pluginRE)
if (match) {
return `/* ${match[1]} */ ` + stringify(value)
if (!args.verbose) {
if (typeof value === 'function' && value.toString().length > 100) {
return `function () { /* omitted long function */ }`
}
if (value && typeof value.constructor === 'function') {
const match = value.constructor.toString().match(pluginRE)
if (match) {
return `/* ${match[1]} */ ` + stringify(value)
}
}
}
return stringify(value)
+9 -9
View File
@@ -38,6 +38,15 @@ module.exports = (api, options) => {
)
])
// copy static assets in public/
webpackConfig
.plugin('copy')
.use(require('copy-webpack-plugin'), [[{
from: api.resolve('public'),
to: api.resolve(options.outputDir),
ignore: ['index.html', '.DS_Store']
}]])
if (process.env.NODE_ENV === 'production') {
// minify HTML
webpackConfig
@@ -142,15 +151,6 @@ module.exports = (api, options) => {
}])
.after('preload')
}
// copy static assets in public/
webpackConfig
.plugin('copy')
.use(require('copy-webpack-plugin'), [[{
from: api.resolve('public'),
to: api.resolve(options.outputDir),
ignore: ['index.html', '.DS_Store']
}]])
}
})
}
+3 -6
View File
@@ -103,18 +103,15 @@ module.exports = (api, options) => {
// inject CSS extraction plugin
if (extract) {
const userOptions = options.extractCSS && typeof options.extractCSS === 'object'
? options.extractCSS
const extractOptions = userOptions.extract && typeof userOptions.extract === 'object'
? userOptions.extract
: {}
webpackConfig
.plugin('extract-css')
.use(ExtractTextPlugin, [Object.assign({
filename: `css/[name].[contenthash:8].css`,
allChunks: true
}, userOptions)])
}, extractOptions)])
}
// TODO document receipe for using css.loaderOptions to add `data` option
// to sass-loader
})
}
+1 -1
View File
@@ -17,7 +17,7 @@ const schema = createSchema(joi => joi.object({
// css
css: joi.object({
modules: joi.boolean(),
extract: joi.boolean(),
extract: joi.alternatives().try(joi.boolean(), joi.object()),
localIdentName: joi.string(),
sourceMap: joi.boolean(),
loaderOptions: joi.object({
@@ -79,14 +79,14 @@ module.exports = function prepareProxy (proxy, appPublicFolder) {
)
}
},
onProxyReq (proxyReq) {
onProxyReq (proxyReq, req, res) {
if (usersOnProxyReq) {
usersOnProxyReq(proxyReq)
usersOnProxyReq(proxyReq, req, res)
}
// Browsers may send Origin headers even with same-origin
// requests. To prevent CORS issues, we have to change
// the Origin to match the target URL.
if (proxyReq.getHeader('origin')) {
if (!proxyReq.agent && proxyReq.getHeader('origin')) {
proxyReq.setHeader('origin', target)
}
},
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-service",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "local service for vue-cli projects",
"main": "lib/Service.js",
"bin": {
@@ -21,8 +21,8 @@
},
"homepage": "https://github.com/vuejs/vue-cli/packages/@vue/cli-service#readme",
"dependencies": {
"@vue/cli-overlay": "^3.0.0-beta.7",
"@vue/cli-shared-utils": "^3.0.0-beta.7",
"@vue/cli-overlay": "^3.0.0-beta.9",
"@vue/cli-shared-utils": "^3.0.0-beta.9",
"@vue/web-component-wrapper": "^1.2.0",
"acorn": "^5.5.3",
"address": "^1.0.3",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-shared-utils",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "shared utilities for vue-cli packages",
"main": "index.js",
"repository": {
@@ -11,7 +11,7 @@ module.exports = async function assertPromptModule (
opts = {}
) {
// auto fill non-module prompts
if (opts.plguinsOnly) {
if (opts.pluginsOnly) {
expectedPrompts.unshift(
{
message: 'Please pick a preset',
@@ -40,7 +40,7 @@ module.exports = async function assertPromptModule (
const creator = new Creator('test', '/', [].concat(module))
const preset = await creator.promptAndResolvePreset()
if (opts.plguinsOnly) {
if (opts.pluginsOnly) {
delete preset.useConfigFiles
}
expect(preset).toEqual(expectedOptions)
@@ -7,7 +7,7 @@ const writeFile = promisify(fs.writeFile)
const rmFile = promisify(fs.unlink)
const mkdirp = promisify(require('mkdirp'))
module.exports = function createTestProject (name, preset, cwd) {
module.exports = function createTestProject (name, preset, cwd, initGit) {
cwd = cwd || path.resolve(__dirname, '../../test')
const projectRoot = path.resolve(cwd, name)
@@ -46,7 +46,9 @@ module.exports = function createTestProject (name, preset, cwd) {
name,
'--force',
'--inlinePreset',
JSON.stringify(preset)
JSON.stringify(preset),
'--git',
initGit ? 'init' : 'false'
]
const options = {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-test-utils",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "test utilities for vue-cli packages",
"repository": {
"type": "git",
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-ui-addon-webpack",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
@@ -13,10 +13,10 @@
"vuex": "^3.0.1"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^3.0.0-beta.7",
"@vue/cli-plugin-eslint": "^3.0.0-beta.7",
"@vue/cli-service": "^3.0.0-beta.7",
"@vue/eslint-config-standard": "^3.0.0-beta.7",
"@vue/cli-plugin-babel": "^3.0.0-beta.9",
"@vue/cli-plugin-eslint": "^3.0.0-beta.9",
"@vue/cli-service": "^3.0.0-beta.9",
"@vue/eslint-config-standard": "^3.0.0-beta.9",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.1",
"vue-template-compiler": "^2.5.16"
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli-ui",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"author": "Guillaume Chau",
"license": "MIT",
"main": "index.js",
@@ -50,10 +50,10 @@
"xterm": "^3.2.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^3.0.0-beta.7",
"@vue/cli-plugin-eslint": "^3.0.0-beta.7",
"@vue/cli-service": "^3.0.0-beta.7",
"@vue/eslint-config-standard": "^3.0.0-beta.7",
"@vue/cli-plugin-babel": "^3.0.0-beta.9",
"@vue/cli-plugin-eslint": "^3.0.0-beta.9",
"@vue/cli-service": "^3.0.0-beta.9",
"@vue/eslint-config-standard": "^3.0.0-beta.9",
"eslint": "^4.16.0",
"lint-staged": "^6.0.0",
"stylus": "^0.54.5",
+114 -5
View File
@@ -4,6 +4,7 @@ const fs = require('fs')
const path = require('path')
const Generator = require('../lib/Generator')
const { logs } = require('@vue/cli-shared-utils')
const stringifyJS = require('javascript-stringify')
// prepare template fixtures
const mkdirp = require('mkdirp')
@@ -114,6 +115,79 @@ test('api: extendPackage function', async () => {
})
})
test('api: extendPackage allow git, github, http, file version ranges', async () => {
const generator = new Generator('/', { plugins: [
{
id: 'test',
apply: api => {
api.extendPackage({
dependencies: {
foo: 'git+ssh://git@github.com:npm/npm.git#v1.0.27',
baz: 'git://github.com/npm/npm.git#v1.0.27',
bar: 'expressjs/express',
bad: 'mochajs/mocha#4727d357ea',
bac: 'http://asdf.com/asdf.tar.gz',
bae: 'file:../dyl',
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:^1.0.0'
}
})
}
}
] })
await generator.generate()
const pkg = JSON.parse(fs.readFileSync('/package.json', 'utf-8'))
expect(pkg).toEqual({
dependencies: {
foo: 'git+ssh://git@github.com:npm/npm.git#v1.0.27',
baz: 'git://github.com/npm/npm.git#v1.0.27',
bar: 'expressjs/express',
bad: 'mochajs/mocha#4727d357ea',
bac: 'http://asdf.com/asdf.tar.gz',
bae: 'file:../dyl',
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:^1.0.0'
}
})
})
test('api: extendPackage merge nonstrictly semver deps', async () => {
const generator = new Generator('/', { plugins: [
{
id: 'test',
apply: api => {
api.extendPackage({
dependencies: {
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.0.0',
bar: 'expressjs/express'
}
})
}
},
{
id: 'test2',
apply: api => {
api.extendPackage({
dependencies: {
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.2.0',
bar: 'expressjs/express'
}
})
}
}
] })
await generator.generate()
const pkg = JSON.parse(fs.readFileSync('/package.json', 'utf-8'))
expect(pkg).toEqual({
dependencies: {
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.2.0',
bar: 'expressjs/express'
}
})
})
test('api: extendPackage merge dependencies', async () => {
const generator = new Generator('/', { plugins: [
{
@@ -208,6 +282,40 @@ test('api: extendPackage dependencies conflict', async () => {
})).toBe(true)
})
test('api: extendPackage merge warn nonstrictly semver deps', async () => {
new Generator('/', { plugins: [
{
id: 'test3',
apply: api => {
api.extendPackage({
dependencies: {
bar: 'expressjs/express'
}
})
}
},
{
id: 'test4',
apply: api => {
api.extendPackage({
dependencies: {
bar: 'expressjs/express#1234'
}
})
}
}
] })
expect(logs.warn.some(([msg]) => {
return (
msg.match(/conflicting versions for project dependency "bar"/) &&
msg.match(/expressjs\/express injected by generator "test3"/) &&
msg.match(/expressjs\/express#1234 injected by generator "test4"/) &&
msg.match(/Using version \(expressjs\/express\)/)
)
})).toBe(true)
})
test('api: render fs directory', async () => {
const generator = new Generator('/', { plugins: [
{
@@ -327,7 +435,7 @@ test('api: resolve', () => {
test('extract config files', async () => {
const configs = {
vue: {
lintOnSave: true
lintOnSave: false
},
babel: {
presets: ['@vue/app']
@@ -357,9 +465,10 @@ test('extract config files', async () => {
})
const json = v => JSON.stringify(v, null, 2)
expect(fs.readFileSync('/vue.config.js', 'utf-8')).toMatch('module.exports = {\n lintOnSave: true\n}')
const js = v => `module.exports = ${stringifyJS(v, null, 2)}`
expect(fs.readFileSync('/vue.config.js', 'utf-8')).toMatch(js(configs.vue))
expect(fs.readFileSync('/.babelrc', 'utf-8')).toMatch(json(configs.babel))
expect(fs.readFileSync('/.postcssrc', 'utf-8')).toMatch(json(configs.postcss))
expect(fs.readFileSync('/.eslintrc', 'utf-8')).toMatch(json(configs.eslintConfig))
expect(fs.readFileSync('/jest.config.js', 'utf-8')).toMatch(`module.exports = {\n foo: 'bar'\n}`)
expect(fs.readFileSync('/.postcssrc.js', 'utf-8')).toMatch(js(configs.postcss))
expect(fs.readFileSync('/.eslintrc.js', 'utf-8')).toMatch(js(configs.eslintConfig))
expect(fs.readFileSync('/jest.config.js', 'utf-8')).toMatch(js(configs.jest))
})
+10 -4
View File
@@ -5,6 +5,12 @@ const invoke = require('../lib/invoke')
const { expectPrompts } = require('inquirer')
const create = require('@vue/cli-test-utils/createTestProject')
const parseJS = file => {
const res = {}
;(new Function('module', file))(res)
return res.exports
}
async function createAndInstall (name) {
const project = await create(name, {
plugins: {
@@ -26,7 +32,7 @@ async function assertUpdates (project) {
'pre-commit': 'lint-staged'
})
const eslintrc = JSON.parse(await project.read('.eslintrc'))
const eslintrc = parseJS(await project.read('.eslintrc.js'))
expect(eslintrc).toEqual({
root: true,
extends: ['plugin:vue/essential', '@vue/airbnb']
@@ -78,7 +84,7 @@ test('invoke with existing files', async () => {
// mock existing vue.config.js
await project.write('vue.config.js', `module.exports = { lintOnSave: true }`)
const eslintrc = JSON.parse(await project.read('.eslintrc'))
const eslintrc = parseJS(await project.read('.eslintrc.js'))
expect(eslintrc).toEqual({
root: true,
extends: ['plugin:vue/essential', 'eslint:recommended']
@@ -104,13 +110,13 @@ test('invoke with existing files (yaml)', async () => {
pkg.devDependencies['@vue/cli-plugin-eslint'] = '*'
await project.write('package.json', JSON.stringify(pkg, null, 2))
const eslintrc = JSON.parse(await project.read('.eslintrc'))
const eslintrc = parseJS(await project.read('.eslintrc.js'))
expect(eslintrc).toEqual({
root: true,
extends: ['plugin:vue/essential', 'eslint:recommended']
})
await project.rm(`.eslintrc`)
await project.rm(`.eslintrc.js`)
await project.write(`.eslintrc.yml`, `
root: true
extends:
+5 -1
View File
@@ -41,8 +41,10 @@ program
.option('-i, --inlinePreset <json>', 'Skip prompts and use inline JSON string as preset')
.option('-m, --packageManager <command>', 'Use specified npm client when installing dependencies')
.option('-r, --registry <url>', 'Use specified npm registry when installing dependencies (only for npm)')
.option('-g, --git [message]', 'Force / skip git intialization, optionally specify initial commit message')
.option('-f, --force', 'Overwrite target directory if it exists')
.option('-c, --clone', 'Use git clone when fetching remote preset')
.option('-x, --proxy', 'Use specified proxy when creating project')
.action((name, cmd) => {
require('../lib/create')(name, cleanArgs(cmd))
})
@@ -66,9 +68,10 @@ program
program
.command('inspect [paths...]')
.option('--mode <mode>')
.option('-v --verbose', 'Show full function definitions in output')
.description('inspect the webpack config in a project with vue-cli-service')
.action((paths, cmd) => {
require('../lib/inspect')(paths, cmd.mode)
require('../lib/inspect')(paths, cleanArgs(cmd))
})
program
@@ -100,6 +103,7 @@ program
program
.command('init <template> <app-name>')
.description('generate a project from a remote template (legacy API, requires @vue/cli-init)')
.option('-c, --clone', 'Use git clone when fetching remote template')
.action(() => {
loadCommand('init', '@vue/cli-init')
})
+32 -8
View File
@@ -50,17 +50,15 @@ module.exports = class Creator extends EventEmitter {
this.promptCompleteCbs = []
this.createCompleteCbs = []
this.run = this.run.bind(this)
const promptAPI = new PromptModuleAPI(this)
promptModules.forEach(m => m(promptAPI))
}
async create (cliOptions = {}, preset = null) {
const isTestOrDebug = process.env.VUE_CLI_TEST || process.env.VUE_CLI_DEBUG
const { name, context, createCompleteCbs } = this
const run = (command, args) => {
if (!args) { [command, ...args] = command.split(/\s+/) }
return execa(command, args, { cwd: context })
}
const { run, name, context, createCompleteCbs } = this
if (!preset) {
if (cliOptions.preset) {
@@ -120,7 +118,8 @@ module.exports = class Creator extends EventEmitter {
// intilaize git repository before installing deps
// so that vue-cli-service can setup git hooks.
if (hasGit()) {
const shouldInitGit = await this.shouldInitGit(cliOptions)
if (shouldInitGit) {
logWithSpinner(`🗃`, `Initializing git repository...`)
this.emit('creation', { event: 'git-init' })
await run('git init')
@@ -169,13 +168,14 @@ module.exports = class Creator extends EventEmitter {
}
// commit initial state
if (hasGit()) {
if (shouldInitGit) {
await run('git add -A')
if (isTestOrDebug) {
await run('git', ['config', 'user.name', 'test'])
await run('git', ['config', 'user.email', 'test@test.com'])
}
await run(`git commit -m init`)
const msg = typeof cliOptions.git === 'string' ? cliOptions.git : 'init'
await run('git', ['commit', '-m', msg])
}
// log instructions
@@ -193,6 +193,11 @@ module.exports = class Creator extends EventEmitter {
generator.printExitLogs()
}
run (command, args) {
if (!args) { [command, ...args] = command.split(/\s+/) }
return execa(command, args, { cwd: this.context })
}
async promptAndResolvePreset (answers = null) {
// prompt
if (!answers) {
@@ -398,4 +403,23 @@ module.exports = class Creator extends EventEmitter {
debug('vue-cli:prompts')(prompts)
return prompts
}
async shouldInitGit (cliOptions) {
if (!hasGit()) {
return false
}
if (cliOptions.git) {
return cliOptions.git !== 'false'
}
// check if we are in a git repo already
try {
await this.run('git', ['status'])
} catch (e) {
// if git status failed, let's create a fresh repo
return true
}
// if git status worked, it means we are already in a git repo
// so don't init again.
return false
}
}
+8
View File
@@ -7,6 +7,7 @@ const resolve = require('resolve')
const isBinary = require('isbinaryfile')
const yaml = require('yaml-front-matter')
const mergeDeps = require('./util/mergeDeps')
const stringifyJS = require('javascript-stringify')
const { getPluginLink, toShortPluginId } = require('@vue/cli-shared-utils')
const isString = val => typeof val === 'string'
@@ -191,6 +192,13 @@ class GeneratorAPI {
exitLog (msg, type = 'log') {
this.generator.exitLogs.push({ id: this.id, msg, type })
}
/**
* convenience method for generating a js config file from json
*/
genJSConfig (value) {
return `module.exports = ${stringifyJS(value, null, 2)}`
}
}
function extractCallDir () {
+4
View File
@@ -10,6 +10,10 @@ const { error, stopSpinner, exit } = require('@vue/cli-shared-utils')
const validateProjectName = require('validate-npm-package-name')
async function create (projectName, options) {
if (options.proxy) {
process.env.HTTP_PROXY = options.proxy
}
const inCurrent = projectName === '.'
const name = inCurrent ? path.relative('../', process.cwd()) : projectName
const targetDir = path.resolve(projectName || '.')
+3 -2
View File
@@ -3,7 +3,7 @@ const path = require('path')
const execa = require('execa')
const resolve = require('resolve')
module.exports = function inspect (paths, mode) {
module.exports = function inspect (paths, args) {
const cwd = process.cwd()
let servicePath
try {
@@ -18,7 +18,8 @@ module.exports = function inspect (paths, mode) {
execa('node', [
binPath,
'inspect',
...(mode ? ['--mode', mode] : []),
...(args.mode ? ['--mode', args.mode] : []),
...(args.verbose ? ['--verbose'] : []),
...paths
], { cwd, stdio: 'inherit' })
}
@@ -23,7 +23,7 @@ test('should pass', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -49,6 +49,6 @@ test('should not include the plugin if ts is also present', async () => {
[mockTSModule, moduleToTest],
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -28,6 +28,6 @@ test('CSS pre-processor ', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -29,7 +29,7 @@ test('cypress', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -57,6 +57,6 @@ test('nightwatch', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -37,7 +37,7 @@ test('base', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -69,7 +69,7 @@ test('airbnb', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -101,7 +101,7 @@ test('standard', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -133,6 +133,6 @@ test('prettier', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -24,6 +24,6 @@ test('pwa', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -23,6 +23,6 @@ test('router', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -48,7 +48,7 @@ test('with TSLint', async () => {
[moduleToTest, linterModule],
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -96,6 +96,6 @@ test('with ESLint', async () => {
[moduleToTest, linterModule],
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -29,7 +29,7 @@ test('mocha', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -57,6 +57,6 @@ test('jest', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
@@ -23,6 +23,6 @@ test('vuex', async () => {
moduleToTest,
expectedPrompts,
expectedOptions,
{ plguinsOnly: true }
{ pluginsOnly: true }
)
})
+15 -6
View File
@@ -35,11 +35,20 @@ function makeJSONTransform (filename) {
}
}
function makeMutliExtensionJSONTransform (filename) {
function makeMutliExtensionJSONTransform (filename, preferJS) {
return function transformToMultiExtensions (value, checkExisting, context) {
if (!checkExisting) {
return makeJSONTransform(filename)(value, checkExisting, context)
function defaultTransform () {
if (preferJS) {
return makeJSTransform(`${filename}.js`)(value, false, context)
} else {
return makeJSONTransform(filename)(value, false, context)
}
}
if (!checkExisting) {
return defaultTransform()
}
const absolutePath = path.resolve(context, filename)
if (fs.existsSync(absolutePath)) {
return makeJSONTransform(filename)(value, checkExisting, context)
@@ -52,7 +61,7 @@ function makeMutliExtensionJSONTransform (filename) {
} else if (fs.existsSync(`${absolutePath}.yml`)) {
return transformYAML(value, `${filename}.yml`, fs.readFileSync(`${absolutePath}.yml`, 'utf-8'))
} else {
return makeJSONTransform(filename)(value, false, context)
return defaultTransform()
}
}
}
@@ -69,7 +78,7 @@ function transformYAML (value, filename, source) {
module.exports = {
vue: makeJSTransform('vue.config.js'),
babel: makeJSONTransform('.babelrc'),
postcss: makeMutliExtensionJSONTransform('.postcssrc'),
eslintConfig: makeMutliExtensionJSONTransform('.eslintrc'),
postcss: makeMutliExtensionJSONTransform('.postcssrc', true),
eslintConfig: makeMutliExtensionJSONTransform('.eslintrc', true),
jest: makeJSTransform('jest.config.js')
}
+13 -4
View File
@@ -7,8 +7,13 @@ module.exports = function resolveDeps (generatorId, to, from, sources) {
const r1 = to[name]
const r2 = from[name]
const sourceGeneratorId = sources[name]
const isValidURI = r2.match(/^(?:file|git|git\+ssh|git\+http|git\+https|git\+file|https?):/) != null
const isValidGitHub = r2.match(/^[^/]+\/[^/]+/) != null
if (!semver.validRange(r2)) {
// if they are the same, do nothing. Helps when non semver type deps are used
if (r1 === r2) continue
if (!isValidGitHub && !isValidURI && !semver.validRange(r2)) {
warn(
`invalid version range for dependency "${name}":\n\n` +
`- ${r2} injected by generator "${generatorId}"`
@@ -20,17 +25,19 @@ module.exports = function resolveDeps (generatorId, to, from, sources) {
res[name] = r2
sources[name] = generatorId
} else {
const r = tryGetNewerRange(r1, r2)
const r1semver = extractSemver(r1)
const r2semver = extractSemver(r2)
const r = tryGetNewerRange(r1semver, r2semver)
const didGetNewer = !!r
// if failed to infer newer version, use existing one because it's likely
// built-in
res[name] = didGetNewer ? r : r1
res[name] = didGetNewer ? injectSemver(r2, r) : r1
// if changed, update source
if (res[name] === r2) {
sources[name] = generatorId
}
// warn incompatible version requirements
if (!semver.intersects(r1, r2)) {
if (!semver.validRange(r1semver) || !semver.validRange(r2semver) || !semver.intersects(r1semver, r2semver)) {
warn(
`conflicting versions for project dependency "${name}":\n\n` +
`- ${r1} injected by generator "${sourceGeneratorId}"\n` +
@@ -45,6 +52,8 @@ module.exports = function resolveDeps (generatorId, to, from, sources) {
const leadRE = /^(~|\^|>=?)/
const rangeToVersion = r => r.replace(leadRE, '').replace(/x/g, '0')
const extractSemver = r => r.replace(/^.+#semver:/, '')
const injectSemver = (r, v) => semver.validRange(r) ? v : r.replace(/#semver:.+$/, `#semver:${v}`)
function tryGetNewerRange (r1, r2) {
const v1 = rangeToVersion(r1)
+5 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@vue/cli",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "Command line interface for rapid Vue.js development",
"bin": {
"vue": "bin/vue.js"
@@ -27,10 +27,13 @@
"access": "public"
},
"dependencies": {
"@vue/cli-shared-utils": "^3.0.0-beta.7",
"@vue/cli-shared-utils": "^3.0.0-beta.9",
"@vue/cli-ui": "^3.0.0-beta.9",
"@vue/cli-ui-addon-webpack": "^3.0.0-beta.9",
"chalk": "^2.3.0",
"commander": "^2.12.2",
"debug": "^3.1.0",
"deepmerge": "^2.0.1",
"download-git-repo": "^1.0.2",
"ejs": "^2.5.7",
"execa": "^0.8.0",
@@ -1,6 +1,6 @@
{
"name": "@vue/eslint-config-airbnb",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "eslint-config-airbnb for vue-cli",
"main": "index.js",
"publishConfig": {
@@ -1,6 +1,6 @@
{
"name": "@vue/eslint-config-prettier",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "eslint-config-prettier for vue-cli",
"main": "index.js",
"publishConfig": {
@@ -1,6 +1,6 @@
{
"name": "@vue/eslint-config-standard",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "eslint-config-standard for vue-cli",
"main": "index.js",
"publishConfig": {
@@ -1,6 +1,6 @@
{
"name": "@vue/eslint-config-typescript",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "eslint-config-typescript for vue-cli",
"main": "index.js",
"publishConfig": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "vue-cli-version-marker",
"version": "3.0.0-beta.7",
"version": "3.0.0-beta.9",
"description": "version marker for @vue/cli",
"author": "Evan You",
"license": "MIT"
+227 -45
View File
@@ -667,7 +667,7 @@
"@babel/helper-plugin-utils" "7.0.0-beta.46"
"@babel/plugin-transform-typescript" "7.0.0-beta.46"
"@babel/runtime@7.0.0-beta.46", "@babel/runtime@^7.0.0-beta.40":
"@babel/runtime@7.0.0-beta.46", "@babel/runtime@^7.0.0-beta.38", "@babel/runtime@^7.0.0-beta.40":
version "7.0.0-beta.46"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.46.tgz#466a9c0498f6d12d054a185981eef742d59d4871"
dependencies:
@@ -841,6 +841,10 @@
"@types/express-serve-static-core" "*"
"@types/serve-static" "*"
"@types/graphql@0.12.6":
version "0.12.6"
resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.12.6.tgz#3d619198585fcabe5f4e1adfb5cf5f3388c66c13"
"@types/http-assert@*":
version "1.2.2"
resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.2.2.tgz#17dfe5a82184a8898935d96fe2eaedd37d22d9a4"
@@ -909,11 +913,11 @@
version "2.2.48"
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.48.tgz#3523b126a0b049482e1c3c11877460f76622ffab"
"@types/node@*", "@types/node@^9.3.0":
version "9.6.6"
resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.6.tgz#439b91f9caf3983cad2eef1e11f6bedcbf9431d2"
"@types/node@*":
version "10.0.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.0.0.tgz#c40f8e07dce607d3ef25a626b93a6a7cdcf97881"
"@types/node@^9.4.6":
"@types/node@^9.3.0", "@types/node@^9.4.6":
version "9.6.7"
resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.7.tgz#5f3816d1db2155edcde1b2e3aa5d0e5c520cb564"
@@ -1217,6 +1221,14 @@ apollo-cache-control@^0.0.x:
dependencies:
graphql-extensions "^0.0.x"
apollo-cache-inmemory@^1.0.0:
version "1.1.12"
resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.1.12.tgz#ab489bf046b3e026556ab28bdebb6e010cac9531"
dependencies:
apollo-cache "^1.1.7"
apollo-utilities "^1.0.11"
graphql-anywhere "^4.1.8"
apollo-cache-inmemory@^1.1.10:
version "1.1.10"
resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.1.10.tgz#472442c6c59395159ae7d686ea33056248b26125"
@@ -1231,6 +1243,26 @@ apollo-cache@^1.1.5:
dependencies:
apollo-utilities "^1.0.9"
apollo-cache@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.1.7.tgz#5817018a2fbfc05a21ba319bd17a3e7538110cc5"
dependencies:
apollo-utilities "^1.0.11"
apollo-client@^2.0.1:
version "2.2.8"
resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.2.8.tgz#b604d31ab2d2dd00db3105d8793b93ee02ce567e"
dependencies:
"@types/zen-observable" "^0.5.3"
apollo-cache "^1.1.7"
apollo-link "^1.0.0"
apollo-link-dedup "^1.0.0"
apollo-utilities "^1.0.11"
symbol-observable "^1.0.2"
zen-observable "^0.7.0"
optionalDependencies:
"@types/async" "2.0.47"
apollo-client@^2.2.6:
version "2.2.6"
resolved "https://registry.yarnpkg.com/apollo-client/-/apollo-client-2.2.6.tgz#38b5a197976f3c22b63623c455d4c4606e420b66"
@@ -1272,6 +1304,12 @@ apollo-engine@^1.1.0:
apollo-engine-binary-linux "0.2018.4-20-g7a8822c14"
apollo-engine-binary-windows "0.2018.4-20-g7a8822c14"
apollo-link-context@^1.0.5:
version "1.0.8"
resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.8.tgz#c967a56ac6ed32add748937735bcb57c5cc64c95"
dependencies:
apollo-link "^1.2.2"
apollo-link-dedup@^1.0.0:
version "1.0.8"
resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.8.tgz#8c3028cf32557bd040ab6ba8856f38067bdacead"
@@ -1284,6 +1322,19 @@ apollo-link-http-common@^0.2.3:
dependencies:
apollo-link "^1.2.1"
apollo-link-http-common@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.4.tgz#877603f7904dc8f70242cac61808b1f8d034b2c3"
dependencies:
apollo-link "^1.2.2"
apollo-link-http@^1.0.0:
version "1.5.4"
resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.4.tgz#b80b7b4b342c655b6a5614624b076a36be368f43"
dependencies:
apollo-link "^1.2.2"
apollo-link-http-common "^0.2.4"
apollo-link-http@^1.5.3:
version "1.5.3"
resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.3.tgz#3aa0d3ecfe5666ef0c360f359c425ff6ea1d285b"
@@ -1291,6 +1342,13 @@ apollo-link-http@^1.5.3:
apollo-link "^1.2.1"
apollo-link-http-common "^0.2.3"
apollo-link-persisted-queries@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/apollo-link-persisted-queries/-/apollo-link-persisted-queries-0.1.0.tgz#addc4b4f5b4755fb9909cd87685a8b50d7646d79"
dependencies:
apollo-link "^1.0.3"
hash.js "^1.1.3"
apollo-link-state@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/apollo-link-state/-/apollo-link-state-0.4.0.tgz#916dab5fa4ecc18d99dd9664b1d22476f4b280a6"
@@ -1312,6 +1370,14 @@ apollo-link@^1.0.0, apollo-link@^1.1.0, apollo-link@^1.2.1:
apollo-utilities "^1.0.0"
zen-observable-ts "^0.8.6"
apollo-link@^1.0.3, apollo-link@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.2.tgz#54c84199b18ac1af8d63553a68ca389c05217a03"
dependencies:
"@types/graphql" "0.12.6"
apollo-utilities "^1.0.0"
zen-observable-ts "^0.8.9"
apollo-server-core@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.3.2.tgz#f36855a3ebdc2d77b8b9c454380bf1d706105ffc"
@@ -1337,6 +1403,14 @@ apollo-tracing@^0.1.0:
dependencies:
graphql-extensions "^0.0.x"
apollo-upload-client@^7.0.0-alpha.4:
version "7.1.0"
resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-7.1.0.tgz#13b48b24c6c5b454c6c62ee9c01726a6026ea0f4"
dependencies:
"@babel/runtime" "^7.0.0-beta.40"
apollo-link-http-common "^0.2.3"
extract-files "^3.1.0"
apollo-upload-server@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/apollo-upload-server/-/apollo-upload-server-5.0.0.tgz#c953b523608313966e0c8444637f4ae8ef77d5bc"
@@ -1349,6 +1423,10 @@ apollo-utilities@^1.0.0, apollo-utilities@^1.0.1, apollo-utilities@^1.0.6, apoll
version "1.0.8"
resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.8.tgz#74d797d38953d2ba35e16f880326e2abcbc8b016"
apollo-utilities@^1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.11.tgz#cd36bfa6e5c04eea2caf0c204a0f38a0ad550802"
apollo-utilities@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.9.tgz#16f9f2f92fd6c651d497aba6f2747ce17d87d80a"
@@ -1546,8 +1624,8 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
atob@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.0.tgz#ab2b150e51d7b122b9efc8d7340c06b6c41076bc"
version "2.1.1"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
atob@~1.1.0:
version "1.1.3"
@@ -1614,8 +1692,8 @@ babel-core@7.0.0-bridge.0:
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece"
babel-core@^6.0.0, babel-core@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
version "6.26.3"
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
dependencies:
babel-code-frame "^6.26.0"
babel-generator "^6.26.0"
@@ -1627,15 +1705,15 @@ babel-core@^6.0.0, babel-core@^6.26.0:
babel-traverse "^6.26.0"
babel-types "^6.26.0"
babylon "^6.18.0"
convert-source-map "^1.5.0"
debug "^2.6.8"
convert-source-map "^1.5.1"
debug "^2.6.9"
json5 "^0.5.1"
lodash "^4.17.4"
minimatch "^3.0.4"
path-is-absolute "^1.0.1"
private "^0.1.7"
private "^0.1.8"
slash "^1.0.0"
source-map "^0.5.6"
source-map "^0.5.7"
babel-eslint@^8.2.3:
version "8.2.3"
@@ -1721,8 +1799,8 @@ babel-plugin-syntax-object-rest-spread@^6.13.0:
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
babel-plugin-transform-es2015-modules-commonjs@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a"
version "6.26.2"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
dependencies:
babel-plugin-transform-strict-mode "^6.24.1"
babel-runtime "^6.26.0"
@@ -2050,8 +2128,8 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
electron-to-chromium "^1.2.7"
browserslist@^3.0.0, browserslist@^3.2.4:
version "3.2.5"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.5.tgz#aa46a5ea33b5330178f3c91cfd85e148fcb57080"
version "3.2.6"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.6.tgz#138a44d04a9af64443679191d041f28ce5b965d5"
dependencies:
caniuse-lite "^1.0.30000830"
electron-to-chromium "^1.3.42"
@@ -2062,10 +2140,25 @@ bser@^2.0.0:
dependencies:
node-int64 "^0.4.0"
buffer-alloc-unsafe@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz#ffe1f67551dd055737de253337bfe853dfab1a6a"
buffer-alloc@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.1.0.tgz#05514d33bf1656d3540c684f65b1202e90eca303"
dependencies:
buffer-alloc-unsafe "^0.1.0"
buffer-fill "^0.1.0"
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
buffer-fill@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-0.1.1.tgz#76d825c4d6e50e06b7a31eb520c04d08cc235071"
buffer-from@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531"
@@ -2300,8 +2393,8 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
supports-color "^2.0.0"
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3.2, chalk@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.0.tgz#a060a297a6b57e15b61ca63ce84995daa0fe6e52"
version "2.4.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
@@ -2462,8 +2555,8 @@ cliui@^4.0.0, cliui@^4.1.0:
wrap-ansi "^2.0.0"
clone@2.x:
version "2.1.2"
resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
version "2.1.1"
resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
clone@^1.0.2, clone@^1.0.4:
version "1.0.4"
@@ -2894,7 +2987,7 @@ conventional-recommended-bump@^1.2.1:
meow "^3.3.0"
object-assign "^4.0.1"
convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0:
convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
@@ -3755,8 +3848,8 @@ ejs@^2.5.7:
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.9.tgz#7ba254582a560d267437109a68354112475b0ce5"
electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.42:
version "1.3.42"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.42.tgz#95c33bf01d0cc405556aec899fe61fd4d76ea0f9"
version "1.3.44"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.44.tgz#ef6b150a60d523082388cadad88085ecd2fd4684"
elegant-spinner@^1.0.1:
version "1.0.1"
@@ -4009,6 +4102,13 @@ eslint-plugin-cypress@^2.0.1:
dependencies:
globals "^11.0.1"
eslint-plugin-graphql@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-graphql/-/eslint-plugin-graphql-1.5.0.tgz#1f0861b6499906f7ce153f9e83633659e4374ef6"
dependencies:
graphql-config "~1.0.9"
lodash "^4.11.1"
eslint-plugin-html@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-plugin-html/-/eslint-plugin-html-4.0.3.tgz#97d52dcf9e22724505d02719fbd02754013c8a17"
@@ -4389,6 +4489,12 @@ extglob@^2.0.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
extract-files@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-3.1.0.tgz#b70424c9d4a1a4208efe22069388f428e4ae00f1"
dependencies:
"@babel/runtime" "^7.0.0-beta.38"
extract-from-css@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/extract-from-css/-/extract-from-css-0.4.4.tgz#1ea7df2e7c7c6eb9922fa08e8adaea486f6f8f92"
@@ -4741,6 +4847,10 @@ from@~0:
version "0.1.7"
resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
fs-extra@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880"
@@ -4791,8 +4901,8 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
fsevents@^1.0.0, fsevents@^1.1.1, fsevents@^1.1.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.2.tgz#4f598f0f69b273188ef4a62ca4e9e08ace314bbf"
version "1.2.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.3.tgz#08292982e7059f6674c93d8b829c1e8604979ac0"
dependencies:
nan "^2.9.2"
node-pre-gyp "^0.9.0"
@@ -5020,8 +5130,8 @@ global@^4.3.2:
process "~0.5.1"
globals@^11.0.1, globals@^11.1.0:
version "11.4.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.4.0.tgz#b85c793349561c16076a3c13549238a27945f1bc"
version "11.5.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642"
globals@^9.18.0:
version "9.18.0"
@@ -5107,6 +5217,12 @@ graphql-anywhere@^4.1.6:
dependencies:
apollo-utilities "^1.0.9"
graphql-anywhere@^4.1.8:
version "4.1.8"
resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-4.1.8.tgz#23882e6a16ec824febbe5bca40937cdd76c5acdc"
dependencies:
apollo-utilities "^1.0.11"
graphql-config@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-2.0.0.tgz#daf69091055c6f675d63893a2d14c48f3fec3327"
@@ -5117,6 +5233,16 @@ graphql-config@2.0.0:
lodash "^4.17.4"
minimatch "^3.0.4"
graphql-config@~1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-1.0.9.tgz#8fa416a7c2bdb8f62f441324775dd3ff8a266652"
dependencies:
graphql "^0.11.7"
graphql-request "^1.4.0"
js-yaml "^3.10.0"
minimatch "^3.0.4"
rimraf "^2.6.2"
graphql-extensions@^0.0.x:
version "0.0.8"
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.0.8.tgz#d14d6e06db466a7f90fb97d75b657ae730278b09"
@@ -5172,6 +5298,12 @@ graphql-type-json@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.2.0.tgz#34c1a5fc2b7707a367c436482b253dbeebf1130e"
graphql@^0.11.7:
version "0.11.7"
resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.11.7.tgz#e5abaa9cb7b7cccb84e9f0836bf4370d268750c6"
dependencies:
iterall "1.1.3"
graphql@^0.13.0, graphql@^0.13.1:
version "0.13.1"
resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.1.tgz#9b3db3d8e40d1827e4172404bfdd2e4e17a58b55"
@@ -5316,7 +5448,7 @@ hash-sum@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
hash.js@^1.0.0, hash.js@^1.0.3:
hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
dependencies:
@@ -5577,8 +5709,8 @@ ignore-walk@^3.0.1:
minimatch "^3.0.4"
ignore@^3.3.3, ignore@^3.3.5, ignore@^3.3.6:
version "3.3.7"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
version "3.3.8"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b"
import-global@^0.1.0:
version "0.1.0"
@@ -6165,6 +6297,10 @@ isurl@^1.0.0-alpha5:
has-to-string-tag-x "^1.2.0"
is-object "^1.0.1"
iterall@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.3.tgz#1cbbff96204056dde6656e2ed2e2226d0e6d72c9"
iterall@^1.1.3, iterall@^1.2.0, iterall@^1.2.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7"
@@ -6411,6 +6547,10 @@ jest-snapshot@^22.4.3:
natural-compare "^1.4.0"
pretty-format "^22.4.3"
jest-transform-stub@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/jest-transform-stub/-/jest-transform-stub-1.0.0.tgz#e4e941454f31a8bbc4db96b31f46a08b294372b1"
jest-util@^22.4.3:
version "22.4.3"
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac"
@@ -7188,7 +7328,7 @@ lodash@4.17.4:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
lodash@4.x, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
lodash@4.x, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
@@ -7719,8 +7859,8 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
needle@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.0.tgz#f14efc69cee1024b72c8b21c7bdf94a731dc12fa"
version "2.2.1"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
dependencies:
debug "^2.1.2"
iconv-lite "^0.4.4"
@@ -8764,7 +8904,7 @@ pretty@2.0.0:
extend-shallow "^2.0.1"
js-beautify "^1.6.12"
private@^0.1.6, private@^0.1.7, private@~0.1.5:
private@^0.1.6, private@^0.1.8, private@~0.1.5:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@@ -9461,10 +9601,14 @@ rxjs@^5.0.0-beta.11, rxjs@^5.4.2:
dependencies:
symbol-observable "1.0.1"
safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
safe-buffer@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -10274,12 +10418,15 @@ tapable@^1.0.0:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
tar-stream@^1.5.2:
version "1.5.5"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55"
version "1.6.0"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.0.tgz#a50efaa7b17760b82c27b3cae4a301a8254a5715"
dependencies:
bl "^1.0.0"
buffer-alloc "^1.1.0"
end-of-stream "^1.0.0"
fs-constants "^1.0.0"
readable-stream "^2.0.0"
to-buffer "^1.1.0"
xtend "^4.0.0"
tar@^4:
@@ -10427,6 +10574,10 @@ to-arraybuffer@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
to-buffer@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
to-fast-properties@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
@@ -10566,8 +10717,8 @@ tslint@^5.9.1:
tsutils "^2.12.1"
tsutils@^2.12.1:
version "2.26.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.26.1.tgz#9e4a0cb9ff173863f34c22a961969081270d1878"
version "2.26.2"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.26.2.tgz#a9f9f63434a456a5e0c95a45d9a59181cb32d3bf"
dependencies:
tslib "^1.8.1"
@@ -10786,8 +10937,8 @@ unzip-response@^2.0.1:
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
upath@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d"
version "1.0.5"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.5.tgz#02cab9ecebe95bbec6d5fc2566325725ab6d1a73"
update-notifier@^2.3.0:
version "2.3.0"
@@ -10952,7 +11103,7 @@ vm-browserify@0.0.4:
dependencies:
indexof "0.0.1"
vue-apollo@^3.0.0-beta.5:
vue-apollo@^3.0.0-alpha.1, vue-apollo@^3.0.0-beta.5:
version "3.0.0-beta.5"
resolved "https://registry.yarnpkg.com/vue-apollo/-/vue-apollo-3.0.0-beta.5.tgz#d0aabd19683e50cd1ab2d24e2827e8fb579ff78e"
dependencies:
@@ -10985,6 +11136,27 @@ vue-cli-plugin-apollo@^0.7.8:
shortid "^2.2.8"
subscriptions-transport-ws "^0.9.6"
vue-cli-plugin-apollo@^0.7.9:
version "0.7.9"
resolved "https://registry.yarnpkg.com/vue-cli-plugin-apollo/-/vue-cli-plugin-apollo-0.7.9.tgz#73db0c38ba24ca3caf49d958a8d3c431ed0ff037"
dependencies:
apollo-engine "^1.1.0"
apollo-server-express "^1.3.2"
apollo-upload-server "^5.0.0"
body-parser "^1.18.2"
cors "^2.8.4"
cross-env "^5.1.4"
express "^4.16.2"
graphql "^0.13.1"
graphql-playground-middleware-express "^1.5.7"
graphql-subscriptions "^0.5.8"
graphql-tools "^2.21.0"
lowdb "^1.0.0"
mkdirp "^0.5.1"
nodemon "^1.17.1"
shortid "^2.2.8"
subscriptions-transport-ws "^0.9.6"
vue-cli@^2.9.2:
version "2.9.3"
resolved "https://registry.yarnpkg.com/vue-cli/-/vue-cli-2.9.3.tgz#c363ec48a7f55f72b76d90f44c001cc52d2fe0a8"
@@ -11155,8 +11327,8 @@ watch@~0.18.0:
minimist "^1.2.0"
watchpack@^1.4.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed"
version "1.6.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
dependencies:
chokidar "^2.0.2"
graceful-fs "^4.1.2"
@@ -11730,6 +11902,16 @@ zen-observable-ts@^0.8.6:
dependencies:
zen-observable "^0.7.0"
zen-observable-ts@^0.8.9:
version "0.8.9"
resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.9.tgz#d3c97af08c0afdca37ebcadf7cc3ee96bda9bab1"
dependencies:
zen-observable "^0.8.0"
zen-observable@^0.7.0:
version "0.7.1"
resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.7.1.tgz#f84075c0ee085594d3566e1d6454207f126411b3"
zen-observable@^0.8.0:
version "0.8.8"
resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.8.tgz#1ea93995bf098754a58215a1e0a7309e5749ec42"