Skip to content

Commit 3df1289

Browse files
committedFeb 2, 2018
feat: check and show newer version on create
1 parent 4eee522 commit 3df1289

File tree

6 files changed

+69
-21
lines changed

6 files changed

+69
-21
lines changed
 

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

+5-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
const chalk = require('chalk')
22
const debug = require('debug')
33
const execa = require('execa')
4-
const axios = require('axios')
54
const resolve = require('resolve')
65
const inquirer = require('inquirer')
76
const Generator = require('./Generator')
87
const cloneDeep = require('lodash.clonedeep')
98
const sortObject = require('./util/sortObject')
9+
const getVersions = require('./util/getVersions')
1010
const installDeps = require('./util/installDeps')
1111
const clearConsole = require('./util/clearConsole')
1212
const PromptModuleAPI = require('./PromptModuleAPI')
@@ -89,17 +89,11 @@ module.exports = class Creator {
8989
(hasYarn ? 'yarn' : 'npm')
9090
)
9191

92-
clearConsole()
92+
await clearConsole()
9393
logWithSpinner(`✨`, `Creating project in ${chalk.yellow(context)}.`)
9494

9595
// get latest CLI version
96-
let latestCLIVersion
97-
if (!isTestOrDebug) {
98-
const res = await axios.get(`https://registry.npmjs.org/@vue%2Fcli/`)
99-
latestCLIVersion = res.data['dist-tags'].latest
100-
} else {
101-
latestCLIVersion = require('../package.json').version
102-
}
96+
const { latest } = await getVersions()
10397
// generate package.json with plugin dependencies
10498
const pkg = {
10599
name,
@@ -109,7 +103,7 @@ module.exports = class Creator {
109103
}
110104
const deps = Object.keys(preset.plugins)
111105
deps.forEach(dep => {
112-
pkg.devDependencies[dep] = `^${latestCLIVersion}`
106+
pkg.devDependencies[dep] = `^${latest}`
113107
})
114108
// write package.json
115109
await writeFileTree(context, {
@@ -185,7 +179,7 @@ module.exports = class Creator {
185179

186180
async promptAndResolvePreset () {
187181
// prompt
188-
clearConsole()
182+
await clearConsole()
189183
const answers = await inquirer.prompt(this.resolveFinalPrompts())
190184
debug('vue-cli:answers')(answers)
191185

‎packages/@vue/cli/lib/options.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ const fs = require('fs')
22
const os = require('os')
33
const path = require('path')
44
const cloneDeep = require('lodash.clonedeep')
5-
const { error, log, createSchema, validate } = require('@vue/cli-shared-utils')
5+
const { error, log } = require('@vue/cli-shared-utils/lib/logger')
6+
const { createSchema, validate } = require('@vue/cli-shared-utils/lib/validate')
67

78
const rcPath = exports.rcPath = (
89
process.env.VUE_CLI_CONFIG_PATH ||
+21-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
const chalk = require('chalk')
2-
const version = require('../../package.json').version
2+
const semver = require('semver')
3+
const getVersions = require('./getVersions')
34
const { clearConsole } = require('@vue/cli-shared-utils')
45

5-
let title = chalk.bold.green(`Vue CLI v${version}`)
6-
if (process.env.VUE_CLI_TEST) {
7-
title += ' ' + chalk.blue.bold('TEST')
8-
}
9-
if (process.env.VUE_CLI_DEBUG) {
10-
title += ' ' + chalk.magenta.bold('DEBUG')
11-
}
6+
module.exports = async function clearConsoleWithTitle () {
7+
const { current, latest } = await getVersions()
8+
9+
let title = chalk.bold.blue(`Vue CLI v${current}`)
1210

13-
module.exports = () => clearConsole(title)
11+
if (process.env.VUE_CLI_TEST) {
12+
title += ' ' + chalk.blue.bold('TEST')
13+
}
14+
if (process.env.VUE_CLI_DEBUG) {
15+
title += ' ' + chalk.magenta.bold('DEBUG')
16+
}
17+
if (semver.gt(latest, current)) {
18+
title += chalk.green(`
19+
┌─────────────────────────${`─`.repeat(latest.length)}─┐
20+
│ ✨ Update available: ${latest} ✨ │
21+
└─────────────────────────${`─`.repeat(latest.length)}─┘`)
22+
}
23+
24+
clearConsole(title)
25+
}
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
module.exports = async function getVersions () {
2+
const current = require(`../../package.json`).version
3+
let latest
4+
if (process.env.VUE_CLI_LATEST_VERSION) {
5+
// cached value
6+
latest = process.env.VUE_CLI_LATEST_VERSION
7+
} else if (process.env.VUE_CLI_TEST || process.env.VUE_CLI_DEBUG) {
8+
// test/debug, use local version
9+
latest = process.env.VUE_CLI_LATEST_VERSION = current
10+
} else {
11+
const axios = require('axios')
12+
const options = require('../options').loadOptions()
13+
const registry = options.useTaobaoRegistry
14+
? `https://registry.npm.taobao.org`
15+
: `https://registry.npmjs.org`
16+
17+
const res = await axios.get(`${registry}/vue-cli-version-marker/latest`)
18+
if (res.status === 200) {
19+
latest = process.env.VUE_CLI_LATEST_VERSION = res.data.version
20+
} else {
21+
// fallback to local version
22+
latest = process.env.VUE_CLI_LATEST_VERSION = current
23+
}
24+
}
25+
return {
26+
current,
27+
latest
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# What is This?
2+
3+
The npm registry does not expose `/latest` endpoints for scoped packages. Getting the full metadata for a scoped package is typically `~300ms` slower than simply getting the latest version from an unscoped package.
4+
5+
This package serves as an unscoped marker to expose the latest version currently published for `@vue/cli`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"name": "vue-cli-version-marker",
3+
"version": "3.0.0-alpha.6",
4+
"description": "version marker for @vue/cli",
5+
"author": "Evan You",
6+
"license": "MIT"
7+
}

0 commit comments

Comments
 (0)
Please sign in to comment.