diff --git a/.gitignore b/.gitignore index 8942d4228c..3a87b1b4e3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ temp .vuerc .version .versions +.changelog diff --git a/lerna.json b/lerna.json index 029e205ce5..a50cae6a50 100644 --- a/lerna.json +++ b/lerna.json @@ -5,5 +5,18 @@ "packages": [ "packages/@vue/babel-preset-app", "packages/@vue/cli*" - ] + ], + "changelog": { + "repo": "vuejs/vue-cli", + "labels": { + "PR: New Feature": ":rocket: New Feature", + "PR: Breaking Change": ":boom: Breaking Change", + "PR: Bug Fix": ":bug: Bug Fix", + "PR: Documentation": ":memo: Documentation", + "PR: Internal": ":house: Internal", + "PR: Underlying Tools": ":hammer: Underlying Tools" + }, + "cacheDir": ".changelog", + "nextVersionFromMetadata": true + } } diff --git a/package.json b/package.json index 67c021500e..2ff8f32a17 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "sync": "node scripts/syncDeps.js", "boot": "node scripts/bootstrap.js", "release": "yarn --pure-lockfile && yarn clean && node scripts/release.js", - "changelog": "node scripts/genChangelog.js run", + "version": "node scripts/markVersions.js && node scripts/genChangelog.js && git add packages/vue-cli-version-marker CHANGELOG.md", "docs": "vuepress dev docs", "docs:build": "vuepress build docs", "patch-chromedriver": "node scripts/patchChromedriver.js" @@ -43,12 +43,10 @@ ] }, "devDependencies": { - "@vue/conventional-changelog": "^0.1.1", "@vuepress/plugin-pwa": "^1.0.0-alpha.44", "@vuepress/theme-vue": "1.0.0-alpha.44", "babel-core": "7.0.0-bridge.0", "babel-eslint": "^10.0.1", - "conventional-changelog": "^3.0.6", "debug": "^4.1.0", "eslint": "^5.14.1", "eslint-plugin-graphql": "^3.0.3", @@ -62,6 +60,7 @@ "inquirer": "^6.0.0", "jest": "^23.1.0", "lerna": "^3.13.0", + "lerna-changelog": "^0.8.2", "lint-staged": "^8.1.4", "memfs": "^2.15.2", "minimist": "^1.2.0", diff --git a/scripts/genChangelog.js b/scripts/genChangelog.js index 0fe7820207..9066a0775d 100644 --- a/scripts/genChangelog.js +++ b/scripts/genChangelog.js @@ -1,43 +1,25 @@ const fs = require('fs') const path = require('path') const execa = require('execa') -const cc = require('conventional-changelog') -const config = require('@vue/conventional-changelog') -function genNewRelease (version) { - return new Promise(resolve => { - const newReleaseStream = cc({ - config, - releaseCount: 2, - pkg: { - transform (pkg) { - pkg.version = `v${version}` - return pkg - } - } - }) - - let output = '' - newReleaseStream.on('data', buf => { - output += buf - }) - newReleaseStream.on('end', () => resolve(output)) - }) +async function genNewRelease () { + const { stdout } = await execa(require.resolve('lerna-changelog/bin/cli')) + return stdout } -const gen = (module.exports = async version => { - const newRelease = await genNewRelease(version) +const gen = (module.exports = async () => { + const newRelease = await genNewRelease() const changelogPath = path.resolve(__dirname, '../CHANGELOG.md') - const newChangelog = newRelease + fs.readFileSync(changelogPath, { encoding: 'utf8' }) + const newChangelog = newRelease + '\n\n\n' + fs.readFileSync(changelogPath, { encoding: 'utf8' }) fs.writeFileSync(changelogPath, newChangelog) delete process.env.PREFIX - await execa('git', ['add', '-A'], { stdio: 'inherit' }) - await execa('git', ['commit', '-m', `chore: ${version} changelog [ci skip]`], { stdio: 'inherit' }) }) -if (process.argv[2] === 'run') { - const version = require('../lerna.json').version - gen(version) +if (require.main === module) { + gen().catch(err => { + console.error(err) + process.exit(1) + }) } diff --git a/scripts/markVersions.js b/scripts/markVersions.js new file mode 100644 index 0000000000..bee29c98f3 --- /dev/null +++ b/scripts/markVersions.js @@ -0,0 +1,41 @@ +const fs = require('fs') +const path = require('path') + +const execa = require('execa') +const semver = require('semver') + +// TODO: +// in v4 we don't need version marker's package.json to store all the versions +// so this logic can be removed +async function markVersions () { + const packages = JSON.parse( + (await execa(require.resolve('lerna/cli'), ['list', '--json'])).stdout + ).filter(p => !p.private) + const markerPath = path.resolve(__dirname, '../packages/vue-cli-version-marker/package.json') + const marker = JSON.parse(fs.readFileSync(markerPath)) + + const curVersion = marker.version + const mainVersion = require('../lerna.json').version + + const releaseType = semver.diff(curVersion, mainVersion) || 'patch' + + marker.version = semver.inc(marker.version, releaseType) + marker.devDependencies = packages.reduce((prev, pkg) => { + prev[pkg.name] = pkg.version + return prev + }, {}) + fs.writeFileSync(markerPath, JSON.stringify(marker, null, 2)) + + // publish separately + // must specify registry url: https://github.com/lerna/lerna/issues/896#issuecomment-311894609 + await execa( + 'npm', + ['publish', '--registry', 'https://registry.npmjs.org/'], + { stdio: 'inherit', cwd: path.dirname(markerPath) } + ) +} + +markVersions().catch(err => { + console.error(err) + process.exit(1) +}) diff --git a/scripts/release.js b/scripts/release.js index 2f79d5fe79..0c8b7ebe95 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -33,8 +33,6 @@ Note: eslint-config-* packages should be released separately & manually. process.env.VUE_CLI_RELEASE = true -const fs = require('fs') -const path = require('path') const execa = require('execa') const semver = require('semver') const inquirer = require('inquirer') @@ -106,35 +104,6 @@ const release = async () => { lernaArgs.push('--force-publish') } await execa(require.resolve('lerna/cli'), lernaArgs, { stdio: 'inherit' }) - - await require('./genChangelog')(version) - - const packages = JSON.parse( - (await execa(require.resolve('lerna/cli'), ['list', '--json'])).stdout - ).filter(p => !p.private) - const versionMarkerPath = path.resolve(__dirname, '../packages/vue-cli-version-marker/package.json') - const versionMarkerPkg = JSON.parse(fs.readFileSync(versionMarkerPath)) - - versionMarkerPkg.version = semver.inc(versionMarkerPkg.version, releaseType) - versionMarkerPkg.devDependencies = packages.reduce((prev, pkg) => { - prev[pkg.name] = pkg.version - return prev - }, {}) - fs.writeFileSync(versionMarkerPath, JSON.stringify(versionMarkerPkg, null, 2)) - - const tagName = `vue-cli-version-marker@${versionMarkerPkg.version}` - await execa('git', ['add', '-A'], { stdio: 'inherit' }) - await execa('git', ['commit', '-m', `chore: ${tagName}`], { stdio: 'inherit' }) - - // Must specify registry url: https://github.com/lerna/lerna/issues/896#issuecomment-311894609 - await execa( - 'npm', - ['publish', '--registry', 'https://registry.npmjs.org/'], - { stdio: 'inherit', cwd: path.dirname(versionMarkerPath) } - ) - - await execa('git', ['tag', tagName], { stdio: 'inherit' }) - await execa('git', ['push', '--follow-tags'], { stdio: 'inherit' }) } release().catch(err => { diff --git a/yarn.lock b/yarn.lock index 3e306469b7..b723bae33f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2576,6 +2576,11 @@ any-observable@^0.3.0: resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -4162,6 +4167,17 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-highlight@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-1.2.3.tgz#b200f97ed0e43d24633e89de0f489a48bb87d2bf" + integrity sha512-cmc4Y2kJuEpT2KZd9pgWWskpDMMfJu2roIcY1Ya/aIItufF5FKsV/NtA6vvdhSUllR8KJfvQDNmIcskU+MKLDg== + dependencies: + chalk "^2.3.0" + highlight.js "^9.6.0" + mz "^2.4.0" + parse5 "^3.0.3" + yargs "^10.0.3" + cli-spinners@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" @@ -8264,6 +8280,11 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +highlight.js@^9.6.0: + version "9.15.6" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.15.6.tgz#72d4d8d779ec066af9a17cb14360c3def0aa57c4" + integrity sha512-zozTAWM1D6sozHo8kqhfYgsac+B+q0PmsjXeyDrYIHHcBN0zTVT66+s2GW1GZv7DbyaROdLXKdabwS/WqPyIdQ== + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -10117,6 +10138,21 @@ left-pad@^1.3.0: resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== +lerna-changelog@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/lerna-changelog/-/lerna-changelog-0.8.2.tgz#05dc24add91741a4c198a79f82a1a4ac3fbb4754" + integrity sha512-GrWs8K3DrPpO1sUrcloYp9ioj+PNAX27U6tM0+10fhbNzBB7h4HS+4N5DWKhEQRDoJjZh1QA+wWwTpDNJdJHyA== + dependencies: + chalk "^2.4.1" + cli-highlight "^1.2.3" + execa "^0.10.0" + make-fetch-happen "^4.0.1" + normalize-git-url "^3.0.2" + p-map "^1.2.0" + progress "^2.0.0" + string.prototype.padend "^3.0.0" + yargs "^11.0.0" + lerna@^3.13.0: version "3.13.0" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.13.0.tgz#3a9fe155d763a9814939a631ff958957322f2f31" @@ -11445,6 +11481,15 @@ mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nan@^2.9.2: version "2.12.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" @@ -11735,6 +11780,11 @@ nopt@^4.0.1, nopt@~4.0.1: abbrev "1" osenv "^0.1.4" +normalize-git-url@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" + integrity sha1-jl8Uvgva7bc+ByADEKpBbCc1D8Q= + normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.2.tgz#6b2abd85774e51f7936f1395e45acb905dc849b2" @@ -12456,6 +12506,13 @@ parse5@5.1.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse5@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -15818,6 +15875,20 @@ text-table@^0.2.0, text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= + dependencies: + any-promise "^1.0.0" + thread-loader@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-2.1.2.tgz#f585dd38e852c7f9cded5d092992108148f5eb30" @@ -17579,6 +17650,13 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== + dependencies: + camelcase "^4.1.0" + yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -17604,6 +17682,24 @@ yargs@12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + yargs@^11.0.0: version "11.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"