Skip to content

Commit 85aacc3

Browse files
committed
refactor: improve options validation
1 parent d3d040a commit 85aacc3

File tree

4 files changed

+42
-30
lines changed

4 files changed

+42
-30
lines changed

packages/@vue/cli-service/lib/Service.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ module.exports = class Service {
154154

155155
loadProjectOptions (inlineOptions) {
156156
// vue.config.js
157-
let fileConfig, pkgConfig, resolved
157+
let fileConfig, pkgConfig, resolved, resovledFrom
158158
const configPath = (
159159
process.env.VUE_CLI_SERVICE_CONFIG_PATH ||
160160
path.resolve(this.context, 'vue.config.js')
@@ -182,23 +182,34 @@ module.exports = class Service {
182182
if (fileConfig) {
183183
if (pkgConfig) {
184184
warn(
185-
`"vue" field in ${chalk.bold(`package.json`)} ignored ` +
185+
`"vue" field in package.json ignored ` +
186186
`due to presence of ${chalk.bold('vue.config.js')}.`
187187
)
188+
warn(
189+
`You should migrate it into ${chalk.bold('vue.config.js')} ` +
190+
`and remove it from package.json.`
191+
)
188192
}
189193
resolved = fileConfig
194+
resovledFrom = 'vue.config.js'
190195
} else if (pkgConfig) {
191196
resolved = pkgConfig
197+
resovledFrom = '"vue" field in package.json'
192198
} else {
193199
resolved = inlineOptions || {}
200+
resovledFrom = 'inline options'
194201
}
195202

196203
// normlaize some options
197204
ensureSlash(resolved, 'base')
198205
removeSlash(resolved, 'outputDir')
199206

200207
// validate options
201-
validate(resolved)
208+
validate(resolved, msg => {
209+
error(
210+
`Invalid options in ${chalk.bold(resovledFrom)}: ${msg}`
211+
)
212+
})
202213

203214
return resolved
204215
}

packages/@vue/cli-service/lib/options.js

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ const schema = createSchema(joi => joi.object({
77
productionSourceMap: joi.boolean(),
88
vueLoader: joi.object(),
99
parallel: joi.boolean(),
10+
devServer: joi.object(),
1011
dll: joi.alternatives().try(
1112
joi.boolean(),
1213
joi.array().items(joi.string())
1314
),
15+
16+
// css
1417
css: joi.object({
1518
modules: joi.boolean(),
1619
extract: joi.boolean(),
@@ -21,25 +24,25 @@ const schema = createSchema(joi => joi.object({
2124
stylus: joi.object()
2225
})
2326
}),
24-
devServer: joi.object(),
25-
26-
// known options from offical plugins
27-
lintOnSave: joi.boolean(),
2827

2928
// webpack
3029
chainWebpack: joi.func(),
3130
configureWebpack: joi.alternatives().try(
3231
joi.object(),
3332
joi.func()
34-
)
33+
),
34+
35+
// known runtime options for built-in plugins
36+
lintOnSave: joi.boolean(),
37+
pwa: joi.object(),
38+
39+
// 3rd party plugin options
40+
pluginOptions: joi.object()
3541
}))
3642

37-
exports.validate = options => validate(
38-
options,
39-
schema,
40-
// so that plugins can make use of custom options
41-
{ allowUnknown: true }
42-
)
43+
exports.validate = (options, cb) => {
44+
validate(options, schema, cb)
45+
}
4346

4447
exports.defaults = () => ({
4548
// project deployment base

packages/@vue/cli-shared-utils/lib/validate.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
const joi = require('joi')
2-
const { error } = require('./logger')
32

43
// proxy to joi for option validation
54
exports.createSchema = fn => fn(joi)
65

7-
exports.validate = (obj, schema, options = {}, noExit) => {
8-
joi.validate(obj, schema, options, err => {
6+
exports.validate = (obj, schema, cb) => {
7+
joi.validate(obj, schema, {}, err => {
98
if (err) {
10-
error(`vue-cli options validation failed:\n` + err.message)
11-
if (!noExit) {
12-
process.exit(1)
13-
} else {
9+
cb(err.message)
10+
if (process.env.VUE_CLI_TEST) {
1411
throw err
12+
} else {
13+
process.exit(1)
1514
}
1615
}
1716
})

packages/@vue/cli/lib/options.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const fs = require('fs')
22
const os = require('os')
33
const path = require('path')
44
const cloneDeep = require('lodash.clonedeep')
5-
const { error, log } = require('@vue/cli-shared-utils/lib/logger')
5+
const { error } = require('@vue/cli-shared-utils/lib/logger')
66
const { createSchema, validate } = require('@vue/cli-shared-utils/lib/validate')
77

88
const rcPath = exports.rcPath = (
@@ -24,7 +24,9 @@ const schema = createSchema(joi => joi.object().keys({
2424
presets: joi.object().pattern(/^/, presetSchema)
2525
}))
2626

27-
exports.validatePreset = preset => validate(preset, presetSchema)
27+
exports.validatePreset = preset => validate(preset, presetSchema, msg => {
28+
error(`invalid preset options: ${msg}`)
29+
})
2830

2931
exports.defaultPreset = {
3032
router: false,
@@ -64,17 +66,14 @@ exports.loadOptions = () => {
6466
`Please fix/delete it and re-run vue-cli in manual mode.\n` +
6567
`(${e.message})`,
6668
)
67-
// process.exit(1)
69+
process.exit(1)
6870
}
69-
try {
70-
validate(cachedOptions, schema, undefined, true /* noExit */)
71-
} catch (e) {
72-
log(
71+
validate(cachedOptions, schema, () => {
72+
error(
7373
`~/.vuerc may be outdated. ` +
7474
`Please delete it and re-run vue-cli in manual mode.`
7575
)
76-
// process.exit(1)
77-
}
76+
})
7877
return cachedOptions
7978
} else {
8079
return {}

0 commit comments

Comments
 (0)