Skip to content

Commit 0a8be74

Browse files
fix(cli): require Node.js >=20 and surface a clear error on older runtimes (#438)
Older Node (e.g. 16) lacks events.addAbortListener, used transitively by the CLI, which produced a cryptic SyntaxError at module instantiation. Declare engines.node: ">=20" on both packages so installers warn, and add an early runtime check in the bin so users get an actionable message before any modules load. Closes #433 https://claude.ai/code/session_01N5k5sqBgxYX9XMatM6TGcE Co-authored-by: Claude <noreply@anthropic.com>
1 parent ff84201 commit 0a8be74

4 files changed

Lines changed: 34 additions & 5 deletions

File tree

.changeset/cli-require-node-20.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@tanstack/cli': patch
3+
'@tanstack/create': patch
4+
---
5+
6+
fix(cli): require Node.js >=20 and surface a clear error on older runtimes
7+
8+
Older Node versions (e.g. Node 16) lack `events.addAbortListener`, which is
9+
used transitively by the CLI. Running on those versions produced a cryptic
10+
`SyntaxError: ... does not provide an export named 'addAbortListener'` during
11+
module instantiation. Both packages now declare `engines.node: ">=20"` so
12+
package managers warn at install time, and the CLI bin performs an early
13+
runtime check that prints an actionable message before any modules load.
14+
15+
Closes #433

packages/cli/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
4747
"author": "Jack Herrington <jherr@pobox.com>",
4848
"license": "MIT",
4949
"packageManager": "pnpm@9.15.5",
50+
"engines": {
51+
"node": ">=20"
52+
},
5053
"dependencies": {
5154
"@clack/prompts": "^0.10.0",
5255
"@tanstack/create": "workspace:*",

packages/cli/src/bin.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
#!/usr/bin/env node
2-
import { cli } from './cli.js'
3-
import {
4-
createReactFrameworkDefinition,
5-
createSolidFrameworkDefinition,
6-
} from '@tanstack/create'
2+
const nodeMajor = Number(process.versions.node.split('.')[0])
3+
if (nodeMajor < 20) {
4+
process.stderr.write(
5+
`TanStack CLI requires Node.js 20 or higher.\n` +
6+
`You are using Node.js ${process.versions.node}.\n` +
7+
`Please upgrade Node.js: https://nodejs.org/en/download\n`,
8+
)
9+
process.exit(1)
10+
}
11+
12+
const { cli } = await import('./cli.js')
13+
const { createReactFrameworkDefinition, createSolidFrameworkDefinition } =
14+
await import('@tanstack/create')
715

816
cli({
917
name: 'tanstack',

packages/create/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
"author": "Jack Herrington <jherr@pobox.com>",
3232
"license": "MIT",
3333
"packageManager": "pnpm@9.15.5",
34+
"engines": {
35+
"node": ">=20"
36+
},
3437
"dependencies": {
3538
"ejs": "^3.1.10",
3639
"execa": "^9.5.2",

0 commit comments

Comments
 (0)