Skip to content

Commit 2d89c51

Browse files
committed
feat: support using remote preset (close #884)
1 parent 8b24ec6 commit 2d89c51

File tree

5 files changed

+51
-6
lines changed

5 files changed

+51
-6
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@ program
3636
program
3737
.command('create <app-name>')
3838
.description('create a new project powered by vue-cli-service')
39-
.option('-p, --preset <presetName>', 'Skip prompts and use saved preset')
39+
.option('-p, --preset <presetName>', 'Skip prompts and use saved or remote preset')
4040
.option('-d, --default', 'Skip prompts and use default preset')
4141
.option('-i, --inlinePreset <json>', 'Skip prompts and use inline JSON string as preset')
4242
.option('-m, --packageManager <command>', 'Use specified npm client when installing dependencies')
4343
.option('-r, --registry <url>', 'Use specified npm registry when installing dependencies (only for npm)')
4444
.option('-f, --force', 'Overwrite target directory if it exists')
45+
.option('-c, --clone', 'Use git clone when fetching remote preset')
4546
.action((name, cmd) => {
4647
require('../lib/create')(name, cleanArgs(cmd))
4748
})

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

+20-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const PromptModuleAPI = require('./PromptModuleAPI')
1313
const writeFileTree = require('./util/writeFileTree')
1414
const formatFeatures = require('./util/formatFeatures')
1515
const setupDevProject = require('./util/setupDevProject')
16+
const fetchRemotePreset = require('./util/fetchRemotePreset')
1617

1718
const {
1819
defaults,
@@ -60,7 +61,7 @@ module.exports = class Creator {
6061
let preset
6162
if (cliOptions.preset) {
6263
// vue create foo --preset bar
63-
preset = this.resolvePreset(cliOptions.preset)
64+
preset = await this.resolvePreset(cliOptions.preset, cliOptions.clone)
6465
} else if (cliOptions.default) {
6566
// vue create foo --default
6667
preset = defaults.presets.default
@@ -194,7 +195,7 @@ module.exports = class Creator {
194195

195196
let preset
196197
if (answers.preset && answers.preset !== '__manual__') {
197-
preset = this.resolvePreset(answers.preset)
198+
preset = await this.resolvePreset(answers.preset)
198199
} else {
199200
// manual
200201
preset = {
@@ -218,9 +219,24 @@ module.exports = class Creator {
218219
return preset
219220
}
220221

221-
resolvePreset (name) {
222+
async resolvePreset (name, clone) {
223+
let preset
222224
const savedPresets = loadOptions().presets || {}
223-
let preset = savedPresets[name]
225+
226+
if (name.includes('/')) {
227+
logWithSpinner(`Fetching remote preset ${chalk.cyan(name)}...`)
228+
try {
229+
preset = await fetchRemotePreset(name, clone)
230+
stopSpinner()
231+
} catch (e) {
232+
stopSpinner()
233+
error(`Failed fetching remote preset ${chalk.cyan(name)}:`)
234+
throw e
235+
}
236+
} else {
237+
preset = savedPresets[name]
238+
}
239+
224240
// use default preset if user has not overwritten it
225241
if (name === 'default' && !preset) {
226242
preset = defaults.presets.default
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module.exports = function fetchRemotePreset (name, clone) {
2+
// github shorthand fastpath
3+
if (!clone && /^[\w_-]+\/[\w_-]+$/.test(name)) {
4+
const { get } = require('./request')
5+
return get(`https://raw.githubusercontent.com/${name}/master/preset.json`)
6+
.then(res => res.body)
7+
}
8+
9+
// fallback to full download
10+
const os = require('os')
11+
const path = require('path')
12+
const download = require('download-git-repo')
13+
const tmpdir = path.join(os.tmpdir(), 'vue-cli')
14+
15+
return new Promise((resolve, reject) => {
16+
download(name, tmpdir, { clone }, err => {
17+
if (err) return reject(err)
18+
let preset
19+
try {
20+
preset = require(path.join(tmpdir, 'preset.json'))
21+
} catch (e) {
22+
return reject(e)
23+
}
24+
resolve(preset)
25+
})
26+
})
27+
}

packages/@vue/cli/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"chalk": "^2.3.0",
3232
"commander": "^2.12.2",
3333
"debug": "^3.1.0",
34+
"download-git-repo": "^1.0.2",
3435
"ejs": "^2.5.7",
3536
"execa": "^0.8.0",
3637
"globby": "^7.1.1",

yarn.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -3080,7 +3080,7 @@ dot-prop@^3.0.0:
30803080
dependencies:
30813081
is-obj "^1.0.0"
30823082

3083-
download-git-repo@^1.0.1:
3083+
download-git-repo@^1.0.1, download-git-repo@^1.0.2:
30843084
version "1.0.2"
30853085
resolved "https://registry.yarnpkg.com/download-git-repo/-/download-git-repo-1.0.2.tgz#0b93a62057e41e2f21b1a06c95e7b26362b108ff"
30863086
dependencies:

0 commit comments

Comments
 (0)