diff --git a/scripts/release.js b/scripts/release.js index 1dcf55ac9..ec5968cb3 100644 --- a/scripts/release.js +++ b/scripts/release.js @@ -1,12 +1,63 @@ process.env.VUE_CLI_RELEASE = true -// const execa = require('execa') -// const semver = require('semver') -// const inquirer = require('inquirer') -// const { syncDeps } = require('./syncDeps') +const execa = require('execa') +const semver = require('semver') +const inquirer = require('inquirer') +const { syncDeps } = require('./syncDeps') -// const curVersion = require('../lerna.json').version +const curVersion = require('../lerna.json').version -// prompt for new version -// run syncDeps(local, version) -// run lerna publish with version +const release = async () => { + console.log(`Current version: ${curVersion}`) + + const bumps = ['patch', 'minor', 'major', 'prerelease'] + const versions = {} + bumps.forEach(b => { versions[b] = semver.inc(curVersion, b) }) + const bumpChoices = bumps.map(b => ({ name: `${b} (${versions[b]})`, value: b })) + + const { bump, customVersion } = await inquirer.prompt([ + { + name: 'bump', + message: 'Select release type:', + type: 'list', + choices: [ + ...bumpChoices, + { name: 'custom', value: 'custom' } + ] + }, + { + name: 'customVersion', + message: 'Input version:', + type: 'input', + when: answers => answers.bump === 'custom' + } + ]) + + const version = customVersion || versions[bump] + + const { yes } = await inquirer.prompt([{ + name: 'yes', + message: `Confirm releasing ${version}?`, + type: 'confirm' + }]) + + if (yes) { + await syncDeps({ + version, + local: true, + skipPrompt: true + }) + } + + const lernaBinPath = require.resolve('lerna/bin/lerna') + await execa(lernaBinPath, [ + 'publish', + '--repo-version', + version + ], { stdio: 'inherit' }) +} + +release().catch(err => { + console.error(err) + process.exit(1) +}) diff --git a/scripts/syncDeps.js b/scripts/syncDeps.js index a0881163f..4758b68eb 100644 --- a/scripts/syncDeps.js +++ b/scripts/syncDeps.js @@ -68,11 +68,12 @@ const flushWrite = () => { } } -async function syncDeps (local, inlineVersion) { +async function syncDeps ({ local, version, skipPrompt }) { // 1. update all package deps const updatedDeps = new Set() if (!local) { + console.log('Syncing remote deps...') const packages = await globby(['packages/@vue/*/package.json']) await Promise.all(packages.filter(filePath => { return filePath.match(/cli-service|cli-plugin|babel-preset|eslint-config/) @@ -105,6 +106,7 @@ async function syncDeps (local, inlineVersion) { })) } + console.log('Syncing local deps...') const updatedRE = new RegExp(`'(${Array.from(updatedDeps).join('|')})': '\\^(\\d+\\.\\d+\\.\\d+[^']*)'`) const paths = await globby(['packages/@vue/**/*.js']) paths @@ -112,19 +114,19 @@ async function syncDeps (local, inlineVersion) { .forEach(filePath => { let isUpdated = false const makeReplacer = versionGetter => (_, pkg, curVersion) => { - const version = versionGetter(pkg) - if (!version) return _ - if (checkUpdate(pkg, filePath, curVersion, version)) { + const targetVersion = versionGetter(pkg) + if (!targetVersion) return _ + if (checkUpdate(pkg, filePath, curVersion, targetVersion)) { isUpdated = true } - return `'${pkg}': '^${version}'` + return `'${pkg}': '^${targetVersion}'` } const localReplacer = makeReplacer( pkg => { try { // inline version takes priority - return inlineVersion || require(`../packages/${pkg}/package.json`).version + return version || require(`../packages/${pkg}/package.json`).version } catch (e) {} } ) @@ -146,6 +148,11 @@ async function syncDeps (local, inlineVersion) { return console.log(`All packages up-to-date.`) } + if (skipPrompt) { + flushWrite() + return + } + const { yes } = await inquirer.prompt([{ name: 'yes', type: 'confirm', @@ -161,7 +168,7 @@ exports.syncDeps = syncDeps if (!process.env.VUE_CLI_RELEASE) { const args = require('minimist')(process.argv.slice(2)) - syncDeps(args.local, args.version).catch(err => { + syncDeps(args).catch(err => { console.log(err) process.exit(1) })