From 01a1f0c6695585dc3a23994111da6df933b7f522 Mon Sep 17 00:00:00 2001 From: Ahmed Yasin Koculu Date: Wed, 7 Oct 2026 23:52:17 +0200 Subject: [PATCH 1/2] Add version flag. --- .../guides/getting-started/purestack-cli.mdx | 2 ++ packages/purestack/src/cli.ts | 18 ++++++++++++++++-- packages/ts-ssg/src/cli-runner.ts | 7 ++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/frontend/purestack.studio/guides/getting-started/purestack-cli.mdx b/frontend/purestack.studio/guides/getting-started/purestack-cli.mdx index 7903413b..82c03226 100644 --- a/frontend/purestack.studio/guides/getting-started/purestack-cli.mdx +++ b/frontend/purestack.studio/guides/getting-started/purestack-cli.mdx @@ -102,6 +102,8 @@ Every build command requires `--content `. The path is resolved from the wo Use `yarn purestack --help` or `yarn purestack help` to print the CLI's own usage summary. Options can be written as `--content ./content` or `--content=./content`. +Use `yarn purestack --version` or `yarn purestack -v` to print the installed PureStack version. + ### `build`: generate static files ```sh diff --git a/packages/purestack/src/cli.ts b/packages/purestack/src/cli.ts index 68b17d0a..46ca161f 100644 --- a/packages/purestack/src/cli.ts +++ b/packages/purestack/src/cli.ts @@ -1,7 +1,21 @@ #!/usr/bin/env node -import { runCli } from '@purestack/ts-ssg' +import { readFileSync } from 'node:fs' -runCli(process.argv.slice(2)).catch((error) => { +async function main() { + const args = process.argv.slice(2) + if (args[0] === '--version' || args[0] === '-v') { + const { version } = JSON.parse( + readFileSync(new URL('../package.json', import.meta.url), 'utf8'), + ) + console.log(version) + return + } + + const { runCli } = await import('@purestack/ts-ssg') + await runCli(args) +} + +main().catch((error) => { console.error(error) process.exitCode = 1 }) diff --git a/packages/ts-ssg/src/cli-runner.ts b/packages/ts-ssg/src/cli-runner.ts index e7df4e94..c2292f64 100644 --- a/packages/ts-ssg/src/cli-runner.ts +++ b/packages/ts-ssg/src/cli-runner.ts @@ -206,6 +206,7 @@ class CliUsageError extends Error { } const USAGE = `Usage: + purestack --version purestack build --content [--clean] purestack serve --content [--host ] [--port ] [--clean] [--no-watch] [--no-reload] [--full-render] purestack publish --content @@ -213,4 +214,8 @@ const USAGE = `Usage: Commands: build Build a content directory into its configured outDir. serve Start the dev server; --full-render builds all pages once at startup. - publish Clean and build a publish artifact using the configured publishDir.` + publish Clean and build a publish artifact using the configured publishDir. + +Options: + --help, -h Print this usage summary. + --version, -v Print the installed PureStack version.` From 19a9751e52bebcf9cd97fc4c85cd058277bf8378 Mon Sep 17 00:00:00 2001 From: Ahmed Yasin Koculu Date: Thu, 8 Oct 2026 00:01:27 +0200 Subject: [PATCH 2/2] Bump version. --- package.json | 2 +- packages/purestack/package.json | 2 +- packages/purestack/src/index.ts | 2 +- packages/ts-common/package.json | 2 +- packages/ts-components/package.json | 2 +- packages/ts-css/package.json | 2 +- packages/ts-html/package.json | 2 +- packages/ts-minidom/package.json | 2 +- packages/ts-page-scripts/package.json | 2 +- packages/ts-render/package.json | 2 +- packages/ts-ssg-vscode/package.json | 2 +- packages/ts-ssg/package.json | 2 +- packages/ts-ssg/src/config/head.ts | 2 +- packages/ts-style/package.json | 2 +- packages/ts-svg-icons/package.json | 2 +- packages/ts-util-node/package.json | 2 +- packages/ts-util/package.json | 2 +- scripts/bump-version.ts | 18 +++++------------- scripts/version.ts | 23 +++++++++++++++++++++++ 19 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 scripts/version.ts diff --git a/package.json b/package.json index 8dfa00e2..a70e58c3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "purestack-repo", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.18.1", "type": "module", "sideEffects": false, diff --git a/packages/purestack/package.json b/packages/purestack/package.json index c0199c7c..dc57a4a2 100644 --- a/packages/purestack/package.json +++ b/packages/purestack/package.json @@ -1,6 +1,6 @@ { "name": "purestack", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/purestack.mjs", "types": "./dist/purestack.d.mts", diff --git a/packages/purestack/src/index.ts b/packages/purestack/src/index.ts index 036549be..7325cd5b 100644 --- a/packages/purestack/src/index.ts +++ b/packages/purestack/src/index.ts @@ -1,3 +1,3 @@ -export const version: string = '1.1.6' +export const version: string = '1.1.7' export * from '@purestack/ts-ssg' diff --git a/packages/ts-common/package.json b/packages/ts-common/package.json index 00c35b7f..131ce641 100644 --- a/packages/ts-common/package.json +++ b/packages/ts-common/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-common", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-common.mjs", "types": "./dist/ts-common.d.mts", diff --git a/packages/ts-components/package.json b/packages/ts-components/package.json index e40188bd..bf09d6ba 100644 --- a/packages/ts-components/package.json +++ b/packages/ts-components/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-components", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-components.mjs", "types": "./dist/ts-components.d.mts", diff --git a/packages/ts-css/package.json b/packages/ts-css/package.json index 3f84371d..66afc97b 100644 --- a/packages/ts-css/package.json +++ b/packages/ts-css/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-css", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-css.mjs", "types": "./dist/ts-css.d.mts", diff --git a/packages/ts-html/package.json b/packages/ts-html/package.json index c022306a..0668f6d5 100644 --- a/packages/ts-html/package.json +++ b/packages/ts-html/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-html", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-html.mjs", "types": "./dist/ts-html.d.mts", diff --git a/packages/ts-minidom/package.json b/packages/ts-minidom/package.json index ec800c77..3f77678e 100644 --- a/packages/ts-minidom/package.json +++ b/packages/ts-minidom/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-minidom", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-minidom.mjs", "types": "./dist/ts-minidom.d.mts", diff --git a/packages/ts-page-scripts/package.json b/packages/ts-page-scripts/package.json index e606dc90..62e3359f 100644 --- a/packages/ts-page-scripts/package.json +++ b/packages/ts-page-scripts/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-page-scripts", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-page-scripts.mjs", "types": "./dist/ts-page-scripts.d.mts", diff --git a/packages/ts-render/package.json b/packages/ts-render/package.json index 0d399734..26136727 100644 --- a/packages/ts-render/package.json +++ b/packages/ts-render/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-render", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-render.mjs", "types": "./dist/ts-render.d.mts", diff --git a/packages/ts-ssg-vscode/package.json b/packages/ts-ssg-vscode/package.json index afa0a356..a8470808 100644 --- a/packages/ts-ssg-vscode/package.json +++ b/packages/ts-ssg-vscode/package.json @@ -2,7 +2,7 @@ "name": "purestack-component-navigation", "displayName": "PureStack Component Tools", "description": "Component navigation, prop IntelliSense, lit-html syntax highlighting, and template formatting for Markdown, Regor MDX, and TypeScript templates.", - "version": "1.1.6", + "version": "1.1.7", "private": true, "publisher": "purestack", "license": "MIT", diff --git a/packages/ts-ssg/package.json b/packages/ts-ssg/package.json index 5b235fb4..a006595c 100644 --- a/packages/ts-ssg/package.json +++ b/packages/ts-ssg/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-ssg", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-ssg.mjs", "types": "./dist/ts-ssg.d.mts", diff --git a/packages/ts-ssg/src/config/head.ts b/packages/ts-ssg/src/config/head.ts index 69ee3e0c..74fed785 100644 --- a/packages/ts-ssg/src/config/head.ts +++ b/packages/ts-ssg/src/config/head.ts @@ -25,7 +25,7 @@ export function getHead(config?: BasicHeadConfig) { const head = createHead(getHeadConfig(merge(DEFAULTS, config))).push( h('meta').attr({ name: 'generator', - content: 'PureStack v1.1.6', + content: 'PureStack v1.1.7', }), h('meta').attr({ name: 'color-scheme', diff --git a/packages/ts-style/package.json b/packages/ts-style/package.json index 6e32f21a..d20f1cf5 100644 --- a/packages/ts-style/package.json +++ b/packages/ts-style/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-style", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-style.mjs", "types": "./dist/ts-style.d.mts", diff --git a/packages/ts-svg-icons/package.json b/packages/ts-svg-icons/package.json index 2c1ec9ba..fc4dcebf 100644 --- a/packages/ts-svg-icons/package.json +++ b/packages/ts-svg-icons/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-svg-icons", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-svg-icons.mjs", "types": "./dist/ts-svg-icons.d.mts", diff --git a/packages/ts-util-node/package.json b/packages/ts-util-node/package.json index 30fb13ea..d9db3527 100644 --- a/packages/ts-util-node/package.json +++ b/packages/ts-util-node/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-util-node", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-util-node.mjs", "types": "./dist/ts-util-node.d.mts", diff --git a/packages/ts-util/package.json b/packages/ts-util/package.json index 6af85aa3..e02dc717 100644 --- a/packages/ts-util/package.json +++ b/packages/ts-util/package.json @@ -1,6 +1,6 @@ { "name": "@purestack/ts-util", - "version": "1.1.6", + "version": "1.1.7", "packageManager": "yarn@4.9.2", "module": "./dist/ts-util.mjs", "types": "./dist/ts-util.d.mts", diff --git a/scripts/bump-version.ts b/scripts/bump-version.ts index c2b5da88..80391128 100644 --- a/scripts/bump-version.ts +++ b/scripts/bump-version.ts @@ -1,30 +1,22 @@ import { globSync, readFileSync, writeFileSync } from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' +import { bumpVersion, versionPattern } from './version' const projectRoot = path.resolve( path.dirname(fileURLToPath(import.meta.url)), '..', ) -if (process.argv.length > 2) { - throw new Error('Usage: yarn bump-version (no arguments)') +if (process.argv.length > 3) { + throw new Error('Usage: yarn bump-version [delta] (default: 1)') } -const versionPattern = /^(0|[1-9]\d*)\.([0-9])\.([0-9])$/ +const delta = process.argv[2] ?? '1' const rootManifest = JSON.parse( readFileSync(path.join(projectRoot, 'package.json'), 'utf8'), ) as { version: string } const currentVersion = rootManifest.version -const current = versionPattern.exec(currentVersion) -if (!current) - throw new Error( - `Expected a root version with single-digit minor and patch numbers, received ${currentVersion}.`, - ) - -// Treat minor and patch as decimal digits, carrying into the next component. -const [major, minor, patch] = current.slice(1).map(BigInt) -const incremented = major * 100n + minor * 10n + patch + 1n -const nextVersion = `${incremented / 100n}.${(incremented / 10n) % 10n}.${incremented % 10n}` +const nextVersion = bumpVersion(currentVersion, delta) type Update = { relativePath: string; source: string } const updates: Update[] = [] diff --git a/scripts/version.ts b/scripts/version.ts new file mode 100644 index 00000000..070b410f --- /dev/null +++ b/scripts/version.ts @@ -0,0 +1,23 @@ +export const versionPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d?)$/ + +export function bumpVersion(version: string, delta = '1') { + const increment = Number(delta) + if (!/^\+?[1-9]\d*$/.test(delta) || !Number.isSafeInteger(increment)) { + throw new Error(`Expected a positive integer delta, received ${delta}.`) + } + + const current = versionPattern.exec(version) + if (!current) { + throw new Error( + `Expected a major.minor.patch version with patch 0–99, received ${version}.`, + ) + } + + const [, major, minor, patch] = current + const totalPatch = Number(patch) + increment + const nextMinor = Number(minor) + Math.floor(totalPatch / 100) + if (!Number.isSafeInteger(totalPatch) || !Number.isSafeInteger(nextMinor)) { + throw new Error('The resulting version exceeds the safe integer range.') + } + return `${major}.${nextMinor}.${totalPatch % 100}` +}