From: Evan You Date: Wed, 11 Dec 2019 02:29:52 +0000 (-0500) Subject: build: release script X-Git-Tag: v3.0.0-alpha.0~75 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8ed04ed5036a07567d7e5b5eb52b2f7b5807b03b;p=thirdparty%2Fvuejs%2Fcore.git build: release script --- diff --git a/package.json b/package.json index 67512ed2ae..96d9ba8445 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "workspaces": [ "packages/*" ], @@ -52,6 +52,7 @@ "rollup": "^1.19.4", "rollup-plugin-terser": "^5.1.1", "rollup-plugin-typescript2": "^0.24.0", + "semver": "^6.3.0", "ts-jest": "^24.0.2", "tsd": "^0.11.0", "typescript": "^3.7.0", diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index 3705931d51..b03163f444 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index f5b3496795..74a55610e5 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", @@ -13,7 +13,11 @@ "sideEffects": false, "buildOptions": { "name": "VueDOMCompiler", - "formats": ["cjs", "global", "esm-browser"] + "formats": [ + "cjs", + "global", + "esm-browser" + ] }, "repository": { "type": "git", @@ -29,6 +33,6 @@ }, "homepage": "https://github.com/vuejs/vue/tree/dev/packages/compiler-dom#readme", "dependencies": { - "@vue/compiler-core": "3.0.0-alpha.1" + "@vue/compiler-core": "3.0.0-alpha.0" } } diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json index eefd019227..a427dd2eb5 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-sfc", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "description": "@vue/compiler-sfc", "main": "dist/compiler-sfc.cjs.js", "files": [ @@ -27,7 +27,7 @@ }, "homepage": "https://github.com/vuejs/vue/tree/dev/packages/compiler-sfc#readme", "dependencies": { - "@vue/compiler-core": "3.0.0-alpha.1", + "@vue/compiler-core": "3.0.0-alpha.0", "consolidate": "^0.15.1", "hash-sum": "^2.0.0", "lru-cache": "^5.1.1", diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json index c50c7b11df..02eca7259e 100644 --- a/packages/reactivity/package.json +++ b/packages/reactivity/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "description": "@vue/reactivity", "main": "index.js", "module": "dist/reactivity.esm-bundler.js", @@ -17,7 +17,12 @@ }, "buildOptions": { "name": "VueObserver", - "formats": ["esm", "cjs", "global", "esm-browser"] + "formats": [ + "esm", + "cjs", + "global", + "esm-browser" + ] }, "keywords": [ "vue" diff --git a/packages/runtime-core/package.json b/packages/runtime-core/package.json index c9f481c700..6c6677ebe7 100644 --- a/packages/runtime-core/package.json +++ b/packages/runtime-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-core", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "description": "@vue/runtime-core", "main": "index.js", "module": "dist/runtime-core.esm-bundler.js", @@ -24,6 +24,6 @@ }, "homepage": "https://github.com/vuejs/vue/tree/dev/packages/runtime-core#readme", "dependencies": { - "@vue/reactivity": "3.0.0-alpha.1" + "@vue/reactivity": "3.0.0-alpha.0" } } diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index 948f2d5507..7c04028904 100644 --- a/packages/runtime-dom/package.json +++ b/packages/runtime-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-dom", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "description": "@vue/runtime-dom", "main": "index.js", "module": "dist/runtime-dom.esm-bundler.js", @@ -13,8 +13,15 @@ "sideEffects": false, "buildOptions": { "name": "VueDOMRuntime", - "formats": ["esm", "cjs", "global", "esm-browser"], - "dts": ["jsx.d.ts"] + "formats": [ + "esm", + "cjs", + "global", + "esm-browser" + ], + "dts": [ + "jsx.d.ts" + ] }, "repository": { "type": "git", @@ -30,6 +37,6 @@ }, "homepage": "https://github.com/vuejs/vue/tree/dev/packages/runtime-dom#readme", "dependencies": { - "@vue/runtime-core": "3.0.0-alpha.1" + "@vue/runtime-core": "3.0.0-alpha.0" } } diff --git a/packages/runtime-test/package.json b/packages/runtime-test/package.json index 68c9859488..7deb989401 100644 --- a/packages/runtime-test/package.json +++ b/packages/runtime-test/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-test", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "description": "@vue/runtime-test", "main": "index.js", "module": "dist/runtime-test.esm-bundler.js", @@ -15,7 +15,11 @@ }, "buildOptions": { "name": "VueTestRuntime", - "formats": ["esm", "cjs", "global"] + "formats": [ + "esm", + "cjs", + "global" + ] }, "keywords": [ "vue" @@ -27,6 +31,6 @@ }, "homepage": "https://github.com/vuejs/vue/tree/dev/packages/runtime-test#readme", "dependencies": { - "@vue/runtime-core": "3.0.0-alpha.1" + "@vue/runtime-core": "3.0.0-alpha.0" } } diff --git a/packages/server-renderer/package.json b/packages/server-renderer/package.json index 8f98faa0e2..5b1d50da27 100644 --- a/packages/server-renderer/package.json +++ b/packages/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "description": "@vue/server-renderer", "main": "index.js", "files": [ @@ -9,7 +9,9 @@ ], "types": "dist/server-renderer.d.ts", "buildOptions": { - "formats": ["cjs"] + "formats": [ + "cjs" + ] }, "repository": { "type": "git", diff --git a/packages/shared/package.json b/packages/shared/package.json index 536b91728d..3edec3579e 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,5 +1,5 @@ { "name": "@vue/shared", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "private": true } diff --git a/packages/size-check/package.json b/packages/size-check/package.json index 8fa5f6f6f0..1d1628d57f 100644 --- a/packages/size-check/package.json +++ b/packages/size-check/package.json @@ -1,9 +1,11 @@ { "name": "@vue/size-check", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "private": true, "buildOptions": { "name": "Vue", - "formats": ["global"] + "formats": [ + "global" + ] } } diff --git a/packages/template-explorer/package.json b/packages/template-explorer/package.json index 560f5625b8..11793e9703 100644 --- a/packages/template-explorer/package.json +++ b/packages/template-explorer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/template-explorer", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "private": true, "buildOptions": { "formats": [ diff --git a/packages/vue/package.json b/packages/vue/package.json index 9b6eac6d68..4929abbaec 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "vue", - "version": "3.0.0-alpha.1", + "version": "3.0.0-alpha.0", "description": "vue", "main": "index.js", "module": "dist/vue.esm-bundler.js", @@ -12,7 +12,12 @@ "unpkg": "dist/vue.global.js", "buildOptions": { "name": "Vue", - "formats": ["esm", "cjs", "global", "esm-browser"] + "formats": [ + "esm", + "cjs", + "global", + "esm-browser" + ] }, "repository": { "type": "git", @@ -28,7 +33,7 @@ }, "homepage": "https://github.com/vuejs/vue/tree/dev/packages/vue#readme", "dependencies": { - "@vue/compiler-dom": "3.0.0-alpha.1", - "@vue/runtime-dom": "3.0.0-alpha.1" + "@vue/compiler-dom": "3.0.0-alpha.0", + "@vue/runtime-dom": "3.0.0-alpha.0" } } diff --git a/scripts/release.js b/scripts/release.js new file mode 100644 index 0000000000..14ddb901b7 --- /dev/null +++ b/scripts/release.js @@ -0,0 +1,152 @@ +const args = require('minimist')(process.argv.slice(2)) +const fs = require('fs') +const path = require('path') +const semver = require('semver') +const currentVersion = require('../package.json').version +const { prompt } = require('enquirer') +const execa = require('execa') + +const preId = args.preid || semver.prerelease(currentVersion)[0] || 'alpha' +const isDryRun = args.dry +const skipTests = args.skipTests +const skipBuild = args.skipBuild +const packages = fs + .readdirSync(path.resolve(__dirname, '../packages')) + .filter(p => !p.endsWith('.ts') && !p.startsWith('.')) + +const versionIncrements = [ + 'patch', + 'minor', + 'major', + 'prepatch', + 'preminor', + 'premajor', + 'prerelease' +] + +const inc = i => semver.inc(currentVersion, i, preId) +const bin = name => path.resolve(__dirname, '../node_modules/.bin/' + name) +const run = (bin, args, opts = {}) => + execa(bin, args, { stdio: 'inherit', ...opts }) +const getPkgRoot = pkg => path.resolve(__dirname, '../packages/' + pkg) + +async function main() { + let targetVersion = args._[0] + + if (!targetVersion) { + // no explicit version, offer suggestions + const { release } = await prompt({ + type: 'select', + name: 'release', + message: 'Select release type', + choices: versionIncrements.map(i => `${i} (${inc(i)})`).concat(['custom']) + }) + + if (release === 'custom') { + targetVersion = (await prompt({ + type: 'input', + name: 'version', + message: 'Input custom version', + initial: currentVersion + })).version + } else { + targetVersion = release.match(/\((.*)\)/)[1] + } + } + + if (!semver.valid(targetVersion)) { + throw new Error(`invalid target version: ${targetVersion}`) + } + + const { yes } = await prompt({ + type: 'confirm', + name: 'yes', + message: `Releasing v${targetVersion}. Confirm?` + }) + + if (!yes) { + return + } + + // run tests before release + if (!skipTests) { + await run(bin('jest'), ['--clearCache']) + await run('yarn', ['test']) + } + + // update all package versions and inter-dependencies + updateVersions(targetVersion) + + // build all packages with types + if (!skipBuild) { + await run('yarn', ['build', '-t']) + // test generated dts files + await run(bin('tsd')) + } + + // all good... + if (isDryRun) { + // stop here so we can inspect changes to be committed + // and packages built + console.log('Dry run finished.') + } else { + // commit all changes + console.log('Committing changes...') + await run('git', ['add', '-A']) + await run('git', ['commit', '-m', `release: v${targetVersion}`]) + + // publish packages + const releaseTag = semver.prerelease(targetVersion)[0] || 'latest' + for (const pkg of packagesToPublish) { + await publish(pkg, releaseTag) + } + + // push to GitHub + await run('git', ['tag', `v${targetVersion}`]) + await run('git', ['push', 'origin', `refs/tags/v${targetVersion}`]) + await run('git', ['push']) + } +} + +function updateVersions(version) { + console.log('Updating versions...') + // 1. update root package.json + updatePackage(path.resolve(__dirname, '..'), version) + // 2. update all packages + packages.forEach(p => updatePackage(getPkgRoot(p), version)) +} + +function updatePackage(pkgRoot, version) { + const pkg = readPkg(pkgRoot) + pkg.version = version + if (pkg.dependencies) { + Object.keys(pkg.dependencies).forEach(dep => { + if ( + dep.startsWith('@vue') && + packages.includes(dep.replace(/^@vue\//, '')) + ) { + pkg.dependencies[dep] = version + } + }) + } + fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n') +} + +function readPkg(pkgRoot) { + const pkgPath = path.resolve(pkgRoot, 'package.json') + return JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) +} + +async function publish(pkgName, releaseTag) { + const pkgRoot = getPkgRoot(pkgName) + const pkg = readPkg(pkgRoot) + if (!pkg.private) { + await run('npm', ['publish', '--tag', releaseTag], { + cwd: pkgRoot + }) + } +} + +main().catch(err => { + console.error(err) +}) diff --git a/scripts/verifyCommit.js b/scripts/verifyCommit.js index 23abc11d59..d57497dea4 100644 --- a/scripts/verifyCommit.js +++ b/scripts/verifyCommit.js @@ -6,7 +6,7 @@ const msg = require('fs') .readFileSync(msgPath, 'utf-8') .trim() -const commitRE = /^(revert: )?(feat|fix|docs|dx|style|refactor|perf|test|workflow|build|ci|chore|types|wip)(\(.+\))?: .{1,50}/ +const commitRE = /^(revert: )?(feat|fix|docs|dx|style|refactor|perf|test|workflow|build|ci|chore|types|wip|release)(\(.+\))?: .{1,50}/ if (!commitRE.test(msg)) { console.log() diff --git a/yarn.lock b/yarn.lock index e7ac7c18ab..34b63168d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4819,7 +4819,7 @@ semver-diff@^2.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==