Skip to content

Commit 0986acb

Browse files
committed
refactor: keep minor versions in sync & cache latest version in ~/.vuerc
1 parent cdec606 commit 0986acb

File tree

6 files changed

+31
-27
lines changed

6 files changed

+31
-27
lines changed

lerna.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
{
22
"npmClient": "yarn",
33
"useWorkspaces": true,
4-
"version": "independent",
4+
"version": "3.1.5",
55
"packages": [
6-
"packages/@vue/*",
6+
"packages/@vue/babel-preset-app",
7+
"packages/@vue/cli*",
78
"packages/vue-cli-version-marker"
89
]
910
}

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const chalk = require('chalk')
33
const debug = require('debug')
44
const execa = require('execa')
55
const inquirer = require('inquirer')
6+
const semver = require('semver')
67
const EventEmitter = require('events')
78
const Generator = require('./Generator')
89
const cloneDeep = require('lodash.clonedeep')
@@ -105,6 +106,7 @@ module.exports = class Creator extends EventEmitter {
105106

106107
// get latest CLI version
107108
const { latest } = await getVersions()
109+
const latestMinor = `${semver.major(latest)}.${semver.minor(latest)}.0`
108110
// generate package.json with plugin dependencies
109111
const pkg = {
110112
name,
@@ -117,9 +119,13 @@ module.exports = class Creator extends EventEmitter {
117119
if (preset.plugins[dep]._isPreset) {
118120
return
119121
}
122+
123+
// Note: the default creator includes no more than `@vue/cli-*` & `@vue/babel-preset-env`,
124+
// so it is fine to only test `@vue` prefix.
125+
// Other `@vue/*` packages' version may not be in sync with the cli itself.
120126
pkg.devDependencies[dep] = (
121127
preset.plugins[dep].version ||
122-
((/^@vue/.test(dep) && latest[dep]) ? `^${latest[dep]}` : `latest`)
128+
((/^@vue/.test(dep)) ? `^${latestMinor}` : `latest`)
123129
)
124130
})
125131
// write package.json

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

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ const presetSchema = createSchema(joi => joi.object().keys({
1919
}))
2020

2121
const schema = createSchema(joi => joi.object().keys({
22+
latestVersion: joi.string().regex(/^\d+\.\d+\.\d+$/),
23+
lastChecked: joi.date().timestamp(),
2224
packageManager: joi.string().only(['yarn', 'npm']),
2325
useTaobaoRegistry: joi.boolean(),
2426
presets: joi.object().pattern(/^/, presetSchema)

packages/@vue/cli/lib/util/clearConsole.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@ const { clearConsole } = require('@vue/cli-shared-utils')
66
exports.generateTitle = async function (checkUpdate) {
77
const { current, latest } = await getVersions()
88

9-
let title = chalk.bold.blue(`Vue CLI v${current['@vue/cli']}`)
9+
let title = chalk.bold.blue(`Vue CLI v${current}`)
1010

1111
if (process.env.VUE_CLI_TEST) {
1212
title += ' ' + chalk.blue.bold('TEST')
1313
}
1414
if (process.env.VUE_CLI_DEBUG) {
1515
title += ' ' + chalk.magenta.bold('DEBUG')
1616
}
17-
if (checkUpdate && semver.gt(latest['@vue/cli'], current['@vue/cli'])) {
17+
if (checkUpdate && semver.gt(latest, current)) {
1818
if (process.env.VUE_CLI_API_MODE) {
1919
title += chalk.green(` 🌟️ Update available: ${latest}`)
2020
} else {
2121
title += chalk.green(`
22-
┌────────────────────${`─`.repeat(latest['@vue/cli'].length)}──┐
23-
│ Update available: ${latest['@vue/cli']}
24-
└────────────────────${`─`.repeat(latest['@vue/cli'].length)}──┘`)
22+
┌────────────────────${`─`.repeat(latest.length)}──┐
23+
│ Update available: ${latest}
24+
└────────────────────${`─`.repeat(latest.length)}──┘`)
2525
}
2626
}
2727

+14-18
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
const fs = require('fs-extra')
2-
const path = require('path')
3-
const fsCachePath = path.resolve(__dirname, '.versions')
1+
const semver = require('semver')
2+
const { loadOptions, saveOptions } = require('../options')
43

54
let sessionCached
65

@@ -10,31 +9,26 @@ module.exports = async function getVersions () {
109
}
1110

1211
let latest
13-
const local = require('vue-cli-version-marker').devDependencies
12+
const local = require(`../../package.json`).version
1413
if (process.env.VUE_CLI_TEST || process.env.VUE_CLI_DEBUG) {
1514
return (sessionCached = {
1615
current: local,
1716
latest: local
1817
})
1918
}
2019

21-
if (!fs.existsSync(fsCachePath)) {
22-
// if the cache file doesn't exist, this is likely a fresh install
23-
// then create a cache file with the bundled version map
24-
await fs.writeFile(fsCachePath, JSON.stringify(local))
25-
}
26-
27-
const cached = JSON.parse(await fs.readFile(fsCachePath, 'utf-8'))
28-
const lastChecked = (await fs.stat(fsCachePath)).mtimeMs
20+
const { latestVersion, lastChecked } = loadOptions()
21+
const cached = latestVersion
2922
const daysPassed = (Date.now() - lastChecked) / (60 * 60 * 1000 * 24)
23+
3024
if (daysPassed > 1) {
3125
// if we haven't check for a new version in a day, wait for the check
3226
// before proceeding
33-
latest = await getAndCacheLatestVersions(cached)
27+
latest = await getAndCacheLatestVersion(cached)
3428
} else {
3529
// Otherwise, do a check in the background. If the result was updated,
3630
// it will be used for the next 24 hours.
37-
getAndCacheLatestVersions(cached)
31+
getAndCacheLatestVersion(cached)
3832
latest = cached
3933
}
4034

@@ -46,13 +40,15 @@ module.exports = async function getVersions () {
4640

4741
// fetch the latest version and save it on disk
4842
// so that it is available immediately next time
49-
async function getAndCacheLatestVersions (cached) {
43+
async function getAndCacheLatestVersion (cached) {
5044
const getPackageVersion = require('./getPackageVersion')
5145
const res = await getPackageVersion('vue-cli-version-marker', 'latest')
5246
if (res.statusCode === 200) {
53-
const versions = res.body.devDependencies
54-
await fs.writeFile(fsCachePath, JSON.stringify(versions))
55-
return versions
47+
const { version } = res.body
48+
if (semver.valid(version) && version !== cached) {
49+
saveOptions({ lastestVersion: version, lastChecked: Date.now() })
50+
return version
51+
}
5652
}
5753
return cached
5854
}

packages/@vue/cli/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
"shortid": "^2.2.11",
5454
"slash": "^2.0.0",
5555
"validate-npm-package-name": "^3.0.0",
56-
"vue-cli-version-marker": "3.1.2",
5756
"yaml-front-matter": "^3.4.1"
5857
},
5958
"engines": {

0 commit comments

Comments
 (0)