84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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
 | 
						|
}
 |