From 8bc624a867657c88613db6c6e91b8a8452d83b6a Mon Sep 17 00:00:00 2001 From: willbot Date: Fri, 9 Oct 2026 11:20:46 +0200 Subject: [PATCH 1/6] chore: declare one Node.js range on every Prisma 8 package Every Prisma 8 package now declares engines.node "^22.18.0 || ^24.11.0 || >=26.0.0", the range create-prisma and its generated projects already use. The published @prisma/orm-* packages declared no engines field; the unpublished packages and examples declared ">=24". scripts/validate-node-engines.mjs holds the range and runs in pnpm lint:manifests. It fails when a publishable package has no engines.node, or when any package under packages/ declares a different range. ADR 269 records the decision and amends ADR 222. The README, Supported Versions page and the scaffold READMEs that prisma orm init writes state the range in prose. Signed-off-by: willbot Signed-off-by: Will Madden --- README.md | 2 +- docs/Supported Versions.md | 4 +- docs/architecture docs/ADR-INDEX.md | 1 + .../adrs/ADR 222 - Version support policy.md | 8 +- ...e Node.js range for every Prisma 8 tool.md | 47 +++++++ examples/bundle-size/package.json | 2 +- examples/mongo-blog-leaderboard/package.json | 2 +- examples/mongo-demo/package.json | 2 +- .../multi-extension-monorepo/package.json | 2 +- examples/paradedb-demo/package.json | 2 +- .../prisma-8-cloudflare-worker/package.json | 2 +- examples/prisma-8-demo-sqlite/package.json | 2 +- examples/prisma-8-demo/package.json | 2 +- examples/prisma-8-postgis-demo/package.json | 2 +- examples/prisma7-adoption/package.json | 2 +- examples/react-router-demo/package.json | 2 +- examples/retail-store/package.json | 2 +- examples/supabase/package.json | 2 +- package.json | 4 +- packages/0-config/tsdown/README.md | 2 +- .../extension-author-tools/package.json | 2 +- .../0-shared/publish-surface/package.json | 2 +- .../0-foundation/contract/package.json | 2 +- .../0-foundation/utils/package.json | 2 +- .../1-framework/1-core/config/package.json | 2 +- .../1-framework/1-core/errors/package.json | 2 +- .../1-core/framework-components/package.json | 2 +- .../1-core/operations/package.json | 2 +- .../1-framework/1-core/ts-render/package.json | 2 +- .../2-authoring/contract/package.json | 2 +- .../1-framework/2-authoring/ids/package.json | 2 +- .../2-authoring/psl-parser/package.json | 2 +- .../2-authoring/psl-printer/package.json | 2 +- .../3-tooling/cli-telemetry/package.json | 2 +- .../1-framework/3-tooling/cli/package.json | 2 +- .../commands/init/templates/readme-mongo.md | 2 +- .../init/templates/readme-postgres.md | 2 +- .../init/__snapshots__/templates.test.ts.snap | 4 +- .../3-tooling/config-loader/package.json | 2 +- .../3-tooling/emitter/package.json | 2 +- .../3-tooling/language-server/package.json | 2 +- .../3-tooling/migration/package.json | 2 +- .../vite-plugin-contract-emit/package.json | 2 +- .../1-foundation/mongo-codec/package.json | 2 +- .../1-foundation/mongo-contract/package.json | 2 +- .../1-foundation/mongo-value/package.json | 2 +- .../2-authoring/contract-prisma6/package.json | 2 +- .../2-authoring/contract-psl/package.json | 2 +- .../2-authoring/contract-ts/package.json | 2 +- .../3-tooling/emitter/package.json | 2 +- .../3-tooling/mongo-schema-ir/package.json | 2 +- .../4-query/query-ast/package.json | 2 +- .../5-query-builders/orm/package.json | 2 +- .../query-builder/package.json | 2 +- .../6-transport/mongo-lowering/package.json | 2 +- .../6-transport/mongo-wire/package.json | 2 +- .../2-mongo-family/7-runtime/package.json | 2 +- packages/2-mongo-family/9-family/package.json | 2 +- packages/2-sql/1-core/contract/package.json | 2 +- packages/2-sql/1-core/errors/package.json | 2 +- packages/2-sql/1-core/operations/package.json | 2 +- packages/2-sql/1-core/schema-ir/package.json | 2 +- .../2-authoring/contract-prisma7/package.json | 2 +- .../2-authoring/contract-psl/package.json | 2 +- .../2-authoring/contract-ts/package.json | 2 +- packages/2-sql/3-tooling/emitter/package.json | 2 +- .../4-lanes/relational-core/package.json | 2 +- .../2-sql/4-lanes/sql-builder/package.json | 2 +- packages/2-sql/5-runtime/package.json | 2 +- packages/2-sql/9-family/package.json | 2 +- .../3-extensions/arktype-json/package.json | 2 +- .../middleware-cache/package.json | 2 +- packages/3-extensions/mongo/package.json | 2 +- packages/3-extensions/paradedb/package.json | 2 +- packages/3-extensions/pgvector/package.json | 2 +- packages/3-extensions/postgis/package.json | 2 +- packages/3-extensions/postgres/package.json | 2 +- .../3-extensions/sql-orm-client/package.json | 2 +- packages/3-extensions/sqlite/package.json | 2 +- packages/3-extensions/supabase/package.json | 2 +- .../1-mongo-target/package.json | 2 +- .../2-mongo-adapter/package.json | 2 +- .../3-mongo-driver/package.json | 2 +- .../3-targets/3-targets/postgres/package.json | 2 +- .../3-targets/3-targets/sqlite/package.json | 2 +- .../postgres-codec-testkit/package.json | 2 +- .../6-adapters/postgres/package.json | 2 +- .../sqlite-codec-testkit/package.json | 2 +- .../3-targets/6-adapters/sqlite/package.json | 2 +- .../3-targets/7-drivers/postgres/package.json | 2 +- .../3-targets/7-drivers/sqlite/package.json | 2 +- .../orm-extension-arktype-json/package.json | 3 + .../package.json | 3 + .../orm-extension-paradedb/package.json | 3 + .../orm-extension-pgvector/package.json | 3 + .../orm-extension-postgis/package.json | 3 + .../orm-extension-supabase/package.json | 3 + .../@prisma/orm-family-mongo/package.json | 3 + .../@prisma/orm-family-sql/package.json | 3 + .../@prisma/orm-framework/package.json | 3 + .../9-public/@prisma/orm-mongo/package.json | 3 + .../@prisma/orm-postgres/package.json | 3 + .../9-public/@prisma/orm-sqlite/package.json | 3 + .../@prisma/orm-target-mongo/package.json | 3 + .../@prisma/orm-target-postgres/package.json | 3 + .../@prisma/orm-target-sqlite/package.json | 3 + .../@prisma/orm-toolchain/package.json | 3 + scripts/validate-node-engines.mjs | 127 ++++++++++++++++++ scripts/validate-node-engines.test.mjs | 95 +++++++++++++ 109 files changed, 413 insertions(+), 95 deletions(-) create mode 100644 docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md create mode 100644 scripts/validate-node-engines.mjs create mode 100644 scripts/validate-node-engines.test.mjs diff --git a/README.md b/README.md index f43385836d2d..48b727f72f7f 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ ## Prerequisites -- Node.js 24 or newer +- Node.js 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer, with the npm that ships with your Node.js release (npm 10 on Node.js 22) - A package manager (`npm`, `pnpm`, or `yarn`) ## Getting started diff --git a/docs/Supported Versions.md b/docs/Supported Versions.md index 434e1ff5dbf4..87f62c6a42e5 100644 --- a/docs/Supported Versions.md +++ b/docs/Supported Versions.md @@ -8,11 +8,11 @@ See [ADR 222](./architecture%20docs/adrs/ADR%20222%20-%20Version%20support%20pol | Runtime | Minimum version | |---|---| -| Node.js | 24 | +| Node.js | 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer | | Bun | 1.2 | | Deno | 2.0 | -Node.js is the primary supported runtime. Bun and Deno are supported on a best-effort basis; if you encounter a Bun- or Deno-specific issue, please file an issue and include your runtime version. +Use the npm that ships with your Node.js release (npm 10 on Node.js 22). Every published package declares this range as `engines.node`: `^22.18.0 || ^24.11.0 || >=26.0.0`. [ADR 269](./architecture%20docs/adrs/ADR%20269%20-%20One%20Node.js%20range%20for%20every%20Prisma%208%20tool.md) records why. Node.js is the primary supported runtime. Bun and Deno are supported on a best-effort basis; if you encounter a Bun- or Deno-specific issue, please file an issue and include your runtime version. ## Database servers diff --git a/docs/architecture docs/ADR-INDEX.md b/docs/architecture docs/ADR-INDEX.md index 24e7a2151b6d..1560aeea3c75 100644 --- a/docs/architecture docs/ADR-INDEX.md +++ b/docs/architecture docs/ADR-INDEX.md @@ -170,6 +170,7 @@ This document provides a comprehensive index of all Architectural Decision Recor | 216 | CLI telemetry installation ID is a stored random UUID, not a system fingerprint | Adopts a stored v4 UUID under the user's config dir as the MAU dedup key; rejects MAC-hash, machine-id, IORegistry UUID, and Windows MachineGuid alternatives on trust, regulatory, and reset-symmetry grounds | [ADR 216 - CLI telemetry installation ID is a stored random UUID not a system fingerprint.md](adrs/ADR%20216%20-%20CLI%20telemetry%20installation%20ID%20is%20a%20stored%20random%20UUID%20not%20a%20system%20fingerprint.md) | | 217 | CLI telemetry runs in a detached subprocess spawned at command start | Forks the telemetry sender via `child_process.fork()` at command start (not exit); parent disconnects and unrefs immediately; child owns all I/O and swallows all errors; satisfies the strict isolation contract by construction rather than diligence | [ADR 217 - CLI telemetry runs in a detached subprocess spawned at command start.md](adrs/ADR%20217%20-%20CLI%20telemetry%20runs%20in%20a%20detached%20subprocess%20spawned%20at%20command%20start.md) | | 242 | Public npm surface: single `@prisma` scope with consolidated publish packages | The public surface is 17 `@prisma/*` packages — database facades, extension packs, framework/toolchain, families, targets — plus the `prisma` bin shim, all under `packages/9-public/`; every other workspace package is private and reaches npm only as a subpath entrypoint of a published shell (one module, one package, preserving registry/`instanceof` identity); framework runtime and tooling publish separately for serverless bundle weight; rejects a second `@prisma-orm` scope | [ADR 242 - Public npm surface - single @prisma scope with consolidated publish packages.md](adrs/ADR%20242%20-%20Public%20npm%20surface%20-%20single%20%40prisma%20scope%20with%20consolidated%20publish%20packages.md) | +| 269 | One Node.js range for every Prisma 8 tool | Amends ADR 222: every Prisma 8 package declares `engines.node` `^22.18.0 \|\| ^24.11.0 \|\| >=26.0.0` (Node.js 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer), the same range as the `prisma` CLI, Composer and `create-prisma`; `NODE_ENGINES_RANGE` in `scripts/validate-node-engines.mjs` is the source of truth and `pnpm lint:manifests` checks it | [ADR 269 - One Node.js range for every Prisma 8 tool.md](adrs/ADR%20269%20-%20One%20Node.js%20range%20for%20every%20Prisma%208%20tool.md) | ## No-Emit Workflow diff --git a/docs/architecture docs/adrs/ADR 222 - Version support policy.md b/docs/architecture docs/adrs/ADR 222 - Version support policy.md index cb741be22504..22829477fd8b 100644 --- a/docs/architecture docs/adrs/ADR 222 - Version support policy.md +++ b/docs/architecture docs/adrs/ADR 222 - Version support policy.md @@ -1,6 +1,6 @@ # ADR 222 — Version support policy for Prisma Next -**Status:** Accepted — PostgreSQL floor amended by [ADR 248](ADR%20248%20-%20PostgreSQL%20floor%20lowered%20to%2015.md) +**Status:** Accepted — PostgreSQL floor amended by [ADR 248](ADR%20248%20-%20PostgreSQL%20floor%20lowered%20to%2015.md); Node.js range amended by [ADR 269](ADR%20269%20-%20One%20Node.js%20range%20for%20every%20Prisma%208%20tool.md) **Date:** 2026-05-31 **Linear:** TML-1810, TML-1809 @@ -14,7 +14,7 @@ The ratified floor table: | Dimension | Floor | Enforcement | |---|---|---| -| Node.js | `>=24` | `engines.node` on every publishable package | +| Node.js | `^22.18.0 \|\| ^24.11.0 \|\| >=26.0.0` (changed from `>=24` by [ADR 269](ADR%20269%20-%20One%20Node.js%20range%20for%20every%20Prisma%208%20tool.md)) | `engines.node` on every publishable package + source-of-truth constant + drift check | | TypeScript | `>=5.9` | optional `peerDependencies.typescript` on every publishable package + source-of-truth constant + drift test | | PostgreSQL (server) | `15` (lowered from `17` by [ADR 248](ADR%20248%20-%20PostgreSQL%20floor%20lowered%20to%2015.md)) | `prismaNext.minServerVersion` on `@internal/target-postgres` + CLI mirror + `postgres:15` CI service containers + `docker-compose.yaml` | | MongoDB (server) | `8.0` | `prismaNext.minServerVersion` on `@internal/target-mongo` + CLI mirror; MMS 11.x downloads 8.2.x by default | @@ -38,7 +38,7 @@ The guiding insight: **lowering a floor is backwards-compatible; raising one is ## Why these specific floors -**Node.js 24**: This is the current Active LTS line. Node 22 reached LTS in October 2024; Node 24 is the successor, released April 2025. `tsdown` infers the JS output target from `engines.node`, so the declaration is load-bearing, not advisory: packages with `>=20` would produce wider-compat output than the codebase actually requires or tests. +**Node.js 24**: [ADR 269](ADR%20269%20-%20One%20Node.js%20range%20for%20every%20Prisma%208%20tool.md) replaced this floor with the range `^22.18.0 || ^24.11.0 || >=26.0.0`, shared by every Prisma 8 tool. The original reasoning follows. This is the current Active LTS line. Node 22 reached LTS in October 2024; Node 24 is the successor, released April 2025. `tsdown` infers the JS output target from `engines.node`, so the declaration is load-bearing, not advisory: packages with `>=20` would produce wider-compat output than the codebase actually requires or tests. **TypeScript 5.9**: The latest GA release at the time this policy was ratified, and the version pinned in the workspace catalog. TypeScript peer declarations are optional because TypeScript is a dev-time tool — plain-JS consumers must not be forced to install it. The optional peer allows type-checking consumers to get type information without requiring it universally. @@ -54,7 +54,7 @@ The guiding insight: **lowering a floor is backwards-compatible; raising one is ### Node.js engines -Every publishable package declares `"engines": { "node": ">=24" }`. This is enforced structurally: `tsdown` uses the `engines.node` field to set its output target, so a package that omits or understates this will produce different (and potentially unintended) JavaScript output. +Every publishable package declares `"engines": { "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }` ([ADR 269](ADR%20269%20-%20One%20Node.js%20range%20for%20every%20Prisma%208%20tool.md)). The source of truth is `NODE_ENGINES_RANGE` in `scripts/validate-node-engines.mjs`, and `pnpm lint:manifests` checks every package against it. This is enforced structurally: `tsdown` uses the `engines.node` field to set its output target, so a package that omits or understates this will produce different (and potentially unintended) JavaScript output. ### TypeScript peer diff --git a/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md new file mode 100644 index 000000000000..ff41ce66f846 --- /dev/null +++ b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md @@ -0,0 +1,47 @@ +# ADR 269 — One Node.js range for every Prisma 8 tool + +**Status:** Accepted +**Date:** 2026-10-09 +**Amends:** [ADR 222 — Version support policy](ADR%20222%20-%20Version%20support%20policy.md) + +--- + +## Decision + +Every Prisma 8 package declares this `engines.node` range: + +```json +"engines": { "node": "^22.18.0 || ^24.11.0 || >=26.0.0" } +``` + +In prose: Node.js 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer, each with the npm that ships with that Node.js release (npm 10 on Node.js 22). + +The same range applies to every Prisma 8 tool: the `@prisma/orm-*` packages in this repository, the `prisma` CLI, Composer, `create-prisma`, and the projects `create-prisma` generates. A user who meets the requirement of one tool meets the requirement of all of them. + +## Why one range + +A user meets the Prisma 8 tools one after another: `create-prisma` scaffolds a project, the project installs `@prisma/orm-postgres`, and the user runs the `prisma` CLI. When each tool states a different Node.js requirement, the user finds out which one is strictest only when an install warns or a command fails. One range removes that. + +## Why these versions + +- **22.18** is the first Node.js 22 release that runs `.ts` files without a flag. Users run `node migration.ts` to emit a migration, so a Node.js version that cannot run `.ts` files cannot use Prisma 8 migrations. +- **24.11** is the first Long Term Support release of Node.js 24. +- **26 or newer** covers current and future releases. + +## Enforcement + +- `NODE_ENGINES_RANGE` in `scripts/validate-node-engines.mjs` is the source of truth. `pnpm lint:manifests` fails when a publishable package lacks `engines.node`, or when any package under `packages/` declares a different range. +- `tsdown` derives each package's build target from `engines.node`, so every package builds for `node22.18.0`, the lowest version in the range. +- The scaffold READMEs that `prisma orm init` writes, the repository README, and [Supported Versions](../../Supported%20Versions.md) state the range in prose. + +The repository's own development toolchain is separate: the root `package.json` and `.tool-versions` choose the Node.js version contributors and CI use, and this ADR does not change them. + +## Consequences + +- Node.js 22.18 and newer 22.x releases become supported. CI runs the test suites on the Node.js version in `.tool-versions` (a 24.x release); it does not yet run them on Node.js 22 or 26. +- Output built for `node22.18.0` can use only syntax and built-in APIs that Node.js 22.18 provides. + +## Alternatives considered + +- **Keep `>=24`.** This excludes users on Node.js 22, which is still a supported Long Term Support line, and it differs from the range `create-prisma` already declares. +- **A range per tool.** Each tool could state only what it needs. Users would then have to meet the strictest requirement across several tools without being told which one it is. diff --git a/examples/bundle-size/package.json b/examples/bundle-size/package.json index d83430c4a13c..3cafc0332a09 100644 --- a/examples/bundle-size/package.json +++ b/examples/bundle-size/package.json @@ -4,7 +4,7 @@ "type": "module", "version": "8.0.0-rc.17", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "start:pg": "tsx src/postgres/main.ts", diff --git a/examples/mongo-blog-leaderboard/package.json b/examples/mongo-blog-leaderboard/package.json index a3e8d76ca264..de41d78b818b 100644 --- a/examples/mongo-blog-leaderboard/package.json +++ b/examples/mongo-blog-leaderboard/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "emit": "prisma contract emit", diff --git a/examples/mongo-demo/package.json b/examples/mongo-demo/package.json index 74b35a0c2995..11b127d0aaed 100644 --- a/examples/mongo-demo/package.json +++ b/examples/mongo-demo/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "emit": "prisma contract emit", diff --git a/examples/multi-extension-monorepo/package.json b/examples/multi-extension-monorepo/package.json index aeb30b915267..d4a696260e05 100644 --- a/examples/multi-extension-monorepo/package.json +++ b/examples/multi-extension-monorepo/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "description": "Worked example: monorepo with two internal contract-space packages and an aggregating app. Exercises the framework's per-space planner/runner/verifier with multiple extensions in one application.", "scripts": { diff --git a/examples/paradedb-demo/package.json b/examples/paradedb-demo/package.json index 0dd3667ea672..ea922e7e3639 100644 --- a/examples/paradedb-demo/package.json +++ b/examples/paradedb-demo/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "emit": "prisma contract emit", diff --git a/examples/prisma-8-cloudflare-worker/package.json b/examples/prisma-8-cloudflare-worker/package.json index 2c3b6f1b4fe3..d8f35ef1cd9b 100644 --- a/examples/prisma-8-cloudflare-worker/package.json +++ b/examples/prisma-8-cloudflare-worker/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "emit": "prisma contract emit", diff --git a/examples/prisma-8-demo-sqlite/package.json b/examples/prisma-8-demo-sqlite/package.json index 93b5ac27eb81..04012894822d 100644 --- a/examples/prisma-8-demo-sqlite/package.json +++ b/examples/prisma-8-demo-sqlite/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "emit": "prisma contract emit", diff --git a/examples/prisma-8-demo/package.json b/examples/prisma-8-demo/package.json index 0968aa9fba98..e8b9b1801d94 100644 --- a/examples/prisma-8-demo/package.json +++ b/examples/prisma-8-demo/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "dev": "vite", diff --git a/examples/prisma-8-postgis-demo/package.json b/examples/prisma-8-postgis-demo/package.json index 30cbe5f6b527..d0f2e88bc6ec 100644 --- a/examples/prisma-8-postgis-demo/package.json +++ b/examples/prisma-8-postgis-demo/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "emit": "prisma contract emit", diff --git a/examples/prisma7-adoption/package.json b/examples/prisma7-adoption/package.json index eb2f40325aad..cef91a630b4f 100644 --- a/examples/prisma7-adoption/package.json +++ b/examples/prisma7-adoption/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "db:start": "tsx scripts/db-start.ts", diff --git a/examples/react-router-demo/package.json b/examples/react-router-demo/package.json index eecc9e6272b2..2710dfae2b89 100644 --- a/examples/react-router-demo/package.json +++ b/examples/react-router-demo/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "dev": "react-router dev", diff --git a/examples/retail-store/package.json b/examples/retail-store/package.json index 016894920907..d73f958c15b7 100644 --- a/examples/retail-store/package.json +++ b/examples/retail-store/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "emit": "prisma contract emit", diff --git a/examples/supabase/package.json b/examples/supabase/package.json index 918ca8243413..fd94d150acd0 100644 --- a/examples/supabase/package.json +++ b/examples/supabase/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "emit": "prisma contract emit", diff --git a/package.json b/package.json index f94a9aa1e0d9..bb5cdb7cddb5 100644 --- a/package.json +++ b/package.json @@ -45,9 +45,9 @@ "rules:sync": "node scripts/sync-agent-rules.mjs", "rules:footprint": "node scripts/rules-footprint.mjs", "lint:docs": "node scripts/validate-package-readmes.mjs", - "lint:manifests": "node scripts/validate-package-manifests.mjs && node scripts/validate-typescript-peer.mjs", + "lint:manifests": "node scripts/validate-package-manifests.mjs && node scripts/validate-typescript-peer.mjs && node scripts/validate-node-engines.mjs", "lint:workflows": "node scripts/lint-workflow-triggers.mjs", - "test:scripts": "node --test scripts/coverage-config.test.mjs scripts/coverage-report.test.mjs scripts/lint-workflow-triggers.test.mjs scripts/upgrade-coverage-workflows.test.mjs scripts/validate-skills.test.mjs scripts/determine-version-utils.test.ts scripts/check-upgrade-coverage.test.mjs scripts/check-release-notes.test.mjs scripts/set-version-utils.test.ts scripts/check-publish-deps.test.mjs scripts/check-conformance.test.mjs scripts/check-publish-deps-pn-pins.test.mjs scripts/check-publish-deps-declarations.test.mjs scripts/validate-package-manifests.test.mjs scripts/validate-package-readmes.test.mjs scripts/publish-packages-utils.test.mjs scripts/check-clean-tree.test.mjs scripts/lint-casts.test.mjs scripts/lint-throws.test.mjs scripts/list-error-codes.test.mjs scripts/lint-framework-vocabulary.test.mjs scripts/lint-single-import-root.test.mjs scripts/lint-legacy-name.test.mjs scripts/lint-vitest-timeouts.test.mjs scripts/lint-consumer-internal-imports.test.mjs scripts/sync-agent-rules.test.mjs scripts/validate-typescript-peer.test.mjs scripts/run-logged.test.mjs scripts/migrate-migrations-layout.test.mjs scripts/codemods/add-model-map.test.mjs scripts/codemods/rewrite-sql-strings.test.mjs skills-contrib/review-fetch-phase/scripts/guard-review-artifacts-ignored.test.mjs skills-contrib/review-fetch-phase/scripts/render-review-state.test.mjs skills-contrib/review-triage-phase/scripts/render-review-actions.test.mjs", + "test:scripts": "node --test scripts/coverage-config.test.mjs scripts/coverage-report.test.mjs scripts/lint-workflow-triggers.test.mjs scripts/upgrade-coverage-workflows.test.mjs scripts/validate-skills.test.mjs scripts/determine-version-utils.test.ts scripts/check-upgrade-coverage.test.mjs scripts/check-release-notes.test.mjs scripts/set-version-utils.test.ts scripts/check-publish-deps.test.mjs scripts/check-conformance.test.mjs scripts/check-publish-deps-pn-pins.test.mjs scripts/check-publish-deps-declarations.test.mjs scripts/validate-package-manifests.test.mjs scripts/validate-package-readmes.test.mjs scripts/publish-packages-utils.test.mjs scripts/check-clean-tree.test.mjs scripts/lint-casts.test.mjs scripts/lint-throws.test.mjs scripts/list-error-codes.test.mjs scripts/lint-framework-vocabulary.test.mjs scripts/lint-single-import-root.test.mjs scripts/lint-legacy-name.test.mjs scripts/lint-vitest-timeouts.test.mjs scripts/lint-consumer-internal-imports.test.mjs scripts/sync-agent-rules.test.mjs scripts/validate-typescript-peer.test.mjs scripts/validate-node-engines.test.mjs scripts/run-logged.test.mjs scripts/migrate-migrations-layout.test.mjs scripts/codemods/add-model-map.test.mjs scripts/codemods/rewrite-sql-strings.test.mjs skills-contrib/review-fetch-phase/scripts/guard-review-artifacts-ignored.test.mjs skills-contrib/review-fetch-phase/scripts/render-review-state.test.mjs skills-contrib/review-triage-phase/scripts/render-review-actions.test.mjs", "bump-version": "node scripts/bump-version.ts", "check:publish-deps": "node scripts/check-publish-deps.mjs", "check:conformance": "node scripts/check-conformance.mjs", diff --git a/packages/0-config/tsdown/README.md b/packages/0-config/tsdown/README.md index f74d67d1562c..076c80a2283d 100644 --- a/packages/0-config/tsdown/README.md +++ b/packages/0-config/tsdown/README.md @@ -12,7 +12,7 @@ Your package needs to have: 1. `tsconfig.prod.json` - a TypeScript configuration file specific for bundling. -2. `package.json#engines.node` - `tsdown` infers the bundling target based on this value. e.g. `{ "engines": { "node": ">=24" } }` +2. `package.json#engines.node` - `tsdown` infers the bundling target based on this value. e.g. `{ "engines": { "node": "^22.18.0 || ^24.11.0 || >=26.0.0" } }` 3. `"tsdown": "catalog:"` in your packages `devDependencies`. diff --git a/packages/0-shared/extension-author-tools/package.json b/packages/0-shared/extension-author-tools/package.json index a58452feda1c..b2b240640140 100644 --- a/packages/0-shared/extension-author-tools/package.json +++ b/packages/0-shared/extension-author-tools/package.json @@ -20,7 +20,7 @@ "bin" ], "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/0-shared/publish-surface/package.json b/packages/0-shared/publish-surface/package.json index d64a442d62df..3c89c1b905a0 100644 --- a/packages/0-shared/publish-surface/package.json +++ b/packages/0-shared/publish-surface/package.json @@ -39,7 +39,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/0-foundation/contract/package.json b/packages/1-framework/0-foundation/contract/package.json index b7f42b678bba..911f072c3704 100644 --- a/packages/1-framework/0-foundation/contract/package.json +++ b/packages/1-framework/0-foundation/contract/package.json @@ -54,7 +54,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/0-foundation/utils/package.json b/packages/1-framework/0-foundation/utils/package.json index a2f5b1bebde2..d04cddf1a35c 100644 --- a/packages/1-framework/0-foundation/utils/package.json +++ b/packages/1-framework/0-foundation/utils/package.json @@ -53,7 +53,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/1-core/config/package.json b/packages/1-framework/1-core/config/package.json index eb61e9043d50..12233c2144b1 100644 --- a/packages/1-framework/1-core/config/package.json +++ b/packages/1-framework/1-core/config/package.json @@ -47,7 +47,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/1-core/errors/package.json b/packages/1-framework/1-core/errors/package.json index 3d86892b5f23..d713f029c727 100644 --- a/packages/1-framework/1-core/errors/package.json +++ b/packages/1-framework/1-core/errors/package.json @@ -45,7 +45,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/1-core/framework-components/package.json b/packages/1-framework/1-core/framework-components/package.json index 69979afa2a4c..3bf1913a4a9b 100644 --- a/packages/1-framework/1-core/framework-components/package.json +++ b/packages/1-framework/1-core/framework-components/package.json @@ -54,7 +54,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/1-core/operations/package.json b/packages/1-framework/1-core/operations/package.json index 4c3cde7c69f0..4a1ba5952613 100644 --- a/packages/1-framework/1-core/operations/package.json +++ b/packages/1-framework/1-core/operations/package.json @@ -44,7 +44,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/1-core/ts-render/package.json b/packages/1-framework/1-core/ts-render/package.json index 2a54912b57c9..ec34ea05f5d0 100644 --- a/packages/1-framework/1-core/ts-render/package.json +++ b/packages/1-framework/1-core/ts-render/package.json @@ -43,7 +43,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/2-authoring/contract/package.json b/packages/1-framework/2-authoring/contract/package.json index 5d7406495244..7dc46eb6c937 100644 --- a/packages/1-framework/2-authoring/contract/package.json +++ b/packages/1-framework/2-authoring/contract/package.json @@ -45,7 +45,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/2-authoring/ids/package.json b/packages/1-framework/2-authoring/ids/package.json index b190152e2121..ab94292ec227 100644 --- a/packages/1-framework/2-authoring/ids/package.json +++ b/packages/1-framework/2-authoring/ids/package.json @@ -47,7 +47,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/2-authoring/psl-parser/package.json b/packages/1-framework/2-authoring/psl-parser/package.json index d4950bed7af7..e09f8b4c3215 100644 --- a/packages/1-framework/2-authoring/psl-parser/package.json +++ b/packages/1-framework/2-authoring/psl-parser/package.json @@ -51,7 +51,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/2-authoring/psl-printer/package.json b/packages/1-framework/2-authoring/psl-printer/package.json index 17672d9c4c05..5331c96c7759 100644 --- a/packages/1-framework/2-authoring/psl-printer/package.json +++ b/packages/1-framework/2-authoring/psl-printer/package.json @@ -52,7 +52,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/3-tooling/cli-telemetry/package.json b/packages/1-framework/3-tooling/cli-telemetry/package.json index be5506c077bd..753e2c43b0ba 100644 --- a/packages/1-framework/3-tooling/cli-telemetry/package.json +++ b/packages/1-framework/3-tooling/cli-telemetry/package.json @@ -56,7 +56,7 @@ } }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/3-tooling/cli/package.json b/packages/1-framework/3-tooling/cli/package.json index b8c24b5fe98f..67b40fb3f01f 100644 --- a/packages/1-framework/3-tooling/cli/package.json +++ b/packages/1-framework/3-tooling/cli/package.json @@ -101,7 +101,7 @@ } }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/3-tooling/cli/src/commands/init/templates/readme-mongo.md b/packages/1-framework/3-tooling/cli/src/commands/init/templates/readme-mongo.md index c61e9b71bcd4..7a3c417ab6ce 100644 --- a/packages/1-framework/3-tooling/cli/src/commands/init/templates/readme-mongo.md +++ b/packages/1-framework/3-tooling/cli/src/commands/init/templates/readme-mongo.md @@ -32,4 +32,4 @@ Prisma ORM setup is scaffolded in: For provider-specific Prisma ORM reference docs, see `prisma-8.md`. Prisma ORM skills live in the upstream `skills/` directory: https://github.com/prisma/prisma/tree/main/skills. -Node-based Prisma ORM projects expect Node.js 24 LTS or newer. +Node-based Prisma ORM projects expect Node.js 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer. diff --git a/packages/1-framework/3-tooling/cli/src/commands/init/templates/readme-postgres.md b/packages/1-framework/3-tooling/cli/src/commands/init/templates/readme-postgres.md index b1f84e0dd671..274a4a49123c 100644 --- a/packages/1-framework/3-tooling/cli/src/commands/init/templates/readme-postgres.md +++ b/packages/1-framework/3-tooling/cli/src/commands/init/templates/readme-postgres.md @@ -31,4 +31,4 @@ Prisma ORM setup is scaffolded in: For provider-specific Prisma ORM reference docs, see `prisma-8.md`. Prisma ORM skills live in the upstream `skills/` directory: https://github.com/prisma/prisma/tree/main/skills. -Node-based Prisma ORM projects expect Node.js 24 LTS or newer. +Node-based Prisma ORM projects expect Node.js 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer. diff --git a/packages/1-framework/3-tooling/cli/test/commands/init/__snapshots__/templates.test.ts.snap b/packages/1-framework/3-tooling/cli/test/commands/init/__snapshots__/templates.test.ts.snap index ced56d48b462..2efee9b231ae 100644 --- a/packages/1-framework/3-tooling/cli/test/commands/init/__snapshots__/templates.test.ts.snap +++ b/packages/1-framework/3-tooling/cli/test/commands/init/__snapshots__/templates.test.ts.snap @@ -35,7 +35,7 @@ Prisma ORM setup is scaffolded in: For provider-specific Prisma ORM reference docs, see \`prisma-8.md\`. Prisma ORM skills live in the upstream \`skills/\` directory: https://github.com/prisma/prisma/tree/main/skills. -Node-based Prisma ORM projects expect Node.js 24 LTS or newer. +Node-based Prisma ORM projects expect Node.js 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer. " `; @@ -73,7 +73,7 @@ Prisma ORM setup is scaffolded in: For provider-specific Prisma ORM reference docs, see \`prisma-8.md\`. Prisma ORM skills live in the upstream \`skills/\` directory: https://github.com/prisma/prisma/tree/main/skills. -Node-based Prisma ORM projects expect Node.js 24 LTS or newer. +Node-based Prisma ORM projects expect Node.js 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer. " `; diff --git a/packages/1-framework/3-tooling/config-loader/package.json b/packages/1-framework/3-tooling/config-loader/package.json index 38147d3ea3bb..9ac6c24a969c 100644 --- a/packages/1-framework/3-tooling/config-loader/package.json +++ b/packages/1-framework/3-tooling/config-loader/package.json @@ -56,7 +56,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/3-tooling/emitter/package.json b/packages/1-framework/3-tooling/emitter/package.json index 1cd69bf7d118..dd0e38e8f9d2 100644 --- a/packages/1-framework/3-tooling/emitter/package.json +++ b/packages/1-framework/3-tooling/emitter/package.json @@ -64,7 +64,7 @@ } }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/3-tooling/language-server/package.json b/packages/1-framework/3-tooling/language-server/package.json index 4afa487a23d6..9ac4b500afd1 100644 --- a/packages/1-framework/3-tooling/language-server/package.json +++ b/packages/1-framework/3-tooling/language-server/package.json @@ -54,7 +54,7 @@ } }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/3-tooling/migration/package.json b/packages/1-framework/3-tooling/migration/package.json index 81001c553bab..e3a04ddcf661 100644 --- a/packages/1-framework/3-tooling/migration/package.json +++ b/packages/1-framework/3-tooling/migration/package.json @@ -116,7 +116,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/1-framework/3-tooling/vite-plugin-contract-emit/package.json b/packages/1-framework/3-tooling/vite-plugin-contract-emit/package.json index 9453e4a3fb01..4e54f9682745 100644 --- a/packages/1-framework/3-tooling/vite-plugin-contract-emit/package.json +++ b/packages/1-framework/3-tooling/vite-plugin-contract-emit/package.json @@ -39,7 +39,7 @@ "typescript": ">=5.9" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "exports": { ".": "./dist/index.mjs", diff --git a/packages/2-mongo-family/1-foundation/mongo-codec/package.json b/packages/2-mongo-family/1-foundation/mongo-codec/package.json index fda758f1dfc8..7b5ac490597f 100644 --- a/packages/2-mongo-family/1-foundation/mongo-codec/package.json +++ b/packages/2-mongo-family/1-foundation/mongo-codec/package.json @@ -46,7 +46,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/1-foundation/mongo-contract/package.json b/packages/2-mongo-family/1-foundation/mongo-contract/package.json index 468119d288f0..334d53da411f 100644 --- a/packages/2-mongo-family/1-foundation/mongo-contract/package.json +++ b/packages/2-mongo-family/1-foundation/mongo-contract/package.json @@ -53,7 +53,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/1-foundation/mongo-value/package.json b/packages/2-mongo-family/1-foundation/mongo-value/package.json index 3703939ebb1f..93962be40638 100644 --- a/packages/2-mongo-family/1-foundation/mongo-value/package.json +++ b/packages/2-mongo-family/1-foundation/mongo-value/package.json @@ -44,7 +44,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/2-authoring/contract-prisma6/package.json b/packages/2-mongo-family/2-authoring/contract-prisma6/package.json index a844678b78f9..952a88ee2b80 100644 --- a/packages/2-mongo-family/2-authoring/contract-prisma6/package.json +++ b/packages/2-mongo-family/2-authoring/contract-prisma6/package.json @@ -57,7 +57,7 @@ }, "types": "./dist/provider.d.mts", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/2-authoring/contract-psl/package.json b/packages/2-mongo-family/2-authoring/contract-psl/package.json index f9d3556be133..ff056eb34c98 100644 --- a/packages/2-mongo-family/2-authoring/contract-psl/package.json +++ b/packages/2-mongo-family/2-authoring/contract-psl/package.json @@ -66,7 +66,7 @@ } }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/2-authoring/contract-ts/package.json b/packages/2-mongo-family/2-authoring/contract-ts/package.json index c1851e562e99..53ef7c5f1a2c 100644 --- a/packages/2-mongo-family/2-authoring/contract-ts/package.json +++ b/packages/2-mongo-family/2-authoring/contract-ts/package.json @@ -52,7 +52,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/3-tooling/emitter/package.json b/packages/2-mongo-family/3-tooling/emitter/package.json index 3d1057a6cba8..d7182bbe07ef 100644 --- a/packages/2-mongo-family/3-tooling/emitter/package.json +++ b/packages/2-mongo-family/3-tooling/emitter/package.json @@ -51,7 +51,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/3-tooling/mongo-schema-ir/package.json b/packages/2-mongo-family/3-tooling/mongo-schema-ir/package.json index 9cdb7b308d78..9ddfaeb1fbe0 100644 --- a/packages/2-mongo-family/3-tooling/mongo-schema-ir/package.json +++ b/packages/2-mongo-family/3-tooling/mongo-schema-ir/package.json @@ -49,7 +49,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/4-query/query-ast/package.json b/packages/2-mongo-family/4-query/query-ast/package.json index f196a772065c..3d431e00e332 100644 --- a/packages/2-mongo-family/4-query/query-ast/package.json +++ b/packages/2-mongo-family/4-query/query-ast/package.json @@ -55,7 +55,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/5-query-builders/orm/package.json b/packages/2-mongo-family/5-query-builders/orm/package.json index 8e73d21404d2..fe39f4cce744 100644 --- a/packages/2-mongo-family/5-query-builders/orm/package.json +++ b/packages/2-mongo-family/5-query-builders/orm/package.json @@ -56,7 +56,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/5-query-builders/query-builder/package.json b/packages/2-mongo-family/5-query-builders/query-builder/package.json index 6983fe9b9bab..da41d5d07a91 100644 --- a/packages/2-mongo-family/5-query-builders/query-builder/package.json +++ b/packages/2-mongo-family/5-query-builders/query-builder/package.json @@ -48,7 +48,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/6-transport/mongo-lowering/package.json b/packages/2-mongo-family/6-transport/mongo-lowering/package.json index 0e70f1fd6a14..82f12a96fc40 100644 --- a/packages/2-mongo-family/6-transport/mongo-lowering/package.json +++ b/packages/2-mongo-family/6-transport/mongo-lowering/package.json @@ -50,7 +50,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/6-transport/mongo-wire/package.json b/packages/2-mongo-family/6-transport/mongo-wire/package.json index c13e1f30f30b..7645934402bd 100644 --- a/packages/2-mongo-family/6-transport/mongo-wire/package.json +++ b/packages/2-mongo-family/6-transport/mongo-wire/package.json @@ -45,7 +45,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/7-runtime/package.json b/packages/2-mongo-family/7-runtime/package.json index 78623320d9a7..2adf7ae74dd1 100644 --- a/packages/2-mongo-family/7-runtime/package.json +++ b/packages/2-mongo-family/7-runtime/package.json @@ -54,7 +54,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-mongo-family/9-family/package.json b/packages/2-mongo-family/9-family/package.json index 78b090399ee7..b802d49593a0 100644 --- a/packages/2-mongo-family/9-family/package.json +++ b/packages/2-mongo-family/9-family/package.json @@ -66,7 +66,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/1-core/contract/package.json b/packages/2-sql/1-core/contract/package.json index fd064e745791..a89282ed8590 100644 --- a/packages/2-sql/1-core/contract/package.json +++ b/packages/2-sql/1-core/contract/package.json @@ -64,7 +64,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/1-core/errors/package.json b/packages/2-sql/1-core/errors/package.json index 80d9d598105f..94e93ccfab0f 100644 --- a/packages/2-sql/1-core/errors/package.json +++ b/packages/2-sql/1-core/errors/package.json @@ -41,7 +41,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/1-core/operations/package.json b/packages/2-sql/1-core/operations/package.json index 38908fe9a127..f04c56dd9c21 100644 --- a/packages/2-sql/1-core/operations/package.json +++ b/packages/2-sql/1-core/operations/package.json @@ -47,7 +47,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/1-core/schema-ir/package.json b/packages/2-sql/1-core/schema-ir/package.json index acbd1e6519ee..514e5748c3d7 100644 --- a/packages/2-sql/1-core/schema-ir/package.json +++ b/packages/2-sql/1-core/schema-ir/package.json @@ -48,7 +48,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/2-authoring/contract-prisma7/package.json b/packages/2-sql/2-authoring/contract-prisma7/package.json index af815e782006..fab2bfff4fde 100644 --- a/packages/2-sql/2-authoring/contract-prisma7/package.json +++ b/packages/2-sql/2-authoring/contract-prisma7/package.json @@ -58,7 +58,7 @@ }, "types": "./dist/provider.d.mts", "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/2-authoring/contract-psl/package.json b/packages/2-sql/2-authoring/contract-psl/package.json index 1b6dcbbcadb2..87ca38e784a8 100644 --- a/packages/2-sql/2-authoring/contract-psl/package.json +++ b/packages/2-sql/2-authoring/contract-psl/package.json @@ -84,7 +84,7 @@ } }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/2-authoring/contract-ts/package.json b/packages/2-sql/2-authoring/contract-ts/package.json index 16e23b1f3bbf..27726fda200f 100644 --- a/packages/2-sql/2-authoring/contract-ts/package.json +++ b/packages/2-sql/2-authoring/contract-ts/package.json @@ -59,7 +59,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/3-tooling/emitter/package.json b/packages/2-sql/3-tooling/emitter/package.json index 0f1b245d81ab..16539acbc93a 100644 --- a/packages/2-sql/3-tooling/emitter/package.json +++ b/packages/2-sql/3-tooling/emitter/package.json @@ -49,7 +49,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/4-lanes/relational-core/package.json b/packages/2-sql/4-lanes/relational-core/package.json index e8c194660698..9aef8a26a79e 100644 --- a/packages/2-sql/4-lanes/relational-core/package.json +++ b/packages/2-sql/4-lanes/relational-core/package.json @@ -62,7 +62,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/4-lanes/sql-builder/package.json b/packages/2-sql/4-lanes/sql-builder/package.json index da3d804f71e6..047e4bcbb60d 100644 --- a/packages/2-sql/4-lanes/sql-builder/package.json +++ b/packages/2-sql/4-lanes/sql-builder/package.json @@ -57,7 +57,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/5-runtime/package.json b/packages/2-sql/5-runtime/package.json index 3f0e5b53de55..8c4e637a0ad0 100644 --- a/packages/2-sql/5-runtime/package.json +++ b/packages/2-sql/5-runtime/package.json @@ -58,7 +58,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/2-sql/9-family/package.json b/packages/2-sql/9-family/package.json index 21d2aef26f10..1839ac9728d6 100644 --- a/packages/2-sql/9-family/package.json +++ b/packages/2-sql/9-family/package.json @@ -69,7 +69,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/arktype-json/package.json b/packages/3-extensions/arktype-json/package.json index 9e002684f3f7..40deffb944f4 100644 --- a/packages/3-extensions/arktype-json/package.json +++ b/packages/3-extensions/arktype-json/package.json @@ -60,7 +60,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/middleware-cache/package.json b/packages/3-extensions/middleware-cache/package.json index 939f6f3a902e..b2baef5fb2e5 100644 --- a/packages/3-extensions/middleware-cache/package.json +++ b/packages/3-extensions/middleware-cache/package.json @@ -45,7 +45,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/mongo/package.json b/packages/3-extensions/mongo/package.json index 70e782f00632..ac12f5374f05 100644 --- a/packages/3-extensions/mongo/package.json +++ b/packages/3-extensions/mongo/package.json @@ -74,7 +74,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/paradedb/package.json b/packages/3-extensions/paradedb/package.json index 43d05b090421..d7f005b21861 100644 --- a/packages/3-extensions/paradedb/package.json +++ b/packages/3-extensions/paradedb/package.json @@ -63,7 +63,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/pgvector/package.json b/packages/3-extensions/pgvector/package.json index a3cf94886e82..eba46dc7ee4a 100644 --- a/packages/3-extensions/pgvector/package.json +++ b/packages/3-extensions/pgvector/package.json @@ -73,7 +73,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/postgis/package.json b/packages/3-extensions/postgis/package.json index 94792e18773f..2edf7ee9c544 100644 --- a/packages/3-extensions/postgis/package.json +++ b/packages/3-extensions/postgis/package.json @@ -68,7 +68,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/postgres/package.json b/packages/3-extensions/postgres/package.json index a83ad0e80109..12c404bdb422 100644 --- a/packages/3-extensions/postgres/package.json +++ b/packages/3-extensions/postgres/package.json @@ -83,7 +83,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/sql-orm-client/package.json b/packages/3-extensions/sql-orm-client/package.json index 1f34c699f99a..07191033f78f 100644 --- a/packages/3-extensions/sql-orm-client/package.json +++ b/packages/3-extensions/sql-orm-client/package.json @@ -64,7 +64,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/sqlite/package.json b/packages/3-extensions/sqlite/package.json index 252b711d0738..6826577c4aea 100644 --- a/packages/3-extensions/sqlite/package.json +++ b/packages/3-extensions/sqlite/package.json @@ -67,7 +67,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-extensions/supabase/package.json b/packages/3-extensions/supabase/package.json index 989ec3d231b4..3f4e1ebf1370 100644 --- a/packages/3-extensions/supabase/package.json +++ b/packages/3-extensions/supabase/package.json @@ -84,7 +84,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-mongo-target/1-mongo-target/package.json b/packages/3-mongo-target/1-mongo-target/package.json index d383e370fa43..a8e65d02f897 100644 --- a/packages/3-mongo-target/1-mongo-target/package.json +++ b/packages/3-mongo-target/1-mongo-target/package.json @@ -74,7 +74,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-mongo-target/2-mongo-adapter/package.json b/packages/3-mongo-target/2-mongo-adapter/package.json index ed62525473f7..d0ee4599d50a 100644 --- a/packages/3-mongo-target/2-mongo-adapter/package.json +++ b/packages/3-mongo-target/2-mongo-adapter/package.json @@ -70,7 +70,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-mongo-target/3-mongo-driver/package.json b/packages/3-mongo-target/3-mongo-driver/package.json index 4b2ada3b2b40..49c58942e377 100644 --- a/packages/3-mongo-target/3-mongo-driver/package.json +++ b/packages/3-mongo-target/3-mongo-driver/package.json @@ -52,7 +52,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-targets/3-targets/postgres/package.json b/packages/3-targets/3-targets/postgres/package.json index 8b4c6bec318e..6bc27ea43539 100644 --- a/packages/3-targets/3-targets/postgres/package.json +++ b/packages/3-targets/3-targets/postgres/package.json @@ -103,7 +103,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-targets/3-targets/sqlite/package.json b/packages/3-targets/3-targets/sqlite/package.json index e71aeb0c00ed..26db94eee461 100644 --- a/packages/3-targets/3-targets/sqlite/package.json +++ b/packages/3-targets/3-targets/sqlite/package.json @@ -79,7 +79,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-targets/6-adapters/postgres-codec-testkit/package.json b/packages/3-targets/6-adapters/postgres-codec-testkit/package.json index 5a3c3a7b483e..9c8019172059 100644 --- a/packages/3-targets/6-adapters/postgres-codec-testkit/package.json +++ b/packages/3-targets/6-adapters/postgres-codec-testkit/package.json @@ -53,7 +53,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-targets/6-adapters/postgres/package.json b/packages/3-targets/6-adapters/postgres/package.json index 2ec00dacf910..d8ebf5e87d21 100644 --- a/packages/3-targets/6-adapters/postgres/package.json +++ b/packages/3-targets/6-adapters/postgres/package.json @@ -70,7 +70,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-targets/6-adapters/sqlite-codec-testkit/package.json b/packages/3-targets/6-adapters/sqlite-codec-testkit/package.json index 1dd691c8afa7..b769183fb558 100644 --- a/packages/3-targets/6-adapters/sqlite-codec-testkit/package.json +++ b/packages/3-targets/6-adapters/sqlite-codec-testkit/package.json @@ -49,7 +49,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-targets/6-adapters/sqlite/package.json b/packages/3-targets/6-adapters/sqlite/package.json index f509e7d60fad..be0745e74e5d 100644 --- a/packages/3-targets/6-adapters/sqlite/package.json +++ b/packages/3-targets/6-adapters/sqlite/package.json @@ -68,7 +68,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-targets/7-drivers/postgres/package.json b/packages/3-targets/7-drivers/postgres/package.json index b5347e5a4416..40e605923204 100644 --- a/packages/3-targets/7-drivers/postgres/package.json +++ b/packages/3-targets/7-drivers/postgres/package.json @@ -60,7 +60,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/3-targets/7-drivers/sqlite/package.json b/packages/3-targets/7-drivers/sqlite/package.json index 9f1e9f0d9f61..80061ef9748d 100644 --- a/packages/3-targets/7-drivers/sqlite/package.json +++ b/packages/3-targets/7-drivers/sqlite/package.json @@ -51,7 +51,7 @@ "./package.json": "./package.json" }, "engines": { - "node": ">=24" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, "repository": { "type": "git", diff --git a/packages/9-public/@prisma/orm-extension-arktype-json/package.json b/packages/9-public/@prisma/orm-extension-arktype-json/package.json index 34a7225fe504..cfa9bdefff9e 100644 --- a/packages/9-public/@prisma/orm-extension-arktype-json/package.json +++ b/packages/9-public/@prisma/orm-extension-arktype-json/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-extension-middleware-cache/package.json b/packages/9-public/@prisma/orm-extension-middleware-cache/package.json index b4f6d670ae1b..49bf39ff5a83 100644 --- a/packages/9-public/@prisma/orm-extension-middleware-cache/package.json +++ b/packages/9-public/@prisma/orm-extension-middleware-cache/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-extension-paradedb/package.json b/packages/9-public/@prisma/orm-extension-paradedb/package.json index f8afe20b4680..78b9f845db48 100644 --- a/packages/9-public/@prisma/orm-extension-paradedb/package.json +++ b/packages/9-public/@prisma/orm-extension-paradedb/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-extension-pgvector/package.json b/packages/9-public/@prisma/orm-extension-pgvector/package.json index 9ec1f54e16a1..4fe0088609f4 100644 --- a/packages/9-public/@prisma/orm-extension-pgvector/package.json +++ b/packages/9-public/@prisma/orm-extension-pgvector/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-extension-postgis/package.json b/packages/9-public/@prisma/orm-extension-postgis/package.json index d76154b37ebc..2cdaf9674cfd 100644 --- a/packages/9-public/@prisma/orm-extension-postgis/package.json +++ b/packages/9-public/@prisma/orm-extension-postgis/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-extension-supabase/package.json b/packages/9-public/@prisma/orm-extension-supabase/package.json index b93d5d60d124..5a47420fc821 100644 --- a/packages/9-public/@prisma/orm-extension-supabase/package.json +++ b/packages/9-public/@prisma/orm-extension-supabase/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-family-mongo/package.json b/packages/9-public/@prisma/orm-family-mongo/package.json index 75500e0224a9..6a9a6763b90c 100644 --- a/packages/9-public/@prisma/orm-family-mongo/package.json +++ b/packages/9-public/@prisma/orm-family-mongo/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-family-sql/package.json b/packages/9-public/@prisma/orm-family-sql/package.json index a98cf75a3411..21198ea123a7 100644 --- a/packages/9-public/@prisma/orm-family-sql/package.json +++ b/packages/9-public/@prisma/orm-family-sql/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-framework/package.json b/packages/9-public/@prisma/orm-framework/package.json index af02e0b3d18b..d3509f50e7f0 100644 --- a/packages/9-public/@prisma/orm-framework/package.json +++ b/packages/9-public/@prisma/orm-framework/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-mongo/package.json b/packages/9-public/@prisma/orm-mongo/package.json index f1bca30df7eb..b810365d12c6 100644 --- a/packages/9-public/@prisma/orm-mongo/package.json +++ b/packages/9-public/@prisma/orm-mongo/package.json @@ -9,6 +9,9 @@ "dist", "skills" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "prepack": "node ../../../../scripts/sync-package-skills.ts @prisma/orm-mongo", diff --git a/packages/9-public/@prisma/orm-postgres/package.json b/packages/9-public/@prisma/orm-postgres/package.json index 2a9fdb58156a..2140ee3b2bc3 100644 --- a/packages/9-public/@prisma/orm-postgres/package.json +++ b/packages/9-public/@prisma/orm-postgres/package.json @@ -9,6 +9,9 @@ "dist", "skills" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "prepack": "node ../../../../scripts/sync-package-skills.ts @prisma/orm-postgres", diff --git a/packages/9-public/@prisma/orm-sqlite/package.json b/packages/9-public/@prisma/orm-sqlite/package.json index 8704a2d033a7..de33954ebd7a 100644 --- a/packages/9-public/@prisma/orm-sqlite/package.json +++ b/packages/9-public/@prisma/orm-sqlite/package.json @@ -9,6 +9,9 @@ "dist", "skills" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "prepack": "node ../../../../scripts/sync-package-skills.ts @prisma/orm-sqlite", diff --git a/packages/9-public/@prisma/orm-target-mongo/package.json b/packages/9-public/@prisma/orm-target-mongo/package.json index 1f6610df7f13..d409d8c3e929 100644 --- a/packages/9-public/@prisma/orm-target-mongo/package.json +++ b/packages/9-public/@prisma/orm-target-mongo/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-target-postgres/package.json b/packages/9-public/@prisma/orm-target-postgres/package.json index b1a49743a7d8..de4c0a690284 100644 --- a/packages/9-public/@prisma/orm-target-postgres/package.json +++ b/packages/9-public/@prisma/orm-target-postgres/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-target-sqlite/package.json b/packages/9-public/@prisma/orm-target-sqlite/package.json index eb8103c0b73a..15660b398273 100644 --- a/packages/9-public/@prisma/orm-target-sqlite/package.json +++ b/packages/9-public/@prisma/orm-target-sqlite/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/packages/9-public/@prisma/orm-toolchain/package.json b/packages/9-public/@prisma/orm-toolchain/package.json index fb48a6f58ddb..d1e1824ca2f0 100644 --- a/packages/9-public/@prisma/orm-toolchain/package.json +++ b/packages/9-public/@prisma/orm-toolchain/package.json @@ -8,6 +8,9 @@ "files": [ "dist" ], + "engines": { + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, "scripts": { "build": "tsdown", "lint": "biome check . --error-on-warnings", diff --git a/scripts/validate-node-engines.mjs b/scripts/validate-node-engines.mjs new file mode 100644 index 000000000000..db1ed261fbb7 --- /dev/null +++ b/scripts/validate-node-engines.mjs @@ -0,0 +1,127 @@ +#!/usr/bin/env node +// Checks that every package under `packages/` states the one Node.js range +// Prisma 8 supports. Every publishable package must declare it in +// `engines.node`; an unpublished package that declares `engines.node` must +// use the same range, because tsdown derives each package's build target +// from that field and the published packages bundle the unpublished ones. +// +// Wired into CI via `pnpm lint:manifests`. +// +// Usage: +// node scripts/validate-node-engines.mjs — exit 1 on offenders +// node scripts/validate-node-engines.mjs --json — same, with JSON report + +import { readdirSync, readFileSync, statSync } from 'node:fs'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +/** + * The Node.js range every Prisma 8 package supports: Node.js 22.18 or newer + * on the 22 line, 24.11 or newer on the 24 line, or 26 or newer. See ADR 269. + */ +export const NODE_ENGINES_RANGE = '^22.18.0 || ^24.11.0 || >=26.0.0'; + +/** + * @param {Record} pkgJson + * @param {{ publishable: boolean }} options + * @returns {{ name: string; node: unknown; reason: 'missing' | 'wrong-range' } | null} + */ +export function classifyPackage(pkgJson, { publishable }) { + const name = typeof pkgJson.name === 'string' ? pkgJson.name : ''; + const node = pkgJson.engines?.node; + if (node === undefined) { + return publishable ? { name, node, reason: 'missing' } : null; + } + return node === NODE_ENGINES_RANGE ? null : { name, node, reason: 'wrong-range' }; +} + +const SKIP_DIRS = new Set([ + 'node_modules', + 'dist', + 'dist-tsc', + 'dist-tsc-prod', + 'coverage', + '.tmp-output', + '.turbo', +]); + +function listPackages(root = 'packages') { + const found = []; + const walk = (dir) => { + for (const entry of readdirSync(dir)) { + if (SKIP_DIRS.has(entry)) continue; + const path = join(dir, entry); + if (statSync(path).isDirectory()) { + walk(path); + } else if (entry === 'package.json') { + const pkg = JSON.parse(readFileSync(path, 'utf-8')); + found.push({ dir, publishable: pkg.private !== true }); + } + } + }; + walk(root); + return found.sort((a, b) => a.dir.localeCompare(b.dir)); +} + +const DEFAULT_IO = { + listPackages, + readPackageJson: (dir) => JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8')), + stdoutWrite: (s) => process.stdout.write(s), + stderrWrite: (s) => process.stderr.write(s), +}; + +/** + * @param {object} [options] + * @param {string[]} [options.argv] + * @param {Partial} [options.io] + * @returns {number} + */ +export function runCheck({ argv = process.argv.slice(2), io = {} } = {}) { + const { + listPackages: list, + readPackageJson, + stdoutWrite, + stderrWrite, + } = { + ...DEFAULT_IO, + ...io, + }; + const packages = list(); + const offenders = []; + for (const { dir, publishable } of packages) { + const offence = classifyPackage(readPackageJson(dir), { publishable }); + if (offence) offenders.push({ dir, ...offence }); + } + + if (argv.includes('--json')) { + stdoutWrite( + `${JSON.stringify({ ok: offenders.length === 0, nodeEnginesRange: NODE_ENGINES_RANGE, offenders }, null, 2)}\n`, + ); + return offenders.length === 0 ? 0 : 1; + } + + if (offenders.length === 0) { + stderrWrite( + `\nOK — ${packages.length} packages checked for "engines.node": "${NODE_ENGINES_RANGE}".\n`, + ); + return 0; + } + + stderrWrite( + `\nFAIL — ${offenders.length} package(s) do not state the supported Node.js range:\n`, + ); + for (const o of offenders) { + const problem = + o.reason === 'missing' ? 'no "engines.node"' : `"engines.node": ${JSON.stringify(o.node)}`; + stderrWrite(`\n ${o.name} (${o.dir})\n ${problem}\n`); + } + stderrWrite( + `\nSet "engines": { "node": "${NODE_ENGINES_RANGE}" }.\n` + + 'To change the supported range, update NODE_ENGINES_RANGE in scripts/validate-node-engines.mjs first.\n', + ); + return 1; +} + +if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) { + process.exit(runCheck()); +} diff --git a/scripts/validate-node-engines.test.mjs b/scripts/validate-node-engines.test.mjs new file mode 100644 index 000000000000..e47a3402d62d --- /dev/null +++ b/scripts/validate-node-engines.test.mjs @@ -0,0 +1,95 @@ +import { deepStrictEqual, strictEqual } from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { classifyPackage, NODE_ENGINES_RANGE, runCheck } from './validate-node-engines.mjs'; + +const CONFORMING_PKG = { name: '@prisma/orm-example', engines: { node: NODE_ENGINES_RANGE } }; + +describe('NODE_ENGINES_RANGE', () => { + it('is the range every Prisma 8 tool supports', () => { + strictEqual(NODE_ENGINES_RANGE, '^22.18.0 || ^24.11.0 || >=26.0.0'); + }); +}); + +describe('classifyPackage', () => { + it('accepts a package that declares the range', () => { + strictEqual(classifyPackage(CONFORMING_PKG, { publishable: true }), null); + }); + + it('flags a publishable package without engines.node', () => { + deepStrictEqual(classifyPackage({ name: '@prisma/orm-example' }, { publishable: true }), { + name: '@prisma/orm-example', + node: undefined, + reason: 'missing', + }); + }); + + it('accepts an unpublished package without engines.node', () => { + strictEqual(classifyPackage({ name: '@repo/tsconfig' }, { publishable: false }), null); + }); + + it('flags an unpublished package that declares a different range', () => { + deepStrictEqual( + classifyPackage( + { name: '@internal/example', engines: { node: '>=24' } }, + { publishable: false }, + ), + { name: '@internal/example', node: '>=24', reason: 'wrong-range' }, + ); + }); + + it('falls back to "" when name is missing', () => { + strictEqual(classifyPackage({}, { publishable: true })?.name, ''); + }); +}); + +describe('runCheck', () => { + function makeIo(packages) { + const stdout = []; + const stderr = []; + const io = { + listPackages: () => packages.map(({ dir, publishable }) => ({ dir, publishable })), + readPackageJson: (dir) => packages.find((p) => p.dir === dir).manifest, + stdoutWrite: (s) => stdout.push(s), + stderrWrite: (s) => stderr.push(s), + }; + return { io, stdout, stderr }; + } + + it('returns 0 when every package conforms', () => { + const { io } = makeIo([ + { dir: 'packages/a', publishable: true, manifest: CONFORMING_PKG }, + { dir: 'packages/b', publishable: false, manifest: { name: '@repo/tsconfig' } }, + ]); + strictEqual(runCheck({ argv: [], io }), 0); + }); + + it('returns 1 and names every offender with the expected range', () => { + const { io, stderr } = makeIo([ + { dir: 'packages/a', publishable: true, manifest: { name: '@prisma/orm-a' } }, + { + dir: 'packages/b', + publishable: false, + manifest: { name: '@internal/b', engines: { node: '>=24' } }, + }, + ]); + strictEqual(runCheck({ argv: [], io }), 1); + const output = stderr.join(''); + strictEqual(output.includes('@prisma/orm-a'), true); + strictEqual(output.includes('no "engines.node"'), true); + strictEqual(output.includes('@internal/b'), true); + strictEqual(output.includes('">=24"'), true); + strictEqual(output.includes(NODE_ENGINES_RANGE), true); + }); + + it('emits structured JSON when --json is passed', () => { + const { io, stdout } = makeIo([ + { dir: 'packages/a', publishable: true, manifest: { name: '@prisma/orm-a' } }, + ]); + strictEqual(runCheck({ argv: ['--json'], io }), 1); + deepStrictEqual(JSON.parse(stdout.join('')), { + ok: false, + nodeEnginesRange: NODE_ENGINES_RANGE, + offenders: [{ dir: 'packages/a', name: '@prisma/orm-a', reason: 'missing' }], + }); + }); +}); From fcca7962bbba943269c385f3ce52eefc22000ff8 Mon Sep 17 00:00:00 2001 From: willbot Date: Fri, 9 Oct 2026 11:21:10 +0200 Subject: [PATCH 2/6] chore: declare no upgrade action for the Node.js range change Signed-off-by: willbot Signed-off-by: Will Madden --- .../pending/node-engines-range/app/instructions.md | 3 +++ .../pending/node-engines-range/extension/instructions.md | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 upgrade-instructions/pending/node-engines-range/app/instructions.md create mode 100644 upgrade-instructions/pending/node-engines-range/extension/instructions.md diff --git a/upgrade-instructions/pending/node-engines-range/app/instructions.md b/upgrade-instructions/pending/node-engines-range/app/instructions.md new file mode 100644 index 000000000000..8e1cc0ebe668 --- /dev/null +++ b/upgrade-instructions/pending/node-engines-range/app/instructions.md @@ -0,0 +1,3 @@ +--- +changes: [] +--- diff --git a/upgrade-instructions/pending/node-engines-range/extension/instructions.md b/upgrade-instructions/pending/node-engines-range/extension/instructions.md new file mode 100644 index 000000000000..8e1cc0ebe668 --- /dev/null +++ b/upgrade-instructions/pending/node-engines-range/extension/instructions.md @@ -0,0 +1,3 @@ +--- +changes: [] +--- From a4776e96b7dfe71ff77f39e96d6a587d8d715160 Mon Sep 17 00:00:00 2001 From: willbot Date: Fri, 9 Oct 2026 11:41:21 +0200 Subject: [PATCH 3/6] fix: narrow the React Router example's Node.js range and address review React Router 8.3 needs Node.js 22.22 or newer, so examples/react-router-demo declares "^22.22.0 || ^24.11.0 || >=26.0.0". ADR 269 now says examples may need a narrower range than the packages, that the check covers only packages/, and that tsdown lowers syntax but does not check built-in APIs. The ADR index no longer states that the prisma CLI and Composer already use the range. scripts/validate-node-engines.mjs now uses the package walk that scripts/list-publishable-packages.mjs exports, so the two scripts agree on which packages exist. Signed-off-by: willbot Signed-off-by: Will Madden --- docs/architecture docs/ADR-INDEX.md | 2 +- ...e Node.js range for every Prisma 8 tool.md | 5 +- examples/react-router-demo/package.json | 2 +- scripts/list-publishable-packages.mjs | 63 ++++++++----------- scripts/validate-node-engines.mjs | 33 +--------- 5 files changed, 33 insertions(+), 72 deletions(-) diff --git a/docs/architecture docs/ADR-INDEX.md b/docs/architecture docs/ADR-INDEX.md index 1560aeea3c75..89de30d69386 100644 --- a/docs/architecture docs/ADR-INDEX.md +++ b/docs/architecture docs/ADR-INDEX.md @@ -170,7 +170,7 @@ This document provides a comprehensive index of all Architectural Decision Recor | 216 | CLI telemetry installation ID is a stored random UUID, not a system fingerprint | Adopts a stored v4 UUID under the user's config dir as the MAU dedup key; rejects MAC-hash, machine-id, IORegistry UUID, and Windows MachineGuid alternatives on trust, regulatory, and reset-symmetry grounds | [ADR 216 - CLI telemetry installation ID is a stored random UUID not a system fingerprint.md](adrs/ADR%20216%20-%20CLI%20telemetry%20installation%20ID%20is%20a%20stored%20random%20UUID%20not%20a%20system%20fingerprint.md) | | 217 | CLI telemetry runs in a detached subprocess spawned at command start | Forks the telemetry sender via `child_process.fork()` at command start (not exit); parent disconnects and unrefs immediately; child owns all I/O and swallows all errors; satisfies the strict isolation contract by construction rather than diligence | [ADR 217 - CLI telemetry runs in a detached subprocess spawned at command start.md](adrs/ADR%20217%20-%20CLI%20telemetry%20runs%20in%20a%20detached%20subprocess%20spawned%20at%20command%20start.md) | | 242 | Public npm surface: single `@prisma` scope with consolidated publish packages | The public surface is 17 `@prisma/*` packages — database facades, extension packs, framework/toolchain, families, targets — plus the `prisma` bin shim, all under `packages/9-public/`; every other workspace package is private and reaches npm only as a subpath entrypoint of a published shell (one module, one package, preserving registry/`instanceof` identity); framework runtime and tooling publish separately for serverless bundle weight; rejects a second `@prisma-orm` scope | [ADR 242 - Public npm surface - single @prisma scope with consolidated publish packages.md](adrs/ADR%20242%20-%20Public%20npm%20surface%20-%20single%20%40prisma%20scope%20with%20consolidated%20publish%20packages.md) | -| 269 | One Node.js range for every Prisma 8 tool | Amends ADR 222: every Prisma 8 package declares `engines.node` `^22.18.0 \|\| ^24.11.0 \|\| >=26.0.0` (Node.js 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer), the same range as the `prisma` CLI, Composer and `create-prisma`; `NODE_ENGINES_RANGE` in `scripts/validate-node-engines.mjs` is the source of truth and `pnpm lint:manifests` checks it | [ADR 269 - One Node.js range for every Prisma 8 tool.md](adrs/ADR%20269%20-%20One%20Node.js%20range%20for%20every%20Prisma%208%20tool.md) | +| 269 | One Node.js range for every Prisma 8 tool | Amends ADR 222: every Prisma 8 package declares `engines.node` `^22.18.0 \|\| ^24.11.0 \|\| >=26.0.0` (Node.js 22.18 or newer on the 22 line, 24.11 or newer on the 24 line, or 26 or newer), the range every Prisma 8 tool is to declare (`create-prisma` already does; prisma/prisma-cli#343 and prisma/composer#351 align the `prisma` CLI and Composer); in this repository `NODE_ENGINES_RANGE` in `scripts/validate-node-engines.mjs` is the source of truth and `pnpm lint:manifests` checks it | [ADR 269 - One Node.js range for every Prisma 8 tool.md](adrs/ADR%20269%20-%20One%20Node.js%20range%20for%20every%20Prisma%208%20tool.md) | ## No-Emit Workflow diff --git a/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md index ff41ce66f846..d61da84637cf 100644 --- a/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md +++ b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md @@ -30,8 +30,9 @@ A user meets the Prisma 8 tools one after another: `create-prisma` scaffolds a p ## Enforcement -- `NODE_ENGINES_RANGE` in `scripts/validate-node-engines.mjs` is the source of truth. `pnpm lint:manifests` fails when a publishable package lacks `engines.node`, or when any package under `packages/` declares a different range. +- `NODE_ENGINES_RANGE` in `scripts/validate-node-engines.mjs` is the source of truth. `pnpm lint:manifests` fails when a publishable package lacks `engines.node`, or when any package under `packages/` declares a different range. The check covers only `packages/`. - `tsdown` derives each package's build target from `engines.node`, so every package builds for `node22.18.0`, the lowest version in the range. +- The examples under `examples/` are applications. They declare the same range unless a framework they use needs a narrower one; `examples/react-router-demo` declares `^22.22.0 || ^24.11.0 || >=26.0.0` because React Router needs Node.js 22.22 or newer. - The scaffold READMEs that `prisma orm init` writes, the repository README, and [Supported Versions](../../Supported%20Versions.md) state the range in prose. The repository's own development toolchain is separate: the root `package.json` and `.tool-versions` choose the Node.js version contributors and CI use, and this ADR does not change them. @@ -39,7 +40,7 @@ The repository's own development toolchain is separate: the root `package.json` ## Consequences - Node.js 22.18 and newer 22.x releases become supported. CI runs the test suites on the Node.js version in `.tool-versions` (a 24.x release); it does not yet run them on Node.js 22 or 26. -- Output built for `node22.18.0` can use only syntax and built-in APIs that Node.js 22.18 provides. +- `tsdown` lowers syntax to Node.js 22.18. It does not check built-in APIs: code must not call an API newer than Node.js 22.18, and only a test run on Node.js 22.18 catches one that does. ## Alternatives considered diff --git a/examples/react-router-demo/package.json b/examples/react-router-demo/package.json index 2710dfae2b89..08a67b7b0879 100644 --- a/examples/react-router-demo/package.json +++ b/examples/react-router-demo/package.json @@ -3,7 +3,7 @@ "private": true, "type": "module", "engines": { - "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + "node": "^22.22.0 || ^24.11.0 || >=26.0.0" }, "scripts": { "dev": "react-router dev", diff --git a/scripts/list-publishable-packages.mjs b/scripts/list-publishable-packages.mjs index cbcd54a7f6e7..3155861e06ee 100644 --- a/scripts/list-publishable-packages.mjs +++ b/scripts/list-publishable-packages.mjs @@ -1,5 +1,6 @@ import { readdirSync, readFileSync, statSync } from 'node:fs'; import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; const SKIP_DIRS = new Set([ 'node_modules', @@ -11,46 +12,32 @@ const SKIP_DIRS = new Set([ '.turbo', ]); -const roots = []; -const seen = new Set(); - /** - * Recursively walk a directory and collect paths to non-private packages. - * A package is considered publishable if it has a package.json without `"private": true`. + * Every package under `root`, sorted by directory. A package is publishable + * when its package.json does not set `"private": true`. + * + * @param {string} [root] + * @returns {Array<{ dir: string; publishable: boolean }>} */ -function walk(dir) { - for (const entry of readdirSync(dir)) { - if (SKIP_DIRS.has(entry)) { - continue; - } - - const p = join(dir, entry); - const st = statSync(p); - - if (st.isDirectory()) { - walk(p); - continue; +export function listWorkspacePackages(root = 'packages') { + const found = []; + const walk = (dir) => { + for (const entry of readdirSync(dir)) { + if (SKIP_DIRS.has(entry)) continue; + const path = join(dir, entry); + if (statSync(path).isDirectory()) { + walk(path); + } else if (entry === 'package.json') { + const pkg = JSON.parse(readFileSync(path, 'utf8')); + found.push({ dir, publishable: pkg?.private !== true }); + } } - - if (entry !== 'package.json') { - continue; - } - - const pkg = JSON.parse(readFileSync(p, 'utf8')); - - if (pkg?.private === true) { - continue; - } - - if (seen.has(dir)) { - continue; - } - - seen.add(dir); - roots.push(`./${dir}`); - } + }; + walk(root); + return found.sort((a, b) => a.dir.localeCompare(b.dir)); } -walk('packages'); -roots.sort((a, b) => a.localeCompare(b)); -console.log(roots.join(' ')); +if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) { + const publishable = listWorkspacePackages().filter((pkg) => pkg.publishable); + console.log(publishable.map((pkg) => `./${pkg.dir}`).join(' ')); +} diff --git a/scripts/validate-node-engines.mjs b/scripts/validate-node-engines.mjs index db1ed261fbb7..639f874ad5a1 100644 --- a/scripts/validate-node-engines.mjs +++ b/scripts/validate-node-engines.mjs @@ -11,9 +11,10 @@ // node scripts/validate-node-engines.mjs — exit 1 on offenders // node scripts/validate-node-engines.mjs --json — same, with JSON report -import { readdirSync, readFileSync, statSync } from 'node:fs'; +import { readFileSync } from 'node:fs'; import { join } from 'node:path'; import { fileURLToPath } from 'node:url'; +import { listWorkspacePackages } from './list-publishable-packages.mjs'; /** * The Node.js range every Prisma 8 package supports: Node.js 22.18 or newer @@ -35,36 +36,8 @@ export function classifyPackage(pkgJson, { publishable }) { return node === NODE_ENGINES_RANGE ? null : { name, node, reason: 'wrong-range' }; } -const SKIP_DIRS = new Set([ - 'node_modules', - 'dist', - 'dist-tsc', - 'dist-tsc-prod', - 'coverage', - '.tmp-output', - '.turbo', -]); - -function listPackages(root = 'packages') { - const found = []; - const walk = (dir) => { - for (const entry of readdirSync(dir)) { - if (SKIP_DIRS.has(entry)) continue; - const path = join(dir, entry); - if (statSync(path).isDirectory()) { - walk(path); - } else if (entry === 'package.json') { - const pkg = JSON.parse(readFileSync(path, 'utf-8')); - found.push({ dir, publishable: pkg.private !== true }); - } - } - }; - walk(root); - return found.sort((a, b) => a.dir.localeCompare(b.dir)); -} - const DEFAULT_IO = { - listPackages, + listPackages: () => listWorkspacePackages(), readPackageJson: (dir) => JSON.parse(readFileSync(join(dir, 'package.json'), 'utf-8')), stdoutWrite: (s) => process.stdout.write(s), stderrWrite: (s) => process.stderr.write(s), From 20ab754b2af7a2cc4816d26ea9afe927f1da8f63 Mon Sep 17 00:00:00 2001 From: willbot Date: Mon, 12 Oct 2026 14:06:51 +0200 Subject: [PATCH 4/6] docs(adr): ADR 269 records that CI stays on one Node.js version Signed-off-by: willbot Signed-off-by: Will Madden --- .../adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md index d61da84637cf..67ff4189ee5b 100644 --- a/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md +++ b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md @@ -39,7 +39,7 @@ The repository's own development toolchain is separate: the root `package.json` ## Consequences -- Node.js 22.18 and newer 22.x releases become supported. CI runs the test suites on the Node.js version in `.tool-versions` (a 24.x release); it does not yet run them on Node.js 22 or 26. +- Node.js 22.18 and newer 22.x releases become supported. CI runs the test suites on the Node.js version in `.tool-versions` (a 24.x release) only, by decision; there is no job for Node.js 22 or 26. Support for Node.js 22.18 was checked when this ADR was written, by running `pnpm build` and `pnpm test:packages` on Node.js 22.18.0. - `tsdown` lowers syntax to Node.js 22.18. It does not check built-in APIs: code must not call an API newer than Node.js 22.18, and only a test run on Node.js 22.18 catches one that does. ## Alternatives considered From 1ee9328e4a5a0bc29d9ddb57f6e1095c1b141cf7 Mon Sep 17 00:00:00 2001 From: willbot Date: Tue, 13 Oct 2026 09:02:57 +0200 Subject: [PATCH 5/6] docs(adr): ADR 269 states that it overrides ADR 222's test-coverage rule for Node.js, and what tests the range Signed-off-by: willbot Signed-off-by: Will Madden --- .../ADR 269 - One Node.js range for every Prisma 8 tool.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md index 67ff4189ee5b..ad1405099944 100644 --- a/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md +++ b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md @@ -39,7 +39,10 @@ The repository's own development toolchain is separate: the root `package.json` ## Consequences -- Node.js 22.18 and newer 22.x releases become supported. CI runs the test suites on the Node.js version in `.tool-versions` (a 24.x release) only, by decision; there is no job for Node.js 22 or 26. Support for Node.js 22.18 was checked when this ADR was written, by running `pnpm build` and `pnpm test:packages` on Node.js 22.18.0. +- Node.js 22.18 and newer 22.x releases become supported. This ADR overrides ADR 222's rule that a declared floor must never claim more than this repository's test infrastructure exercises, for Node.js only. The Node.js range is a product decision shared by every Prisma 8 tool, and the team decided not to add CI jobs for it. This repository's CI runs the test suites on the Node.js version in `.tool-versions` (a 24.x release) only. What exercises the rest of the range today: + +- Node.js 22.18.0: `pnpm build` and `pnpm test:packages` passed on it when this ADR was written. The nightly getting-started check in prisma/getting-started-eval runs on Node.js 22.18.0 with its own npm, and installs and runs Prisma ORM through `create-prisma` every night. +- Node.js 26: nothing tests it yet. A change that breaks it would go unnoticed until a user reports it. - `tsdown` lowers syntax to Node.js 22.18. It does not check built-in APIs: code must not call an API newer than Node.js 22.18, and only a test run on Node.js 22.18 catches one that does. ## Alternatives considered From b83ca1a90b93b0b017fecea63606ae974e15f484 Mon Sep 17 00:00:00 2001 From: willbot Date: Tue, 13 Oct 2026 09:03:14 +0200 Subject: [PATCH 6/6] docs(adr): keep ADR 269's consequences as one list Signed-off-by: willbot Signed-off-by: Will Madden --- ...ADR 269 - One Node.js range for every Prisma 8 tool.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md index ad1405099944..1da715f14059 100644 --- a/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md +++ b/docs/architecture docs/adrs/ADR 269 - One Node.js range for every Prisma 8 tool.md @@ -39,10 +39,10 @@ The repository's own development toolchain is separate: the root `package.json` ## Consequences -- Node.js 22.18 and newer 22.x releases become supported. This ADR overrides ADR 222's rule that a declared floor must never claim more than this repository's test infrastructure exercises, for Node.js only. The Node.js range is a product decision shared by every Prisma 8 tool, and the team decided not to add CI jobs for it. This repository's CI runs the test suites on the Node.js version in `.tool-versions` (a 24.x release) only. What exercises the rest of the range today: - -- Node.js 22.18.0: `pnpm build` and `pnpm test:packages` passed on it when this ADR was written. The nightly getting-started check in prisma/getting-started-eval runs on Node.js 22.18.0 with its own npm, and installs and runs Prisma ORM through `create-prisma` every night. -- Node.js 26: nothing tests it yet. A change that breaks it would go unnoticed until a user reports it. +- Node.js 22.18 and newer 22.x releases become supported. +- This ADR overrides ADR 222's rule that a declared floor must never claim more than this repository's test infrastructure exercises, for Node.js only. The Node.js range is a product decision shared by every Prisma 8 tool, and the team decided not to add CI jobs for it. This repository's CI runs the test suites on the Node.js version in `.tool-versions` (a 24.x release) only. What exercises the rest of the range today: + - Node.js 22.18.0: `pnpm build` and `pnpm test:packages` passed on it when this ADR was written. The nightly getting-started check in prisma/getting-started-eval runs on Node.js 22.18.0 with its own npm, and installs and runs Prisma ORM through `create-prisma` every night. + - Node.js 26: nothing tests it yet. A change that breaks it would go unnoticed until a user reports it. - `tsdown` lowers syntax to Node.js 22.18. It does not check built-in APIs: code must not call an API newer than Node.js 22.18, and only a test run on Node.js 22.18 catches one that does. ## Alternatives considered