You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.1 KiB
84 lines
2.1 KiB
4 weeks ago
|
const path = require('path')
|
||
|
const { chalk, warn, error } = require('@vue/cli-shared-utils')
|
||
|
const { validate } = require('../options')
|
||
|
|
||
|
function ensureSlash (config, key) {
|
||
|
const val = config[key]
|
||
|
if (typeof val === 'string') {
|
||
|
config[key] = val.replace(/([^/])$/, '$1/')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function removeSlash (config, key) {
|
||
|
if (typeof config[key] === 'string') {
|
||
|
config[key] = config[key].replace(/\/$/g, '')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = function resolveUserConfig ({
|
||
|
inlineOptions,
|
||
|
pkgConfig,
|
||
|
fileConfig,
|
||
|
fileConfigPath
|
||
|
}) {
|
||
|
if (fileConfig) {
|
||
|
if (typeof fileConfig === 'function') {
|
||
|
fileConfig = fileConfig()
|
||
|
}
|
||
|
|
||
|
if (!fileConfig || typeof fileConfig !== 'object') {
|
||
|
throw new Error(
|
||
|
`Error loading ${chalk.bold(fileConfigPath)}: ` +
|
||
|
`should export an object or a function that returns object.`
|
||
|
)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// package.vue
|
||
|
if (pkgConfig && typeof pkgConfig !== 'object') {
|
||
|
throw new Error(
|
||
|
`Error loading Vue CLI config in ${chalk.bold(`package.json`)}: ` +
|
||
|
`the "vue" field should be an object.`
|
||
|
)
|
||
|
}
|
||
|
|
||
|
let resolved, resolvedFrom
|
||
|
if (fileConfig) {
|
||
|
const configFileName = path.basename(fileConfigPath)
|
||
|
if (pkgConfig) {
|
||
|
warn(
|
||
|
`"vue" field in package.json ignored ` +
|
||
|
`due to presence of ${chalk.bold(configFileName)}.`
|
||
|
)
|
||
|
warn(
|
||
|
`You should migrate it into ${chalk.bold(configFileName)} ` +
|
||
|
`and remove it from package.json.`
|
||
|
)
|
||
|
}
|
||
|
resolved = fileConfig
|
||
|
resolvedFrom = configFileName
|
||
|
} else if (pkgConfig) {
|
||
|
resolved = pkgConfig
|
||
|
resolvedFrom = '"vue" field in package.json'
|
||
|
} else {
|
||
|
resolved = inlineOptions || {}
|
||
|
resolvedFrom = 'inline options'
|
||
|
}
|
||
|
|
||
|
// normalize some options
|
||
|
if (resolved.publicPath !== 'auto') {
|
||
|
ensureSlash(resolved, 'publicPath')
|
||
|
}
|
||
|
if (typeof resolved.publicPath === 'string') {
|
||
|
resolved.publicPath = resolved.publicPath.replace(/^\.\//, '')
|
||
|
}
|
||
|
removeSlash(resolved, 'outputDir')
|
||
|
|
||
|
// validate options
|
||
|
validate(resolved, msg => {
|
||
|
error(`Invalid options in ${chalk.bold(resolvedFrom)}: ${msg}`)
|
||
|
})
|
||
|
|
||
|
return resolved
|
||
|
}
|