const fs = require('fs')
const childProcess = require('child_process')
const writeFileAndGitAdd = (p, content) => {
fs.writeFileSync(p, content)
if (childProcess.spawnSync('git', ['add', p]).status !== 0) {
throw new Error(`failed to execute git add on ${p}`)
}
}
const version = process.argv[2]
if (!version) {
throw new Error('version not given in argv')
}
if (!/[0-9]+\.[0-9]+\.[0-9]+/.test(version)) {
throw new Error('version illegal')
}
console.info('Run cargo check')
if (
childProcess.spawnSync('cargo', ['check'], {
env: { RUSTFLAGS: '-D warnings', ...process.env },
stdio: 'inherit',
}).status !== 0
) {
throw new Error('failed to check rust modules (are there rust warnings or errors?)')
}
console.info('Run cargo fmt --check')
if (
childProcess.spawnSync('cargo', ['fmt', '--check'], {
stdio: 'inherit',
}).status !== 0
) {
throw new Error('failed to check formatting of rust modules')
}
;[
'flexui',
'@openflexui/frontend',
'@openflexui/typescript',
'@openflexui/webpack-plugin',
'flexui-shadow-sync',
].forEach((p) => {
console.info(`Run eslint on ${p}`)
if (
childProcess.spawnSync('npx', ['eslint', '-c', '../.eslintrc.js', '.'], {
cwd: p,
stdio: 'inherit',
}).status !== 0
) {
throw new Error('failed to lint modules (are there eslint warnings or errors?)')
}
})
const gitStatusRes = childProcess.spawnSync('git', ['diff', '--name-only'], { encoding: 'utf8' })
if (gitStatusRes.status !== 0 || gitStatusRes.stdout.length > 0) {
throw new Error('failed to check git status (are there uncommitted changes?)')
}
;[
'flexui/package.json',
'packages/flexui-ascf/package.json',
'toolkit/flexui-typescript/package.json',
'toolkit/flexui-webpack-plugin/package.json',
'flexui-shadow-sync/package.json',
'flexui-template-compiler/package.json',
'flexui-stylesheet-compiler/package.json',
].forEach((p) => {
let content = fs.readFileSync(p, { encoding: 'utf8' })
let oldVersion
const refVersions = []
content = content.replace(/"version": "(.+)"/, (_, v) => {
oldVersion = v
return `"version": "${version}"`
})
if (!oldVersion) {
throw new Error(`version segment not found in ${p}`)
}
console.info(`Update ${p} version from "${oldVersion}" to "${version}"`)
refVersions.forEach(({ mod, v }) => {
console.info(` + dependency ${mod} version from "${v}" to "${version}"`)
})
writeFileAndGitAdd(p, content)
})
;['flexui-template-compiler/Cargo.toml', 'flexui-stylesheet-compiler/Cargo.toml'].forEach(
(p) => {
let content = fs.readFileSync(p, { encoding: 'utf8' })
let oldVersion
content = content.replace(/\nversion = "(.+)"/, (_, v) => {
oldVersion = v
return `\nversion = "${version}"`
})
if (!oldVersion) {
throw new Error(`version segment not found in ${p}`)
}
console.info(`Update ${p} version from "${oldVersion}" to "${version}"`)
writeFileAndGitAdd(p, content)
},
)
console.info('Run pnpm install')
if (childProcess.spawnSync('pnpm', ['install'], { stdio: 'inherit' }).status !== 0) {
throw new Error('failed to pnpm install')
}
console.info('Run cbindgen')
const cbindgenRes = childProcess.spawnSync('cbindgen', [], { cwd: 'flexui-template-compiler' })
if (cbindgenRes.status !== 0) {
throw new Error('failed to execute cbindgen for the template compiler')
}
writeFileAndGitAdd(
'flexui-template-compiler/flexui_template_compiler.h',
cbindgenRes.stdout,
)
console.info('Run build')
if (
childProcess.spawnSync('npm', ['run', 'build'], {
env: { FLEXUI_ARGS: '', ...process.env },
stdio: 'inherit',
}).status !== 0
) {
throw new Error('failed to execute npm build')
}
console.info('Run cargo test')
if (childProcess.spawnSync('cargo', ['test'], { stdio: 'inherit' }).status !== 0) {
throw new Error('failed to cargo test')
}
console.info('Run pnpm test')
if (childProcess.spawnSync('pnpm', ['test', '-r'], { stdio: 'inherit' }).status !== 0) {
throw new Error('failed to pnpm test')
}
;['Cargo.lock', 'pnpm-lock.yaml'].forEach((p) => {
if (childProcess.spawnSync('git', ['add', p]).status !== 0) {
throw new Error(`failed to execute git add on ${p}`)
}
})
if (
childProcess.spawnSync('git', ['commit', '--message', `version: ${version}`], {
stdio: 'inherit',
}).status !== 0
) {
throw new Error('failed to execute git commit')
}
;['flexui-template-compiler', 'flexui-stylesheet-compiler'].forEach((p) => {
console.info(`Publish ${p} to crates.io`)
if (childProcess.spawnSync('cargo', ['publish', '-p', p], { stdio: 'inherit' }).status !== 0) {
throw new Error('failed to publish Cargo crates')
}
})
;[
'flexui',
'@openflexui/frontend',
'@openflexui/typescript',
'@openflexui/webpack-plugin',
'flexui-shadow-sync',
'flexui-template-compiler',
'flexui-stylesheet-compiler',
].forEach((p) => {
console.info(`Publish ${p} to npmjs`)
if (
childProcess.spawnSync('pnpm', ['publish', '--registry', 'https://registry.npmjs.org'], {
cwd: p,
stdio: 'inherit',
}).status !== 0
) {
throw new Error('failed to publish NPM modules')
}
})
console.info('Push to git origin')
if (childProcess.spawnSync('git', ['tag', `v${version}`]).status !== 0) {
throw new Error('failed to execute git tag')
}
if (childProcess.spawnSync('git', ['push'], { stdio: 'inherit' }).status !== 0) {
throw new Error('failed to execute git push')
}
if (childProcess.spawnSync('git', ['push', '--tags'], { stdio: 'inherit' }).status !== 0) {
throw new Error('failed to execute git push --tags')
}
console.info('All done!')