|
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