Skip to content

Commit

Permalink
feat: support using remote preset (close #884)
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Mar 5, 2018
1 parent 8b24ec6 commit 2d89c51
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 6 deletions.
3 changes: 2 additions & 1 deletion packages/@vue/cli/bin/vue.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,13 @@ program
program
.command('create <app-name>')
.description('create a new project powered by vue-cli-service')
.option('-p, --preset <presetName>', 'Skip prompts and use saved preset')
.option('-p, --preset <presetName>', 'Skip prompts and use saved or remote preset')
.option('-d, --default', 'Skip prompts and use default preset')
.option('-i, --inlinePreset <json>', 'Skip prompts and use inline JSON string as preset')
.option('-m, --packageManager <command>', 'Use specified npm client when installing dependencies')
.option('-r, --registry <url>', 'Use specified npm registry when installing dependencies (only for npm)')
.option('-f, --force', 'Overwrite target directory if it exists')
.option('-c, --clone', 'Use git clone when fetching remote preset')
.action((name, cmd) => {
require('../lib/create')(name, cleanArgs(cmd))
})
Expand Down
24 changes: 20 additions & 4 deletions packages/@vue/cli/lib/Creator.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const PromptModuleAPI = require('./PromptModuleAPI')
const writeFileTree = require('./util/writeFileTree')
const formatFeatures = require('./util/formatFeatures')
const setupDevProject = require('./util/setupDevProject')
const fetchRemotePreset = require('./util/fetchRemotePreset')

const {
defaults,
Expand Down Expand Up @@ -60,7 +61,7 @@ module.exports = class Creator {
let preset
if (cliOptions.preset) {
// vue create foo --preset bar
preset = this.resolvePreset(cliOptions.preset)
preset = await this.resolvePreset(cliOptions.preset, cliOptions.clone)
} else if (cliOptions.default) {
// vue create foo --default
preset = defaults.presets.default
Expand Down Expand Up @@ -194,7 +195,7 @@ module.exports = class Creator {

let preset
if (answers.preset && answers.preset !== '__manual__') {
preset = this.resolvePreset(answers.preset)
preset = await this.resolvePreset(answers.preset)
} else {
// manual
preset = {
Expand All @@ -218,9 +219,24 @@ module.exports = class Creator {
return preset
}

resolvePreset (name) {
async resolvePreset (name, clone) {
let preset
const savedPresets = loadOptions().presets || {}
let preset = savedPresets[name]

if (name.includes('/')) {
logWithSpinner(`Fetching remote preset ${chalk.cyan(name)}...`)
try {
preset = await fetchRemotePreset(name, clone)
stopSpinner()
} catch (e) {
stopSpinner()
error(`Failed fetching remote preset ${chalk.cyan(name)}:`)
throw e
}
} else {
preset = savedPresets[name]
}

// use default preset if user has not overwritten it
if (name === 'default' && !preset) {
preset = defaults.presets.default
Expand Down
27 changes: 27 additions & 0 deletions packages/@vue/cli/lib/util/fetchRemotePreset.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module.exports = function fetchRemotePreset (name, clone) {
// github shorthand fastpath
if (!clone && /^[\w_-]+\/[\w_-]+$/.test(name)) {
const { get } = require('./request')
return get(`https://raw.githubusercontent.com/${name}/master/preset.json`)
.then(res => res.body)
}

// fallback to full download
const os = require('os')
const path = require('path')
const download = require('download-git-repo')
const tmpdir = path.join(os.tmpdir(), 'vue-cli')

return new Promise((resolve, reject) => {
download(name, tmpdir, { clone }, err => {
if (err) return reject(err)
let preset
try {
preset = require(path.join(tmpdir, 'preset.json'))
} catch (e) {
return reject(e)
}
resolve(preset)
})
})
}
1 change: 1 addition & 0 deletions packages/@vue/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"chalk": "^2.3.0",
"commander": "^2.12.2",
"debug": "^3.1.0",
"download-git-repo": "^1.0.2",
"ejs": "^2.5.7",
"execa": "^0.8.0",
"globby": "^7.1.1",
Expand Down
2 changes: 1 addition & 1 deletion yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3080,7 +3080,7 @@ dot-prop@^3.0.0:
dependencies:
is-obj "^1.0.0"

download-git-repo@^1.0.1:
download-git-repo@^1.0.1, download-git-repo@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/download-git-repo/-/download-git-repo-1.0.2.tgz#0b93a62057e41e2f21b1a06c95e7b26362b108ff"
dependencies:
Expand Down

0 comments on commit 2d89c51

Please sign in to comment.