Streamlined yarn deploy

This commit is contained in:
Aria Minaei 2021-08-05 23:15:00 +02:00
parent a34a02b599
commit a7f464d3f2

View file

@ -1,5 +1,5 @@
import path from 'path' import path from 'path'
import {writeFileSync} from 'fs' import {readFileSync, writeFileSync} from 'fs'
import {keyBy} from 'lodash-es' import {keyBy} from 'lodash-es'
/** /**
@ -23,6 +23,19 @@ const packagesToPublish = [
'@theatre/plugin-r3f', '@theatre/plugin-r3f',
] ]
/**
* All these packages will have the same version from monorepo/package.json
*/
const packagesWhoseVersionsShouldBump = [
'.',
'theatre',
'theatre/core',
'theatre/studio',
'packages/dataverse',
'packages/dataverse-react',
'packages/plugin-r3f',
]
;(async function () { ;(async function () {
// our packages will check for this env variable to make sure their // our packages will check for this env variable to make sure their
// prepublish script is only called from the `$ cd /path/to/monorepo; yarn run deploy` // prepublish script is only called from the `$ cd /path/to/monorepo; yarn run deploy`
@ -31,16 +44,28 @@ const packagesToPublish = [
$.verbose = false $.verbose = false
const gitTags = (await $`git tag --list`).toString().split('\n') const gitTags = (await $`git tag --list`).toString().split('\n')
// const version = argv._[argv._.length - 1] const version = argv._[argv._.length - 1]
// if (typeof version !== 'string') { if (typeof version !== 'string') {
// console.error( console.error(
// `You need to specify a version, like: $ yarn deploy 1.2.0-rc.4`, `You need to specify a version, like: $ yarn deploy 1.2.0-rc.4`,
// ) )
// process.exit(1) process.exit(1)
// } else if (!version.match(/^[0-9]+\.[0-9]+\.[0-9]+(\-(dev|rc)\.[0-9])?$/)) { } else if (!version.match(/^[0-9]+\.[0-9]+\.[0-9]+(\-(dev|rc)\.[0-9])?$/)) {
// console.error(`Use a semver version, like 1.2.3-rc.4. Provided: ${version}`) console.error(`Use a semver version, like 1.2.3-rc.4. Provided: ${version}`)
// process.exit(1) process.exit(1)
// } }
const previousVersion = require('../package.json').version
if (version === previousVersion) {
console.error(`Version ${version} is already assigned to root/package.json`)
process.exit(1)
}
if (gitTags.some((tag) => tag === version)) {
console.error(`There is already a git tag for version ${version}`)
process.exit(1)
}
const allPackages = keyBy( const allPackages = keyBy(
(await $`yarn workspaces list --json`) (await $`yarn workspaces list --json`)
@ -70,7 +95,8 @@ const packagesToPublish = [
console.log('Skipping typecheck and lint') console.log('Skipping typecheck and lint')
} }
const [didOverwriteVersions, monorepoVersion] = syncVersionNumbers(version) console.log('Assigning versions')
assignVersions(version)
console.log('Building all packages') console.log('Building all packages')
await Promise.all( await Promise.all(
@ -79,25 +105,37 @@ const packagesToPublish = [
), ),
) )
// temporarily rolling back the version assignments to make sure they don't show
// up in `$ git status`. (would've been better to just ignore hese particular changes
// but i'm lazy)
await restoreVersions()
console.log( console.log(
'Checking if the build produced artifacts that must first be comitted to git', 'Checking if the build produced artifacts that must first be comitted to git',
) )
$.verbose = false $.verbose = false
if ((await $`git status -s`).toString().length > 0) { if ((await $`git status -s`).toString().length > 0) {
console.error(`Git directory contains uncommitted changes.`)
$.verbose = true $.verbose = true
await $`git status -s` await $`git status -s`
console.error(`Git directory contains uncommitted changes.`)
process.exit(1) process.exit(1)
} }
$.verbose = true $.verbose = true
if (!gitTags.some((tag) => tag === monorepoVersion)) { assignVersions(version)
console.log( console.log('Committing/tagging')
`No git tag found for version "${monorepoVersion}". Run \`$ git tag ${monorepoVersion}\` and try again.`,
) await $`git add .`
process.exit() await $`git commit -m "${version}"`
} await $`git tag ${version}`
// if (!gitTags.some((tag) => tag === version)) {
// console.log(
// `No git tag found for version "${version}". Run \`$ git tag ${version}\` and try again.`,
// )
// process.exit()
// }
console.log('Publishing to npm') console.log('Publishing to npm')
await Promise.all( await Promise.all(
@ -107,26 +145,8 @@ const packagesToPublish = [
) )
})() })()
function syncVersionNumbers() { function assignVersions(monorepoVersion) {
/** for (const packagePathRelativeFromRoot of packagesWhoseVersionsShouldBump) {
* All these packages will have the same version from monorepo/package.json
*/
const workspaces = [
'theatre',
'theatre/core',
'theatre/studio',
'packages/dataverse',
'packages/dataverse-react',
'packages/plugin-r3f',
]
const monorepoVersion = require('../package.json').version
console.log(`Syncing packages versions to ${monorepoVersion}`)
let didOverwrite = false
for (const packagePathRelativeFromRoot of workspaces) {
const pathToPackage = path.resolve( const pathToPackage = path.resolve(
__dirname, __dirname,
'../', '../',
@ -134,19 +154,26 @@ function syncVersionNumbers() {
'./package.json', './package.json',
) )
const original = require(pathToPackage) const original = JSON.parse(
readFileSync(pathToPackage, {encoding: 'utf-8'}),
)
if (original.version !== monorepoVersion) { const newJson = {...original, version: monorepoVersion}
didOverwrite = true
console.log(`Setting version of ${original.name} to ${monorepoVersion}`)
const newJson = {...original}
newJson.version = monorepoVersion
writeFileSync( writeFileSync(
path.join(pathToPackage), path.join(pathToPackage),
JSON.stringify(newJson, undefined, 2), JSON.stringify(newJson, undefined, 2),
{encoding: 'utf-8'},
) )
} }
} }
return [didOverwrite, monorepoVersion]
async function restoreVersions() {
const wasVerbose = $.verbose
$.verbose = false
for (const packagePathRelativeFromRoot of packagesWhoseVersionsShouldBump) {
const pathToPackageInGit = packagePathRelativeFromRoot + '/package.json'
await $`git checkout ${pathToPackageInGit}`
}
$.verbose = wasVerbose
} }