Skip to content

Commit dec3ea3

Browse files
author
Guillaume Chau
committed
refactor: new @vue/cli-utils package
1 parent 7e0c697 commit dec3ea3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+1824
-225
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module.exports = class PromptModuleAPI {
2+
constructor () {
3+
this.features = []
4+
this.injectedPrompts = []
5+
this.promptCompleteCbs = []
6+
}
7+
8+
injectFeature (feature) {
9+
this.features.push(feature)
10+
}
11+
12+
injectPrompt (prompt) {
13+
this.injectedPrompts.push(prompt)
14+
}
15+
16+
injectOptionForPrompt (name, option) {
17+
this.injectedPrompts.find(f => {
18+
return f.name === name
19+
}).choices.push(option)
20+
}
21+
22+
onPromptComplete (cb) {
23+
this.promptCompleteCbs.push(cb)
24+
}
25+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const debug = require('debug')
2+
const {
3+
saveOptions,
4+
validatePreset,
5+
savePreset
6+
} = require('../options')
7+
const { resolvePreset } = require('./resolvePreset')
8+
9+
exports.getPresetFromAnswers = async function (answers, promptCompleteCbs) {
10+
debug('vue-cli:answers')(answers)
11+
12+
if (answers.packageManager) {
13+
saveOptions({
14+
packageManager: answers.packageManager
15+
})
16+
}
17+
18+
let preset
19+
if (answers.preset && answers.preset !== '__manual__') {
20+
preset = await resolvePreset(answers.preset)
21+
} else {
22+
// manual
23+
preset = {
24+
useConfigFiles: answers.useConfigFiles === 'files',
25+
plugins: {}
26+
}
27+
answers.features = answers.features || []
28+
// run cb registered by prompt modules to finalize the preset
29+
promptCompleteCbs.forEach(cb => cb(answers, preset))
30+
}
31+
32+
// validate
33+
validatePreset(preset)
34+
35+
// save preset
36+
if (answers.save && answers.saveName) {
37+
savePreset(answers.saveName, preset)
38+
}
39+
40+
debug('vue-cli:preset')(preset)
41+
return preset
42+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
const {
2+
defaults,
3+
loadOptions
4+
} = require('../options')
5+
6+
exports.getPresets = function () {
7+
const savedOptions = loadOptions()
8+
return Object.assign({}, savedOptions.presets, defaults.presets)
9+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
const path = require('path')
2+
const chalk = require('chalk')
3+
const {
4+
defaults,
5+
loadOptions
6+
} = require('../options')
7+
const loadLocalPreset = require('./loadLocalPreset')
8+
const loadRemotePreset = require('./loadRemotePreset')
9+
const {
10+
log,
11+
error,
12+
logWithSpinner,
13+
stopSpinner,
14+
exit
15+
} = require('@vue/cli-shared-utils')
16+
17+
exports.resolvePreset = async function (name, clone) {
18+
let preset
19+
const savedPresets = loadOptions().presets || {}
20+
21+
if (name in savedPresets) {
22+
preset = savedPresets[name]
23+
} else if (name.endsWith('.json') || /^\./.test(name) || path.isAbsolute(name)) {
24+
preset = await loadLocalPreset(path.resolve(name))
25+
} else if (name.includes('/')) {
26+
logWithSpinner(`Fetching remote preset ${chalk.cyan(name)}...`)
27+
try {
28+
preset = await loadRemotePreset(name, clone)
29+
stopSpinner()
30+
} catch (e) {
31+
stopSpinner()
32+
error(`Failed fetching remote preset ${chalk.cyan(name)}:`)
33+
throw e
34+
}
35+
}
36+
37+
// use default preset if user has not overwritten it
38+
if (name === 'default' && !preset) {
39+
preset = defaults.presets.default
40+
}
41+
if (!preset) {
42+
error(`preset "${name}" not found.`)
43+
const presets = Object.keys(savedPresets)
44+
if (presets.length) {
45+
log()
46+
log(`available presets:\n${presets.join(`\n`)}`)
47+
} else {
48+
log(`you don't seem to have any saved preset.`)
49+
log(`run vue-cli in manual mode to create a preset.`)
50+
}
51+
exit(1)
52+
}
53+
return preset
54+
}

packages/@vue/cli-utils/package.json

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
{
2+
"name": "@vue/cli-utils",
3+
"version": "4.0.0-alpha.3",
4+
"description": "Utilities for the `vue` commands.",
5+
"repository": {
6+
"type": "git",
7+
"url": "git+https://github.com/vuejs/vue-cli.git",
8+
"directory": "packages/@vue/cli-create-utils"
9+
},
10+
"keywords": [
11+
"vue",
12+
"cli"
13+
],
14+
"author": "Guillaume Chau",
15+
"license": "MIT",
16+
"bugs": {
17+
"url": "https://github.com/vuejs/vue-cli/issues"
18+
},
19+
"homepage": "https://cli.vuejs.org/",
20+
"publishConfig": {
21+
"access": "public"
22+
},
23+
"dependencies": {
24+
"@vue/cli-shared-utils": "^4.0.0-alpha.3",
25+
"cmd-shim": "^2.0.2",
26+
"chalk": "^2.4.1",
27+
"commander": "^2.20.0",
28+
"debug": "^4.1.0",
29+
"deepmerge": "^3.2.0",
30+
"download-git-repo": "^1.0.2",
31+
"execa": "^1.0.0",
32+
"fs-extra": "^7.0.1",
33+
"globby": "^9.2.0",
34+
"import-global": "^0.1.0",
35+
"inquirer": "^6.3.1",
36+
"isbinaryfile": "^4.0.0",
37+
"javascript-stringify": "^1.6.0",
38+
"jscodeshift": "^0.6.4",
39+
"js-yaml": "^3.13.1",
40+
"lodash.clonedeep": "^4.5.0",
41+
"lru-cache": "^5.1.1",
42+
"minimist": "^1.2.0",
43+
"recast": "^0.18.1",
44+
"semver": "^6.1.0",
45+
"slash": "^3.0.0",
46+
"vue-jscodeshift-adapter": "^2.0.2"
47+
},
48+
"engines": {
49+
"node": ">=8.9"
50+
}
51+
}

packages/@vue/cli/__tests__/Creator.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
jest.mock('fs')
22
jest.mock('inquirer')
33

4-
const { defaults } = require('../lib/options')
4+
const { defaults } = require('@vue/cli-utils/lib/options')
55
const assertPromptModule = require('@vue/cli-test-utils/assertPromptModule')
66

77
test('default', async () => {

packages/@vue/cli/__tests__/Generator.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const fs = require('fs-extra')
44
const path = require('path')
55
const Generator = require('../lib/Generator')
66
const { logs } = require('@vue/cli-shared-utils')
7-
const stringifyJS = require('../lib/util/stringifyJS')
7+
const stringifyJS = require('@vue/cli-utils/lib/util/stringifyJS')
88

99
// prepare template fixtures
1010
const templateDir = path.resolve(__dirname, 'template')

packages/@vue/cli/__tests__/options.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const {
66
loadOptions,
77
saveOptions,
88
savePreset
9-
} = require('../lib/options')
9+
} = require('@vue/cli-utils/lib/options')
1010

1111
test('load options', () => {
1212
expect(loadOptions()).toEqual({})

packages/@vue/cli/bin/vue.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ if (
4747
}
4848

4949
const program = require('commander')
50-
const loadCommand = require('../lib/util/loadCommand')
50+
const loadCommand = require('@vue/cli-utils/lib/util/loadCommand')
5151

5252
program
5353
.version(require('../package').version)
@@ -215,7 +215,7 @@ program.on('--help', () => {
215215
program.commands.forEach(c => c.on('--help', () => console.log()))
216216

217217
// enhance common error messages
218-
const enhanceErrorMessages = require('../lib/util/enhanceErrorMessages')
218+
const enhanceErrorMessages = require('@vue/cli-utils/lib/util/enhanceErrorMessages')
219219

220220
enhanceErrorMessages('missingArgument', argName => {
221221
return `Missing required argument ${chalk.yellow(`<${argName}>`)}.`

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const transforms = require('./util/configTransforms')
1+
const transforms = require('@vue/cli-utils/lib/util/configTransforms')
22

33
class ConfigTransform {
44
constructor (options) {

0 commit comments

Comments
 (0)