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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 20 additions & 4 deletions
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
Lines changed: 27 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 1 deletion
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy