From b4837472c5ce4022cf4250e989bc288222f2d4c8 Mon Sep 17 00:00:00 2001 From: Chance Strickland Date: Fri, 27 Aug 2021 15:00:09 -0700 Subject: [PATCH] add publish script --- .github/workflows/release.yml | 12 +- scripts/publish.js | 213 ++++++++++++++++------------------ 2 files changed, 104 insertions(+), 121 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 484ff03df2..5755a8f384 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,9 +29,9 @@ jobs: - name: Test run: yarn test - # - name: Publish - # env: - # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - # run: | - # echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc - # node scripts/publish.js + - name: Publish + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc + node scripts/publish.js diff --git a/scripts/publish.js b/scripts/publish.js index bcf06d6e2a..745050021a 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -1,115 +1,98 @@ -// const path = require("path"); -// const jsonfile = require("jsonfile"); -// const semver = require("semver"); -// const execSync = require("child_process").execSync; -// const rootDir = path.resolve(__dirname, ".."); - -// const args = process.argv.slice(2); - -// /** -// * @param {*} cond -// * @param {string} message -// * @returns {asserts cond} -// */ -// function invariant(cond, message) { -// if (!cond) throw new Error(message); -// } - -// /** -// * @returns {string} -// */ -// function getTaggedVersion() { -// let output = execSync("git tag --list --points-at HEAD").toString(); -// return output.replace(/^v|\n+$/g, ""); -// } - -// /** -// * -// * @param {SemverRelease} [semverRelease] -// */ -// function bumpVersion(semverRelease = "patch") { -// // lerna version --no-push --exact -// execSync(`yarn lerna version ${semverRelease} --no-push --exact --yes`); -// } - -// /** -// * @param {string} packageName -// * @param {string|number} version -// */ -// async function ensureBuildVersion(packageName, version) { -// let file = path.join(rootDir, "packages", packageName, "package.json"); -// let json = await jsonfile.readFile(file); -// invariant( -// json.version === version, -// `Package ${packageName} is on version ${json.version}, but should be on ${version}` -// ); -// } - -// /** -// * @param {string} packageName -// * @param {string} tag -// */ -// function publishBuild(packageName, tag) { -// let buildDir = path.join(rootDir, "packages", packageName); -// console.log(); -// console.log(` npm publish ${buildDir} --tag ${tag}`); -// console.log(); -// execSync(`npm publish ${buildDir} --tag ${tag}`, { stdio: "inherit" }); -// } - -// /** -// * @param {SemverRelease|null} [semverRelease] -// * @returns {Promise<1 | 0>} -// */ -// async function run(semverRelease) { -// try { -// // 0. Ensure we are in CI. We don't do this manually -// invariant( -// process.env.CI, -// `You should always run the publish script from the CI environment!` -// ); - -// // 1. Update the release version with a git tag + commit -// bumpVersion(semverRelease); - -// // 2. Get the current tag, which has the release version number -// let version = getTaggedVersion(); -// invariant( -// version !== "", -// "Missing release version. Run the version script first." -// ); - -// // 3. Determine the appropriate npm tag to use -// let tag = semver.prerelease(version) == null ? "latest" : null; - -// console.log(); -// console.log( -// ` Publishing version ${version} to npm` + tag ? ` with tag "${tag}"` : "" -// ); - -// // 3. Ensure build versions match the release version -// await ensureBuildVersion("react-router", version); -// await ensureBuildVersion("react-router-dom", version); -// await ensureBuildVersion("react-router-native", version); - -// // 4. Publish to npm -// publishBuild("react-router", tag); -// publishBuild("react-router-dom", tag); -// publishBuild("react-router-native", tag); -// } catch (error) { -// console.log(); -// console.error(` ${error.message}`); -// console.log(); -// return 1; -// } - -// return 0; -// } - -// run().then(code => { -// process.exit(code); -// }); - -// /** -// * @typedef {'major'|'minor'|'patch'|'premajor'|'preminor'|'prepatch'|'prerelease'} SemverRelease -// */ +const path = require("path"); +const execSync = require("child_process").execSync; +const jsonfile = require("jsonfile"); +const semver = require("semver"); + +const rootDir = path.resolve(__dirname, ".."); + +/** + * @param {*} cond + * @param {string} message + * @returns {asserts cond} + */ +function invariant(cond, message) { + if (!cond) throw new Error(message); +} + +/** + * @returns {string} + */ +function getTaggedVersion() { + let output = execSync("git tag --list --points-at HEAD").toString(); + return output.replace(/^v|\n+$/g, ""); +} + +/** + * @param {string} packageName + * @param {string|number} version + */ +async function ensureBuildVersion(packageName, version) { + let file = path.join(rootDir, "packages", packageName, "package.json"); + let json = await jsonfile.readFile(file); + invariant( + json.version === version, + `Package ${packageName} is on version ${json.version}, but should be on ${version}` + ); +} + +/** + * @param {string} packageName + * @param {string|null} tag + */ +function publishBuild(packageName, tag) { + let buildDir = path.join(rootDir, "packages", packageName); + let command = `npm publish ${buildDir}` + tag ? ` --tag ${tag}` : ""; + console.log(); + console.log(` ${command}`); + console.log(); + execSync(command, { stdio: "inherit" }); +} + +/** + * @returns {Promise<1 | 0>} + */ +async function run() { + try { + // 0. Ensure we are in CI. We don't do this manually + invariant( + process.env.CI, + `You should always run the publish script from the CI environment!` + ); + + // 1. Get the current tag, which has the release version number + let version = getTaggedVersion(); + invariant( + version !== "", + "Missing release version. Run the version script first." + ); + + // 2. Determine the appropriate npm tag to use + let tag = semver.prerelease(version) == null ? "latest" : null; + + console.log(); + console.log( + ` Publishing version ${version} to npm` + tag ? ` with tag "${tag}"` : "" + ); + + // 3. Ensure build versions match the release version + await ensureBuildVersion("react-router", version); + await ensureBuildVersion("react-router-dom", version); + await ensureBuildVersion("react-router-native", version); + + // 4. Publish to npm + publishBuild("react-router", tag); + publishBuild("react-router-dom", tag); + publishBuild("react-router-native", tag); + } catch (error) { + console.log(); + console.error(` ${error.message}`); + console.log(); + return 1; + } + + return 0; +} + +run().then(code => { + process.exit(code); +});