|
1 | 1 | const fs = require('fs')
|
2 | 2 | const path = require('path')
|
3 | 3 | const debug = require('debug')
|
| 4 | +const chalk = require('chalk') |
4 | 5 | const readPkg = require('read-pkg')
|
5 | 6 | const merge = require('webpack-merge')
|
6 | 7 | const deepMerge = require('deepmerge')
|
7 | 8 | const Config = require('webpack-chain')
|
8 | 9 | const PluginAPI = require('./PluginAPI')
|
9 | 10 | const loadEnv = require('./util/loadEnv')
|
10 |
| -const cosmiconfig = require('cosmiconfig') |
11 |
| -const { error } = require('@vue/cli-shared-utils') |
| 11 | +const { warn, error } = require('@vue/cli-shared-utils') |
12 | 12 |
|
13 | 13 | const { defaults, validate } = require('./options')
|
14 | 14 |
|
@@ -155,25 +155,45 @@ module.exports = class Service {
|
155 | 155 | }
|
156 | 156 |
|
157 | 157 | loadProjectOptions (inlineOptions) {
|
158 |
| - let resolved |
159 |
| - if (this.pkg.vue) { |
160 |
| - resolved = this.pkg.vue |
161 |
| - } else { |
162 |
| - const explorer = cosmiconfig('vue', { |
163 |
| - rc: false, |
164 |
| - sync: true, |
165 |
| - stopDir: this.context |
166 |
| - }) |
167 |
| - try { |
168 |
| - const res = explorer.load(this.context) |
169 |
| - if (res) resolved = res.config |
170 |
| - } catch (e) { |
| 158 | + // vue.config.js |
| 159 | + let fileConfig, pkgConfig, resolved |
| 160 | + const configPath = ( |
| 161 | + process.env.VUE_CLI_SERVICE_CONFIG_PATH || |
| 162 | + path.resolve(this.context, 'vue.config.js') |
| 163 | + ) |
| 164 | + try { |
| 165 | + fileConfig = require(configPath) |
| 166 | + if (!fileConfig || typeof fileConfig !== 'object') { |
171 | 167 | error(
|
172 |
| - `Error loading vue-cli config: ${e.message}` |
| 168 | + `Error loading ${chalk.bold('vue.config.js')}: should export an object.` |
| 169 | + ) |
| 170 | + fileConfig = null |
| 171 | + } |
| 172 | + } catch (e) {} |
| 173 | + |
| 174 | + // package.vue |
| 175 | + pkgConfig = this.pkg.vue |
| 176 | + if (pkgConfig && typeof pkgConfig !== 'object') { |
| 177 | + error( |
| 178 | + `Error loading vue-cli config in ${chalk.bold(`package.json`)}: ` + |
| 179 | + `the "vue" field should be an object.` |
| 180 | + ) |
| 181 | + pkgConfig = null |
| 182 | + } |
| 183 | + |
| 184 | + if (fileConfig) { |
| 185 | + if (pkgConfig) { |
| 186 | + warn( |
| 187 | + `"vue" field in ${chalk.bold(`package.json`)} ignored ` + |
| 188 | + `due to presence of ${chalk.bold('vue.config.js')}.` |
173 | 189 | )
|
174 | 190 | }
|
| 191 | + resolved = fileConfig |
| 192 | + } else if (pkgConfig) { |
| 193 | + resolved = pkgConfig |
| 194 | + } else { |
| 195 | + resolved = inlineOptions || {} |
175 | 196 | }
|
176 |
| - resolved = resolved || inlineOptions || {} |
177 | 197 |
|
178 | 198 | // normlaize some options
|
179 | 199 | ensureSlash(resolved, 'base')
|
|
0 commit comments