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/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/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/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/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.`
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}`
+}