From 27aa539ec956a0f77563a33c9373fdf42d469a45 Mon Sep 17 00:00:00 2001 From: willbot Date: Wed, 7 Oct 2026 09:14:38 +0200 Subject: [PATCH 1/3] chore(release): bump to 8.0.0-rc.15 Signed-off-by: willbot Signed-off-by: Will Madden --- apps/lsp-playground/package.json | 6 +- apps/telemetry-backend/package.json | 8 +- examples/bundle-size/package.json | 10 +- examples/bundle-size/src/mongo/package.json | 4 +- .../bundle-size/src/postgres/package.json | 4 +- examples/mongo-blog-leaderboard/package.json | 6 +- examples/mongo-demo/package.json | 10 +- .../multi-extension-monorepo/package.json | 8 +- examples/paradedb-demo/package.json | 10 +- .../prisma-8-cloudflare-worker/package.json | 6 +- examples/prisma-8-demo-sqlite/package.json | 6 +- examples/prisma-8-demo/package.json | 12 +- examples/prisma-8-postgis-demo/package.json | 10 +- examples/prisma7-adoption/package.json | 10 +- examples/react-router-demo/package.json | 8 +- examples/retail-store/package.json | 10 +- examples/supabase/package.json | 10 +- examples/supabase/src/contract.d.ts | 2 +- examples/supabase/src/contract.json | 2 +- package.json | 10 +- packages/0-config/tsconfig/package.json | 2 +- packages/0-config/tsdown/package.json | 6 +- .../extension-author-tools/package.json | 2 +- .../0-shared/publish-surface/package.json | 4 +- .../0-foundation/contract/package.json | 8 +- .../0-foundation/utils/package.json | 6 +- .../1-framework/1-core/config/package.json | 12 +- .../1-framework/1-core/errors/package.json | 10 +- .../1-core/framework-components/package.json | 14 +- .../1-core/operations/package.json | 10 +- .../1-framework/1-core/ts-render/package.json | 8 +- .../2-authoring/contract/package.json | 12 +- .../1-framework/2-authoring/ids/package.json | 12 +- .../2-authoring/psl-parser/package.json | 14 +- .../2-authoring/psl-printer/package.json | 14 +- .../3-tooling/cli-telemetry/package.json | 14 +- .../1-framework/3-tooling/cli/package.json | 44 +- .../cli/test/fixture-app/package.json | 6 +- .../3-tooling/config-loader/package.json | 16 +- .../3-tooling/emitter/package.json | 20 +- .../3-tooling/language-server/package.json | 20 +- .../3-tooling/migration/package.json | 16 +- .../vite-plugin-contract-emit/package.json | 14 +- .../1-foundation/mongo-codec/package.json | 14 +- .../1-foundation/mongo-contract/package.json | 18 +- .../1-foundation/mongo-value/package.json | 6 +- .../2-authoring/contract-prisma6/package.json | 32 +- .../2-authoring/contract-psl/package.json | 24 +- .../2-authoring/contract-ts/package.json | 24 +- .../3-tooling/emitter/package.json | 20 +- .../3-tooling/mongo-schema-ir/package.json | 14 +- .../4-query/query-ast/package.json | 18 +- .../5-query-builders/orm/package.json | 30 +- .../query-builder/package.json | 16 +- .../6-transport/mongo-lowering/package.json | 12 +- .../6-transport/mongo-wire/package.json | 12 +- .../2-mongo-family/7-runtime/package.json | 28 +- packages/2-mongo-family/9-family/package.json | 40 +- packages/2-sql/1-core/contract/package.json | 16 +- packages/2-sql/1-core/errors/package.json | 8 +- packages/2-sql/1-core/operations/package.json | 14 +- packages/2-sql/1-core/schema-ir/package.json | 14 +- .../2-authoring/contract-prisma7/package.json | 34 +- .../2-authoring/contract-psl/package.json | 24 +- .../2-authoring/contract-ts/package.json | 22 +- packages/2-sql/3-tooling/emitter/package.json | 20 +- .../4-lanes/relational-core/package.json | 22 +- .../2-sql/4-lanes/sql-builder/package.json | 28 +- packages/2-sql/5-runtime/package.json | 24 +- packages/2-sql/9-family/package.json | 42 +- .../3-extensions/arktype-json/package.json | 32 +- .../middleware-cache/package.json | 12 +- packages/3-extensions/mongo/package.json | 46 +- packages/3-extensions/paradedb/package.json | 38 +- packages/3-extensions/pgvector/package.json | 48 +- packages/3-extensions/postgis/package.json | 42 +- packages/3-extensions/postgres/package.json | 52 +- .../3-extensions/sql-orm-client/package.json | 40 +- packages/3-extensions/sqlite/package.json | 42 +- packages/3-extensions/supabase/package.json | 54 +- .../test/fixtures/example-app/contract.d.ts | 2 +- .../test/fixtures/example-app/contract.json | 2 +- .../test/fixtures/no-policy/contract.d.ts | 2 +- .../test/fixtures/no-policy/contract.json | 2 +- .../fixtures/renamed-policy/contract.d.ts | 2 +- .../fixtures/renamed-policy/contract.json | 2 +- .../1-mongo-target/package.json | 46 +- .../2-mongo-adapter/package.json | 50 +- .../3-mongo-driver/package.json | 18 +- .../3-targets/3-targets/postgres/package.json | 42 +- .../3-targets/3-targets/sqlite/package.json | 38 +- .../postgres-codec-testkit/package.json | 26 +- .../6-adapters/postgres/package.json | 46 +- .../sqlite-codec-testkit/package.json | 20 +- .../3-targets/6-adapters/sqlite/package.json | 46 +- .../3-targets/7-drivers/postgres/package.json | 24 +- .../3-targets/7-drivers/sqlite/package.json | 24 +- .../orm-extension-arktype-json/package.json | 16 +- .../package.json | 10 +- .../orm-extension-paradedb/package.json | 16 +- .../orm-extension-pgvector/package.json | 18 +- .../orm-extension-postgis/package.json | 18 +- .../orm-extension-supabase/package.json | 20 +- .../@prisma/orm-family-mongo/package.json | 40 +- .../@prisma/orm-family-sql/package.json | 36 +- .../@prisma/orm-framework/package.json | 30 +- .../9-public/@prisma/orm-mongo/package.json | 16 +- .../@prisma/orm-postgres/package.json | 16 +- .../9-public/@prisma/orm-sqlite/package.json | 16 +- .../@prisma/orm-target-mongo/package.json | 18 +- .../@prisma/orm-target-postgres/package.json | 18 +- .../@prisma/orm-target-sqlite/package.json | 18 +- .../@prisma/orm-toolchain/package.json | 24 +- pnpm-lock.yaml | 2158 ++++++++-------- skills/prisma-8/SKILL.md | 2 +- .../instructions.md | 1365 +++++++++++ .../data-type-in-contract.ts | 0 .../instructions.md | 2168 +++++++++++++++++ .../data-type-in-contract.ts | 0 test/e2e/framework/package.json | 14 +- test/e2e/framework/test/fixtures/package.json | 8 +- .../test/sqlite/fixtures/package.json | 4 +- test/integration/package.json | 126 +- .../test/cli-journeys/package.json | 10 +- .../cli/cli-e2e-test-app/package.json | 42 +- .../cli/cli-integration-test-app/package.json | 44 +- .../fixtures/cli/cli-test-app/package.json | 20 +- .../data-type-in-contract-hashes.test.ts | 65 - .../data-type-in-contract-lists.test.ts | 70 +- ...ta-type-in-contract-storage-hashes.test.ts | 13 +- .../generate-fixtures.ts | 1398 ----------- .../data-type-in-contract/test-helpers.ts | 4 +- test/utils/package.json | 10 +- .../extension/instructions.md | 0 .../extension/instructions.md | 0 .../extension/instructions.md | 0 .../app/instructions.md | 0 .../bytea-defaults-verify/app/instructions.md | 0 .../extension/instructions.md | 0 .../app/instructions.md | 0 .../extension/instructions.md | 0 .../extension/instructions.md | 0 .../app/instructions.md | 0 .../extension/instructions.md | 0 .../extension/instructions.md | 0 .../data-type-in-contract/app/instructions.md | 0 .../app/scripts/data-type-in-contract.ts | 1492 ++++++++++++ .../extension/instructions.md | 0 .../scripts/data-type-in-contract.ts | 1492 ++++++++++++ .../app/instructions.md | 0 .../extension/instructions.md | 0 .../app/instructions.md | 0 .../extension/instructions.md | 0 .../app/instructions.md | 0 .../app/instructions.md | 0 .../extension/instructions.md | 0 .../app/instructions.md | 0 .../nullable-scalar-lists/app/instructions.md | 0 .../extension/instructions.md | 0 .../extension/instructions.md | 0 .../app/instructions.md | 0 .../prisma6-int-is-a-long/app/instructions.md | 0 .../app/instructions.md | 0 .../app/instructions.md | 0 .../extension/instructions.md | 0 .../extension/instructions.md | 0 .../extension/instructions.md | 0 .../app/instructions.md | 0 .../extension/instructions.md | 0 .../sql-is-a-data-type/app/instructions.md | 0 .../extension/instructions.md | 0 .../app/instructions.md | 0 .../extension/instructions.md | 0 173 files changed, 8813 insertions(+), 3832 deletions(-) create mode 100644 skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/instructions.md rename {upgrade-instructions/pending/data-type-in-contract/app/scripts => skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract}/data-type-in-contract.ts (100%) create mode 100644 skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/instructions.md rename {upgrade-instructions/pending/data-type-in-contract/extension/scripts => skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract}/data-type-in-contract.ts (100%) delete mode 100644 test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-hashes.test.ts delete mode 100644 test/integration/test/upgrade-instructions/data-type-in-contract/generate-fixtures.ts rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/adr-numbers-unique/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/after-transaction-stage/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/binder-from-caller/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/brownfield-date-types-are-text/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/bytea-defaults-verify/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/bytea-defaults-verify/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/cache-middleware-control-primitives/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/cache-middleware-control-primitives/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/cache-middleware-design-record/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/collection-keeps-its-class/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/collection-keeps-its-class/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/contract-dts-imports-only-used-types/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/data-type-in-contract/app/instructions.md (100%) create mode 100644 upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/app/scripts/data-type-in-contract.ts rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/data-type-in-contract/extension/instructions.md (100%) create mode 100644 upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/extension/scripts/data-type-in-contract.ts rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/data-types-declare-names/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/data-types-declare-names/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/domain-types-match-their-columns/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/domain-types-match-their-columns/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/enum-members-written-as-stored/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/line-comments-in-raw-sql/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/line-comments-in-raw-sql/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/mongo-nullable-list-containers/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/nullable-scalar-lists/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/nullable-scalar-lists/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/postgres-driver-server-text/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/prisma6-bytes-objectid-is-hex/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/prisma6-int-is-a-long/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/prisma7-migration-handover/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/query-fragment-helpers/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/query-fragment-helpers/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/rename-constraint-call/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/runtime-closed-error/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/select-row-locking-capabilities/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/select-row-locking-capabilities/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/sql-is-a-data-type/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/sql-is-a-data-type/extension/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/variant-takes-discriminator-value/app/instructions.md (100%) rename upgrade-instructions/{pending => releases/8.0.0-rc.14-to-8.0.0-rc.15/sources}/variant-takes-discriminator-value/extension/instructions.md (100%) diff --git a/apps/lsp-playground/package.json b/apps/lsp-playground/package.json index 68583ecab0fc..b1a92e3c62ec 100644 --- a/apps/lsp-playground/package.json +++ b/apps/lsp-playground/package.json @@ -1,6 +1,6 @@ { "name": "lsp-playground", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "private": true, "type": "module", "description": "Private dev playground: opens a PSL file in a browser Monaco editor wired to the Prisma 8 language server for live diagnostics.", @@ -24,7 +24,7 @@ "@codingame/monaco-vscode-textmate-service-override": "^25.1.2", "@codingame/monaco-vscode-theme-defaults-default-extension": "^25.1.2", "@codingame/monaco-vscode-theme-service-override": "^25.1.2", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "monaco-editor": "^0.56.0", "monaco-languageclient": "^10.7.0", "vscode": "npm:@codingame/monaco-vscode-extension-api@^25.1.2", @@ -36,7 +36,7 @@ }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/ws": "^8.5.13", "puppeteer-core": "^25.4.0", diff --git a/apps/telemetry-backend/package.json b/apps/telemetry-backend/package.json index d5a5e0377164..9bbbc46c996d 100644 --- a/apps/telemetry-backend/package.json +++ b/apps/telemetry-backend/package.json @@ -1,6 +1,6 @@ { "name": "telemetry-backend", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "private": true, "type": "module", "engines": { @@ -22,7 +22,7 @@ "clean": "rm -rf dist coverage" }, "dependencies": { - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "arktype": "catalog:", "evlog": "^2.24.0" }, @@ -30,8 +30,8 @@ "@prisma/cli-engine": "0.6.2", "@prisma/compute-sdk": "^0.43.0", "@prisma/management-api-sdk": "^1.76.0", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/bun": "^1.2.18", "@types/node": "catalog:", "@types/pg": "catalog:", diff --git a/examples/bundle-size/package.json b/examples/bundle-size/package.json index c6013246cdc9..9f5e0b9761ca 100644 --- a/examples/bundle-size/package.json +++ b/examples/bundle-size/package.json @@ -2,7 +2,7 @@ "name": "bundle-size", "private": true, "type": "module", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "engines": { "node": ">=24" }, @@ -22,16 +22,16 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-mongo": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-mongo": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "mongodb": "catalog:", "pg": "catalog:" }, "devDependencies": { "@prisma/cli-engine": "0.6.2", "@prisma/dev": "catalog:", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@size-limit/file": "^12.1.0", "@types/node": "catalog:", "@types/pg": "catalog:", diff --git a/examples/bundle-size/src/mongo/package.json b/examples/bundle-size/src/mongo/package.json index be2cb916a988..e972bf27a87a 100644 --- a/examples/bundle-size/src/mongo/package.json +++ b/examples/bundle-size/src/mongo/package.json @@ -2,9 +2,9 @@ "name": "bundle-size-mongo", "private": true, "type": "module", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "description": "The Mongo half of the bundle-size example. Its own manifest because emission reads the nearest one to decide which package names generated files import, and this example measures two databases that must not name each other's facade.", "dependencies": { - "@prisma/orm-mongo": "workspace:8.0.0-rc.14" + "@prisma/orm-mongo": "workspace:8.0.0-rc.15" } } diff --git a/examples/bundle-size/src/postgres/package.json b/examples/bundle-size/src/postgres/package.json index 85ed6605d0a4..74b285054b56 100644 --- a/examples/bundle-size/src/postgres/package.json +++ b/examples/bundle-size/src/postgres/package.json @@ -2,9 +2,9 @@ "name": "bundle-size-postgres", "private": true, "type": "module", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "description": "The Postgres half of the bundle-size example. Its own manifest because emission reads the nearest one to decide which package names generated files import, and this example measures two databases that must not name each other's facade.", "dependencies": { - "@prisma/orm-postgres": "workspace:8.0.0-rc.14" + "@prisma/orm-postgres": "workspace:8.0.0-rc.15" } } diff --git a/examples/mongo-blog-leaderboard/package.json b/examples/mongo-blog-leaderboard/package.json index dda18f8f573d..3d2613ff25d8 100644 --- a/examples/mongo-blog-leaderboard/package.json +++ b/examples/mongo-blog-leaderboard/package.json @@ -15,12 +15,12 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-mongo": "workspace:8.0.0-rc.14", + "@prisma/orm-mongo": "workspace:8.0.0-rc.15", "mongodb": "catalog:" }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "mongodb-memory-server": "catalog:", "tsx": "catalog:", @@ -28,5 +28,5 @@ "vite": "catalog:", "vitest": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/mongo-demo/package.json b/examples/mongo-demo/package.json index 778a16e83485..628541e152a6 100644 --- a/examples/mongo-demo/package.json +++ b/examples/mongo-demo/package.json @@ -17,16 +17,16 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-extension-middleware-cache": "workspace:8.0.0-rc.14", - "@prisma/orm-mongo": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-middleware-cache": "workspace:8.0.0-rc.15", + "@prisma/orm-mongo": "workspace:8.0.0-rc.15", "mongodb": "catalog:", "react": "^19.2.8", "react-dom": "^19.2.8" }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/react": "^19.2.18", "@types/react-dom": "^19.2.4", @@ -38,5 +38,5 @@ "vite": "catalog:", "vitest": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/multi-extension-monorepo/package.json b/examples/multi-extension-monorepo/package.json index 6348a63e1e47..e432aaa19191 100644 --- a/examples/multi-extension-monorepo/package.json +++ b/examples/multi-extension-monorepo/package.json @@ -1,6 +1,6 @@ { "name": "multi-extension-monorepo", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "private": true, "type": "module", "engines": { @@ -15,12 +15,12 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-postgres": "workspace:8.0.0-rc.14" + "@prisma/orm-postgres": "workspace:8.0.0-rc.15" }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/examples/paradedb-demo/package.json b/examples/paradedb-demo/package.json index d85251bafc45..8f48989ca518 100644 --- a/examples/paradedb-demo/package.json +++ b/examples/paradedb-demo/package.json @@ -18,21 +18,21 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-extension-paradedb": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-paradedb": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "dotenv": "^17.4.2", "pg": "catalog:" }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/pg": "catalog:", "tsx": "catalog:", "typescript": "catalog:", "vitest": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/prisma-8-cloudflare-worker/package.json b/examples/prisma-8-cloudflare-worker/package.json index 88cc8cf70d53..9ef6789968c5 100644 --- a/examples/prisma-8-cloudflare-worker/package.json +++ b/examples/prisma-8-cloudflare-worker/package.json @@ -21,7 +21,7 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "arktype": "catalog:", "pg": "catalog:", "temporal-polyfill": "^1.0.4" @@ -30,7 +30,7 @@ "@cloudflare/vitest-pool-workers": "0.20.3", "@cloudflare/workers-types": "5.20260804.1", "@prisma/cli-engine": "0.6.2", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/pg": "catalog:", "tsx": "catalog:", @@ -38,5 +38,5 @@ "vitest": "^4.1.10", "wrangler": "4.119.0" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/prisma-8-demo-sqlite/package.json b/examples/prisma-8-demo-sqlite/package.json index 173c8c792556..ef7dc847c5e8 100644 --- a/examples/prisma-8-demo-sqlite/package.json +++ b/examples/prisma-8-demo-sqlite/package.json @@ -15,16 +15,16 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-sqlite": "workspace:8.0.0-rc.14", + "@prisma/orm-sqlite": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "dotenv": "^17.4.2" }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "tsx": "catalog:", "typescript": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/prisma-8-demo/package.json b/examples/prisma-8-demo/package.json index aecc67d55887..ec673228e93d 100644 --- a/examples/prisma-8-demo/package.json +++ b/examples/prisma-8-demo/package.json @@ -22,9 +22,9 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-extension-middleware-cache": "workspace:8.0.0-rc.14", - "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-middleware-cache": "workspace:8.0.0-rc.15", + "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "dotenv": "^17.4.2", "pg": "catalog:", @@ -34,8 +34,8 @@ "devDependencies": { "@prisma/cli-engine": "0.6.2", "@prisma/dev": "catalog:", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/node": "catalog:", @@ -50,5 +50,5 @@ "vite": "catalog:", "vitest": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/prisma-8-postgis-demo/package.json b/examples/prisma-8-postgis-demo/package.json index eaba63f39c86..34b22ba95bb3 100644 --- a/examples/prisma-8-postgis-demo/package.json +++ b/examples/prisma-8-postgis-demo/package.json @@ -21,8 +21,8 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-extension-postgis": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-postgis": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "dotenv": "^17.4.2", "leaflet": "^1.9.4", @@ -34,8 +34,8 @@ }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/leaflet": "^1.9.22", "@types/node": "catalog:", "@types/pg": "catalog:", @@ -45,5 +45,5 @@ "typescript": "catalog:", "vitest": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/prisma7-adoption/package.json b/examples/prisma7-adoption/package.json index 3a813a67753e..7c5ab3f7f5a0 100644 --- a/examples/prisma7-adoption/package.json +++ b/examples/prisma7-adoption/package.json @@ -23,7 +23,7 @@ "dependencies": { "@prisma/adapter-pg": "7.10.0", "@prisma/client": "7.10.0", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "dotenv": "^17.4.2", "pg": "catalog:" }, @@ -31,14 +31,14 @@ "@prisma/cli-engine": "0.6.2", "@prisma/dev": "catalog:", "@prisma/prisma7": "7.10.0", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/pg": "catalog:", - "prisma": "workspace:@internal/cli@8.0.0-rc.14", + "prisma": "workspace:@internal/cli@8.0.0-rc.15", "tsx": "catalog:", "typescript": "catalog:", "vitest": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/react-router-demo/package.json b/examples/react-router-demo/package.json index 31db058a40b9..f25b41a0b5cd 100644 --- a/examples/react-router-demo/package.json +++ b/examples/react-router-demo/package.json @@ -19,7 +19,7 @@ "lint:fix": "biome check --write ." }, "dependencies": { - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "@react-router/node": "^8.1.0", "@react-router/serve": "^8.1.0", "dotenv": "^17.4.2", @@ -33,8 +33,8 @@ "@prisma/cli-engine": "0.6.2", "@prisma/dev": "catalog:", "@react-router/dev": "^8.1.0", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/pg": "catalog:", "@types/react": "^19.2.18", @@ -46,5 +46,5 @@ "vite-tsconfig-paths": "^6.1.1", "vitest": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/retail-store/package.json b/examples/retail-store/package.json index 474218c8ea8f..c39edbd77683 100644 --- a/examples/retail-store/package.json +++ b/examples/retail-store/package.json @@ -18,8 +18,8 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-extension-middleware-cache": "workspace:8.0.0-rc.14", - "@prisma/orm-mongo": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-middleware-cache": "workspace:8.0.0-rc.15", + "@prisma/orm-mongo": "workspace:8.0.0-rc.15", "@radix-ui/react-dropdown-menu": "^2.1.24", "@radix-ui/react-label": "^2.1.15", "@radix-ui/react-radio-group": "^1.4.7", @@ -40,8 +40,8 @@ }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/react": "^19.2.18", "@types/react-dom": "^19.2.4", @@ -51,5 +51,5 @@ "typescript": "catalog:", "vitest": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/supabase/package.json b/examples/supabase/package.json index ea71380e4c34..f95809d82a4e 100644 --- a/examples/supabase/package.json +++ b/examples/supabase/package.json @@ -12,20 +12,20 @@ "lint": "biome check . --error-on-warnings" }, "dependencies": { - "@prisma/orm-extension-supabase": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-supabase": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "jose": "^6", "pg": "catalog:" }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/pg": "catalog:", "tsx": "catalog:", "typescript": "catalog:", "vitest": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/examples/supabase/src/contract.d.ts b/examples/supabase/src/contract.d.ts index ee58ac118d7e..30733824cc9a 100644 --- a/examples/supabase/src/contract.d.ts +++ b/examples/supabase/src/contract.d.ts @@ -421,7 +421,7 @@ type ContractBase = Omit< readonly id: 'supabase'; readonly kind: 'extension'; readonly targetId: 'postgres'; - readonly version: '8.0.0-rc.14'; + readonly version: '8.0.0-rc.15'; }; }; readonly execution: { diff --git a/examples/supabase/src/contract.json b/examples/supabase/src/contract.json index 8c89bf6dc162..2970b1153107 100644 --- a/examples/supabase/src/contract.json +++ b/examples/supabase/src/contract.json @@ -241,7 +241,7 @@ "id": "supabase", "kind": "extension", "targetId": "postgres", - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } }, "meta": {}, diff --git a/package.json b/package.json index 6ae68062549f..31eb222bb70d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@internal/monorepo", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "private": true, "type": "module", "packageManager": "pnpm@10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a", @@ -77,10 +77,10 @@ "devDependencies": { "@biomejs/biome": "2.5.8", "@cursor/sdk": "^1.0.26", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@vitest/coverage-v8": "5.0.0-rc.2", "arktype": "catalog:", diff --git a/packages/0-config/tsconfig/package.json b/packages/0-config/tsconfig/package.json index e5ce30a78ec6..35ae0834e4b6 100644 --- a/packages/0-config/tsconfig/package.json +++ b/packages/0-config/tsconfig/package.json @@ -2,7 +2,7 @@ "name": "@repo/tsconfig", "private": true, "sideEffects": false, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "description": "Base tsconfig providing package for the monorepo", "license": "MIT", "files": [ diff --git a/packages/0-config/tsdown/package.json b/packages/0-config/tsdown/package.json index 29cd0eddcaee..d9294dbe3489 100644 --- a/packages/0-config/tsdown/package.json +++ b/packages/0-config/tsdown/package.json @@ -3,12 +3,12 @@ "type": "module", "private": true, "sideEffects": false, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "description": "Base tsdown configuration for the monorepo", "license": "MIT", "devDependencies": { - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "es-module-lexer": "^2.3.1", "tsdown": "catalog:", "typescript": "catalog:" diff --git a/packages/0-shared/extension-author-tools/package.json b/packages/0-shared/extension-author-tools/package.json index 67e20c3b66a3..7c572dd412ef 100644 --- a/packages/0-shared/extension-author-tools/package.json +++ b/packages/0-shared/extension-author-tools/package.json @@ -1,7 +1,7 @@ { "name": "@internal/extension-author-tools", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "description": "CLI tools that pair with the extension-upgrade branch of the prisma-8 agent skill — including `prisma-8-check-pins`, the CI guard that asserts every `@internal/*` peerDep on an extension package is exact-version-pinned. Future tools for extension authors employing the upgrade skill ship from this package.", diff --git a/packages/0-shared/publish-surface/package.json b/packages/0-shared/publish-surface/package.json index adfaee76c165..7f5803d87fde 100644 --- a/packages/0-shared/publish-surface/package.json +++ b/packages/0-shared/publish-surface/package.json @@ -1,6 +1,6 @@ { "name": "@internal/publish-surface", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "private": true, "license": "Apache-2.0", "type": "module", @@ -16,7 +16,7 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/0-foundation/contract/package.json b/packages/1-framework/0-foundation/contract/package.json index d3f6d323bcc3..7886df30a93f 100644 --- a/packages/1-framework/0-foundation/contract/package.json +++ b/packages/1-framework/0-foundation/contract/package.json @@ -1,7 +1,7 @@ { "name": "@internal/contract", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,13 +16,13 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/utils": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "catalog:" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/0-foundation/utils/package.json b/packages/1-framework/0-foundation/utils/package.json index 39e010571ec3..41664e0e4570 100644 --- a/packages/1-framework/0-foundation/utils/package.json +++ b/packages/1-framework/0-foundation/utils/package.json @@ -1,7 +1,7 @@ { "name": "@internal/utils", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,8 +14,8 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/1-core/config/package.json b/packages/1-framework/1-core/config/package.json index 4f980ca4f84d..e4d1abe9927b 100644 --- a/packages/1-framework/1-core/config/package.json +++ b/packages/1-framework/1-core/config/package.json @@ -1,7 +1,7 @@ { "name": "@internal/config", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,16 +16,16 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "pathe": "^2.0.3", "tinyglobby": "catalog:" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/1-core/errors/package.json b/packages/1-framework/1-core/errors/package.json index d9be3334944c..68ecdbb679a1 100644 --- a/packages/1-framework/1-core/errors/package.json +++ b/packages/1-framework/1-core/errors/package.json @@ -1,7 +1,7 @@ { "name": "@internal/errors", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,12 +16,12 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/1-core/framework-components/package.json b/packages/1-framework/1-core/framework-components/package.json index 1aef0ad1a7c2..36eca3d21680 100644 --- a/packages/1-framework/1-core/framework-components/package.json +++ b/packages/1-framework/1-core/framework-components/package.json @@ -1,7 +1,7 @@ { "name": "@internal/framework-components", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,16 +14,16 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/ts-render": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/ts-render": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "catalog:" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/1-core/operations/package.json b/packages/1-framework/1-core/operations/package.json index fd2ffb55f3b5..6d1cc8026b1c 100644 --- a/packages/1-framework/1-core/operations/package.json +++ b/packages/1-framework/1-core/operations/package.json @@ -1,7 +1,7 @@ { "name": "@internal/operations", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,12 +16,12 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/1-core/ts-render/package.json b/packages/1-framework/1-core/ts-render/package.json index 16264ab9d0c8..96165737552b 100644 --- a/packages/1-framework/1-core/ts-render/package.json +++ b/packages/1-framework/1-core/ts-render/package.json @@ -1,7 +1,7 @@ { "name": "@internal/ts-render", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,11 +16,11 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/2-authoring/contract/package.json b/packages/1-framework/2-authoring/contract/package.json index 1ff8d55f2e6a..134bea746f06 100644 --- a/packages/1-framework/2-authoring/contract/package.json +++ b/packages/1-framework/2-authoring/contract/package.json @@ -1,7 +1,7 @@ { "name": "@internal/contract-authoring", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,13 +16,13 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/2-authoring/ids/package.json b/packages/1-framework/2-authoring/ids/package.json index bff9b0200d0c..dc79ecbd7791 100644 --- a/packages/1-framework/2-authoring/ids/package.json +++ b/packages/1-framework/2-authoring/ids/package.json @@ -1,7 +1,7 @@ { "name": "@internal/ids", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,14 +16,14 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "uniku": "^0.5.0" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/2-authoring/psl-parser/package.json b/packages/1-framework/2-authoring/psl-parser/package.json index 482dfe657bac..89c5ed945ae5 100644 --- a/packages/1-framework/2-authoring/psl-parser/package.json +++ b/packages/1-framework/2-authoring/psl-parser/package.json @@ -1,7 +1,7 @@ { "name": "@internal/psl-parser", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,14 +16,14 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/2-authoring/psl-printer/package.json b/packages/1-framework/2-authoring/psl-printer/package.json index 22d6b7dc7afc..68e3bbb172f0 100644 --- a/packages/1-framework/2-authoring/psl-printer/package.json +++ b/packages/1-framework/2-authoring/psl-printer/package.json @@ -1,7 +1,7 @@ { "name": "@internal/psl-printer", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,14 +16,14 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/1-framework/3-tooling/cli-telemetry/package.json b/packages/1-framework/3-tooling/cli-telemetry/package.json index 34c374bb634f..5c3bbffb41ce 100644 --- a/packages/1-framework/3-tooling/cli-telemetry/package.json +++ b/packages/1-framework/3-tooling/cli-telemetry/package.json @@ -1,7 +1,7 @@ { "name": "@internal/cli-telemetry", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,18 +16,18 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/config-loader": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/config-loader": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@vercel/detect-agent": "^1.2.4", "arktype": "catalog:", "c12": "^3.3.4", "pathe": "^2.0.3" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/1-framework/3-tooling/cli/package.json b/packages/1-framework/3-tooling/cli/package.json index 2ef5383df46c..51022389b233 100644 --- a/packages/1-framework/3-tooling/cli/package.json +++ b/packages/1-framework/3-tooling/cli/package.json @@ -1,7 +1,7 @@ { "name": "@internal/cli", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -20,19 +20,19 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/cli-telemetry": "workspace:8.0.0-rc.14", - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/config-loader": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/language-server": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/psl-printer": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/cli-telemetry": "workspace:8.0.0-rc.15", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/config-loader": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/language-server": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/psl-printer": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "ci-info": "^4.3.1", "clipanion": "4.0.0-rc.4", @@ -47,15 +47,15 @@ "wrap-ansi": "^10.0.0" }, "devDependencies": { - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-emitter": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-emitter": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/1-framework/3-tooling/cli/test/fixture-app/package.json b/packages/1-framework/3-tooling/cli/test/fixture-app/package.json index 43b042c7e17f..d108ce216aef 100644 --- a/packages/1-framework/3-tooling/cli/test/fixture-app/package.json +++ b/packages/1-framework/3-tooling/cli/test/fixture-app/package.json @@ -3,12 +3,12 @@ "private": true, "type": "module", "dependencies": { - "@prisma/orm-mongo": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-mongo": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "dotenv": "^17.4.2", "mongodb": "catalog:", "pg": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/packages/1-framework/3-tooling/config-loader/package.json b/packages/1-framework/3-tooling/config-loader/package.json index f9b7027410dd..63d1223e6409 100644 --- a/packages/1-framework/3-tooling/config-loader/package.json +++ b/packages/1-framework/3-tooling/config-loader/package.json @@ -1,7 +1,7 @@ { "name": "@internal/config-loader", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,10 +16,10 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "c12": "^3.3.4", "pathe": "^2.0.3", @@ -27,9 +27,9 @@ }, "devDependencies": { "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/1-framework/3-tooling/emitter/package.json b/packages/1-framework/3-tooling/emitter/package.json index 48dd814431f4..33ef6862cd3d 100644 --- a/packages/1-framework/3-tooling/emitter/package.json +++ b/packages/1-framework/3-tooling/emitter/package.json @@ -1,7 +1,7 @@ { "name": "@internal/emitter", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -15,20 +15,20 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/ts-render": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/ts-render": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "prettier": "^3.9.6" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/1-framework/3-tooling/language-server/package.json b/packages/1-framework/3-tooling/language-server/package.json index 3dc4dd112f8a..aed2ff989af9 100644 --- a/packages/1-framework/3-tooling/language-server/package.json +++ b/packages/1-framework/3-tooling/language-server/package.json @@ -1,7 +1,7 @@ { "name": "@internal/language-server", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,20 +16,20 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/config-loader": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/config-loader": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "pathe": "^2.0.3", "vscode-languageserver": "catalog:", "vscode-languageserver-textdocument": "catalog:" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/1-framework/3-tooling/migration/package.json b/packages/1-framework/3-tooling/migration/package.json index c31574929f7f..2db42581646c 100644 --- a/packages/1-framework/3-tooling/migration/package.json +++ b/packages/1-framework/3-tooling/migration/package.json @@ -1,7 +1,7 @@ { "name": "@internal/migration-tools", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,18 +16,18 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "catalog:", "pathe": "^2.0.3", "prettier": "^3.9.6" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 c4896c2e9dff..aea455eb9df9 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 @@ -1,7 +1,7 @@ { "name": "@internal/vite-plugin-contract-emit", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -19,15 +19,15 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/config-loader": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/config-loader": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", "pathe": "^2.0.3" }, "devDependencies": { - "@internal/utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", 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 32a321bd4574..3be8767b4fa8 100644 --- a/packages/2-mongo-family/1-foundation/mongo-codec/package.json +++ b/packages/2-mongo-family/1-foundation/mongo-codec/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-codec", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,14 +16,14 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 8b7f03645110..c1f95bd0e606 100644 --- a/packages/2-mongo-family/1-foundation/mongo-contract/package.json +++ b/packages/2-mongo-family/1-foundation/mongo-contract/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-contract", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,18 +16,18 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "catalog:", "mongodb": "catalog:" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 f1b30a5ab531..3e13d59f3978 100644 --- a/packages/2-mongo-family/1-foundation/mongo-value/package.json +++ b/packages/2-mongo-family/1-foundation/mongo-value/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-value", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -19,8 +19,8 @@ "mongodb": "catalog:" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 848f2fbb0428..aaf76e3bc87f 100644 --- a/packages/2-mongo-family/2-authoring/contract-prisma6/package.json +++ b/packages/2-mongo-family/2-authoring/contract-prisma6/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-contract-prisma6", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -20,24 +20,24 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-psl": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-psl": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "pathe": "^2.0.3" }, "devDependencies": { - "@internal/adapter-mongo": "workspace:8.0.0-rc.14", - "@internal/driver-mongo": "workspace:8.0.0-rc.14", - "@internal/family-mongo": "workspace:8.0.0-rc.14", - "@internal/target-mongo": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/adapter-mongo": "workspace:8.0.0-rc.15", + "@internal/driver-mongo": "workspace:8.0.0-rc.15", + "@internal/family-mongo": "workspace:8.0.0-rc.15", + "@internal/target-mongo": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", 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 381f79e96025..aaa1a3b8980c 100644 --- a/packages/2-mongo-family/2-authoring/contract-psl/package.json +++ b/packages/2-mongo-family/2-authoring/contract-psl/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-contract-psl", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -15,21 +15,21 @@ "clean": "rm -rf dist coverage" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "mongodb": "catalog:", "pathe": "^2.0.3" }, "devDependencies": { - "@internal/mongo-contract-ts": "workspace:8.0.0-rc.13", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/mongo-contract-ts": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 03dd8adef9e1..024bfe9f0689 100644 --- a/packages/2-mongo-family/2-authoring/contract-ts/package.json +++ b/packages/2-mongo-family/2-authoring/contract-ts/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-contract-ts", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,20 +16,20 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "pathe": "^2.0.3" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-mongo-family/3-tooling/emitter/package.json b/packages/2-mongo-family/3-tooling/emitter/package.json index 305ffe3c51bd..27d3521db37d 100644 --- a/packages/2-mongo-family/3-tooling/emitter/package.json +++ b/packages/2-mongo-family/3-tooling/emitter/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-emitter", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,17 +16,17 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 590d6addddbc..7e5db9ca8450 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 @@ -1,7 +1,7 @@ { "name": "@internal/mongo-schema-ir", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,15 +16,15 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", "mongodb": "catalog:" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 6c2c3d69f91a..0a4c2ad3f7e9 100644 --- a/packages/2-mongo-family/4-query/query-ast/package.json +++ b/packages/2-mongo-family/4-query/query-ast/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-query-ast", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,17 +16,17 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "mongodb": "catalog:" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 ecae996db730..80a8ddff6f96 100644 --- a/packages/2-mongo-family/5-query-builders/orm/package.json +++ b/packages/2-mongo-family/5-query-builders/orm/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-orm", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,22 +16,22 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-query-builder": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-query-builder": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@internal/adapter-mongo": "workspace:8.0.0-rc.14", - "@internal/driver-mongo": "workspace:8.0.0-rc.14", - "@internal/mongo-runtime": "workspace:8.0.0-rc.14", - "@internal/target-mongo": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/adapter-mongo": "workspace:8.0.0-rc.15", + "@internal/driver-mongo": "workspace:8.0.0-rc.15", + "@internal/mongo-runtime": "workspace:8.0.0-rc.15", + "@internal/target-mongo": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "mongodb": "catalog:", "mongodb-memory-server": "catalog:", "tsdown": "catalog:", 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 2e0d40f10151..6ba5125bce98 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 @@ -1,7 +1,7 @@ { "name": "@internal/mongo-query-builder", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,15 +16,15 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 5f40ef17d068..dbdd6310832d 100644 --- a/packages/2-mongo-family/6-transport/mongo-lowering/package.json +++ b/packages/2-mongo-family/6-transport/mongo-lowering/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-lowering", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,14 +16,14 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-wire": "workspace:8.0.0-rc.14" + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-wire": "workspace:8.0.0-rc.15" }, "devDependencies": { "mongodb": "catalog:", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 3ffb5cb2b18e..715fd569eb51 100644 --- a/packages/2-mongo-family/6-transport/mongo-wire/package.json +++ b/packages/2-mongo-family/6-transport/mongo-wire/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-wire", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,13 +16,13 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-mongo-family/7-runtime/package.json b/packages/2-mongo-family/7-runtime/package.json index 19e2830ac98d..4a3a56da3974 100644 --- a/packages/2-mongo-family/7-runtime/package.json +++ b/packages/2-mongo-family/7-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo-runtime", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,21 +16,21 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-codec": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-lowering": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/mongo-wire": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-codec": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-lowering": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/mongo-wire": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@internal/mongo-query-builder": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/mongo-query-builder": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "mongodb": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/2-mongo-family/9-family/package.json b/packages/2-mongo-family/9-family/package.json index b3732b0768d9..6d61a8dbbadc 100644 --- a/packages/2-mongo-family/9-family/package.json +++ b/packages/2-mongo-family/9-family/package.json @@ -1,7 +1,7 @@ { "name": "@internal/family-mongo", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,30 +14,30 @@ "clean": "rm -rf dist coverage" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-psl": "workspace:8.0.0-rc.14", - "@internal/mongo-emitter": "workspace:8.0.0-rc.14", - "@internal/mongo-lowering": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-schema-ir": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-psl": "workspace:8.0.0-rc.15", + "@internal/mongo-emitter": "workspace:8.0.0-rc.15", + "@internal/mongo-lowering": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-schema-ir": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "catalog:", "mongodb": "catalog:", "pathe": "^2.0.3" }, "devDependencies": { - "@internal/mongo-contract-ts": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/mongo-contract-ts": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-sql/1-core/contract/package.json b/packages/2-sql/1-core/contract/package.json index 75ba27b5da7f..092bd6bfbeb8 100644 --- a/packages/2-sql/1-core/contract/package.json +++ b/packages/2-sql/1-core/contract/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-contract", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,16 +16,16 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-sql/1-core/errors/package.json b/packages/2-sql/1-core/errors/package.json index bb046a8a8be8..d3de869e15eb 100644 --- a/packages/2-sql/1-core/errors/package.json +++ b/packages/2-sql/1-core/errors/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-errors", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,9 +16,9 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-sql/1-core/operations/package.json b/packages/2-sql/1-core/operations/package.json index 768e4f16decc..49c9a434327a 100644 --- a/packages/2-sql/1-core/operations/package.json +++ b/packages/2-sql/1-core/operations/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-operations", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,15 +16,15 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/emitter": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-sql/1-core/schema-ir/package.json b/packages/2-sql/1-core/schema-ir/package.json index a3ccdc1d5364..90544a6ec3ab 100644 --- a/packages/2-sql/1-core/schema-ir/package.json +++ b/packages/2-sql/1-core/schema-ir/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-schema-ir", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,14 +16,14 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-sql/2-authoring/contract-prisma7/package.json b/packages/2-sql/2-authoring/contract-prisma7/package.json index bc5bbcd7c586..ce33c5fbe097 100644 --- a/packages/2-sql/2-authoring/contract-prisma7/package.json +++ b/packages/2-sql/2-authoring/contract-prisma7/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-contract-prisma7", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -20,25 +20,25 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "pathe": "^2.0.3" }, "devDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/config-loader": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/config-loader": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/2-sql/2-authoring/contract-psl/package.json b/packages/2-sql/2-authoring/contract-psl/package.json index 009968614260..4233dd88823a 100644 --- a/packages/2-sql/2-authoring/contract-psl/package.json +++ b/packages/2-sql/2-authoring/contract-psl/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-contract-psl", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,21 +16,21 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "pathe": "^2.0.3", "tinyglobby": "catalog:" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/2-sql/2-authoring/contract-ts/package.json b/packages/2-sql/2-authoring/contract-ts/package.json index 927775c7e45b..8022a246f435 100644 --- a/packages/2-sql/2-authoring/contract-ts/package.json +++ b/packages/2-sql/2-authoring/contract-ts/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-contract-ts", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -17,23 +17,23 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "pathe": "^2.0.3", "ts-toolbelt": "^9.6.0" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/pg": "catalog:", "pg": "catalog:", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsdown": "workspace:8.0.0-rc.15", "ajv": "catalog:", "tsdown": "catalog:", "tsx": "catalog:", diff --git a/packages/2-sql/3-tooling/emitter/package.json b/packages/2-sql/3-tooling/emitter/package.json index 0b22fb26d34c..64debbd816e8 100644 --- a/packages/2-sql/3-tooling/emitter/package.json +++ b/packages/2-sql/3-tooling/emitter/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-contract-emitter", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,17 +16,17 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-sql/4-lanes/relational-core/package.json b/packages/2-sql/4-lanes/relational-core/package.json index 82ef73135149..97c84d37a65b 100644 --- a/packages/2-sql/4-lanes/relational-core/package.json +++ b/packages/2-sql/4-lanes/relational-core/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-relational-core", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,21 +16,21 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "catalog:", "ts-toolbelt": "^9.6.0" }, "devDependencies": { - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-sql/4-lanes/sql-builder/package.json b/packages/2-sql/4-lanes/sql-builder/package.json index 0e609d854025..5d7dfdd3fd90 100644 --- a/packages/2-sql/4-lanes/sql-builder/package.json +++ b/packages/2-sql/4-lanes/sql-builder/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-builder", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -18,21 +18,21 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/ids": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/ids": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-sql/5-runtime/package.json b/packages/2-sql/5-runtime/package.json index c4c72f09911f..8ba795aad247 100644 --- a/packages/2-sql/5-runtime/package.json +++ b/packages/2-sql/5-runtime/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-runtime", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,22 +16,22 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/ids": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/ids": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", "arktype": "^2.2.2" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/pg": "catalog:", "pg": "catalog:", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/2-sql/9-family/package.json b/packages/2-sql/9-family/package.json index bbd83dc785c8..184f2fe7c8d8 100644 --- a/packages/2-sql/9-family/package.json +++ b/packages/2-sql/9-family/package.json @@ -1,7 +1,7 @@ { "name": "@internal/family-sql", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,30 +14,30 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-emitter": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-emitter": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2", "pluralize": "^8.0.0" }, "devDependencies": { - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/psl-printer": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/psl-printer": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/pluralize": "^0.0.33", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/3-extensions/arktype-json/package.json b/packages/3-extensions/arktype-json/package.json index c27416a74dc7..6f61cc51fbb1 100644 --- a/packages/3-extensions/arktype-json/package.json +++ b/packages/3-extensions/arktype-json/package.json @@ -1,7 +1,7 @@ { "name": "@internal/extension-arktype-json", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -15,25 +15,25 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "~2.2.2" }, "devDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/postgres-codec-testkit": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/postgres-codec-testkit": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/3-extensions/middleware-cache/package.json b/packages/3-extensions/middleware-cache/package.json index 3653d1069006..cdc785f43cf9 100644 --- a/packages/3-extensions/middleware-cache/package.json +++ b/packages/3-extensions/middleware-cache/package.json @@ -1,7 +1,7 @@ { "name": "@internal/middleware-cache", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,13 +16,13 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/3-extensions/mongo/package.json b/packages/3-extensions/mongo/package.json index 7f29f16f7a8c..f3169cb58fd1 100644 --- a/packages/3-extensions/mongo/package.json +++ b/packages/3-extensions/mongo/package.json @@ -1,7 +1,7 @@ { "name": "@internal/mongo", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,34 +16,34 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/adapter-mongo": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/driver-mongo": "workspace:8.0.0-rc.14", - "@internal/family-mongo": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-prisma6": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-psl": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-ts": "workspace:8.0.0-rc.14", - "@internal/mongo-orm": "workspace:8.0.0-rc.14", - "@internal/mongo-query-builder": "workspace:8.0.0-rc.14", - "@internal/mongo-runtime": "workspace:8.0.0-rc.14", - "@internal/target-mongo": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/adapter-mongo": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/driver-mongo": "workspace:8.0.0-rc.15", + "@internal/family-mongo": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-prisma6": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-psl": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-ts": "workspace:8.0.0-rc.15", + "@internal/mongo-orm": "workspace:8.0.0-rc.15", + "@internal/mongo-query-builder": "workspace:8.0.0-rc.15", + "@internal/mongo-runtime": "workspace:8.0.0-rc.15", + "@internal/target-mongo": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "mongodb-connection-string-url": "catalog:", "pathe": "^2.0.3", "tinyglobby": "catalog:" }, "devDependencies": { "mongodb": "catalog:", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/mongo-emitter": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/mongo-emitter": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "mongodb-memory-server": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/3-extensions/paradedb/package.json b/packages/3-extensions/paradedb/package.json index 54ea978f9fb7..9f1dda590a55 100644 --- a/packages/3-extensions/paradedb/package.json +++ b/packages/3-extensions/paradedb/package.json @@ -1,7 +1,7 @@ { "name": "@internal/extension-paradedb", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,28 +16,28 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/3-extensions/pgvector/package.json b/packages/3-extensions/pgvector/package.json index 082579db67a2..3f923c420310 100644 --- a/packages/3-extensions/pgvector/package.json +++ b/packages/3-extensions/pgvector/package.json @@ -1,7 +1,7 @@ { "name": "@internal/extension-pgvector", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,39 +16,39 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/postgres": "workspace:8.0.0-rc.14", - "@internal/postgres-codec-testkit": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/postgres": "workspace:8.0.0-rc.15", + "@internal/postgres-codec-testkit": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" }, "peerDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", "typescript": ">=5.9" }, "peerDependenciesMeta": { diff --git a/packages/3-extensions/postgis/package.json b/packages/3-extensions/postgis/package.json index 8e332204bd6e..e05fb25eb40a 100644 --- a/packages/3-extensions/postgis/package.json +++ b/packages/3-extensions/postgis/package.json @@ -1,7 +1,7 @@ { "name": "@internal/extension-postgis", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,31 +16,31 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/postgres": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/postgres": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/3-extensions/postgres/package.json b/packages/3-extensions/postgres/package.json index 9713f53801ab..07bec89665ef 100644 --- a/packages/3-extensions/postgres/package.json +++ b/packages/3-extensions/postgres/package.json @@ -1,7 +1,7 @@ { "name": "@internal/postgres", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -18,23 +18,23 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-prisma7": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/sql-builder": "workspace:8.0.0-rc.14", - "@internal/sql-orm-client": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-prisma7": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/sql-builder": "workspace:8.0.0-rc.15", + "@internal/sql-orm-client": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/pg": "catalog:", "arktype": "catalog:", @@ -43,14 +43,14 @@ "tinyglobby": "catalog:" }, "devDependencies": { - "@internal/config-loader": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/sql-contract-emitter": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/config-loader": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/sql-contract-emitter": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "temporal-polyfill": "^1.0.4", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/3-extensions/sql-orm-client/package.json b/packages/3-extensions/sql-orm-client/package.json index d2217f5ecf05..dd64aed5253c 100644 --- a/packages/3-extensions/sql-orm-client/package.json +++ b/packages/3-extensions/sql-orm-client/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sql-orm-client", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -18,27 +18,27 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-errors": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-errors": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/ids": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/ids": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/pg": "catalog:", "pathe": "^2.0.3", "pg": "catalog:", diff --git a/packages/3-extensions/sqlite/package.json b/packages/3-extensions/sqlite/package.json index d034fe4e0726..0a24223b9840 100644 --- a/packages/3-extensions/sqlite/package.json +++ b/packages/3-extensions/sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sqlite", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,30 +16,30 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/adapter-sqlite": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/driver-sqlite": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-builder": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/sql-orm-client": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/target-sqlite": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/adapter-sqlite": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/driver-sqlite": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-builder": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/sql-orm-client": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/target-sqlite": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "pathe": "^2.0.3", "tinyglobby": "catalog:" }, "devDependencies": { - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/3-extensions/supabase/package.json b/packages/3-extensions/supabase/package.json index b6cc7c123ae0..5b1158f1d86f 100644 --- a/packages/3-extensions/supabase/package.json +++ b/packages/3-extensions/supabase/package.json @@ -1,7 +1,7 @@ { "name": "@internal/extension-supabase", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -18,40 +18,40 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/postgres": "workspace:8.0.0-rc.14", - "@internal/sql-builder": "workspace:8.0.0-rc.14", - "@internal/sql-orm-client": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/postgres": "workspace:8.0.0-rc.15", + "@internal/sql-builder": "workspace:8.0.0-rc.15", + "@internal/sql-orm-client": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", "jose": "^6", "pg": "catalog:", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "@types/node": "catalog:", "@types/pg": "catalog:", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/psl-printer": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/psl-printer": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "ci-info": "^4.3.1", "tsdown": "catalog:", "tsx": "catalog:", @@ -59,7 +59,7 @@ "vitest": "catalog:" }, "peerDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", "typescript": ">=5.9" }, "peerDependenciesMeta": { diff --git a/packages/3-extensions/supabase/test/fixtures/example-app/contract.d.ts b/packages/3-extensions/supabase/test/fixtures/example-app/contract.d.ts index 46d98ebb9bbb..094281696d45 100644 --- a/packages/3-extensions/supabase/test/fixtures/example-app/contract.d.ts +++ b/packages/3-extensions/supabase/test/fixtures/example-app/contract.d.ts @@ -421,7 +421,7 @@ type ContractBase = Omit< readonly id: 'supabase'; readonly kind: 'extension'; readonly targetId: 'postgres'; - readonly version: '8.0.0-rc.14'; + readonly version: '8.0.0-rc.15'; }; }; readonly execution: { diff --git a/packages/3-extensions/supabase/test/fixtures/example-app/contract.json b/packages/3-extensions/supabase/test/fixtures/example-app/contract.json index 8c89bf6dc162..2970b1153107 100644 --- a/packages/3-extensions/supabase/test/fixtures/example-app/contract.json +++ b/packages/3-extensions/supabase/test/fixtures/example-app/contract.json @@ -241,7 +241,7 @@ "id": "supabase", "kind": "extension", "targetId": "postgres", - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } }, "meta": {}, diff --git a/packages/3-extensions/supabase/test/fixtures/no-policy/contract.d.ts b/packages/3-extensions/supabase/test/fixtures/no-policy/contract.d.ts index 3528d281aefa..aafe3e54ca0f 100644 --- a/packages/3-extensions/supabase/test/fixtures/no-policy/contract.d.ts +++ b/packages/3-extensions/supabase/test/fixtures/no-policy/contract.d.ts @@ -421,7 +421,7 @@ type ContractBase = Omit< readonly id: 'supabase'; readonly kind: 'extension'; readonly targetId: 'postgres'; - readonly version: '8.0.0-rc.14'; + readonly version: '8.0.0-rc.15'; }; }; readonly execution: { diff --git a/packages/3-extensions/supabase/test/fixtures/no-policy/contract.json b/packages/3-extensions/supabase/test/fixtures/no-policy/contract.json index dd85c5f2ed5b..1d03c5923445 100644 --- a/packages/3-extensions/supabase/test/fixtures/no-policy/contract.json +++ b/packages/3-extensions/supabase/test/fixtures/no-policy/contract.json @@ -199,7 +199,7 @@ "id": "supabase", "kind": "extension", "targetId": "postgres", - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } }, "meta": {}, diff --git a/packages/3-extensions/supabase/test/fixtures/renamed-policy/contract.d.ts b/packages/3-extensions/supabase/test/fixtures/renamed-policy/contract.d.ts index 9fd3a0af0e73..8f32da9d75be 100644 --- a/packages/3-extensions/supabase/test/fixtures/renamed-policy/contract.d.ts +++ b/packages/3-extensions/supabase/test/fixtures/renamed-policy/contract.d.ts @@ -421,7 +421,7 @@ type ContractBase = Omit< readonly id: 'supabase'; readonly kind: 'extension'; readonly targetId: 'postgres'; - readonly version: '8.0.0-rc.14'; + readonly version: '8.0.0-rc.15'; }; }; readonly execution: { diff --git a/packages/3-extensions/supabase/test/fixtures/renamed-policy/contract.json b/packages/3-extensions/supabase/test/fixtures/renamed-policy/contract.json index 2339a15ea348..d8023a23619c 100644 --- a/packages/3-extensions/supabase/test/fixtures/renamed-policy/contract.json +++ b/packages/3-extensions/supabase/test/fixtures/renamed-policy/contract.json @@ -241,7 +241,7 @@ "id": "supabase", "kind": "extension", "targetId": "postgres", - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } }, "meta": {}, diff --git a/packages/3-mongo-target/1-mongo-target/package.json b/packages/3-mongo-target/1-mongo-target/package.json index ab95854ae956..20dd72d1c796 100644 --- a/packages/3-mongo-target/1-mongo-target/package.json +++ b/packages/3-mongo-target/1-mongo-target/package.json @@ -1,7 +1,7 @@ { "name": "@internal/target-mongo", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,32 +16,32 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/family-mongo": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/ts-render": "workspace:8.0.0-rc.14", - "@internal/mongo-codec": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-lowering": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-query-builder": "workspace:8.0.0-rc.14", - "@internal/mongo-schema-ir": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/family-mongo": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/ts-render": "workspace:8.0.0-rc.15", + "@internal/mongo-codec": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-lowering": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-query-builder": "workspace:8.0.0-rc.15", + "@internal/mongo-schema-ir": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "catalog:", "bson": "catalog:" }, "devDependencies": { - "@internal/mongo-contract-psl": "workspace:8.0.0-rc.14", - "@internal/mongo-wire": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/mongo-contract-psl": "workspace:8.0.0-rc.15", + "@internal/mongo-wire": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "mongodb": "catalog:", "pathe": "^2.0.3", "tsdown": "catalog:", diff --git a/packages/3-mongo-target/2-mongo-adapter/package.json b/packages/3-mongo-target/2-mongo-adapter/package.json index a26435051fe5..7ce6756aad0b 100644 --- a/packages/3-mongo-target/2-mongo-adapter/package.json +++ b/packages/3-mongo-target/2-mongo-adapter/package.json @@ -1,7 +1,7 @@ { "name": "@internal/adapter-mongo", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,34 +16,34 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/family-mongo": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/mongo-codec": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-lowering": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-query-builder": "workspace:8.0.0-rc.14", - "@internal/mongo-schema-ir": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/mongo-wire": "workspace:8.0.0-rc.14", - "@internal/target-mongo": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/family-mongo": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/mongo-codec": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-lowering": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-query-builder": "workspace:8.0.0-rc.15", + "@internal/mongo-schema-ir": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/mongo-wire": "workspace:8.0.0-rc.15", + "@internal/target-mongo": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "catalog:" }, "devDependencies": { "mongodb": "catalog:", - "@internal/driver-mongo": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-psl": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/driver-mongo": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-psl": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "mongodb-memory-server": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/3-mongo-target/3-mongo-driver/package.json b/packages/3-mongo-target/3-mongo-driver/package.json index 078702a3ba4a..9efa68a7c45b 100644 --- a/packages/3-mongo-target/3-mongo-driver/package.json +++ b/packages/3-mongo-target/3-mongo-driver/package.json @@ -1,7 +1,7 @@ { "name": "@internal/driver-mongo", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,17 +16,17 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-lowering": "workspace:8.0.0-rc.14", - "@internal/mongo-wire": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-lowering": "workspace:8.0.0-rc.15", + "@internal/mongo-wire": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { "mongodb": "catalog:", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "mongodb-memory-server": "catalog:", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/3-targets/3-targets/postgres/package.json b/packages/3-targets/3-targets/postgres/package.json index 26d5d695f95c..9a675c2f7c06 100644 --- a/packages/3-targets/3-targets/postgres/package.json +++ b/packages/3-targets/3-targets/postgres/package.json @@ -1,7 +1,7 @@ { "name": "@internal/target-postgres", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,21 +16,21 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", - "@internal/sql-errors": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/ts-render": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", + "@internal/sql-errors": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/ts-render": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "^2.2.2", "pathe": "^2.0.3", @@ -38,11 +38,11 @@ }, "devDependencies": { "@electric-sql/pglite": "0.5.4", - "@internal/psl-printer": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/psl-printer": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "temporal-polyfill": "^1.0.4", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/3-targets/3-targets/sqlite/package.json b/packages/3-targets/3-targets/sqlite/package.json index 679201c044d1..0a8e71fd7d61 100644 --- a/packages/3-targets/3-targets/sqlite/package.json +++ b/packages/3-targets/3-targets/sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@internal/target-sqlite", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -15,28 +15,28 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-errors": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/ts-render": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-errors": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/ts-render": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@standard-schema/spec": "1.1.0", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/driver-sqlite": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/driver-sqlite": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "temporal-polyfill": "^1.0.4", "tsdown": "catalog:", "typescript": "catalog:", 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 7400aaf0fea1..2f8dfad88811 100644 --- a/packages/3-targets/6-adapters/postgres-codec-testkit/package.json +++ b/packages/3-targets/6-adapters/postgres-codec-testkit/package.json @@ -1,7 +1,7 @@ { "name": "@internal/postgres-codec-testkit", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,20 +16,20 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/sql-errors": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/sql-errors": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "temporal-polyfill": "^1.0.4", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/3-targets/6-adapters/postgres/package.json b/packages/3-targets/6-adapters/postgres/package.json index 75582ffff3e3..0321e7147e02 100644 --- a/packages/3-targets/6-adapters/postgres/package.json +++ b/packages/3-targets/6-adapters/postgres/package.json @@ -1,7 +1,7 @@ { "name": "@internal/adapter-postgres", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -15,31 +15,31 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/ids": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/ids": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/pg": "catalog:", "pathe": "^2.0.3", "pg": "catalog:", 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 08addbe90f72..e4031465bcd2 100644 --- a/packages/3-targets/6-adapters/sqlite-codec-testkit/package.json +++ b/packages/3-targets/6-adapters/sqlite-codec-testkit/package.json @@ -1,7 +1,7 @@ { "name": "@internal/sqlite-codec-testkit", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,17 +16,17 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/adapter-sqlite": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/target-sqlite": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/adapter-sqlite": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/target-sqlite": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/3-targets/6-adapters/sqlite/package.json b/packages/3-targets/6-adapters/sqlite/package.json index 79566cf5a9f4..e641dd2b6f7a 100644 --- a/packages/3-targets/6-adapters/sqlite/package.json +++ b/packages/3-targets/6-adapters/sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@internal/adapter-sqlite", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -15,31 +15,31 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/ids": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/target-sqlite": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/ids": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/target-sqlite": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/driver-sqlite": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/driver-sqlite": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "pathe": "^2.0.3", "tsdown": "catalog:", "typescript": "catalog:", diff --git a/packages/3-targets/7-drivers/postgres/package.json b/packages/3-targets/7-drivers/postgres/package.json index 108392b08f07..bac2a4ae7c4b 100644 --- a/packages/3-targets/7-drivers/postgres/package.json +++ b/packages/3-targets/7-drivers/postgres/package.json @@ -1,7 +1,7 @@ { "name": "@internal/driver-postgres", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -15,14 +15,14 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-errors": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-errors": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/pg": "catalog:", "arktype": "^2.2.2", @@ -32,9 +32,9 @@ "devDependencies": { "@electric-sql/pglite": "0.5.4", "@electric-sql/pglite-socket": "0.2.7", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/pg-cursor": "^2.4.6", "pg-mem": "^3.0.5", "pg-types": "2.2.0", diff --git a/packages/3-targets/7-drivers/sqlite/package.json b/packages/3-targets/7-drivers/sqlite/package.json index ec50e1459620..91d5805eb25f 100644 --- a/packages/3-targets/7-drivers/sqlite/package.json +++ b/packages/3-targets/7-drivers/sqlite/package.json @@ -1,7 +1,7 @@ { "name": "@internal/driver-sqlite", "private": true, - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -15,20 +15,20 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-errors": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-errors": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "pathe": "^2.0.3" }, "devDependencies": { - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" 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 dce0e319685a..f3373564b20f 100644 --- a/packages/9-public/@prisma/orm-extension-arktype-json/package.json +++ b/packages/9-public/@prisma/orm-extension-arktype-json/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-extension-arktype-json", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,21 +14,21 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "~2.2.2" }, "devDependencies": { - "@internal/extension-arktype-json": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", + "@internal/extension-arktype-json": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, "peerDependencies": { - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", "typescript": ">=5.9" }, "peerDependenciesMeta": { 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 b7e7b48eef98..fb4adc97b079 100644 --- a/packages/9-public/@prisma/orm-extension-middleware-cache/package.json +++ b/packages/9-public/@prisma/orm-extension-middleware-cache/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-extension-middleware-cache", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,12 +14,12 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-framework": "workspace:8.0.0-rc.14" + "@prisma/orm-framework": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@internal/middleware-cache": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/middleware-cache": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, diff --git a/packages/9-public/@prisma/orm-extension-paradedb/package.json b/packages/9-public/@prisma/orm-extension-paradedb/package.json index d57f6e5f9f08..bf94a6797484 100644 --- a/packages/9-public/@prisma/orm-extension-paradedb/package.json +++ b/packages/9-public/@prisma/orm-extension-paradedb/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-extension-paradedb", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,20 +14,20 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/extension-paradedb": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/extension-paradedb": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, "peerDependencies": { - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", "typescript": ">=5.9" }, "peerDependenciesMeta": { diff --git a/packages/9-public/@prisma/orm-extension-pgvector/package.json b/packages/9-public/@prisma/orm-extension-pgvector/package.json index 3c5cdf22d469..0d0cd6724c71 100644 --- a/packages/9-public/@prisma/orm-extension-pgvector/package.json +++ b/packages/9-public/@prisma/orm-extension-pgvector/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-extension-pgvector", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,22 +14,22 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/extension-pgvector": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", + "@internal/extension-pgvector": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, "peerDependencies": { - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", "typescript": ">=5.9" }, "peerDependenciesMeta": { diff --git a/packages/9-public/@prisma/orm-extension-postgis/package.json b/packages/9-public/@prisma/orm-extension-postgis/package.json index b16d39ae8034..3da6b6c5e06f 100644 --- a/packages/9-public/@prisma/orm-extension-postgis/package.json +++ b/packages/9-public/@prisma/orm-extension-postgis/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-extension-postgis", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,22 +14,22 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "^2.2.2" }, "devDependencies": { - "@internal/extension-postgis": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", + "@internal/extension-postgis": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, "peerDependencies": { - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", "typescript": ">=5.9" }, "peerDependenciesMeta": { diff --git a/packages/9-public/@prisma/orm-extension-supabase/package.json b/packages/9-public/@prisma/orm-extension-supabase/package.json index 2567422634be..830a981c412a 100644 --- a/packages/9-public/@prisma/orm-extension-supabase/package.json +++ b/packages/9-public/@prisma/orm-extension-supabase/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-extension-supabase", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,10 +14,10 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "@types/node": "catalog:", "@types/pg": "catalog:", @@ -26,15 +26,15 @@ "pg": "catalog:" }, "devDependencies": { - "@internal/extension-supabase": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", + "@internal/extension-supabase": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, "peerDependencies": { - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", "typescript": ">=5.9" }, "peerDependenciesMeta": { diff --git a/packages/9-public/@prisma/orm-family-mongo/package.json b/packages/9-public/@prisma/orm-family-mongo/package.json index 8df24f5e2175..adc41905082a 100644 --- a/packages/9-public/@prisma/orm-family-mongo/package.json +++ b/packages/9-public/@prisma/orm-family-mongo/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-family-mongo", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,30 +14,30 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "arktype": "catalog:", "mongodb": "catalog:", "pathe": "^2.0.3" }, "devDependencies": { - "@internal/family-mongo": "workspace:8.0.0-rc.14", - "@internal/mongo-codec": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-prisma6": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-psl": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-ts": "workspace:8.0.0-rc.14", - "@internal/mongo-emitter": "workspace:8.0.0-rc.14", - "@internal/mongo-lowering": "workspace:8.0.0-rc.14", - "@internal/mongo-orm": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-query-builder": "workspace:8.0.0-rc.14", - "@internal/mongo-runtime": "workspace:8.0.0-rc.14", - "@internal/mongo-schema-ir": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/mongo-wire": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/family-mongo": "workspace:8.0.0-rc.15", + "@internal/mongo-codec": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-prisma6": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-psl": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-ts": "workspace:8.0.0-rc.15", + "@internal/mongo-emitter": "workspace:8.0.0-rc.15", + "@internal/mongo-lowering": "workspace:8.0.0-rc.15", + "@internal/mongo-orm": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-query-builder": "workspace:8.0.0-rc.15", + "@internal/mongo-runtime": "workspace:8.0.0-rc.15", + "@internal/mongo-schema-ir": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/mongo-wire": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, diff --git a/packages/9-public/@prisma/orm-family-sql/package.json b/packages/9-public/@prisma/orm-family-sql/package.json index e109d383ec4d..b759a5aa536d 100644 --- a/packages/9-public/@prisma/orm-family-sql/package.json +++ b/packages/9-public/@prisma/orm-family-sql/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-family-sql", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,8 +14,8 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "arktype": "catalog:", "pathe": "^2.0.3", @@ -24,21 +24,21 @@ "ts-toolbelt": "^9.6.0" }, "devDependencies": { - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/sql-builder": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-emitter": "workspace:8.0.0-rc.14", - "@internal/sql-contract-prisma7": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/sql-errors": "workspace:8.0.0-rc.14", - "@internal/sql-operations": "workspace:8.0.0-rc.14", - "@internal/sql-orm-client": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/sql-builder": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-emitter": "workspace:8.0.0-rc.15", + "@internal/sql-contract-prisma7": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/sql-errors": "workspace:8.0.0-rc.15", + "@internal/sql-operations": "workspace:8.0.0-rc.15", + "@internal/sql-orm-client": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, diff --git a/packages/9-public/@prisma/orm-framework/package.json b/packages/9-public/@prisma/orm-framework/package.json index ee56f415e3fa..d0ed912889e7 100644 --- a/packages/9-public/@prisma/orm-framework/package.json +++ b/packages/9-public/@prisma/orm-framework/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-framework", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -22,20 +22,20 @@ "uniku": "^0.5.0" }, "devDependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/contract-authoring": "workspace:8.0.0-rc.14", - "@internal/errors": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/ids": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/psl-printer": "workspace:8.0.0-rc.14", - "@internal/ts-render": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/contract-authoring": "workspace:8.0.0-rc.15", + "@internal/errors": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/ids": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/psl-printer": "workspace:8.0.0-rc.15", + "@internal/ts-render": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/9-public/@prisma/orm-mongo/package.json b/packages/9-public/@prisma/orm-mongo/package.json index 97e6b720d76c..b3fcac225664 100644 --- a/packages/9-public/@prisma/orm-mongo/package.json +++ b/packages/9-public/@prisma/orm-mongo/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-mongo", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,18 +16,18 @@ "clean": "rm -rf dist src-gen skills" }, "dependencies": { - "@prisma/orm-family-mongo": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-target-mongo": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-mongo": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-target-mongo": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "mongodb-connection-string-url": "catalog:", "pathe": "^2.0.3", "tinyglobby": "catalog:" }, "devDependencies": { - "@internal/mongo": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/mongo": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, diff --git a/packages/9-public/@prisma/orm-postgres/package.json b/packages/9-public/@prisma/orm-postgres/package.json index 0401ee23dff1..4459984dd73c 100644 --- a/packages/9-public/@prisma/orm-postgres/package.json +++ b/packages/9-public/@prisma/orm-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-postgres", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,10 +16,10 @@ "clean": "rm -rf dist src-gen skills" }, "dependencies": { - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-target-postgres": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-target-postgres": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/pg": "catalog:", "arktype": "catalog:", @@ -28,9 +28,9 @@ "tinyglobby": "catalog:" }, "devDependencies": { - "@internal/postgres": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/postgres": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, diff --git a/packages/9-public/@prisma/orm-sqlite/package.json b/packages/9-public/@prisma/orm-sqlite/package.json index 2ffc4611e18f..4c8121926a16 100644 --- a/packages/9-public/@prisma/orm-sqlite/package.json +++ b/packages/9-public/@prisma/orm-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-sqlite", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -16,17 +16,17 @@ "clean": "rm -rf dist src-gen skills" }, "dependencies": { - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-target-sqlite": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-target-sqlite": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "pathe": "^2.0.3", "tinyglobby": "catalog:" }, "devDependencies": { - "@internal/sqlite": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/sqlite": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, diff --git a/packages/9-public/@prisma/orm-target-mongo/package.json b/packages/9-public/@prisma/orm-target-mongo/package.json index 10dfaf9b201e..f3967de0dae4 100644 --- a/packages/9-public/@prisma/orm-target-mongo/package.json +++ b/packages/9-public/@prisma/orm-target-mongo/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-target-mongo", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,18 +14,18 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-family-mongo": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-mongo": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "arktype": "catalog:", "bson": "catalog:" }, "devDependencies": { - "@internal/adapter-mongo": "workspace:8.0.0-rc.14", - "@internal/driver-mongo": "workspace:8.0.0-rc.14", - "@internal/target-mongo": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/adapter-mongo": "workspace:8.0.0-rc.15", + "@internal/driver-mongo": "workspace:8.0.0-rc.15", + "@internal/target-mongo": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, diff --git a/packages/9-public/@prisma/orm-target-postgres/package.json b/packages/9-public/@prisma/orm-target-postgres/package.json index b5992e4ac597..662a5e510fb2 100644 --- a/packages/9-public/@prisma/orm-target-postgres/package.json +++ b/packages/9-public/@prisma/orm-target-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-target-postgres", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -15,9 +15,9 @@ "test": "vitest run" }, "dependencies": { - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "@standard-schema/spec": "^1.1.0", "@types/node": "catalog:", "@types/pg": "catalog:", @@ -28,11 +28,11 @@ "postgres-array": "2.0.0" }, "devDependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/9-public/@prisma/orm-target-sqlite/package.json b/packages/9-public/@prisma/orm-target-sqlite/package.json index 44f831661477..abde7edf6ec8 100644 --- a/packages/9-public/@prisma/orm-target-sqlite/package.json +++ b/packages/9-public/@prisma/orm-target-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-target-sqlite", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,19 +14,19 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-framework": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "@standard-schema/spec": "1.1.0", "arktype": "^2.2.2", "pathe": "^2.0.3" }, "devDependencies": { - "@internal/adapter-sqlite": "workspace:8.0.0-rc.14", - "@internal/driver-sqlite": "workspace:8.0.0-rc.14", - "@internal/target-sqlite": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@internal/adapter-sqlite": "workspace:8.0.0-rc.15", + "@internal/driver-sqlite": "workspace:8.0.0-rc.15", + "@internal/target-sqlite": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, diff --git a/packages/9-public/@prisma/orm-toolchain/package.json b/packages/9-public/@prisma/orm-toolchain/package.json index c94b7823b4b9..37117ba461f3 100644 --- a/packages/9-public/@prisma/orm-toolchain/package.json +++ b/packages/9-public/@prisma/orm-toolchain/package.json @@ -1,6 +1,6 @@ { "name": "@prisma/orm-toolchain", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "license": "Apache-2.0", "type": "module", "sideEffects": false, @@ -14,7 +14,7 @@ "clean": "rm -rf dist src-gen" }, "dependencies": { - "@prisma/orm-framework": "workspace:8.0.0-rc.14", + "@prisma/orm-framework": "workspace:8.0.0-rc.15", "@vercel/detect-agent": "^1.2.4", "arktype": "catalog:", "c12": "^3.3.4", @@ -35,16 +35,16 @@ "wrap-ansi": "^10.0.0" }, "devDependencies": { - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/cli-telemetry": "workspace:8.0.0-rc.14", - "@internal/config-loader": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/language-server": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", - "@internal/vite-plugin-contract-emit": "workspace:8.0.0-rc.14", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/cli-telemetry": "workspace:8.0.0-rc.15", + "@internal/config-loader": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/language-server": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", + "@internal/vite-plugin-contract-emit": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4fe59b71b429..46431bc58b01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,16 +83,16 @@ importers: specifier: ^1.0.26 version: 1.0.27 '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:packages/1-framework/3-tooling/cli '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:packages/1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:packages/1-framework/3-tooling/migration '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -173,7 +173,7 @@ importers: specifier: ^25.1.2 version: 25.1.2 '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres monaco-editor: specifier: ^0.56.0 @@ -204,7 +204,7 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -228,7 +228,7 @@ importers: apps/telemetry-backend: dependencies: '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres arktype: specifier: 'catalog:' @@ -247,10 +247,10 @@ importers: specifier: ^1.76.0 version: 1.76.0 '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/bun': specifier: ^1.2.18 @@ -280,10 +280,10 @@ importers: examples/bundle-size: dependencies: '@prisma/orm-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-mongo '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres mongodb: specifier: 'catalog:' @@ -299,10 +299,10 @@ importers: specifier: 'catalog:' version: 0.25.2(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@size-limit/file': specifier: ^12.1.0 @@ -338,7 +338,7 @@ importers: examples/mongo-blog-leaderboard: dependencies: '@prisma/orm-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-mongo mongodb: specifier: 'catalog:' @@ -348,7 +348,7 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -372,10 +372,10 @@ importers: examples/mongo-demo: dependencies: '@prisma/orm-extension-middleware-cache': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-extension-middleware-cache '@prisma/orm-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-mongo mongodb: specifier: 'catalog:' @@ -391,10 +391,10 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -430,17 +430,17 @@ importers: examples/multi-extension-monorepo: dependencies: '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres devDependencies: '@prisma/cli-engine': specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -455,10 +455,10 @@ importers: examples/paradedb-demo: dependencies: '@prisma/orm-extension-paradedb': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-extension-paradedb '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres arktype: specifier: ^2.2.2 @@ -474,10 +474,10 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -498,7 +498,7 @@ importers: examples/prisma-8-cloudflare-worker: dependencies: '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres arktype: specifier: 'catalog:' @@ -520,7 +520,7 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -544,13 +544,13 @@ importers: examples/prisma-8-demo: dependencies: '@prisma/orm-extension-middleware-cache': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-extension-middleware-cache '@prisma/orm-extension-pgvector': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-extension-pgvector '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres arktype: specifier: ^2.2.2 @@ -575,10 +575,10 @@ importers: specifier: 'catalog:' version: 0.25.2(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@testing-library/jest-dom': specifier: ^6.9.1 @@ -623,7 +623,7 @@ importers: examples/prisma-8-demo-sqlite: dependencies: '@prisma/orm-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-sqlite arktype: specifier: ^2.2.2 @@ -636,7 +636,7 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -651,10 +651,10 @@ importers: examples/prisma-8-postgis-demo: dependencies: '@prisma/orm-extension-postgis': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-extension-postgis '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres arktype: specifier: ^2.2.2 @@ -685,10 +685,10 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/leaflet': specifier: ^1.9.22 @@ -724,7 +724,7 @@ importers: specifier: 7.10.0 version: 7.10.0(prisma@packages+1-framework+3-tooling+cli)(typescript@5.9.3) '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres dotenv: specifier: ^17.4.2 @@ -743,10 +743,10 @@ importers: specifier: 7.10.0 version: 7.10.0(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(magicast@0.5.4)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -755,7 +755,7 @@ importers: specifier: 'catalog:' version: 8.20.4 prisma: - specifier: workspace:@internal/cli@8.0.0-rc.14 + specifier: workspace:@internal/cli@8.0.0-rc.15 version: link:../../packages/1-framework/3-tooling/cli tsx: specifier: 'catalog:' @@ -770,7 +770,7 @@ importers: examples/react-router-demo: dependencies: '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres '@react-router/node': specifier: ^8.1.0 @@ -807,10 +807,10 @@ importers: specifier: ^8.1.0 version: 8.3.0(@react-router/serve@8.3.0(react-router@8.3.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3))(react-router@8.3.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))(wrangler@4.120.0(@cloudflare/workers-types@5.20260804.1)) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -846,10 +846,10 @@ importers: examples/retail-store: dependencies: '@prisma/orm-extension-middleware-cache': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-extension-middleware-cache '@prisma/orm-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-mongo '@radix-ui/react-dropdown-menu': specifier: ^2.1.24 @@ -907,10 +907,10 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -940,10 +940,10 @@ importers: examples/supabase: dependencies: '@prisma/orm-extension-supabase': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-extension-supabase '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/9-public/@prisma/orm-postgres jose: specifier: ^6 @@ -956,10 +956,10 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -982,10 +982,10 @@ importers: packages/0-config/tsdown: devDependencies: '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-shared/publish-surface '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../tsconfig es-module-lexer: specifier: ^2.3.1 @@ -1006,7 +1006,7 @@ importers: packages/0-shared/publish-surface: devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig tsdown: specifier: 'catalog:' @@ -1021,7 +1021,7 @@ importers: packages/1-framework/0-foundation/contract: dependencies: '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../utils '@standard-schema/spec': specifier: ^1.1.0 @@ -1031,10 +1031,10 @@ importers: version: 2.2.3 devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1049,10 +1049,10 @@ importers: packages/1-framework/0-foundation/utils: devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1067,13 +1067,13 @@ importers: packages/1-framework/1-core/config: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils arktype: specifier: ^2.2.2 @@ -1086,10 +1086,10 @@ importers: version: 0.2.17 devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1104,17 +1104,17 @@ importers: packages/1-framework/1-core/errors: dependencies: '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1129,16 +1129,16 @@ importers: packages/1-framework/1-core/framework-components: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/contract '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../operations '@internal/ts-render': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../ts-render '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils '@standard-schema/spec': specifier: ^1.1.0 @@ -1148,10 +1148,10 @@ importers: version: 2.2.3 devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1166,17 +1166,17 @@ importers: packages/1-framework/1-core/operations: dependencies: '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1191,14 +1191,14 @@ importers: packages/1-framework/1-core/ts-render: dependencies: '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1213,20 +1213,20 @@ importers: packages/1-framework/2-authoring/contract: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1241,23 +1241,23 @@ importers: packages/1-framework/2-authoring/ids: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils uniku: specifier: ^0.5.0 version: 0.5.0 devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1272,23 +1272,23 @@ importers: packages/1-framework/2-authoring/psl-parser: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1303,23 +1303,23 @@ importers: packages/1-framework/2-authoring/psl-printer: dependencies: '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils devDependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/contract '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../psl-parser '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@standard-schema/spec': specifier: ^1.1.0 @@ -1337,43 +1337,43 @@ importers: packages/1-framework/3-tooling/cli: dependencies: '@internal/cli-telemetry': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../cli-telemetry '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/config '@internal/config-loader': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../config-loader '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/contract '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../emitter '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/framework-components '@internal/language-server': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../language-server '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../migration '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-authoring/psl-parser '@internal/psl-printer': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-authoring/psl-printer '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-shared/publish-surface '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils arktype: specifier: ^2.2.2 @@ -1413,31 +1413,31 @@ importers: version: 10.0.0 devDependencies: '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-contract-emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/3-tooling/emitter '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/2-authoring/contract-ts '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/operations '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/5-runtime '@prisma/cli-engine': specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/node': specifier: 'catalog:' @@ -1455,13 +1455,13 @@ importers: packages/1-framework/3-tooling/cli-telemetry: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/config '@internal/config-loader': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../config-loader '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils '@vercel/detect-agent': specifier: ^1.2.4 @@ -1477,13 +1477,13 @@ importers: version: 2.0.3 devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/node': specifier: 'catalog:' @@ -1501,10 +1501,10 @@ importers: packages/1-framework/3-tooling/cli/test/fixture-app: dependencies: '@prisma/orm-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../9-public/@prisma/orm-mongo '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../9-public/@prisma/orm-postgres '@types/node': specifier: 'catalog:' @@ -1522,16 +1522,16 @@ importers: packages/1-framework/3-tooling/config-loader: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/config '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../emitter '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/errors '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils arktype: specifier: ^2.2.2 @@ -1550,13 +1550,13 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/node': specifier: 'catalog:' @@ -1574,19 +1574,19 @@ importers: packages/1-framework/3-tooling/emitter: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/framework-components '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/operations '@internal/ts-render': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/ts-render '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils arktype: specifier: ^2.2.2 @@ -1596,16 +1596,16 @@ importers: version: 3.9.6 devDependencies: '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-shared/publish-surface '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/node': specifier: 'catalog:' @@ -1623,22 +1623,22 @@ importers: packages/1-framework/3-tooling/language-server: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/config '@internal/config-loader': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../config-loader '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/framework-components '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-authoring/psl-parser '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils pathe: specifier: ^2.0.3 @@ -1651,13 +1651,13 @@ importers: version: 1.0.12 devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/node': specifier: 'catalog:' @@ -1675,16 +1675,16 @@ importers: packages/1-framework/3-tooling/migration: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils arktype: specifier: 'catalog:' @@ -1697,13 +1697,13 @@ importers: version: 3.9.6 devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1718,26 +1718,26 @@ importers: packages/1-framework/3-tooling/vite-plugin-contract-emit: dependencies: '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../cli '@internal/config-loader': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../config-loader '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../emitter pathe: specifier: ^2.0.3 version: 2.0.3 devDependencies: '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-foundation/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/node': specifier: 'catalog:' @@ -1758,23 +1758,23 @@ importers: packages/2-mongo-family/1-foundation/mongo-codec: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1789,19 +1789,19 @@ importers: packages/2-mongo-family/1-foundation/mongo-contract: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../mongo-value '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils arktype: specifier: 'catalog:' @@ -1811,13 +1811,13 @@ importers: version: 7.5.0(socks@2.8.9) devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1836,10 +1836,10 @@ importers: version: 7.5.0(socks@2.8.9) devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1854,53 +1854,53 @@ importers: packages/2-mongo-family/2-authoring/contract-prisma6: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-contract '@internal/mongo-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../contract-psl '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-parser '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils pathe: specifier: ^2.0.3 version: 2.0.3 devDependencies: '@internal/adapter-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-mongo-target/2-mongo-adapter '@internal/driver-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-mongo-target/3-mongo-driver '@internal/family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../9-family '@internal/target-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-mongo-target/1-mongo-target '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/node': specifier: 'catalog:' @@ -1918,28 +1918,28 @@ importers: packages/2-mongo-family/2-authoring/contract-psl: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-contract '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-value '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-parser '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils mongodb: specifier: 'catalog:' @@ -1949,13 +1949,13 @@ importers: version: 2.0.3 devDependencies: '@internal/mongo-contract-ts': - specifier: workspace:8.0.0-rc.13 + specifier: workspace:8.0.0-rc.15 version: link:../contract-ts '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -1970,41 +1970,41 @@ importers: packages/2-mongo-family/2-authoring/contract-ts: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-contract '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-value '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils pathe: specifier: ^2.0.3 version: 2.0.3 devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2019,32 +2019,32 @@ importers: packages/2-mongo-family/3-tooling/emitter: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/emitter '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-contract '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils devDependencies: '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-shared/publish-surface '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2059,26 +2059,26 @@ importers: packages/2-mongo-family/3-tooling/mongo-schema-ir: dependencies: '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-contract '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-value mongodb: specifier: 'catalog:' version: 7.5.0(socks@2.8.9) devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2093,32 +2093,32 @@ importers: packages/2-mongo-family/4-query/query-ast: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-contract '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-value '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils mongodb: specifier: 'catalog:' version: 7.5.0(socks@2.8.9) devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2133,47 +2133,47 @@ importers: packages/2-mongo-family/5-query-builders/orm: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-contract '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../4-query/query-ast '@internal/mongo-query-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../query-builder '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-value '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils devDependencies: '@internal/adapter-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-mongo-target/2-mongo-adapter '@internal/driver-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-mongo-target/3-mongo-driver '@internal/mongo-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../7-runtime '@internal/target-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-mongo-target/1-mongo-target '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown mongodb: specifier: 'catalog:' @@ -2194,26 +2194,26 @@ importers: packages/2-mongo-family/5-query-builders/query-builder: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-contract '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../4-query/query-ast '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-value '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2228,20 +2228,20 @@ importers: packages/2-mongo-family/6-transport/mongo-lowering: dependencies: '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../4-query/query-ast '@internal/mongo-wire': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../mongo-wire devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown mongodb: specifier: 'catalog:' @@ -2259,20 +2259,20 @@ importers: packages/2-mongo-family/6-transport/mongo-wire: dependencies: '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../4-query/query-ast '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-foundation/mongo-value '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2287,44 +2287,44 @@ importers: packages/2-mongo-family/7-runtime: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/mongo-codec': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-foundation/mongo-codec '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-foundation/mongo-contract '@internal/mongo-lowering': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../6-transport/mongo-lowering '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../4-query/query-ast '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-foundation/mongo-value '@internal/mongo-wire': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../6-transport/mongo-wire '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils devDependencies: '@internal/mongo-query-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../5-query-builders/query-builder '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown mongodb: specifier: 'catalog:' @@ -2342,49 +2342,49 @@ importers: packages/2-mongo-family/9-family: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/contract '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/emitter '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/migration '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-foundation/mongo-contract '@internal/mongo-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../2-authoring/contract-psl '@internal/mongo-emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../3-tooling/emitter '@internal/mongo-lowering': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../6-transport/mongo-lowering '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../4-query/query-ast '@internal/mongo-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../3-tooling/mongo-schema-ir '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-foundation/mongo-value '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/psl-parser '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils arktype: specifier: 'catalog:' @@ -2397,16 +2397,16 @@ importers: version: 2.0.3 devDependencies: '@internal/mongo-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../2-authoring/contract-ts '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2421,29 +2421,29 @@ importers: packages/2-sql/1-core/contract: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../schema-ir '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils arktype: specifier: ^2.2.2 version: 2.2.3 devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2458,13 +2458,13 @@ importers: packages/2-sql/1-core/errors: devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2479,26 +2479,26 @@ importers: packages/2-sql/1-core/operations: dependencies: '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/operations '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../contract arktype: specifier: ^2.2.2 version: 2.2.3 devDependencies: '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/emitter '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2513,23 +2513,23 @@ importers: packages/2-sql/1-core/schema-ir: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2544,56 +2544,56 @@ importers: packages/2-sql/2-authoring/contract-prisma7: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-parser '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/contract '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../contract-psl '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../contract-ts '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils pathe: specifier: ^2.0.3 version: 2.0.3 devDependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/6-adapters/postgres '@internal/config-loader': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/config-loader '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/7-drivers/postgres '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../9-family '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/3-targets/postgres '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/node': specifier: 'catalog:' @@ -2611,28 +2611,28 @@ importers: packages/2-sql/2-authoring/contract-psl: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-parser '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/contract '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../contract-ts '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils pathe: specifier: ^2.0.3 @@ -2642,13 +2642,13 @@ importers: version: 0.2.17 devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown arktype: specifier: ^2.2.2 @@ -2666,25 +2666,25 @@ importers: packages/2-sql/2-authoring/contract-ts: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/contract '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/schema-ir '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils arktype: specifier: ^2.2.2 @@ -2697,13 +2697,13 @@ importers: version: 9.6.0 devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/pg': specifier: 'catalog:' @@ -2730,32 +2730,32 @@ importers: packages/2-sql/3-tooling/emitter: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/emitter '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/contract '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils devDependencies: '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-shared/publish-surface '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2770,22 +2770,22 @@ importers: packages/2-sql/4-lanes/relational-core: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/operations '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/contract '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/operations '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils '@standard-schema/spec': specifier: ^1.1.0 @@ -2798,16 +2798,16 @@ importers: version: 9.6.0 devDependencies: '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-authoring/contract-ts '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2822,44 +2822,44 @@ importers: packages/2-sql/4-lanes/sql-builder: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/contract '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../relational-core devDependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/6-adapters/postgres '@internal/ids': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/ids '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-authoring/contract-ts '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/3-targets/postgres '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -2874,41 +2874,41 @@ importers: packages/2-sql/5-runtime: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/ids': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/ids '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/operations '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-core/contract '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../4-lanes/relational-core '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils arktype: specifier: ^2.2.2 version: 2.2.3 devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown '@types/pg': specifier: 'catalog:' @@ -2929,49 +2929,49 @@ importers: packages/2-sql/9-family: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/contract '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/emitter '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/migration '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/operations '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/psl-parser '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-core/contract '@internal/sql-contract-emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../3-tooling/emitter '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../2-authoring/contract-psl '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../2-authoring/contract-ts '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../4-lanes/relational-core '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-core/schema-ir '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils arktype: specifier: ^2.2.2 @@ -2981,19 +2981,19 @@ importers: version: 8.0.0 devDependencies: '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/7-drivers/postgres '@internal/psl-printer': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/psl-printer '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown '@types/pluralize': specifier: ^0.0.33 @@ -3011,25 +3011,25 @@ importers: packages/3-extensions/arktype-json: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/contract '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/5-runtime '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/3-targets/postgres '@standard-schema/spec': specifier: ^1.1.0 @@ -3039,28 +3039,28 @@ importers: version: 2.2.3 devDependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/postgres '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/7-drivers/postgres '@internal/postgres-codec-testkit': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/postgres-codec-testkit '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/contract '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -3075,20 +3075,20 @@ importers: packages/3-extensions/middleware-cache: dependencies: '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils devDependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -3103,52 +3103,52 @@ importers: packages/3-extensions/mongo: dependencies: '@internal/adapter-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-mongo-target/2-mongo-adapter '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/cli '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/driver-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-mongo-target/3-mongo-driver '@internal/family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/1-foundation/mongo-contract '@internal/mongo-contract-prisma6': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/2-authoring/contract-prisma6 '@internal/mongo-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/2-authoring/contract-psl '@internal/mongo-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/2-authoring/contract-ts '@internal/mongo-orm': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/5-query-builders/orm '@internal/mongo-query-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/5-query-builders/query-builder '@internal/mongo-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/7-runtime '@internal/target-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-mongo-target/1-mongo-target '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils mongodb-connection-string-url: specifier: 'catalog:' @@ -3161,22 +3161,22 @@ importers: version: 0.2.17 devDependencies: '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/emitter '@internal/mongo-emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/3-tooling/emitter '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/psl-parser '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown mongodb: specifier: 'catalog:' @@ -3197,65 +3197,65 @@ importers: packages/3-extensions/paradedb: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/contract '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/migration '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/contract '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/5-runtime '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils arktype: specifier: ^2.2.2 version: 2.2.3 devDependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/postgres '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/cli '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/operations '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-ts '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/3-targets/postgres '@prisma/cli-engine': specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -3270,40 +3270,40 @@ importers: packages/3-extensions/pgvector: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/contract '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/migration '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/contract '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/5-runtime '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/schema-ir '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/3-targets/postgres '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils '@standard-schema/spec': specifier: ^1.1.0 @@ -3313,37 +3313,37 @@ importers: version: 2.2.3 devDependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/postgres '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/cli '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/7-drivers/postgres '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/operations '@internal/postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../postgres '@internal/postgres-codec-testkit': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/postgres-codec-testkit '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-ts '@prisma/cli-engine': specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -3358,40 +3358,40 @@ importers: packages/3-extensions/postgis: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/contract '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/migration '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/contract '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/5-runtime '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/schema-ir '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/3-targets/postgres '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils '@standard-schema/spec': specifier: ^1.1.0 @@ -3401,31 +3401,31 @@ importers: version: 2.2.3 devDependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/postgres '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/cli '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/operations '@internal/postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../postgres '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-ts '@prisma/cli-engine': specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -3440,55 +3440,55 @@ importers: packages/3-extensions/postgres: dependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/postgres '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/cli '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/7-drivers/postgres '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/sql-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/sql-builder '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/contract '@internal/sql-contract-prisma7': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-prisma7 '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-psl '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-ts '@internal/sql-orm-client': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../sql-orm-client '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/5-runtime '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/3-targets/postgres '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils '@types/node': specifier: 'catalog:' @@ -3510,28 +3510,28 @@ importers: version: 0.2.17 devDependencies: '@internal/config-loader': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/config-loader '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/emitter '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/psl-parser '@internal/sql-contract-emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/3-tooling/emitter '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/schema-ir '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown temporal-polyfill: specifier: ^1.0.4 @@ -3549,62 +3549,62 @@ importers: packages/3-extensions/sql-orm-client: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/operations '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/contract '@internal/sql-errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/errors '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/5-runtime '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils devDependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/postgres '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/cli '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/7-drivers/postgres '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/9-family '@internal/ids': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/ids '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-ts '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/3-targets/postgres '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown '@types/pg': specifier: 'catalog:' @@ -3628,52 +3628,52 @@ importers: packages/3-extensions/sqlite: dependencies: '@internal/adapter-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/sqlite '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/cli '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/driver-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/7-drivers/sqlite '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/sql-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/sql-builder '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/contract '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-psl '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-ts '@internal/sql-orm-client': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../sql-orm-client '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/5-runtime '@internal/target-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/3-targets/sqlite '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils pathe: specifier: ^2.0.3 @@ -3683,16 +3683,16 @@ importers: version: 0.2.17 devDependencies: '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/psl-parser '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -3707,58 +3707,58 @@ importers: packages/3-extensions/supabase: dependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/6-adapters/postgres '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/contract '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/7-drivers/postgres '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/migration '@internal/postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../postgres '@internal/sql-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/sql-builder '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/contract '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-ts '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/operations '@internal/sql-orm-client': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../sql-orm-client '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/5-runtime '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/1-core/schema-ir '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/3-targets/postgres '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils '@standard-schema/spec': specifier: ^1.1.0 @@ -3780,28 +3780,28 @@ importers: version: 8.22.0 devDependencies: '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/cli '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/operations '@internal/psl-printer': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/psl-printer '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-sql/2-authoring/contract-psl '@prisma/cli-engine': specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown ci-info: specifier: ^4.3.1 @@ -3822,49 +3822,49 @@ importers: packages/3-mongo-target/1-mongo-target: dependencies: '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/cli '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/errors '@internal/family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/migration '@internal/mongo-codec': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/1-foundation/mongo-codec '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/1-foundation/mongo-contract '@internal/mongo-lowering': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/6-transport/mongo-lowering '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/4-query/query-ast '@internal/mongo-query-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/5-query-builders/query-builder '@internal/mongo-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/3-tooling/mongo-schema-ir '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/1-foundation/mongo-value '@internal/ts-render': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/ts-render '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils arktype: specifier: 'catalog:' @@ -3874,25 +3874,25 @@ importers: version: 7.3.1 devDependencies: '@internal/mongo-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/2-authoring/contract-psl '@internal/mongo-wire': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/6-transport/mongo-wire '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/psl-parser '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-shared/publish-surface '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown mongodb: specifier: 'catalog:' @@ -3913,77 +3913,77 @@ importers: packages/3-mongo-target/2-mongo-adapter: dependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/errors '@internal/family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/3-tooling/migration '@internal/mongo-codec': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/1-foundation/mongo-codec '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/1-foundation/mongo-contract '@internal/mongo-lowering': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/6-transport/mongo-lowering '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/4-query/query-ast '@internal/mongo-query-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/5-query-builders/query-builder '@internal/mongo-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/3-tooling/mongo-schema-ir '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/1-foundation/mongo-value '@internal/mongo-wire': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/6-transport/mongo-wire '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/operations '@internal/target-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../1-mongo-target '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils arktype: specifier: 'catalog:' version: 2.2.3 devDependencies: '@internal/driver-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../3-mongo-driver '@internal/mongo-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/2-authoring/contract-psl '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/2-authoring/psl-parser '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown mongodb: specifier: 'catalog:' @@ -4004,29 +4004,29 @@ importers: packages/3-mongo-target/3-mongo-driver: dependencies: '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/1-core/framework-components '@internal/mongo-lowering': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/6-transport/mongo-lowering '@internal/mongo-wire': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../2-mongo-family/6-transport/mongo-wire '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../1-framework/0-foundation/utils devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../0-config/tsdown mongodb: specifier: 'catalog:' @@ -4047,49 +4047,49 @@ importers: packages/3-targets/3-targets/postgres: dependencies: '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/cli '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/errors '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/migration '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-parser '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/2-authoring/contract-psl '@internal/sql-errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/errors '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/relational-core '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/schema-ir '@internal/ts-render': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/ts-render '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils '@standard-schema/spec': specifier: ^1.1.0 @@ -4108,19 +4108,19 @@ importers: specifier: 0.5.4 version: 0.5.4 '@internal/psl-printer': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-printer '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-shared/publish-surface '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown temporal-polyfill: specifier: ^1.0.4 @@ -4138,43 +4138,43 @@ importers: packages/3-targets/3-targets/sqlite: dependencies: '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/cli '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/errors '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/migration '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/errors '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/5-runtime '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/schema-ir '@internal/ts-render': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/ts-render '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils '@standard-schema/spec': specifier: 1.1.0 @@ -4184,19 +4184,19 @@ importers: version: 2.2.3 devDependencies: '@internal/driver-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../7-drivers/sqlite '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-shared/publish-surface '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown temporal-polyfill: specifier: ^1.0.4 @@ -4214,74 +4214,74 @@ importers: packages/3-targets/6-adapters/postgres: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/errors '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/ids': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/ids '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-parser '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/2-authoring/contract-psl '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/2-authoring/contract-ts '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/5-runtime '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/schema-ir '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/postgres '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils arktype: specifier: ^2.2.2 version: 2.2.3 devDependencies: '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/cli '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../7-drivers/postgres '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/migration '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/pg': specifier: 'catalog:' @@ -4308,41 +4308,41 @@ importers: packages/3-targets/6-adapters/postgres-codec-testkit: dependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../postgres '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/relational-core '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/postgres '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils devDependencies: '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../7-drivers/postgres '@internal/sql-errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/errors '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown temporal-polyfill: specifier: ^1.0.4 @@ -4360,74 +4360,74 @@ importers: packages/3-targets/6-adapters/sqlite: dependencies: '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/cli '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/errors '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/ids': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/ids '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-parser '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/2-authoring/contract-psl '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/2-authoring/contract-ts '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/5-runtime '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/schema-ir '@internal/target-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/sqlite '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils arktype: specifier: ^2.2.2 version: 2.2.3 devDependencies: '@internal/driver-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../7-drivers/sqlite '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/migration '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown pathe: specifier: ^2.0.3 @@ -4445,32 +4445,32 @@ importers: packages/3-targets/6-adapters/sqlite-codec-testkit: dependencies: '@internal/adapter-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../sqlite '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/relational-core '@internal/target-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../3-targets/sqlite '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4485,28 +4485,28 @@ importers: packages/3-targets/7-drivers/postgres: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/errors '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/relational-core '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils '@types/node': specifier: 'catalog:' @@ -4531,13 +4531,13 @@ importers: specifier: 0.2.7 version: 0.2.7(@electric-sql/pglite-age@0.0.5(@electric-sql/pglite@0.5.4))(@electric-sql/pglite-pg_hashids@0.0.5(@electric-sql/pglite@0.5.4))(@electric-sql/pglite-pg_ivm@0.0.5(@electric-sql/pglite@0.5.4))(@electric-sql/pglite-pg_textsearch@0.0.6(@electric-sql/pglite@0.5.4))(@electric-sql/pglite-pg_uuidv7@0.0.5(@electric-sql/pglite@0.5.4))(@electric-sql/pglite-pgtap@0.0.5(@electric-sql/pglite@0.5.4))(@electric-sql/pglite-pgvector@0.0.5(@electric-sql/pglite@0.5.4))(@electric-sql/pglite@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown '@types/pg-cursor': specifier: ^2.4.6 @@ -4561,41 +4561,41 @@ importers: packages/3-targets/7-drivers/sqlite: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/errors '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/operations '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/relational-core '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils pathe: specifier: ^2.0.3 version: 2.0.3 devDependencies: '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../test/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4610,10 +4610,10 @@ importers: packages/9-public/@prisma/orm-extension-arktype-json: dependencies: '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-sql '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@standard-schema/spec': specifier: ^1.1.0 @@ -4623,16 +4623,16 @@ importers: version: 2.2.3 devDependencies: '@internal/extension-arktype-json': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/arktype-json '@prisma/orm-target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-target-postgres '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4644,17 +4644,17 @@ importers: packages/9-public/@prisma/orm-extension-middleware-cache: dependencies: '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework devDependencies: '@internal/middleware-cache': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/middleware-cache '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4666,29 +4666,29 @@ importers: packages/9-public/@prisma/orm-extension-paradedb: dependencies: '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-sql '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-target-postgres '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain arktype: specifier: ^2.2.2 version: 2.2.3 devDependencies: '@internal/extension-paradedb': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/paradedb '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4700,13 +4700,13 @@ importers: packages/9-public/@prisma/orm-extension-pgvector: dependencies: '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-sql '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain '@standard-schema/spec': specifier: ^1.1.0 @@ -4716,16 +4716,16 @@ importers: version: 2.2.3 devDependencies: '@internal/extension-pgvector': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/pgvector '@prisma/orm-target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-target-postgres '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4737,13 +4737,13 @@ importers: packages/9-public/@prisma/orm-extension-postgis: dependencies: '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-sql '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain '@standard-schema/spec': specifier: ^1.1.0 @@ -4753,16 +4753,16 @@ importers: version: 2.2.3 devDependencies: '@internal/extension-postgis': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/postgis '@prisma/orm-target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-target-postgres '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4774,16 +4774,16 @@ importers: packages/9-public/@prisma/orm-extension-supabase: dependencies: '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-sql '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-postgres '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain '@standard-schema/spec': specifier: ^1.1.0 @@ -4805,16 +4805,16 @@ importers: version: 8.22.0 devDependencies: '@internal/extension-supabase': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/supabase '@prisma/orm-target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-target-postgres '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4826,10 +4826,10 @@ importers: packages/9-public/@prisma/orm-family-mongo: dependencies: '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain arktype: specifier: 'catalog:' @@ -4842,55 +4842,55 @@ importers: version: 2.0.3 devDependencies: '@internal/family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/9-family '@internal/mongo-codec': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/1-foundation/mongo-codec '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/1-foundation/mongo-contract '@internal/mongo-contract-prisma6': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/2-authoring/contract-prisma6 '@internal/mongo-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/2-authoring/contract-psl '@internal/mongo-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/2-authoring/contract-ts '@internal/mongo-emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/3-tooling/emitter '@internal/mongo-lowering': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/6-transport/mongo-lowering '@internal/mongo-orm': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/5-query-builders/orm '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/4-query/query-ast '@internal/mongo-query-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/5-query-builders/query-builder '@internal/mongo-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/7-runtime '@internal/mongo-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/3-tooling/mongo-schema-ir '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/1-foundation/mongo-value '@internal/mongo-wire': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-mongo-family/6-transport/mongo-wire '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4902,10 +4902,10 @@ importers: packages/9-public/@prisma/orm-family-sql: dependencies: '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain '@standard-schema/spec': specifier: ^1.1.0 @@ -4927,49 +4927,49 @@ importers: version: 9.6.0 devDependencies: '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/9-family '@internal/sql-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/sql-builder '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/contract '@internal/sql-contract-emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/3-tooling/emitter '@internal/sql-contract-prisma7': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/2-authoring/contract-prisma7 '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/2-authoring/contract-psl '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/2-authoring/contract-ts '@internal/sql-errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/errors '@internal/sql-operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/operations '@internal/sql-orm-client': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/sql-orm-client '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/5-runtime '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../2-sql/1-core/schema-ir '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -4997,46 +4997,46 @@ importers: version: 0.5.0 devDependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/config '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/contract '@internal/contract-authoring': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/contract '@internal/errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/errors '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/framework-components '@internal/ids': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/ids '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/operations '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-parser '@internal/psl-printer': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/2-authoring/psl-printer '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-shared/publish-surface '@internal/ts-render': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/1-core/ts-render '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/0-foundation/utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -5051,16 +5051,16 @@ importers: packages/9-public/@prisma/orm-mongo: dependencies: '@prisma/orm-family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-mongo '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-target-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-target-mongo '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain mongodb: specifier: ^7.0.0 @@ -5076,13 +5076,13 @@ importers: version: 0.2.17 devDependencies: '@internal/mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/mongo '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -5094,16 +5094,16 @@ importers: packages/9-public/@prisma/orm-postgres: dependencies: '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-sql '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-target-postgres '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain '@types/node': specifier: 'catalog:' @@ -5128,13 +5128,13 @@ importers: version: 0.2.17 devDependencies: '@internal/postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/postgres '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -5146,16 +5146,16 @@ importers: packages/9-public/@prisma/orm-sqlite: dependencies: '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-sql '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-target-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-target-sqlite '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain pathe: specifier: ^2.0.3 @@ -5165,13 +5165,13 @@ importers: version: 0.2.17 devDependencies: '@internal/sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-extensions/sqlite '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -5183,13 +5183,13 @@ importers: packages/9-public/@prisma/orm-target-mongo: dependencies: '@prisma/orm-family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-mongo '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain arktype: specifier: 'catalog:' @@ -5202,19 +5202,19 @@ importers: version: 7.5.0(socks@2.8.9) devDependencies: '@internal/adapter-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-mongo-target/2-mongo-adapter '@internal/driver-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-mongo-target/3-mongo-driver '@internal/target-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-mongo-target/1-mongo-target '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -5226,13 +5226,13 @@ importers: packages/9-public/@prisma/orm-target-postgres: dependencies: '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-sql '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain '@standard-schema/spec': specifier: ^1.1.0 @@ -5263,19 +5263,19 @@ importers: version: 1.0.4 devDependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/6-adapters/postgres '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/7-drivers/postgres '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/3-targets/postgres '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -5290,13 +5290,13 @@ importers: packages/9-public/@prisma/orm-target-sqlite: dependencies: '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-family-sql '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-toolchain '@standard-schema/spec': specifier: 1.1.0 @@ -5309,19 +5309,19 @@ importers: version: 2.0.3 devDependencies: '@internal/adapter-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/6-adapters/sqlite '@internal/driver-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/7-drivers/sqlite '@internal/target-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../3-targets/3-targets/sqlite '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -5336,7 +5336,7 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@prisma/orm-framework': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../orm-framework '@vercel/detect-agent': specifier: ^1.2.4 @@ -5397,34 +5397,34 @@ importers: version: 10.0.0 devDependencies: '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/cli '@internal/cli-telemetry': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/cli-telemetry '@internal/config-loader': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/config-loader '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/emitter '@internal/language-server': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/language-server '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/migration '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-shared/publish-surface '@internal/vite-plugin-contract-emit': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../1-framework/3-tooling/vite-plugin-contract-emit '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../0-config/tsdown tsdown: specifier: 'catalog:' @@ -5436,26 +5436,26 @@ importers: test/e2e/framework: dependencies: '@prisma/orm-extension-arktype-json': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../packages/9-public/@prisma/orm-extension-arktype-json '@prisma/orm-extension-pgvector': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../packages/9-public/@prisma/orm-extension-pgvector '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../packages/9-public/@prisma/orm-postgres '@prisma/orm-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../packages/9-public/@prisma/orm-sqlite '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../utils arktype: specifier: 'catalog:' version: 2.2.3 devDependencies: '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../packages/0-config/tsconfig '@types/node': specifier: 'catalog:' @@ -5482,13 +5482,13 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@prisma/orm-extension-arktype-json': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../packages/9-public/@prisma/orm-extension-arktype-json '@prisma/orm-extension-pgvector': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../packages/9-public/@prisma/orm-extension-pgvector '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../packages/9-public/@prisma/orm-postgres arktype: specifier: 'catalog:' @@ -5500,206 +5500,206 @@ importers: specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@prisma/orm-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-sqlite test/integration: dependencies: '@internal/adapter-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-mongo-target/2-mongo-adapter '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-targets/6-adapters/postgres '@internal/adapter-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-targets/6-adapters/sqlite '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/3-tooling/cli '@internal/config-loader': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/3-tooling/config-loader '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/0-foundation/contract '@internal/driver-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-mongo-target/3-mongo-driver '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-targets/7-drivers/postgres '@internal/driver-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-targets/7-drivers/sqlite '@internal/emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/3-tooling/emitter '@internal/extension-arktype-json': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/arktype-json '@internal/extension-paradedb': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/paradedb '@internal/extension-pgvector': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/pgvector '@internal/extension-postgis': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/postgis '@internal/extension-supabase': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/supabase '@internal/family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/9-family '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/9-family '@internal/ids': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/2-authoring/ids '@internal/migration-tools': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/3-tooling/migration '@internal/mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/mongo '@internal/mongo-codec': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/1-foundation/mongo-codec '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/1-foundation/mongo-contract '@internal/mongo-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/2-authoring/contract-psl '@internal/mongo-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/2-authoring/contract-ts '@internal/mongo-orm': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/5-query-builders/orm '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/4-query/query-ast '@internal/mongo-query-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/5-query-builders/query-builder '@internal/mongo-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/7-runtime '@internal/mongo-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/3-tooling/mongo-schema-ir '@internal/mongo-value': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/1-foundation/mongo-value '@internal/mongo-wire': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/6-transport/mongo-wire '@internal/operations': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/1-core/operations '@internal/postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/postgres '@internal/psl-parser': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/2-authoring/psl-parser '@internal/psl-printer': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/2-authoring/psl-printer '@internal/sql-builder': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/4-lanes/sql-builder '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/1-core/contract '@internal/sql-contract-emitter': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/3-tooling/emitter '@internal/sql-contract-prisma7': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/2-authoring/contract-prisma7 '@internal/sql-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/2-authoring/contract-psl '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/2-authoring/contract-ts '@internal/sql-errors': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/1-core/errors '@internal/sql-orm-client': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/sql-orm-client '@internal/sql-relational-core': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/4-lanes/relational-core '@internal/sql-runtime': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/5-runtime '@internal/sql-schema-ir': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-sql/1-core/schema-ir '@internal/sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/sqlite '@internal/target-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-mongo-target/1-mongo-target '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-targets/3-targets/postgres '@internal/target-sqlite': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-targets/3-targets/sqlite '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/0-foundation/utils '@internal/vite-plugin-contract-emit': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/3-tooling/vite-plugin-contract-emit arktype: specifier: 'catalog:' version: 2.2.3 devDependencies: '@internal/config': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/1-core/config '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/1-core/framework-components '@internal/language-server': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/3-tooling/language-server '@internal/middleware-cache': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/3-extensions/middleware-cache '@internal/mongo-lowering': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/2-mongo-family/6-transport/mongo-lowering '@internal/publish-surface': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-shared/publish-surface '@prisma/cli-engine': specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@repo/test-utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../utils '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsdown '@types/pg': specifier: 'catalog:' version: 8.20.4 cli-journeys: - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:test/cli-journeys commander: specifier: ^15.0.0 @@ -5741,82 +5741,82 @@ importers: test/integration/test/cli-journeys: dependencies: '@prisma/orm-extension-pgvector': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../packages/9-public/@prisma/orm-extension-pgvector '@prisma/orm-family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../packages/9-public/@prisma/orm-family-sql '@prisma/orm-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../packages/9-public/@prisma/orm-mongo '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../packages/9-public/@prisma/orm-postgres test/integration/test/fixtures/cli/cli-e2e-test-app: dependencies: '@internal/adapter-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-mongo-target/2-mongo-adapter '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-targets/6-adapters/postgres '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/1-framework/3-tooling/cli '@internal/driver-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-mongo-target/3-mongo-driver '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-targets/7-drivers/postgres '@internal/family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-mongo-family/9-family '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/1-framework/1-core/framework-components '@internal/mongo-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-mongo-family/1-foundation/mongo-contract '@internal/mongo-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-mongo-family/2-authoring/contract-ts '@internal/mongo-orm': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-mongo-family/5-query-builders/orm '@internal/mongo-query-ast': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-mongo-family/4-query/query-ast '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-sql/2-authoring/contract-ts '@internal/target-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-mongo-target/1-mongo-target '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-targets/3-targets/postgres '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/1-framework/0-foundation/utils '@prisma/cli-engine': specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@prisma/orm-extension-pgvector': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-extension-pgvector '@prisma/orm-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-mongo '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-postgres '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-toolchain mongodb: specifier: 'catalog:' @@ -5825,75 +5825,73 @@ importers: specifier: 'catalog:' version: 8.22.0 - test/integration/test/fixtures/cli/cli-e2e-test-app/test-1786116311962-dcaev7r38rc: {} - test/integration/test/fixtures/cli/cli-integration-test-app: dependencies: '@internal/adapter-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-mongo-target/2-mongo-adapter '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-targets/6-adapters/postgres '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/1-framework/3-tooling/cli '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/1-framework/0-foundation/contract '@internal/driver-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-targets/7-drivers/postgres '@internal/family-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-mongo-family/9-family '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-sql/9-family '@internal/framework-components': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/1-framework/1-core/framework-components '@internal/mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-extensions/mongo '@internal/mongo-contract-psl': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-mongo-family/2-authoring/contract-psl '@internal/mongo-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-mongo-family/2-authoring/contract-ts '@internal/postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-extensions/postgres '@internal/sql-contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-sql/1-core/contract '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-sql/2-authoring/contract-ts '@internal/target-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-mongo-target/1-mongo-target '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-targets/3-targets/postgres '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/1-framework/0-foundation/utils '@prisma/cli-engine': specifier: 0.6.2 version: 0.6.2(@prisma/management-api-sdk@1.76.0)(magicast@0.5.4) '@prisma/orm-extension-pgvector': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-extension-pgvector '@prisma/orm-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-mongo '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-postgres '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-toolchain '@types/node': specifier: 'catalog:' @@ -5908,31 +5906,31 @@ importers: test/integration/test/fixtures/cli/cli-test-app: dependencies: '@internal/adapter-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-targets/6-adapters/postgres '@internal/cli': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/1-framework/3-tooling/cli '@internal/family-sql': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-sql/9-family '@internal/sql-contract-ts': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/2-sql/2-authoring/contract-ts '@internal/target-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/3-targets/3-targets/postgres '@prisma/orm-extension-pgvector': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-extension-pgvector '@prisma/orm-mongo': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-mongo '@prisma/orm-postgres': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-postgres '@prisma/orm-toolchain': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../../../../../packages/9-public/@prisma/orm-toolchain pg: specifier: 'catalog:' @@ -5941,20 +5939,20 @@ importers: test/utils: dependencies: '@internal/contract': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/0-foundation/contract '@internal/utils': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/1-framework/0-foundation/utils devDependencies: '@prisma/dev': specifier: 'catalog:' version: 0.25.2(typescript@5.9.3)(vite@8.1.4(@types/node@26.1.2)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@repo/tsconfig': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsconfig '@repo/tsdown': - specifier: workspace:8.0.0-rc.14 + specifier: workspace:8.0.0-rc.15 version: link:../../packages/0-config/tsdown '@types/pg': specifier: 'catalog:' diff --git a/skills/prisma-8/SKILL.md b/skills/prisma-8/SKILL.md index 3634c5b4e6a2..47e1e52c8c60 100644 --- a/skills/prisma-8/SKILL.md +++ b/skills/prisma-8/SKILL.md @@ -15,7 +15,7 @@ description: >- ORM 7 or earlier (schema.prisma + @prisma/client). metadata: library: '@prisma/orm-postgres' - library_version: '8.0.0-rc.14' + library_version: '8.0.0-rc.15' version: '2026-09-12' --- diff --git a/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/instructions.md b/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/instructions.md new file mode 100644 index 000000000000..b5cc00c3c2ad --- /dev/null +++ b/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/instructions.md @@ -0,0 +1,1365 @@ +--- +from: "8.0.0-rc.14" +to: "8.0.0-rc.15" +changes: + - id: contract-stores-data-type + summary: | + A SQL contract names each column's data type in `dataType` (for example `pg/int4`) instead of + its database type name in `nativeType`. Upgrade every extension that ships migrations in the + same step, then run the colocated script on the project: it rewrites every contract, writes + its lists in this release's new form, renames the snapshot directories to the new storage + hashes, and rewrites the migrations, refs, `migration.ts` files and `contract.d.ts` files + that name them. + detection: + glob: "**/*.json" + matches: + - '"nativeType"\s*:\s*"' + script: ./scripts/data-type-in-contract/data-type-in-contract.ts + - id: sign-databases-after-upgrade + summary: | + The upgrade changes every contract's storage hash, so every database's marker names a hash + the project no longer has. Run `prisma db sign` against every database before deploying the + application built with the new contract. `db sign` now signs every contract space, and its + `--json` document is `{ ok, summary, spaces, advancedRefs }`. + - id: column-descriptors-drop-native-type + summary: | + A hand-written column descriptor names its codec only: `{ codecId: 'pg/text@1' }` instead of + `{ codecId: 'pg/text@1', nativeType: 'text' }`. Code that reads or builds a column of a stored + contract uses `dataType` (for example `pg/text`) instead of `nativeType` (`text`). + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '(?` where the query is meant to have no order. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\.(?:cursor|distinctOn)\s*\([^)]*\bas\s+never\b' + - id: apply-is-a-collection-member + summary: | + Every collection now has an `apply` method. A custom collection class that declares its own `apply` member with another signature no longer compiles; rename it. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '(?:^|\n)[ \t]*(?:(?:public|protected|private|readonly|static|async|override)\s+)*apply\s*[(<:=?]' + - id: scope-is-a-collection-member + summary: | + Every collection now has a `scope` method. A custom collection class that declares its own `scope` member with another signature no longer compiles; rename it. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '(?:^|\n)[ \t]*(?:(?:public|protected|private|readonly|static|async|override|get|set)\s+)*scope\s*[!(<:=?]' + - id: overriding-a-chaining-method + summary: | + In a class that extends `Collection`, an override of a chaining method (`where`, `orderBy`, `limit`, `offset`, `distinct`, `distinctOn`, `cursor`, `include`) or of a method that returns rows (`all`, `first`, `create`, `createAll`, `upsert`, `update`, `updateAll`, `updateAndCount`, `delete`, `deleteAll`, `deleteAndCount`) must use the new signature, which takes a `this` parameter. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '(?:^|\n)[ \t]*(?:(?:public|protected|override|async)\s+)*(?:where|orderBy|limit|offset|distinct|distinctOn|cursor|include|all|first|create|createAll|upsert|update|updateAll|updateAndCount|delete|deleteAll|deleteAndCount)\s*[(<]' + - id: collection-state-flags-are-boolean + summary: | + In `DefaultCollectionTypeState`, `hasWhere`, `hasOrderBy` and `hasUniqueFilter` are `boolean` (not known) instead of `false`. Code that expects `false` on a collection with no filter or order must expect `boolean`. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\bhas(?:Where|OrderBy|UniqueFilter)\b[''"]?\]?\s*,\s*false\b' + - '\bhas(?:Where|OrderBy|UniqueFilter)\s*:\s*false\b' + - id: read-collection-state-and-row-with-helpers + summary: | + A collection's type state and row are read with `CollectionTypeStateOf` and `CollectionRowOf`, not by inferring the type arguments of `Collection`. The type arguments keep what the collection started with. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\bCollection<[^;]*?\binfer\b' + - id: return-type-of-a-chaining-method + summary: | + `ReturnType` of `where`, `orderBy`, `limit`, `offset`, `distinct`, `distinctOn`, `cursor` or `include` no longer gives a collection. Write `Filtered` after `where`, `Ordered` after `orderBy`, and `C` after the others, or take `typeof` of a value. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\bReturnType<[^>]*\[[''"](?:where|orderBy|limit|offset|distinct|distinctOn|cursor|include)[''"]\]' + - '\bReturnType<\s*typeof\s+[\w$.]+\.(?:where|orderBy|limit|offset|distinct|distinctOn|cursor|include)\b' + - id: chaining-methods-take-no-explicit-type-arguments + summary: | + `include`, `distinct` and `distinctOn` with explicit type arguments no longer compile: `posts.include<'user'>('user')` and `posts.distinct<['title']>('title')` fail, and `ReturnType>` is `never`. Drop the type arguments; they are inferred from the arguments, so `posts.distinct('title')` needs none. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\.(?:include|distinct|distinctOn)<' + - id: custom-collection-methods-chain + summary: | + Optional. Custom collection methods now stay available after the built-in chaining methods. Where code repeats a class method's body inline after a chaining call, it can call the method instead. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\bextends\s+Collection<' + - id: variant-takes-discriminator-value + summary: | + `.variant()` on a polymorphic SQL or Mongo ORM collection takes the discriminator value a variant declares instead of the variant's model name: `db.orm.public.Task.variant('bug')` for `@@base(Task, "bug")`, where it used to be `.variant('Bug')`. A value the model does not declare, or a call on a model with no discriminator, now throws `ORM.ARGUMENT_INVALID` instead of returning the collection unchanged. `.variant()` on a collection that already has a variant selected is now rejected: select the variant from the base collection. + detection: + glob: "**/*.{ts,tsx,mts,cts}" + matches: + - '\.variant\(' + - id: imported-postgres-field-checks-defaults + summary: | + The `field` exported by the Postgres facade's `contract-builder` entry now has the Postgres presets and checks a `.default(...)` value against the Postgres target's column types, as the `defineContract` callback's `field` does; it does not know the column types an extension adds, such as pgvector's, so it does not check those. A default of the wrong type, which compiled before and failed when the contract was built, is now a compile error; give the value the column's type. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - 'import\s*\{[^}]*\bfield\b[^}]*\}\s*from\s*[''"]@(?:prisma/orm-|internal/)postgres/contract-builder[''"]' + - id: re-emit-for-the-row-locking-capabilities + summary: "The Postgres adapter reports seven new capability keys (sql.forUpdate, sql.forShare, sql.lockOf, sql.lockNowait, sql.lockSkipLocked, postgres.forNoKeyUpdate, postgres.forKeyShare), which gate the new row-locking methods on the SQL builder; a contract emitted before this release does not carry them and the methods are unavailable against it, so re-emit the contract before using them." + detection: + glob: "**/contract.json" + contains: + - '"distinctOn"' + - id: cache-annotation-ttl-removed + summary: "cacheAnnotation from @prisma/orm-extension-middleware-cache no longer takes ttl. Every annotated read is now cached, including cacheAnnotation({}) and cacheAnnotation({ key }), which used to pass through uncached; how long an entry lives is the store's policy (the default store: 60 seconds). Remove ttl from every cacheAnnotation call." + detection: + glob: "**/*.{ts,mts,cts,tsx,js,mjs,cjs,jsx}" + matches: + - '\bcacheAnnotation\s*\(' + - id: cache-annotation-skip-renamed-bypass + summary: "cacheAnnotation({ skip }) is now cacheAnnotation({ bypass }), and the CachePayload type is now CacheAnnotationOptions. Detection finds skip written inside a cacheAnnotation({ ... }) literal and any use of CachePayload; options built elsewhere without that type are not detected." + detection: + glob: "**/*.{ts,mts,cts,tsx,js,mjs,cjs,jsx}" + matches: + - '\bCachePayload\b' + - '\bcacheAnnotation\s*\(\s*\{[^}]*\bskip\s*:' + - id: cache-middleware-store-options + summary: "createCacheMiddleware no longer takes maxEntries or clock. Pass them to createInMemoryCacheStore and hand that store to createCacheMiddleware({ store }), or drop them when they match the new defaults (1000 entries). Detection finds maxEntries or clock written in the options literal of a createCacheMiddleware call; it also matches an already-migrated createCacheMiddleware({ store: createInMemoryCacheStore({ maxEntries }) }), which needs no change." + detection: + glob: "**/*.{ts,mts,cts,tsx,js,mjs,cjs,jsx}" + matches: + - '\bcreateCacheMiddleware\s*\(\s*\{[^}]*\b(maxEntries|clock)\s*:' + - id: cache-store-object-arguments + summary: "A custom CacheStore is now a cache of values with a version per key: CacheStore. get({ key, meta }) replaces get(key) and returns a CacheEntry { key, meta, version, data } whose data is { empty: true } or { empty: false, value }; set(entry, value) replaces set(key, entry, ttlMs), stores only if the key's version still equals entry.version, and returns whether it stored; a new required unset({ keys, meta }) removes values and increments their keys' versions. CachedEntry is replaced by CacheEntry, and the rows type by CachedRows." + detection: + glob: "**/*.{ts,mts,cts,tsx,js,mjs,cjs,jsx}" + matches: + - '\bCacheStore\b' + - '\bCachedEntry\b' + - '\bcreateCacheMiddleware\s*\(' + - id: contract-artifacts-restamp + summary: | + An extension that writes its own package version into the contracts it emits, such as the + Supabase extension, now writes 8.0.0-rc.15. Run `contract emit` once after upgrading so the + emitted `contract.json` and `contract.d.ts` match the installed extension. + detection: + glob: "**/contract.json" + contains: + - '"version": "8.0.0-rc.14"' +--- + +# 8.0.0-rc.14 → 8.0.0-rc.15 — User upgrade instructions + +## Order of steps + +Apply this guide from top to bottom. Several entries tell you to run `prisma contract emit`. In a SQL project, do the first steps in this order: + +1. Upgrade the framework packages and every extension that ships migrations in the same step (`contract-stores-data-type`). +2. Run the `data-type-in-contract` script (`contract-stores-data-type`) before any step that re-emits a contract. The script changes only files in the old format. +3. Run `prisma db sign` against every database (`sign-databases-after-upgrade`) before you re-emit. `db sign` must see the contract the database was created from, as the script rewrote it, before a re-emit changes it again. +4. Make the changes the other entries describe in your schema, your TypeScript contract and your application code. +5. Run `prisma contract emit`. One emit after all those changes covers every entry that asks you to re-emit. +6. Where an entry says the re-emit changes the storage hash, follow that entry's database steps: sign again, or plan and apply a migration. Do this before you deploy the application built with the new contract. + +A MongoDB project skips steps 2 and 3, because the script rewrites SQL contracts only. + +## `contract-stores-data-type` + +Upgrade every extension that ships migrations (for example `@prisma/orm-extension-pgvector` and `@prisma/orm-extension-postgis`) in the same step as the framework, to the release its authors published for this change. An extension whose contract space is still in the old format makes the project refuse to load. + +Do this before any other step of this release that re-emits a contract: the script changes only files in the old format, and `prisma db sign` (`sign-databases-after-upgrade`) must see the contract the database was created from before a re-emit changes it again. Commit your work first, so the script's changes can be reviewed and undone with git. The script follows links to files and directories, also outside the root, and rewrites the files there; commit or back up those too. Then run the script from the project root: + +```sh +node /upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts +``` + +`` is the directory of the synced `prisma-8` skill. Node 24 or later runs the TypeScript script directly; it needs no `tsx`. It reads and writes files only and needs no database. It rewrites every `*.json` file under the root that parses as a SQL contract in the old format (a column or `storage.types` entry that stores `nativeType`), skipping `node_modules`, `.git`, `dist` and `build`. That includes a test fixture of an old-format contract: if you keep such a fixture on purpose, restore it with git afterwards (`git restore `), or keep it outside the project root. In each contract it rewrites, it also writes lists in this release's new form (`reemit-explicit-list-cardinality`): a list column or field stored as `many: true` becomes `many: { elementNullable: false }`, and `contract.d.ts` declares `many` on every column. This is the SQL part of `refresh-historical-list-contracts`. + +On PostgreSQL, a list column of an enum keeps the membership check its database has, because the database still holds that check. Run `prisma db sign` before you emit the contract again. The next `prisma contract emit` writes the check as `array_remove(…) <@ ARRAY[…]` under a new name; `prisma migration plan` then writes a migration that drops the old check and adds the new one, and `prisma db migrate` applies it. The plan warns that dropping the old check may lose data; it does not, because only the check changes, not the column. If you already emitted before signing, `db sign` reports the new check as missing: sign each database with the storage hash the script printed instead (`prisma db sign `), then plan and migrate as above. + +If the script stops on an error, for example on a full disk, it prints the error and `the upgrade stopped partway, run the script again to finish it`, and exits 1. After an error, Ctrl-C or a crash, run it again: it finishes the upgrade. A file the script was writing at that moment is either unchanged or complete, and it removes its own temporary files (ending in `.data-type-in-contract-tmp`) on the next run. + +Run your formatter afterwards. The script replaces text in `migration.ts` and `contract.d.ts`, so the import order in `migration.ts` and the line wrapping in `contract.d.ts` can differ from what a fresh emit and your formatter produce. + +When it finishes, it prints how many files it rewrote and how many snapshot directories it renamed, and each storage hash it replaced (` -> `). A contract already in the new format is never changed, even when its stored hash does not match its content, so a project already in the new format is left unchanged, and the script says that nothing changed. If it finds no SQL contract under the root, it says so; run it again from the project root. It prints `: stored hash did not recompute; rehashed from content` for an old-format contract whose stored storage hash does not match its content, and rewrites it anyway. It changes no file and exits 1 when a column uses a codec it does not know (`: unknown codec ; name its data type with --data-type =`) or when a renamed snapshot directory already exists with different content. + +The script knows every codec that Prisma and its own extensions ship. For a codec from another extension, pass the line that extension publishes in its upgrade notes, once per codec, for example `--data-type acme/shape@1=acme/shape`. The option cannot change the data type of a codec the script already knows for a contract's target, but it can name the data type of a shared `sql/*` codec on a target the script does not know. + +On SQLite, the contract now stores a literal default of an `Int` column as digit text, as it already stored a `BigInt` default: an `Int` default that was the JSON number `42` becomes the text `"42"`. The script makes this change. Planned SQL does not change (`DEFAULT 42`), and a database the previous release created still verifies. A `BigInt` default of 2^53 or less, which the previous release's check after `prisma db migrate` reported as missing, now passes. The same holds for the members of an `enum` typed by an integer codec (`@@type("sqlite/integer@1")`, `@@type("sql/int@1")`): the script writes their stored values as digit text. The schema does not change: members are written as before, for example `Low = 1`. An `enum` typed by `sqlite/json@1` now stores the JSON text of each member's document, and the script rewrites its stored values to that text; in the schema, write each member as a string holding that JSON text, for example `Low = '"low"'` instead of `Low = "low"`, and `Level = "1"` instead of `Level = 1`. + +## `sign-databases-after-upgrade` + +The upgrade gives every contract a new storage hash. Each database's marker still holds the old hash, so until you sign it: + +- `prisma db migrate` refuses to run with `MIGRATION.MARKER_MISMATCH`; +- `prisma db verify` exits with code 4 and `CONTRACT.MARKER_MISMATCH`; +- `prisma migration status` does not label the migrations applied before the upgrade as applied. + +The running application does not report the mismatch: it keeps answering queries and logs nothing, because the `postgres()` client has no logger for the marker check. + +Run `prisma db sign` against every database (development, staging, production) before you deploy the application built with the new contract: + +```sh +prisma db sign --db "$DATABASE_URL" +``` + +`db sign` verifies the live schema of every contract space (the application's and each extension's) against its contract, then writes the marker of every space that verified, in one transaction on PostgreSQL and SQLite. It advances each signed space's `db` ref, or the ref `--advance-ref ` names. Running it again changes nothing. A space that fails verification is not signed: the command prints its differences and exits with code 4. Repair that schema first (for example a Supabase database whose `auth` schema drifted from the extension's contract), then sign again. + +A script that reads `db sign --json` reads one outcome per space. The document was `{ ok, summary, contract, target, marker }` for the application's space; it is now: + +```json +{ + "ok": true, + "summary": "Database signed", + "spaces": [ + { + "space": "app", + "status": "updated", + "contract": { "storageHash": "…", "profileHash": "…" }, + "previous": { "storageHash": "…", "profileHash": "…" } + } + ], + "advancedRefs": [{ "space": "app", "name": "db", "hash": "…" }] +} +``` + +Every space has `space`, `status` and `contract`, the hashes of the space's contract. `status` is `created` (the space had no marker), `updated` (with `previous`, the hashes the marker held), `unchanged` (the marker already held the contract's hashes), `failed` or `conflict`. A failed space also has `schema`, the verification result, and `ok` is `false`. A space in conflict is one whose marker another process, such as `migrate`, changed while `db sign` ran: it has `expected` and `found`, the marker hashes `db sign` read and the ones it found, it is not signed, and the command exits with code 4; run `db sign` again once that process has finished. + +Code that signs through the programmatic control API calls `client.dbSign({ contract, migrationsDir })` instead of `client.sign({ contract })`, which is removed with `SignOptions` and `SignDatabaseResult`. `dbSign` verifies every contract space and signs each one that verified, as `db sign` does. + +## `column-descriptors-drop-native-type` + +In `contract.ts` and every other file that builds a column descriptor by hand, delete the `nativeType` property. The contract takes the column's data type from its codec. + +```ts +// before +const pgText = { codecId: 'pg/text@1', nativeType: 'text' } as const; +const Priority = enumType('Priority', { codecId: 'pg/int4@1', nativeType: 'int4' }, member('Low', 0)); + +// after +const pgText = { codecId: 'pg/text@1' } as const; +const Priority = enumType('Priority', { codecId: 'pg/int4@1' }, member('Low', 0)); +``` + +Code that reads a column of a stored contract (`contract.storage…tables[name].columns[name]`) reads `dataType`, the data type id such as `pg/text`, instead of `nativeType`, the database type name such as `text`: + +```tsx +// before +{column.nativeType} + +// after +{column.dataType} +``` + +Code that builds a stored contract's column by hand, for example a test fixture, writes the data type id in `dataType` instead of the type name in `nativeType`: + +```ts +// before +id: { nativeType: 'uuid', nullable: false, codecId: 'pg/uuid@1' }, + +// after +id: { dataType: 'pg/uuid', nullable: false, codecId: 'pg/uuid@1' }, +``` + +A type written by hand for such a contract changes the same way: `readonly nativeType: 'int4'` becomes `readonly dataType: 'pg/int4'`. + +## `parameter-casts-use-base-names` + +Update tests that assert query text or SQL snapshots: + +| Before | After | +| --- | --- | +| `$1::integer` | `$1::int4` | +| `$1::smallint` | `$1::int2` | +| `$1::bigint` | `$1::int8` | +| `$1::real` | `$1::float4` | +| `$1::double precision` | `$1::float8` | +| `$1::boolean` | `$1::bool` | +| `$1::integer[]` | `$1::int4[]` | + +Extension types keep their names (`$1::vector`, `$1::geometry`). + +## `ts-contract-lists-extension-codecs` + +A column's stored database type name is now written from the data type of the column's codec, so the contract build needs the pack that provides the codec. Add every extension whose codec the contract uses: + +```ts +import pgvector from '@prisma/orm-extension-pgvector/pack'; +import { defineContract } from '@prisma/orm-postgres/contract-builder'; + +export const contract = defineContract( + { extensions: { pgvector } }, + ({ field, model }) => ({ + // … + }), +); +``` + +A contract that already lists the extension changes nothing. `contract.json` does not change. + +## `sqlite-contract-d-ts-char-aggregates` + +Run `prisma contract emit` for a SQLite project. The emitted `contract.d.ts` adds these rows under both `AggregateTypes.max.byCodec` and `AggregateTypes.min.byCodec`: + +```ts +readonly 'sql/char@1': { readonly output: 'sql/char@1'; readonly nullable: true }; +readonly 'sql/varchar@1': { readonly output: 'sql/varchar@1'; readonly nullable: true }; +``` + +`contract.json`, `storageHash`, `profileHash` and migration snapshots do not change, so no migration or re-sign is needed. + +## `column-helpers-raise-type-params-invalid` + +The error now comes from `defineContract`, not from the helper call. Code that catches it by its code checks the new code, around the contract build: + +```ts +// before +if (error.code === 'CONTRACT.ARGUMENT_INVALID') { /* … */ } + +// after +if (error.code === 'CONTRACT.TYPE_PARAMS_INVALID') { /* … */ } +``` + +The error's `meta` is `{ dataType, parameters, modelName, fieldName }`, for example `{ dataType: 'postgis/geometry', parameters: ['srid'], modelName: 'Place', fieldName: 'location' }`, in place of `helperPath`, `expected` and `received`. A contract that passes `srid: 0` now fails when it is built; PostgreSQL refuses an SRID below 1, so such a column never migrated. Use a real SRID such as `4326`, or `geometryColumn` for a column with no SRID. + +The build checks every column, so the PostgreSQL column helpers' parameters are checked too: a contract with `varcharColumn(0)` or `numericColumn(2000)` now fails when it is built, where before `migration plan` or `db verify` failed. + +## `reemit-explicit-list-cardinality` + +Re-run contract emission from each application's original PSL or TypeScript authoring source using its existing Prisma configuration (`pnpm exec prisma contract emit`, with `--config` where needed). Replace both `contract.json` and `contract.d.ts`, including contracts for composed spaces. Do not patch just the generated declarations or copy old hashes into newly emitted JSON. Scalar-only contract JSON remains compatible: omitted `many` in serialized model and value-object fields still means scalar. Generated domain-field declarations also omit scalar `many`; SQL storage-column declarations retain required cardinality. + +For hand-authored contract objects, replace a list's `many: true` with `many: { elementNullable: false }` to preserve its existing strict-element meaning. Serialized non-list model and value-object fields may omit `many`; deserialization normalizes omission to `many: false`, and canonical emission omits it again. Keep nested `elementNullable: false` in list descriptors. Native SQL array columns use the same descriptor; non-array storage columns use `many: false`. If adopting an intermediate representation with a sibling `elementNullable`, move that property into the `many` descriptor and remove the sibling. Explicit malformed `many` values, including the old boolean-list form and descriptors without a boolean `elementNullable`, and sibling-property representations are rejected. Do not change relation cardinality or mark JSON-backed value-object storage as a native SQL array. + +Keep `nullable` unchanged: it describes the whole value, not list elements. Existing `String[]` and `String[]?` declarations and `.many()` calls retain non-null elements. Only when nullable elements are intended, use `String?[]` / `String?[]?` or `.many({ elementsNullable: true })` / `.many({ elementsNullable: true }).nullable()`. The authoring option is plural `elementsNullable`; the emitted descriptor uses singular `elementNullable`. Generated types distinguish `ReadonlyArray` from `ReadonlyArray | null`. + +Keep explicit `.noCheck('elementNotNull')` / `@noCheck(elementNotNull)` waivers on strict lists. They waive enforcement without permitting null in the declared element type. Do not infer nullable elements from a waiver or replace waivers during this representation upgrade. If intentionally changing a list to nullable elements, remove that now-inapplicable waiver and review the resulting PostgreSQL check-constraint change or MongoDB validator change separately. + +## `refresh-historical-list-contracts` + +For SQL contracts, the `contract-stores-data-type` script of the same release rewrites stored list columns and fields to this form and refreshes hashes and snapshot names, so historical SQL snapshots need no re-emission; MongoDB contracts still do. On PostgreSQL, the script keeps the membership check of an enum list column as the database holds it; run `prisma db sign` before you emit the contract again, and the next `prisma contract emit` writes the new check under a new name, which `prisma migration plan` and `prisma db migrate` then apply. + +For MongoDB contracts, inventory every stored contract pair, not only the current application contract: include migration snapshots, fixture migration chains, composed-space snapshots, and any generated contracts imported by application tooling. Re-emit each historical state from its own authoring source and configuration, preserving that state's extensions, storage mappings, defaults, and explicit waivers. Do not emit today's schema over every historical snapshot. + +Use the project's snapshot-store and migration-generation tooling to write each emitted JSON/declaration pair and update its references. The new native-list representation can change contract hashes even when existing strict-list DDL is unchanged. When a hash changes, create the corresponding content-addressed snapshot entry and update imports of both JSON and declarations, migration start/end contract hashes, and dependent migration metadata consistently. Process predecessor states before successors, including all branches and composed-space dependencies; regenerate derived migration identifiers and parent references where the tooling requires it. Preserve the recorded operations unless a separate reviewed schema change is intended. + +Do not blanket-replace hexadecimal filenames, rename snapshot directories without updating references, edit hash fields by hand, or delete snapshots still referenced by a migration. Check that every reference resolves and that every stored JSON/declaration pair describes the same historical state. If the original source or a complete reference mapping is unavailable, stop and recover it rather than guessing. + +For already-applied migrations, retain the original history and reconcile the database's recorded migration identities and contract markers through the project's supported migration procedure before deploying newly emitted contracts. Do not rewrite applied history or reset a database merely to satisfy the new hashes. Rehearse the transition on a disposable database and verify both the migration graph and database contract verification; a clean typecheck alone cannot establish consistency. + +## `mongo-nullable-list-containers` + +For Mongo schemas with nullable list containers (`T[]?` or `T?[]?`), re-emit the current `contract.json` and `contract.d.ts` using your normal `prisma contract emit` command. The collection validator now uses `bsonType: ['null', 'array']` for these fields; element constraints and required-list behavior are unchanged. The changed validator changes the storage hash, so keep the generated contract pair together. + +For an existing database, preserve applied migrations and their contract snapshots. Plan a new migration from the existing contract to the re-emitted contract, review the validator update, and apply it through your normal migration deployment flow before writing explicit null containers. Deploying new application code alone does not update a Mongo collection validator. Do not rewrite applied historical migrations or their hashes. + +For disposable example or test databases whose migration fixtures are regenerated from source, regenerate that fixture chain with its existing tooling, including referenced contract snapshots and migration metadata, and recreate the disposable database. In the Prisma 8 source repository, `pnpm fixtures:emit` re-emits current contracts and regenerates example migration fixtures; retain existing content-addressed snapshots alongside any newly emitted snapshots, then run the example's formatter/import organizer if new snapshot paths change import order. This fixture-only procedure is not a production migration procedure. + +## `domain-types-match-their-columns` + +Run `prisma contract emit`. `contract.json` and `contract.d.ts` gain these entries in the domain half: + +| PSL | Added to the field's domain entry | +| --- | --- | +| `code Short`, with `types { Short = VarChar(10) }` (also `Short[]`) | `"typeParams": { "length": 10 }` on `type` | +| `roles Role[]`, where `Role` is an `enum` | `"valueSet": { "plane": "domain", "entityKind": "enum", "namespaceId": "public", "entityName": "Role" }`, as `role Role` already had | +| composite type member `amount Numeric(10, 2)` (also a list, or a named type) | `"typeParams": { "precision": 10, "scale": 2 }` on `type` | +| composite type member `role Role` or `roles Role[]` | the same `valueSet` as a model field of that enum | + +A named type without parameters, such as `Email = String`, adds nothing. + +In `contract.d.ts`, a composite type's output type (`AddressOutput`) now gives a member with type parameters the parameterized output type a model field of that type has, such as `Varchar<10>` or `Numeric<10, 2>`, instead of the codec's plain output type. These are branded strings, so code that builds such an output object from plain strings, such as a test fixture or a mock, no longer type-checks. Build the value as the ORM returns it, or type it with the composite type's input type (`AddressInput`), which is unchanged. + +Migration snapshots under `migrations/snapshots//` need no change. Migration commands read only their storage half, which is unchanged. + +`prisma contract print` now expects a field typed by a parameterized named type, and an enum list field, to carry these domain entries. It refuses a contract emitted before this change that lacks them. Re-emit it first. + +## `value-object-default-matches-composite-type` + +A literal default on a field typed by a composite type used to be stored whatever its shape. It is now checked, naming the path that is wrong, as in `Field "User.home.street"`: + +- A single value object takes a JSON object, and a list of them a JSON array: `` homes Address[] @default(json`{"street": "x"}`) `` is refused; write `@default([])` or `` @default(json`[{"street": "x"}]`) ``. JSON `null` is taken when the field is optional. `PSL_VALUE_TYPE_INCOMPATIBLE`. +- A key that is not a member is refused, and so is a missing member that is not optional, and `null` for a member that is not optional. `PSL_VALUE_TYPE_INCOMPATIBLE`. +- The default holds each member in the form its codec stores, so the member's codec must read the value. A `Decimal`, `Numeric(p, s)` or `BigInt` member takes a decimal string, `"1.5"`, and a number is refused; a `String` member takes a JSON string, so `"street": 1` is refused; a `DateTime` member takes a date and time string; a `Json` member takes any JSON value. `PSL_INVALID_DEFAULT_LITERAL`, with the codec's message. +- A member typed by an enum takes only the enum's values: `PSL_INVALID_DEFAULT_LITERAL`, `Expected one of:` the values. +- Nested value objects are checked the same way. + +Correct the value the diagnostic names. + +## `composite-type-attributes-refused` + +An attribute inside a `type` block was ignored: `street String @default("x")` stored no default, and `@@map` mapped nothing. Each is now refused, `PSL_UNSUPPORTED_FIELD_ATTRIBUTE` on a member and `PSL_UNSUPPORTED_COMPOSITE_TYPE_ATTRIBUTE` on the type. Remove the attribute. To give a value object a default, write it on the model field as a whole value, such as `` home Address @default(json`{"street": "x"}`) ``. + +## `codecs-check-stored-json` + +The built-in SQL, PostgreSQL and SQLite codecs now refuse a value that is not a stored form of their type, including one its type parameters rule out, where most used to pass it through. A TypeScript `.default()` given such a value is now refused when the contract is built, with `CONTRACT.DEFAULT_INVALID` naming the model and field: a value of another kind, such as a number for a text column, or one the PostgreSQL column rules in `psl-values-checked-by-codecs` refuse, such as `'toolong'` for a `varchar(3)` column. A TypeScript `enumType` member its codec does not take is refused the same way, with `CONTRACT.ENUM_INVALID` naming the enum, the member and the codec: for example a `pg/char@1` or `sql/char@1` member longer than one character on PostgreSQL, since the enum's column is `character`, which holds one. Correct the value the error names. + +A `contract.json` with such a default, emitted by an earlier version or edited by hand, still loads. `db init`, `db update` and `migration plan` used to plan the default; they now stop with `CONTRACT.DEFAULT_INVALID`, which names the table, the column, the codec and the value. Emit the contract again with this version, and correct the default in the contract source if emit refuses it. Running a `migration.ts` that an earlier version planned with such a default fails with the same message; correct the default in that file. Every statement that writes a default reads it this way: a new table or column, a changed default, and on SQLite a rebuilt table, which used to write a changed default or a rebuilt table's defaults unread. Each element of a list default is read the same way, and the message names the element's position: `Column "post"."tags" has a default (element 2) its codec pg/text@1 refuses: pg/text@1 JSON value must be a string`. A NULL element stays NULL. The codecs that carry PostgreSQL's own date and time text, those of `DateString`, `TimeString`, `TimestampString`, `TimestamptzString` and `Timetz`, read only a date or time in ISO 8601 or as PostgreSQL writes it, so such a default as `'now'`, which PostgreSQL would read once when it creates the table, is refused the same way. An `.include()` of such a column reads the text PostgreSQL writes in the ISO DateStyle, its default; on a server set to another DateStyle it now fails with `RUNTIME.DECODE_FAILED`, where it passed the text through. Set `DateStyle` to `ISO` on that server. + +## `psl-values-checked-by-codecs` + +The PSL reader reads each literal default, and each member of a SQL `enum`, with the column's codec, so the stricter codecs refuse schemas that loaded before. A value of another kind is refused: a text codec takes a string, an integer codec an integer in its range, `Boolean` `true` or `false`, and `Uuid` a UUID. On PostgreSQL the codecs also check what the column stores: + +- `VarChar(n)` and `Char(n)` take at most n characters, counted by code point, and a `Char` value's trailing spaces do not count. A `Char` without a length is `character(1)`, so it takes one character. +- `Bit(n)` takes exactly n bits and `VarBit(n)` at most n, and a bit column without a length is `bit(1)`. +- `Numeric(p, s)` takes a value it stores without rounding. +- `Int`, `sql/int@1` and an enum whose members are integers take an integer from -2147483648 to 2147483647, and `SmallInt` one from -32768 to 32767. +- `Real` takes a finite number only if float4 holds it, neither overflowing to an infinity nor becoming 0. + +Such a default used to load, and the migration planned and applied; the first insert that used the default then failed. A `Char` or bit column without a length, which did not apply on PostgreSQL whatever its default, now applies as `character(1)` or `bit(1)`. SQLite does not enforce a declared length, so on SQLite the char and varchar codecs take text of any length. Each of these is now refused at `contract emit`: + +| Schema | Diagnostic | +| --- | --- | +| `enum P { @@type("pg/int4@1") Low = "low" }` | `PSL_EXTENSION_INVALID_VALUE`: `enum "P" member "Low" was rejected by codec "pg/int4@1": pg/int4@1 JSON value must be an integer from -2147483648 to 2147483647` | +| the same enum with a bare `Low` | `PSL_ENUM_BARE_MEMBER_NON_STRING_CODEC`: `enum "P" member "Low" has no value and codec "pg/int4@1" does not accept a bare name as input` | +| `enum P { @@type("pg/text@1") Low = 1 }` | `PSL_EXTENSION_INVALID_VALUE`, `enum "P" member "Low": pg/text has no cast from pg/int2; it casts from nothing` | +| an enum without `@@type` whose integer members include one outside -2147483648 to 2147483647, such as `Low = 3000000000` | `PSL_EXTENSION_INVALID_VALUE`, `enum "P" member "Low": pg/int4 has no cast from pg/int8; it casts from pg/int2` | +| `u Uuid @default("nope")` | `PSL_INVALID_LITERAL`, `"nope" is not a UUID: PostgreSQL reads 32 hexadecimal digits, with a hyphen after any group of four and optionally in braces.` | +| `s VarChar(3) @default("toolong")` | `PSL_INVALID_DEFAULT_LITERAL`, `sql/varchar@1 JSON value must be a string of at most 3 characters` | +| `c Char @default("abc")` on PostgreSQL | `PSL_INVALID_DEFAULT_LITERAL`, `sql/char@1 JSON value must be a string of at most 1 character before any trailing spaces` | +| `enum P { @@type("sql/int@1") Low = 3000000000 }` on PostgreSQL | `PSL_EXTENSION_INVALID_VALUE`, `enum "P" member "Low": pg/int4 has no cast from pg/int8; it casts from pg/int2` | +| `n Numeric(5, 2) @default(1.555)` | `PSL_INVALID_DEFAULT_LITERAL`, `pg/numeric@1 JSON value must be a decimal string that numeric(5, 2) stores without rounding` | + +Give each enum member a value its codec takes, and each default a value its column's type holds unchanged. A `Uuid` default is still read in any form PostgreSQL reads; see `uuid-defaults-stored-as-postgresql-writes`. + +## `uuid-defaults-stored-as-postgresql-writes` + +A `Uuid` default may be written in any form PostgreSQL reads: either case, with or without a hyphen after any group of four digits, and optionally in braces. The contract now stores it as PostgreSQL writes it, in lower case and hyphenated 8-4-4-4-12, and so does a TypeScript `.default()` on a `pg/uuid@1` column, so the applied default verifies against the database with no difference. + +Earlier versions stored such a default as written. The database stores the lower-case form, so the check that runs after the change is applied failed: `db init`, `db update` and `db migrate` stopped with `MIGRATION.RUNNER_FAILED` and rolled the change back. The database has none of the changes that contract adds, and no marker for it. With this version, a `contract.json` that still holds such a default stops `db init`, `db update` and `migration plan` with `CONTRACT.DEFAULT_INVALID`, as `codecs-check-stored-json` describes. + +Emit the contract again with this version. The stored default changes, and with it the storage hash. Then: + +- For a project kept with `db init` or `db update`, run the command that failed again. It applies the contract, and `db verify` then passes. +- For a project with migrations, delete the migration package that never applied: its directory under `migrations/app/`, and its contract snapshot `migrations/snapshots//`, where `` is the `to` hash in the package's `migration.json`. Then run `prisma migration plan` and `prisma db migrate`. Left in place, the package stays in the migration graph, ending at a contract no database reaches. + +## `ts-enum-member-written-as-stored` + +The types of a TypeScript contract name each `enumType` member as written, in `db.enums` and in the types of the fields that use the enum, while `contract.json` and the database hold what the column's codec stores. The two now have to be the same value, so `defineContract` refuses a member its codec stores as something else and says what to write: + +```text +CONTRACT.ENUM_INVALID: enumType("Key"): member "A" is written "A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11", but the column stores "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11". Write the member as "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11". +``` + +A member its codec does not take at all, such as text that is not a uuid on `pg/uuid@1`, is refused with a different message; `codecs-check-stored-json` describes it. + +Refused members: + +- On a uuid column (`pg/uuid@1`), a member with an upper-case hex digit, in braces, or with hyphens anywhere other than the 8-4-4-4-12 positions (including none). Write it in lower case, hyphenated 8-4-4-4-12. +- A member that got past the type check with a value of another type its codec still takes, for example through a cast: the number `1` on `pg/int8@1`, which stores `"1"`, is refused with "Write the member as 1n". + +1. Run `prisma contract emit`, or run the code that calls `defineContract`. Each refused member is reported with the value to write. To find uuid members first, search the calls to `member(` in your contract for a uuid that is not lower case, hyphenated 8-4-4-4-12. The detection for this change looks for calls to `enumType(`; if you import it under another name, as in `import { enumType as defineEnum }`, it does not find them, so search for that name. +2. Rewrite each refused member as the message says. Code that reads members through the enum, such as `Key.members.A` or `db.enums.public.Key.members.A`, needs no change. Code that compares a value with the old spelling does: values read from the database were always in the stored form. +3. Re-emit. If a column uses the enum, its membership CHECK constraint's expression changes, and a CHECK constraint's name is derived from its expression, so the storage hash and the constraint's name both change. Plan and apply a migration: it drops the old CHECK constraint and adds the new one. Dropping a constraint is a destructive operation, so the plan needs the destructive operation class allowed. + +## `mongo-codecs-check-json` + +A Mongo codec's `decodeJson` reads the JSON form of its type. The Mongo runtime reads documents through `decode` and never calls it; the PSL reader calls it for each member of an enum. `mongo/string@1`, `mongo/objectId@1`, `mongo/int32@1`, `mongo/double@1`, `mongo/bool@1`, `mongo/vector@1` and `mongo/bson@1` used to return any JSON value as it was, so an enum member of the wrong kind was stored in the contract: + +```prisma +enum Priority { + @@type("mongo/int32@1") + Low = "low" +} +``` + +This is now refused with `PSL_EXTENSION_INVALID_VALUE`, naming the codec's message, `mongo/int32@1 JSON value must be an integer from -2147483648 to 2147483647`. A member written without a value, such as a bare `Low`, under a codec that does not take text is `PSL_ENUM_BARE_MEMBER_NON_STRING_CODEC`. Give each member a value of the codec's type. + +Each codec now takes: `mongo/string@1` a string; `mongo/objectId@1` 24 hexadecimal digits; `mongo/int32@1` an integer from -2147483648 to 2147483647; `mongo/double@1` a number, or the text `"NaN"`, `"Infinity"` or `"-Infinity"`, which its `encodeJson` now writes for those values instead of a number JSON cannot hold; `mongo/bool@1` a boolean; `mongo/date@1` the text `Date.toISOString()` writes; `mongo/vector@1` an array of numbers; and `mongo/bson@1` canonical Extended JSON, the form its `encodeJson` writes. Another value throws `RUNTIME.DECODE_FAILED` with the codec id in `meta`. A TypeScript `enumType` member that `mongo/objectId@1` or `mongo/int32@1` does not hold now throws `RUNTIME.ENCODE_FAILED` when the contract is built. + +## `text-array-elements-nullable` + +`pg/text-array@1`, the codec of a contract-free `textArray()` column, reads a `text[]` column's NULL elements as `null`, so its application type is `readonly (string | null)[]` where it was `readonly string[]`. Code typed by a `textArray()` column, or by `min` or `max` over one, sees `string | null` elements; handle the `null`. Read through an `.include()`, a two-dimensional `text[]` value now throws `RUNTIME.DECODE_FAILED`, where it read as the text `"a,b"`. + +## `char-reads-drop-only-padding` + +PostgreSQL pads a `char(n)` value with spaces to its length: `'a'` in a `char(3)` column is stored as `'a '`. A flat read dropped every trailing whitespace character, so a stored `'a\t'` also read as `"a"`, while `.include()` returned the padded text, `"a "`. Both reads now return the value without the padding and nothing more: `"a"` for `'a'`, and `"a\t"` for `'a\t'`. On SQLite, which does not pad, both reads drop trailing spaces, as a flat read did. Code that compared an included `char` value with its padding, or relied on a flat read dropping a trailing tab or newline, compares the value without its padding. + +## `sqlite-nan-parameters-refused` + +SQLite cannot store NaN: bound as a parameter, it becomes NULL. So `create({ value: 0 / 0 })` on an optional `Float` column stored NULL, and `where((p) => p.value.eq(Number.NaN))` matched nothing. On SQLite, `sqlite/real@1` and `sql/float@1` now refuse NaN with `RUNTIME.ENCODE_FAILED`, ` value must be a number other than NaN, which SQLite cannot store`, with `meta.codecId` and `meta.received`: when they encode a value to write or filter by, and when they encode a TypeScript `.default()`, which is still refused when the contract is built with `CONTRACT.DEFAULT_INVALID`, now with this message. Their `decodeJson` refuses the text `"NaN"`. A NaN parameter no codec encoded, such as one in raw SQL, is refused by the SQLite driver with the same code: `Parameter 2 is NaN, which SQLite cannot store: it would bind it as NULL. Pass null to store no value.`, with `meta.paramIndex`, counted from 0. On a required column SQLite already refused the NULL, so only the error changes. Where a computed value can be NaN, write `null` for no value, and filter with `isNull()` for rows that have none. Infinity and -Infinity are stored and read back as before. + +## `sqlite-int-include-refuses-inexact-values` + +`sql/int@1` holds a JavaScript safe integer. On SQLite, an INTEGER column can hold a larger integer or a REAL. An `.include()` read such a value rounded or with a fraction; it now throws `RUNTIME.DECODE_FAILED`, naming the codec. A flat read is unchanged. Store an integer past 2^53 in a `BigInt` column and a fraction in a `Float` column. + +## `prefixed-sql-tags-are-removed` + +`pg.sql` and `sqlite.sql` were second names for the `sql` tag. They are removed, and a schema that uses one is refused with `PSL_UNKNOWN_LITERAL_TAG`: `Unknown literal tag "pg.sql". Known tags: sql, json.` + +Replace the tag with `sql` and leave the text unchanged: + +```diff +- createdAt DateTime @default(pg.sql`(now() + interval '1 hour')`) ++ createdAt DateTime @default(sql`(now() + interval '1 hour')`) +``` + +The stored default does not change, so no migration follows. + +## `default-diagnostic-codes-changed` + +This matters only to code that reads PSL diagnostic codes, such as a test that asserts one. The messages did not change, except for a `sql` literal inside a list literal and the list of known tags, both described below the table. + +| Refusal | Old code | New code | +| --- | --- | --- | +| A tag no pack registered | `PSL_UNKNOWN_DEFAULT_LITERAL_TAG` | `PSL_UNKNOWN_LITERAL_TAG` | +| A `json` literal whose text is not a JSON document | `PSL_INVALID_JSON_LITERAL` | `PSL_INVALID_LITERAL` | +| Text an authoring entry or a cast refused | `PSL_INVALID_DEFAULT_LITERAL` | `PSL_INVALID_LITERAL` | +| A value whose type the column's type has no cast from, including a list written on a column that holds one value | `PSL_DEFAULT_TYPE_INCOMPATIBLE` | `PSL_VALUE_TYPE_INCOMPATIBLE` | +| A written form the target has no data type for | `PSL_DEFAULT_TYPE_INCOMPATIBLE` | `PSL_VALUE_TYPE_INCOMPATIBLE` | +| A single value on a list column | `PSL_DEFAULT_TYPE_INCOMPATIBLE` | `PSL_DEFAULT_LIST_EXPECTED` | +| A value the column's codec refused | `PSL_INVALID_DEFAULT_LITERAL` | unchanged | +| A `sql` literal inside a list literal | `PSL_INVALID_DEFAULT_LITERAL`, at the element | `PSL_VALUE_TYPE_INCOMPATIBLE`, at the `@default` attribute | + +`PSL_INVALID_JSON_LITERAL` no longer exists. + +The unknown-tag message lists the known tags in the order the stack registers them. The SQL family registers `sql` before the target registers `json`, so a Postgres or SQLite stack lists `sql, json`, where it used to list `json, sql, pg.sql` or `json, sql, sqlite.sql`. The completion list and the `Expected one of` message of `@default` offer `sql` before `json` for the same reason. + +A `sql` literal inside a list literal used to report `Literal tag "sql" produces a default of its own and cannot be an element of a list literal.` It is now refused by the cast rule, like any other value the column's type does not take: `Field "Post.tags" at element 1: pg/text has no cast from sql/expression; it casts from nothing`. Write the whole list as one `sql` literal instead, as in `` @default(sql`'{}'::text[]`) ``. + +This supersedes the codes named in the `data-types-column-defaults` app instructions of the upgrade from 8.0.0-rc.11 to 8.0.0-rc.12: where they name `PSL_DEFAULT_TYPE_INCOMPATIBLE` for a value a column's type has no cast from, or `PSL_INVALID_JSON_LITERAL`, read the new codes above. + +## `migration-ts-column-defaults` + +A `migration.ts` no longer carries a column default as SQL text. The control adapter writes the `DEFAULT …` clause for every statement, the same way for a new table, a new column, a changed default and a rebuilt SQLite table, and it reads a literal default with the column's codec first. A `migration.ts` that sets a default the codec refuses fails when it runs, with `CONTRACT.DEFAULT_INVALID` naming the table and the column. + +On PostgreSQL, `setDefault` takes the column and its default: + +```typescript +// before +this.setDefault({ table: 'user', column: 'role', defaultSql: "DEFAULT 'member'" }) +// after +this.setDefault({ table: 'user', column: col('role', 'text', { default: lit('member'), codecRef: { codecId: 'pg/text@1' } }) }) +``` + +On SQLite, a column in `addColumn` or `recreateTable` carries the default and its codec, and a `recreateTable` postcheck that checks a default names the column: + +```typescript +// before +{ name: 'role', typeSql: 'TEXT', defaultSql: "DEFAULT 'member'", nullable: false } +{ description: 'verify "role" default on "user"', sql: "SELECT COUNT(*) > 0 FROM pragma_table_info('user') WHERE ..." } +// after +{ name: 'role', typeSql: 'TEXT', default: { kind: 'literal', value: 'member' }, codecRef: { codecId: 'sqlite/text@1' }, nullable: false } +{ description: 'verify "role" default on "user"', columnDefault: 'role' } +``` + +An applied migration needs nothing: `db migrate` applies `ops.json`, which holds the SQL. Change a `migration.ts` this way only when you run it again to write `ops.json`. `node migration.ts` does not check types, so an earlier file still runs; `setDefault`, `addColumn` and `recreateTable` then refuse a `defaultSql` with `MIGRATION.OPERATION_OPTION_REMOVED`, naming the table and the column, rather than leave the default out. Rewrite the call as shown, or, if the migration is not applied, delete its package and run `migration plan` again. + +The `migration.ts` that `migration plan` writes for a new SQLite table now gives each column its `codecRef`, so running it writes the same `ops.json` as the plan. To apply a changed PostgreSQL default that an earlier version planned, see [`postgres-changed-default-applied`](#postgres-changed-default-applied). + +## `postgres-changed-default-applied` + +A migration operation that changes an existing default on PostgreSQL checked afterwards only that the column has a default. The old default passes that check, and the runner skips an operation whose check already passes, so the default stayed as it was and verification then failed with `MIGRATION.SCHEMA_VERIFY_FAILED`. Such an operation now has no check afterwards and always runs; setting a default twice changes nothing. + +A migration package an earlier version planned keeps the old check in `ops.json`. If one changes a default and you have not applied it, write its `ops.json` again before you apply it with `prisma db migrate`. Either delete the package and run `prisma migration plan` again, or rewrite its `setDefault` call in `migration.ts` to the form [`migration-ts-column-defaults`](#migration-ts-column-defaults) shows and then run the file (`node migration.ts`). Run unchanged, the file stops with `MIGRATION.OPERATION_OPTION_REMOVED`, because its `setDefault` still passes `defaultSql`. `db update` plans again each time, so it needs nothing. + +## `cli-error-from-caught` + +`mapCaughtMigrationError(error)`, exported from `@prisma/orm-toolchain/cli/control-api` (`@internal/cli/control-api`), returned a CLI error unchanged and `null` for anything else, which the caller wrapped as `CLI.UNEXPECTED`. `errorFromCaught(error, why)`, exported from the same place, does the whole job: it returns a CLI error unchanged, reports any other error with a structured `NAMESPACE.SUBCODE` code as itself, reports anything else as `CLI.UNEXPECTED` with `why` given the error's message, and throws an `InternalError` again. Replace `mapCaughtMigrationError(error) ?? errorUnexpected(...)` with `errorFromCaught(error, (message) => ...)`. A caller that holds a database connection string passes it as `errorFromCaught(error, why, { connection })`, which removes it from every field of the reported error. + +## `sql-with-a-line-comment-gets-a-new-wire-name` + +Prisma names an index, check or policy after a hash of its SQL body. Before hashing, it normalizes the body. A body that contains `--` now keeps its line breaks, because a line break ends the comment and so changes what the body means. Every other body normalizes as before. + +This affects an index expression or predicate, a check expression, or a policy `using` or `withCheck` that contains both `--` and a line break. For such an object, re-emitting the contract changes the stored index, check or policy name in `contract.json`. The stored body does not change; only the hash input does. + +Re-emit the contract and run `migration plan`. The name's hash suffix changes, so the planned migration drops and recreates each affected object once. + +## `strict-verify-unclaimed-code` + +For each place that reads `CONTRACT.MARKER_REQUIRED` from a `prisma db verify --strict` run to detect tables no contract declares, read `CONTRACT.SCHEMA_VERIFICATION_FAILED` instead, or read the names from the result's `unclaimed` list. Leave code that reads `CONTRACT.MARKER_REQUIRED` to detect an unsigned database unchanged. + +## `prisma7-schema-date-types-are-text` + +For each project whose `prisma.config.ts` uses `prisma7Schema(...)`: + +1. Run `prisma contract emit`. The date and time fields change type: + + | Prisma 7 field | Before | Now | Example value | + | --- | --- | --- | --- | + | `DateTime`, `DateTime @db.Timestamp(p)` | `Temporal.PlainDateTime` | `string` | `"2026-09-14 10:00:00.123"` (UTC, as Prisma 7 writes it) | + | `DateTime @db.Timestamptz(p)` | `Temporal.Instant` | `string` | `"2026-09-14 10:00:00.123+00"` (on a server whose `TimeZone` is UTC) | + | `DateTime @db.Date` | `Temporal.PlainDate` | `string` | `"2026-09-14"` | + | `DateTime @db.Time(p)` | `Temporal.PlainTime` | `string` | `"10:00:00.123"` | + + `@db.Timetz` fields already read as text and do not change. + +2. Change the code that reads or writes these fields: + + - `DateTime` and `@db.Timestamp`: the text holds UTC wall-clock time with a space between the date and the time, where `.toString()` on a `Temporal.PlainDateTime` printed a `T`. Where code printed or stored that form, replace `value.toString()` with `value.replace(' ', 'T')`. Where it compares or computes with the value, `` new Date(`${value.replace(' ', 'T')}Z`) `` is the instant. + - `@db.Timestamptz`: the text carries the offset of the database session's `TimeZone`, `+00` on a server set to UTC. Do not apply `replace(' ', 'T')` to it. `new Date(value)` parses it in Node.js, and `new Date(value).toISOString()` prints the instant in UTC ending in `Z`, the form `.toString()` on a `Temporal.Instant` printed, with milliseconds always present. + - `@db.Date` and `@db.Time`: the text is the form `.toString()` on a `Temporal.PlainDate` or `Temporal.PlainTime` printed. + + Write a string PostgreSQL reads, such as `"2026-09-14 10:00:00"` for `DateTime` or `"2026-09-14T10:00:00Z"` for `@db.Timestamptz`, instead of a `Temporal` value. `@updatedAt` still writes UTC, as it did before and as Prisma 7 does, so existing rows need no change. + +3. If no other code in the application uses `Temporal`, remove the `import 'temporal-polyfill/full/global'` it had for these fields, and remove `temporal-polyfill` from the application's `dependencies`. Keep the dependency in a project that installs with Yarn: `@prisma/orm-postgres` declares it as a peer dependency, and Yarn does not install peers on its own. + +4. Run `prisma db sign` against every database the application uses. The storage hash changed with the column types. Until a database is signed, `prisma db verify --db "$DATABASE_URL"` exits with code 4 and reports `CONTRACT.MARKER_MISMATCH`. The running application does not report the mismatch: it keeps answering queries and logs nothing, because the `postgres()` client has no logger for the marker check. The database itself needs no migration. + +`prisma7Schema(...)` has no option to keep the `Temporal` types. A project that wants them writes a Prisma 8 contract, for example with `prisma contract print --output prisma/contract.prisma`, and changes the types there. + +## `contract-infer-writes-text-date-types` + +Nothing changes until `prisma contract infer` runs again. When it does, the rewritten contract uses the text types for `timestamp`, `timestamptz`, `date` and `time` columns. Follow steps 1 to 4 of `prisma7-schema-date-types-are-text` for the fields that changed, or change the types back to `Timestamp(p)`, `Timestamptz(p)`, `Date` and `Time(p)` in the inferred file to keep `Temporal` values. + +A default of `infinity` or `-infinity` on one of these columns now prints as `@default("infinity")` where it printed a `sql` expression. + +## `text-timestamp-now-is-utc` + +This covers `temporal.timestampString(p, onCreate: now, onUpdate: now)` in PSL and `field.temporal.timestampString(...)` with `'now'` in TypeScript. Rows these fields wrote before this release on a host outside UTC hold that host's local time; rows written from now on hold UTC. A Prisma 7 `DateTime @updatedAt` read through `prisma7Schema(...)` is not affected: it wrote UTC before and still does. + +## `contract-infer-writes-bytea-default-literals` + +Nothing changes until `prisma contract infer` runs again. A schema that keeps the `sql` default keeps working: schema verification reads it as the same bytes as the default in the database. + +When infer runs again, it writes each `bytea` default as the base64 the `Bytes` codec stores: + +| Before | Now | +| --- | --- | +| ``@default(sql`'\\x68656c6c6f'::bytea`)`` | `@default("aGVsbG8=")` | +| ``@default(sql`ARRAY['\\x68656c6c6f'::bytea]`)`` | `@default(["aGVsbG8="])` | + +1. Run `prisma contract emit`. The default is now stored as a value, so the storage hash changes. The default in the database does not change. +2. If you create the database with `prisma db init` or `prisma db update`, run `prisma db verify --schema-only` to confirm the schema matches, then `prisma db sign` to sign the database with the re-emitted contract. +3. If you use migrations, `prisma migration plan` refuses with "Contract changed but planner produced no operations", because nothing in the database changes. Run `prisma migration new --name bytea-default-literals` to write an empty migration from the earlier contract to the re-emitted one, then `prisma db migrate`. When `migration new` cannot tell where to start, pass `--from` with the `to` hash of your latest migration, which `prisma migration list` shows. + +Sign the database or apply the migration before you deploy the re-emitted contract. Until then `prisma db verify` exits with code 4 and `CONTRACT.MARKER_MISMATCH`, because the database marker holds the earlier storage hash. The running application does not report the mismatch: it keeps answering queries and logs nothing. + +## `prisma6-int-written-as-long` + +Prisma 6 stores a plain `Int` on MongoDB as a BSON long and presents it as a `number`. A contract read with `prisma6Schema(...)` used to give such a field the 32-bit int codec, so Prisma 8 wrote new values as BSON ints, and a fractional number was accepted and stored as a double. It now uses `mongo/int64Number@1`: a stored long reads as a `number`, Prisma 8 writes a `number` back as a long, and a value that is not a whole number within ±(2^53 − 1) is refused instead of rounded. The application type does not change. + +1. Repair every document in which a plain `Int` field holds a fractional number, whether the field is on the model, in an `Int[]` list, or in a composite type the model holds once or in a list. The previous contract let Prisma 8 store such a value as a BSON double, and `mongo/int64Number@1` refuses to read it (`RUNTIME.DECODE_FAILED`, "wire value is the fractional double 2.5"), so a query that returns such a document fails as a whole. For each plain `Int` field, in the collection its model is stored in, with the MongoDB shell (`mongosh`) or the driver: + - List the affected documents, to decide how to repair them. For a field on the model, this finds the fractional values: + + ```js + db.Post.find({ likes: { $type: 'double' }, $expr: { $ne: ['$likes', { $trunc: '$likes' }] } }) + ``` + + For a list or a composite value, this finds every document with a double in the field: `db.Post.find({ scores: { $type: 'double' } })` for an `Int[]` field, and `db.Post.find({ 'addresses.zip': { $type: 'double' } })` for `zip` in a composite type, whether `addresses` holds one value or a list. + + - Store every double in the field as a long. Choose `$round` or `$trunc`: `$round` rounds to the nearest whole number and a half to the even one (2.5 becomes 2, 3.5 becomes 4); `$trunc` drops the fraction (2.9 becomes 2). Whole-number doubles become longs either way. + + ```js + db.Post.updateMany({ likes: { $type: 'double' } }, [ + { $set: { likes: { $toLong: { $round: ['$likes', 0] } } } }, + ]) + ``` + + - For an `Int[]` field, convert each double in the list: + + ```js + db.Post.updateMany({ scores: { $type: 'double' } }, [ + { + $set: { + scores: { + $map: { + input: '$scores', + in: { + $cond: [ + { $eq: [{ $type: '$$this' }, 'double'] }, + { $toLong: { $round: ['$$this', 0] } }, + '$$this', + ], + }, + }, + }, + }, + }, + ]) + ``` + + - For a field of a composite type the model holds once (`address Address?`), write its dotted path (`'address.zip'` and `'$address.zip'`) in the filter and the update above. + - For a field of a composite type the model holds in a list (`addresses Address[]`), the dotted path fails with "$round only supports numeric types, not array". Rewrite each element of the list instead: + + ```js + db.Post.updateMany({ 'addresses.zip': { $type: 'double' } }, [ + { + $set: { + addresses: { + $map: { + input: '$addresses', + in: { + $mergeObjects: [ + '$$this', + { + zip: { + $cond: [ + { $eq: [{ $type: '$$this.zip' }, 'double'] }, + { $toLong: { $round: ['$$this.zip', 0] } }, + '$$this.zip', + ], + }, + }, + ], + }, + }, + }, + }, + }, + ]) + ``` + + Here `Post`, `likes`, `scores`, `address`, `addresses` and `zip` stand for the collection and the field names in the database, after `@@map` and `@map`. +2. Run `prisma contract emit`. In `contract.d.ts`, each plain `Int` field of the Prisma 6 schema is now typed with `mongo/int64Number@1` instead of `mongo/int32@1`; both read and write a `number`, so application code needs no change. `db sign` and `db verify` need nothing new: the contract carries no validators. + +## `prisma6-bytes-objectid-is-hex` + +Before this release, `prisma6Schema(...)` refused every native type other than `String @db.ObjectId`. It now reads each native type Prisma 6 accepts on MongoDB as the codec for the BSON type Prisma 6 stores. Only `DateTime @db.Timestamp` is still refused. + +A `Bytes @db.ObjectId` field stores an ObjectId, so Prisma 8 treats it like `String @db.ObjectId`: reads return the 24-digit hex string, and writes take a hex string or an ObjectId. The Prisma 6 client uses 12 bytes for the same field, and Prisma 8 refuses a `Buffer` or `Uint8Array` there. + +Where application code that moves to the Prisma 8 client passes or reads such a field, convert at the boundary: + +- bytes to the hex string Prisma 8 takes: `bytes.toString('hex')` for a `Buffer`, `Buffer.from(bytes).toString('hex')` for a `Uint8Array` +- the hex string Prisma 8 returns to bytes: `Buffer.from(hex, 'hex')` + +The stored values do not change: Prisma 6 and Prisma 8 read and write the same ObjectId. + +## `writes-on-a-conditional-collection-are-refused` + +`where`, `orderBy`, `limit`, `offset`, `distinct`, `distinctOn`, `cursor` and `include` now return the collection they were called on, with what they establish added to its type as a fact. A custom collection class keeps its methods through the chain, so `db.Post.where({ userId }).withTitle('orm')` and `db.Post.include('user').withTitle('orm')` compile. + +The facts have names. Write a filtered collection's type as `Filtered` and an ordered one as `Ordered`. `Filtered` is `C & HasWhere`, and `HasWhere` is the name error messages print. Import the names from the `orm-client` entry of your facade, for example `@prisma/orm-postgres/orm-client`. + +This entry and `cursor-and-distinct-on-check-the-receiver`, `apply-is-a-collection-member`, `overriding-a-chaining-method`, `collection-state-flags-are-boolean`, `read-collection-state-and-row-with-helpers`, `return-type-of-a-chaining-method`, `chaining-methods-take-no-explicit-type-arguments` and `custom-collection-methods-chain` apply to the SQL ORM client only. The MongoDB ORM client did not change; skip matches in code that uses it. + +A write needs a collection that is filtered on every code path. Code that filters only on some paths compiled before and no longer does: + +```ts +const posts = search ? db.Post.withTitle(search) : db.Post; +await posts.deleteAll(); // error: The 'this' context of type 'PostCollection' is not assignable to method's 'this' of type 'HasWhere' +``` + +The same applies to an `if` with an early return, a `switch`, a loop, and a `let` reassigned in an `if`. Make the write only where the filter was applied, or filter on every path: + +```diff +- const posts = search ? db.Post.withTitle(search) : db.Post; +- await posts.deleteAll(); ++ if (search) { ++ await db.Post.withTitle(search).deleteAll(); ++ } +``` + +If the code relied on deleting or updating every row when there is no filter, that was the unsafe case the check now refuses. State the intent with an explicit filter instead. + +## `writes-refuse-what-they-would-ignore` + +`updateAll`, `updateAndCount`, `deleteAll` and `deleteAndCount` change every row that matches the filter. They ignored a `limit`, an `offset`, a `cursor`, `distinct` and `distinctOn` on the collection, so a chain such as `db.orm.public.Post.where(...).limit(10).deleteAll()` deleted every matching row, not ten, and one with `.cursor({ id })` deleted the rows before the cursor too. They now throw `ORM.ARGUMENT_INVALID` instead. An order does not change which rows they change, and they still accept it. Remove what the write would ignore, or read the rows and change them by their ids: + +```diff +- await db.orm.public.Post.where({ userId }).limit(10).deleteAll(); ++ const ids = (await db.orm.public.Post.where({ userId }).select('id').limit(10).all()).map((p) => p.id); ++ await db.orm.public.Post.where((p) => p.id.in(ids)).deleteAll(); +``` + +`update` and `delete` change one row, the one `first()` returns, so the order, the offset, the cursor, `distinct` and `distinctOn` choose it; they are unchanged, except after `limit(0)`. `first()` replaces the limit with 1, so after `limit(0)` they changed one row; they now change none and return `null`. A `limit(0)` that a request can set, such as a page size of zero, no longer writes. + +The exception is `update` with a relation callback, such as `posts: (posts) => posts.connect(...)`. It finds its row by the filter alone and ignored the order, the limit, the offset, the cursor, `distinct` and `distinctOn`, so it could change another row than the chain chose. It now throws `ORM.ARGUMENT_INVALID` on a collection with any of them. Find the row first and filter to it: + +```diff +- await users.where({ teamId }).orderBy((u) => u.createdAt.asc()).update({ posts: (posts) => posts.connect([{ id: postId }]) }); ++ const oldest = await users.where({ teamId }).orderBy((u) => u.createdAt.asc()).select('id').first(); ++ if (oldest) await users.where({ id: oldest.id }).update({ posts: (posts) => posts.connect([{ id: postId }]) }); +``` + +## `cursor-and-distinct-on-check-the-receiver` + +`cursor` and `distinctOn` need an order on the collection they are called on. The check is on the receiver, so a cast on the argument no longer bypasses it: + +```ts +await db.Post.cursor({ id } as never).all(); // error: The 'this' context of type 'PostCollection' is not assignable to method's 'this' of type 'HasOrderBy' +``` + +Add the order the query needs: + +```diff +- await db.Post.cursor({ id } as never).all(); ++ await db.Post.orderBy((post) => post.id.asc()).cursor({ id }).all(); +``` + +Where the query is meant to run without an order, cast the collection instead of the argument: + +```ts +import type { Ordered } from '@prisma/orm-postgres/orm-client'; + +const unordered = db.Post as Ordered; +await unordered.cursor({ id }).all(); +``` + +## `apply-is-a-collection-member` + +Collections have a new method, `apply(fn)`, which calls `fn` with the collection and returns the result. A custom collection class that declares its own `apply` with another signature no longer compiles. Rename that member and its call sites: + +```diff + class PostCollection extends Collection { +- apply(limit: number) { return this.limit(limit); } ++ firstPage(limit: number) { return this.limit(limit); } + } +``` + +An aggregate operation named `apply` is now refused with `ORM.AGGREGATE_OPERATION_RESERVED` when the client is built; rename the operation. + +## `scope-is-a-collection-member` + +The `scope` change applies to the SQL ORM client only. The MongoDB ORM client did not change; skip matches in code that uses it. + +Collections have a new method, `scope(body)`, which defines a scope for the collection's model: `db.orm.public.Post.scope((posts) => posts.select('id', 'title'))`. A custom collection class that declares its own `scope` with another signature no longer compiles. Rename that member and its call sites: + +```diff + class PostCollection extends Collection { +- scope(userId: string) { return this.where({ userId }); } ++ ownedBy(userId: string) { return this.where({ userId }); } + } +``` + +An aggregate operation named `scope` is now refused with `ORM.AGGREGATE_OPERATION_RESERVED` when the client is built; rename the operation. + +## `overriding-a-chaining-method` + +A class that extends `Collection` and overrides one of the chaining methods, or one of the methods that return rows (`all`, `first`, `create`, `createAll`, `upsert` and the writes), must declare the override with the new signature: a type parameter for the receiver, a `this` parameter of that type, and the result type the base method returns. Call the base method with `call` and explicit type arguments, so that the receiver type passes through: + +```diff + class PostCollection extends Collection { +- override limit(n: number) { +- return super.limit(Math.min(n, 100)); +- } ++ override limit(this: Self, n: number): Self { ++ return super.limit.call(this, Math.min(n, 100)); ++ } + } +``` + +Only classes that extend the SQL `Collection` are affected; skip matches in other classes. + +## `collection-state-flags-are-boolean` + +`DefaultCollectionTypeState` declares `hasWhere`, `hasOrderBy` and `hasUniqueFilter` as `boolean`, meaning not known. A method that establishes a flag sets it to `true`. Where your code expects `false`, expect `boolean`: + +```diff +- type Check = Equal['hasOrderBy'], false>; ++ type Check = Equal['hasOrderBy'], boolean>; +``` + +A type of your own that sets a flag to `false` should set it to `boolean`. The writes still need `hasWhere: true`, and `cursor` and `distinctOn` still need `hasOrderBy: true`. + +## `read-collection-state-and-row-with-helpers` + +`where`, `orderBy` and `include` record what they establish in two declared properties, not in the type arguments of `Collection`. Inferring the third or fourth type argument gives the row and the state the collection started with. Read them with `CollectionRowOf` and `CollectionTypeStateOf` instead: + +```diff +- type RowOf = C extends Collection ? Row : never; +- type UsersRow = RowOf; ++ import type { CollectionRowOf } from '@prisma/orm-postgres/orm-client'; ++ type UsersRow = CollectionRowOf; +``` + +To keep a helper of your own, constrain its parameter, because both helpers require one: + +```ts +import type { CollectionRowOf, CollectionTypeStateOf, HasRow, HasTypeState } from '@prisma/orm-postgres/orm-client'; + +type RowOf = CollectionRowOf; +type StateOf = CollectionTypeStateOf; +``` + +## `return-type-of-a-chaining-method` + +The chaining methods are generic in their receiver, and `ReturnType` of a generic method uses the constraint of its type parameter. `ReturnType` is now `HasWhere`, and `ReturnType` is `unknown`. Write the type with `Filtered` after `where`, `Ordered` after `orderBy`, and the collection type itself after `limit`, `offset`, `distinct`, `distinctOn` and `cursor`. You can also take `typeof` of a value: + +```diff +- type MatchingPosts = ReturnType; ++ import type { Filtered } from '@prisma/orm-postgres/orm-client'; ++ type MatchingPosts = Filtered; +``` + +`ReturnType` of a method of your own class, such as `ReturnType`, still works. + +## `chaining-methods-take-no-explicit-type-arguments` + +These methods infer their receiver from the call. With explicit type arguments the receiver is not inferred: `posts.include<'user'>('user')` does not compile, `posts.distinct<['title']>('title')` and `posts.distinctOn<['title']>('title')` fail with "Expected 2 type arguments, but got 1", and `ReturnType>` is `never`. Drop the type arguments. They are inferred from the arguments, so `distinct<['title']>('title')` becomes `distinct('title')`: + +```diff +- const titles = posts.distinct<['title']>('title'); ++ const titles = posts.distinct('title'); +``` + +To name the type of an include, call `include` on a value and take its type: + +```diff +- type WithUser = ReturnType>; ++ const withUser = posts.include('user'); ++ type WithUser = typeof withUser; +``` + +## `custom-collection-methods-chain` + +Custom collection methods are now available after `where`, `orderBy`, `limit` and the other chaining methods. Where code on a client built with `orm({ collections })` repeats a class method's body inline after a chaining call on that class, it can call the method. A client without custom classes, such as `db.orm`, has no such methods. + +```diff + return db.Post.forUser(userId) +- .orderBy((post) => post.createdAt.desc()) ++ .newestFirst() + .limit(limit) + .all(); +``` + +Here `newestFirst()` is a method of the application's `PostCollection` whose body is that `orderBy`. + +## `variant-takes-discriminator-value` + +For every `.variant(...)` call matched by `detection`, replace the variant's model name with the discriminator value that variant declares. Read the value from the contract: in PSL it is the second argument of the variant's `@@base(Base, "")`; in the TypeScript builder it is the `value` under the base model's `discriminator.variants.`; in `contract.json` it is `domain.namespaces..models..variants..value`. + +```ts +// before +db.orm.public.Task.variant('Bug'); +db.orm.events.variant('ViewProductEvent'); + +// after, for @@base(Task, "bug") and a ViewProductEvent variant declaring "view-product" +db.orm.public.Task.variant('bug'); +db.orm.events.variant('view-product'); +``` + +Custom collection methods that call `this.variant('')`, and helpers or closures that call `.variant()`, change the same way. When the argument is a variable or a forwarded parameter, follow it back to where the model name is written and replace it there, including in type annotations that list variant model names. Update code comments and READMEs that show `.variant('')` too. + +The type checker catches most old call sites, because the parameter only accepts the base model's declared values. It does not catch a call whose model-name argument happens to equal a declared value, for example a variant model declared with `@@base(Base, "Admin")`. Such a call keeps compiling and now selects the variant declaring that value, so check every call site against the contract rather than relying on type errors. + +A call that passes a value through `as never` or another cast also escapes the type checker. At runtime, a value the base model does not declare, or a `variant()` call on a model without a discriminator, throws `ORM.ARGUMENT_INVALID`. The error names the model and lists its declared values. Previously the call returned the collection unchanged, so the query read every variant. Code that relied on that fallback must stop calling `variant()` in that case. + +A second `.variant()` call on a variant collection is rejected. It no longer replaces the first selection: it is a type error, and at runtime it throws `ORM.OPERATION_UNSUPPORTED` naming the model and the discriminator value already selected. Select each variant from the base collection instead, and keep a reference to the base collection where code needs more than one variant. + +```ts +// before +const bugs = db.orm.public.Task.variant('Bug'); +const features = bugs.variant('Feature'); + +// after +const tasks = db.orm.public.Task; +const bugs = tasks.variant('bug'); +const features = tasks.variant('feature'); +``` + +## `imported-postgres-field-checks-defaults` + +`import { field } from '@prisma/orm-postgres/contract-builder'` now gives the same field builders the `defineContract` callback receives, without the ones an extension adds: `field.text()`, `field.temporal.timestamptz()`, `field.uuidString()`, and `field.column(columnType)` as before. Its `.default(...)` now checks the value against the Postgres target's column types; a column type an extension adds, such as pgvector's `vector`, is not checked. A default of another type no longer compiles: + +```diff +- field.column(int8Column).default(1) ++ field.column(int8Column).default(1n) +``` + +## `re-emit-for-the-row-locking-capabilities` + +The typed SQL builder gains four methods that lock the rows a select reads, named after the SQL they render: `forUpdate()`, `forNoKeyUpdate()`, `forShare()` and `forKeyShare()`. Each takes an optional `{ of, nowait, skipLocked }`: `of` names the tables or aliases to lock, and `nowait` and `skipLocked` exclude each other. A lock lasts until the transaction ends, so use it inside `db.transaction(...)`: + +```ts +await db.transaction(async (tx) => { + const [job] = await tx.query( + tx.sql.public.job + .select('id') + .where((f, fns) => fns.eq(f.state, 'queued')) + .limit(1) + .forUpdate({ skipLocked: true }) + .build(), + ); +}); +``` + +Each method and each option is gated on a capability key that the Postgres adapter now reports: `sql.forUpdate`, `sql.forShare`, `postgres.forNoKeyUpdate`, `postgres.forKeyShare`, and `sql.lockOf`, `sql.lockNowait`, `sql.lockSkipLocked` for the options. A `contract.json` emitted before this release carries none of them, so the methods do not exist on its builder. + +Re-emit your contract to pick up the keys: + +```console +prisma contract emit +``` + +Nothing else changes. The keys are additive, the storage hash does not move, and every existing query behaves exactly as before. You only need to re-emit if you want to use the new methods. SQLite reports none of the keys, because SQLite has no row locks. + +## `cache-annotation-ttl-removed` + +The read annotation no longer carries a lifetime. The store decides how long an entry lives. The default store, which `createCacheMiddleware()` uses when you pass no `store`, keeps every entry for 60 seconds. + +This also changes behaviour without a type error. Before, a read annotated without `ttl` (`cacheAnnotation({})`, `cacheAnnotation({ key })`, or a `ttl` that evaluated to `undefined`) was not cached. Now every annotated read in runtime scope is cached. If a read must stay uncached, remove its annotation, or pass `cacheAnnotation({ bypass: true })`. + +In each file that calls `cacheAnnotation(...)`: + +1. Remove the `ttl` property. `cacheAnnotation({ ttl: 60_000 })` becomes `cacheAnnotation({})`, and `cacheAnnotation({ ttl, key })` becomes `cacheAnnotation({ key })`. +2. Remove any variable, function parameter or option field that existed only to supply that `ttl` (for example a `ttlMs` option on a helper that wraps the annotated read), and remove it from its callers. +3. If every read used the same lifetime and it was not 60 seconds, set it once on the store: `createCacheMiddleware({ store: createInMemoryCacheStore({ ttlMs }) })`. `ttlMs: Infinity` never expires. If reads need different lifetimes, write a custom `CacheStore` that reads the lifetime from the annotation's `meta` (see `cache-store-object-arguments`), and pass it as `cacheAnnotation({ meta: { ttlMs } })`. +4. Update comments and READMEs that say the annotation needs a `ttl`, that caching happens "within the TTL window" of the annotation, or that an annotation without `ttl` passes through. Say instead that an annotated read is cached and the default store keeps the entry for 60 seconds. + +Before: + +```ts +export async function getUsersCached(limit = 10, ttlMs = 60_000) { + const plan = db.sql.public.user + .select('id', 'email') + .annotate(cacheAnnotation({ ttl: ttlMs })) + .limit(limit) + .build(); + return db.runtime().query(plan); +} +``` + +After: + +```ts +export async function getUsersCached(limit = 10) { + const plan = db.sql.public.user + .select('id', 'email') + .annotate(cacheAnnotation({})) + .limit(limit) + .build(); + return db.runtime().query(plan); +} +``` + +## `cache-annotation-skip-renamed-bypass` + +In each file that imports from `@prisma/orm-extension-middleware-cache`: + +1. Rename `skip` to `bypass` in every `cacheAnnotation(...)` argument: `cacheAnnotation({ skip: forceRefresh })` becomes `cacheAnnotation({ bypass: forceRefresh })`. Only rename `skip` inside a `cacheAnnotation` argument or a value typed `CachePayload`; leave other `skip` properties alone. +2. Rename the type `CachePayload` to `CacheAnnotationOptions`, in imports and in uses. +3. Update comments that describe `skip` on the annotation, or that say `skip` wins over a `ttl`. + +## `cache-middleware-store-options` + +In each call to `createCacheMiddleware(...)`: + +- If the options contain only `maxEntries: 1000` (or `1_000`), and no `clock`, call `createCacheMiddleware()` with no options. +- Otherwise, move `maxEntries` and `clock` to a store: `createCacheMiddleware({ maxEntries: 500 })` becomes `createCacheMiddleware({ store: createInMemoryCacheStore({ maxEntries: 500 }) })`, importing `createInMemoryCacheStore` from `@prisma/orm-extension-middleware-cache`. The middleware's `clock` used to stamp `storedAt` only; it now drives the store's expiry. + +`createInMemoryCacheStore` options are all optional now: `maxEntries` (default 1000), `ttlMs` (default 60 000) and `clock` (default `Date.now`). + +## `cache-store-object-arguments` + +Only for code that implements `CacheStore`, as a typed object, a class, or an object literal passed inline to `createCacheMiddleware({ store: { ... } })`. The types reject the old shape, but an untyped JavaScript store fails only at run time, so check each one. + +1. Keep a version per key: an integer, 0 for a key never seen, that only `unset` changes. Keep it even for keys that hold no value, for at least as long as a read can take. +2. Change `get(key)` to `get({ key, meta })`, returning a `CacheEntry`: `{ key, meta, version, data }`, where `meta` is the `meta` passed in, `version` the key's current version, and `data` is `{ empty: true }` on a miss or `{ empty: false, value }` with the stored rows. `meta` is the read annotation's `meta`, or `undefined`. A store that matches `meta` folds the versions of whatever `meta` names into `version`, and does the same in `set`; a store that does not index `meta` ignores it here. +3. Change `set(key, entry, ttlMs)` to `set(entry, value)`, returning a boolean. `entry` is the `CacheEntry` your `get` returned; `value` is the rows. Store `value` under `entry.key` only if the key's version still equals `entry.version`, and return whether you stored. The comparison and the write must be atomic against `unset`: one synchronous step in memory, or one server-side script (for example Lua on Redis). There is no unconditional write and no `ttlMs` argument: the store sets the lifetime itself, as a fixed value or read from `entry.meta`. Code that prefilled the cache with `set(key, entry, ttlMs)` now calls `get` and then `set`. +4. Add `unset({ keys, meta })`. It removes the values stored under `keys` when `keys` is not `undefined`, and increments the version of every one of those keys, whether or not it holds a value. When `meta` is not `undefined`, it removes the values whose `meta` matches, compared by value, and increments their versions; a store that does not index `meta` must throw instead of ignoring it. +5. Replace `CachedEntry` with `CachedRows` (the rows, `readonly Record[]`) for stored values and `CacheEntry` for what `get` returns. Type the store as `CacheStore`, which is `CacheStore`; `createCacheMiddleware` rejects a store of any other value type, `unknown` included. There is no `storedAt`. + +Before: + +```ts +const store: CacheStore = { + async get(key) { + const raw = await redis.get(key); + return raw ? (JSON.parse(raw) as CachedEntry) : undefined; + }, + async set(key, entry, ttlMs) { + await redis.set(key, JSON.stringify(entry), 'PX', ttlMs); + }, +}; +``` + +After: + +```ts +const SET_IF_VERSION = ` + if tonumber(redis.call('GET', KEYS[2]) or '0') ~= tonumber(ARGV[2]) then return 0 end + redis.call('SET', KEYS[1], ARGV[1], 'PX', 60000) + return 1`; + +const store: CacheStore = { + async get({ key, meta }) { + const [raw, version] = await redis.mget(`value:${key}`, `version:${key}`); + return { + key, + meta, + version: Number(version ?? 0), + data: raw ? { empty: false, value: JSON.parse(raw) as CachedRows } : { empty: true }, + }; + }, + async set(entry, value) { + const keys = [`value:${entry.key}`, `version:${entry.key}`]; + const json = JSON.stringify(value); + return (await redis.eval(SET_IF_VERSION, 2, ...keys, json, entry.version)) === 1; + }, + async unset({ keys, meta }) { + if (meta !== undefined) { + throw new Error('This store does not index meta'); + } + for (const key of keys ?? []) { + await redis + .multi() + .del(`value:${key}`) + .incr(`version:${key}`) + .pexpire(`version:${key}`, 60_000) + .exec(); + } + }, +}; +``` + +## `contract-artifacts-restamp` + +For every `contract.json` matched by `detection`, run the project's emit command (`prisma contract emit`, or the project's `contract:emit` script) once after upgrading. This entry accounts for the extension's embedded `version` moving to `8.0.0-rc.15`; any other difference in the emitted files comes from an earlier entry in this guide. diff --git a/upgrade-instructions/pending/data-type-in-contract/app/scripts/data-type-in-contract.ts b/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts similarity index 100% rename from upgrade-instructions/pending/data-type-in-contract/app/scripts/data-type-in-contract.ts rename to skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts diff --git a/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/instructions.md b/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/instructions.md new file mode 100644 index 000000000000..5e4523a5f0f3 --- /dev/null +++ b/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/instructions.md @@ -0,0 +1,2168 @@ +--- +from: "8.0.0-rc.14" +to: "8.0.0-rc.15" +changes: + - id: contract-stores-data-type + summary: | + A SQL contract names each column's data type in `dataType` (for example `pg/int4`) instead of + its database type name in `nativeType`. Run the colocated script on the extension's contract + space (it also writes lists in this release's new form), release the extension against the + framework version that contains this change, and raise its peer dependency floor to that + version: the old framework refuses a rewritten contract space and the new framework refuses + an old one, so your users upgrade the framework and the extension in one step. Publish a + `--data-type` line for each codec the extension owns. + detection: + glob: "**/*.json" + matches: + - '"nativeType"\s*:\s*"' + script: ./scripts/data-type-in-contract/data-type-in-contract.ts + - id: reemit-extension-list-contracts + summary: Re-emit bundled extension contracts and reconcile changed snapshot hashes and references; for SQL contract spaces, `contract-stores-data-type` rewrites the historical snapshots. + - id: consume-nested-list-cardinality + summary: Update contract producers and consumers for explicit cardinality and nested element nullability. + - id: sql-data-type-declares-names + summary: | + A SQL data type now declares how the database writes and reports it. Declare an extension's + SQL data types with `sqlDataType(id, { params, texts, ... })` from + `@internal/sql-contract/data-type` instead of `dataType(id, ...)`. Migrations, schema + verification and PostgreSQL parameter casts read the column type's name from this + declaration only. + detection: + glob: "**/*.{ts,mts,cts}" + matches: + - '(?]*>\s*=\s*\{(?=[^;]*\bcodecDescriptors\b)(?![^;]*\bdataTypes\b)' + - '\bcreatePostgresAdapter\s*\(\s*\{(?=[^}]*\bcodecDescriptors\b)(?![^}]*\bdataTypes\b)' + - id: column-descriptors-drop-native-type + summary: | + `ColumnTypeDescriptor` and authored `storage.types` entries lose `nativeType`, the pack + metadata loses its `types.storage` list and `StorageTypeMetadata` is deleted, `column()` + loses its fourth argument, and a codec descriptor's + `columnFromEntity` returns `{ typeParams }` only. The contract takes a column's data type from + its codec. A `types` constraint over what `type.*` helpers return is + `Record` instead of `Record`. + `StorageTypeInstanceInput` takes `dataType`, the id of the data type the codec represents, + in place of `nativeType`. + detection: + glob: "**/*.{ts,mts,cts}" + matches: + - '(?' + - '\bStorageTypeInstanceInput\b' + - '\bStorageTypeMetadata\b' + - '\bstorage\s*:\s*\[\s*\{\s*typeId\b' + - id: sqlite-data-types-are-stored-types + summary: | + The SQLite target declares only the types SQLite stores, plus the two character types: + `sqlite/text`, `sqlite/integer`, `sqlite/real`, `sqlite/blob`, `sqlite/character` and + `sqlite/character-varying`. `sqlite/json`, `sqlite/datetime` and `sqlite/bigint` are deleted: + a codec, cast or authoring entry that names one fails assembly. The JSON and date-time codecs + represent `sqlite/text`, the big integer codecs `sqlite/integer`. The date-time canonical form + moves from `sqlite/datetime` to the codec `sqlite/datetime@1`, whose descriptor declares + `toCanonicalForm`. + detection: + glob: "**/*.{ts,mts,cts}" + matches: + - '[''"`]sqlite/(?:json|datetime|bigint)[''"`]' + - '\bsqlite(?:Json|Datetime|Bigint)\.id\b' + - id: canonical-form-of-a-column + summary: | + A column's canonical form comes from one function, `canonicalFormOf(codec, dataTypes)` in + `@internal/framework-components/codec`: the codec's `toCanonicalForm` when it declares one, + else its data type's. `CanonicalDateTimeOptions.dataTypeId` is renamed `ownerId`. + `SqlColumnDefaultIRInput` carries `toCanonicalForm` instead of `dataType`, and + `SqlColumnIRInput` gains `toCanonicalForm`. `DefaultMappingOptions.columnDataType` is + replaced by `columnCodec`, the column's codec descriptor. + detection: + glob: "**/*.{ts,mts,cts}" + matches: + - '\bCanonicalDateTimeOptions\b' + - '\bcanonicalDateTime\s*\(' + - '\bcolumnDataType\b' + - '\bSqlColumnDefaultIR\b' + - id: authoring-entry-key-checked + summary: | + Assembly refuses an authoring entry filed under the wrong key with + `CONTRACT.DATA_TYPE_ENTRY_KEY_INVALID`: an entry whose tag names the type it yields (`type`) + sits under `tagEntryKey(tag)`, and an entry under a data type's id names no `type`. + detection: + glob: "**/*.{ts,mts,cts}" + matches: + - '\bkind\s*:\s*[''"]tag[''"]' + - id: the-sql-tag-writes-the-sql-expression-data-type + summary: | + Lowering entries are removed. Every entry in `authoring.dataTypes` is a `DataTypeAuthoringEntry` + keyed by a registered data type id, and `sql` is the tag of the data type `sql/expression`. + detection: + glob: "**/*.{ts,mts,cts}" + matches: + - '\b(loweringEntryKey|isLoweringEntryKey|isDataTypeLoweringEntry)\b' + - '\b(AuthoringDataTypeEntry|DataTypeLoweringAuthoringEntry|TaggedLiteralValue)\b' + - '\bsqlDefaultLiteralTagEntry\b' + - '\bcreate(Postgres|Sqlite)DataTypeEntries\b' + - '\bPSL_INVALID_DEFAULT_SQL\b' + - id: prefixed-sql-tags-are-removed + summary: | + The tags `pg.sql` and `sqlite.sql` are removed. Write `sql`. + detection: + glob: "**/*.{prisma,ts}" + matches: + - '(?` where the query is meant to have no order. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\.(?:cursor|distinctOn)\s*\([^)]*\bas\s+never\b' + - id: apply-is-a-collection-member + summary: | + Every collection now has an `apply` method. A custom collection class that declares its own `apply` member with another signature no longer compiles; rename it. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '(?:^|\n)[ \t]*(?:(?:public|protected|private|readonly|static|async|override)\s+)*apply\s*[(<:=?]' + - id: scope-is-a-collection-member + summary: | + Every collection now has a `scope` method. A custom collection class that declares its own `scope` member with another signature no longer compiles; rename it. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '(?:^|\n)[ \t]*(?:(?:public|protected|private|readonly|static|async|override|get|set)\s+)*scope\s*[!(<:=?]' + - id: overriding-a-chaining-method + summary: | + In a class that extends `Collection`, an override of a chaining method (`where`, `orderBy`, `limit`, `offset`, `distinct`, `distinctOn`, `cursor`, `include`) or of a method that returns rows (`all`, `first`, `create`, `createAll`, `upsert`, `update`, `updateAll`, `updateAndCount`, `delete`, `deleteAll`, `deleteAndCount`) must use the new signature, which takes a `this` parameter. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '(?:^|\n)[ \t]*(?:(?:public|protected|override|async)\s+)*(?:where|orderBy|limit|offset|distinct|distinctOn|cursor|include|all|first|create|createAll|upsert|update|updateAll|updateAndCount|delete|deleteAll|deleteAndCount)\s*[(<]' + - id: collection-state-flags-are-boolean + summary: | + In `DefaultCollectionTypeState`, `hasWhere`, `hasOrderBy` and `hasUniqueFilter` are `boolean` (not known) instead of `false`. Code that expects `false` on a collection with no filter or order must expect `boolean`. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\bhas(?:Where|OrderBy|UniqueFilter)\b[''"]?\]?\s*,\s*false\b' + - '\bhas(?:Where|OrderBy|UniqueFilter)\s*:\s*false\b' + - id: read-collection-state-and-row-with-helpers + summary: | + A collection's type state and row are read with `CollectionTypeStateOf` and `CollectionRowOf`, not by inferring the type arguments of `Collection`. The type arguments keep what the collection started with. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\bCollection<[^;]*?\binfer\b' + - id: return-type-of-a-chaining-method + summary: | + `ReturnType` of `where`, `orderBy`, `limit`, `offset`, `distinct`, `distinctOn`, `cursor` or `include` no longer gives a collection. Write `Filtered` after `where`, `Ordered` after `orderBy`, and `C` after the others, or take `typeof` of a value. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\bReturnType<[^>]*\[[''"](?:where|orderBy|limit|offset|distinct|distinctOn|cursor|include)[''"]\]' + - '\bReturnType<\s*typeof\s+[\w$.]+\.(?:where|orderBy|limit|offset|distinct|distinctOn|cursor|include)\b' + - id: chaining-methods-take-no-explicit-type-arguments + summary: | + `include`, `distinct` and `distinctOn` with explicit type arguments no longer compile: `posts.include<'user'>('user')` and `posts.distinct<['title']>('title')` fail, and `ReturnType>` is `never`. Drop the type arguments; they are inferred from the arguments, so `posts.distinct('title')` needs none. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\.(?:include|distinct|distinctOn)<' + - id: custom-collection-methods-chain + summary: | + Optional. Custom collection methods now stay available after the built-in chaining methods. Where code repeats a class method's body inline after a chaining call, it can call the method instead. + detection: + glob: "**/*.{ts,mts,cts,tsx}" + matches: + - '\bextends\s+Collection<' + - id: variant-takes-discriminator-value + summary: | + `.variant()` on a polymorphic SQL or Mongo ORM collection takes the discriminator value a variant declares instead of the variant's model name: `db.orm.public.Task.variant('bug')` for `@@base(Task, "bug")`, where it used to be `.variant('Bug')`. A value the model does not declare, or a call on a model with no discriminator, now throws `ORM.ARGUMENT_INVALID` instead of returning the collection unchanged. `.variant()` on a collection that already has a variant selected is now rejected: select the variant from the base collection. + detection: + glob: "**/*.{ts,tsx,mts,cts}" + matches: + - '\.variant\(' +--- + +# 8.0.0-rc.14 → 8.0.0-rc.15 — Extension author upgrade instructions + +Apply the sections in this order: + +1. Run the script of `contract-stores-data-type` first, before any step of this release that re-emits a contract. It rewrites only contracts in the old format. +2. Make the code changes in the sections that follow. +3. Before you re-emit, sign each database the extension's tests or tooling keep with `prisma db sign`, as `contract-stores-data-type` describes: `db sign` must see the contract the database was created from before a re-emit changes it again. +4. Re-emit the extension's contracts and test fixtures with `prisma contract emit` (`build:contract-space`) once, after the code changes. Several sections ask for it: `reemit-extension-list-contracts`, `consume-nested-list-cardinality`, `domain-types-match-their-columns` and `uuid-defaults-stored-as-postgresql-writes`. Where the re-emit changes the schema, plan and apply a migration as those sections say. + +After the code changes, delete imports and constants that are no longer used, and run the package's formatter so imports are sorted. + +## `contract-stores-data-type` + +Do this before any other step of this release that re-emits a contract: the script changes only files in the old format, and `prisma db sign` must see the contract the database was created from before a re-emit changes it again. Commit your work first, so the script's changes can be reviewed and undone with git. The script follows links to files and directories, also outside the root, and rewrites the files there; commit or back up those too. Then run the script that sits next to this guide from the extension package's root. `` is the directory of the synced `prisma-8` skill: + +```sh +node /upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts +``` + +Node 24 or later runs the TypeScript script directly; it needs no `tsx`. It reads and writes files only and needs no database. It rewrites every `*.json` file under the root that parses as a SQL contract in the old format (a column or `storage.types` entry that stores `nativeType`), skipping `node_modules`, `.git`, `dist` and `build`. That includes a test fixture of an old-format contract: if you keep such a fixture on purpose, restore it with git afterwards (`git restore `), or keep it outside the project root. In each contract it rewrites, it also writes lists in this release's new form (`consume-nested-list-cardinality`): a list column or field stored as `many: true` becomes `many: { elementNullable: false }`, and `contract.d.ts` declares `many` on every column. This is the SQL part of `reemit-extension-list-contracts`. + +On PostgreSQL, a list column of an enum keeps the membership check its database has, because the database still holds that check. Run `prisma db sign` before you emit the contract again. The next `prisma contract emit` writes the check as `array_remove(…) <@ ARRAY[…]` under a new name; `prisma migration plan` then writes a migration that drops the old check and adds the new one, and `prisma db migrate` applies it. The plan warns that dropping the old check may lose data; it does not, because only the check changes, not the column. If you already emitted before signing, `db sign` reports the new check as missing: sign each database with the storage hash the script printed instead (`prisma db sign `), then plan and migrate as above. + +If the script stops on an error, for example on a full disk, it prints the error and `the upgrade stopped partway, run the script again to finish it`, and exits 1. After an error, Ctrl-C or a crash, run it again: it finishes the upgrade. A file the script was writing at that moment is either unchanged or complete, and it removes its own temporary files (ending in `.data-type-in-contract-tmp`) on the next run. + +Run your formatter afterwards. The script replaces text in `migration.ts` and `contract.d.ts`, so the import order in `migration.ts` and the line wrapping in `contract.d.ts` can differ from what a fresh emit and your formatter produce. + +When it finishes, it prints how many files it rewrote and how many snapshot directories it renamed, and each storage hash it replaced (` -> `). A contract already in the new format is never changed, even when its stored hash does not match its content, so a project already in the new format is left unchanged, and the script says that nothing changed. If it finds no SQL contract under the root, it says so; run it again from the project root. It prints `: stored hash did not recompute; rehashed from content` for an old-format contract whose stored storage hash does not match its content, and rewrites it anyway. It changes no file and exits 1 when a column uses a codec it does not know (`: unknown codec ; name its data type with --data-type =`) or when a renamed snapshot directory already exists with different content. + +The script knows every codec that Prisma and its own extensions ship. For each codec your extension owns, run the script with `--data-type =`, naming the data type that codec represents, for example `--data-type acme/shape@1=acme/shape`. Publish those lines in your release notes: your users pass the same options when they run the script on their projects. The option cannot change the data type of a codec the script already knows for a contract's target, but it can name the data type of a shared `sql/*` codec on a target the script does not know. + +Release the extension with the rewritten contract space against the framework version that contains this change, and raise the extension's peer dependency floor on the framework to that version. The two versions cannot be mixed: the old framework refuses a contract space that stores `dataType`, and the new framework refuses one that still stores `nativeType`. So a release published early cannot be installed before the framework upgrade. Tell your users to upgrade the framework and your extension in the same step. + +## `reemit-extension-list-contracts` + +Regenerate bundled `contract.json` and `contract.d.ts` together from the extension's original authoring source and configuration, including each owned contract space. Use the existing contract-space emission command rather than hand-editing generated fields or hashes. For the Supabase extension in this repository, `pnpm --filter @internal/extension-supabase build:contract-space` regenerates `src/contract/contract.json` and `src/contract/contract.d.ts`; its separate `emit` script targets test fixtures, not this bundled contract. + +Preserve existing strict-element declarations and explicit `elementNotNull` waivers. In particular, a Supabase native-array column with `noCheck: ['elementNotNull']` remains `many: { elementNullable: false }`, not a nullable-element list. Scalar domain JSON continues to omit `many: false`; list descriptors change, and generated contract hashes may change. Retaining old hash literals is not a valid regeneration. Scalar domain JSON and declarations omit `many: false`; SQL storage-column declarations retain required cardinality. + +For SQL contract spaces, the script of `contract-stores-data-type` already writes the list form and refreshes hashes and snapshot names, so historical SQL snapshots need no re-emission; MongoDB contract spaces still do. + +For extension-owned MongoDB migration snapshots, regenerate each historical state from its own source, not the latest extension schema. Write the JSON/declaration pair through the snapshot store and regenerate dependent migration metadata in dependency order. If a snapshot hash changes, preserve the old entry while it is referenced, create the new content-addressed entry, and update both JSON/type imports, start/end contract hashes, and derived migration identifiers and parent references consistently. Preserve recorded operations unless intentionally changing the schema. Do not blanket-rename hash paths, drop migration references, or rewrite applied history. Coordinate already-applied migration identities and database contract markers through the consumer project's supported migration procedure and verify the transition on a disposable database. Stop if historical sources or the reference mapping cannot be recovered. + +## `consume-nested-list-cardinality` + +`ContractField.many` and `StorageColumn.many` are now `false | { elementNullable: boolean }`. `ContractField.many` is optional: omission and `false` both mean scalar. `StorageColumn.many` remains required, with `false` for non-array storage columns. Serialized model and value-object fields may omit `many` for scalar cardinality; deserialization normalizes omission to `many: false`, and canonical emission omits that scalar default again. Replace legacy `many: true` with `many: { elementNullable: false }` for existing strict-element lists, preserving nested `elementNullable: false` during emission. Move any intermediate sibling `elementNullable` property into the list descriptor and remove the sibling. Explicit malformed `many` values, including the old `true` form and descriptors without a boolean `elementNullable`, remain rejected, as does the sibling property. + +For domain fields, use `if (field.many)` to detect and narrow a list descriptor before reading `elementNullable`; omitted `many` is scalar. For normalized storage columns, replace `column.many === true` with `column.many !== false`. Update conditional types that matched `{ many: true }` to match the descriptor. Do not broaden this replacement to unrelated booleans or relation cardinality. For example, the included-column decoder in an ORM extension must replace `ref.storageColumn.many === true` with `ref.storageColumn.many !== false` so native arrays still take the element-decoding path. + +Preserve the independent meaning of `nullable` (the whole field value) and `many.elementNullable` (each element). Type generators must produce `ReadonlyArray` for nullable elements and add an outer `| null` only for a nullable container. Array encoders and decoders must preserve a whole-list `null` without traversal and bypass the element codec for null elements, while processing non-null elements normally. Do not pass null elements into scalar codecs or collapse null lists into empty arrays. + +For native SQL arrays, propagate element semantics to both the domain field and storage column. For JSON-backed value-object lists, retain the domain descriptor but do not add a native-array descriptor to storage. Do not add `elementNullable` to schema IR: PostgreSQL migration comparison observes the derived check constraints. Generate `elementNotNull` only for strict-element arrays, then apply explicit `noCheck` waivers. Never infer element nullability from `noCheck`, and reject an `elementNotNull` waiver on a nullable-element list as inapplicable. MongoDB array-item validators must admit null only when the domain descriptor permits it, including enum membership and value-object items. + +If exposing list authoring, use `.many({ elementsNullable: true })` to request nullable elements; the option uses plural `elementsNullable`, whereas the emitted descriptor uses singular `elementNullable`. Omitted or literal `false` retains strict elements. Keep whole-list `.nullable()` independent. PSL equivalents are `T[]`, `T?[]`, `T[]?`, and `T?[]?`; this change does not enable nullable relation-list elements or scalar lists on SQLite. + +## `sql-data-type-declares-names` + +Declare each SQL data type the extension owns with `sqlDataType`, and list the texts the database writes and reports for it. `@internal/sql-contract/data-type` is a new dependency of the package. + +```ts +// before +import { type DataType, dataType } from '@internal/framework-components/codec'; + +export const pgvectorVector: DataType = dataType('pgvector/vector', { + listCast: { + of: [pgInt2.id, pgInt4.id, pgInt8.id, pgNumeric.id], + cast: (elements) => elements.map(elementNumber), + }, +}); + +// after +import type { DataType } from '@internal/framework-components/codec'; +import { sqlDataType } from '@internal/sql-contract/data-type'; +import { type as arktype } from 'arktype'; +import { VECTOR_MAX_DIM } from './constants'; + +export const pgvectorVectorParams = arktype({ + length: `number.integer >= 1 & number.integer <= ${VECTOR_MAX_DIM}` as const, +}); + +export const pgvectorVector = sqlDataType('pgvector/vector', { + params: pgvectorVectorParams, + texts: [{ text: 'vector({length})', written: true, catalog: true }], + listCast: { + of: [pgInt2.id, pgInt4.id, pgInt8.id, pgNumeric.id], + cast: (elements) => elements.map(elementNumber), + }, +}); +``` + +Declare `params` as a named export directly above the data type, so the codec can reference it. Each text is lower case with single spaces, and `{name}` stands for the parameter `name`. Mark the text a migration writes `written: true`, and the text the database catalog prints (`format_type` on PostgreSQL) `catalog: true`. Among texts with the same placeholders, at most one is written and one is catalog. Add `normalize` when two parameter sets name the same database type. Keep `casts` and `listCast` as they are. Drop the explicit `: DataType` annotation on the declaration so the parameter type is kept; the `dataTypes` list stays `readonly DataType[]`. + +A type written with and without parameters lists a text for each, and `display` gives the letter case the database writes. The PostGIS geometry type: + +```ts +export const postgisGeometryParams = arktype({ 'srid?': 'number.integer >= 1' }); + +export const postgisGeometry = sqlDataType('postgis/geometry', { + params: postgisGeometryParams, + texts: [ + { text: 'geometry', written: true, catalog: true }, + { + text: 'geometry(geometry,{srid})', + written: true, + catalog: true, + display: 'geometry(Geometry,{srid})', + }, + ], + casts: { [pgText.id]: (value) => value }, +}); +``` + +The texts must reproduce what the removed hooks wrote: the written text for the column's parameters must equal the old `expandNativeType` result, or migration SQL changes. The bounds are the type's real ones: PostgreSQL refuses an SRID below 1 in a type modifier. + +The section "Declaring a data type" of the Prisma 8 codec authoring guide (`docs/reference/codec-authoring-guide.md` in the Prisma repository) describes every field. + +## `codec-target-types-removed` + +Delete `targetTypes` from every codec descriptor and template: + +```ts +// before +override readonly targetTypes = ['vector'] as const; + +// after: the line is gone; the names are the data type's texts +``` + +Code that read `codecLookup.targetTypesFor(codecId)` or `registry.byTargetType(name)` reads the data type instead: `dataTypeLookup.get(codecLookup.descriptorFor(codecId).dataType)`. For a SQL type, call `sqlBaseName(type, dataTypeParams(type, typeParams))` or `renderSqlTypeName(...)` from `@internal/sql-contract/data-type`. For a Mongo codec, move the list to the data type the codec names and read it with `bsonTypesOfCodec(codecId, { codecLookup, dataTypeLookup })` from `@internal/mongo-contract/data-type`; the declared type keeps the list at `type.mongo.bsonTypes`: + +```ts +export const myDecimal = mongoDataType('my/decimal', { bsonTypes: ['decimal'] }); +``` + +## `native-type-rendering-hooks-removed` + +Delete the `nativeType` override from each `PostgresCodecDescriptor` subclass, with the constant it returned when nothing else uses it. Delete `expandNativeType` from each entry of `controlPlaneHooks`, and keep the other hooks, such as `resolveIdentityValue`. + +```ts +// before +const PG_VECTOR_NATIVE_TYPE = 'vector'; + +export class PgVectorDescriptor extends PostgresCodecDescriptor { + protected override nativeType(): string { + return PG_VECTOR_NATIVE_TYPE; + } + // … +} + +const vectorControlPlaneHooks: CodecControlHooks = { + expandNativeType: ({ nativeType, typeParams }) => { + // … + }, + resolveIdentityValue: ({ typeParams }) => buildVectorIdentityValue(typeParams), +}; + +// after +export class PgVectorDescriptor extends PostgresCodecDescriptor { + // … +} + +const vectorControlPlaneHooks: CodecControlHooks = { + resolveIdentityValue: ({ typeParams }) => buildVectorIdentityValue(typeParams), +}; +``` + +When a hooks object held only `expandNativeType`, delete the object and the `types` override that registered it: + +```ts +// before +const arktypeJsonControlPlaneHooks: CodecControlHooks = { + expandNativeType: ({ nativeType }) => nativeType, +}; + +export const arktypeJsonExtensionDescriptor: SqlControlExtensionDescriptor<'postgres'> = { + ...arktypeJsonPackMeta, + types: { + ...arktypeJsonPackMeta.types, + codecTypes: { + ...arktypeJsonPackMeta.types.codecTypes, + controlPlaneHooks: { + [ARKTYPE_JSON_CODEC_ID]: arktypeJsonControlPlaneHooks, + }, + }, + }, + create: () => ({ /* … */ }), +}; + +// after +export const arktypeJsonExtensionDescriptor: SqlControlExtensionDescriptor<'postgres'> = { + ...arktypeJsonPackMeta, + create: () => ({ /* … */ }), +}; +``` + +A caller of `descriptor.nativeTypeFor(ref)` uses `sqlBaseName` of the codec's data type. A custom control adapter drops `normalizeNativeType`. + +## `comments-name-removed-apis` + +In comments, delete each sentence that names `expandNativeType`, `targetTypes` or the `nativeType()` hook, and nothing else. When the deletion empties a paragraph, a list item or a whole comment, delete it with the blank comment line before it. Leave the rest of the comment as it is. + +```ts +// before +/** + * Per-codec column helper for `pg/vector@1`. Generic over `N extends number` so the column site preserves the dimension literal in `typeParams` (e.g. `pgVectorColumn(1536)` packs `typeParams: { length: 1536 }`). + * + * Passes the bare `nativeType: 'vector'`; the family-layer `expandNativeType` hook renders the parameterized form (`vector(1536)`) at emit/verify time from `nativeType` + `typeParams`. + */ + +// after +/** + * Per-codec column helper for `pg/vector@1`. Generic over `N extends number` so the column site preserves the dimension literal in `typeParams` (e.g. `pgVectorColumn(1536)` packs `typeParams: { length: 1536 }`). + */ +``` + +A codec module's summary comment that lists what the descriptor carries names the data type and its params schema in place of target types and a native type, and says the data type declares the type's name and the bounds of its parameters. A column helper no longer passes a bare `nativeType`, so that clause goes too. Write each rewritten list item on one line. The pgvector and PostGIS summaries: + +```ts +// before + * 2. `PgVectorDescriptor` extends {@link PostgresCodecDescriptor} with the codec id, traits, target types, params schema (`{ length: number }`, validated against {@link VECTOR_MAX_DIM}), the postgres native type `vector`, explicit target behavior, and the emit-path `renderOutputType` producing `Vector<${length}>`. + * 3. `pgVectorColumn(length)` per-codec column helper invoking `descriptor.factory({ length })` directly + passing the bare `nativeType: 'vector'`. The family-layer {@link expandNativeType} hook renders the parameterized form (`vector(1536)`) at emit/verify time from `nativeType` + `typeParams`. + +// after + * 2. `PgVectorDescriptor` extends {@link PostgresCodecDescriptor} with the codec id, traits, the `pgvector/vector` data type and its params schema, explicit target behavior, and the emit-path `renderOutputType` producing `Vector<${length}>`. The data type declares the type's name and the bounds of `length`. + * 3. `pgVectorColumn(length)` per-codec column helper invoking `descriptor.factory({ length })` directly. +``` + +```ts +// before + * 2. `PostgisGeometryDescriptor` extends {@link PostgresCodecDescriptor} + * with the codec id, traits, target types, params schema + * (`{ srid?: number }`, preserving unparameterized geometry while validating supplied SRIDs), explicit target behavior, and + * the emit-path `renderOutputType` producing `Geometry<${srid}>` / + * `Geometry` when no SRID is supplied. + * 3. `pgGeometryColumn({ srid })` per-codec column helper invoking + * `descriptor.factory({ srid })` and passing the bare + * `nativeType: 'geometry'`. The family-layer `expandNativeType` + * hook renders the parameterised form + * (`geometry(Geometry,${srid})`) at emit/verify time from + * `nativeType` + `typeParams`. + +// after + * 2. `PostgisGeometryDescriptor` extends {@link PostgresCodecDescriptor} with the codec id, traits, the `postgis/geometry` data type and its params schema (`{ srid?: number }`), explicit target behavior, and the emit-path `renderOutputType` producing `Geometry<${srid}>` / `Geometry` when no SRID is supplied. The data type declares the type's name and the bound of `srid`. + * 3. `pgGeometryColumn({ srid })` per-codec column helper invoking `descriptor.factory({ srid })`. +``` + +## `postgres-codec-takes-data-type` + +```ts +// before +const postgresSqlTextDescriptor = postgresCodec(sqlTextDescriptor, { + dataType: pgText.id, + nativeType: () => 'text', + jsonProjection: (expression) => expression, +}); + +// after +const postgresSqlTextDescriptor = postgresCodec(sqlTextDescriptor, { + dataType: pgText, + jsonProjection: (expression) => expression, +}); +``` + +Import the data type object if only its id was imported. `sqliteCodec` changes the same way, without a `nativeType` option to remove. + +## `codec-params-schema-is-data-type-params` + +Delete the codec's own parameter schema, which the data type's `params` now holds (see `sql-data-type-declares-names`), and point `paramsSchema` at the data type's: + +```ts +// before, in codecs.ts +import { pgvectorVector } from './data-types'; + +const vectorParamsSchema = arktype({ + length: 'number', +}).narrow((params, ctx) => { + // … integer and range checks … +}) satisfies StandardSchemaV1; + +override readonly paramsSchema: StandardSchemaV1 = vectorParamsSchema; + +// after +import { pgvectorVector, pgvectorVectorParams } from './data-types'; + +override readonly paramsSchema: StandardSchemaV1 = pgvectorVectorParams; +``` + +A codec with keys of its own sets `paramsSchema` to `dataType.params.and(ownKeys)`. A codec whose data type has no `params` keeps a schema of its own keys only; `arktype/json@1` is such a codec and changes nothing here. + +## `column-helper-checks-data-type-params` + +Delete the helper's own range check and the `@throws` tag that describes it, with the blank comment line directly before the tag when there is one. The helper returns its descriptor unchecked: + +```ts +// before +import { VECTOR_CODEC_ID, VECTOR_MAX_DIM } from '../core/constants'; +import { pgVectorError } from '../core/errors'; + +/** + * … + * @returns A column type descriptor with `typeParams.length` set + * @throws `CONTRACT.ARGUMENT_INVALID` if length is not an integer in the range [1, VECTOR_MAX_DIM] + */ +export function vector(length: N) /* : … */ { + if (!Number.isInteger(length) || length < 1 || length > VECTOR_MAX_DIM) { + throw pgVectorError('CONTRACT.ARGUMENT_INVALID', /* … */); + } + return { /* … */ } as const; +} + +// after +import { VECTOR_CODEC_ID } from '../core/constants'; + +/** + * … + * @returns A column type descriptor with `typeParams.length` set + */ +export function vector(length: N) /* : … */ { + return { /* … */ } as const; +} +``` + +PostGIS's `geometry({ srid })` and `pgGeometryColumn({ srid })` lose their `srid` checks the same way and keep `const { srid } = options;`. A contract whose column has parameters its data type refuses, such as `vector(0)` or `geometry({ srid: 0 })`, fails when it is built, with `CONTRACT.TYPE_PARAMS_INVALID` and the meta `{ dataType, parameters, modelName, fieldName }`. + +## `type-constructor-templates-lose-native-type` + +```ts +// before +Vector: { + kind: 'typeConstructor', + args: [{ kind: 'number', name: 'length', integer: true, minimum: 1, maximum: VECTOR_MAX_DIM }], + output: { + codecId: 'pg/vector@1', + nativeType: 'vector', + typeParams: { + length: { kind: 'arg', index: 0 }, + }, + }, +}, + +// after +Vector: { + kind: 'typeConstructor', + inferred: true, + args: [{ kind: 'number', name: 'length', integer: true }], + output: { + codecId: 'pg/vector@1', + typeParams: { + length: { kind: 'arg', index: 0 }, + }, + }, +}, +``` + +Put `inferred: true` directly after `kind` on the one constructor that `contract infer` should print for the data type. Keep `minimum` and `maximum` on an argument that also feeds something other than a data type parameter. An argument mapped onto a parameter the data type declares optional becomes `optional: true`, as PostGIS's `srid` does: + +```ts +args: [{ kind: 'number', name: 'srid', integer: true, optional: true }], +``` + +## `runtime-descriptor-registers-data-types` + +Add `dataTypes` directly after `version`: + +```ts +const pgvectorRuntimeDescriptor: SqlRuntimeExtensionDescriptor<'postgres'> = { + kind: 'extension' as const, + id: pgvectorPackMeta.id, + version: pgvectorPackMeta.version, + dataTypes: pgvectorPackMeta.dataTypes, + // … +}; +``` + +Without it, building the runtime adapter fails with `CONTRACT.DATA_TYPE_UNREGISTERED`, because the runtime stack has no data type to write the extension codec's casts from. When building an adapter by hand, pass the same list: `createPostgresAdapter({ codecDescriptors, dataTypes: pgvectorDataTypes })`. An extension whose codecs represent only the target's data types, such as `arktype/json@1` over `pg/jsonb`, has no data types of its own and adds nothing. + +## `column-descriptors-drop-native-type` + +Delete `nativeType` from every column type descriptor: column type helpers, hand-written descriptors, and enum descriptors. + +```ts +// before +export function vector(length: N) { + return { codecId: VECTOR_CODEC_ID, nativeType: 'vector', typeParams: { length } } as const; +} +const pgText = { codecId: 'pg/text@1', nativeType: 'text' } as const; + +// after +export function vector(length: N) { + return { codecId: VECTOR_CODEC_ID, typeParams: { length } } as const; +} +const pgText = { codecId: 'pg/text@1' } as const; +``` + +Delete the fourth argument of `column()`, the type name: + +```ts +// before +column(pgVectorDescriptor.factory({ length }), pgVectorDescriptor.codecId, { length }, 'vector'); + +// after +column(pgVectorDescriptor.factory({ length }), pgVectorDescriptor.codecId, { length }); +``` + +Delete the `storage` list from the pack metadata's `types`: nothing reads it, and `StorageTypeMetadata`, its type, is deleted from `@internal/sql-contract/pack-types`. Delete an import that only the list used, and the part of a doc comment that describes the list. Contracts no longer carry `extensions..types.storage`; the script removes it from yours. + +```ts +// before +types: { + codecTypes: { import: { package: '@acme/pack/codec-types', named: 'CodecTypes', alias: 'AcmeTypes' } }, + storage: [{ typeId: pgvectorTypeId, familyId: 'sql', targetId: 'postgres', nativeType: 'vector' }], +}, + +// after +types: { + codecTypes: { import: { package: '@acme/pack/codec-types', named: 'CodecTypes', alias: 'AcmeTypes' } }, +}, +``` + +Delete `nativeType` from each `storage.types` entry of the contract space's source (`src/contract.ts`): + +```ts +// before +[PGVECTOR_NATIVE_TYPE]: { kind: 'codec-instance', codecId: VECTOR_CODEC_ID, nativeType: PGVECTOR_NATIVE_TYPE, typeParams: {} }, + +// after +[PGVECTOR_NATIVE_TYPE]: { kind: 'codec-instance', codecId: VECTOR_CODEC_ID, typeParams: {} }, +``` + +A codec descriptor's `columnFromEntity` returns `{ typeParams }` and no `nativeType`; code that read `nativeType` from its result stops reading it. + +A `defineContract` facade that constrains the contract's `types` to what `type.*` helpers return uses `AuthoredStorageTypeInstance` from `@internal/sql-contract/types`, which has no `dataType`; the contract build adds it: + +```ts +// before +type TypesConstraint = Record; + +// after +type TypesConstraint = Record; +``` + +Code that builds a stored contract's column by hand, for example a test helper, writes the data type id instead of the type name: `{ dataType: 'pg/int4', codecId: 'pg/int4@1' }` instead of `{ nativeType: 'int4', codecId: 'pg/int4@1' }`, and a contract type written by hand declares `readonly dataType: 'pg/int4'` instead of `readonly nativeType: 'int4'`. + +Update doc comments and examples that describe what a helper produces: `// Produces: codecId: 'pg/vector@1', typeParams: { length: 1536 }` instead of `// Produces: nativeType: 'vector', typeParams: { length: 1536 }`. + +## `sqlite-data-types-are-stored-types` + +A codec, cast or authoring entry that named one of the deleted types names the type SQLite stores instead: `sqlite/text` for JSON and date-time values, `sqlite/integer` for big integers. The data types are exported from `@internal/target-sqlite/data-types`. + +```ts +// before +override readonly dataType = sqliteJson.id; // 'sqlite/json' +override readonly dataType = sqliteBigint.id; // 'sqlite/bigint' + +// after +override readonly dataType = sqliteText.id; // 'sqlite/text' +override readonly dataType = sqliteInteger.id; // 'sqlite/integer' +``` + +The canonical forms follow the stored type: `sqlite/integer` stores digit text and `sqlite/text` a string. A JSON codec on SQLite stores the JSON text of the document, and a date-time codec its text. `sqlite/text` declares no canonical form, so a codec whose values have several written forms declares one on its descriptor: `sqlite/datetime@1` does, with `toCanonicalForm` (the function that was `sqliteDatetime.toCanonicalForm`). A contract source, `db verify` and DDL use a codec's canonical form before its data type's. + +```ts +import type { ToCanonicalForm } from '@internal/framework-components/codec'; + +// your function: written text in, the one text the contract stores out; it throws +// CONTRACT.CAST_REFUSED for text the codec does not hold +declare const datetimeCanonicalForm: ToCanonicalForm; + +export class MyDatetimeDescriptor extends SqliteCodecDescriptor { + override readonly dataType = sqliteText.id; + override readonly toCanonicalForm = datetimeCanonicalForm; + // codecId, traits, the JSON projection and the factory follow +} +``` + +## `canonical-form-of-a-column` + +Read a column's canonical form through `canonicalFormOf`, and pass the renamed options: + +```ts +// before +canonicalDateTime(text, { shape: 'instant', dataTypeId: 'acme/instant' }); +mapDefault(stored, { dataTypeEntries, dataTypeLookup, columnDataType: codec.dataType }); +const toCanonical = codec.toCanonicalForm ?? dataTypes.get(codec.dataType)?.toCanonicalForm; + +// after +canonicalDateTime(text, { shape: 'instant', ownerId: 'acme/instant' }); +mapDefault(stored, { dataTypeEntries, dataTypeLookup, columnCodec: codec }); +const toCanonical = canonicalFormOf(codec, dataTypes); +``` + +## `authoring-entry-key-checked` + +An entry whose tag yields a type that another entry already holds under that type's id, as SQLite's `json` tag yields `sqlite/text`, moves under its tag's key and names the type it yields: + +```ts +import { tagEntryKey } from '@internal/framework-components/authoring'; + +// before +[sqliteJson.id]: { + written: { kind: 'tag', tag: 'json', parse: parseJsonBody }, + print: printJsonBody, + documentation: 'Reads the body as a JSON document and stores it as the default value.', +}, + +// after +[tagEntryKey('json')]: { + written: { + kind: 'tag', + tag: 'json', + type: sqliteText.id, + parse: (text) => canonicalizeJson(parseJsonBody(text)), + }, + print: (value) => String(value), + documentation: 'Reads the body as a JSON document and stores its JSON text as the default value.', +}, +``` + +An entry under a data type's id keeps naming no `type`. Any other combination fails assembly with `CONTRACT.DATA_TYPE_ENTRY_KEY_INVALID`. + +## `the-sql-tag-writes-the-sql-expression-data-type` + +This supersedes the section about lowering entries in the `data-types-column-defaults` extension instructions of the upgrade from 8.0.0-rc.11 to 8.0.0-rc.12. + +`sql` used to be a tag that named no data type and lowered its own body. It is now the tag of the data type `sql/expression`, which the SQL family defines and registers. The second kind of authoring entry is gone. + +| Removed | Replacement | +| --- | --- | +| `AuthoringDataTypeEntry` | `DataTypeAuthoringEntry`, from `@internal/framework-components/authoring` | +| `DataTypeLoweringAuthoringEntry`, `loweringEntryKey`, `isLoweringEntryKey`, `isDataTypeLoweringEntry` | None. Remove the branch that told the two kinds of entry apart | +| `TaggedLiteralValue` from `@internal/framework-components/control` | None | +| `sqlDefaultLiteralTagEntry` from `@internal/family-sql/control` | Nothing to register. The SQL family descriptor registers `sqlExpressionAuthoringEntry` from `@internal/sql-contract/sql-expression` under `SQL_EXPRESSION_DATA_TYPE_ID` | +| `PSL_INVALID_DEFAULT_SQL` from `@internal/family-sql/control` | The string `'PSL_INVALID_DEFAULT_SQL'`. The code itself is unchanged | +| `createPostgresDataTypeEntries`, `createSqliteDataTypeEntries` in the adapters | `postgresDataTypeEntries()` from `@internal/target-postgres/data-types`, `sqliteDataTypeEntries()` from `@internal/target-sqlite/data-types` | + +Every key of `authoring.dataTypes` must now be the id of a data type that a component in the stack registers, or the key `tagEntryKey(tag)` of an entry that names the type its tag yields (see `authoring-entry-key-checked`). A key such as `lowering:sql` fails assembly with `CONTRACT.DATA_TYPE_UNREGISTERED`. + +The SQL family registers `sql/expression` and its entry itself. A target or an extension does not register it, and a target that registered it too fails assembly with `CONTRACT.DATA_TYPE_ENTRY_DUPLICATE` (or `CONTRACT.DATA_TYPE_DUPLICATE` if it registers only the type). Remove both from the target. No component's data types may declare a cast or a list cast from `sql/expression`. The SQL family refuses a stack that has one with `CONTRACT.DATA_TYPE_CASTS_FROM_SQL_EXPRESSION` when it creates its control instance. + +Two types exported from `@internal/sql-contract-psl/resolution` changed: + +- The `WrittenValue` tag arm names its text `text`, not `body`. +- The `unreadable` arm of `DefaultRefusal` has no `json` field. A JSON text that is not a JSON document is an ordinary `unreadable` refusal. + +## `prefixed-sql-tags-are-removed` + +`pg.sql` and `sqlite.sql` were second names for the `sql` tag. They are removed, and a schema that uses one is refused with `PSL_UNKNOWN_LITERAL_TAG`: `Unknown literal tag "pg.sql". Known tags: sql, json.` + +Replace the tag with `sql` and leave the text unchanged: + +```diff +- createdAt DateTime @default(pg.sql`(now() + interval '1 hour')`) ++ createdAt DateTime @default(sql`(now() + interval '1 hour')`) +``` + +The stored default does not change, so no migration follows. + +## `default-diagnostic-codes-changed` + +This matters only to code that reads PSL diagnostic codes, such as a test that asserts one. The messages did not change, except for a `sql` literal inside a list literal and the list of known tags, both described below the table. + +| Refusal | Old code | New code | +| --- | --- | --- | +| A tag no pack registered | `PSL_UNKNOWN_DEFAULT_LITERAL_TAG` | `PSL_UNKNOWN_LITERAL_TAG` | +| A `json` literal whose text is not a JSON document | `PSL_INVALID_JSON_LITERAL` | `PSL_INVALID_LITERAL` | +| Text an authoring entry or a cast refused | `PSL_INVALID_DEFAULT_LITERAL` | `PSL_INVALID_LITERAL` | +| A value whose type the column's type has no cast from, including a list written on a column that holds one value | `PSL_DEFAULT_TYPE_INCOMPATIBLE` | `PSL_VALUE_TYPE_INCOMPATIBLE` | +| A written form the target has no data type for | `PSL_DEFAULT_TYPE_INCOMPATIBLE` | `PSL_VALUE_TYPE_INCOMPATIBLE` | +| A single value on a list column | `PSL_DEFAULT_TYPE_INCOMPATIBLE` | `PSL_DEFAULT_LIST_EXPECTED` | +| A value the column's codec refused | `PSL_INVALID_DEFAULT_LITERAL` | unchanged | +| A `sql` literal inside a list literal | `PSL_INVALID_DEFAULT_LITERAL`, at the element | `PSL_VALUE_TYPE_INCOMPATIBLE`, at the `@default` attribute | + +`PSL_INVALID_JSON_LITERAL` no longer exists. + +The unknown-tag message lists the known tags in the order the stack registers them. The SQL family registers `sql` before the target registers `json`, so a Postgres or SQLite stack lists `sql, json`, where it used to list `json, sql, pg.sql` or `json, sql, sqlite.sql`. The completion list and the `Expected one of` message of `@default` offer `sql` before `json` for the same reason. + +A `sql` literal inside a list literal used to report `Literal tag "sql" produces a default of its own and cannot be an element of a list literal.` It is now refused by the cast rule, like any other value the column's type does not take: `Field "Post.tags" at element 1: pg/text has no cast from sql/expression; it casts from nothing`. Write the whole list as one `sql` literal instead, as in `` @default(sql`'{}'::text[]`) ``. + +This supersedes the statement in the `data-types-column-defaults` extension instructions of the upgrade from 8.0.0-rc.11 to 8.0.0-rc.12 that a cast's refusal surfaces as `PSL_INVALID_DEFAULT_LITERAL`. It surfaces as `PSL_INVALID_LITERAL`. + +## `resolve-identity-value-receives-data-type` + +```ts +// before +resolveIdentityValue: ({ nativeType }) => (nativeType === 'vector' ? "'[0]'" : null), + +// after +resolveIdentityValue: ({ dataType }) => (dataType === 'pgvector/vector' ? "'[0]'" : null), +``` + +A list column now reaches the hook with its element's data type and `typeParams`. + +## `validate-scalar-type-codec-ids-removed` + +Delete calls to `validateScalarTypeCodecIds`; the control stack checks the same thing when it is assembled. Fix any assembly error the new checks report in the extension's own contributions. + +## `assemble-data-types-moved-to-codec` + +Import `assembleDataTypes` from `@internal/framework-components/codec`. Remove it from the `@internal/framework-components/control` import, and delete that import if nothing is left in it: + +```ts +// before +import { assembleDataTypes } from '@internal/framework-components/control'; + +// after +import { assembleDataTypes } from '@internal/framework-components/codec'; +``` + +## `number-text-helpers-moved` + +Import `numeralText` from `@internal/sql-contract/data-type`, adding it to an existing import from that module. Remove it from the `@internal/sql-relational-core/ast` import, and delete that import if nothing is left in it: + +```ts +// before +import { numeralText } from '@internal/sql-relational-core/ast'; + +// after +import { numeralText } from '@internal/sql-contract/data-type'; +``` + +## `data-type-support-moved` + +Import each helper listed in the summary from `@internal/sql-contract/data-type-support`. `CanonicalDateTimeOptions.dataTypeId` is also renamed `ownerId`; see `canonical-form-of-a-column`. Remove it from the `@internal/sql-relational-core/ast` import, and delete that import if nothing is left in it. Add `@internal/sql-contract` to the package's dependencies if it is not there: + +```ts +// before +import { escapePslString, createNumberClassifier } from '@internal/sql-relational-core/ast'; + +// after +import { createNumberClassifier, escapePslString } from '@internal/sql-contract/data-type-support'; +``` + +## `numeric-limits-removed` + +Validate `numeric` parameters against `pgNumericParams` instead of reading the two ranges: + +```ts +// before +import { NUMERIC_PRECISION_RANGE } from '@internal/target-postgres/codecs'; +const fits = precision >= NUMERIC_PRECISION_RANGE.min && precision <= NUMERIC_PRECISION_RANGE.max; + +// after +import { pgNumericParams } from '@internal/target-postgres/data-types'; +import { type as arktype } from 'arktype'; +const fits = !(pgNumericParams({ precision }) instanceof arktype.errors); +``` + +## `postgres-codecs-decode-server-text` + +In a Postgres codec, make `decode` parse the server text for its type. Do not expect a value that `pg` parsed: + +- `bool` arrives as `t` or `f`, not a boolean. +- Integer, float and `oid` values arrive as decimal text, such as `42`, `1.5`, `NaN` or `-Infinity`, not numbers. `int8` and `numeric` already arrived as text. +- `bytea` arrives as `\x` hex text, such as `\x0102ff`, not a `Buffer`. +- `interval` arrives as PostgreSQL interval text, such as `1 day 02:03:04`, not an object. +- `point` and `circle` arrive as PostgreSQL geometric text, such as `(1,2)` and `<(1,2),3>`, not objects. +- `json` and `jsonb` arrive as JSON text, so a stored JSON string keeps its quotes (`"hello"`). Parse it with `JSON.parse` before you validate it. + +Code that reads rows from the runtime driver's `query` without a codec now receives these strings for every column. Convert each value it uses, for example with `Number(row.count)` or `row.flag === 't'`. + +## `codecs-decode-json-reads-stored-forms` + +Code that calls a built-in codec's `decodeJson` must pass the stored JSON form of its type; another kind throws `RUNTIME.DECODE_FAILED` with the codec id in `meta`. A codec an extension contributes should follow the same rule, stated on `Codec.decodeJson` in `@internal/framework-components/codec`: read a stored JSON form of its type, including every form the database writes for it, and throw on anything else. + +A codec's `decodeJson` reads a value in the stored JSON form of its type: a column's literal default in `contract.json`, a member of a value-object default, and a value inside the JSON the database returns for an included relation. The text codecs (`pg/text@1`, `sql/text@1`, `sql/char@1`, `sql/varchar@1`, `sqlite/text@1`, `pg/enum@1`, `pg/uuid@1`, `pg/inet@1`, `pg/bit@1`, `pg/varbit@1`, `pg/tsquery@1`, `pg/timetz@1`, `pg/text-array@1` and the date and time codecs), the integer codecs `pg/int4@1`, `pg/int2@1` and `sql/int@1`, and `pg/bool@1` used to pass any JSON value through. Each now refuses a value of another kind with `RUNTIME.DECODE_FAILED`, naming the codec: a text codec takes a JSON string, `pg/int4@1` a JSON integer from -2147483648 to 2147483647, `pg/int2@1` one from -32768 to 32767, `sql/int@1` a safe integer, or on PostgreSQL, where its column is an int4, an integer from -2147483648 to 2147483647, `pg/bool@1` `true` or `false`, `pg/uuid@1` a UUID as PostgreSQL writes it, in lower case and hyphenated 8-4-4-4-12, and a bit string only `0` and `1`. `pg/vector@1` refuses JSON that is not an array of the column's number of finite numbers with the same shape, as in `pg/vector@1 JSON value must be an array of 3 finite numbers`, where it said `Vector length mismatch` or `Vector value must contain only numbers`. `pg/int8@1` and `sqlite/bigint@1` take decimal text in the signed 64-bit range. `pg/timestamptz-date@1` refused a bad string with a plain `RangeError`; it now raises `RUNTIME.DECODE_FAILED` like the others. Every form PostgreSQL and SQLite write for a value the application type holds is still read; see `text-array-elements-nullable` and `sqlite-int-include-refuses-inexact-values` for the two stored values that now throw instead of reading wrong. + +The float codecs `pg/float8@1`, `pg/float4@1`, `pg/float@1`, `sql/float@1` and `sqlite/real@1` take a finite JSON number or the text `"NaN"`, `"Infinity"` or `"-Infinity"`, which PostgreSQL writes for those values in JSON, and `encodeJson` writes that text for them. SQLite writes an infinity in JSON as `9.0e+999`, so on SQLite the float codecs' JSON projection writes the text instead. `sql/float@1`, `pg/float@1` and `sqlite/real@1` used to refuse NaN and the infinities, so an `.include()` of a row holding one failed with `RUNTIME.DECODE_FAILED`; it now reads the value. SQLite cannot store NaN, so on SQLite `sqlite/real@1` and `sql/float@1` refuse it; see `sqlite-nan-parameters-refused`. + +Helpers for following the rule: + +- `@internal/framework-components/codec` exports the JSON readers every family's codecs share: `decodeJsonString`, `decodeJsonMatching`, `decodeJsonBoolean`, `decodeJsonInteger` (with an `IntegerRange`), `decodeJsonIntegerText` (decimal text, with an optional `BigIntRange`), `decodeJsonFloat` and `encodeJsonFloat`, and `refuseJsonValue`, which raises the refusal they all raise: `RUNTIME.DECODE_FAILED`, ` JSON value must be `, with `meta.codecId` and `meta.received`, the value it got as JSON text, cut to 100 characters. It also exports the ranges they take, `INT32_RANGE` and `SAFE_INTEGER_RANGE` (`IntegerRange`, which `isIntegerIn(value, range)` tests a value against) and `INT64_RANGE` and `SAFE_INTEGER_BIGINT_RANGE` (`BigIntRange`), and `isNonFiniteText`, which says whether text is `NaN`, `Infinity` or `-Infinity`. The built-in codecs' refusals no longer say `database JSON value`. +- `@internal/utils/text` exports `counted`, which writes a count and its noun for a refusal, such as `3 characters`, and `withoutTrailing(text, character)`, which drops a trailing run of one character in time linear in the run's length. + +## `mongo-codec-requires-decode-json` + +`mongoCodec` now requires `decodeJson` when the codec's application type is narrower than `JsonValue`, such as `string` or `number`; only a codec whose application type is exactly `JsonValue` may leave it out. A codec that leaves it out no longer compiles. Supply a `decodeJson` that refuses a JSON value of another kind with `RUNTIME.DECODE_FAILED`, such as `decodeJsonString` or another reader from `@internal/framework-components/codec`. + +## `sql-float-json-helpers-removed` + +Replace `sqlFloatEncodeJson(value)` with `encodeJsonFloat(value)` and `sqlFloatDecodeJson(json)` with `decodeJsonFloat(codecId, json)`, and import `isNonFiniteText` from `@internal/framework-components/codec` instead of `@internal/sql-relational-core/ast`. An import of `isNonFiniteText` that already names `@internal/framework-components/codec` needs no change. + +## `codec-lookup-has-no-descriptor-for` + +`codecForRef(lookup, ref)` from `@internal/framework-components/codec` builds a column's codec from its descriptor, with the column's type parameters, so everything that builds one takes a `CodecLookupWithDescriptors`. `CodecLookup` no longer declares `descriptorFor`, not even as optional. Each of these no longer compiles: + +- a `codecLookup` for `defineContract` or a `ContractSourceContext` without `descriptorFor`. Add one, as the registry `assemblePostgresCodecRegistryWithBuiltins` returns does, or leave `codecLookup` out of `defineContract` so it assembles the target's registry; +- a stub built as `{ ...emptyCodecLookup, get }` where a `CodecLookupWithDescriptors` is expected, because `emptyCodecLookup` no longer has a `descriptorFor` that answers `undefined`. Add a `descriptorFor` that answers for the same codecs as `get`, so the two never disagree; +- an object literal typed `CodecLookup` that sets `descriptorFor`, or a call `lookup.descriptorFor?.(id)` on a `CodecLookup`. Type the lookup `CodecLookupWithDescriptors` and call `descriptorFor(id)`. + +## `mongo-codecs-check-json` + +A Mongo codec's `decodeJson` reads the JSON form of its type. The Mongo runtime reads documents through `decode` and never calls it; the PSL reader calls it for each member of an enum. `mongo/string@1`, `mongo/objectId@1`, `mongo/int32@1`, `mongo/double@1`, `mongo/bool@1`, `mongo/vector@1` and `mongo/bson@1` used to return any JSON value as it was, so an enum member of the wrong kind was stored in the contract: + +```prisma +enum Priority { + @@type("mongo/int32@1") + Low = "low" +} +``` + +This is now refused with `PSL_EXTENSION_INVALID_VALUE`, naming the codec's message, `mongo/int32@1 JSON value must be an integer from -2147483648 to 2147483647`. A member written without a value, such as a bare `Low`, under a codec that does not take text is `PSL_ENUM_BARE_MEMBER_NON_STRING_CODEC`. Give each member a value of the codec's type. + +Each codec now takes: `mongo/string@1` a string; `mongo/objectId@1` 24 hexadecimal digits; `mongo/int32@1` an integer from -2147483648 to 2147483647; `mongo/double@1` a number, or the text `"NaN"`, `"Infinity"` or `"-Infinity"`, which its `encodeJson` now writes for those values instead of a number JSON cannot hold; `mongo/bool@1` a boolean; `mongo/date@1` the text `Date.toISOString()` writes; `mongo/vector@1` an array of numbers; and `mongo/bson@1` canonical Extended JSON, the form its `encodeJson` writes. Another value throws `RUNTIME.DECODE_FAILED` with the codec id in `meta`. A TypeScript `enumType` member that `mongo/objectId@1` or `mongo/int32@1` does not hold now throws `RUNTIME.ENCODE_FAILED` when the contract is built. + +## `text-array-elements-nullable` + +`pg/text-array@1`, the codec of a contract-free `textArray()` column, reads a `text[]` column's NULL elements as `null`, so its application type is `readonly (string | null)[]` where it was `readonly string[]`, and so is its entry in the Postgres `CodecTypes`. Code typed by a `textArray()` column, or by `min` or `max` over one, sees `string | null` elements; handle the `null`. Read through an `.include()`, a two-dimensional `text[]` value now throws `RUNTIME.DECODE_FAILED`, where it read as the text `"a,b"`. + +## `char-reads-drop-only-padding` + +PostgreSQL pads a `char(n)` value with spaces to its length: `'a'` in a `char(3)` column is stored as `'a '`. A flat read dropped every trailing whitespace character, so a stored `'a\t'` also read as `"a"`, while `.include()` returned the padded text, `"a "`. Both reads now return the value without the padding and nothing more: `"a"` for `'a'`, and `"a\t"` for `'a\t'`. On SQLite, which does not pad, both reads drop trailing spaces, as a flat read did. Code that compared an included `char` value with its padding, or relied on a flat read dropping a trailing tab or newline, compares the value without its padding. + +## `sqlite-nan-parameters-refused` + +SQLite cannot store NaN: bound as a parameter, it becomes NULL. So `create({ value: 0 / 0 })` on an optional `Float` column stored NULL, and `where((p) => p.value.eq(Number.NaN))` matched nothing. On SQLite, `sqlite/real@1` and `sql/float@1` now refuse NaN with `RUNTIME.ENCODE_FAILED`, ` value must be a number other than NaN, which SQLite cannot store`, with `meta.codecId` and `meta.received`: when they encode a value to write or filter by, and when they encode a TypeScript `.default()`, which is still refused when the contract is built with `CONTRACT.DEFAULT_INVALID`, now with this message. Their `decodeJson` refuses the text `"NaN"`. A NaN parameter no codec encoded, such as one in raw SQL, is refused by the SQLite driver with the same code: `Parameter 2 is NaN, which SQLite cannot store: it would bind it as NULL. Pass null to store no value.`, with `meta.paramIndex`, counted from 0. On a required column SQLite already refused the NULL, so only the error changes. Where a computed value can be NaN, write `null` for no value, and filter with `isNull()` for rows that have none. Infinity and -Infinity are stored and read back as before. + +## `sqlite-int-include-refuses-inexact-values` + +`sql/int@1` holds a JavaScript safe integer. On SQLite, an INTEGER column can hold a larger integer or a REAL. An `.include()` read such a value rounded or with a fraction; it now throws `RUNTIME.DECODE_FAILED`, naming the codec. A flat read is unchanged. Store an integer past 2^53 in a `BigInt` column and a fraction in a `Float` column. + +## `contract-build-takes-lookups` + +The column's stored `dataType` is the data type its codec represents (see `contract-stores-data-type`), so the build needs both lookups. Through the facades, list every extension whose codec the contract uses: + +```ts +defineContract({ extensions: { pgvector } }, ({ field, model }) => ({ /* … */ })); +``` + +A contract written with an empty definition (`defineContract({}, …)`) that names an extension's codec passes the lookups itself, as an extension's own contract space does: + +```ts +// before +export const contract = defineContract({}, () => ({ + types: { + [PGVECTOR_NATIVE_TYPE]: { + kind: 'codec-instance', + codecId: VECTOR_CODEC_ID, + nativeType: PGVECTOR_NATIVE_TYPE, + typeParams: {}, + }, + }, + models: {}, +})); + +// after +import { assembleDataTypes } from '@internal/framework-components/codec'; +import { assemblePostgresCodecRegistryWithBuiltins } from '@internal/target-postgres/codecs'; +import { postgresDataTypes } from '@internal/target-postgres/data-types'; +import { pgvectorDataTypes } from './core/data-types'; +import { pgvectorCodecRegistry } from './core/registry'; + +const dataTypeLookup = assembleDataTypes([ + { id: 'postgres', dataTypes: postgresDataTypes }, + { id: 'pgvector', dataTypes: pgvectorDataTypes }, +]).lookup; +const codecLookup = assemblePostgresCodecRegistryWithBuiltins( + [{ types: { codecTypes: { codecDescriptors: [...pgvectorCodecRegistry.values()] } } }], + dataTypeLookup, +); + +export const contract = defineContract( + { codecLookup, dataTypeLookup }, + () => ({ + types: { + [PGVECTOR_NATIVE_TYPE]: { + kind: 'codec-instance', + codecId: VECTOR_CODEC_ID, + typeParams: {}, + }, + }, + models: {}, + }), +); +``` + +The `storage.types` entry loses `nativeType` as `column-descriptors-drop-native-type` describes. A column whose codec the lookup lacks fails with `CONTRACT.CODEC_DESCRIPTOR_MISSING`; one whose codec's data type the lookup lacks fails with `CONTRACT.DATA_TYPE_UNREGISTERED`. A direct call of `buildSqlContractFromDefinition(definition, codecLookup, dataTypeLookup)` passes both. + +## `define-contract-wrapper-builds-data-type-lookup` + +A package that exposes its own `defineContract` over `buildBoundContract`, as the Postgres and SQLite facades do, makes four edits. + +1. Directly after the first import, import the lookup types and the data type assembly: + + ```ts + import { + assembleDataTypes, + type CodecLookupWithDescriptors, + type DataTypeLookup, + } from '@internal/framework-components/codec'; + ``` + +2. In the result type, the object passed to `ContractInput`'s build gains both lookups directly after `createNamespace`: + + ```ts + readonly createNamespace: (input: SqlNamespaceInput) => SqlNamespaceBase; + readonly codecLookup: CodecLookupWithDescriptors; + readonly dataTypeLookup: DataTypeLookup; + ``` + +3. The scaffold type adds `'codecLookup' | 'dataTypeLookup'` at the end of the keys it omits from `ContractInput`, and takes both as optional overrides. When the `Omit<…>` is already intersected with an object type, the two members go at the start of that object; otherwise add `& { … }` with them: + + ```ts + > & { + /** Overrides the codecs of the target and the extensions. */ + readonly codecLookup?: CodecLookupWithDescriptors; + /** Overrides the data types of the target and the extensions. */ + readonly dataTypeLookup?: DataTypeLookup; + ``` + +4. In the implementation, assemble the data type lookup once, with the target pack as the first contributor, and build the codec lookup against it. On Postgres, `assemblePostgresCodecRegistryWithBuiltins` now takes the data type lookup as its second argument: + + ```ts + const extensions: readonly ExtensionPackRef<'sql', string>[] = Object.values( + definition.extensions ?? {}, + ); + const dataTypeLookup = + definition.dataTypeLookup ?? assembleDataTypes([postgresPack, ...extensions]).lookup; + const bound = { + ...definition, + createNamespace: postgresCreateNamespace, + codecLookup: + definition.codecLookup ?? + assemblePostgresCodecRegistryWithBuiltins(extensions, dataTypeLookup), + dataTypeLookup, + }; + ``` + + On SQLite, the target constant is the first contributor: + + ```ts + const extensionPacks: readonly ExtensionPackRef<'sql', string>[] = Object.values( + definition.extensions ?? {}, + ); + const bound = { + ...definition, + createNamespace: sqliteCreateNamespace, + codecLookup: definition.codecLookup ?? assembleSqliteCodecRegistry(target, extensionPacks), + dataTypeLookup: + definition.dataTypeLookup ?? assembleDataTypes([target, ...extensionPacks]).lookup, + }; + ``` + + Both refuse a data type id that two packs register, with `CONTRACT.DATA_TYPE_DUPLICATE`. + +## `postgres-codec-registry-takes-data-type-lookup` + +The Postgres codec registry no longer carries the data types. Each function that builds one takes the data type lookup its codecs are checked against, and refuses a codec whose data type the lookup lacks with `CONTRACT.DATA_TYPE_UNREGISTERED`. Build the lookup first, from the same components, with `assembleDataTypes(components).lookup` from `@internal/framework-components/codec`, or take the target's own with `createPostgresBuiltinDataTypeLookup()` from `@internal/target-postgres/data-types`: + +```ts +// before +const codecRegistry = assemblePostgresCodecRegistry(components); +const adapter = new PostgresControlAdapter(codecRegistry); + +// after +const dataTypeLookup = assembleDataTypes(components).lookup; +const codecRegistry = assemblePostgresCodecRegistry(components, dataTypeLookup); +const adapter = new PostgresControlAdapter(codecRegistry, dataTypeLookup); +``` + +`assemblePostgresCodecRegistryWithBuiltins(extensions, dataTypeLookup)` and `createPostgresAdapterWithCodecRegistry(codecRegistry, dataTypeLookup)` change the same way. `createPostgresCodecRegistryWithBuiltins(codecDescriptors, dataTypeLookup)` takes the lookup in place of a list of data types, and defaults to the target's own. A built-in adapter in a test is `new PostgresControlAdapter(createPostgresBuiltinCodecLookup(), createPostgresBuiltinDataTypeLookup())`. + +## `contract-to-schema-takes-components` + +```ts +// before +const fromSchema = migrations.contractToSchema(fromContract); + +// after +const fromSchema = migrations.contractToSchema(fromContract, frameworkComponents); +``` + +Pass the framework components of the stack the contract was built with. A custom target's implementation passes them on to the family's `contractToSchemaIR` as `dataTypeLookup` and `codecLookup`. + +## `contract-to-schema-ir-takes-lookups` + +```ts +// before +contractToSchemaIR(contract, { annotationNamespace: 'pg', expandNativeType }); + +// after +contractToSchemaIR(contract, { annotationNamespace: 'pg', dataTypeLookup, codecLookup }); +``` + +`dataTypeLookup` and `codecLookup` come from the assembled stack: `sqlTypeLookupsOf(frameworkComponents)` from `@internal/family-sql/control` returns both. Every field or parameter that holds a `DataTypeLookup` is now named `dataTypeLookup`; `dataTypes` names only a list of data types. + +## `authoring-entity-context-takes-data-type-lookup` + +```ts +// before +const ctx: AuthoringEntityContext = { family: 'sql', target: 'postgres' }; + +// after +const ctx: AuthoringEntityContext = { + family: 'sql', + target: 'postgres', + codecLookup: createPostgresBuiltinCodecLookup(), + dataTypeLookup: createDataTypeLookup(postgresDataTypes), +}; +``` + +Pass the lookups of the stack the context serves; `createDataTypeLookup` from `@internal/framework-components/codec` builds a data type lookup from a list of data types, and `{ ...emptyCodecLookup, descriptorFor: () => undefined }`, with `emptyCodecLookup` from the same module, stands in where no codecs apply. A stub codec lookup that answers `descriptorFor` is typed `CodecLookupWithDescriptors`. A call of `interpretPslDocumentToMongoContract` passes `codecLookup` as well: the stack's codec lookup, or that stand-in. + +## `mongo-derive-json-schema-takes-lookups` + +```ts +// before +deriveJsonSchema(fields, valueObjects, codecLookup, valueSets); +derivePolymorphicJsonSchema(baseFields, discriminator, variants, valueObjects, codecLookup, valueSets); + +// after +deriveJsonSchema(fields, { codecLookup, dataTypeLookup }, valueObjects, valueSets); +derivePolymorphicJsonSchema( + baseFields, + discriminator, + variants, + { codecLookup, dataTypeLookup }, + valueObjects, + valueSets, +); +``` + +`codecLookup` is a `CodecLookupWithDescriptors`, the stack's codec lookup. `dataTypeLookup` holds the stack's data types: `createDataTypeLookup(mongoDataTypes)`, with `createDataTypeLookup` from `@internal/framework-components/codec` and `mongoDataTypes` from `@internal/target-mongo/data-types`, plus any data types the extension registers. A call that passed no codec lookup passes the stack's now; without it the validator left out every scalar field's BSON type. + +## `field-type-params-come-from-the-domain-type` + +- `buildSqlContractFromDefinition` takes a model field's domain type parameters from its `descriptor.typeParams`, or else from the named storage type its `descriptor.typeRef` names. A value-object model field carries its column's `descriptor` (the target's value-object storage type) instead of the builder assuming `jsonb`. A value-object member has no `columnName` and is typed by a codec and its type parameters only. +- `EmissionSpi.resolveFieldTypeParams` is removed. A family whose domain fields do not carry their type parameters puts them there when it builds the contract. +- `generateFieldOutputTypesMap` from `@internal/emitter` takes `(models, codecLookup)`: its third parameter, the type-parameter resolver, is removed with the hook. + +## `sql-infer-psl-contract-takes-build-context` + +The SQL family calls a target's `inferPslContract(schema, context, describedContracts?)` with the same `SqlPslBuildContext` it passes `buildPslContract`: the stack's authoring contributions, codec lookup and data types. `contract emit` reads the inferred schema with that stack, so a target reads a written type's codec and type parameters from `context.authoringContributions.type` and `context.codecLookup` instead of a table of its own. A target that implements the hook adds the parameter. + +Code that called the hook on a target descriptor, such as a script that infers PSL from an introspected schema, has no context to pass. It calls the SQL family instance's `inferPslContract(schema)`, which builds the context from the control stack it was created with: + +```ts +// before +const inferPslContract = postgresTargetDescriptor.inferPslContract; +if (!inferPslContract) { + throw new Error('the postgres target descriptor has no inferPslContract'); +} +const ast = inferPslContract(rawSchemaNode); + +// after +const ast = sqlFamilyDescriptor.create(controlStack).inferPslContract(rawSchemaNode); +``` + +`sqlFamilyDescriptor` is the default export of `@internal/family-sql/control`, and `controlStack` is the stack `createControlStack` from `@internal/framework-components/control` builds for the family, target, adapter and driver the script already uses. + +## `imported-postgres-field-checks-defaults` + +`import { field } from '@prisma/orm-postgres/contract-builder'` now gives the same field builders the `defineContract` callback receives, without the ones an extension adds: `field.text()`, `field.temporal.timestamptz()`, `field.uuidString()`, and `field.column(columnType)` as before. Its `.default(...)` now checks the value against the Postgres target's column types; a column type an extension adds, such as pgvector's `vector`, is not checked. A default of another type no longer compiles: + +```diff +- field.column(int8Column).default(1) ++ field.column(int8Column).default(1n) +``` + +## `codecs-check-stored-json` + +The built-in SQL, PostgreSQL and SQLite codecs now refuse a value that is not a stored form of their type, including one its type parameters rule out, where most used to pass it through. A TypeScript `.default()` given such a value is now refused when the contract is built, with `CONTRACT.DEFAULT_INVALID` naming the model and field: a value of another kind, such as a number for a text column, or one the PostgreSQL column rules in `psl-values-checked-by-codecs` refuse, such as `'toolong'` for a `varchar(3)` column. A TypeScript `enumType` member its codec does not take is refused the same way, with `CONTRACT.ENUM_INVALID` naming the enum, the member and the codec: for example a `pg/char@1` or `sql/char@1` member longer than one character on PostgreSQL, since the enum's column is `character`, which holds one. Correct the value the error names. + +A `contract.json` with such a default, emitted by an earlier version or edited by hand, still loads. `db init`, `db update` and `migration plan` used to plan the default; they now stop with `CONTRACT.DEFAULT_INVALID`, which names the table, the column, the codec and the value. Emit the contract again with this version, and correct the default in the contract source if emit refuses it. Running a `migration.ts` that an earlier version planned with such a default fails with the same message; correct the default in that file. Every statement that writes a default reads it this way: a new table or column, a changed default, and on SQLite a rebuilt table, which used to write a changed default or a rebuilt table's defaults unread. Each element of a list default is read the same way, and the message names the element's position: `Column "post"."tags" has a default (element 2) its codec pg/text@1 refuses: pg/text@1 JSON value must be a string`. A NULL element stays NULL. The codecs that carry PostgreSQL's own date and time text, those of `DateString`, `TimeString`, `TimestampString`, `TimestamptzString` and `Timetz`, read only a date or time in ISO 8601 or as PostgreSQL writes it, so such a default as `'now'`, which PostgreSQL would read once when it creates the table, is refused the same way. An `.include()` of such a column reads the text PostgreSQL writes in the ISO DateStyle, its default; on a server set to another DateStyle it now fails with `RUNTIME.DECODE_FAILED`, where it passed the text through. Set `DateStyle` to `ISO` on that server. + +## `psl-values-checked-by-codecs` + +The PSL reader reads each literal default, and each member of a SQL `enum`, with the column's codec, so the stricter codecs refuse schemas that loaded before. A value of another kind is refused: a text codec takes a string, an integer codec an integer in its range, `Boolean` `true` or `false`, and `Uuid` a UUID. On PostgreSQL the codecs also check what the column stores: + +- `VarChar(n)` and `Char(n)` take at most n characters, counted by code point, and a `Char` value's trailing spaces do not count. A `Char` without a length is `character(1)`, so it takes one character. +- `Bit(n)` takes exactly n bits and `VarBit(n)` at most n, and a bit column without a length is `bit(1)`. +- `Numeric(p, s)` takes a value it stores without rounding. +- `Int`, `sql/int@1` and an enum whose members are integers take an integer from -2147483648 to 2147483647, and `SmallInt` one from -32768 to 32767. +- `Real` takes a finite number only if float4 holds it, neither overflowing to an infinity nor becoming 0. + +Such a default used to load, and the migration planned and applied; the first insert that used the default then failed. A `Char` or bit column without a length, which did not apply on PostgreSQL whatever its default, now applies as `character(1)` or `bit(1)`. SQLite does not enforce a declared length, so on SQLite the char and varchar codecs take text of any length. Each of these is now refused at `contract emit`: + +| Schema | Diagnostic | +| --- | --- | +| `enum P { @@type("pg/int4@1") Low = "low" }` | `PSL_EXTENSION_INVALID_VALUE`: `enum "P" member "Low" was rejected by codec "pg/int4@1": pg/int4@1 JSON value must be an integer from -2147483648 to 2147483647` | +| the same enum with a bare `Low` | `PSL_ENUM_BARE_MEMBER_NON_STRING_CODEC`: `enum "P" member "Low" has no value and codec "pg/int4@1" does not accept a bare name as input` | +| `enum P { @@type("pg/text@1") Low = 1 }` | `PSL_EXTENSION_INVALID_VALUE`, `enum "P" member "Low": pg/text has no cast from pg/int2; it casts from nothing` | +| an enum without `@@type` whose integer members include one outside -2147483648 to 2147483647, such as `Low = 3000000000` | `PSL_EXTENSION_INVALID_VALUE`, `enum "P" member "Low": pg/int4 has no cast from pg/int8; it casts from pg/int2` | +| `u Uuid @default("nope")` | `PSL_INVALID_LITERAL`, `"nope" is not a UUID: PostgreSQL reads 32 hexadecimal digits, with a hyphen after any group of four and optionally in braces.` | +| `s VarChar(3) @default("toolong")` | `PSL_INVALID_DEFAULT_LITERAL`, `sql/varchar@1 JSON value must be a string of at most 3 characters` | +| `c Char @default("abc")` on PostgreSQL | `PSL_INVALID_DEFAULT_LITERAL`, `sql/char@1 JSON value must be a string of at most 1 character before any trailing spaces` | +| `enum P { @@type("sql/int@1") Low = 3000000000 }` on PostgreSQL | `PSL_EXTENSION_INVALID_VALUE`, `enum "P" member "Low": pg/int4 has no cast from pg/int8; it casts from pg/int2` | +| `n Numeric(5, 2) @default(1.555)` | `PSL_INVALID_DEFAULT_LITERAL`, `pg/numeric@1 JSON value must be a decimal string that numeric(5, 2) stores without rounding` | + +Give each enum member a value its codec takes, and each default a value its column's type holds unchanged. A `Uuid` default is still read in any form PostgreSQL reads; see `uuid-defaults-stored-as-postgresql-writes`. + +## `value-object-default-matches-composite-type` + +A literal default on a field typed by a composite type used to be stored whatever its shape. It is now checked, naming the path that is wrong, as in `Field "User.home.street"`: + +- A single value object takes a JSON object, and a list of them a JSON array: `` homes Address[] @default(json`{"street": "x"}`) `` is refused; write `@default([])` or `` @default(json`[{"street": "x"}]`) ``. JSON `null` is taken when the field is optional. `PSL_VALUE_TYPE_INCOMPATIBLE`. +- A key that is not a member is refused, and so is a missing member that is not optional, and `null` for a member that is not optional. `PSL_VALUE_TYPE_INCOMPATIBLE`. +- The default holds each member in the form its codec stores, so the member's codec must read the value. A `Decimal`, `Numeric(p, s)` or `BigInt` member takes a decimal string, `"1.5"`, and a number is refused; a `String` member takes a JSON string, so `"street": 1` is refused; a `DateTime` member takes a date and time string; a `Json` member takes any JSON value. `PSL_INVALID_DEFAULT_LITERAL`, with the codec's message. +- A member typed by an enum takes only the enum's values: `PSL_INVALID_DEFAULT_LITERAL`, `Expected one of:` the values. +- Nested value objects are checked the same way. + +Correct the value the diagnostic names. + +## `composite-type-attributes-refused` + +An attribute inside a `type` block was ignored: `street String @default("x")` stored no default, and `@@map` mapped nothing. Each is now refused, `PSL_UNSUPPORTED_FIELD_ATTRIBUTE` on a member and `PSL_UNSUPPORTED_COMPOSITE_TYPE_ATTRIBUTE` on the type. Remove the attribute. To give a value object a default, write it on the model field as a whole value, such as `` home Address @default(json`{"street": "x"}`) ``. + +## `uuid-defaults-stored-as-postgresql-writes` + +A `Uuid` default may be written in any form PostgreSQL reads: either case, with or without a hyphen after any group of four digits, and optionally in braces. The contract now stores it as PostgreSQL writes it, in lower case and hyphenated 8-4-4-4-12, and so does a TypeScript `.default()` on a `pg/uuid@1` column, so the applied default verifies against the database with no difference. + +Earlier versions stored such a default as written. The database stores the lower-case form, so the check that runs after the change is applied failed: `db init`, `db update` and `db migrate` stopped with `MIGRATION.RUNNER_FAILED` and rolled the change back. The database has none of the changes that contract adds, and no marker for it. With this version, a `contract.json` that still holds such a default stops `db init`, `db update` and `migration plan` with `CONTRACT.DEFAULT_INVALID`, as `codecs-check-stored-json` describes. + +Emit the contract again with this version. The stored default changes, and with it the storage hash. Then: + +- For a project kept with `db init` or `db update`, run the command that failed again. It applies the contract, and `db verify` then passes. +- For a project with migrations, delete the migration package that never applied: its directory under `migrations/app/`, and its contract snapshot `migrations/snapshots//`, where `` is the `to` hash in the package's `migration.json`. Then run `prisma migration plan` and `prisma db migrate`. Left in place, the package stays in the migration graph, ending at a contract no database reaches. + +## `domain-types-match-their-columns` + +Run `prisma contract emit`. `contract.json` and `contract.d.ts` gain these entries in the domain half: + +| PSL | Added to the field's domain entry | +| --- | --- | +| `code Short`, with `types { Short = VarChar(10) }` (also `Short[]`) | `"typeParams": { "length": 10 }` on `type` | +| `roles Role[]`, where `Role` is an `enum` | `"valueSet": { "plane": "domain", "entityKind": "enum", "namespaceId": "public", "entityName": "Role" }`, as `role Role` already had | +| composite type member `amount Numeric(10, 2)` (also a list, or a named type) | `"typeParams": { "precision": 10, "scale": 2 }` on `type` | +| composite type member `role Role` or `roles Role[]` | the same `valueSet` as a model field of that enum | + +A named type without parameters, such as `Email = String`, adds nothing. + +In `contract.d.ts`, a composite type's output type (`AddressOutput`) now gives a member with type parameters the parameterized output type a model field of that type has, such as `Varchar<10>` or `Numeric<10, 2>`, instead of the codec's plain output type. These are branded strings, so code that builds such an output object from plain strings, such as a test fixture or a mock, no longer type-checks. Build the value as the ORM returns it, or type it with the composite type's input type (`AddressInput`), which is unchanged. + +Migration snapshots under `migrations/snapshots//` need no change for this. Migration commands read only their storage half, which this change leaves unchanged. The script of `contract-stores-data-type` rewrites the storage half and the snapshots separately. + +`prisma contract print` now expects a field typed by a parameterized named type, and an enum list field, to carry these domain entries. It refuses a contract emitted before this change that lacks them. Re-emit it first. + +A pack that ships a contract with such fields re-emits it with `build:contract-space` (`prisma contract emit`). + +## `default-renderer-receives-data-type` + +```ts +// before +const renderDefault: DefaultRenderer = (def, column) => render(def); +renderDefaultLiteral(value, { many: true, nativeType: 'text', dataTypeId: 'pg/text' }); + +// after +const renderDefault: DefaultRenderer = (def, column, type) => render(def, type.baseTypeName); +renderDefaultLiteral(value, { many: { elementNullable: false }, baseTypeName: 'text', dataType: 'pg/text' }); +``` + +`baseTypeName` is the type's written name without parameters, for example `jsonb` or `varchar`. Compare `dataType`, for example `pg/jsonb`, when the decision depends on which type the column stores. + +## `ddl-column-default-visitor-removed` + +Code that dispatched a column default through `accept` reads its `kind` instead: + +```ts +// before +const sql = node.accept({ literal: (n, ctx) => renderLiteral(n, ctx.nativeType), function: (n) => n.expression }, { nativeType: 'jsonb' }); + +// after +const sql = node.kind === 'literal' ? renderLiteral(node, 'jsonb') : node.expression; +``` + +## `ddl-nodes-hold-opaque-sql` + +SQL that Prisma places inside a larger statement now travels as an `OpaqueSql` value, exported with `opaqueSql` and `renderOpaqueSql` from `@internal/sql-relational-core/ast`. These types changed: + +| Type | Field | Was | Is | +| --- | --- | --- | --- | +| `FunctionColumnDefault` | `expression` | `string` | `OpaqueSql` | +| `CheckExpressionConstraint` | `expression` | `string` | `OpaqueSql` | +| `PostgresCreatePolicy` | `using`, `withCheck` | `string \| undefined` | `OpaqueSql \| undefined` | +| `PostgresCreateIndex` | `where` | `string \| undefined` | `OpaqueSql \| undefined` | +| `PostgresCreateIndex` | `elements.expression` | `string` | `OpaqueSql` | +| `DdlIndexElements` (`@internal/target-postgres/ddl`) | `expression` | `string` | `OpaqueSql` | + +Code that constructs one of these nodes directly wraps the string: + +```diff +- new FunctionColumnDefault('now()') ++ new FunctionColumnDefault(opaqueSql('now()')) +``` + +The factories `fn` and `checkExpression` still take strings, as do `createPolicy` and `createIndex` inside the Postgres target. Prefer a factory over a constructor where one is exported: + +```diff +- new CheckExpressionConstraint({ name: 'chk', expression: 'price > 0' }) ++ checkExpression('chk', 'price > 0') +``` + +`createIndex` now takes its element list as `CreateIndexElements`, which holds strings and is exported from `@internal/target-postgres/ddl` next to `DdlIndexElements`. Code that typed the elements it passes to `createIndex` as `DdlIndexElements` uses `CreateIndexElements` instead. + +Code that reads `.expression`, `.using`, `.withCheck` or `.where` of these nodes now reads `.text`. The TypeScript compiler reports a read only where the value goes to a `string`, such as a comparison with a string or a `string` parameter. It does not report a read placed in a template string, which renders `[object Object]`, or passed to a function that accepts any value, such as `JSON.stringify` or a code generator. Search your code for these reads and check each one. + +An adapter that renders these nodes into SQL renders the SQL with `renderOpaqueSql(node.expression)`, not `node.expression.text`. `renderOpaqueSql` ends text that contains `--` with a line break, so a line comment on the last line cannot comment out the rest of the statement. + +## `adapter-writes-column-defaults` + +The control adapter writes every column default that DDL writes, for a new table, a new column, a changed default and a rebuilt SQLite table, through one method on `ExecuteRequestLowerer`, which `SqlControlAdapter` extends (`family/control-adapter` of `@prisma/orm-postgres`, `@prisma/orm-sqlite` and `@prisma/orm-family-sql`): + +```typescript +renderColumnDefault(column: DdlColumn, table: string): Promise +``` + +It returns the `DEFAULT …` clause for the column, or `''` when the column has none or writes it another way, as an autoincrement column does. It reads a literal default, and each element of a list default, with the column's codec first, so a value the codec refuses is `CONTRACT.DEFAULT_INVALID` naming the table and the column. + +- **An `ExecuteRequestLowerer` or `SqlControlAdapter` implementation** must add the method, and so must a fake lowerer in tests. An adapter returns the clause its CREATE TABLE writes for the column. To read a literal default with the column's codec, use `encodeLiteralDefault` and `encodeListLiteralDefault` from `relational-core/ast`. A fake that writes no defaults can return `''`: + + ```typescript + const lowerer: ExecuteRequestLowerer = { + lower: () => ({ sql: '', params: [] }), + lowerToExecuteRequest: async () => ({ sql: '', params: [] }), + renderColumnDefault: async () => '', + }; + ``` + +- **`buildColumnDefaultSql`** is removed from `target/planner-ddl-builders` of `@prisma/orm-postgres` and `@prisma/orm-target-postgres`. Build the column with `col`, `lit` and `fn` from `relational-core/contract-free`, and ask the adapter for the clause: + + ```typescript + // before + const clause = buildColumnDefaultSql({ kind: 'literal', value: 'member' }, { nativeType: 'text' }); + // after + const clause = await adapter.renderColumnDefault( + col('role', 'text', { default: lit('member'), codecRef: { codecId: 'pg/text@1' } }), + 'user', + ); + ``` + +- **`SetDefaultCall`** (`target/op-factory-call` of `@prisma/orm-postgres` and `@prisma/orm-target-postgres`) takes the column instead of its name and the SQL text: + + ```typescript + // before + new SetDefaultCall('public', 'user', 'role', "DEFAULT 'member'", 'widening'); + // after + new SetDefaultCall('public', 'user', col('role', 'text', { default: lit('member'), codecRef: { codecId: 'pg/text@1' } }), 'widening'); + ``` + +## `migration-ts-column-defaults` + +A `migration.ts` no longer carries a column default as SQL text. The control adapter writes the `DEFAULT …` clause for every statement, the same way for a new table, a new column, a changed default and a rebuilt SQLite table, and it reads a literal default with the column's codec first. A `migration.ts` that sets a default the codec refuses fails when it runs, with `CONTRACT.DEFAULT_INVALID` naming the table and the column. + +On PostgreSQL, `setDefault` takes the column and its default: + +```typescript +// before +this.setDefault({ table: 'user', column: 'role', defaultSql: "DEFAULT 'member'" }) +// after +this.setDefault({ table: 'user', column: col('role', 'text', { default: lit('member'), codecRef: { codecId: 'pg/text@1' } }) }) +``` + +On SQLite, a column in `addColumn` or `recreateTable` carries the default and its codec, and a `recreateTable` postcheck that checks a default names the column: + +```typescript +// before +{ name: 'role', typeSql: 'TEXT', defaultSql: "DEFAULT 'member'", nullable: false } +{ description: 'verify "role" default on "user"', sql: "SELECT COUNT(*) > 0 FROM pragma_table_info('user') WHERE ..." } +// after +{ name: 'role', typeSql: 'TEXT', default: { kind: 'literal', value: 'member' }, codecRef: { codecId: 'sqlite/text@1' }, nullable: false } +{ description: 'verify "role" default on "user"', columnDefault: 'role' } +``` + +An applied migration needs nothing: `db migrate` applies `ops.json`, which holds the SQL. Change a `migration.ts` this way only when you run it again to write `ops.json`. `node migration.ts` does not check types, so an earlier file still runs; `setDefault`, `addColumn` and `recreateTable` then refuse a `defaultSql` with `MIGRATION.OPERATION_OPTION_REMOVED`, naming the table and the column, rather than leave the default out. Rewrite the call as shown, or, if the migration is not applied, delete its package and run `migration plan` again. + +The `migration.ts` that `migration plan` writes for a new SQLite table now gives each column its `codecRef`, so running it writes the same `ops.json` as the plan. + +## `rename-check-constraint-call-is-rename-constraint-call` + +Find references to the class `RenameCheckConstraintCall`, imported from `@prisma/orm-postgres/target/op-factory-call` or `@internal/target-postgres/op-factory-call`. The class is now `RenameConstraintCall`. It also renames primary keys, unique constraints and foreign keys, so it takes the constraint kind as a new third constructor argument: `'primaryKey'`, `'unique'`, `'foreignKey'` or `'checkConstraint'`. + +- Rename the import and every reference to `RenameConstraintCall`. +- Change `new RenameCheckConstraintCall(schema, table, from, to)` to `new RenameConstraintCall(schema, table, 'checkConstraint', from, to)`. +- Change a comparison of a call's `factoryName` with `'renameCheckConstraint'`, or a `case 'renameCheckConstraint':` over it, to test `factoryName === 'renameConstraint' && call.kind === 'checkConstraint'`. + +The operation a check-constraint rename produces keeps its id, label and SQL. It now renders as `this.renameConstraint({ ..., kind: "checkConstraint", ... })`. Migration files that call `this.renameCheckConstraint({ ... })` keep working; leave them unchanged. + +## `control-family-instance-sign-spaces` + +A family that implements `ControlFamilyInstance` adds `signSpaces`: + +```ts +signSpaces(options: { + readonly driver: ControlDriverInstance; + readonly spaces: readonly SpaceToSign[]; +}): Promise; +``` + +`SpaceToSign` is `{ space, contract, expected }`, where `expected` is the marker `db sign` read before it verified the space. The method writes each space's marker with its contract's hashes and returns one `SpaceSignature` per space: `{ status, space, contract: { storageHash, profileHash } }`, where `status` is `created`, `updated` (with `previous`, the hashes the marker held) or `unchanged`. It writes a space's marker only while the marker still holds `expected`, and returns `{ status: 'conflict', space, contract, expected, found }` for a space whose marker changed, whether it finds that on reading the marker or when its compare-and-swap write fails. It does not verify the schema; `db sign` verifies every space before it calls the method. A SQL family's control adapter implements `lockMarker(driver)`, which takes the one lock the target's migration runner holds while it reads and writes markers. The SQL family writes every marker in one transaction, so a failed write leaves every marker as it was; the Mongo family writes them one by one, and running `db sign` again finishes the job. + +`ControlFamilyInstance.sign`, `ControlClient.sign`, `SignOptions` and `SignDatabaseResult` are removed: a family that implemented `sign` deletes it and keeps `signSpaces`, and code that called `client.sign({ contract })` calls `client.dbSign({ contract, migrationsDir })`, which verifies every contract space and signs each one that verified, as `db sign` does. + +## `db-sign-signs-extension-spaces` + +`db sign` signs the contract space of every extension in the project together with the application's, and signs a space only when its schema verifies; a space that does not verify is reported with its differences and the command exits with code 4. If your extension's documentation explains what happens when a user's database does not match your contract space, add that `db sign` does not sign the space either. The Supabase extension's `src/contract/CONTRACT-FIDELITY.md` adds this sentence at the end of the paragraph that says a database with a different constraint set fails verify: + +> `db sign` signs a contract space only when its schema verifies, so such a database cannot be signed for this pack's space either: `db sign` signs the application's space, reports this one with its differences and exits 4. + +## `cli-error-from-caught` + +`mapCaughtMigrationError(error)`, exported from `@prisma/orm-toolchain/cli/control-api` (`@internal/cli/control-api`), returned a CLI error unchanged and `null` for anything else, which the caller wrapped as `CLI.UNEXPECTED`. `errorFromCaught(error, why)`, exported from the same place, does the whole job: it returns a CLI error unchanged, reports any other error with a structured `NAMESPACE.SUBCODE` code as itself, reports anything else as `CLI.UNEXPECTED` with `why` given the error's message, and throws an `InternalError` again. Replace `mapCaughtMigrationError(error) ?? errorUnexpected(...)` with `errorFromCaught(error, (message) => ...)`. A caller that holds a database connection string passes it as `errorFromCaught(error, why, { connection })`, which removes it from every field of the reported error. + +## `adapter-control-loads-temporal-polyfill` + +The adapter contributes the PostgreSQL type constructors, which it imports from the target's control entry, and that entry sets up the fallback `Temporal` from `temporal-polyfill`. So the adapter's control entry, `@prisma/orm-postgres/adapter/control` or `@prisma/orm-target-postgres/adapter/control`, now loads `temporal-polyfill` as well. Both packages declare it as a required peer dependency, and npm, pnpm and bun install it automatically. + +For each Yarn project whose tests or tooling load the adapter's control entry, `detection` finds the import. If the project's `package.json` does not already list `temporal-polyfill`, add `"temporal-polyfill": "^1.0.4"` to its `devDependencies` and reinstall. Without it, a test or script that loads the adapter's control entry fails because Node.js cannot find the package `temporal-polyfill`. + +## `parameter-casts-use-base-names` + +A cast written into query text names the data type's base name and never its parameters, because an explicit cast to `varchar(n)` truncates and to `numeric(p,s)` rounds: + +| Before | After | +| --- | --- | +| `$1::integer` | `$1::int4` | +| `$1::smallint` | `$1::int2` | +| `$1::bigint` | `$1::int8` | +| `$1::real` | `$1::float4` | +| `$1::double precision` | `$1::float8` | +| `$1::boolean` | `$1::bool` | +| `$1::integer[]` | `$1::int4[]` | + +Update test expectations and snapshots that assert such text. Extension types keep their names (`$1::vector`, `$1::geometry`). + +## `sql-builder-reads-codec-descriptors` + +When a computed projection such as `fns.eq` or `fns.raw` names a codec id but no codec ref, `sql()` asks `context.codecDescriptors.descriptorFor(codecId)` whether the composed stack registers that id. A hand-built `ExecutionContext` that a test passes to `sql()` must therefore carry `codecDescriptors`. Add `codecDescriptors: { descriptorFor: () => undefined }` to the stub, or return a descriptor for the ids the test expects to decode. A context from `createExecutionContext` already has it. + +## `select-ast-options-carry-locking` + +`SelectAstOptions` now has a required `locking: ReadonlyArray | undefined`. Where you construct `new SelectAst({ ... })` from an existing select's fields, add `locking: ast.locking` when you rebuild an existing select. Pass `locking: undefined` only for a select you build from nothing. Setting it to `undefined` while rebuilding an existing select removes the caller's `FOR UPDATE` without an error. + +## `render-lowered-sql-takes-capabilities` + +`renderLoweredSql(ast, contract, codecDescriptorRegistry)` is now `renderLoweredSql(ast, contract, codecDescriptorRegistry, dataTypeLookup, capabilities)`. The renderer writes PostgreSQL parameter casts from the data type lookup (see `parameter-casts-use-base-names`): pass the stack's, or the target's own from `createPostgresBuiltinDataTypeLookup()` in `@internal/target-postgres/data-types`. It refuses a locking clause whose strength or option the given capabilities do not report. To render as the Postgres adapter does, pass its capabilities: + +```ts +import { postgresAdapterCapabilities } from '@internal/adapter-postgres/adapter'; +import { renderLoweredSql } from '@internal/adapter-postgres/sql-renderer'; + +renderLoweredSql(ast, contract, codecDescriptorRegistry, dataTypeLookup, postgresAdapterCapabilities); +``` + +## `sql-runtime-close-refusal-option` + +`close()` on a SQL runtime waits for the work already in flight and refuses runtime-scope work that starts later with `DRIVER.NOT_CONNECTED` ("Runtime is closed"). The new `closeRefusal` option says when the refusal begins: `'at-once'` refuses from the call of `close()`, and `'when-idle'` refuses once the runtime has been idle for one turn of the event loop, so work that keeps it busy from the close onward is admitted. + +The key is optional, so existing code compiles unchanged. In each place that constructs a runtime class that extends `SqlRuntimeBase`, or builds a `RuntimeOptions` object for one, decide whether to add it: + +1. If the runtime belongs to a client or service that many callers share, such as a pooled client, pass `closeRefusal: 'at-once'`. +2. If the runtime belongs to one request or one scope, such as a per-request connection, leave the key out or pass `closeRefusal: 'when-idle'`. + +## `writes-on-a-conditional-collection-are-refused` + +`where`, `orderBy`, `limit`, `offset`, `distinct`, `distinctOn`, `cursor` and `include` now return the collection they were called on, with what they establish added to its type as a fact. A custom collection class keeps its methods through the chain, so `db.Post.where({ userId }).withTitle('orm')` and `db.Post.include('user').withTitle('orm')` compile. + +The facts have names. Write a filtered collection's type as `Filtered` and an ordered one as `Ordered`. `Filtered` is `C & HasWhere`, and `HasWhere` is the name error messages print. Import the names from `@internal/sql-orm-client`, or from the `orm-client` entry of the facade your extension depends on. + +The collection changes from here to `custom-collection-methods-chain`, `scope` included, apply to the SQL ORM client only. The MongoDB ORM client did not change; skip matches in code that uses it. `variant-takes-discriminator-value` applies to both. + +A write needs a collection that is filtered on every code path. Code that filters only on some paths compiled before and no longer does: + +```ts +const posts = search ? db.Post.withTitle(search) : db.Post; +await posts.deleteAll(); // error: The 'this' context of type 'PostCollection' is not assignable to method's 'this' of type 'HasWhere' +``` + +The same applies to an `if` with an early return, a `switch`, a loop, and a `let` reassigned in an `if`. Make the write only where the filter was applied, or filter on every path: + +```diff +- const posts = search ? db.Post.withTitle(search) : db.Post; +- await posts.deleteAll(); ++ if (search) { ++ await db.Post.withTitle(search).deleteAll(); ++ } +``` + +If the code relied on deleting or updating every row when there is no filter, that was the unsafe case the check now refuses. State the intent with an explicit filter instead. + +## `writes-refuse-what-they-would-ignore` + +`updateAll`, `updateAndCount`, `deleteAll` and `deleteAndCount` change every row that matches the filter. They ignored a `limit`, an `offset`, a `cursor`, `distinct` and `distinctOn` on the collection, so a chain such as `db.orm.public.Post.where(...).limit(10).deleteAll()` deleted every matching row, not ten, and one with `.cursor({ id })` deleted the rows before the cursor too. They now throw `ORM.ARGUMENT_INVALID` instead. An order does not change which rows they change, and they still accept it. Remove what the write would ignore, or read the rows and change them by their ids: + +```diff +- await db.orm.public.Post.where({ userId }).limit(10).deleteAll(); ++ const ids = (await db.orm.public.Post.where({ userId }).select('id').limit(10).all()).map((p) => p.id); ++ await db.orm.public.Post.where((p) => p.id.in(ids)).deleteAll(); +``` + +`update` and `delete` change one row, the one `first()` returns, so the order, the offset, the cursor, `distinct` and `distinctOn` choose it; they are unchanged, except after `limit(0)`. `first()` replaces the limit with 1, so after `limit(0)` they changed one row; they now change none and return `null`. A `limit(0)` that a request can set, such as a page size of zero, no longer writes. + +The exception is `update` with a relation callback, such as `posts: (posts) => posts.connect(...)`. It finds its row by the filter alone and ignored the order, the limit, the offset, the cursor, `distinct` and `distinctOn`, so it could change another row than the chain chose. It now throws `ORM.ARGUMENT_INVALID` on a collection with any of them. Find the row first and filter to it: + +```diff +- await users.where({ teamId }).orderBy((u) => u.createdAt.asc()).update({ posts: (posts) => posts.connect([{ id: postId }]) }); ++ const oldest = await users.where({ teamId }).orderBy((u) => u.createdAt.asc()).select('id').first(); ++ if (oldest) await users.where({ id: oldest.id }).update({ posts: (posts) => posts.connect([{ id: postId }]) }); +``` + +## `cursor-and-distinct-on-check-the-receiver` + +`cursor` and `distinctOn` need an order on the collection they are called on. The check is on the receiver, so a cast on the argument no longer bypasses it: + +```ts +await db.Post.cursor({ id } as never).all(); // error: The 'this' context of type 'PostCollection' is not assignable to method's 'this' of type 'HasOrderBy' +``` + +Add the order the query needs: + +```diff +- await db.Post.cursor({ id } as never).all(); ++ await db.Post.orderBy((post) => post.id.asc()).cursor({ id }).all(); +``` + +Where the query is meant to run without an order, cast the collection instead of the argument: + +```ts +import type { Ordered } from '@internal/sql-orm-client'; + +const unordered = db.Post as Ordered; +await unordered.cursor({ id }).all(); +``` + +## `apply-is-a-collection-member` + +Collections have a new method, `apply(fn)`, which calls `fn` with the collection and returns the result. A custom collection class that declares its own `apply` with another signature no longer compiles. Rename that member and its call sites: + +```diff + class PostCollection extends Collection { +- apply(limit: number) { return this.limit(limit); } ++ firstPage(limit: number) { return this.limit(limit); } + } +``` + +An aggregate operation named `apply` is now refused with `ORM.AGGREGATE_OPERATION_RESERVED` when the client is built; rename the operation. + +## `scope-is-a-collection-member` + +Collections have a new method, `scope(body)`, which defines a scope for the collection's model: `db.orm.public.Post.scope((posts) => posts.select('id', 'title'))`. A custom collection class that declares its own `scope` with another signature no longer compiles. Rename that member and its call sites: + +```diff + class PostCollection extends Collection { +- scope(userId: string) { return this.where({ userId }); } ++ ownedBy(userId: string) { return this.where({ userId }); } + } +``` + +An aggregate operation named `scope` is now refused with `ORM.AGGREGATE_OPERATION_RESERVED` when the client is built; rename the operation. + +## `overriding-a-chaining-method` + +A class that extends `Collection` and overrides one of the chaining methods, or one of the methods that return rows (`all`, `first`, `create`, `createAll`, `upsert` and the writes), must declare the override with the new signature: a type parameter for the receiver, a `this` parameter of that type, and the result type the base method returns. Call the base method with `call` and explicit type arguments, so that the receiver type passes through: + +```diff + class PostCollection extends Collection { +- override limit(n: number) { +- return super.limit(Math.min(n, 100)); +- } ++ override limit(this: Self, n: number): Self { ++ return super.limit.call(this, Math.min(n, 100)); ++ } + } +``` + +Only classes that extend the SQL `Collection` are affected; skip matches in other classes. + +## `collection-state-flags-are-boolean` + +`DefaultCollectionTypeState` declares `hasWhere`, `hasOrderBy` and `hasUniqueFilter` as `boolean`, meaning not known. A method that establishes a flag sets it to `true`. Where your code expects `false`, expect `boolean`: + +```diff +- type Check = Equal['hasOrderBy'], false>; ++ type Check = Equal['hasOrderBy'], boolean>; +``` + +A type of your own that sets a flag to `false` should set it to `boolean`. The writes still need `hasWhere: true`, and `cursor` and `distinctOn` still need `hasOrderBy: true`. + +## `read-collection-state-and-row-with-helpers` + +`where`, `orderBy` and `include` record what they establish in two declared properties, not in the type arguments of `Collection`. Inferring the third or fourth type argument gives the row and the state the collection started with. Read them with `CollectionRowOf` and `CollectionTypeStateOf` instead: + +```diff +- type RowOf = C extends Collection ? Row : never; +- type UsersRow = RowOf; ++ import type { CollectionRowOf } from '@internal/sql-orm-client'; ++ type UsersRow = CollectionRowOf; +``` + +To keep a helper of your own, constrain its parameter, because both helpers require one: + +```ts +import type { CollectionRowOf, CollectionTypeStateOf, HasRow, HasTypeState } from '@internal/sql-orm-client'; + +type RowOf = CollectionRowOf; +type StateOf = CollectionTypeStateOf; +``` + +## `return-type-of-a-chaining-method` + +The chaining methods are generic in their receiver, and `ReturnType` of a generic method uses the constraint of its type parameter. `ReturnType` is now `HasWhere`, and `ReturnType` is `unknown`. Write the type with `Filtered` after `where`, `Ordered` after `orderBy`, and the collection type itself after `limit`, `offset`, `distinct`, `distinctOn` and `cursor`. You can also take `typeof` of a value: + +```diff +- type MatchingPosts = ReturnType; ++ import type { Filtered } from '@internal/sql-orm-client'; ++ type MatchingPosts = Filtered; +``` + +`ReturnType` of a method of your own class, such as `ReturnType`, still works. + +## `chaining-methods-take-no-explicit-type-arguments` + +These methods infer their receiver from the call. With explicit type arguments the receiver is not inferred: `posts.include<'user'>('user')` does not compile, `posts.distinct<['title']>('title')` and `posts.distinctOn<['title']>('title')` fail with "Expected 2 type arguments, but got 1", and `ReturnType>` is `never`. Drop the type arguments. They are inferred from the arguments, so `distinct<['title']>('title')` becomes `distinct('title')`: + +```diff +- const titles = posts.distinct<['title']>('title'); ++ const titles = posts.distinct('title'); +``` + +To name the type of an include, call `include` on a value and take its type: + +```diff +- type WithUser = ReturnType>; ++ const withUser = posts.include('user'); ++ type WithUser = typeof withUser; +``` + +## `custom-collection-methods-chain` + +Custom collection methods are now available after `where`, `orderBy`, `limit` and the other chaining methods. Where code on a client built with `orm({ collections })` repeats a class method's body inline after a chaining call on that class, it can call the method. A client without custom classes, such as `db.orm`, has no such methods. + +```diff + return db.Post.forUser(userId) +- .orderBy((post) => post.createdAt.desc()) ++ .newestFirst() + .limit(limit) + .all(); +``` + +Here `newestFirst()` is a method of the application's `PostCollection` whose body is that `orderBy`. + +## `variant-takes-discriminator-value` + +For every `.variant(...)` call matched by `detection`, replace the variant's model name with the discriminator value that variant declares. Read the value from the contract: in PSL it is the second argument of the variant's `@@base(Base, "")`; in the TypeScript builder it is the `value` under the base model's `discriminator.variants.`; in `contract.json` it is `domain.namespaces..models..variants..value`. + +```ts +// before +db.orm.public.Task.variant('Bug'); +db.orm.events.variant('ViewProductEvent'); + +// after, for @@base(Task, "bug") and a ViewProductEvent variant declaring "view-product" +db.orm.public.Task.variant('bug'); +db.orm.events.variant('view-product'); +``` + +Custom collection methods that call `this.variant('')`, and helpers or closures that call `.variant()`, change the same way. When the argument is a variable or a forwarded parameter, follow it back to where the model name is written and replace it there, including in type annotations that list variant model names. Update code comments and READMEs that show `.variant('')` too. + +The type checker catches most old call sites, because the parameter only accepts the base model's declared values. It does not catch a call whose model-name argument happens to equal a declared value, for example a variant model declared with `@@base(Base, "Admin")`. Such a call keeps compiling and now selects the variant declaring that value, so check every call site against the contract rather than relying on type errors. + +A call that passes a value through `as never` or another cast also escapes the type checker. At runtime, a value the base model does not declare, or a `variant()` call on a model without a discriminator, throws `ORM.ARGUMENT_INVALID`. The error names the model and lists its declared values. Previously the call returned the collection unchanged, so the query read every variant. Code that relied on that fallback must stop calling `variant()` in that case. + +A second `.variant()` call on a variant collection is rejected. It no longer replaces the first selection: it is a type error, and at runtime it throws `ORM.OPERATION_UNSUPPORTED` naming the model and the discriminator value already selected. Select each variant from the base collection instead, and keep a reference to the base collection where code needs more than one variant. + +```ts +// before +const bugs = db.orm.public.Task.variant('Bug'); +const features = bugs.variant('Feature'); + +// after +const tasks = db.orm.public.Task; +const bugs = tasks.variant('bug'); +const features = tasks.variant('feature'); +``` diff --git a/upgrade-instructions/pending/data-type-in-contract/extension/scripts/data-type-in-contract.ts b/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts similarity index 100% rename from upgrade-instructions/pending/data-type-in-contract/extension/scripts/data-type-in-contract.ts rename to skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts diff --git a/test/e2e/framework/package.json b/test/e2e/framework/package.json index 02e42d0ea8f7..b5a70919e9c1 100644 --- a/test/e2e/framework/package.json +++ b/test/e2e/framework/package.json @@ -1,6 +1,6 @@ { "name": "e2e-tests", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "private": true, "type": "module", "scripts": { @@ -14,7 +14,7 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "@types/pg": "catalog:", "pg": "catalog:", @@ -23,11 +23,11 @@ "vitest": "catalog:" }, "dependencies": { - "@prisma/orm-extension-arktype-json": "workspace:8.0.0-rc.14", - "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", - "@prisma/orm-sqlite": "workspace:8.0.0-rc.14", - "@repo/test-utils": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-arktype-json": "workspace:8.0.0-rc.15", + "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", + "@prisma/orm-sqlite": "workspace:8.0.0-rc.15", + "@repo/test-utils": "workspace:8.0.0-rc.15", "arktype": "catalog:" } } diff --git a/test/e2e/framework/test/fixtures/package.json b/test/e2e/framework/test/fixtures/package.json index 8af40bdded8a..a52f60211711 100644 --- a/test/e2e/framework/test/fixtures/package.json +++ b/test/e2e/framework/test/fixtures/package.json @@ -2,13 +2,13 @@ "name": "e2e-tests-postgres-fixtures", "private": true, "type": "module", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "description": "The Postgres fixture of the e2e suite. Its own manifest because emission reads the nearest one to decide which package names generated files import, and this suite exercises two databases whose halves must not name each other's facade.", "dependencies": { "@prisma/cli-engine": "0.6.2", - "@prisma/orm-extension-arktype-json": "workspace:8.0.0-rc.14", - "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-arktype-json": "workspace:8.0.0-rc.15", + "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", "arktype": "catalog:" } } diff --git a/test/e2e/framework/test/sqlite/fixtures/package.json b/test/e2e/framework/test/sqlite/fixtures/package.json index 285b093269dc..2d87daac50fb 100644 --- a/test/e2e/framework/test/sqlite/fixtures/package.json +++ b/test/e2e/framework/test/sqlite/fixtures/package.json @@ -2,10 +2,10 @@ "name": "e2e-tests-sqlite-fixtures", "private": true, "type": "module", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "description": "The SQLite fixture of the e2e suite. Its own manifest because emission reads the nearest one to decide which package names generated files import, and this suite exercises two databases whose halves must not name each other's facade.", "dependencies": { "@prisma/cli-engine": "0.6.2", - "@prisma/orm-sqlite": "workspace:8.0.0-rc.14" + "@prisma/orm-sqlite": "workspace:8.0.0-rc.15" } } diff --git a/test/integration/package.json b/test/integration/package.json index 5035e790e0ba..3ad521005740 100644 --- a/test/integration/package.json +++ b/test/integration/package.json @@ -1,6 +1,6 @@ { "name": "integration-tests", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "private": true, "type": "module", "scripts": { @@ -21,73 +21,73 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/adapter-mongo": "workspace:8.0.0-rc.14", - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/adapter-sqlite": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/config-loader": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/driver-mongo": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/driver-sqlite": "workspace:8.0.0-rc.14", - "@internal/emitter": "workspace:8.0.0-rc.14", - "@internal/extension-arktype-json": "workspace:8.0.0-rc.14", - "@internal/extension-paradedb": "workspace:8.0.0-rc.14", - "@internal/extension-pgvector": "workspace:8.0.0-rc.14", - "@internal/extension-postgis": "workspace:8.0.0-rc.14", - "@internal/extension-supabase": "workspace:8.0.0-rc.14", - "@internal/family-mongo": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/ids": "workspace:8.0.0-rc.14", - "@internal/migration-tools": "workspace:8.0.0-rc.14", - "@internal/mongo": "workspace:8.0.0-rc.14", - "@internal/mongo-codec": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-psl": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-ts": "workspace:8.0.0-rc.14", - "@internal/mongo-orm": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/mongo-query-builder": "workspace:8.0.0-rc.14", - "@internal/mongo-runtime": "workspace:8.0.0-rc.14", - "@internal/mongo-schema-ir": "workspace:8.0.0-rc.14", - "@internal/mongo-value": "workspace:8.0.0-rc.14", - "@internal/mongo-wire": "workspace:8.0.0-rc.14", - "@internal/operations": "workspace:8.0.0-rc.14", - "@internal/postgres": "workspace:8.0.0-rc.14", - "@internal/psl-parser": "workspace:8.0.0-rc.14", - "@internal/psl-printer": "workspace:8.0.0-rc.14", - "@internal/sql-builder": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-emitter": "workspace:8.0.0-rc.14", - "@internal/sql-contract-prisma7": "workspace:8.0.0-rc.14", - "@internal/sql-contract-psl": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/sql-errors": "workspace:8.0.0-rc.14", - "@internal/sql-orm-client": "workspace:8.0.0-rc.14", - "@internal/sql-relational-core": "workspace:8.0.0-rc.14", - "@internal/sql-runtime": "workspace:8.0.0-rc.14", - "@internal/sql-schema-ir": "workspace:8.0.0-rc.14", - "@internal/sqlite": "workspace:8.0.0-rc.14", - "@internal/target-mongo": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@internal/target-sqlite": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", - "@internal/vite-plugin-contract-emit": "workspace:8.0.0-rc.14", + "@internal/adapter-mongo": "workspace:8.0.0-rc.15", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/adapter-sqlite": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/config-loader": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/driver-mongo": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/driver-sqlite": "workspace:8.0.0-rc.15", + "@internal/emitter": "workspace:8.0.0-rc.15", + "@internal/extension-arktype-json": "workspace:8.0.0-rc.15", + "@internal/extension-paradedb": "workspace:8.0.0-rc.15", + "@internal/extension-pgvector": "workspace:8.0.0-rc.15", + "@internal/extension-postgis": "workspace:8.0.0-rc.15", + "@internal/extension-supabase": "workspace:8.0.0-rc.15", + "@internal/family-mongo": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/ids": "workspace:8.0.0-rc.15", + "@internal/migration-tools": "workspace:8.0.0-rc.15", + "@internal/mongo": "workspace:8.0.0-rc.15", + "@internal/mongo-codec": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-psl": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-ts": "workspace:8.0.0-rc.15", + "@internal/mongo-orm": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/mongo-query-builder": "workspace:8.0.0-rc.15", + "@internal/mongo-runtime": "workspace:8.0.0-rc.15", + "@internal/mongo-schema-ir": "workspace:8.0.0-rc.15", + "@internal/mongo-value": "workspace:8.0.0-rc.15", + "@internal/mongo-wire": "workspace:8.0.0-rc.15", + "@internal/operations": "workspace:8.0.0-rc.15", + "@internal/postgres": "workspace:8.0.0-rc.15", + "@internal/psl-parser": "workspace:8.0.0-rc.15", + "@internal/psl-printer": "workspace:8.0.0-rc.15", + "@internal/sql-builder": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-emitter": "workspace:8.0.0-rc.15", + "@internal/sql-contract-prisma7": "workspace:8.0.0-rc.15", + "@internal/sql-contract-psl": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/sql-errors": "workspace:8.0.0-rc.15", + "@internal/sql-orm-client": "workspace:8.0.0-rc.15", + "@internal/sql-relational-core": "workspace:8.0.0-rc.15", + "@internal/sql-runtime": "workspace:8.0.0-rc.15", + "@internal/sql-schema-ir": "workspace:8.0.0-rc.15", + "@internal/sqlite": "workspace:8.0.0-rc.15", + "@internal/target-mongo": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@internal/target-sqlite": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", + "@internal/vite-plugin-contract-emit": "workspace:8.0.0-rc.15", "arktype": "catalog:" }, "devDependencies": { - "@internal/config": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/language-server": "workspace:8.0.0-rc.14", - "@internal/middleware-cache": "workspace:8.0.0-rc.14", - "@internal/mongo-lowering": "workspace:8.0.0-rc.14", - "@internal/publish-surface": "workspace:8.0.0-rc.14", + "@internal/config": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/language-server": "workspace:8.0.0-rc.15", + "@internal/middleware-cache": "workspace:8.0.0-rc.15", + "@internal/mongo-lowering": "workspace:8.0.0-rc.15", + "@internal/publish-surface": "workspace:8.0.0-rc.15", "@prisma/cli-engine": "0.6.2", - "@repo/test-utils": "workspace:8.0.0-rc.14", - "@repo/tsconfig": "workspace:8.0.0-rc.14", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/test-utils": "workspace:8.0.0-rc.15", + "@repo/tsconfig": "workspace:8.0.0-rc.15", + "@repo/tsdown": "workspace:8.0.0-rc.15", "@types/pg": "catalog:", - "cli-journeys": "workspace:8.0.0-rc.14", + "cli-journeys": "workspace:8.0.0-rc.15", "commander": "^15.0.0", "mongodb": "catalog:", "mongodb-memory-server": "catalog:", diff --git a/test/integration/test/cli-journeys/package.json b/test/integration/test/cli-journeys/package.json index 992896264c75..483c9e4e024f 100644 --- a/test/integration/test/cli-journeys/package.json +++ b/test/integration/test/cli-journeys/package.json @@ -2,12 +2,12 @@ "name": "cli-journeys", "private": true, "type": "module", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "description": "The CLI journeys. Its own manifest because it names the published packages a user's project installs, while the rest of test/integration names the workspace packages it exercises directly — two dependency shapes, so two manifests. integration-tests declares this package as a devDependency because its tsconfig typechecks the journeys: that dependency is how Turbo learns to build the published packages before integration-tests#typecheck runs.", "dependencies": { - "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.14", - "@prisma/orm-family-sql": "workspace:8.0.0-rc.14", - "@prisma/orm-mongo": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14" + "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.15", + "@prisma/orm-family-sql": "workspace:8.0.0-rc.15", + "@prisma/orm-mongo": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15" } } diff --git a/test/integration/test/fixtures/cli/cli-e2e-test-app/package.json b/test/integration/test/fixtures/cli/cli-e2e-test-app/package.json index eda924d31ecc..c4fe7654db01 100644 --- a/test/integration/test/fixtures/cli/cli-e2e-test-app/package.json +++ b/test/integration/test/fixtures/cli/cli-e2e-test-app/package.json @@ -3,29 +3,29 @@ "private": true, "type": "module", "dependencies": { - "@internal/adapter-mongo": "workspace:8.0.0-rc.14", - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/driver-mongo": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/family-mongo": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo-contract": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-ts": "workspace:8.0.0-rc.14", - "@internal/mongo-orm": "workspace:8.0.0-rc.14", - "@internal/mongo-query-ast": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/target-mongo": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/adapter-mongo": "workspace:8.0.0-rc.15", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/driver-mongo": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/family-mongo": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo-contract": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-ts": "workspace:8.0.0-rc.15", + "@internal/mongo-orm": "workspace:8.0.0-rc.15", + "@internal/mongo-query-ast": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/target-mongo": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@prisma/cli-engine": "0.6.2", - "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.14", - "@prisma/orm-mongo": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.15", + "@prisma/orm-mongo": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "mongodb": "catalog:", "pg": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/test/integration/test/fixtures/cli/cli-integration-test-app/package.json b/test/integration/test/fixtures/cli/cli-integration-test-app/package.json index 2718002b813c..df2ae7584860 100644 --- a/test/integration/test/fixtures/cli/cli-integration-test-app/package.json +++ b/test/integration/test/fixtures/cli/cli-integration-test-app/package.json @@ -3,31 +3,31 @@ "private": true, "type": "module", "dependencies": { - "@internal/adapter-mongo": "workspace:8.0.0-rc.14", - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/driver-postgres": "workspace:8.0.0-rc.14", - "@internal/family-mongo": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/framework-components": "workspace:8.0.0-rc.14", - "@internal/mongo": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-psl": "workspace:8.0.0-rc.14", - "@internal/mongo-contract-ts": "workspace:8.0.0-rc.14", - "@internal/postgres": "workspace:8.0.0-rc.14", - "@internal/sql-contract": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/target-mongo": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14", + "@internal/adapter-mongo": "workspace:8.0.0-rc.15", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/driver-postgres": "workspace:8.0.0-rc.15", + "@internal/family-mongo": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/framework-components": "workspace:8.0.0-rc.15", + "@internal/mongo": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-psl": "workspace:8.0.0-rc.15", + "@internal/mongo-contract-ts": "workspace:8.0.0-rc.15", + "@internal/postgres": "workspace:8.0.0-rc.15", + "@internal/sql-contract": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/target-mongo": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15", "@prisma/cli-engine": "0.6.2", - "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.14", - "@prisma/orm-mongo": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.15", + "@prisma/orm-mongo": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "@types/node": "catalog:", "dotenv": "^17.4.2", "pg": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/test/integration/test/fixtures/cli/cli-test-app/package.json b/test/integration/test/fixtures/cli/cli-test-app/package.json index 76d619a453cb..45c614c27112 100644 --- a/test/integration/test/fixtures/cli/cli-test-app/package.json +++ b/test/integration/test/fixtures/cli/cli-test-app/package.json @@ -3,16 +3,16 @@ "private": true, "type": "module", "dependencies": { - "@internal/adapter-postgres": "workspace:8.0.0-rc.14", - "@internal/cli": "workspace:8.0.0-rc.14", - "@internal/family-sql": "workspace:8.0.0-rc.14", - "@internal/sql-contract-ts": "workspace:8.0.0-rc.14", - "@internal/target-postgres": "workspace:8.0.0-rc.14", - "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.14", - "@prisma/orm-mongo": "workspace:8.0.0-rc.14", - "@prisma/orm-postgres": "workspace:8.0.0-rc.14", - "@prisma/orm-toolchain": "workspace:8.0.0-rc.14", + "@internal/adapter-postgres": "workspace:8.0.0-rc.15", + "@internal/cli": "workspace:8.0.0-rc.15", + "@internal/family-sql": "workspace:8.0.0-rc.15", + "@internal/sql-contract-ts": "workspace:8.0.0-rc.15", + "@internal/target-postgres": "workspace:8.0.0-rc.15", + "@prisma/orm-extension-pgvector": "workspace:8.0.0-rc.15", + "@prisma/orm-mongo": "workspace:8.0.0-rc.15", + "@prisma/orm-postgres": "workspace:8.0.0-rc.15", + "@prisma/orm-toolchain": "workspace:8.0.0-rc.15", "pg": "catalog:" }, - "version": "8.0.0-rc.14" + "version": "8.0.0-rc.15" } diff --git a/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-hashes.test.ts b/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-hashes.test.ts deleted file mode 100644 index e17d01ffb7f2..000000000000 --- a/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-hashes.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { readdirSync, readFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { createSnapshotContentVerifier } from '@internal/migration-tools/contract-snapshot-store'; -import { computeMigrationHash } from '@internal/migration-tools/hash'; -import { sqlContractCanonicalizationHooks } from '@internal/sql-contract/canonicalization-hooks'; -import { basename, dirname, join, relative } from 'pathe'; -import { describe, expect, it } from 'vitest'; - -const fixturesRoot = join(dirname(fileURLToPath(import.meta.url)), 'fixtures'); -const verifier = createSnapshotContentVerifier(sqlContractCanonicalizationHooks); - -function afterFiles(): string[] { - return readdirSync(fixturesRoot, { recursive: true, withFileTypes: true }) - .filter((entry) => entry.isFile()) - .map((entry) => join(entry.parentPath, entry.name)) - .filter((path) => relative(fixturesRoot, path).split('/')[1] === 'after'); -} - -function readJson(path: string): Record { - return JSON.parse(readFileSync(path, 'utf8')); -} - -function storedStorageHash(path: string, contract: Record): string { - if (basename(dirname(dirname(path))) === 'snapshots') return basename(dirname(path)); - const storage = contract['storage']; - return typeof storage === 'object' && storage !== null && 'storageHash' in storage - ? String(storage.storageHash) - : ''; -} - -describe('the data-type-in-contract upgrade fixtures', () => { - const files = afterFiles(); - const contracts = files - .filter((path) => path.endsWith('.json')) - .map((path) => ({ path, json: readJson(path) })) - .filter(({ json }) => json['targetFamily'] === 'sql'); - const migrations = files.filter((path) => basename(path) === 'migration.json'); - - it('hold SQL contracts and migrations to check', () => { - expect({ contracts: contracts.length > 0, migrations: migrations.length > 0 }).toEqual({ - contracts: true, - migrations: true, - }); - }); - - it('store the storage hash the framework computes for each upgraded contract', () => { - for (const { path, json } of contracts) { - expect(() => - verifier.assertSnapshotContentMatches(json, storedStorageHash(path, json), path), - ).not.toThrow(); - } - }); - - it('store the migration hash the framework computes for each rewritten migration', () => { - const mismatches = migrations.flatMap((path) => { - const metadata = readJson(path); - const ops = JSON.parse(readFileSync(join(dirname(path), 'ops.json'), 'utf8')); - return computeMigrationHash(metadata as Parameters[0], ops) === - metadata['migrationHash'] - ? [] - : [relative(fixturesRoot, path)]; - }); - expect(mismatches).toEqual([]); - }); -}); diff --git a/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-lists.test.ts b/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-lists.test.ts index 56762a34a0b6..48a318d486be 100644 --- a/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-lists.test.ts +++ b/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-lists.test.ts @@ -1,8 +1,5 @@ import { readFileSync, writeFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { PostgresContractSerializer } from '@internal/target-postgres/runtime'; -import { SqliteContractSerializer } from '@internal/target-sqlite/runtime'; -import { dirname, join } from 'pathe'; +import { join } from 'pathe'; import { afterAll, describe, expect, it } from 'vitest'; import { copyFixture, @@ -16,23 +13,10 @@ import { afterAll(removeWorkDirs); -const here = dirname(fileURLToPath(import.meta.url)); -const sqlOrmClientFixtures = join(here, '../../sql-orm-client/fixtures'); -const portFixtures = join(here, '../../ports/prisma/functional'); - -const rowLockingCapabilityLine = - /^\s*(?:readonly )?"?(?:forKeyShare|forNoKeyUpdate|forShare|forUpdate|lockNowait|lockOf|lockSkipLocked)"?: true[,;]\n/gm; - -function readEmittedWithoutRowLockingCapabilities(path: string): string { - return readFileSync(path, 'utf8').replace(rowLockingCapabilityLine, ''); -} - const releaseProjects = [ { name: 'rc14-lists', description: 'a Postgres project from 8.0.0-rc.14 with a list column and a list field', - emitted: join(sqlOrmClientFixtures, 'scalar-lists/generated'), - serializer: new PostgresContractSerializer(), hashes: [ '563f9e0b2a9d656e14bd2909f2f5864b160744a27b6922a2a3f10bf6df7abec8', '2830fe0ef5f06f7b80b4ab1a88117aed494e45538e6ea67fa6bce37d41ee7250', @@ -41,8 +25,6 @@ const releaseProjects = [ { name: 'rc14-no-lists', description: 'a SQLite project from 8.0.0-rc.14 without lists', - emitted: join(sqlOrmClientFixtures, 'integer-representation-sqlite/generated'), - serializer: new SqliteContractSerializer(), hashes: [ '17398e6d66de2a0c1a138453eac935af0f965aa197c409a946436619f204a21a', '28d0397503caeb837ce9b4e066368eb18074e3aa6ca3455388983c4164565eb6', @@ -107,30 +89,12 @@ for (const project of releaseProjects) { tree: expectedTree(project.name, 'after'), }); }); - - it('writes contract.json and contract.d.ts as the current emitter writes them, without the row-locking capabilities rc.14 did not report', () => { - expect([tree['prisma/contract.json'], tree['prisma/contract.d.ts']]).toEqual([ - readEmittedWithoutRowLockingCapabilities(join(project.emitted, 'contract.json')), - readEmittedWithoutRowLockingCapabilities(join(project.emitted, 'contract.d.ts')), - ]); - }); - - it('writes contracts that the target loads', () => { - const contracts = [ - 'prisma/contract.json', - `migrations/snapshots/${newHash}/contract.json`, - ].map((path) => JSON.parse(tree[path] ?? 'null')); - for (const contract of contracts) { - expect(() => project.serializer.deserializeContract(contract)).not.toThrow(); - } - }); }); } describe('a Postgres project from 8.0.0-rc.14 with a list column of an enum', () => { const run = upgrade('rc14-enum-list'); const tree = readTree(run.root); - const emitted = join(portFixtures, 'enum-array/_fixture/generated'); const oldHash = '28369815a587ef18873c40e9269de8b47a1f0d86f1c34db4748d24cd98cdb9cb'; const newHash = '2d59ae34d8f960548d4ccab7dbf2fdf972c643c279b18fe71bd043dc3bfe7211'; @@ -144,36 +108,4 @@ describe('a Postgres project from 8.0.0-rc.14 with a list column of an enum', () tree: expectedTree('rc14-enum-list', 'after'), }); }); - - it("keeps rc.14's membership check, so it differs from emission only in that check, the storage hash and the row-locking capabilities rc.14 did not report", () => { - const upgradedContract = JSON.parse(tree['prisma/contract.json'] ?? 'null'); - const emittedContract = JSON.parse( - readEmittedWithoutRowLockingCapabilities(join(emitted, 'contract.json')), - ); - const checksOf = (contract: typeof emittedContract) => - contract.storage.namespaces.public.entries.table.user.checks; - const membershipCheck = checksOf(upgradedContract)[0]; - const emittedHash = emittedContract.storage.storageHash; - upgradedContract.storage.namespaces.public.entries.table.user.checks[0] = - checksOf(emittedContract)[0]; - upgradedContract.storage.storageHash = emittedHash; - expect({ - membershipCheck, - withEmittedCheckAndHash: upgradedContract, - dts: tree['prisma/contract.d.ts']?.replaceAll(newHash, emittedHash), - }).toEqual({ - membershipCheck: { - expression: `"plans"::text[] <@ ARRAY['FREE', 'PAID', 'CUSTOM']::text[]`, - name: 'user_plans_check_86e31b31', - prefix: 'user_plans_check', - }, - withEmittedCheckAndHash: emittedContract, - dts: readEmittedWithoutRowLockingCapabilities(join(emitted, 'contract.d.ts')), - }); - }); - - it('writes a contract the target loads', () => { - const contract = JSON.parse(tree['prisma/contract.json'] ?? 'null'); - expect(() => new PostgresContractSerializer().deserializeContract(contract)).not.toThrow(); - }); }); diff --git a/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-storage-hashes.test.ts b/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-storage-hashes.test.ts index 9b3e010d928f..891baccf0295 100644 --- a/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-storage-hashes.test.ts +++ b/test/integration/test/upgrade-instructions/data-type-in-contract/data-type-in-contract-storage-hashes.test.ts @@ -1,6 +1,4 @@ import { readFileSync, writeFileSync } from 'node:fs'; -import { createSnapshotContentVerifier } from '@internal/migration-tools/contract-snapshot-store'; -import { sqlContractCanonicalizationHooks } from '@internal/sql-contract/canonicalization-hooks'; import { join } from 'pathe'; import { afterAll, describe, expect, it } from 'vitest'; import { @@ -130,7 +128,7 @@ describe('an emitted contract edited by hand after its last snapshot', () => { }); describe('a column that stores nativeType beside the current list form', () => { - it('stores the storage hash the framework computes, which keeps elementNullable false', () => { + it('stores the storage hash the framework computed at release, which keeps elementNullable false', () => { const root = copyFixture('postgres-extension-space', 'before'); const path = join(root, 'prisma/contract.json'); const contract = JSON.parse(readFileSync(path, 'utf8')); @@ -143,10 +141,9 @@ describe('a column that stores nativeType beside the current list form', () => { writeFileSync(path, JSON.stringify(contract, null, 2)); const run = runScript(root); const upgraded = JSON.parse(readFileSync(path, 'utf8')); - const verifier = createSnapshotContentVerifier(sqlContractCanonicalizationHooks); - expect(run.status).toBe(0); - expect(() => - verifier.assertSnapshotContentMatches(upgraded, upgraded.storage.storageHash, path), - ).not.toThrow(); + expect({ status: run.status, storageHash: upgraded.storage.storageHash }).toEqual({ + status: 0, + storageHash: 'd62b8870dbdf094852fc52602a70a3954108beda99942e46bfab2a30ce0216bc', + }); }); }); diff --git a/test/integration/test/upgrade-instructions/data-type-in-contract/generate-fixtures.ts b/test/integration/test/upgrade-instructions/data-type-in-contract/generate-fixtures.ts deleted file mode 100644 index fb93db65b734..000000000000 --- a/test/integration/test/upgrade-instructions/data-type-in-contract/generate-fixtures.ts +++ /dev/null @@ -1,1398 +0,0 @@ -/** - * Writes the `before` and `after` fixture projects the upgrade script's tests read, computing every hash with the live framework functions. Run it in `test/integration` with `pnpm exec tsx test/upgrade-instructions/data-type-in-contract/generate-fixtures.ts`, then `pnpm lint:fix`. It holds only while the script is pending: at release it is frozen or deleted with the hash test (see step 4 of `skills-contrib/record-upgrade-instructions/SKILL.md`). - */ -import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import { canonicalizeContractToObject, computeStorageHash } from '@internal/contract/hashing'; -import type { Contract } from '@internal/contract/types'; -import { canonicalizeJson } from '@internal/framework-components/utils'; -import { computeMigrationHash } from '@internal/migration-tools/hash'; -import { sqlContractCanonicalizationHooks } from '@internal/sql-contract/canonicalization-hooks'; -import { dirname, join } from 'pathe'; - -type Format = 'old' | 'new'; -type Json = null | boolean | number | string | readonly Json[] | { readonly [key: string]: Json }; -type JsonObject = { readonly [key: string]: Json }; - -interface ColumnSpec { - readonly name: string; - readonly codecId: string; - readonly nativeType: string; - readonly dataType: string; - readonly nullable: boolean; - readonly typeParams?: JsonObject; - readonly typeRef?: string; - readonly valueSet?: string; - readonly functionDefault?: string; - readonly literalDefault?: { - readonly old: Json; - readonly new: Json; - readonly oldTs: string; - readonly newTs: string; - }; -} - -interface TypeSpec { - readonly name: string; - readonly codecId: string; - readonly nativeType: string; - readonly dataType: string; - readonly typeParams?: JsonObject; -} - -interface EnumSpec { - readonly name: string; - readonly codecId: string; - readonly members: readonly { - readonly name: string; - readonly old: Json; - readonly new: Json; - readonly oldTs: string; - readonly newTs: string; - }[]; -} - -interface ContractSpec { - readonly target: 'postgres' | 'sqlite' | 'acme'; - readonly tables: Readonly>; - readonly types?: readonly TypeSpec[]; - readonly enums?: readonly EnumSpec[]; - readonly extensions?: (format: Format) => JsonObject; - readonly layout?: 'entries' | 'tables'; -} - -const here = dirname(fileURLToPath(import.meta.url)); -const fixturesRoot = join(here, 'fixtures'); -const PROFILE_HASH = '3916f444a8a17ad749191acf9e08dad97d1a327b88c2f1d45d12f240296aa8b2'; -const STALE_HASH = 'a'.repeat(64); -const GENERATED = { - warning: '⚠️ GENERATED FILE - DO NOT EDIT', - message: 'This file is automatically generated by "prisma contract emit".', - regenerate: 'To regenerate, run: prisma contract emit', -}; - -function typeName(spec: { nativeType: string; dataType: string }, format: Format): JsonObject { - return format === 'old' ? { nativeType: spec.nativeType } : { dataType: spec.dataType }; -} - -function columnJson(column: ColumnSpec, format: Format): JsonObject { - const value: Record = { - codecId: column.codecId, - ...typeName(column, format), - nullable: column.nullable, - }; - if (column.typeParams) value['typeParams'] = column.typeParams; - if (column.typeRef) value['typeRef'] = column.typeRef; - if (column.valueSet) - value['valueSet'] = { - plane: 'storage', - entityKind: 'valueSet', - namespaceId: 'public', - entityName: column.valueSet, - }; - if (column.functionDefault) - value['default'] = { kind: 'function', expression: column.functionDefault }; - if (column.literalDefault) - value['default'] = { kind: 'literal', value: column.literalDefault[format] }; - return value; -} - -function storageJson(spec: ContractSpec, format: Format): Record { - const tables: Record = {}; - for (const [tableName, columns] of Object.entries(spec.tables)) { - tables[tableName] = { - columns: Object.fromEntries( - columns.map((column) => [column.name, columnJson(column, format)]), - ), - primaryKey: { columns: [columns[0]?.name ?? 'id'] }, - uniques: [], - indexes: [], - foreignKeys: [], - }; - } - const namespace = - spec.layout === 'tables' - ? { id: 'public', tables } - : { - id: 'public', - kind: `${spec.target}-schema`, - entries: { - table: tables, - ...(spec.enums - ? { - valueSet: Object.fromEntries( - spec.enums.map((enumSpec) => [ - enumSpec.name, - { - kind: 'valueSet', - values: enumSpec.members.map((member) => member[format]), - }, - ]), - ), - } - : {}), - }, - }; - const storage: Record = { namespaces: { public: namespace } }; - if (spec.types) { - storage['types'] = Object.fromEntries( - spec.types.map((type) => [ - type.name, - { - codecId: type.codecId, - kind: 'codec-instance', - ...typeName(type, format), - ...(type.typeParams ? { typeParams: type.typeParams } : {}), - }, - ]), - ); - } - return storage; -} - -function storageHashOf(spec: ContractSpec, format: Format): string { - return computeStorageHash({ - target: spec.target, - targetFamily: 'sql', - storage: storageJson(spec, format), - ...sqlContractCanonicalizationHooks, - }); -} - -function contractObject(spec: ContractSpec, format: Format, storageHash: string): JsonObject { - const contract = { - targetFamily: 'sql', - target: spec.target, - profileHash: PROFILE_HASH, - roots: {}, - domain: { - namespaces: { - public: { - models: {}, - ...(spec.enums - ? { - enum: Object.fromEntries( - spec.enums.map((enumSpec) => [ - enumSpec.name, - { - codecId: enumSpec.codecId, - members: enumSpec.members.map((member) => ({ - name: member.name, - value: member[format], - })), - }, - ]), - ), - } - : {}), - }, - }, - }, - storage: { ...storageJson(spec, format), storageHash }, - capabilities: { sql: { returning: true } }, - extensions: spec.extensions?.(format) ?? {}, - meta: {}, - }; - const canonical = canonicalizeContractToObject(blindContract(contract), { - schemaVersion: '1', - serializeContract: (value) => JSON.parse(JSON.stringify(value)), - ...sqlContractCanonicalizationHooks, - }); - return JSON.parse(JSON.stringify({ ...canonical, _generated: GENERATED })); -} - -function blindContract(value: unknown): Contract { - return value as Contract; -} - -function emittedJson(contract: JsonObject): string { - return JSON.stringify(contract, null, 2); -} - -function snapshotJson(contract: JsonObject): string { - return `${canonicalizeJson(contract)}\n`; -} - -function dtsLiteral(value: string): string { - return `'${value}'`; -} - -function dtsColumn(column: ColumnSpec, format: Format, indent: string): string { - const lines = [ - `${indent}readonly ${column.name}: {`, - format === 'old' - ? `${indent} readonly nativeType: ${dtsLiteral(column.nativeType)};` - : `${indent} readonly dataType: ${dtsLiteral(column.dataType)};`, - `${indent} readonly codecId: ${dtsLiteral(column.codecId)};`, - `${indent} readonly nullable: ${column.nullable};`, - ]; - if (column.functionDefault) - lines.push( - `${indent} readonly default: { readonly kind: 'function'; readonly expression: '${column.functionDefault}' };`, - ); - if (column.literalDefault) { - const literal = format === 'old' ? column.literalDefault.oldTs : column.literalDefault.newTs; - lines.push( - `${indent} readonly default: {`, - `${indent} readonly kind: 'literal';`, - `${indent} readonly value: DefaultLiteralValue<'${column.codecId}', ${literal}>;`, - `${indent} };`, - ); - } - if (column.typeParams) { - const params = Object.entries(column.typeParams) - .map(([key, value]) => `readonly ${key}: ${JSON.stringify(value).replaceAll('"', "'")}`) - .join('; '); - lines.push(`${indent} readonly typeParams: { ${params} };`); - } - if (column.typeRef) lines.push(`${indent} readonly typeRef: '${column.typeRef}';`); - if (column.valueSet) - lines.push( - `${indent} readonly valueSet: { readonly plane: 'storage'; readonly entityKind: 'valueSet'; readonly namespaceId: 'public'; readonly entityName: '${column.valueSet}' };`, - ); - if (format === 'new') lines.push(`${indent} readonly many: false;`); - lines.push(`${indent}};`); - return lines.join('\n'); -} - -function dtsType(type: TypeSpec, format: Format): string { - const params = type.typeParams - ? `{ ${Object.entries(type.typeParams) - .map(([key, value]) => `readonly ${key}: ${JSON.stringify(value)}`) - .join('; ')} }` - : 'Record'; - return [ - ` readonly ${type.name}: {`, - ` readonly kind: 'codec-instance';`, - ` readonly codecId: '${type.codecId}';`, - format === 'old' - ? ` readonly nativeType: '${type.nativeType}';` - : ` readonly dataType: '${type.dataType}';`, - ` readonly typeParams: ${params};`, - ' };', - ].join('\n'); -} - -function contractDts(spec: ContractSpec, format: Format, storageHash: string): string { - const facade = spec.target === 'acme' ? '@acme/orm' : `@prisma/orm-${spec.target}`; - const tables = Object.entries(spec.tables) - .map(([tableName, columns]) => - [ - ` readonly ${tableName}: {`, - ' columns: {', - ...columns.map((column) => dtsColumn(column, format, ' ')), - ' };', - ' };', - ].join('\n'), - ) - .join('\n'); - const types = spec.types - ? [' readonly types: {', ...spec.types.map((type) => dtsType(type, format)), ' };'] - : []; - return [ - '// ⚠️ GENERATED FILE - DO NOT EDIT', - "// This file is automatically generated by 'prisma contract emit'.", - `import type { CodecTypes } from '${facade}/target/codec-types';`, - `import type { ProfileHashBase, StorageHashBase } from '${facade}/contract/types';`, - '', - 'export type StorageHash =', - ` StorageHashBase<'${storageHash}'>;`, - 'export type ProfileHash =', - ` ProfileHashBase<'${PROFILE_HASH}'>;`, - 'type DefaultLiteralValue = CodecId extends keyof CodecTypes', - " ? CodecTypes[CodecId]['output']", - ' : _Encoded;', - '', - 'export type Contract = {', - ' readonly storage: {', - ' readonly namespaces: {', - ' readonly public: {', - ' readonly entries: {', - ' readonly table: {', - tables, - ' };', - ...(spec.enums ? valueSetDts(spec.enums, format) : []), - ' };', - ' };', - ' };', - ...types, - ' readonly storageHash: StorageHash;', - ' };', - ...(spec.enums ? domainEnumDts(spec.enums, format) : []), - ...(spec.extensions ? extensionsDts(format) : []), - '};', - '', - ].join('\n'); -} - -function valueSetDts(enums: readonly EnumSpec[], format: Format): string[] { - return [ - ' readonly valueSet: {', - ...enums.flatMap((enumSpec) => [ - ` readonly ${enumSpec.name}: {`, - " readonly kind: 'valueSet';", - ` readonly values: readonly [${enumSpec.members - .map((member) => (format === 'old' ? member.oldTs : member.newTs)) - .join(', ')}];`, - ' };', - ]), - ' };', - ]; -} - -function domainEnumDts(enums: readonly EnumSpec[], format: Format): string[] { - return [ - ' readonly domain: {', - ' readonly namespaces: {', - ' readonly public: {', - ' readonly enum: {', - ...enums.flatMap((enumSpec) => [ - ` readonly ${enumSpec.name}: {`, - ` readonly codecId: '${enumSpec.codecId}';`, - ' readonly members: readonly [', - ...enumSpec.members.map( - (member) => - ` { readonly name: '${member.name}'; readonly value: ${format === 'old' ? member.oldTs : member.newTs} },`, - ), - ' ];', - ' };', - ]), - ' };', - ' };', - ' };', - ' };', - ]; -} - -function extensionsDts(format: Format): string[] { - return [ - ' readonly extensions: {', - ' readonly pgvector: {', - " readonly familyId: 'sql';", - " readonly id: 'pgvector';", - ' readonly types: {', - ' readonly codecTypes: {', - ' readonly import: {', - " readonly alias: 'PgVectorTypes';", - " readonly named: 'CodecTypes';", - " readonly package: '@prisma/orm-extension-pgvector/codec-types';", - ' };', - ' };', - ...(format === 'old' - ? [ - ' readonly storage: readonly [', - ' {', - " readonly familyId: 'sql';", - " readonly nativeType: 'vector';", - " readonly targetId: 'postgres';", - " readonly typeId: 'pg/vector@1';", - ' },', - ' ];', - ] - : []), - ' };', - ' };', - ' };', - ]; -} - -interface MigrationSpec { - readonly dir: string; - readonly from: string | null; - readonly to: string; - readonly invariants?: readonly string[]; - readonly migrationTs?: boolean; -} - -function migrationFiles(spec: MigrationSpec, snapshotsRelative: string): Record { - const ops = [ - { - id: `migration.${spec.dir.split('/').at(-1)}`, - label: 'Fixture operation', - operationClass: 'additive' as const, - execute: [{ description: 'fixture', sql: 'SELECT 1' }], - }, - ]; - const metadata = { - from: spec.from, - to: spec.to, - providedInvariants: spec.invariants ?? [], - createdAt: '2026-01-01T00:00:00.000Z', - }; - const files: Record = { - [`${spec.dir}/migration.json`]: `${JSON.stringify( - { ...metadata, migrationHash: computeMigrationHash(metadata, ops) }, - null, - 2, - )}\n`, - [`${spec.dir}/ops.json`]: `${JSON.stringify(ops, null, 2)}\n`, - }; - if (spec.migrationTs) { - const imports = [ - `import type { Contract as End } from '${snapshotsRelative}/${spec.to}/contract';`, - `import endContract from '${snapshotsRelative}/${spec.to}/contract.json' with { type: 'json' };`, - ]; - if (spec.from) - imports.push( - `import type { Contract as Start } from '${snapshotsRelative}/${spec.from}/contract';`, - `import startContract from '${snapshotsRelative}/${spec.from}/contract.json' with { type: 'json' };`, - ); - files[`${spec.dir}/migration.ts`] = [ - ...imports, - '', - `export const contracts = { start: ${spec.from ? 'startContract' : 'null'}, end: endContract };`, - `export type Contracts = { start: ${spec.from ? 'Start' : 'never'}; end: End };`, - '', - ].join('\n'); - } - return files; -} - -function ref(hash: string, invariants: readonly string[] = []): string { - return `${JSON.stringify({ hash, invariants }, null, 2)}\n`.replace( - /"invariants": \[\n\s+([^\n]*)\n\s+\]/, - '"invariants": [$1]', - ); -} - -function writeTree(root: string, files: Record): void { - for (const [path, content] of Object.entries(files)) { - const file = join(root, path); - mkdirSync(dirname(file), { recursive: true }); - writeFileSync(file, content); - } -} - -function writeCase(name: string, build: (format: Format) => Record): void { - writeTree(join(fixturesRoot, name, 'before'), build('old')); - writeTree(join(fixturesRoot, name, 'after'), build('new')); -} - -function writeUnchangedCase(name: string, files: Record): void { - writeTree(join(fixturesRoot, name, 'before'), files); -} - -interface ContractFiles { - readonly hash: string; - readonly contract: JsonObject; - readonly dts: string; -} - -function contractFiles(spec: ContractSpec, format: Format, storedHash?: string): ContractFiles { - const hash = storedHash ?? storageHashOf(spec, format); - return { - hash, - contract: contractObject(spec, format, hash), - dts: contractDts(spec, format, hash), - }; -} - -const pgvectorExtension = (format: Format): JsonObject => ({ - pgvector: { - familyId: 'sql', - id: 'pgvector', - kind: 'extension', - targetId: 'postgres', - types: { - codecTypes: { - import: { - alias: 'PgVectorTypes', - named: 'CodecTypes', - package: '@prisma/orm-extension-pgvector/codec-types', - }, - }, - ...(format === 'old' - ? { - storage: [ - { - familyId: 'sql', - nativeType: 'vector', - targetId: 'postgres', - typeId: 'pg/vector@1', - }, - ], - } - : {}), - }, - version: '0.0.1', - }, -}); - -const postColumns: readonly ColumnSpec[] = [ - { name: 'id', codecId: 'sql/int@1', nativeType: 'int4', dataType: 'pg/int4', nullable: false }, - { - name: 'title', - codecId: 'pg/varchar@1', - nativeType: 'character varying', - dataType: 'pg/varchar', - nullable: false, - typeParams: { length: 203 }, - }, - { - name: 'createdAt', - codecId: 'pg/timestamptz@1', - nativeType: 'timestamptz', - dataType: 'pg/timestamptz', - nullable: false, - functionDefault: 'now()', - }, - { - name: 'role', - codecId: 'pg/enum@1', - nativeType: 'Role', - dataType: 'pg/enum', - nullable: false, - typeParams: { typeName: 'Role' }, - }, -]; - -const embeddingColumn: ColumnSpec = { - name: 'embedding', - codecId: 'pg/vector@1', - nativeType: 'vector', - dataType: 'pgvector/vector', - nullable: true, - typeRef: 'Embedding3', -}; - -const vectorType: TypeSpec = { - name: 'vector', - codecId: 'pg/vector@1', - nativeType: 'vector', - dataType: 'pgvector/vector', -}; - -const appInitial: ContractSpec = { - target: 'postgres', - tables: { post: postColumns }, - extensions: pgvectorExtension, -}; - -const appCurrent: ContractSpec = { - target: 'postgres', - tables: { post: [...postColumns, embeddingColumn] }, - types: [ - { - name: 'Embedding3', - codecId: 'pg/vector@1', - nativeType: 'vector', - dataType: 'pgvector/vector', - typeParams: { length: 203 }, - }, - ], - extensions: pgvectorExtension, -}; - -const pgvectorSpace: ContractSpec = { target: 'postgres', tables: {}, types: [vectorType] }; - -const mongoContract = `${JSON.stringify( - { - schemaVersion: '1', - targetFamily: 'mongo', - target: 'mongo', - storage: { - collections: { - user: { fields: { id: { codecId: 'mongo/objectId@1', nativeType: 'objectId' } } }, - }, - storageHash: 'b'.repeat(64), - }, - }, - null, - 2, -)}\n`; - -function postgresExtensionSpace(format: Format): Record { - const initial = contractFiles(appInitial, format); - const current = contractFiles(appCurrent, format); - const vector = contractFiles(pgvectorSpace, format); - return { - 'prisma/contract.json': emittedJson(current.contract), - 'prisma/contract.d.ts': current.dts, - 'mongo/contract.json': mongoContract, - [`migrations/snapshots/${initial.hash}/contract.json`]: snapshotJson(initial.contract), - [`migrations/snapshots/${initial.hash}/contract.d.ts`]: initial.dts, - [`migrations/snapshots/${current.hash}/contract.json`]: snapshotJson(current.contract), - [`migrations/snapshots/${current.hash}/contract.d.ts`]: current.dts, - [`migrations/snapshots/${vector.hash}/contract.json`]: snapshotJson(vector.contract), - [`migrations/snapshots/${vector.hash}/contract.d.ts`]: 'export {};\n', - ...migrationFiles( - { - dir: 'migrations/app/20260101T0000_initial', - from: null, - to: initial.hash, - migrationTs: true, - }, - '../../snapshots', - ), - ...migrationFiles( - { - dir: 'migrations/app/20260201T0000_add_embedding', - from: initial.hash, - to: current.hash, - migrationTs: true, - }, - '../../snapshots', - ), - 'migrations/app/refs/head.json': ref(current.hash), - 'migrations/app/refs/db.json': ref(initial.hash), - ...migrationFiles( - { - dir: 'migrations/pgvector/20260601T0000_install_vector_extension', - from: null, - to: vector.hash, - invariants: ['pgvector:install-vector-v1'], - }, - '../../snapshots', - ), - 'migrations/pgvector/refs/head.json': ref(vector.hash, ['pgvector:install-vector-v1']), - }; -} - -function extensionPackage(format: Format): Record { - const vector = contractFiles(pgvectorSpace, format); - return { - 'src/contract.json': emittedJson(vector.contract), - 'src/contract.d.ts': vector.dts, - [`migrations/snapshots/${vector.hash}/contract.json`]: snapshotJson(vector.contract), - [`migrations/snapshots/${vector.hash}/contract.d.ts`]: vector.dts, - ...migrationFiles( - { - dir: 'migrations/20260601T0000_install_vector_extension', - from: null, - to: vector.hash, - invariants: ['pgvector:install-vector-v1'], - migrationTs: true, - }, - '../snapshots', - ), - 'migrations/refs/head.json': ref(vector.hash, ['pgvector:install-vector-v1']), - }; -} - -const sqliteSettings: ContractSpec = { - target: 'sqlite', - tables: { - setting: [ - { - name: 'id', - codecId: 'sqlite/integer@1', - nativeType: 'integer', - dataType: 'sqlite/integer', - nullable: false, - literalDefault: { old: 0, new: '0', oldTs: '0', newTs: "'0'" }, - }, - { - name: 'count', - codecId: 'sql/int@1', - nativeType: 'integer', - dataType: 'sqlite/integer', - nullable: false, - literalDefault: { old: 42, new: '42', oldTs: '42', newTs: "'42'" }, - }, - { - name: 'big', - codecId: 'sqlite/bigint@1', - nativeType: 'integer', - dataType: 'sqlite/integer', - nullable: false, - literalDefault: { - old: '9007199254740993', - new: '9007199254740993', - oldTs: "'9007199254740993'", - newTs: "'9007199254740993'", - }, - }, - { - name: 'small', - codecId: 'sqlite/bigintnumber@1', - nativeType: 'integer', - dataType: 'sqlite/integer', - nullable: false, - literalDefault: { old: -7, new: '-7', oldTs: '-7', newTs: "'-7'" }, - }, - { - name: 'doc', - codecId: 'sqlite/json@1', - nativeType: 'text', - dataType: 'sqlite/text', - nullable: false, - literalDefault: { - old: { a: [true, null], b: 1 }, - new: '{"a":[true,null],"b":1}', - oldTs: '{ readonly a: readonly [true, null]; readonly b: 1 }', - newTs: `'{"a":[true,null],"b":1}'`, - }, - }, - { - name: 'label', - codecId: 'sqlite/json@1', - nativeType: 'text', - dataType: 'sqlite/text', - nullable: false, - literalDefault: { old: "it's", new: `"it's"`, oldTs: `"it's"`, newTs: `'"it\\'s"'` }, - }, - { - name: 'empty', - codecId: 'sqlite/json@1', - nativeType: 'text', - dataType: 'sqlite/text', - nullable: true, - literalDefault: { old: null, new: 'null', oldTs: 'null', newTs: "'null'" }, - }, - { - name: 'name', - codecId: 'sqlite/text@1', - nativeType: 'text', - dataType: 'sqlite/text', - nullable: false, - literalDefault: { old: 'unnamed', new: 'unnamed', oldTs: "'unnamed'", newTs: "'unnamed'" }, - }, - { - name: 'ratio', - codecId: 'sqlite/real@1', - nativeType: 'real', - dataType: 'sqlite/real', - nullable: false, - literalDefault: { old: 1.5, new: 1.5, oldTs: '1.5', newTs: '1.5' }, - }, - { - name: 'seenAt', - codecId: 'sqlite/datetime@1', - nativeType: 'text', - dataType: 'sqlite/text', - nullable: true, - }, - { - name: 'payload', - codecId: 'sqlite/blob@1', - nativeType: 'blob', - dataType: 'sqlite/blob', - nullable: true, - }, - { - name: 'code', - codecId: 'sql/char@1', - nativeType: 'character', - dataType: 'sqlite/character', - nullable: true, - }, - { - name: 'tag', - codecId: 'sql/varchar@1', - nativeType: 'character varying', - dataType: 'sqlite/character-varying', - nullable: true, - }, - { - name: 'score', - codecId: 'sql/float@1', - nativeType: 'real', - dataType: 'sqlite/real', - nullable: true, - }, - ], - }, -}; - -function sqliteDefaults(format: Format): Record { - const settings = contractFiles(sqliteSettings, format); - return { - 'src/prisma/contract.json': emittedJson(settings.contract), - 'src/prisma/contract.d.ts': settings.dts, - [`migrations/snapshots/${settings.hash}/contract.json`]: snapshotJson(settings.contract), - [`migrations/snapshots/${settings.hash}/contract.d.ts`]: settings.dts, - ...migrationFiles( - { - dir: 'migrations/app/20260101T0000_initial', - from: null, - to: settings.hash, - migrationTs: true, - }, - '../../snapshots', - ), - 'migrations/app/refs/head.json': ref(settings.hash), - }; -} - -const integerMember = (name: string, value: number) => ({ - name, - old: value, - new: String(value), - oldTs: String(value), - newTs: `'${value}'`, -}); - -const sqliteEnums: ContractSpec = { - target: 'sqlite', - tables: { - post: [ - { - name: 'id', - codecId: 'sqlite/integer@1', - nativeType: 'integer', - dataType: 'sqlite/integer', - nullable: false, - }, - { - name: 'priority', - codecId: 'sqlite/integer@1', - nativeType: 'integer', - dataType: 'sqlite/integer', - nullable: false, - valueSet: 'Priority', - literalDefault: { old: 1, new: '1', oldTs: '1', newTs: "'1'" }, - }, - { - name: 'level', - codecId: 'sql/int@1', - nativeType: 'integer', - dataType: 'sqlite/integer', - nullable: true, - valueSet: 'Level', - }, - { - name: 'mood', - codecId: 'sqlite/text@1', - nativeType: 'text', - dataType: 'sqlite/text', - nullable: true, - valueSet: 'Mood', - }, - ], - }, - enums: [ - { - name: 'Level', - codecId: 'sql/int@1', - members: [integerMember('Debug', -1), integerMember('Info', 0)], - }, - { - name: 'Mood', - codecId: 'sqlite/text@1', - members: [{ name: 'Calm', old: 'calm', new: 'calm', oldTs: "'calm'", newTs: "'calm'" }], - }, - { - name: 'Priority', - codecId: 'sqlite/integer@1', - members: [integerMember('Low', 1), integerMember('High', 2)], - }, - ], -}; - -function sqliteIntegerEnums(format: Format): Record { - return singleSpaceProject(sqliteEnums, format, 'prisma', 'migrations'); -} - -const jsonMember = (name: string, value: Json, oldTs: string) => ({ - name, - old: value, - new: JSON.stringify(value), - oldTs, - newTs: `'${JSON.stringify(value)}'`, -}); - -const sqliteJsonEnumSpec: ContractSpec = { - target: 'sqlite', - tables: { - lamp: [ - { - name: 'id', - codecId: 'sqlite/integer@1', - nativeType: 'integer', - dataType: 'sqlite/integer', - nullable: false, - }, - { - name: 'shade', - codecId: 'sqlite/json@1', - nativeType: 'text', - dataType: 'sqlite/text', - nullable: false, - valueSet: 'Shade', - literalDefault: { old: 'low', new: '"low"', oldTs: "'low'", newTs: `'"low"'` }, - }, - ], - }, - enums: [ - { - name: 'Shade', - codecId: 'sqlite/json@1', - members: [ - jsonMember('Low', 'low', "'low'"), - jsonMember('Level', 1, '1'), - jsonMember('On', true, 'true'), - jsonMember('Unset', null, 'null'), - ], - }, - ], -}; - -function sqliteJsonEnums(format: Format): Record { - return singleSpaceProject(sqliteJsonEnumSpec, format, 'prisma', 'migrations'); -} - -const unknownCodecSpec: ContractSpec = { - target: 'postgres', - tables: { - thing: [ - { - name: 'id', - codecId: 'pg/uuid@1', - nativeType: 'uuid', - dataType: 'pg/uuid', - nullable: false, - }, - { - name: 'shape', - codecId: 'acme/shape@1', - nativeType: 'shape', - dataType: 'acme/shape', - nullable: true, - }, - ], - }, -}; - -function unknownCodec(format: Format): Record { - const thing = contractFiles(unknownCodecSpec, format); - return { - 'prisma/contract.json': emittedJson(thing.contract), - 'prisma/contract.d.ts': thing.dts, - [`migrations/snapshots/${thing.hash}/contract.json`]: snapshotJson(thing.contract), - [`migrations/snapshots/${thing.hash}/contract.d.ts`]: thing.dts, - ...migrationFiles( - { dir: 'migrations/app/20260101T0000_initial', from: null, to: thing.hash }, - '../../snapshots', - ), - }; -} - -const acmeSpec: ContractSpec = { - target: 'acme', - tables: { - thing: [ - { - name: 'id', - codecId: 'sql/int@1', - nativeType: 'int4', - dataType: 'acme/int4', - nullable: false, - }, - ], - }, -}; - -function unknownTarget(format: Format): Record { - const thing = contractFiles(acmeSpec, format); - return { - 'prisma/contract.json': emittedJson(thing.contract), - 'prisma/contract.d.ts': thing.dts, - [`migrations/snapshots/${thing.hash}/contract.json`]: snapshotJson(thing.contract), - [`migrations/snapshots/${thing.hash}/contract.d.ts`]: thing.dts, - ...migrationFiles( - { dir: 'migrations/app/20260101T0000_initial', from: null, to: thing.hash }, - '../../snapshots', - ), - }; -} - -const userSpec: ContractSpec = { - target: 'postgres', - tables: { - user: [ - { - name: 'id', - codecId: 'pg/uuid@1', - nativeType: 'uuid', - dataType: 'pg/uuid', - nullable: false, - }, - { - name: 'email', - codecId: 'pg/text@1', - nativeType: 'text', - dataType: 'pg/text', - nullable: false, - }, - ], - }, -}; - -function snapshotCollision(): Record { - const old = contractFiles(userSpec, 'old'); - const upgraded = contractFiles(userSpec, 'new'); - return { - [`migrations/snapshots/${old.hash}/contract.json`]: snapshotJson(old.contract), - [`migrations/snapshots/${old.hash}/contract.d.ts`]: old.dts, - [`migrations/snapshots/${upgraded.hash}/contract.json`]: snapshotJson(upgraded.contract), - [`migrations/snapshots/${upgraded.hash}/contract.d.ts`]: 'export {};\n', - ...migrationFiles( - { dir: 'migrations/app/20260101T0000_initial', from: null, to: old.hash }, - '../../snapshots', - ), - }; -} - -function snapshotAlreadyPresent(format: Format): Record { - const old = contractFiles(userSpec, 'old'); - const upgraded = contractFiles(userSpec, 'new'); - const files: Record = { - [`migrations/snapshots/${upgraded.hash}/contract.json`]: snapshotJson(upgraded.contract), - [`migrations/snapshots/${upgraded.hash}/contract.d.ts`]: upgraded.dts, - ...migrationFiles( - { - dir: 'migrations/app/20260101T0000_initial', - from: null, - to: format === 'old' ? old.hash : upgraded.hash, - }, - '../../snapshots', - ), - }; - if (format === 'old') { - files[`migrations/snapshots/${old.hash}/contract.json`] = snapshotJson(old.contract); - files[`migrations/snapshots/${old.hash}/contract.d.ts`] = old.dts; - } - return files; -} - -const invoiceSpec: ContractSpec = { - target: 'postgres', - tables: { - invoice: [ - { - name: 'id', - codecId: 'pg/uuid@1', - nativeType: 'uuid', - dataType: 'pg/uuid', - nullable: false, - }, - { - name: 'amount', - codecId: 'pg/numeric@1', - nativeType: 'numeric', - dataType: 'pg/numeric', - nullable: false, - typeParams: { precision: 10, scale: 2 }, - }, - ], - }, -}; - -function singleSpaceProject( - spec: ContractSpec, - format: Format, - contractDir: string, - migrationsDir: string, -): Record { - const files = contractFiles(spec, format); - return { - [`${contractDir}/contract.json`]: emittedJson(files.contract), - [`${contractDir}/contract.d.ts`]: files.dts, - [`${migrationsDir}/snapshots/${files.hash}/contract.json`]: snapshotJson(files.contract), - [`${migrationsDir}/snapshots/${files.hash}/contract.d.ts`]: files.dts, - ...migrationFiles( - { - dir: `${migrationsDir}/app/20260101T0000_initial`, - from: null, - to: files.hash, - migrationTs: true, - }, - '../../snapshots', - ), - [`${migrationsDir}/app/refs/head.json`]: ref(files.hash), - }; -} - -function dbMigrations(format: Format): Record { - return singleSpaceProject(userSpec, format, 'db', 'db/migrations'); -} - -function twoMigrationRoots(format: Format): Record { - return { - ...singleSpaceProject(userSpec, format, 'db', 'db/migrations'), - ...singleSpaceProject(invoiceSpec, format, 'billing', 'billing/history'), - }; -} - -const olderLayoutSpec: ContractSpec = { ...userSpec, layout: 'tables' }; - -function staleHash(format: Format): Record { - const stale = contractFiles(olderLayoutSpec, format, format === 'old' ? STALE_HASH : undefined); - return { - [`migrations/snapshots/${stale.hash}/contract.json`]: snapshotJson(stale.contract), - [`migrations/snapshots/${stale.hash}/contract.d.ts`]: stale.dts, - ...migrationFiles( - { - dir: 'migrations/app/20260101T0000_initial', - from: null, - to: stale.hash, - migrationTs: true, - }, - '../../snapshots', - ), - 'migrations/app/refs/head.json': ref(stale.hash), - }; -} - -const documentWithTypeName = "{ readonly codecId: 'pg/text@1'; readonly nativeType: 'text' }"; - -const jsonDocumentSpec: ContractSpec = { - target: 'postgres', - tables: { - setting: [ - { - name: 'id', - codecId: 'pg/uuid@1', - nativeType: 'uuid', - dataType: 'pg/uuid', - nullable: false, - }, - { - name: 'payload', - codecId: 'pg/jsonb@1', - nativeType: 'jsonb', - dataType: 'pg/jsonb', - nullable: false, - literalDefault: { - old: { codecId: 'pg/text@1', nativeType: 'text' }, - new: { codecId: 'pg/text@1', nativeType: 'text' }, - oldTs: documentWithTypeName, - newTs: documentWithTypeName, - }, - }, - ], - }, -}; - -function jsonDefaultDocument(format: Format): Record { - const files = contractFiles(jsonDocumentSpec, format); - return { - 'prisma/contract.json': emittedJson(files.contract), - 'prisma/contract.d.ts': files.dts, - }; -} - -/** - * A contract the current emitter wrote, and the same contract as release 8.0.0-rc.14 stored it: each column names its type in `nativeType`, a list is `many: true`, `contract.d.ts` declares no `many` on a column, and a check rc.14 wrote differently, keyed by the name the current emitter gives it, has rc.14's name and expression. What other changes of the release own, such as a domain field's `valueSet`, stays as the current emitter writes it. - */ -interface EmittedSource { - readonly dir: string; - readonly nativeTypes: Readonly>; - readonly releasedChecks?: Readonly>; -} - -const sqlOrmClientFixtures = join(here, '../../sql-orm-client/fixtures'); -const portFixtures = join(here, '../../ports/prisma/functional'); - -const RELEASE_SOURCES = { - 'rc14-lists': { - dir: join(sqlOrmClientFixtures, 'scalar-lists/generated'), - nativeTypes: { 'pg/int4': 'int4', 'pg/text': 'text' }, - }, - 'rc14-no-lists': { - dir: join(sqlOrmClientFixtures, 'integer-representation-sqlite/generated'), - nativeTypes: { 'sqlite/integer': 'integer' }, - }, - 'rc14-enum-list': { - dir: join(portFixtures, 'enum-array/_fixture/generated'), - nativeTypes: { 'pg/text': 'text' }, - releasedChecks: { - user_plans_check_15afb6ce: { - name: 'user_plans_check_86e31b31', - expression: `"plans"::text[] <@ ARRAY['FREE', 'PAID', 'CUSTOM']::text[]`, - }, - }, - }, -} as const satisfies Record; - -function sortedDeep(value: Json): Json { - if (isObject(value)) - return Object.fromEntries( - Object.keys(value) - .sort() - .map((key) => [key, sortedDeep(value[key] ?? null)]), - ); - return Array.isArray(value) ? value.map(sortedDeep) : value; -} - -function releasedEntries( - entries: Json | undefined, - rewrite: (entry: JsonObject) => JsonObject, -): JsonObject { - return Object.fromEntries( - Object.entries(isObject(entries) ? entries : {}).map(([name, entry]) => [ - name, - isObject(entry) ? rewrite(entry) : entry, - ]), - ); -} - -function isObject(value: Json | undefined): value is JsonObject { - return typeof value === 'object' && value !== null && !Array.isArray(value); -} - -function releasedList(entry: JsonObject): JsonObject { - return isObject(entry['many']) ? { ...entry, many: true } : entry; -} - -function releasedColumn(source: EmittedSource) { - return (column: JsonObject): JsonObject => { - const { dataType, ...rest } = column; - return releasedList({ ...rest, nativeType: source.nativeTypes[String(dataType)] ?? '' }); - }; -} - -function releasedCheck(check: Json, source: EmittedSource): Json { - const released = isObject(check) ? source.releasedChecks?.[String(check['name'])] : undefined; - return released === undefined || !isObject(check) ? check : { ...check, ...released }; -} - -function mapTables(storage: JsonObject, rewrite: (table: JsonObject) => JsonObject): JsonObject { - return { - ...storage, - namespaces: releasedEntries(storage['namespaces'], (namespace) => { - const entries = isObject(namespace['entries']) ? namespace['entries'] : {}; - return { - ...namespace, - entries: { ...entries, table: releasedEntries(entries['table'], rewrite) }, - }; - }), - }; -} - -function withReleasedChecks(storage: JsonObject, source: EmittedSource): JsonObject { - return mapTables(storage, (table) => - Array.isArray(table['checks']) - ? { ...table, checks: table['checks'].map((check) => releasedCheck(check, source)) } - : table, - ); -} - -function releasedStorage(storage: JsonObject, source: EmittedSource): JsonObject { - return mapTables(withReleasedChecks(storage, source), (table) => ({ - ...table, - columns: releasedEntries(table['columns'], releasedColumn(source)), - })); -} - -function storageOf(contract: JsonObject): JsonObject { - const { storageHash: _emitted, ...storage } = isObject(contract['storage']) - ? contract['storage'] - : {}; - return storage; -} - -function withStorage(contract: JsonObject, storage: JsonObject): JsonObject { - const storageHash = computeStorageHash({ - target: String(contract['target']), - targetFamily: 'sql', - storage, - ...sqlContractCanonicalizationHooks, - }); - const result: Record = {}; - for (const [key, value] of Object.entries(contract)) - result[key] = key === 'storage' ? sortedDeep({ ...storage, storageHash }) : value; - return result; -} - -function releasedDomain(domain: JsonObject): JsonObject { - return { - ...domain, - namespaces: releasedEntries(domain['namespaces'], (namespace) => ({ - ...namespace, - models: releasedEntries(namespace['models'], (model) => ({ - ...model, - fields: releasedEntries(model['fields'], releasedList), - })), - })), - }; -} - -function releasedContract(contract: JsonObject, source: EmittedSource): JsonObject { - const released = withStorage(contract, releasedStorage(storageOf(contract), source)); - const domain = released['domain']; - return isObject(domain) ? { ...released, domain: sortedDeep(releasedDomain(domain)) } : released; -} - -function blockOpener(lines: readonly string[], index: number): number { - const indent = /^\s*/.exec(lines[index] ?? '')?.[0].length ?? 0; - let opener = index; - while (opener > 0 && (/^\s*/.exec(lines[opener] ?? '')?.[0].length ?? 0) >= indent) opener--; - return opener; -} - -function releasedDts( - dts: string, - source: EmittedSource, - hashes: readonly [string, string], -): string { - const lines = dts.split('\n'); - const released: string[] = []; - lines.forEach((line, index) => { - const many = /^(\s*)readonly many: .*;$/.exec(line); - if (many) { - const block = lines.slice(blockOpener(lines, index), index); - const isColumn = block.some((member) => /^\s*readonly dataType: /.test(member)); - if (!isColumn) released.push(`${many[1]}readonly many: true;`); - return; - } - released.push( - line.replace( - /readonly dataType: '([^']*)'/, - (_match, dataType: string) => `readonly nativeType: '${source.nativeTypes[dataType]}'`, - ), - ); - }); - return released.join('\n').replaceAll(hashes[0], hashes[1]); -} - -function releaseProject(name: keyof typeof RELEASE_SOURCES) { - return (format: Format): Record => { - const source = RELEASE_SOURCES[name]; - const emittedText = readFileSync(join(source.dir, 'contract.json'), 'utf8'); - const emittedDts = readFileSync(join(source.dir, 'contract.d.ts'), 'utf8'); - const emitted: JsonObject = JSON.parse(emittedText); - const upgraded = - 'releasedChecks' in source - ? withStorage(emitted, withReleasedChecks(storageOf(emitted), source)) - : emitted; - const contract = format === 'new' ? upgraded : releasedContract(emitted, source); - const storage = isObject(contract['storage']) ? contract['storage'] : {}; - const hash = String(storage['storageHash']); - const emittedHash = String(isObject(emitted['storage']) && emitted['storage']['storageHash']); - const dts = - format === 'new' - ? emittedDts.replaceAll(emittedHash, hash) - : releasedDts(emittedDts, source, [emittedHash, hash]); - return { - 'prisma/contract.json': - format === 'new' && upgraded === emitted ? emittedText : emittedJson(contract), - 'prisma/contract.d.ts': dts, - [`migrations/snapshots/${hash}/contract.json`]: snapshotJson(contract), - [`migrations/snapshots/${hash}/contract.d.ts`]: dts, - ...migrationFiles( - { dir: 'migrations/app/20260101T0000_initial', from: null, to: hash, migrationTs: true }, - '../../snapshots', - ), - 'migrations/app/refs/head.json': ref(hash), - }; - }; -} - -rmSync(fixturesRoot, { recursive: true, force: true }); -writeCase('postgres-extension-space', postgresExtensionSpace); -writeCase('extension-package', extensionPackage); -writeCase('sqlite-defaults', sqliteDefaults); -writeCase('snapshot-already-present', snapshotAlreadyPresent); -writeCase('stale-hash', staleHash); -writeCase('unknown-codec', unknownCodec); -writeCase('unknown-target', unknownTarget); -writeCase('db-migrations', dbMigrations); -writeCase('two-migration-roots', twoMigrationRoots); -writeCase('sqlite-integer-enums', sqliteIntegerEnums); -writeCase('sqlite-json-enums', sqliteJsonEnums); -writeCase('json-default-document', jsonDefaultDocument); -writeCase('rc14-lists', releaseProject('rc14-lists')); -writeCase('rc14-no-lists', releaseProject('rc14-no-lists')); -writeCase('rc14-enum-list', releaseProject('rc14-enum-list')); -writeUnchangedCase('snapshot-collision', snapshotCollision()); diff --git a/test/integration/test/upgrade-instructions/data-type-in-contract/test-helpers.ts b/test/integration/test/upgrade-instructions/data-type-in-contract/test-helpers.ts index 73b3dab116fd..6007f19d9f98 100644 --- a/test/integration/test/upgrade-instructions/data-type-in-contract/test-helpers.ts +++ b/test/integration/test/upgrade-instructions/data-type-in-contract/test-helpers.ts @@ -5,9 +5,9 @@ import { fileURLToPath } from 'node:url'; import { dirname, join, relative } from 'pathe'; const SCRIPT_PATHS = { - app: 'upgrade-instructions/pending/data-type-in-contract/app/scripts/data-type-in-contract.ts', + app: 'skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts', extension: - 'upgrade-instructions/pending/data-type-in-contract/extension/scripts/data-type-in-contract.ts', + 'skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts', } as const; const here = dirname(fileURLToPath(import.meta.url)); diff --git a/test/utils/package.json b/test/utils/package.json index 95cdcc279035..2c35d2786086 100644 --- a/test/utils/package.json +++ b/test/utils/package.json @@ -1,6 +1,6 @@ { "name": "@repo/test-utils", - "version": "8.0.0-rc.14", + "version": "8.0.0-rc.15", "private": true, "type": "module", "sideEffects": false, @@ -13,15 +13,15 @@ "clean": "rm -rf dist dist-tsc dist-tsc-prod coverage .tmp-output" }, "dependencies": { - "@internal/contract": "workspace:8.0.0-rc.14", - "@internal/utils": "workspace:8.0.0-rc.14" + "@internal/contract": "workspace:8.0.0-rc.15", + "@internal/utils": "workspace:8.0.0-rc.15" }, "devDependencies": { - "@repo/tsconfig": "workspace:8.0.0-rc.14", + "@repo/tsconfig": "workspace:8.0.0-rc.15", "@prisma/dev": "catalog:", "@types/pg": "catalog:", "pg": "catalog:", - "@repo/tsdown": "workspace:8.0.0-rc.14", + "@repo/tsdown": "workspace:8.0.0-rc.15", "tsdown": "catalog:", "typescript": "catalog:", "vitest": "catalog:" diff --git a/upgrade-instructions/pending/adr-numbers-unique/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/adr-numbers-unique/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/adr-numbers-unique/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/adr-numbers-unique/extension/instructions.md diff --git a/upgrade-instructions/pending/after-transaction-stage/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/after-transaction-stage/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/after-transaction-stage/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/after-transaction-stage/extension/instructions.md diff --git a/upgrade-instructions/pending/binder-from-caller/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/binder-from-caller/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/binder-from-caller/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/binder-from-caller/extension/instructions.md diff --git a/upgrade-instructions/pending/brownfield-date-types-are-text/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/brownfield-date-types-are-text/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/brownfield-date-types-are-text/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/brownfield-date-types-are-text/app/instructions.md diff --git a/upgrade-instructions/pending/bytea-defaults-verify/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/bytea-defaults-verify/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/bytea-defaults-verify/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/bytea-defaults-verify/app/instructions.md diff --git a/upgrade-instructions/pending/bytea-defaults-verify/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/bytea-defaults-verify/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/bytea-defaults-verify/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/bytea-defaults-verify/extension/instructions.md diff --git a/upgrade-instructions/pending/cache-middleware-control-primitives/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/cache-middleware-control-primitives/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/cache-middleware-control-primitives/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/cache-middleware-control-primitives/app/instructions.md diff --git a/upgrade-instructions/pending/cache-middleware-control-primitives/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/cache-middleware-control-primitives/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/cache-middleware-control-primitives/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/cache-middleware-control-primitives/extension/instructions.md diff --git a/upgrade-instructions/pending/cache-middleware-design-record/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/cache-middleware-design-record/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/cache-middleware-design-record/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/cache-middleware-design-record/extension/instructions.md diff --git a/upgrade-instructions/pending/collection-keeps-its-class/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/collection-keeps-its-class/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/collection-keeps-its-class/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/collection-keeps-its-class/app/instructions.md diff --git a/upgrade-instructions/pending/collection-keeps-its-class/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/collection-keeps-its-class/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/collection-keeps-its-class/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/collection-keeps-its-class/extension/instructions.md diff --git a/upgrade-instructions/pending/contract-dts-imports-only-used-types/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/contract-dts-imports-only-used-types/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/contract-dts-imports-only-used-types/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/contract-dts-imports-only-used-types/extension/instructions.md diff --git a/upgrade-instructions/pending/data-type-in-contract/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/data-type-in-contract/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/app/instructions.md diff --git a/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/app/scripts/data-type-in-contract.ts b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/app/scripts/data-type-in-contract.ts new file mode 100644 index 000000000000..1eb58fe4b8d4 --- /dev/null +++ b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/app/scripts/data-type-in-contract.ts @@ -0,0 +1,1492 @@ +#!/usr/bin/env node +/** + * Rewrites every SQL contract in a project from `nativeType` to `dataType`, and a list stored as + * `many: true` to `many: { elementNullable: false }`, then renames the snapshot directories and + * rewrites every migration, ref, `migration.ts` and `contract.d.ts` that names an old storage hash. + * + * Usage: node data-type-in-contract.ts [project-root] [--data-type =]... + * + * `--data-type` names the data type of a codec the script's table does not know for a contract's + * target, such as an extension's own codec. It cannot change the data type of a codec the table + * knows for that target. + * + * The project root defaults to the working directory. The script reads and writes files only. It + * needs no database, network or configured stack, and a project already in the new format is left + * unchanged. When it stops (an unknown codec, or a snapshot directory that already exists with + * different content) it changes no file, prints one line per case and exits 1. When it finishes it + * prints how many files and snapshot directories it changed and each storage hash it replaced. + * + * The storage hash and migration hash rules are copied from `@internal/contract` and + * `@internal/migration-tools` because a project's strict `node_modules` does not expose them. + */ +import { createHash } from 'node:crypto'; +import { + chmodSync, + type Dirent, + existsSync, + mkdirSync, + readdirSync, + readFileSync, + realpathSync, + renameSync, + rmSync, + statSync, + writeFileSync, +} from 'node:fs'; +import { basename, dirname, join, relative, resolve, sep } from 'node:path'; + +type Json = null | boolean | number | string | Json[] | JsonRecord; +interface JsonRecord { + [key: string]: Json; +} + +const DATA_TYPES: Readonly>>> = { + postgres: { + 'pg/text@1': 'pg/text', + 'pg/text-array@1': 'pg/text-array', + 'pg/enum@1': 'pg/enum', + 'pg/char@1': 'pg/char', + 'pg/varchar@1': 'pg/varchar', + 'pg/int@1': 'pg/int4', + 'pg/int2@1': 'pg/int2', + 'pg/int4@1': 'pg/int4', + 'pg/int8@1': 'pg/int8', + 'pg/int8number@1': 'pg/int8', + 'pg/float@1': 'pg/float8', + 'pg/float4@1': 'pg/float4', + 'pg/float8@1': 'pg/float8', + 'pg/numeric@1': 'pg/numeric', + 'pg/unboundedint@1': 'pg/numeric', + 'pg/bool@1': 'pg/bool', + 'pg/bit@1': 'pg/bit', + 'pg/varbit@1': 'pg/varbit', + 'pg/bytea@1': 'pg/bytea', + 'pg/uuid@1': 'pg/uuid', + 'pg/inet@1': 'pg/inet', + 'pg/tsquery@1': 'pg/tsquery', + 'pg/interval@1': 'pg/interval', + 'pg/json@1': 'pg/json', + 'pg/jsonb@1': 'pg/jsonb', + 'pg/timetz@1': 'pg/timetz', + 'pg/date-temporal@1': 'pg/date', + 'pg/timestamp-temporal@1': 'pg/timestamp', + 'pg/timestamptz-temporal@1': 'pg/timestamptz', + 'pg/time-temporal@1': 'pg/time', + 'pg/date-string@1': 'pg/date', + 'pg/timestamp-string@1': 'pg/timestamp', + 'pg/timestamptz-string@1': 'pg/timestamptz', + 'pg/time-string@1': 'pg/time', + 'pg/timestamptz-date@1': 'pg/timestamptz', + 'pg/timestamptz@1': 'pg/timestamptz', + 'pg/timestamp@1': 'pg/timestamp', + 'pg/time@1': 'pg/time', + 'pg/date@1': 'pg/date', + 'sql/char@1': 'pg/char', + 'sql/varchar@1': 'pg/varchar', + 'sql/int@1': 'pg/int4', + 'sql/float@1': 'pg/float8', + 'sql/text@1': 'pg/text', + 'sql/timestamp@1': 'pg/timestamptz', + 'pg/vector@1': 'pgvector/vector', + 'pg/geometry@1': 'postgis/geometry', + 'arktype/json@1': 'pg/jsonb', + }, + sqlite: { + 'sqlite/text@1': 'sqlite/text', + 'sqlite/json@1': 'sqlite/text', + 'sqlite/datetime@1': 'sqlite/text', + 'sqlite/integer@1': 'sqlite/integer', + 'sqlite/bigint@1': 'sqlite/integer', + 'sqlite/bigintnumber@1': 'sqlite/integer', + 'sql/int@1': 'sqlite/integer', + 'sqlite/real@1': 'sqlite/real', + 'sql/float@1': 'sqlite/real', + 'sqlite/blob@1': 'sqlite/blob', + 'sql/char@1': 'sqlite/character', + 'sql/varchar@1': 'sqlite/character-varying', + }, +}; + +const SQLITE_INTEGER_CODECS = new Set([ + 'sqlite/integer@1', + 'sql/int@1', + 'sqlite/bigint@1', + 'sqlite/bigintnumber@1', +]); +const SQLITE_JSON_CODEC = 'sqlite/json@1'; +const SKIPPED_DIRECTORIES = new Set(['node_modules', '.git', 'dist', 'build']); +const HASH = /^[0-9a-f]{64}$/; +const TEMPORARY_SUFFIX = '.data-type-in-contract-tmp'; + +function isRecord(value: unknown): value is JsonRecord { + if (typeof value !== 'object' || value === null || Array.isArray(value)) return false; + const prototype: unknown = Object.getPrototypeOf(value); + return prototype === Object.prototype || prototype === null; +} + +function parseJson(text: string): Json | undefined { + try { + const value: Json = JSON.parse(text); + return value; + } catch { + return undefined; + } +} + +function sha256(text: string): string { + return createHash('sha256').update(text).digest('hex'); +} + +function compareCodeUnits(a: string, b: string): number { + return a < b ? -1 : a > b ? 1 : 0; +} + +function sortKeys(value: Json): Json { + if (Array.isArray(value)) return value.map(sortKeys); + if (!isRecord(value)) return value; + const sorted: JsonRecord = {}; + for (const key of Object.keys(value).sort(compareCodeUnits)) { + const child = value[key]; + if (child !== undefined) sorted[key] = sortKeys(child); + } + return sorted; +} + +function canonicalizeJson(value: Json): string { + return JSON.stringify(sortKeys(value)); +} + +type PathSegment = string | readonly string[]; + +function matchesPath(path: readonly string[], pattern: readonly PathSegment[]): boolean { + if (path.length !== pattern.length) return false; + return pattern.every((segment, index) => { + const value = path[index]; + if (value === undefined) return false; + if (segment === '*') return true; + return typeof segment === 'string' ? value === segment : segment.includes(value); + }); +} + +const SQL_PRESERVED_EMPTY: readonly (readonly PathSegment[])[] = [ + ['storage', 'namespaces', '*', 'entries', 'table'], + ['storage', 'namespaces', '*', 'entries', 'table', '*'], + ['storage', 'namespaces', '*', 'entries', 'table', '*', ['uniques', 'indexes', 'foreignKeys']], + ['storage', 'namespaces', '*', 'entries', 'table', '*', 'indexes', 'unique'], + ['storage', 'namespaces', '*', 'entries', 'table', '*', 'columns', '*', 'default', 'value'], +]; +const COLUMN_DEFAULT_VALUE: readonly PathSegment[] = [ + 'storage', + 'namespaces', + '*', + 'entries', + 'table', + '*', + 'columns', + '*', + 'default', + 'value', +]; +const COLUMN_PATHS: readonly (readonly PathSegment[])[] = [ + ['storage', 'namespaces', '*', 'entries', 'table', '*', 'columns', '*'], + ['storage', 'namespaces', '*', 'tables', '*', 'columns', '*'], +]; +const NATIVE_TYPE_PATHS: readonly (readonly PathSegment[])[] = [ + ...COLUMN_PATHS, + ['storage', 'types', '*'], +]; +const LIST_PATHS: readonly (readonly PathSegment[])[] = [ + ...COLUMN_PATHS, + ['domain', 'namespaces', '*', ['models', 'valueObjects'], '*', 'fields', '*'], +]; +const FRAMEWORK_PRESERVED_EMPTY: readonly (readonly PathSegment[])[] = [ + ['domain', 'namespaces'], + ['domain', 'namespaces', '*'], + ['domain', 'namespaces', '*', 'models'], + ['domain', 'namespaces', '*', 'models', '*', 'relations'], + ['domain', 'namespaces', '*', 'models', '*', 'storage'], + ['storage', 'namespaces'], + ['storage', 'namespaces', '*', 'entries'], + ['roots'], + ['extensions'], + ['extensions', '*'], + ['capabilities'], + ['meta'], + ['execution', 'mutations', 'defaults'], +]; +const TOP_LEVEL_ORDER = [ + 'schemaVersion', + 'canonicalVersion', + 'targetFamily', + 'target', + 'profileHash', + 'roots', + 'domain', + 'storage', + 'execution', + 'capabilities', + 'extensions', + 'defaultControlPolicy', + 'meta', +]; + +function isDefaultValue(value: Json): boolean { + if (value === false) return true; + if (Array.isArray(value)) return value.length === 0; + return isRecord(value) && Object.keys(value).length === 0; +} + +function isPreservedEmpty(path: readonly string[], key: string): boolean { + if (key === 'nullable') return true; + if (key === 'elementNullable' && path.at(-2) === 'many') return true; + if (FRAMEWORK_PRESERVED_EMPTY.some((pattern) => matchesPath(path, pattern))) return true; + if ( + path.length >= COLUMN_DEFAULT_VALUE.length && + matchesPath(path.slice(0, COLUMN_DEFAULT_VALUE.length), COLUMN_DEFAULT_VALUE) + ) + return true; + return SQL_PRESERVED_EMPTY.some((pattern) => matchesPath(path, pattern)); +} + +function omitDefaults(value: Json, path: readonly string[]): Json { + if (Array.isArray(value)) return value.map((item) => omitDefaults(item, path)); + if (!isRecord(value)) return value; + const result: JsonRecord = {}; + for (const [key, child] of Object.entries(value)) { + const childPath = [...path, key]; + if (key === '_generated') continue; + if (key === 'generated' && child === false) continue; + if ((key === 'onDelete' || key === 'onUpdate') && child === 'noAction') continue; + if (isDefaultValue(child) && !isPreservedEmpty(childPath, key)) continue; + result[key] = omitDefaults(child, childPath); + } + return result; +} + +function compareByName(a: Json, b: Json): number { + const nameA = isRecord(a) && typeof a['name'] === 'string' ? a['name'] : ''; + const nameB = isRecord(b) && typeof b['name'] === 'string' ? b['name'] : ''; + return compareCodeUnits(nameA, nameB); +} + +function sortTableArrays(storage: Json): Json { + if (!isRecord(storage)) return storage; + const namespaces = storage['namespaces']; + if (!isRecord(namespaces)) return storage; + const sortedNamespaces: JsonRecord = {}; + for (const [namespaceId, namespace] of Object.entries(namespaces)) { + const entries = isRecord(namespace) ? namespace['entries'] : undefined; + const tables = isRecord(entries) ? entries['table'] : undefined; + if (!isRecord(namespace) || !isRecord(entries) || !isRecord(tables)) { + sortedNamespaces[namespaceId] = namespace; + continue; + } + const sortedTables: JsonRecord = {}; + for (const [tableName, table] of Object.entries(tables)) { + if (!isRecord(table)) { + sortedTables[tableName] = table; + continue; + } + const sortedTable: JsonRecord = { ...table }; + for (const key of ['checks', 'indexes', 'uniques']) { + const list = table[key]; + if (Array.isArray(list)) sortedTable[key] = [...list].sort(compareByName); + } + sortedTables[tableName] = sortedTable; + } + sortedNamespaces[namespaceId] = { ...namespace, entries: { ...entries, table: sortedTables } }; + } + return { ...storage, namespaces: sortedNamespaces }; +} + +function orderTopLevel(value: JsonRecord): JsonRecord { + const ordered: JsonRecord = {}; + const remaining = new Set(Object.keys(value)); + for (const key of TOP_LEVEL_ORDER) { + const child = value[key]; + if (child !== undefined) { + ordered[key] = child; + remaining.delete(key); + } + } + for (const key of [...remaining].sort(compareCodeUnits)) { + const child = value[key]; + if (child !== undefined) ordered[key] = child; + } + return ordered; +} + +function omitNamespaceKinds(storage: JsonRecord): JsonRecord { + const namespaces = storage['namespaces']; + if (!isRecord(namespaces)) return storage; + const stripped: JsonRecord = {}; + for (const [namespaceId, namespace] of Object.entries(namespaces)) { + if (isRecord(namespace)) { + const { kind: _kind, ...rest } = namespace; + stripped[namespaceId] = rest; + } else { + stripped[namespaceId] = namespace; + } + } + return { ...storage, namespaces: stripped }; +} + +function computeStorageHash(contract: JsonRecord): string { + const storage = isRecord(contract['storage']) ? contract['storage'] : {}; + const { storageHash: _published, ...withoutHash } = storage; + const hashed: JsonRecord = { + schemaVersion: '1', + targetFamily: typeof contract['targetFamily'] === 'string' ? contract['targetFamily'] : '', + target: typeof contract['target'] === 'string' ? contract['target'] : '', + profileHash: '', + roots: {}, + domain: { namespaces: {} }, + storage: omitNamespaceKinds(withoutHash), + extensions: {}, + capabilities: {}, + meta: {}, + }; + const withoutDefaults = omitDefaults(hashed, []); + if (!isRecord(withoutDefaults)) return ''; + const withSortedStorage = { + ...withoutDefaults, + storage: sortTableArrays(withoutDefaults['storage'] ?? {}), + }; + const sorted = sortKeys(withSortedStorage); + return isRecord(sorted) ? sha256(JSON.stringify(orderTopLevel(sorted), null, 2)) : ''; +} + +function computeMigrationHash(metadata: JsonRecord, ops: Json): string { + const { migrationHash: _migrationHash, ...withoutHash } = metadata; + const parts = [canonicalizeJson(withoutHash), canonicalizeJson(ops)].map(sha256); + return sha256(canonicalizeJson(parts)); +} + +interface ProjectFiles { + readonly json: readonly string[]; + readonly migrationJson: readonly string[]; + readonly refs: readonly string[]; + readonly migrationTs: readonly string[]; + readonly leftovers: readonly string[]; +} + +function isDirectory(path: string): boolean { + try { + return statSync(path).isDirectory(); + } catch { + return false; + } +} + +function isFile(path: string): boolean { + try { + return statSync(path).isFile(); + } catch { + return false; + } +} + +/** A file, or a link to one: the script reads and writes through links to files. */ +function isFileEntry(dir: string, entry: Dirent): boolean { + return entry.isFile() || (entry.isSymbolicLink() && isFile(join(dir, entry.name))); +} + +/** A file the script reads, by the path it was reached through: its own path rather than a link's. */ +interface FoundFile { + readonly path: string; + readonly linked: boolean; + readonly inMigrationPackage: boolean; +} + +function listFiles(root: string): ProjectFiles { + const leftovers: string[] = []; + const visited = new Set(); + const found = new Map(); + const visit = (dir: string): void => { + const realDir = realpathSync(dir); + if (visited.has(realDir)) return; + visited.add(realDir); + const entries = readdirSync(dir, { withFileTypes: true }).sort((a, b) => + compareCodeUnits(a.name, b.name), + ); + const inMigrationPackage = entries.some( + (entry) => entry.name === 'migration.json' && isFileEntry(dir, entry), + ); + for (const entry of entries) { + const path = join(dir, entry.name); + if (entry.name.endsWith(TEMPORARY_SUFFIX)) { + leftovers.push(path); + continue; + } + if (entry.isDirectory() || (entry.isSymbolicLink() && isDirectory(path))) { + if (!SKIPPED_DIRECTORIES.has(entry.name)) visit(path); + continue; + } + if (!isFileEntry(dir, entry)) continue; + const realFile = realpathSync(path); + const linked = entry.isSymbolicLink(); + const known = found.get(realFile); + if (known === undefined || (known.linked && !linked)) + found.set(realFile, { path, linked, inMigrationPackage }); + } + }; + visit(root); + const files = [...found.values()]; + const named = (test: (file: FoundFile, name: string) => boolean): string[] => + files.filter((file) => test(file, basename(file.path))).map((file) => file.path); + return { + json: named((_file, name) => name.endsWith('.json')), + migrationJson: named((_file, name) => name === 'migration.json'), + refs: named((file, name) => name.endsWith('.json') && basename(dirname(file.path)) === 'refs'), + migrationTs: named((file, name) => name === 'migration.ts' && file.inMigrationPackage), + leftovers, + }; +} + +function isSnapshotContract(path: string): boolean { + const snapshotDir = dirname(path); + return ( + basename(path) === 'contract.json' && + HASH.test(basename(snapshotDir)) && + basename(dirname(snapshotDir)) === 'snapshots' + ); +} + +interface Rewrite { + readonly contract: JsonRecord; + readonly changed: boolean; + readonly unknownCodecs: readonly string[]; + readonly defaultRewrites: ReadonlyMap; + readonly integerEnums: ReadonlySet; + readonly jsonEnums: ReadonlyMap; + readonly columnCardinalities: ReadonlyMap; +} + +/** The rewritten values of an enum typed by `sqlite/json@1`: its value set and its members by name. */ +interface JsonEnumValues { + values: readonly Json[] | undefined; + readonly members: Map; +} + +function rewriteDefault(target: string, codecId: string, value: JsonRecord): JsonRecord { + const defaultValue = value['default']; + if (target !== 'sqlite' || !isRecord(defaultValue) || defaultValue['kind'] !== 'literal') + return value; + const literal = defaultValue['value']; + if (literal === undefined) return value; + if (codecId === SQLITE_JSON_CODEC) + return { ...value, default: { ...defaultValue, value: canonicalizeJson(literal) } }; + if ( + SQLITE_INTEGER_CODECS.has(codecId) && + typeof literal === 'number' && + Number.isInteger(literal) + ) + return { ...value, default: { ...defaultValue, value: BigInt(literal).toString() } }; + return value; +} + +function digitText(value: Json): Json { + return typeof value === 'number' && Number.isInteger(value) ? BigInt(value).toString() : value; +} + +function mapRecord(value: Json, map: (key: string, child: Json) => Json): Json { + if (!isRecord(value)) return value; + const result: JsonRecord = {}; + for (const [key, child] of Object.entries(value)) result[key] = map(key, child); + return result; +} + +function mapEntries( + value: Json, + path: readonly string[], + patterns: readonly (readonly PathSegment[])[], + rewrite: (entry: JsonRecord, path: readonly string[]) => JsonRecord, +): Json { + if (!isRecord(value)) return value; + if (patterns.some((pattern) => matchesPath(path, pattern))) return rewrite(value, path); + const leadsToEntry = patterns.some( + (pattern) => path.length < pattern.length && matchesPath(path, pattern.slice(0, path.length)), + ); + return leadsToEntry + ? mapRecord(value, (key, child) => mapEntries(child, [...path, key], patterns, rewrite)) + : value; +} + +function mapContractEntries( + contract: JsonRecord, + patterns: readonly (readonly PathSegment[])[], + rewrite: (entry: JsonRecord, path: readonly string[]) => JsonRecord, +): JsonRecord { + const result: JsonRecord = {}; + for (const [key, child] of Object.entries(contract)) + result[key] = mapEntries(child, [key], patterns, rewrite); + return result; +} + +/** Release 8.0.0-rc.14 stored a list column or field as `many: true`; the current form is `many: { elementNullable: false }`. */ +function currentListForm(entry: JsonRecord): JsonRecord { + return entry['many'] === true ? { ...entry, many: { elementNullable: false } } : entry; +} + +function storageColumnKey(namespaceId: string, table: string, column: string): string { + return `${namespaceId}\u0000${table}\u0000${column}`; +} + +/** The `many` of every storage column, `false` for a column that is not a list. */ +function columnCardinalities(contract: JsonRecord): ReadonlyMap { + const cardinalities = new Map(); + const storage = contract['storage']; + const namespaces = isRecord(storage) ? storage['namespaces'] : undefined; + for (const [namespaceId, namespace] of isRecord(namespaces) ? Object.entries(namespaces) : []) { + if (!isRecord(namespace)) continue; + const entries = namespace['entries']; + const tables = isRecord(entries) ? entries['table'] : namespace['tables']; + for (const [tableName, table] of isRecord(tables) ? Object.entries(tables) : []) { + const columns = isRecord(table) ? table['columns'] : undefined; + for (const [columnName, column] of isRecord(columns) ? Object.entries(columns) : []) + cardinalities.set( + storageColumnKey(namespaceId, tableName, columnName), + isRecord(column) ? (column['many'] ?? false) : false, + ); + } + } + return cardinalities; +} + +function enumKey(namespaceId: string, name: string): string { + return `${namespaceId}\u0000${name}`; +} + +/** + * On SQLite the integer codecs store digit text and `sqlite/json@1` stores the JSON text of a + * document, so the members of an enum typed by one of them, in the domain and in the storage value + * set its columns name, are rewritten to that text too. + */ +function rewriteSqliteEnums(contract: JsonRecord): { + readonly contract: JsonRecord; + readonly integerEnums: ReadonlySet; + readonly jsonEnums: ReadonlyMap; +} { + const integerEnums = new Set(); + const jsonEnums = new Map(); + const jsonEnum = (key: string): JsonEnumValues => { + const existing = jsonEnums.get(key); + if (existing !== undefined) return existing; + const created: JsonEnumValues = { values: undefined, members: new Map() }; + jsonEnums.set(key, created); + return created; + }; + const domainCodecs = new Map(); + const domain = mapRecord(contract['domain'] ?? null, (key, namespaces) => + key !== 'namespaces' + ? namespaces + : mapRecord(namespaces, (namespaceId, namespace) => + mapRecord(namespace, (kind, enums) => + kind !== 'enum' + ? enums + : mapRecord(enums, (name, enumType) => { + const codecId = isRecord(enumType) ? enumType['codecId'] : undefined; + if (typeof codecId === 'string') + domainCodecs.set(enumKey(namespaceId, name), codecId); + const members = isRecord(enumType) ? enumType['members'] : undefined; + if (!isRecord(enumType) || typeof codecId !== 'string' || !Array.isArray(members)) + return enumType; + const key = enumKey(namespaceId, name); + if (SQLITE_INTEGER_CODECS.has(codecId)) { + integerEnums.add(key); + return { + ...enumType, + members: members.map((member) => + isRecord(member) && member['value'] !== undefined + ? { ...member, value: digitText(member['value']) } + : member, + ), + }; + } + if (codecId !== SQLITE_JSON_CODEC) return enumType; + const rewritten = jsonEnum(key); + return { + ...enumType, + members: members.map((member) => { + const value = isRecord(member) ? member['value'] : undefined; + if (!isRecord(member) || value === undefined) return member; + const text = canonicalizeJson(value); + if (typeof member['name'] === 'string') + rewritten.members.set(member['name'], text); + return { ...member, value: text }; + }), + }; + }), + ), + ), + ); + + const columnCodecs = new Map(); + const storage = contract['storage']; + const namespaces = isRecord(storage) ? storage['namespaces'] : undefined; + for (const namespace of isRecord(namespaces) ? Object.values(namespaces) : []) { + const entries = isRecord(namespace) ? namespace['entries'] : undefined; + const tables = isRecord(entries) ? entries['table'] : undefined; + for (const table of isRecord(tables) ? Object.values(tables) : []) { + const columns = isRecord(table) ? table['columns'] : undefined; + for (const column of isRecord(columns) ? Object.values(columns) : []) { + const valueSet = isRecord(column) ? column['valueSet'] : undefined; + const codecId = isRecord(column) ? column['codecId'] : undefined; + if ( + isRecord(valueSet) && + typeof valueSet['namespaceId'] === 'string' && + typeof valueSet['entityName'] === 'string' && + typeof codecId === 'string' + ) + columnCodecs.set(enumKey(valueSet['namespaceId'], valueSet['entityName']), codecId); + } + } + } + + const nextStorage = mapRecord(storage ?? null, (key, storageNamespaces) => + key !== 'namespaces' + ? storageNamespaces + : mapRecord(storageNamespaces, (namespaceId, namespace) => + mapRecord(namespace, (namespaceKey, entries) => + namespaceKey !== 'entries' + ? entries + : mapRecord(entries, (entryKind, valueSets) => + entryKind !== 'valueSet' + ? valueSets + : mapRecord(valueSets, (name, valueSet) => { + const key = enumKey(namespaceId, name); + const codecId = columnCodecs.get(key) ?? domainCodecs.get(key); + const values = isRecord(valueSet) ? valueSet['values'] : undefined; + if (codecId === undefined || !isRecord(valueSet) || !Array.isArray(values)) + return valueSet; + if (SQLITE_INTEGER_CODECS.has(codecId)) { + integerEnums.add(key); + return { ...valueSet, values: values.map(digitText) }; + } + if (codecId !== SQLITE_JSON_CODEC) return valueSet; + const texts = values.map(canonicalizeJson); + jsonEnum(key).values = texts; + return { ...valueSet, values: texts }; + }), + ), + ), + ), + ); + + return { + contract: { + ...contract, + ...(contract['domain'] === undefined ? {} : { domain }), + ...(storage === undefined ? {} : { storage: nextStorage }), + }, + integerEnums, + jsonEnums, + }; +} + +function dataTypesFor( + target: string, + extra: ReadonlyMap, +): Readonly> { + return { ...Object.fromEntries(extra), ...DATA_TYPES[target] }; +} + +const CODEC_ID = /^[^\s=]+$/; +const DATA_TYPE_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/; + +interface Options { + readonly root: string; + readonly dataTypes: ReadonlyMap; + readonly errors: readonly string[]; +} + +function parseOptions(args: readonly string[]): Options { + const dataTypes = new Map(); + const errors: string[] = []; + const positional: string[] = []; + for (let index = 0; index < args.length; index++) { + const arg = args[index] ?? ''; + if (arg !== '--data-type' && !arg.startsWith('--data-type=')) { + if (arg.startsWith('--')) errors.push(`${arg}: unknown option`); + else positional.push(arg); + continue; + } + const value = arg === '--data-type' ? (args[++index] ?? '') : arg.slice('--data-type='.length); + const separator = value.indexOf('='); + const codecId = value.slice(0, separator); + const dataType = value.slice(separator + 1); + if (separator === -1 || !CODEC_ID.test(codecId) || !DATA_TYPE_ID.test(dataType)) { + errors.push( + `--data-type ${value}: expected =, for example acme/shape@1=acme/shape`, + ); + continue; + } + dataTypes.set(codecId, dataType); + } + return { root: resolve(positional[0] ?? process.cwd()), dataTypes, errors }; +} + +function rewriteContract(contract: JsonRecord, extra: ReadonlyMap): Rewrite { + const target = typeof contract['target'] === 'string' ? contract['target'] : ''; + const table = dataTypesFor(target, extra); + const unknownCodecs = new Set(); + const defaultRewrites = new Map(); + let changed = false; + + const rewriteEntry = (value: JsonRecord, path: readonly string[]): JsonRecord => { + const codecId = value['codecId']; + if (typeof codecId !== 'string' || typeof value['nativeType'] !== 'string') return value; + const dataType = table[codecId]; + if (dataType === undefined) { + unknownCodecs.add(codecId); + return value; + } + changed = true; + const { nativeType: _nativeType, ...rest } = value; + const rewritten = rewriteDefault(target, codecId, { ...rest, dataType }); + const before = value['default']; + const after = rewritten['default']; + if (isRecord(before) && isRecord(after) && before['value'] !== after['value']) { + const columnKey = path.slice(-3); + const newValue = after['value']; + if (columnKey[1] === 'columns' && newValue !== undefined) + defaultRewrites.set(`${columnKey[0]}\u0000${columnKey[2]}`, newValue); + } + return rewritten; + }; + + const rewritten = mapContractEntries(contract, NATIVE_TYPE_PATHS, rewriteEntry); + const extensions = contract['extensions']; + for (const pack of isRecord(extensions) ? Object.values(extensions) : []) { + const types = isRecord(pack) ? pack['types'] : undefined; + const storage = isRecord(types) ? types['storage'] : undefined; + if (Array.isArray(storage) && storage.some((entry) => isRecord(entry) && 'nativeType' in entry)) + changed = true; + } + if (changed && isRecord(extensions)) { + rewritten['extensions'] = mapRecord(extensions, (_packId, pack) => { + const types = isRecord(pack) ? pack['types'] : undefined; + if (!isRecord(pack) || !isRecord(types) || !('storage' in types)) return pack; + const { storage: _storage, ...rest } = types; + return { ...pack, types: rest }; + }); + } + const withLists = changed + ? mapContractEntries(rewritten, LIST_PATHS, currentListForm) + : rewritten; + const enums = + target === 'sqlite' && changed + ? rewriteSqliteEnums(withLists) + : { contract: withLists, integerEnums: new Set(), jsonEnums: new Map() }; + return { + contract: enums.contract, + changed, + unknownCodecs: [...unknownCodecs].sort(compareCodeUnits), + defaultRewrites, + integerEnums: enums.integerEnums, + jsonEnums: enums.jsonEnums, + columnCardinalities: columnCardinalities(withLists), + }; +} + +function withStorageHash(contract: JsonRecord, hash: string): JsonRecord { + const storage = isRecord(contract['storage']) ? contract['storage'] : {}; + return { ...contract, storage: { ...storage, storageHash: hash } }; +} + +function emittedForm(contract: JsonRecord, original: string): string { + const { _generated: generated, ...rest } = contract; + const sorted = sortKeys(rest); + const ordered = isRecord(sorted) ? orderTopLevel(sorted) : {}; + if (generated !== undefined) ordered['_generated'] = generated; + return `${JSON.stringify(ordered, null, 2)}${original.endsWith('\n') ? '\n' : ''}`; +} + +function snapshotForm(contract: JsonRecord): string { + return `${canonicalizeJson(contract)}\n`; +} + +interface Block { + readonly start: number; + end: number; + readonly label: string; + readonly parent: Block | undefined; +} + +function scanBlocks(text: string): Block[] { + const blocks: Block[] = []; + const open: Block[] = []; + let quote: string | undefined; + for (let index = 0; index < text.length; index++) { + const char = text[index]; + if (quote !== undefined) { + if (char === '\\') index++; + else if (char === quote) quote = undefined; + continue; + } + if (char === "'" || char === '"' || char === '`') { + quote = char; + continue; + } + if (char === '{') { + const key = + /(?:readonly\s+)?([\p{ID_Start}_$][\p{ID_Continue}$]*|'[^']*'|"[^"]*")\s*\??\s*:\s*$/u.exec( + text.slice(Math.max(0, index - 200), index), + ); + const block: Block = { + start: index, + end: text.length, + label: key?.[1]?.replace(/^['"]|['"]$/g, '') ?? '', + parent: open.at(-1), + }; + open.push(block); + blocks.push(block); + } else if (char === '}') { + const block = open.pop(); + if (block !== undefined) block.end = index; + } + } + return blocks; +} + +function innermostBlock(blocks: readonly Block[], position: number): Block | undefined { + let found: Block | undefined; + for (const block of blocks) { + if ( + block.start < position && + position < block.end && + (found === undefined || block.start > found.start) + ) + found = block; + } + return found; +} + +function isColumnBlock(block: Block): boolean { + return block.parent?.label === 'columns'; +} + +function isStorageTypeBlock(blocks: readonly Block[], block: Block): boolean { + const types = block.parent; + return ( + types?.label === 'types' && + blocks.some((other) => other.parent === types.parent && other.label === 'namespaces') + ); +} + +function isInColumnDefault(block: Block): boolean { + for (let ancestor = block.parent; ancestor !== undefined; ancestor = ancestor.parent) + if ( + ancestor.label === 'default' && + ancestor.parent !== undefined && + isColumnBlock(ancestor.parent) + ) + return true; + return false; +} + +function holdsNativeType(blocks: readonly Block[], block: Block): boolean { + return (isColumnBlock(block) || isStorageTypeBlock(blocks, block)) && !isInColumnDefault(block); +} + +/** The key of a storage column block, in the `entries.table` and the older `tables` layout. */ +function columnBlockKey(block: Block): string | undefined { + const table = block.parent?.parent; + const tables = table?.parent; + const namespace = tables?.label === 'table' ? tables.parent?.parent : tables?.parent; + if (!isColumnBlock(block) || table === undefined || namespace === undefined) return undefined; + if (isInColumnDefault(block)) return undefined; + return storageColumnKey(namespace.label, table.label, block.label); +} + +function manyType(many: Json): string { + return isRecord(many) && typeof many['elementNullable'] === 'boolean' + ? `{ readonly elementNullable: ${many['elementNullable']} }` + : 'false'; +} + +/** Where a member written last in `block` goes, and the text that writes it. */ +function lastMember(text: string, block: Block, member: string): { start: number; text: string } { + const lineStart = text.lastIndexOf('\n', block.end - 1) + 1; + const closingIndent = text.slice(lineStart, block.end); + if (closingIndent.trim() === '') + return { start: lineStart, text: `${closingIndent} ${member};\n` }; + const contentEnd = block.start + 1 + text.slice(block.start + 1, block.end).trimEnd().length; + return { + start: contentEnd, + text: text[contentEnd - 1] === ';' ? ` ${member};` : `; ${member}`, + }; +} + +function prettierString(value: string): string { + const singles = (value.match(/'/g) ?? []).length; + const doubles = (value.match(/"/g) ?? []).length; + const quote = singles > doubles ? '"' : "'"; + const escaped = JSON.stringify(value) + .slice(1, -1) + .replaceAll(String.fromCharCode(0x2028), '\\u2028') + .replaceAll(String.fromCharCode(0x2029), '\\u2029') + .replace( + /\\(.)|(["'])/gs, + (match: string, escapedChar: string | undefined, bare: string | undefined) => { + if (bare !== undefined) return bare === quote ? `\\${bare}` : bare; + if (escapedChar === quote) return match; + if (escapedChar === '"' || escapedChar === "'") return escapedChar; + return match; + }, + ); + return `${quote}${escaped}${quote}`; +} + +function typeLiteral(value: Json): string { + return typeof value === 'string' ? prettierString(value) : JSON.stringify(value); +} + +function genericArgumentEnd(text: string, start: number): number { + let depth = 0; + let quote: string | undefined; + for (let index = start; index < text.length; index++) { + const char = text[index]; + if (quote !== undefined) { + if (char === '\\') index++; + else if (char === quote) quote = undefined; + continue; + } + if (char === "'" || char === '"' || char === '`') quote = char; + else if (char === '{' || char === '[' || char === '(' || char === '<') depth++; + else if (char === '}' || char === ']' || char === ')') depth--; + else if (char === '>') { + if (depth === 0) return index; + depth--; + } + } + return text.length; +} + +function memberOf( + text: string, + blocks: readonly Block[], + block: Block, + name: string, +): string | undefined { + const pattern = new RegExp(`readonly ${name}: (['"])((?:\\\\.|(?!\\1).)*)\\1`, 'g'); + for (const member of text.slice(block.start, block.end).matchAll(pattern)) { + if (innermostBlock(blocks, block.start + member.index) === block) return member[2]; + } + return undefined; +} + +/** The end of the type literal that starts at `start`: the first `;`, `,` or closing bracket outside it. */ +function literalEnd(text: string, start: number): number { + let depth = 0; + let quote: string | undefined; + for (let index = start; index < text.length; index++) { + const char = text[index]; + if (quote !== undefined) { + if (char === '\\') index++; + else if (char === quote) quote = undefined; + continue; + } + if (char === "'" || char === '"' || char === '`') quote = char; + else if (char === '{' || char === '[' || char === '(' || char === '<') depth++; + else if (char === '}' || char === ']' || char === ')' || char === '>') { + if (depth === 0) return index; + depth--; + } else if ((char === ';' || char === ',') && depth === 0) return index; + } + return text.length; +} + +function bracketEnd(text: string, open: number): number { + let depth = 0; + let quote: string | undefined; + for (let index = open; index < text.length; index++) { + const char = text[index]; + if (quote !== undefined) { + if (char === '\\') index++; + else if (char === quote) quote = undefined; + continue; + } + if (char === "'" || char === '"' || char === '`') quote = char; + else if (char === '[' || char === '{' || char === '(') depth++; + else if (char === ']' || char === '}' || char === ')') { + depth--; + if (depth === 0) return index + 1; + } + } + return text.length; +} + +function statementRemoval( + text: string, + start: number, + end: number, +): { start: number; end: number; text: string } { + const after = /^;?[ \t]*/.exec(text.slice(end))?.[0].length ?? 0; + const lineStart = text.lastIndexOf('\n', start - 1) + 1; + const ownsLines = text.slice(lineStart, start).trim() === '' && text[end + after] === '\n'; + return ownsLines + ? { start: lineStart, end: end + after + 1, text: '' } + : { start, end: end + after, text: '' }; +} + +function quoteIntegers(text: string): string { + return text.replace(/(? `'${BigInt(digits)}'`); +} + +function rewriteDts( + text: string, + target: string, + extra: ReadonlyMap, + defaultRewrites: ReadonlyMap, + integerEnums: ReadonlySet, + jsonEnums: ReadonlyMap, + columnCardinalities: ReadonlyMap, + hashes: ReadonlyMap, +): string { + const table = dataTypesFor(target, extra); + const blocks = scanBlocks(text); + const edits: { start: number; end: number; text: string }[] = []; + + for (const match of text.matchAll(/readonly storage: readonly \[/g)) { + const types = innermostBlock(blocks, match.index); + if (types?.label !== 'types' || types.parent?.parent?.label !== 'extensions') continue; + const end = bracketEnd(text, match.index + match[0].length - 1); + edits.push(statementRemoval(text, match.index, end)); + } + + for (const match of text.matchAll(/readonly nativeType: (['"])(?:\\.|(?!\1).)*\1/g)) { + const block = innermostBlock(blocks, match.index); + if (block === undefined || !holdsNativeType(blocks, block)) continue; + const codecId = memberOf(text, blocks, block, 'codecId'); + const dataType = codecId === undefined ? undefined : table[codecId]; + if (dataType === undefined) continue; + edits.push({ + start: match.index, + end: match.index + match[0].length, + text: `readonly dataType: ${prettierString(dataType)}`, + }); + } + + const listMembers = new Set(); + for (const match of text.matchAll(/readonly many: (true|false|\{)/g)) { + const block = innermostBlock(blocks, match.index); + if (block === undefined) continue; + listMembers.add(block); + if (match[1] !== 'true') continue; + const key = columnBlockKey(block); + const many = key === undefined ? undefined : columnCardinalities.get(key); + if (many === undefined && block.parent?.label !== 'fields') continue; + edits.push({ + start: match.index, + end: match.index + match[0].length, + text: `readonly many: ${manyType(many ?? { elementNullable: false })}`, + }); + } + for (const block of blocks) { + const key = columnBlockKey(block); + const many = key === undefined ? undefined : columnCardinalities.get(key); + if (many === undefined || listMembers.has(block)) continue; + const member = lastMember(text, block, `readonly many: ${manyType(many)}`); + edits.push({ start: member.start, end: member.start, text: member.text }); + } + + for (const match of text.matchAll(/DefaultLiteralValue<\s*(['"])(?:\\.|(?!\1).)*\1\s*,\s*/g)) { + const argumentStart = match.index + match[0].length; + const defaultBlock = innermostBlock(blocks, match.index); + const column = defaultBlock?.parent; + const tableBlock = column?.parent?.parent; + if (column === undefined || tableBlock === undefined || column.parent?.label !== 'columns') + continue; + const value = defaultRewrites.get(`${tableBlock.label}\u0000${column.label}`); + if (value === undefined) continue; + const argumentEnd = genericArgumentEnd(text, argumentStart); + const trimmedEnd = argumentStart + text.slice(argumentStart, argumentEnd).trimEnd().length; + edits.push({ start: argumentStart, end: trimmedEnd, text: typeLiteral(value) }); + } + + for (const match of text.matchAll(/readonly values: readonly \[([^\]]*)\]/g)) { + const valueSet = innermostBlock(blocks, match.index); + const kind = valueSet?.parent; + const namespace = kind?.parent?.parent; + if ( + valueSet === undefined || + kind?.label !== 'valueSet' || + kind.parent?.label !== 'entries' || + namespace === undefined || + !integerEnums.has(enumKey(namespace.label, valueSet.label)) + ) + continue; + const values = match[1] ?? ''; + const start = match.index + match[0].length - values.length - 1; + edits.push({ start, end: start + values.length, text: quoteIntegers(values) }); + } + + for (const match of text.matchAll(/readonly value: (-?\d+)(?=\s*[;},])/g)) { + const member = innermostBlock(blocks, match.index); + const enumType = member?.parent; + const namespace = enumType?.parent?.parent; + const digits = match[1] ?? ''; + if ( + member === undefined || + member.label !== '' || + enumType?.parent?.label !== 'enum' || + namespace === undefined || + !integerEnums.has(enumKey(namespace.label, enumType.label)) + ) + continue; + const start = match.index + match[0].length - digits.length; + edits.push({ start, end: start + digits.length, text: quoteIntegers(digits) }); + } + + for (const match of text.matchAll(/readonly values: readonly \[/g)) { + const valueSet = innermostBlock(blocks, match.index); + const kind = valueSet?.parent; + const namespace = kind?.parent?.parent; + if ( + valueSet === undefined || + kind?.label !== 'valueSet' || + kind.parent?.label !== 'entries' || + namespace === undefined + ) + continue; + const values = jsonEnums.get(enumKey(namespace.label, valueSet.label))?.values; + if (values === undefined) continue; + const open = match.index + match[0].length - 1; + edits.push({ + start: open + 1, + end: bracketEnd(text, open) - 1, + text: values.map(typeLiteral).join(', '), + }); + } + + for (const match of text.matchAll(/readonly value: /g)) { + const member = innermostBlock(blocks, match.index); + const enumType = member?.parent; + const namespace = enumType?.parent?.parent; + if ( + member === undefined || + member.label !== '' || + enumType?.parent?.label !== 'enum' || + namespace === undefined + ) + continue; + const name = memberOf(text, blocks, member, 'name'); + const value = + name === undefined + ? undefined + : jsonEnums.get(enumKey(namespace.label, enumType.label))?.members.get(name); + if (value === undefined) continue; + const start = match.index + match[0].length; + const end = start + text.slice(start, literalEnd(text, start)).trimEnd().length; + edits.push({ start, end, text: typeLiteral(value) }); + } + + for (const match of text.matchAll(/(['"])([0-9a-f]{64})\1/g)) { + const hash = match[2]; + const next = hash === undefined ? undefined : hashes.get(hash); + if (next === undefined) continue; + edits.push({ + start: match.index, + end: match.index + match[0].length, + text: `${match[1]}${next}${match[1]}`, + }); + } + + let result = text; + for (const edit of edits.sort((a, b) => b.start - a.start)) + result = `${result.slice(0, edit.start)}${edit.text}${result.slice(edit.end)}`; + return result; +} + +function replaceQuotedHashes(text: string, hashes: ReadonlyMap): string { + return text.replace(/"([0-9a-f]{64})"/g, (match: string, hash: string) => { + const next = hashes.get(hash); + return next === undefined ? match : `"${next}"`; + }); +} + +interface ContractPlan { + readonly path: string; + readonly snapshot: boolean; + readonly oldHash: string; + readonly newHash: string; + readonly content: string; + readonly target: string; + readonly defaultRewrites: ReadonlyMap; + readonly integerEnums: ReadonlySet; + readonly jsonEnums: ReadonlyMap; + readonly columnCardinalities: ReadonlyMap; +} + +function readDirectory(dir: string): Map { + const files = new Map(); + if (!existsSync(dir)) return files; + for (const entry of readdirSync(dir, { withFileTypes: true })) + if (isFileEntry(dir, entry) && !entry.name.endsWith(TEMPORARY_SUFFIX)) + files.set(entry.name, readFileSync(join(dir, entry.name), 'utf8')); + return files; +} + +function sameFiles(a: ReadonlyMap, b: ReadonlyMap): boolean { + return a.size === b.size && [...a].every(([name, content]) => b.get(name) === content); +} + +function temporaryPath(path: string): string { + return join(dirname(path), `.${basename(path)}${TEMPORARY_SUFFIX}`); +} + +function writeWithModeOf(path: string, text: string, modeSource: string): void { + writeFileSync(path, text); + if (existsSync(modeSource)) chmodSync(path, statSync(modeSource).mode & 0o7777); +} + +function writeFile(path: string, text: string): void { + const target = realpathSync(path); + const temporary = temporaryPath(target); + writeWithModeOf(temporary, text, target); + renameSync(temporary, target); +} + +function writeDirectory(dir: string, files: ReadonlyMap, sourceDir: string): void { + const temporary = temporaryPath(dir); + mkdirSync(temporary); + for (const [name, text] of files) + writeWithModeOf(join(temporary, name), text, join(sourceDir, name)); + renameSync(temporary, dir); +} + +function removeDirectory(dir: string): void { + const temporary = temporaryPath(dir); + renameSync(dir, temporary); + rmSync(temporary, { recursive: true, force: true }); +} + +function count(amount: number, singular: string, plural: string): string { + return `${amount} ${amount === 1 ? singular : plural}`; +} + +function summary( + root: string, + contractsFound: number, + files: number, + directories: number, + hashes: ReadonlyMap, +): readonly string[] { + if (contractsFound === 0) return [`No SQL contract was found under ${root}; nothing changed.`]; + if (files === 0 && directories === 0) + return ['The project is already in the new format; nothing changed.']; + const renamed = count(directories, 'snapshot directory', 'snapshot directories'); + const changes = `Rewrote ${count(files, 'file', 'files')} and renamed ${renamed}.`; + if (hashes.size === 0) return [changes]; + return [ + `${changes} Storage hashes changed (old -> new):`, + ...[...hashes] + .sort(([a], [b]) => compareCodeUnits(a, b)) + .map(([oldHash, newHash]) => ` ${oldHash} -> ${newHash}`), + ]; +} + +const JSON_FILES_THAT_MUST_PARSE = new Set(['contract.json', 'migration.json']); + +function main({ root, dataTypes, errors }: Options): number { + if (errors.length > 0) { + process.stderr.write(`${errors.join('\n')}\n`); + return 1; + } + const display = (path: string): string => relative(root, path).split(sep).join('/'); + const files = listFiles(root); + const plans: ContractPlan[] = []; + const notices: string[] = []; + const stops: string[] = []; + let contractsFound = 0; + + for (const path of files.json) { + const text = readFileSync(path, 'utf8'); + const contract = parseJson(text); + if ( + contract === undefined && + (JSON_FILES_THAT_MUST_PARSE.has(basename(path)) || files.refs.includes(path)) + ) { + stops.push(`${display(path)}: not valid JSON`); + continue; + } + if ( + !isRecord(contract) || + contract['targetFamily'] !== 'sql' || + typeof contract['target'] !== 'string' + ) + continue; + const storage = contract['storage']; + if (!isRecord(storage)) continue; + contractsFound++; + const snapshot = isSnapshotContract(path); + const stored = storage['storageHash']; + const oldHash = snapshot ? basename(dirname(path)) : typeof stored === 'string' ? stored : ''; + const recomputes = computeStorageHash(contract) === oldHash; + const rewrite = rewriteContract(contract, dataTypes); + for (const codecId of rewrite.unknownCodecs) + stops.push( + `${display(path)}: unknown codec ${codecId}; name its data type with --data-type ${codecId}=`, + ); + if (!rewrite.changed) continue; + if (!recomputes) + notices.push(`${display(path)}: stored hash did not recompute; rehashed from content`); + const newHash = computeStorageHash(rewrite.contract); + const contractWithHash = withStorageHash(rewrite.contract, newHash); + plans.push({ + path, + snapshot, + oldHash, + newHash, + content: snapshot ? snapshotForm(contractWithHash) : emittedForm(contractWithHash, text), + target: contract['target'], + defaultRewrites: rewrite.defaultRewrites, + integerEnums: rewrite.integerEnums, + jsonEnums: rewrite.jsonEnums, + columnCardinalities: rewrite.columnCardinalities, + }); + } + + for (const target of [...new Set(plans.map((plan) => plan.target))].sort(compareCodeUnits)) { + for (const [codecId, dataType] of dataTypes) { + const known = DATA_TYPES[target]?.[codecId]; + if (known !== undefined) + stops.push( + `--data-type ${codecId}=${dataType}: the script already maps ${codecId} to ${known} on target ${target}`, + ); + } + } + + const hashes = new Map(); + for (const plan of [...plans].sort((a, b) => Number(b.snapshot) - Number(a.snapshot))) + if (plan.oldHash !== plan.newHash && !hashes.has(plan.oldHash)) + hashes.set(plan.oldHash, plan.newHash); + + const newDirectories = new Map>(); + const directorySources = new Map(); + const sourceDirectories = new Set(); + const removals = new Set(); + const snapshotRewrites: [string, string][] = []; + const referenceWrites = new Map(); + const contractWrites = new Map(); + for (const plan of plans) { + const dtsPath = plan.snapshot + ? join(dirname(plan.path), 'contract.d.ts') + : `${plan.path.slice(0, -'.json'.length)}.d.ts`; + const dtsHashes = plan.snapshot ? hashes : new Map([...hashes, [plan.oldHash, plan.newHash]]); + const dts = existsSync(dtsPath) + ? rewriteDts( + readFileSync(dtsPath, 'utf8'), + plan.target, + dataTypes, + plan.defaultRewrites, + plan.integerEnums, + plan.jsonEnums, + plan.columnCardinalities, + dtsHashes, + ) + : undefined; + if (!plan.snapshot) { + if (dts !== undefined) referenceWrites.set(dtsPath, dts); + contractWrites.set(plan.path, plan.content); + continue; + } + const oldDir = dirname(plan.path); + const newDir = join(dirname(oldDir), plan.newHash); + sourceDirectories.add(oldDir); + if (newDir === oldDir) { + if (dts !== undefined) snapshotRewrites.push([dtsPath, dts]); + snapshotRewrites.push([plan.path, plan.content]); + continue; + } + removals.add(oldDir); + const content = readDirectory(oldDir); + content.set('contract.json', plan.content); + if (dts !== undefined) content.set('contract.d.ts', dts); + const planned = newDirectories.get(newDir); + if (planned !== undefined && !sameFiles(planned, content)) { + stops.push(`${display(newDir)}: snapshot directory already exists with different content`); + continue; + } + newDirectories.set(newDir, content); + directorySources.set(newDir, oldDir); + } + for (const [dir, content] of newDirectories) { + if (sourceDirectories.has(dir) || !existsSync(dir)) continue; + if (sameFiles(readDirectory(dir), content)) newDirectories.delete(dir); + else stops.push(`${display(dir)}: snapshot directory already exists with different content`); + } + + for (const path of files.migrationJson) { + const text = readFileSync(path, 'utf8'); + const metadata = parseJson(text); + if (!isRecord(metadata)) continue; + const from = metadata['from']; + const to = metadata['to']; + const nextFrom = typeof from === 'string' ? (hashes.get(from) ?? from) : from; + const nextTo = typeof to === 'string' ? (hashes.get(to) ?? to) : to; + if (nextFrom === from && nextTo === to) continue; + const opsPath = join(dirname(path), 'ops.json'); + const ops = existsSync(opsPath) ? parseJson(readFileSync(opsPath, 'utf8')) : undefined; + if (existsSync(opsPath) && ops === undefined) { + stops.push(`${display(opsPath)}: not valid JSON`); + continue; + } + const oldMigrationHash = metadata['migrationHash']; + let next = replaceQuotedHashes(text, hashes); + if ( + ops !== undefined && + typeof oldMigrationHash === 'string' && + nextFrom !== undefined && + nextTo !== undefined + ) { + const migrationHash = computeMigrationHash({ ...metadata, from: nextFrom, to: nextTo }, ops); + next = next.replace(`"${oldMigrationHash}"`, `"${migrationHash}"`); + } + referenceWrites.set(path, next); + } + for (const path of files.refs) { + const text = readFileSync(path, 'utf8'); + const next = replaceQuotedHashes(text, hashes); + if (next !== text) referenceWrites.set(path, next); + } + for (const path of files.migrationTs) { + const text = readFileSync(path, 'utf8'); + const next = text.replace( + /(? hashes.get(hash) ?? hash, + ); + if (next !== text) referenceWrites.set(path, next); + } + + if (stops.length > 0) { + process.stderr.write(`${[...new Set(stops)].join('\n')}\n`); + return 1; + } + + try { + for (const path of files.leftovers) rmSync(path, { recursive: true, force: true }); + for (const [dir, content] of newDirectories) + writeDirectory(dir, content, directorySources.get(dir) ?? dir); + for (const [path, text] of snapshotRewrites) writeFile(path, text); + for (const [path, text] of referenceWrites) writeFile(path, text); + for (const [path, text] of contractWrites) writeFile(path, text); + for (const dir of removals) removeDirectory(dir); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + process.stderr.write( + `${message}; the upgrade stopped partway, run the script again to finish it\n`, + ); + return 1; + } + const rewrittenFiles = snapshotRewrites.length + referenceWrites.size + contractWrites.size; + const lines = [ + ...notices, + ...summary(root, contractsFound, rewrittenFiles, removals.size, hashes), + ]; + process.stdout.write(`${lines.join('\n')}\n`); + return 0; +} + +process.exitCode = main(parseOptions(process.argv.slice(2))); diff --git a/upgrade-instructions/pending/data-type-in-contract/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/data-type-in-contract/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/extension/instructions.md diff --git a/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/extension/scripts/data-type-in-contract.ts b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/extension/scripts/data-type-in-contract.ts new file mode 100644 index 000000000000..1eb58fe4b8d4 --- /dev/null +++ b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-type-in-contract/extension/scripts/data-type-in-contract.ts @@ -0,0 +1,1492 @@ +#!/usr/bin/env node +/** + * Rewrites every SQL contract in a project from `nativeType` to `dataType`, and a list stored as + * `many: true` to `many: { elementNullable: false }`, then renames the snapshot directories and + * rewrites every migration, ref, `migration.ts` and `contract.d.ts` that names an old storage hash. + * + * Usage: node data-type-in-contract.ts [project-root] [--data-type =]... + * + * `--data-type` names the data type of a codec the script's table does not know for a contract's + * target, such as an extension's own codec. It cannot change the data type of a codec the table + * knows for that target. + * + * The project root defaults to the working directory. The script reads and writes files only. It + * needs no database, network or configured stack, and a project already in the new format is left + * unchanged. When it stops (an unknown codec, or a snapshot directory that already exists with + * different content) it changes no file, prints one line per case and exits 1. When it finishes it + * prints how many files and snapshot directories it changed and each storage hash it replaced. + * + * The storage hash and migration hash rules are copied from `@internal/contract` and + * `@internal/migration-tools` because a project's strict `node_modules` does not expose them. + */ +import { createHash } from 'node:crypto'; +import { + chmodSync, + type Dirent, + existsSync, + mkdirSync, + readdirSync, + readFileSync, + realpathSync, + renameSync, + rmSync, + statSync, + writeFileSync, +} from 'node:fs'; +import { basename, dirname, join, relative, resolve, sep } from 'node:path'; + +type Json = null | boolean | number | string | Json[] | JsonRecord; +interface JsonRecord { + [key: string]: Json; +} + +const DATA_TYPES: Readonly>>> = { + postgres: { + 'pg/text@1': 'pg/text', + 'pg/text-array@1': 'pg/text-array', + 'pg/enum@1': 'pg/enum', + 'pg/char@1': 'pg/char', + 'pg/varchar@1': 'pg/varchar', + 'pg/int@1': 'pg/int4', + 'pg/int2@1': 'pg/int2', + 'pg/int4@1': 'pg/int4', + 'pg/int8@1': 'pg/int8', + 'pg/int8number@1': 'pg/int8', + 'pg/float@1': 'pg/float8', + 'pg/float4@1': 'pg/float4', + 'pg/float8@1': 'pg/float8', + 'pg/numeric@1': 'pg/numeric', + 'pg/unboundedint@1': 'pg/numeric', + 'pg/bool@1': 'pg/bool', + 'pg/bit@1': 'pg/bit', + 'pg/varbit@1': 'pg/varbit', + 'pg/bytea@1': 'pg/bytea', + 'pg/uuid@1': 'pg/uuid', + 'pg/inet@1': 'pg/inet', + 'pg/tsquery@1': 'pg/tsquery', + 'pg/interval@1': 'pg/interval', + 'pg/json@1': 'pg/json', + 'pg/jsonb@1': 'pg/jsonb', + 'pg/timetz@1': 'pg/timetz', + 'pg/date-temporal@1': 'pg/date', + 'pg/timestamp-temporal@1': 'pg/timestamp', + 'pg/timestamptz-temporal@1': 'pg/timestamptz', + 'pg/time-temporal@1': 'pg/time', + 'pg/date-string@1': 'pg/date', + 'pg/timestamp-string@1': 'pg/timestamp', + 'pg/timestamptz-string@1': 'pg/timestamptz', + 'pg/time-string@1': 'pg/time', + 'pg/timestamptz-date@1': 'pg/timestamptz', + 'pg/timestamptz@1': 'pg/timestamptz', + 'pg/timestamp@1': 'pg/timestamp', + 'pg/time@1': 'pg/time', + 'pg/date@1': 'pg/date', + 'sql/char@1': 'pg/char', + 'sql/varchar@1': 'pg/varchar', + 'sql/int@1': 'pg/int4', + 'sql/float@1': 'pg/float8', + 'sql/text@1': 'pg/text', + 'sql/timestamp@1': 'pg/timestamptz', + 'pg/vector@1': 'pgvector/vector', + 'pg/geometry@1': 'postgis/geometry', + 'arktype/json@1': 'pg/jsonb', + }, + sqlite: { + 'sqlite/text@1': 'sqlite/text', + 'sqlite/json@1': 'sqlite/text', + 'sqlite/datetime@1': 'sqlite/text', + 'sqlite/integer@1': 'sqlite/integer', + 'sqlite/bigint@1': 'sqlite/integer', + 'sqlite/bigintnumber@1': 'sqlite/integer', + 'sql/int@1': 'sqlite/integer', + 'sqlite/real@1': 'sqlite/real', + 'sql/float@1': 'sqlite/real', + 'sqlite/blob@1': 'sqlite/blob', + 'sql/char@1': 'sqlite/character', + 'sql/varchar@1': 'sqlite/character-varying', + }, +}; + +const SQLITE_INTEGER_CODECS = new Set([ + 'sqlite/integer@1', + 'sql/int@1', + 'sqlite/bigint@1', + 'sqlite/bigintnumber@1', +]); +const SQLITE_JSON_CODEC = 'sqlite/json@1'; +const SKIPPED_DIRECTORIES = new Set(['node_modules', '.git', 'dist', 'build']); +const HASH = /^[0-9a-f]{64}$/; +const TEMPORARY_SUFFIX = '.data-type-in-contract-tmp'; + +function isRecord(value: unknown): value is JsonRecord { + if (typeof value !== 'object' || value === null || Array.isArray(value)) return false; + const prototype: unknown = Object.getPrototypeOf(value); + return prototype === Object.prototype || prototype === null; +} + +function parseJson(text: string): Json | undefined { + try { + const value: Json = JSON.parse(text); + return value; + } catch { + return undefined; + } +} + +function sha256(text: string): string { + return createHash('sha256').update(text).digest('hex'); +} + +function compareCodeUnits(a: string, b: string): number { + return a < b ? -1 : a > b ? 1 : 0; +} + +function sortKeys(value: Json): Json { + if (Array.isArray(value)) return value.map(sortKeys); + if (!isRecord(value)) return value; + const sorted: JsonRecord = {}; + for (const key of Object.keys(value).sort(compareCodeUnits)) { + const child = value[key]; + if (child !== undefined) sorted[key] = sortKeys(child); + } + return sorted; +} + +function canonicalizeJson(value: Json): string { + return JSON.stringify(sortKeys(value)); +} + +type PathSegment = string | readonly string[]; + +function matchesPath(path: readonly string[], pattern: readonly PathSegment[]): boolean { + if (path.length !== pattern.length) return false; + return pattern.every((segment, index) => { + const value = path[index]; + if (value === undefined) return false; + if (segment === '*') return true; + return typeof segment === 'string' ? value === segment : segment.includes(value); + }); +} + +const SQL_PRESERVED_EMPTY: readonly (readonly PathSegment[])[] = [ + ['storage', 'namespaces', '*', 'entries', 'table'], + ['storage', 'namespaces', '*', 'entries', 'table', '*'], + ['storage', 'namespaces', '*', 'entries', 'table', '*', ['uniques', 'indexes', 'foreignKeys']], + ['storage', 'namespaces', '*', 'entries', 'table', '*', 'indexes', 'unique'], + ['storage', 'namespaces', '*', 'entries', 'table', '*', 'columns', '*', 'default', 'value'], +]; +const COLUMN_DEFAULT_VALUE: readonly PathSegment[] = [ + 'storage', + 'namespaces', + '*', + 'entries', + 'table', + '*', + 'columns', + '*', + 'default', + 'value', +]; +const COLUMN_PATHS: readonly (readonly PathSegment[])[] = [ + ['storage', 'namespaces', '*', 'entries', 'table', '*', 'columns', '*'], + ['storage', 'namespaces', '*', 'tables', '*', 'columns', '*'], +]; +const NATIVE_TYPE_PATHS: readonly (readonly PathSegment[])[] = [ + ...COLUMN_PATHS, + ['storage', 'types', '*'], +]; +const LIST_PATHS: readonly (readonly PathSegment[])[] = [ + ...COLUMN_PATHS, + ['domain', 'namespaces', '*', ['models', 'valueObjects'], '*', 'fields', '*'], +]; +const FRAMEWORK_PRESERVED_EMPTY: readonly (readonly PathSegment[])[] = [ + ['domain', 'namespaces'], + ['domain', 'namespaces', '*'], + ['domain', 'namespaces', '*', 'models'], + ['domain', 'namespaces', '*', 'models', '*', 'relations'], + ['domain', 'namespaces', '*', 'models', '*', 'storage'], + ['storage', 'namespaces'], + ['storage', 'namespaces', '*', 'entries'], + ['roots'], + ['extensions'], + ['extensions', '*'], + ['capabilities'], + ['meta'], + ['execution', 'mutations', 'defaults'], +]; +const TOP_LEVEL_ORDER = [ + 'schemaVersion', + 'canonicalVersion', + 'targetFamily', + 'target', + 'profileHash', + 'roots', + 'domain', + 'storage', + 'execution', + 'capabilities', + 'extensions', + 'defaultControlPolicy', + 'meta', +]; + +function isDefaultValue(value: Json): boolean { + if (value === false) return true; + if (Array.isArray(value)) return value.length === 0; + return isRecord(value) && Object.keys(value).length === 0; +} + +function isPreservedEmpty(path: readonly string[], key: string): boolean { + if (key === 'nullable') return true; + if (key === 'elementNullable' && path.at(-2) === 'many') return true; + if (FRAMEWORK_PRESERVED_EMPTY.some((pattern) => matchesPath(path, pattern))) return true; + if ( + path.length >= COLUMN_DEFAULT_VALUE.length && + matchesPath(path.slice(0, COLUMN_DEFAULT_VALUE.length), COLUMN_DEFAULT_VALUE) + ) + return true; + return SQL_PRESERVED_EMPTY.some((pattern) => matchesPath(path, pattern)); +} + +function omitDefaults(value: Json, path: readonly string[]): Json { + if (Array.isArray(value)) return value.map((item) => omitDefaults(item, path)); + if (!isRecord(value)) return value; + const result: JsonRecord = {}; + for (const [key, child] of Object.entries(value)) { + const childPath = [...path, key]; + if (key === '_generated') continue; + if (key === 'generated' && child === false) continue; + if ((key === 'onDelete' || key === 'onUpdate') && child === 'noAction') continue; + if (isDefaultValue(child) && !isPreservedEmpty(childPath, key)) continue; + result[key] = omitDefaults(child, childPath); + } + return result; +} + +function compareByName(a: Json, b: Json): number { + const nameA = isRecord(a) && typeof a['name'] === 'string' ? a['name'] : ''; + const nameB = isRecord(b) && typeof b['name'] === 'string' ? b['name'] : ''; + return compareCodeUnits(nameA, nameB); +} + +function sortTableArrays(storage: Json): Json { + if (!isRecord(storage)) return storage; + const namespaces = storage['namespaces']; + if (!isRecord(namespaces)) return storage; + const sortedNamespaces: JsonRecord = {}; + for (const [namespaceId, namespace] of Object.entries(namespaces)) { + const entries = isRecord(namespace) ? namespace['entries'] : undefined; + const tables = isRecord(entries) ? entries['table'] : undefined; + if (!isRecord(namespace) || !isRecord(entries) || !isRecord(tables)) { + sortedNamespaces[namespaceId] = namespace; + continue; + } + const sortedTables: JsonRecord = {}; + for (const [tableName, table] of Object.entries(tables)) { + if (!isRecord(table)) { + sortedTables[tableName] = table; + continue; + } + const sortedTable: JsonRecord = { ...table }; + for (const key of ['checks', 'indexes', 'uniques']) { + const list = table[key]; + if (Array.isArray(list)) sortedTable[key] = [...list].sort(compareByName); + } + sortedTables[tableName] = sortedTable; + } + sortedNamespaces[namespaceId] = { ...namespace, entries: { ...entries, table: sortedTables } }; + } + return { ...storage, namespaces: sortedNamespaces }; +} + +function orderTopLevel(value: JsonRecord): JsonRecord { + const ordered: JsonRecord = {}; + const remaining = new Set(Object.keys(value)); + for (const key of TOP_LEVEL_ORDER) { + const child = value[key]; + if (child !== undefined) { + ordered[key] = child; + remaining.delete(key); + } + } + for (const key of [...remaining].sort(compareCodeUnits)) { + const child = value[key]; + if (child !== undefined) ordered[key] = child; + } + return ordered; +} + +function omitNamespaceKinds(storage: JsonRecord): JsonRecord { + const namespaces = storage['namespaces']; + if (!isRecord(namespaces)) return storage; + const stripped: JsonRecord = {}; + for (const [namespaceId, namespace] of Object.entries(namespaces)) { + if (isRecord(namespace)) { + const { kind: _kind, ...rest } = namespace; + stripped[namespaceId] = rest; + } else { + stripped[namespaceId] = namespace; + } + } + return { ...storage, namespaces: stripped }; +} + +function computeStorageHash(contract: JsonRecord): string { + const storage = isRecord(contract['storage']) ? contract['storage'] : {}; + const { storageHash: _published, ...withoutHash } = storage; + const hashed: JsonRecord = { + schemaVersion: '1', + targetFamily: typeof contract['targetFamily'] === 'string' ? contract['targetFamily'] : '', + target: typeof contract['target'] === 'string' ? contract['target'] : '', + profileHash: '', + roots: {}, + domain: { namespaces: {} }, + storage: omitNamespaceKinds(withoutHash), + extensions: {}, + capabilities: {}, + meta: {}, + }; + const withoutDefaults = omitDefaults(hashed, []); + if (!isRecord(withoutDefaults)) return ''; + const withSortedStorage = { + ...withoutDefaults, + storage: sortTableArrays(withoutDefaults['storage'] ?? {}), + }; + const sorted = sortKeys(withSortedStorage); + return isRecord(sorted) ? sha256(JSON.stringify(orderTopLevel(sorted), null, 2)) : ''; +} + +function computeMigrationHash(metadata: JsonRecord, ops: Json): string { + const { migrationHash: _migrationHash, ...withoutHash } = metadata; + const parts = [canonicalizeJson(withoutHash), canonicalizeJson(ops)].map(sha256); + return sha256(canonicalizeJson(parts)); +} + +interface ProjectFiles { + readonly json: readonly string[]; + readonly migrationJson: readonly string[]; + readonly refs: readonly string[]; + readonly migrationTs: readonly string[]; + readonly leftovers: readonly string[]; +} + +function isDirectory(path: string): boolean { + try { + return statSync(path).isDirectory(); + } catch { + return false; + } +} + +function isFile(path: string): boolean { + try { + return statSync(path).isFile(); + } catch { + return false; + } +} + +/** A file, or a link to one: the script reads and writes through links to files. */ +function isFileEntry(dir: string, entry: Dirent): boolean { + return entry.isFile() || (entry.isSymbolicLink() && isFile(join(dir, entry.name))); +} + +/** A file the script reads, by the path it was reached through: its own path rather than a link's. */ +interface FoundFile { + readonly path: string; + readonly linked: boolean; + readonly inMigrationPackage: boolean; +} + +function listFiles(root: string): ProjectFiles { + const leftovers: string[] = []; + const visited = new Set(); + const found = new Map(); + const visit = (dir: string): void => { + const realDir = realpathSync(dir); + if (visited.has(realDir)) return; + visited.add(realDir); + const entries = readdirSync(dir, { withFileTypes: true }).sort((a, b) => + compareCodeUnits(a.name, b.name), + ); + const inMigrationPackage = entries.some( + (entry) => entry.name === 'migration.json' && isFileEntry(dir, entry), + ); + for (const entry of entries) { + const path = join(dir, entry.name); + if (entry.name.endsWith(TEMPORARY_SUFFIX)) { + leftovers.push(path); + continue; + } + if (entry.isDirectory() || (entry.isSymbolicLink() && isDirectory(path))) { + if (!SKIPPED_DIRECTORIES.has(entry.name)) visit(path); + continue; + } + if (!isFileEntry(dir, entry)) continue; + const realFile = realpathSync(path); + const linked = entry.isSymbolicLink(); + const known = found.get(realFile); + if (known === undefined || (known.linked && !linked)) + found.set(realFile, { path, linked, inMigrationPackage }); + } + }; + visit(root); + const files = [...found.values()]; + const named = (test: (file: FoundFile, name: string) => boolean): string[] => + files.filter((file) => test(file, basename(file.path))).map((file) => file.path); + return { + json: named((_file, name) => name.endsWith('.json')), + migrationJson: named((_file, name) => name === 'migration.json'), + refs: named((file, name) => name.endsWith('.json') && basename(dirname(file.path)) === 'refs'), + migrationTs: named((file, name) => name === 'migration.ts' && file.inMigrationPackage), + leftovers, + }; +} + +function isSnapshotContract(path: string): boolean { + const snapshotDir = dirname(path); + return ( + basename(path) === 'contract.json' && + HASH.test(basename(snapshotDir)) && + basename(dirname(snapshotDir)) === 'snapshots' + ); +} + +interface Rewrite { + readonly contract: JsonRecord; + readonly changed: boolean; + readonly unknownCodecs: readonly string[]; + readonly defaultRewrites: ReadonlyMap; + readonly integerEnums: ReadonlySet; + readonly jsonEnums: ReadonlyMap; + readonly columnCardinalities: ReadonlyMap; +} + +/** The rewritten values of an enum typed by `sqlite/json@1`: its value set and its members by name. */ +interface JsonEnumValues { + values: readonly Json[] | undefined; + readonly members: Map; +} + +function rewriteDefault(target: string, codecId: string, value: JsonRecord): JsonRecord { + const defaultValue = value['default']; + if (target !== 'sqlite' || !isRecord(defaultValue) || defaultValue['kind'] !== 'literal') + return value; + const literal = defaultValue['value']; + if (literal === undefined) return value; + if (codecId === SQLITE_JSON_CODEC) + return { ...value, default: { ...defaultValue, value: canonicalizeJson(literal) } }; + if ( + SQLITE_INTEGER_CODECS.has(codecId) && + typeof literal === 'number' && + Number.isInteger(literal) + ) + return { ...value, default: { ...defaultValue, value: BigInt(literal).toString() } }; + return value; +} + +function digitText(value: Json): Json { + return typeof value === 'number' && Number.isInteger(value) ? BigInt(value).toString() : value; +} + +function mapRecord(value: Json, map: (key: string, child: Json) => Json): Json { + if (!isRecord(value)) return value; + const result: JsonRecord = {}; + for (const [key, child] of Object.entries(value)) result[key] = map(key, child); + return result; +} + +function mapEntries( + value: Json, + path: readonly string[], + patterns: readonly (readonly PathSegment[])[], + rewrite: (entry: JsonRecord, path: readonly string[]) => JsonRecord, +): Json { + if (!isRecord(value)) return value; + if (patterns.some((pattern) => matchesPath(path, pattern))) return rewrite(value, path); + const leadsToEntry = patterns.some( + (pattern) => path.length < pattern.length && matchesPath(path, pattern.slice(0, path.length)), + ); + return leadsToEntry + ? mapRecord(value, (key, child) => mapEntries(child, [...path, key], patterns, rewrite)) + : value; +} + +function mapContractEntries( + contract: JsonRecord, + patterns: readonly (readonly PathSegment[])[], + rewrite: (entry: JsonRecord, path: readonly string[]) => JsonRecord, +): JsonRecord { + const result: JsonRecord = {}; + for (const [key, child] of Object.entries(contract)) + result[key] = mapEntries(child, [key], patterns, rewrite); + return result; +} + +/** Release 8.0.0-rc.14 stored a list column or field as `many: true`; the current form is `many: { elementNullable: false }`. */ +function currentListForm(entry: JsonRecord): JsonRecord { + return entry['many'] === true ? { ...entry, many: { elementNullable: false } } : entry; +} + +function storageColumnKey(namespaceId: string, table: string, column: string): string { + return `${namespaceId}\u0000${table}\u0000${column}`; +} + +/** The `many` of every storage column, `false` for a column that is not a list. */ +function columnCardinalities(contract: JsonRecord): ReadonlyMap { + const cardinalities = new Map(); + const storage = contract['storage']; + const namespaces = isRecord(storage) ? storage['namespaces'] : undefined; + for (const [namespaceId, namespace] of isRecord(namespaces) ? Object.entries(namespaces) : []) { + if (!isRecord(namespace)) continue; + const entries = namespace['entries']; + const tables = isRecord(entries) ? entries['table'] : namespace['tables']; + for (const [tableName, table] of isRecord(tables) ? Object.entries(tables) : []) { + const columns = isRecord(table) ? table['columns'] : undefined; + for (const [columnName, column] of isRecord(columns) ? Object.entries(columns) : []) + cardinalities.set( + storageColumnKey(namespaceId, tableName, columnName), + isRecord(column) ? (column['many'] ?? false) : false, + ); + } + } + return cardinalities; +} + +function enumKey(namespaceId: string, name: string): string { + return `${namespaceId}\u0000${name}`; +} + +/** + * On SQLite the integer codecs store digit text and `sqlite/json@1` stores the JSON text of a + * document, so the members of an enum typed by one of them, in the domain and in the storage value + * set its columns name, are rewritten to that text too. + */ +function rewriteSqliteEnums(contract: JsonRecord): { + readonly contract: JsonRecord; + readonly integerEnums: ReadonlySet; + readonly jsonEnums: ReadonlyMap; +} { + const integerEnums = new Set(); + const jsonEnums = new Map(); + const jsonEnum = (key: string): JsonEnumValues => { + const existing = jsonEnums.get(key); + if (existing !== undefined) return existing; + const created: JsonEnumValues = { values: undefined, members: new Map() }; + jsonEnums.set(key, created); + return created; + }; + const domainCodecs = new Map(); + const domain = mapRecord(contract['domain'] ?? null, (key, namespaces) => + key !== 'namespaces' + ? namespaces + : mapRecord(namespaces, (namespaceId, namespace) => + mapRecord(namespace, (kind, enums) => + kind !== 'enum' + ? enums + : mapRecord(enums, (name, enumType) => { + const codecId = isRecord(enumType) ? enumType['codecId'] : undefined; + if (typeof codecId === 'string') + domainCodecs.set(enumKey(namespaceId, name), codecId); + const members = isRecord(enumType) ? enumType['members'] : undefined; + if (!isRecord(enumType) || typeof codecId !== 'string' || !Array.isArray(members)) + return enumType; + const key = enumKey(namespaceId, name); + if (SQLITE_INTEGER_CODECS.has(codecId)) { + integerEnums.add(key); + return { + ...enumType, + members: members.map((member) => + isRecord(member) && member['value'] !== undefined + ? { ...member, value: digitText(member['value']) } + : member, + ), + }; + } + if (codecId !== SQLITE_JSON_CODEC) return enumType; + const rewritten = jsonEnum(key); + return { + ...enumType, + members: members.map((member) => { + const value = isRecord(member) ? member['value'] : undefined; + if (!isRecord(member) || value === undefined) return member; + const text = canonicalizeJson(value); + if (typeof member['name'] === 'string') + rewritten.members.set(member['name'], text); + return { ...member, value: text }; + }), + }; + }), + ), + ), + ); + + const columnCodecs = new Map(); + const storage = contract['storage']; + const namespaces = isRecord(storage) ? storage['namespaces'] : undefined; + for (const namespace of isRecord(namespaces) ? Object.values(namespaces) : []) { + const entries = isRecord(namespace) ? namespace['entries'] : undefined; + const tables = isRecord(entries) ? entries['table'] : undefined; + for (const table of isRecord(tables) ? Object.values(tables) : []) { + const columns = isRecord(table) ? table['columns'] : undefined; + for (const column of isRecord(columns) ? Object.values(columns) : []) { + const valueSet = isRecord(column) ? column['valueSet'] : undefined; + const codecId = isRecord(column) ? column['codecId'] : undefined; + if ( + isRecord(valueSet) && + typeof valueSet['namespaceId'] === 'string' && + typeof valueSet['entityName'] === 'string' && + typeof codecId === 'string' + ) + columnCodecs.set(enumKey(valueSet['namespaceId'], valueSet['entityName']), codecId); + } + } + } + + const nextStorage = mapRecord(storage ?? null, (key, storageNamespaces) => + key !== 'namespaces' + ? storageNamespaces + : mapRecord(storageNamespaces, (namespaceId, namespace) => + mapRecord(namespace, (namespaceKey, entries) => + namespaceKey !== 'entries' + ? entries + : mapRecord(entries, (entryKind, valueSets) => + entryKind !== 'valueSet' + ? valueSets + : mapRecord(valueSets, (name, valueSet) => { + const key = enumKey(namespaceId, name); + const codecId = columnCodecs.get(key) ?? domainCodecs.get(key); + const values = isRecord(valueSet) ? valueSet['values'] : undefined; + if (codecId === undefined || !isRecord(valueSet) || !Array.isArray(values)) + return valueSet; + if (SQLITE_INTEGER_CODECS.has(codecId)) { + integerEnums.add(key); + return { ...valueSet, values: values.map(digitText) }; + } + if (codecId !== SQLITE_JSON_CODEC) return valueSet; + const texts = values.map(canonicalizeJson); + jsonEnum(key).values = texts; + return { ...valueSet, values: texts }; + }), + ), + ), + ), + ); + + return { + contract: { + ...contract, + ...(contract['domain'] === undefined ? {} : { domain }), + ...(storage === undefined ? {} : { storage: nextStorage }), + }, + integerEnums, + jsonEnums, + }; +} + +function dataTypesFor( + target: string, + extra: ReadonlyMap, +): Readonly> { + return { ...Object.fromEntries(extra), ...DATA_TYPES[target] }; +} + +const CODEC_ID = /^[^\s=]+$/; +const DATA_TYPE_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/; + +interface Options { + readonly root: string; + readonly dataTypes: ReadonlyMap; + readonly errors: readonly string[]; +} + +function parseOptions(args: readonly string[]): Options { + const dataTypes = new Map(); + const errors: string[] = []; + const positional: string[] = []; + for (let index = 0; index < args.length; index++) { + const arg = args[index] ?? ''; + if (arg !== '--data-type' && !arg.startsWith('--data-type=')) { + if (arg.startsWith('--')) errors.push(`${arg}: unknown option`); + else positional.push(arg); + continue; + } + const value = arg === '--data-type' ? (args[++index] ?? '') : arg.slice('--data-type='.length); + const separator = value.indexOf('='); + const codecId = value.slice(0, separator); + const dataType = value.slice(separator + 1); + if (separator === -1 || !CODEC_ID.test(codecId) || !DATA_TYPE_ID.test(dataType)) { + errors.push( + `--data-type ${value}: expected =, for example acme/shape@1=acme/shape`, + ); + continue; + } + dataTypes.set(codecId, dataType); + } + return { root: resolve(positional[0] ?? process.cwd()), dataTypes, errors }; +} + +function rewriteContract(contract: JsonRecord, extra: ReadonlyMap): Rewrite { + const target = typeof contract['target'] === 'string' ? contract['target'] : ''; + const table = dataTypesFor(target, extra); + const unknownCodecs = new Set(); + const defaultRewrites = new Map(); + let changed = false; + + const rewriteEntry = (value: JsonRecord, path: readonly string[]): JsonRecord => { + const codecId = value['codecId']; + if (typeof codecId !== 'string' || typeof value['nativeType'] !== 'string') return value; + const dataType = table[codecId]; + if (dataType === undefined) { + unknownCodecs.add(codecId); + return value; + } + changed = true; + const { nativeType: _nativeType, ...rest } = value; + const rewritten = rewriteDefault(target, codecId, { ...rest, dataType }); + const before = value['default']; + const after = rewritten['default']; + if (isRecord(before) && isRecord(after) && before['value'] !== after['value']) { + const columnKey = path.slice(-3); + const newValue = after['value']; + if (columnKey[1] === 'columns' && newValue !== undefined) + defaultRewrites.set(`${columnKey[0]}\u0000${columnKey[2]}`, newValue); + } + return rewritten; + }; + + const rewritten = mapContractEntries(contract, NATIVE_TYPE_PATHS, rewriteEntry); + const extensions = contract['extensions']; + for (const pack of isRecord(extensions) ? Object.values(extensions) : []) { + const types = isRecord(pack) ? pack['types'] : undefined; + const storage = isRecord(types) ? types['storage'] : undefined; + if (Array.isArray(storage) && storage.some((entry) => isRecord(entry) && 'nativeType' in entry)) + changed = true; + } + if (changed && isRecord(extensions)) { + rewritten['extensions'] = mapRecord(extensions, (_packId, pack) => { + const types = isRecord(pack) ? pack['types'] : undefined; + if (!isRecord(pack) || !isRecord(types) || !('storage' in types)) return pack; + const { storage: _storage, ...rest } = types; + return { ...pack, types: rest }; + }); + } + const withLists = changed + ? mapContractEntries(rewritten, LIST_PATHS, currentListForm) + : rewritten; + const enums = + target === 'sqlite' && changed + ? rewriteSqliteEnums(withLists) + : { contract: withLists, integerEnums: new Set(), jsonEnums: new Map() }; + return { + contract: enums.contract, + changed, + unknownCodecs: [...unknownCodecs].sort(compareCodeUnits), + defaultRewrites, + integerEnums: enums.integerEnums, + jsonEnums: enums.jsonEnums, + columnCardinalities: columnCardinalities(withLists), + }; +} + +function withStorageHash(contract: JsonRecord, hash: string): JsonRecord { + const storage = isRecord(contract['storage']) ? contract['storage'] : {}; + return { ...contract, storage: { ...storage, storageHash: hash } }; +} + +function emittedForm(contract: JsonRecord, original: string): string { + const { _generated: generated, ...rest } = contract; + const sorted = sortKeys(rest); + const ordered = isRecord(sorted) ? orderTopLevel(sorted) : {}; + if (generated !== undefined) ordered['_generated'] = generated; + return `${JSON.stringify(ordered, null, 2)}${original.endsWith('\n') ? '\n' : ''}`; +} + +function snapshotForm(contract: JsonRecord): string { + return `${canonicalizeJson(contract)}\n`; +} + +interface Block { + readonly start: number; + end: number; + readonly label: string; + readonly parent: Block | undefined; +} + +function scanBlocks(text: string): Block[] { + const blocks: Block[] = []; + const open: Block[] = []; + let quote: string | undefined; + for (let index = 0; index < text.length; index++) { + const char = text[index]; + if (quote !== undefined) { + if (char === '\\') index++; + else if (char === quote) quote = undefined; + continue; + } + if (char === "'" || char === '"' || char === '`') { + quote = char; + continue; + } + if (char === '{') { + const key = + /(?:readonly\s+)?([\p{ID_Start}_$][\p{ID_Continue}$]*|'[^']*'|"[^"]*")\s*\??\s*:\s*$/u.exec( + text.slice(Math.max(0, index - 200), index), + ); + const block: Block = { + start: index, + end: text.length, + label: key?.[1]?.replace(/^['"]|['"]$/g, '') ?? '', + parent: open.at(-1), + }; + open.push(block); + blocks.push(block); + } else if (char === '}') { + const block = open.pop(); + if (block !== undefined) block.end = index; + } + } + return blocks; +} + +function innermostBlock(blocks: readonly Block[], position: number): Block | undefined { + let found: Block | undefined; + for (const block of blocks) { + if ( + block.start < position && + position < block.end && + (found === undefined || block.start > found.start) + ) + found = block; + } + return found; +} + +function isColumnBlock(block: Block): boolean { + return block.parent?.label === 'columns'; +} + +function isStorageTypeBlock(blocks: readonly Block[], block: Block): boolean { + const types = block.parent; + return ( + types?.label === 'types' && + blocks.some((other) => other.parent === types.parent && other.label === 'namespaces') + ); +} + +function isInColumnDefault(block: Block): boolean { + for (let ancestor = block.parent; ancestor !== undefined; ancestor = ancestor.parent) + if ( + ancestor.label === 'default' && + ancestor.parent !== undefined && + isColumnBlock(ancestor.parent) + ) + return true; + return false; +} + +function holdsNativeType(blocks: readonly Block[], block: Block): boolean { + return (isColumnBlock(block) || isStorageTypeBlock(blocks, block)) && !isInColumnDefault(block); +} + +/** The key of a storage column block, in the `entries.table` and the older `tables` layout. */ +function columnBlockKey(block: Block): string | undefined { + const table = block.parent?.parent; + const tables = table?.parent; + const namespace = tables?.label === 'table' ? tables.parent?.parent : tables?.parent; + if (!isColumnBlock(block) || table === undefined || namespace === undefined) return undefined; + if (isInColumnDefault(block)) return undefined; + return storageColumnKey(namespace.label, table.label, block.label); +} + +function manyType(many: Json): string { + return isRecord(many) && typeof many['elementNullable'] === 'boolean' + ? `{ readonly elementNullable: ${many['elementNullable']} }` + : 'false'; +} + +/** Where a member written last in `block` goes, and the text that writes it. */ +function lastMember(text: string, block: Block, member: string): { start: number; text: string } { + const lineStart = text.lastIndexOf('\n', block.end - 1) + 1; + const closingIndent = text.slice(lineStart, block.end); + if (closingIndent.trim() === '') + return { start: lineStart, text: `${closingIndent} ${member};\n` }; + const contentEnd = block.start + 1 + text.slice(block.start + 1, block.end).trimEnd().length; + return { + start: contentEnd, + text: text[contentEnd - 1] === ';' ? ` ${member};` : `; ${member}`, + }; +} + +function prettierString(value: string): string { + const singles = (value.match(/'/g) ?? []).length; + const doubles = (value.match(/"/g) ?? []).length; + const quote = singles > doubles ? '"' : "'"; + const escaped = JSON.stringify(value) + .slice(1, -1) + .replaceAll(String.fromCharCode(0x2028), '\\u2028') + .replaceAll(String.fromCharCode(0x2029), '\\u2029') + .replace( + /\\(.)|(["'])/gs, + (match: string, escapedChar: string | undefined, bare: string | undefined) => { + if (bare !== undefined) return bare === quote ? `\\${bare}` : bare; + if (escapedChar === quote) return match; + if (escapedChar === '"' || escapedChar === "'") return escapedChar; + return match; + }, + ); + return `${quote}${escaped}${quote}`; +} + +function typeLiteral(value: Json): string { + return typeof value === 'string' ? prettierString(value) : JSON.stringify(value); +} + +function genericArgumentEnd(text: string, start: number): number { + let depth = 0; + let quote: string | undefined; + for (let index = start; index < text.length; index++) { + const char = text[index]; + if (quote !== undefined) { + if (char === '\\') index++; + else if (char === quote) quote = undefined; + continue; + } + if (char === "'" || char === '"' || char === '`') quote = char; + else if (char === '{' || char === '[' || char === '(' || char === '<') depth++; + else if (char === '}' || char === ']' || char === ')') depth--; + else if (char === '>') { + if (depth === 0) return index; + depth--; + } + } + return text.length; +} + +function memberOf( + text: string, + blocks: readonly Block[], + block: Block, + name: string, +): string | undefined { + const pattern = new RegExp(`readonly ${name}: (['"])((?:\\\\.|(?!\\1).)*)\\1`, 'g'); + for (const member of text.slice(block.start, block.end).matchAll(pattern)) { + if (innermostBlock(blocks, block.start + member.index) === block) return member[2]; + } + return undefined; +} + +/** The end of the type literal that starts at `start`: the first `;`, `,` or closing bracket outside it. */ +function literalEnd(text: string, start: number): number { + let depth = 0; + let quote: string | undefined; + for (let index = start; index < text.length; index++) { + const char = text[index]; + if (quote !== undefined) { + if (char === '\\') index++; + else if (char === quote) quote = undefined; + continue; + } + if (char === "'" || char === '"' || char === '`') quote = char; + else if (char === '{' || char === '[' || char === '(' || char === '<') depth++; + else if (char === '}' || char === ']' || char === ')' || char === '>') { + if (depth === 0) return index; + depth--; + } else if ((char === ';' || char === ',') && depth === 0) return index; + } + return text.length; +} + +function bracketEnd(text: string, open: number): number { + let depth = 0; + let quote: string | undefined; + for (let index = open; index < text.length; index++) { + const char = text[index]; + if (quote !== undefined) { + if (char === '\\') index++; + else if (char === quote) quote = undefined; + continue; + } + if (char === "'" || char === '"' || char === '`') quote = char; + else if (char === '[' || char === '{' || char === '(') depth++; + else if (char === ']' || char === '}' || char === ')') { + depth--; + if (depth === 0) return index + 1; + } + } + return text.length; +} + +function statementRemoval( + text: string, + start: number, + end: number, +): { start: number; end: number; text: string } { + const after = /^;?[ \t]*/.exec(text.slice(end))?.[0].length ?? 0; + const lineStart = text.lastIndexOf('\n', start - 1) + 1; + const ownsLines = text.slice(lineStart, start).trim() === '' && text[end + after] === '\n'; + return ownsLines + ? { start: lineStart, end: end + after + 1, text: '' } + : { start, end: end + after, text: '' }; +} + +function quoteIntegers(text: string): string { + return text.replace(/(? `'${BigInt(digits)}'`); +} + +function rewriteDts( + text: string, + target: string, + extra: ReadonlyMap, + defaultRewrites: ReadonlyMap, + integerEnums: ReadonlySet, + jsonEnums: ReadonlyMap, + columnCardinalities: ReadonlyMap, + hashes: ReadonlyMap, +): string { + const table = dataTypesFor(target, extra); + const blocks = scanBlocks(text); + const edits: { start: number; end: number; text: string }[] = []; + + for (const match of text.matchAll(/readonly storage: readonly \[/g)) { + const types = innermostBlock(blocks, match.index); + if (types?.label !== 'types' || types.parent?.parent?.label !== 'extensions') continue; + const end = bracketEnd(text, match.index + match[0].length - 1); + edits.push(statementRemoval(text, match.index, end)); + } + + for (const match of text.matchAll(/readonly nativeType: (['"])(?:\\.|(?!\1).)*\1/g)) { + const block = innermostBlock(blocks, match.index); + if (block === undefined || !holdsNativeType(blocks, block)) continue; + const codecId = memberOf(text, blocks, block, 'codecId'); + const dataType = codecId === undefined ? undefined : table[codecId]; + if (dataType === undefined) continue; + edits.push({ + start: match.index, + end: match.index + match[0].length, + text: `readonly dataType: ${prettierString(dataType)}`, + }); + } + + const listMembers = new Set(); + for (const match of text.matchAll(/readonly many: (true|false|\{)/g)) { + const block = innermostBlock(blocks, match.index); + if (block === undefined) continue; + listMembers.add(block); + if (match[1] !== 'true') continue; + const key = columnBlockKey(block); + const many = key === undefined ? undefined : columnCardinalities.get(key); + if (many === undefined && block.parent?.label !== 'fields') continue; + edits.push({ + start: match.index, + end: match.index + match[0].length, + text: `readonly many: ${manyType(many ?? { elementNullable: false })}`, + }); + } + for (const block of blocks) { + const key = columnBlockKey(block); + const many = key === undefined ? undefined : columnCardinalities.get(key); + if (many === undefined || listMembers.has(block)) continue; + const member = lastMember(text, block, `readonly many: ${manyType(many)}`); + edits.push({ start: member.start, end: member.start, text: member.text }); + } + + for (const match of text.matchAll(/DefaultLiteralValue<\s*(['"])(?:\\.|(?!\1).)*\1\s*,\s*/g)) { + const argumentStart = match.index + match[0].length; + const defaultBlock = innermostBlock(blocks, match.index); + const column = defaultBlock?.parent; + const tableBlock = column?.parent?.parent; + if (column === undefined || tableBlock === undefined || column.parent?.label !== 'columns') + continue; + const value = defaultRewrites.get(`${tableBlock.label}\u0000${column.label}`); + if (value === undefined) continue; + const argumentEnd = genericArgumentEnd(text, argumentStart); + const trimmedEnd = argumentStart + text.slice(argumentStart, argumentEnd).trimEnd().length; + edits.push({ start: argumentStart, end: trimmedEnd, text: typeLiteral(value) }); + } + + for (const match of text.matchAll(/readonly values: readonly \[([^\]]*)\]/g)) { + const valueSet = innermostBlock(blocks, match.index); + const kind = valueSet?.parent; + const namespace = kind?.parent?.parent; + if ( + valueSet === undefined || + kind?.label !== 'valueSet' || + kind.parent?.label !== 'entries' || + namespace === undefined || + !integerEnums.has(enumKey(namespace.label, valueSet.label)) + ) + continue; + const values = match[1] ?? ''; + const start = match.index + match[0].length - values.length - 1; + edits.push({ start, end: start + values.length, text: quoteIntegers(values) }); + } + + for (const match of text.matchAll(/readonly value: (-?\d+)(?=\s*[;},])/g)) { + const member = innermostBlock(blocks, match.index); + const enumType = member?.parent; + const namespace = enumType?.parent?.parent; + const digits = match[1] ?? ''; + if ( + member === undefined || + member.label !== '' || + enumType?.parent?.label !== 'enum' || + namespace === undefined || + !integerEnums.has(enumKey(namespace.label, enumType.label)) + ) + continue; + const start = match.index + match[0].length - digits.length; + edits.push({ start, end: start + digits.length, text: quoteIntegers(digits) }); + } + + for (const match of text.matchAll(/readonly values: readonly \[/g)) { + const valueSet = innermostBlock(blocks, match.index); + const kind = valueSet?.parent; + const namespace = kind?.parent?.parent; + if ( + valueSet === undefined || + kind?.label !== 'valueSet' || + kind.parent?.label !== 'entries' || + namespace === undefined + ) + continue; + const values = jsonEnums.get(enumKey(namespace.label, valueSet.label))?.values; + if (values === undefined) continue; + const open = match.index + match[0].length - 1; + edits.push({ + start: open + 1, + end: bracketEnd(text, open) - 1, + text: values.map(typeLiteral).join(', '), + }); + } + + for (const match of text.matchAll(/readonly value: /g)) { + const member = innermostBlock(blocks, match.index); + const enumType = member?.parent; + const namespace = enumType?.parent?.parent; + if ( + member === undefined || + member.label !== '' || + enumType?.parent?.label !== 'enum' || + namespace === undefined + ) + continue; + const name = memberOf(text, blocks, member, 'name'); + const value = + name === undefined + ? undefined + : jsonEnums.get(enumKey(namespace.label, enumType.label))?.members.get(name); + if (value === undefined) continue; + const start = match.index + match[0].length; + const end = start + text.slice(start, literalEnd(text, start)).trimEnd().length; + edits.push({ start, end, text: typeLiteral(value) }); + } + + for (const match of text.matchAll(/(['"])([0-9a-f]{64})\1/g)) { + const hash = match[2]; + const next = hash === undefined ? undefined : hashes.get(hash); + if (next === undefined) continue; + edits.push({ + start: match.index, + end: match.index + match[0].length, + text: `${match[1]}${next}${match[1]}`, + }); + } + + let result = text; + for (const edit of edits.sort((a, b) => b.start - a.start)) + result = `${result.slice(0, edit.start)}${edit.text}${result.slice(edit.end)}`; + return result; +} + +function replaceQuotedHashes(text: string, hashes: ReadonlyMap): string { + return text.replace(/"([0-9a-f]{64})"/g, (match: string, hash: string) => { + const next = hashes.get(hash); + return next === undefined ? match : `"${next}"`; + }); +} + +interface ContractPlan { + readonly path: string; + readonly snapshot: boolean; + readonly oldHash: string; + readonly newHash: string; + readonly content: string; + readonly target: string; + readonly defaultRewrites: ReadonlyMap; + readonly integerEnums: ReadonlySet; + readonly jsonEnums: ReadonlyMap; + readonly columnCardinalities: ReadonlyMap; +} + +function readDirectory(dir: string): Map { + const files = new Map(); + if (!existsSync(dir)) return files; + for (const entry of readdirSync(dir, { withFileTypes: true })) + if (isFileEntry(dir, entry) && !entry.name.endsWith(TEMPORARY_SUFFIX)) + files.set(entry.name, readFileSync(join(dir, entry.name), 'utf8')); + return files; +} + +function sameFiles(a: ReadonlyMap, b: ReadonlyMap): boolean { + return a.size === b.size && [...a].every(([name, content]) => b.get(name) === content); +} + +function temporaryPath(path: string): string { + return join(dirname(path), `.${basename(path)}${TEMPORARY_SUFFIX}`); +} + +function writeWithModeOf(path: string, text: string, modeSource: string): void { + writeFileSync(path, text); + if (existsSync(modeSource)) chmodSync(path, statSync(modeSource).mode & 0o7777); +} + +function writeFile(path: string, text: string): void { + const target = realpathSync(path); + const temporary = temporaryPath(target); + writeWithModeOf(temporary, text, target); + renameSync(temporary, target); +} + +function writeDirectory(dir: string, files: ReadonlyMap, sourceDir: string): void { + const temporary = temporaryPath(dir); + mkdirSync(temporary); + for (const [name, text] of files) + writeWithModeOf(join(temporary, name), text, join(sourceDir, name)); + renameSync(temporary, dir); +} + +function removeDirectory(dir: string): void { + const temporary = temporaryPath(dir); + renameSync(dir, temporary); + rmSync(temporary, { recursive: true, force: true }); +} + +function count(amount: number, singular: string, plural: string): string { + return `${amount} ${amount === 1 ? singular : plural}`; +} + +function summary( + root: string, + contractsFound: number, + files: number, + directories: number, + hashes: ReadonlyMap, +): readonly string[] { + if (contractsFound === 0) return [`No SQL contract was found under ${root}; nothing changed.`]; + if (files === 0 && directories === 0) + return ['The project is already in the new format; nothing changed.']; + const renamed = count(directories, 'snapshot directory', 'snapshot directories'); + const changes = `Rewrote ${count(files, 'file', 'files')} and renamed ${renamed}.`; + if (hashes.size === 0) return [changes]; + return [ + `${changes} Storage hashes changed (old -> new):`, + ...[...hashes] + .sort(([a], [b]) => compareCodeUnits(a, b)) + .map(([oldHash, newHash]) => ` ${oldHash} -> ${newHash}`), + ]; +} + +const JSON_FILES_THAT_MUST_PARSE = new Set(['contract.json', 'migration.json']); + +function main({ root, dataTypes, errors }: Options): number { + if (errors.length > 0) { + process.stderr.write(`${errors.join('\n')}\n`); + return 1; + } + const display = (path: string): string => relative(root, path).split(sep).join('/'); + const files = listFiles(root); + const plans: ContractPlan[] = []; + const notices: string[] = []; + const stops: string[] = []; + let contractsFound = 0; + + for (const path of files.json) { + const text = readFileSync(path, 'utf8'); + const contract = parseJson(text); + if ( + contract === undefined && + (JSON_FILES_THAT_MUST_PARSE.has(basename(path)) || files.refs.includes(path)) + ) { + stops.push(`${display(path)}: not valid JSON`); + continue; + } + if ( + !isRecord(contract) || + contract['targetFamily'] !== 'sql' || + typeof contract['target'] !== 'string' + ) + continue; + const storage = contract['storage']; + if (!isRecord(storage)) continue; + contractsFound++; + const snapshot = isSnapshotContract(path); + const stored = storage['storageHash']; + const oldHash = snapshot ? basename(dirname(path)) : typeof stored === 'string' ? stored : ''; + const recomputes = computeStorageHash(contract) === oldHash; + const rewrite = rewriteContract(contract, dataTypes); + for (const codecId of rewrite.unknownCodecs) + stops.push( + `${display(path)}: unknown codec ${codecId}; name its data type with --data-type ${codecId}=`, + ); + if (!rewrite.changed) continue; + if (!recomputes) + notices.push(`${display(path)}: stored hash did not recompute; rehashed from content`); + const newHash = computeStorageHash(rewrite.contract); + const contractWithHash = withStorageHash(rewrite.contract, newHash); + plans.push({ + path, + snapshot, + oldHash, + newHash, + content: snapshot ? snapshotForm(contractWithHash) : emittedForm(contractWithHash, text), + target: contract['target'], + defaultRewrites: rewrite.defaultRewrites, + integerEnums: rewrite.integerEnums, + jsonEnums: rewrite.jsonEnums, + columnCardinalities: rewrite.columnCardinalities, + }); + } + + for (const target of [...new Set(plans.map((plan) => plan.target))].sort(compareCodeUnits)) { + for (const [codecId, dataType] of dataTypes) { + const known = DATA_TYPES[target]?.[codecId]; + if (known !== undefined) + stops.push( + `--data-type ${codecId}=${dataType}: the script already maps ${codecId} to ${known} on target ${target}`, + ); + } + } + + const hashes = new Map(); + for (const plan of [...plans].sort((a, b) => Number(b.snapshot) - Number(a.snapshot))) + if (plan.oldHash !== plan.newHash && !hashes.has(plan.oldHash)) + hashes.set(plan.oldHash, plan.newHash); + + const newDirectories = new Map>(); + const directorySources = new Map(); + const sourceDirectories = new Set(); + const removals = new Set(); + const snapshotRewrites: [string, string][] = []; + const referenceWrites = new Map(); + const contractWrites = new Map(); + for (const plan of plans) { + const dtsPath = plan.snapshot + ? join(dirname(plan.path), 'contract.d.ts') + : `${plan.path.slice(0, -'.json'.length)}.d.ts`; + const dtsHashes = plan.snapshot ? hashes : new Map([...hashes, [plan.oldHash, plan.newHash]]); + const dts = existsSync(dtsPath) + ? rewriteDts( + readFileSync(dtsPath, 'utf8'), + plan.target, + dataTypes, + plan.defaultRewrites, + plan.integerEnums, + plan.jsonEnums, + plan.columnCardinalities, + dtsHashes, + ) + : undefined; + if (!plan.snapshot) { + if (dts !== undefined) referenceWrites.set(dtsPath, dts); + contractWrites.set(plan.path, plan.content); + continue; + } + const oldDir = dirname(plan.path); + const newDir = join(dirname(oldDir), plan.newHash); + sourceDirectories.add(oldDir); + if (newDir === oldDir) { + if (dts !== undefined) snapshotRewrites.push([dtsPath, dts]); + snapshotRewrites.push([plan.path, plan.content]); + continue; + } + removals.add(oldDir); + const content = readDirectory(oldDir); + content.set('contract.json', plan.content); + if (dts !== undefined) content.set('contract.d.ts', dts); + const planned = newDirectories.get(newDir); + if (planned !== undefined && !sameFiles(planned, content)) { + stops.push(`${display(newDir)}: snapshot directory already exists with different content`); + continue; + } + newDirectories.set(newDir, content); + directorySources.set(newDir, oldDir); + } + for (const [dir, content] of newDirectories) { + if (sourceDirectories.has(dir) || !existsSync(dir)) continue; + if (sameFiles(readDirectory(dir), content)) newDirectories.delete(dir); + else stops.push(`${display(dir)}: snapshot directory already exists with different content`); + } + + for (const path of files.migrationJson) { + const text = readFileSync(path, 'utf8'); + const metadata = parseJson(text); + if (!isRecord(metadata)) continue; + const from = metadata['from']; + const to = metadata['to']; + const nextFrom = typeof from === 'string' ? (hashes.get(from) ?? from) : from; + const nextTo = typeof to === 'string' ? (hashes.get(to) ?? to) : to; + if (nextFrom === from && nextTo === to) continue; + const opsPath = join(dirname(path), 'ops.json'); + const ops = existsSync(opsPath) ? parseJson(readFileSync(opsPath, 'utf8')) : undefined; + if (existsSync(opsPath) && ops === undefined) { + stops.push(`${display(opsPath)}: not valid JSON`); + continue; + } + const oldMigrationHash = metadata['migrationHash']; + let next = replaceQuotedHashes(text, hashes); + if ( + ops !== undefined && + typeof oldMigrationHash === 'string' && + nextFrom !== undefined && + nextTo !== undefined + ) { + const migrationHash = computeMigrationHash({ ...metadata, from: nextFrom, to: nextTo }, ops); + next = next.replace(`"${oldMigrationHash}"`, `"${migrationHash}"`); + } + referenceWrites.set(path, next); + } + for (const path of files.refs) { + const text = readFileSync(path, 'utf8'); + const next = replaceQuotedHashes(text, hashes); + if (next !== text) referenceWrites.set(path, next); + } + for (const path of files.migrationTs) { + const text = readFileSync(path, 'utf8'); + const next = text.replace( + /(? hashes.get(hash) ?? hash, + ); + if (next !== text) referenceWrites.set(path, next); + } + + if (stops.length > 0) { + process.stderr.write(`${[...new Set(stops)].join('\n')}\n`); + return 1; + } + + try { + for (const path of files.leftovers) rmSync(path, { recursive: true, force: true }); + for (const [dir, content] of newDirectories) + writeDirectory(dir, content, directorySources.get(dir) ?? dir); + for (const [path, text] of snapshotRewrites) writeFile(path, text); + for (const [path, text] of referenceWrites) writeFile(path, text); + for (const [path, text] of contractWrites) writeFile(path, text); + for (const dir of removals) removeDirectory(dir); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + process.stderr.write( + `${message}; the upgrade stopped partway, run the script again to finish it\n`, + ); + return 1; + } + const rewrittenFiles = snapshotRewrites.length + referenceWrites.size + contractWrites.size; + const lines = [ + ...notices, + ...summary(root, contractsFound, rewrittenFiles, removals.size, hashes), + ]; + process.stdout.write(`${lines.join('\n')}\n`); + return 0; +} + +process.exitCode = main(parseOptions(process.argv.slice(2))); diff --git a/upgrade-instructions/pending/data-types-declare-names/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-types-declare-names/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/data-types-declare-names/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-types-declare-names/app/instructions.md diff --git a/upgrade-instructions/pending/data-types-declare-names/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-types-declare-names/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/data-types-declare-names/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/data-types-declare-names/extension/instructions.md diff --git a/upgrade-instructions/pending/domain-types-match-their-columns/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/domain-types-match-their-columns/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/domain-types-match-their-columns/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/domain-types-match-their-columns/app/instructions.md diff --git a/upgrade-instructions/pending/domain-types-match-their-columns/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/domain-types-match-their-columns/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/domain-types-match-their-columns/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/domain-types-match-their-columns/extension/instructions.md diff --git a/upgrade-instructions/pending/enum-members-written-as-stored/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/enum-members-written-as-stored/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/enum-members-written-as-stored/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/enum-members-written-as-stored/app/instructions.md diff --git a/upgrade-instructions/pending/line-comments-in-raw-sql/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/line-comments-in-raw-sql/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/line-comments-in-raw-sql/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/line-comments-in-raw-sql/app/instructions.md diff --git a/upgrade-instructions/pending/line-comments-in-raw-sql/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/line-comments-in-raw-sql/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/line-comments-in-raw-sql/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/line-comments-in-raw-sql/extension/instructions.md diff --git a/upgrade-instructions/pending/mongo-nullable-list-containers/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/mongo-nullable-list-containers/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/mongo-nullable-list-containers/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/mongo-nullable-list-containers/app/instructions.md diff --git a/upgrade-instructions/pending/nullable-scalar-lists/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/nullable-scalar-lists/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/nullable-scalar-lists/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/nullable-scalar-lists/app/instructions.md diff --git a/upgrade-instructions/pending/nullable-scalar-lists/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/nullable-scalar-lists/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/nullable-scalar-lists/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/nullable-scalar-lists/extension/instructions.md diff --git a/upgrade-instructions/pending/postgres-driver-server-text/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/postgres-driver-server-text/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/postgres-driver-server-text/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/postgres-driver-server-text/extension/instructions.md diff --git a/upgrade-instructions/pending/prisma6-bytes-objectid-is-hex/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/prisma6-bytes-objectid-is-hex/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/prisma6-bytes-objectid-is-hex/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/prisma6-bytes-objectid-is-hex/app/instructions.md diff --git a/upgrade-instructions/pending/prisma6-int-is-a-long/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/prisma6-int-is-a-long/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/prisma6-int-is-a-long/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/prisma6-int-is-a-long/app/instructions.md diff --git a/upgrade-instructions/pending/prisma7-migration-handover/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/prisma7-migration-handover/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/prisma7-migration-handover/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/prisma7-migration-handover/app/instructions.md diff --git a/upgrade-instructions/pending/query-fragment-helpers/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/query-fragment-helpers/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/query-fragment-helpers/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/query-fragment-helpers/app/instructions.md diff --git a/upgrade-instructions/pending/query-fragment-helpers/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/query-fragment-helpers/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/query-fragment-helpers/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/query-fragment-helpers/extension/instructions.md diff --git a/upgrade-instructions/pending/rename-constraint-call/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/rename-constraint-call/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/rename-constraint-call/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/rename-constraint-call/extension/instructions.md diff --git a/upgrade-instructions/pending/runtime-closed-error/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/runtime-closed-error/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/runtime-closed-error/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/runtime-closed-error/extension/instructions.md diff --git a/upgrade-instructions/pending/select-row-locking-capabilities/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/select-row-locking-capabilities/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/select-row-locking-capabilities/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/select-row-locking-capabilities/app/instructions.md diff --git a/upgrade-instructions/pending/select-row-locking-capabilities/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/select-row-locking-capabilities/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/select-row-locking-capabilities/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/select-row-locking-capabilities/extension/instructions.md diff --git a/upgrade-instructions/pending/sql-is-a-data-type/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/sql-is-a-data-type/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/sql-is-a-data-type/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/sql-is-a-data-type/app/instructions.md diff --git a/upgrade-instructions/pending/sql-is-a-data-type/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/sql-is-a-data-type/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/sql-is-a-data-type/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/sql-is-a-data-type/extension/instructions.md diff --git a/upgrade-instructions/pending/variant-takes-discriminator-value/app/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/variant-takes-discriminator-value/app/instructions.md similarity index 100% rename from upgrade-instructions/pending/variant-takes-discriminator-value/app/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/variant-takes-discriminator-value/app/instructions.md diff --git a/upgrade-instructions/pending/variant-takes-discriminator-value/extension/instructions.md b/upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/variant-takes-discriminator-value/extension/instructions.md similarity index 100% rename from upgrade-instructions/pending/variant-takes-discriminator-value/extension/instructions.md rename to upgrade-instructions/releases/8.0.0-rc.14-to-8.0.0-rc.15/sources/variant-takes-discriminator-value/extension/instructions.md From de19e6eee928ff8e96f4d4cda6684e6e57805d4e Mon Sep 17 00:00:00 2001 From: willbot Date: Wed, 7 Oct 2026 09:14:43 +0200 Subject: [PATCH 2/3] docs(release): add release notes for v8.0.0-rc.15 Signed-off-by: willbot Signed-off-by: Will Madden --- CHANGELOG.md | 198 ++++++++++++++++++++++++++++++++++ docs/releases/v8.0.0-rc.15.md | 197 +++++++++++++++++++++++++++++++++ 2 files changed, 395 insertions(+) create mode 100644 docs/releases/v8.0.0-rc.15.md diff --git a/CHANGELOG.md b/CHANGELOG.md index b895f282ef96..844287e5c0a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,204 @@ Changelog tracking starts at **v0.12.0**, the first release cut after this conve +## v8.0.0-rc.15 + +In this release, each column in a SQL contract names its data type, such as `pg/text`, in place of the type name the database prints. One script and `prisma db sign` upgrade a project. Codecs now check every value a contract stores, and a field's type in the contract matches its column. Custom collection classes keep their methods through the chain, and scopes let you share a piece of a query across models. The typed SQL builder can lock the rows a select reads. Middleware gains an `afterTransaction` stage, and the cache middleware gains invalidation. A hand-written migration can rename a table with `this.renameTable`. Lists can hold `null` elements. The PSL language server adds hover, go to definition and find references. + +The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/) and the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). Each breaking change below names the change id to look for in them. Run the `contract-stores-data-type` script before any other step that emits a contract again. + +## Breaking changes + +- **A contract column stores its data type id, not its database type name.** A SQL column in `contract.json` now stores `dataType`, for example `pg/int4`, where it stored `nativeType`, for example `int4`. A contract in the old format is refused with `CONTRACT.VALIDATION_FAILED`. Every contract's storage hash changes once. To upgrade, first upgrade every extension that ships migrations, such as pgvector and PostGIS, in the same step. Then run the script from the upgrade recipe in the project root. It rewrites every contract, snapshot, migration, ref, `migration.ts` and `contract.d.ts`. Then run `prisma db sign` against every database before you deploy. Until a database is signed, `prisma db migrate` refuses with `MIGRATION.MARKER_MISMATCH`. `db sign` now signs every contract space, and its `--json` result is `{ ok, summary, spaces, advancedRefs }`. A column descriptor written by hand drops `nativeType`. PostgreSQL parameter casts use the base name, so `$1::integer` is now `$1::int4`, and logged SQL and SQL snapshots change to match. See `contract-stores-data-type`, `column-descriptors-drop-native-type`, `sign-databases-after-upgrade` and `parameter-casts-use-base-names` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30576](https://github.com/prisma/orm/pull/30576)) + + Before: + + ```json + "email": { "codecId": "pg/text@1", "nativeType": "text", "nullable": false } + ``` + + After: + + ```json + "email": { "codecId": "pg/text@1", "dataType": "pg/text", "nullable": false } + ``` + + The upgrade: + + ```sh + curl -O https://raw.githubusercontent.com/prisma/orm/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts + node data-type-in-contract.ts + prisma db sign + ``` + +- **A list's cardinality is stored as an object.** A list field or column in `contract.json` stores `many: { elementNullable: false }` where it stored `many: true`, and `many: true` is refused. For SQL contracts, the `contract-stores-data-type` script makes this change. Emit MongoDB contracts again, and refresh their historical snapshots with the migrations that name them. A contract object written by hand changes the same way. See `reemit-explicit-list-cardinality` and `refresh-historical-list-contracts` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30051](https://github.com/prisma/orm/pull/30051)) + +- **Codecs check every value a contract stores.** A TypeScript `.default()` or `enumType` member that its column's codec does not take is refused when the contract is built, with `CONTRACT.DEFAULT_INVALID` or `CONTRACT.ENUM_INVALID`. A PSL enum member or literal default that the column's type does not hold is refused by `contract emit`. A TypeScript enum member must be written as the column stores it, so an upper-case uuid member is refused with the value to write instead. Emit contracts again: the domain half now carries the type parameters and enum values of fields typed by a named type, of enum lists and of composite type members. Hashes do not change for that. Other changes: a `textArray()` element is typed `string | null`, a `char(n)` value reads without its padding through `.include()` too, NaN on SQLite throws `RUNTIME.ENCODE_FAILED`, an upper-case or braced uuid default is stored as PostgreSQL writes it, and an attribute on a composite type is refused. See `domain-types-match-their-columns`, `codecs-check-stored-json`, `psl-values-checked-by-codecs`, `ts-enum-member-written-as-stored` and the other entries of the same names in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30451](https://github.com/prisma/orm/pull/30451), [#30512](https://github.com/prisma/orm/pull/30512)) + +- **`setDefault` in a `migration.ts` takes the column, not SQL text.** The adapter now writes every column default and reads it with the column's codec. A `migration.ts` that uses `defaultSql` no longer compiles, and running it stops with `MIGRATION.OPERATION_OPTION_REMOVED`; its `ops.json` still applies. On PostgreSQL, `db update` and `db migrate` now apply a changed default on an existing column. A migration planned by an earlier version still skips it: plan it again before you apply it. See `migration-ts-column-defaults` and `postgres-changed-default-applied` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30451](https://github.com/prisma/orm/pull/30451)) + + Before: + + ```ts + this.setDefault({ table: 'user', column: 'role', defaultSql: "DEFAULT 'member'" }) + ``` + + After: + + ```ts + this.setDefault({ table: 'user', column: col('role', 'text', { default: lit('member'), codecRef: { codecId: 'pg/text@1' } }) }) + ``` + +- **A TypeScript contract must list the extensions whose codecs it uses.** `defineContract` from `@prisma/orm-postgres/contract-builder` or `@prisma/orm-sqlite/contract-builder` takes each column's database type from its codec's data type. A contract that uses a pgvector, PostGIS or arktype-json column without listing that extension in `extensions` fails with `CONTRACT.CODEC_DESCRIPTOR_MISSING`. A `vector(length)` or `geometry({ srid })` argument out of range now fails `defineContract` with `CONTRACT.TYPE_PARAMS_INVALID`, not the helper call. On SQLite, emit again: `contract.d.ts` gains rows for `char` and `varchar`. See `ts-contract-lists-extension-codecs`, `column-helpers-raise-type-params-invalid` and `sqlite-contract-d-ts-char-aggregates` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30547](https://github.com/prisma/orm/pull/30547)) + +- **A write on a collection that may have no filter does not compile.** Chaining methods now return the collection's own class, so a filtered collection is a subtype of an unfiltered one. `update`, `updateAll`, `delete`, `deleteAll` and their `AndCount` forms on a collection filtered on some code paths only no longer compile. `cursor` and `distinctOn` check the order on the collection itself, so a cast on the argument no longer gets past the check. In a custom collection class, an override of a chaining method takes a `this` parameter, and a member named `apply` or `scope` with another signature must be renamed. Read a collection's type state and row with `CollectionTypeStateOf` and `CollectionRowOf`, and drop explicit type arguments on `include`, `distinct` and `distinctOn`. See the entries from `writes-on-a-conditional-collection-are-refused` to `chaining-methods-take-no-explicit-type-arguments`, and `scope-is-a-collection-member`, in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30560](https://github.com/prisma/orm/pull/30560), [#30564](https://github.com/prisma/orm/pull/30564)) + + ```ts + const posts = search ? db.Post.published() : db.Post; + await posts.deleteAll(); // now a type error: posts may have no filter + ``` + +- **Bulk writes refuse a `limit`, `offset`, `cursor` or `distinct` they would ignore.** `updateAll`, `updateAndCount`, `deleteAll` and `deleteAndCount` change every row that matches the filter. They used to ignore these, so `where(...).limit(10).deleteAll()` deleted every matching row. They now throw `ORM.ARGUMENT_INVALID`. `update` with a relation callback throws on a collection with an order, limit, offset, cursor or `distinct`. After `limit(0)`, `update` and `delete` change no row and return `null`. The `field` exported from `@prisma/orm-postgres/contract-builder` now checks `.default(...)` values against the column type at compile time. See `writes-refuse-what-they-would-ignore` and `imported-postgres-field-checks-defaults` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30564](https://github.com/prisma/orm/pull/30564)) + + Before: + + ```ts + await db.orm.public.Post.where({ userId }).limit(10).deleteAll(); + ``` + + After: + + ```ts + const ids = (await db.orm.public.Post.where({ userId }).select('id').limit(10).all()).map((p) => p.id); + await db.orm.public.Post.where((p) => p.id.in(ids)).deleteAll(); + ``` + +- **`variant()` takes the discriminator value, not the model name.** In the SQL and Mongo ORMs, `.variant()` takes the value a variant declares in `@@base(Task, "bug")`. A value the model does not declare, or a call on a model with no discriminator, throws `ORM.ARGUMENT_INVALID`; before, it returned the collection unchanged and read every variant. A second `.variant()` call is refused: select each variant from the base collection. A model name that equals a declared value still compiles, so check each call against the contract. See `variant-takes-discriminator-value` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30577](https://github.com/prisma/orm/pull/30577)) + + Before: + + ```ts + db.orm.public.Task.variant('Bug'); + ``` + + After: + + ```ts + db.orm.public.Task.variant('bug'); + ``` + +- **The cache middleware's store decides how long an entry lives.** `cacheAnnotation` no longer takes `ttl`, and every annotated read is now cached, including `cacheAnnotation({})`, which used to pass through. The default store keeps an entry for 60 seconds. `skip` is renamed `bypass`, and the type `CachePayload` is renamed `CacheAnnotationOptions`. `createCacheMiddleware` no longer takes `maxEntries` or `clock`: pass them to `createInMemoryCacheStore` and give that store to `createCacheMiddleware({ store })`. A custom `CacheStore` now keeps a version per key, with `get({ key, meta })`, `set(entry, value)` and a new required `unset({ keys, meta })`. See `cache-annotation-ttl-removed`, `cache-annotation-skip-renamed-bypass`, `cache-middleware-store-options` and `cache-store-object-arguments` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30530](https://github.com/prisma/orm/pull/30530)) + + Before: + + ```ts + const cache = createCacheMiddleware({ maxEntries: 500 }); + db.sql.public.user.select('id', 'email').annotate(cacheAnnotation({ ttl: 60_000 })); + ``` + + After: + + ```ts + const cache = createCacheMiddleware({ store: createInMemoryCacheStore({ maxEntries: 500 }) }); + db.sql.public.user.select('id', 'email').annotate(cacheAnnotation({})); + ``` + +- **`prisma7Schema` and `contract infer` read dates as text.** A Prisma 7 `DateTime` column, and `@db.Timestamp`, `@db.Timestamptz`, `@db.Date` and `@db.Time` columns, now read and write strings such as `"2026-09-14 10:00:00.123"`, not `Temporal` values, so the application needs no `Temporal`. `contract infer` writes `TimestampString(p)`, `TimestamptzString(p)`, `DateString` and `TimeString(p)` for these columns. Emit again, change code that treats these fields as `Temporal` values, then run `prisma db sign`. A contract inferred earlier keeps its types until `contract infer` runs again. See `prisma7-schema-date-types-are-text` and `contract-infer-writes-text-date-types` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30553](https://github.com/prisma/orm/pull/30553)) + + Before: + + ```prisma + model User { + createdAt Timestamp(3) @default(now()) + } + ``` + + After: + + ```prisma + model User { + createdAt TimestampString(3) @default(now()) + } + ``` + +- **The `pg.sql` and `sqlite.sql` tags are removed.** Write `sql`; the stored default does not change. Four PSL diagnostic codes for written values are renamed: `PSL_UNKNOWN_DEFAULT_LITERAL_TAG` is now `PSL_UNKNOWN_LITERAL_TAG`, `PSL_INVALID_JSON_LITERAL` is now `PSL_INVALID_LITERAL`, `PSL_DEFAULT_TYPE_INCOMPATIBLE` is now `PSL_VALUE_TYPE_INCOMPATIBLE` (or `PSL_DEFAULT_LIST_EXPECTED` for a single value on a list column), and most cases of `PSL_INVALID_DEFAULT_LITERAL` are now `PSL_INVALID_LITERAL`. See `prefixed-sql-tags-are-removed` and `default-diagnostic-codes-changed` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30534](https://github.com/prisma/orm/pull/30534)) + + Before: + + ```prisma + createdAt DateTime @default(pg.sql`(now() + interval '1 hour')`) + ``` + + After: + + ```prisma + createdAt DateTime @default(sql`(now() + interval '1 hour')`) + ``` + +- **A Prisma 6 MongoDB `Int` is stored as a BSON long.** A contract read with `prisma6Schema(...)` gives a plain `Int` field, and `Int @db.Long`, the new `Int64Number` type: still a `number` in the application, but written as a BSON long, as Prisma 6 does. A document whose field holds a fraction now fails to read with `RUNTIME.DECODE_FAILED`: repair it, then emit again. A `Bytes @db.ObjectId` field reads as a 24-digit hex string and refuses a 12-byte `Buffer` or `Uint8Array`. See `prisma6-int-written-as-long` and `prisma6-bytes-objectid-is-hex` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30521](https://github.com/prisma/orm/pull/30521)) + +- **`db verify --strict` reports unclaimed tables as `CONTRACT.SCHEMA_VERIFICATION_FAILED`.** A database that holds tables no contract declares used to be reported as `CONTRACT.MARKER_REQUIRED`. The exit code is still 4. `CONTRACT.MARKER_REQUIRED` now only means the database has not been signed. A script that matches the old code must match the new one. See `strict-verify-unclaimed-code` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30601](https://github.com/prisma/orm/pull/30601)) + +- **Some contracts get a new storage hash once.** `contract infer` writes a `bytea` default as a base64 literal, `@default("aGVsbG8=")`, where it wrote a `sql` expression; a contract inferred again gets a new storage hash. An index, check or policy whose SQL holds both `--` and a line break gets a new name, and the next `migration plan` drops and recreates it. In both cases, sign the database or plan the migration as the recipe says. See `contract-infer-writes-bytea-default-literals` and `sql-with-a-line-comment-gets-a-new-wire-name` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30603](https://github.com/prisma/orm/pull/30603), [#30546](https://github.com/prisma/orm/pull/30546)) + +- **Mongo validators accept a `null` list.** For a nullable list such as `String[]?`, the collection validator now admits `null`, so the storage hash changes. Emit the contract again, then plan and apply a migration that updates the validator before you write a `null` list. See `mongo-nullable-list-containers` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30568](https://github.com/prisma/orm/pull/30568)) + +- **Extension authors: SQL data types declare their names, and codecs take their data type.** Declare a SQL data type with `sqlDataType(id, { params, texts })` from `@internal/sql-contract/data-type`; its `texts` replace codec `targetTypes`, the `nativeType()` and `expandNativeType` hooks and `normalizeNativeType`. A codec's `paramsSchema` is its data type's `params`, and `postgresCodec` and `sqliteCodec` take the data type object. Run the `contract-stores-data-type` script on your contract space, raise your peer dependency floor to this release, and publish a `--data-type` line for each codec you own. The Postgres runtime driver now returns every column as server text, so a codec's `decode` receives text. A built-in codec's `decodeJson` refuses JSON that is not a stored form of its type. `SelectAstOptions` takes `locking`, DDL nodes hold SQL as `OpaqueSql`, `RenameCheckConstraintCall` is now `RenameConstraintCall`, `ControlFamilyInstance` gains `signSpaces`, and the SQLite target drops `sqlite/json`, `sqlite/datetime` and `sqlite/bigint`. See the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30547](https://github.com/prisma/orm/pull/30547), [#30576](https://github.com/prisma/orm/pull/30576), [#30597](https://github.com/prisma/orm/pull/30597), [#30451](https://github.com/prisma/orm/pull/30451), [#30549](https://github.com/prisma/orm/pull/30549), [#30546](https://github.com/prisma/orm/pull/30546), [#30331](https://github.com/prisma/orm/pull/30331), [#30534](https://github.com/prisma/orm/pull/30534)) + + Before: + + ```ts + export const pgvectorVector: DataType = dataType('pgvector/vector', { listCast }); + ``` + + After: + + ```ts + export const pgvectorVector = sqlDataType('pgvector/vector', { + params: pgvectorVectorParams, + texts: [{ text: 'vector({length})', written: true, catalog: true }], + listCast, + }); + ``` + +## Features + +- **The typed SQL builder locks the rows a select reads.** A select gains `forUpdate()`, `forNoKeyUpdate()`, `forShare()` and `forKeyShare()`, each with optional `of`, `nowait` and `skipLocked`. The methods exist only where the database supports them, so they are absent on SQLite. Emit the contract again to get the capabilities that enable them (`re-emit-for-the-row-locking-capabilities`). ([#30549](https://github.com/prisma/orm/pull/30549)) + + ```ts + tx.sql.public.job.select('id').where((f, fns) => fns.eq(f.state, 'queued')).limit(1).forUpdate({ skipLocked: true }).build() + ``` + +- **Scopes.** `db.orm.scope(fields, body)` defines a scope for any model that has the given fields, such as a soft-delete filter. `db.orm.public.Post.scope(body)` defines one for a single model, and `CollectionRowOf` names the row it produces. `orderByField` turns a sort field from a request into a checked order. `apply(fn)` runs any scope on a collection. ([#30564](https://github.com/prisma/orm/pull/30564), [#30560](https://github.com/prisma/orm/pull/30560)) +- **Custom collection methods chain.** Methods of a custom collection class stay available after `where`, `orderBy`, `limit`, `include` and the other chaining methods: `db.Post.where({ userId }).published()` compiles. ([#30560](https://github.com/prisma/orm/pull/30560)) +- **Middleware gains an `afterTransaction` stage.** It fires once per query when its effects are final, after the enclosing transaction commits or rolls back, with `result.outcome` set to `committed`, `rolled-back` or `unknown`. ([#30614](https://github.com/prisma/orm/pull/30614)) +- **The cache middleware can invalidate entries.** `cache.invalidate({ keys })` removes entries by the key a `cacheAnnotation({ key })` named, and `cache.invalidate({ meta })` removes entries by the `meta` a read carried, with a store that indexes it. `deriveKey` replaces how keys are made for reads that name none. ([#30530](https://github.com/prisma/orm/pull/30530)) +- **A hand-written migration can rename a table.** `this.renameTable({ table: 'userProfile', to: 'UserProfile' })` in a migration made with `prisma migration new` renames the table and the constraints and indexes named after it, on Postgres and SQLite, and keeps its rows. ([#30331](https://github.com/prisma/orm/pull/30331)) +- **List elements can be `null`.** `String?[]` allows `null` elements, `String[]?` allows a `null` list, and `String?[]?` allows both. In TypeScript, write `.many({ elementsNullable: true })`. ([#30051](https://github.com/prisma/orm/pull/30051)) +- **`db sign` signs every contract space.** It verifies the application's space and each extension's, then signs every space that verified in one transaction. ([#30576](https://github.com/prisma/orm/pull/30576)) +- **Hover in the PSL language server.** Hovering a model, field, type or block shows its declaration and its `///` doc comment. Hovering an attribute, argument key, function, constant or contributed type shows its signature and documentation. ([#30569](https://github.com/prisma/orm/pull/30569), [#30591](https://github.com/prisma/orm/pull/30591)) +- **Go to definition and find references in the PSL language server.** Both work across every schema file of the project, for models, composite types, named types, blocks, fields and namespaces. ([#30578](https://github.com/prisma/orm/pull/30578), [#30621](https://github.com/prisma/orm/pull/30621)) +- **Completion in block values.** The language server completes the values of a block such as `policy_select`, including in lists and function calls, and offers `ns.` for namespaces. A block value can name an entity in another namespace, as in `target = auth.Account`. Completion now follows the same name lookup as diagnostics. ([#30567](https://github.com/prisma/orm/pull/30567), [#30545](https://github.com/prisma/orm/pull/30545)) +- **`prisma6Schema` reads more Prisma 6 MongoDB schemas.** It accepts every native type Prisma 6 accepts except `DateTime @db.Timestamp`, and a dotted index path such as `@@index([author.name])` gets a clear diagnostic in place of a parse error. `prisma orm init` recognises a Prisma 6 MongoDB project. ([#30521](https://github.com/prisma/orm/pull/30521)) + +## Fixes + +- The Postgres driver returns every column as server text, so a `jsonb` column holding a JSON string such as `"standard"` reads back as that string. Before, it failed with `RUNTIME.DECODE_FAILED`, and `"123"` read as a number. An `interval` reads the text Postgres prints, and a computed boolean in a SQL builder select reads as `true`, not `'t'`. ([#30597](https://github.com/prisma/orm/pull/30597)) +- A query after `close()` fails once with `DRIVER.NOT_CONNECTED: Runtime is closed`, and work already started finishes. Before, a query returned without `await` from an `await using` scope failed with a misleading marker error or an unhandled rejection. ([#30533](https://github.com/prisma/orm/pull/30533)) +- `contract infer` and `prisma7Schema` contracts work on Node without `Temporal`. A text `timestamp` column filled with `now`, including Prisma 7's `@updatedAt`, receives UTC time on a host outside UTC (`text-timestamp-now-is-utc`). ([#30553](https://github.com/prisma/orm/pull/30553)) +- A `Bytes` literal default and a pgvector list default no longer roll back `db init`, `db update` and `db migrate` with `MIGRATION.SCHEMA_VERIFY_FAILED`. A `Bytes` default may be written as base64 or as Postgres hex. ([#30603](https://github.com/prisma/orm/pull/30603)) +- On SQLite, a `now()` default stores the same text the application writes, so rows that took the default compare and sort correctly. Existing tables keep their old default. ([#30612](https://github.com/prisma/orm/pull/30612)) +- On Postgres, verification accepts a column written with a type alias such as `varchar` or `int`, or without a length, and a `numeric` column takes a negative scale. Library errors no longer include the connection string. ([#30451](https://github.com/prisma/orm/pull/30451)) +- A Postgres `setDefault` with no default, or with `autoincrement()`, is refused with `CONTRACT.DEFAULT_INVALID` before it writes an invalid statement. A `sql/float@1` list on Postgres reads as numbers, not strings. ([#30552](https://github.com/prisma/orm/pull/30552)) +- Three Postgres column defaults are read correctly: a `json[]` default with an unquoted array element, a `jsonb[]` default holding a number too large for JavaScript, and an uncast nested `text[]` default. ([#30501](https://github.com/prisma/orm/pull/30501)) +- A raw SQL check, index or policy that ends in a `--` comment produces valid DDL. ([#30546](https://github.com/prisma/orm/pull/30546)) +- A generated `migration.ts` writes SQL that holds both quote kinds as a template literal, without backslashes. ([#30554](https://github.com/prisma/orm/pull/30554)) +- `migration status` and `db migrate` resolve `@contract` and `@db`, and each command's help lists only the reference forms it accepts. `db sign` and `db update --to` refuse a reserved reference with `MIGRATION.REF_WRONG_GRAMMAR`. Without a connection, the suggested retry command keeps your flags. ([#30475](https://github.com/prisma/orm/pull/30475)) +- After handing migrations from Prisma 7 to Prisma 8, the first `migration plan` names the baseline so it sorts before the change it plans. ([#30601](https://github.com/prisma/orm/pull/30601)) +- On MongoDB, a nullable list field accepts an explicit `null`. Before, the database validator refused it. ([#30568](https://github.com/prisma/orm/pull/30568)) +- An unknown or misspelled type name reports one diagnostic, `PSL_UNRESOLVED_REFERENCE: Cannot find type "…"`, in both the SQL and Mongo families. A field preset written without a call, such as `temporal.createdAt`, reports `PSL_PRESET_NOT_CALLED`. ([#30563](https://github.com/prisma/orm/pull/30563), [#30538](https://github.com/prisma/orm/pull/30538)) +- A `view` block is read as model fields only in Prisma 7 and Prisma 6 schemas. In a Prisma 8 schema it is an unsupported block like any other. ([#30507](https://github.com/prisma/orm/pull/30507)) + ## v8.0.0-rc.14 In this release, `connect()` on the Postgres serverless client returns a connection with `db.orm`, `db.transaction(...)` and `db.prepare(...)`, the same members as a `postgres()` client. A date or time default is stored in one canonical text for each value, so its storage hash no longer depends on how the default was written. The Mongo ORM passes every value it writes, reads or filters on through its field's codec. The Postgres CLI commands now work with date and time defaults on Node 24, which has no `Temporal`. diff --git a/docs/releases/v8.0.0-rc.15.md b/docs/releases/v8.0.0-rc.15.md new file mode 100644 index 000000000000..0c5177fd4417 --- /dev/null +++ b/docs/releases/v8.0.0-rc.15.md @@ -0,0 +1,197 @@ +# v8.0.0-rc.15 + +In this release, each column in a SQL contract names its data type, such as `pg/text`, in place of the type name the database prints. One script and `prisma db sign` upgrade a project. Codecs now check every value a contract stores, and a field's type in the contract matches its column. Custom collection classes keep their methods through the chain, and scopes let you share a piece of a query across models. The typed SQL builder can lock the rows a select reads. Middleware gains an `afterTransaction` stage, and the cache middleware gains invalidation. A hand-written migration can rename a table with `this.renameTable`. Lists can hold `null` elements. The PSL language server adds hover, go to definition and find references. + +The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/) and the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). Each breaking change below names the change id to look for in them. Run the `contract-stores-data-type` script before any other step that emits a contract again. + +## Breaking changes + +- **A contract column stores its data type id, not its database type name.** A SQL column in `contract.json` now stores `dataType`, for example `pg/int4`, where it stored `nativeType`, for example `int4`. A contract in the old format is refused with `CONTRACT.VALIDATION_FAILED`. Every contract's storage hash changes once. To upgrade, first upgrade every extension that ships migrations, such as pgvector and PostGIS, in the same step. Then run the script from the upgrade recipe in the project root. It rewrites every contract, snapshot, migration, ref, `migration.ts` and `contract.d.ts`. Then run `prisma db sign` against every database before you deploy. Until a database is signed, `prisma db migrate` refuses with `MIGRATION.MARKER_MISMATCH`. `db sign` now signs every contract space, and its `--json` result is `{ ok, summary, spaces, advancedRefs }`. A column descriptor written by hand drops `nativeType`. PostgreSQL parameter casts use the base name, so `$1::integer` is now `$1::int4`, and logged SQL and SQL snapshots change to match. See `contract-stores-data-type`, `column-descriptors-drop-native-type`, `sign-databases-after-upgrade` and `parameter-casts-use-base-names` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30576](https://github.com/prisma/orm/pull/30576)) + + Before: + + ```json + "email": { "codecId": "pg/text@1", "nativeType": "text", "nullable": false } + ``` + + After: + + ```json + "email": { "codecId": "pg/text@1", "dataType": "pg/text", "nullable": false } + ``` + + The upgrade: + + ```sh + curl -O https://raw.githubusercontent.com/prisma/orm/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/scripts/data-type-in-contract/data-type-in-contract.ts + node data-type-in-contract.ts + prisma db sign + ``` + +- **A list's cardinality is stored as an object.** A list field or column in `contract.json` stores `many: { elementNullable: false }` where it stored `many: true`, and `many: true` is refused. For SQL contracts, the `contract-stores-data-type` script makes this change. Emit MongoDB contracts again, and refresh their historical snapshots with the migrations that name them. A contract object written by hand changes the same way. See `reemit-explicit-list-cardinality` and `refresh-historical-list-contracts` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30051](https://github.com/prisma/orm/pull/30051)) + +- **Codecs check every value a contract stores.** A TypeScript `.default()` or `enumType` member that its column's codec does not take is refused when the contract is built, with `CONTRACT.DEFAULT_INVALID` or `CONTRACT.ENUM_INVALID`. A PSL enum member or literal default that the column's type does not hold is refused by `contract emit`. A TypeScript enum member must be written as the column stores it, so an upper-case uuid member is refused with the value to write instead. Emit contracts again: the domain half now carries the type parameters and enum values of fields typed by a named type, of enum lists and of composite type members. Hashes do not change for that. Other changes: a `textArray()` element is typed `string | null`, a `char(n)` value reads without its padding through `.include()` too, NaN on SQLite throws `RUNTIME.ENCODE_FAILED`, an upper-case or braced uuid default is stored as PostgreSQL writes it, and an attribute on a composite type is refused. See `domain-types-match-their-columns`, `codecs-check-stored-json`, `psl-values-checked-by-codecs`, `ts-enum-member-written-as-stored` and the other entries of the same names in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30451](https://github.com/prisma/orm/pull/30451), [#30512](https://github.com/prisma/orm/pull/30512)) + +- **`setDefault` in a `migration.ts` takes the column, not SQL text.** The adapter now writes every column default and reads it with the column's codec. A `migration.ts` that uses `defaultSql` no longer compiles, and running it stops with `MIGRATION.OPERATION_OPTION_REMOVED`; its `ops.json` still applies. On PostgreSQL, `db update` and `db migrate` now apply a changed default on an existing column. A migration planned by an earlier version still skips it: plan it again before you apply it. See `migration-ts-column-defaults` and `postgres-changed-default-applied` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30451](https://github.com/prisma/orm/pull/30451)) + + Before: + + ```ts + this.setDefault({ table: 'user', column: 'role', defaultSql: "DEFAULT 'member'" }) + ``` + + After: + + ```ts + this.setDefault({ table: 'user', column: col('role', 'text', { default: lit('member'), codecRef: { codecId: 'pg/text@1' } }) }) + ``` + +- **A TypeScript contract must list the extensions whose codecs it uses.** `defineContract` from `@prisma/orm-postgres/contract-builder` or `@prisma/orm-sqlite/contract-builder` takes each column's database type from its codec's data type. A contract that uses a pgvector, PostGIS or arktype-json column without listing that extension in `extensions` fails with `CONTRACT.CODEC_DESCRIPTOR_MISSING`. A `vector(length)` or `geometry({ srid })` argument out of range now fails `defineContract` with `CONTRACT.TYPE_PARAMS_INVALID`, not the helper call. On SQLite, emit again: `contract.d.ts` gains rows for `char` and `varchar`. See `ts-contract-lists-extension-codecs`, `column-helpers-raise-type-params-invalid` and `sqlite-contract-d-ts-char-aggregates` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30547](https://github.com/prisma/orm/pull/30547)) + +- **A write on a collection that may have no filter does not compile.** Chaining methods now return the collection's own class, so a filtered collection is a subtype of an unfiltered one. `update`, `updateAll`, `delete`, `deleteAll` and their `AndCount` forms on a collection filtered on some code paths only no longer compile. `cursor` and `distinctOn` check the order on the collection itself, so a cast on the argument no longer gets past the check. In a custom collection class, an override of a chaining method takes a `this` parameter, and a member named `apply` or `scope` with another signature must be renamed. Read a collection's type state and row with `CollectionTypeStateOf` and `CollectionRowOf`, and drop explicit type arguments on `include`, `distinct` and `distinctOn`. See the entries from `writes-on-a-conditional-collection-are-refused` to `chaining-methods-take-no-explicit-type-arguments`, and `scope-is-a-collection-member`, in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30560](https://github.com/prisma/orm/pull/30560), [#30564](https://github.com/prisma/orm/pull/30564)) + + ```ts + const posts = search ? db.Post.published() : db.Post; + await posts.deleteAll(); // now a type error: posts may have no filter + ``` + +- **Bulk writes refuse a `limit`, `offset`, `cursor` or `distinct` they would ignore.** `updateAll`, `updateAndCount`, `deleteAll` and `deleteAndCount` change every row that matches the filter. They used to ignore these, so `where(...).limit(10).deleteAll()` deleted every matching row. They now throw `ORM.ARGUMENT_INVALID`. `update` with a relation callback throws on a collection with an order, limit, offset, cursor or `distinct`. After `limit(0)`, `update` and `delete` change no row and return `null`. The `field` exported from `@prisma/orm-postgres/contract-builder` now checks `.default(...)` values against the column type at compile time. See `writes-refuse-what-they-would-ignore` and `imported-postgres-field-checks-defaults` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30564](https://github.com/prisma/orm/pull/30564)) + + Before: + + ```ts + await db.orm.public.Post.where({ userId }).limit(10).deleteAll(); + ``` + + After: + + ```ts + const ids = (await db.orm.public.Post.where({ userId }).select('id').limit(10).all()).map((p) => p.id); + await db.orm.public.Post.where((p) => p.id.in(ids)).deleteAll(); + ``` + +- **`variant()` takes the discriminator value, not the model name.** In the SQL and Mongo ORMs, `.variant()` takes the value a variant declares in `@@base(Task, "bug")`. A value the model does not declare, or a call on a model with no discriminator, throws `ORM.ARGUMENT_INVALID`; before, it returned the collection unchanged and read every variant. A second `.variant()` call is refused: select each variant from the base collection. A model name that equals a declared value still compiles, so check each call against the contract. See `variant-takes-discriminator-value` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30577](https://github.com/prisma/orm/pull/30577)) + + Before: + + ```ts + db.orm.public.Task.variant('Bug'); + ``` + + After: + + ```ts + db.orm.public.Task.variant('bug'); + ``` + +- **The cache middleware's store decides how long an entry lives.** `cacheAnnotation` no longer takes `ttl`, and every annotated read is now cached, including `cacheAnnotation({})`, which used to pass through. The default store keeps an entry for 60 seconds. `skip` is renamed `bypass`, and the type `CachePayload` is renamed `CacheAnnotationOptions`. `createCacheMiddleware` no longer takes `maxEntries` or `clock`: pass them to `createInMemoryCacheStore` and give that store to `createCacheMiddleware({ store })`. A custom `CacheStore` now keeps a version per key, with `get({ key, meta })`, `set(entry, value)` and a new required `unset({ keys, meta })`. See `cache-annotation-ttl-removed`, `cache-annotation-skip-renamed-bypass`, `cache-middleware-store-options` and `cache-store-object-arguments` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30530](https://github.com/prisma/orm/pull/30530)) + + Before: + + ```ts + const cache = createCacheMiddleware({ maxEntries: 500 }); + db.sql.public.user.select('id', 'email').annotate(cacheAnnotation({ ttl: 60_000 })); + ``` + + After: + + ```ts + const cache = createCacheMiddleware({ store: createInMemoryCacheStore({ maxEntries: 500 }) }); + db.sql.public.user.select('id', 'email').annotate(cacheAnnotation({})); + ``` + +- **`prisma7Schema` and `contract infer` read dates as text.** A Prisma 7 `DateTime` column, and `@db.Timestamp`, `@db.Timestamptz`, `@db.Date` and `@db.Time` columns, now read and write strings such as `"2026-09-14 10:00:00.123"`, not `Temporal` values, so the application needs no `Temporal`. `contract infer` writes `TimestampString(p)`, `TimestamptzString(p)`, `DateString` and `TimeString(p)` for these columns. Emit again, change code that treats these fields as `Temporal` values, then run `prisma db sign`. A contract inferred earlier keeps its types until `contract infer` runs again. See `prisma7-schema-date-types-are-text` and `contract-infer-writes-text-date-types` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30553](https://github.com/prisma/orm/pull/30553)) + + Before: + + ```prisma + model User { + createdAt Timestamp(3) @default(now()) + } + ``` + + After: + + ```prisma + model User { + createdAt TimestampString(3) @default(now()) + } + ``` + +- **The `pg.sql` and `sqlite.sql` tags are removed.** Write `sql`; the stored default does not change. Four PSL diagnostic codes for written values are renamed: `PSL_UNKNOWN_DEFAULT_LITERAL_TAG` is now `PSL_UNKNOWN_LITERAL_TAG`, `PSL_INVALID_JSON_LITERAL` is now `PSL_INVALID_LITERAL`, `PSL_DEFAULT_TYPE_INCOMPATIBLE` is now `PSL_VALUE_TYPE_INCOMPATIBLE` (or `PSL_DEFAULT_LIST_EXPECTED` for a single value on a list column), and most cases of `PSL_INVALID_DEFAULT_LITERAL` are now `PSL_INVALID_LITERAL`. See `prefixed-sql-tags-are-removed` and `default-diagnostic-codes-changed` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30534](https://github.com/prisma/orm/pull/30534)) + + Before: + + ```prisma + createdAt DateTime @default(pg.sql`(now() + interval '1 hour')`) + ``` + + After: + + ```prisma + createdAt DateTime @default(sql`(now() + interval '1 hour')`) + ``` + +- **A Prisma 6 MongoDB `Int` is stored as a BSON long.** A contract read with `prisma6Schema(...)` gives a plain `Int` field, and `Int @db.Long`, the new `Int64Number` type: still a `number` in the application, but written as a BSON long, as Prisma 6 does. A document whose field holds a fraction now fails to read with `RUNTIME.DECODE_FAILED`: repair it, then emit again. A `Bytes @db.ObjectId` field reads as a 24-digit hex string and refuses a 12-byte `Buffer` or `Uint8Array`. See `prisma6-int-written-as-long` and `prisma6-bytes-objectid-is-hex` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30521](https://github.com/prisma/orm/pull/30521)) + +- **`db verify --strict` reports unclaimed tables as `CONTRACT.SCHEMA_VERIFICATION_FAILED`.** A database that holds tables no contract declares used to be reported as `CONTRACT.MARKER_REQUIRED`. The exit code is still 4. `CONTRACT.MARKER_REQUIRED` now only means the database has not been signed. A script that matches the old code must match the new one. See `strict-verify-unclaimed-code` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30601](https://github.com/prisma/orm/pull/30601)) + +- **Some contracts get a new storage hash once.** `contract infer` writes a `bytea` default as a base64 literal, `@default("aGVsbG8=")`, where it wrote a `sql` expression; a contract inferred again gets a new storage hash. An index, check or policy whose SQL holds both `--` and a line break gets a new name, and the next `migration plan` drops and recreates it. In both cases, sign the database or plan the migration as the recipe says. See `contract-infer-writes-bytea-default-literals` and `sql-with-a-line-comment-gets-a-new-wire-name` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30603](https://github.com/prisma/orm/pull/30603), [#30546](https://github.com/prisma/orm/pull/30546)) + +- **Mongo validators accept a `null` list.** For a nullable list such as `String[]?`, the collection validator now admits `null`, so the storage hash changes. Emit the contract again, then plan and apply a migration that updates the validator before you write a `null` list. See `mongo-nullable-list-containers` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30568](https://github.com/prisma/orm/pull/30568)) + +- **Extension authors: SQL data types declare their names, and codecs take their data type.** Declare a SQL data type with `sqlDataType(id, { params, texts })` from `@internal/sql-contract/data-type`; its `texts` replace codec `targetTypes`, the `nativeType()` and `expandNativeType` hooks and `normalizeNativeType`. A codec's `paramsSchema` is its data type's `params`, and `postgresCodec` and `sqliteCodec` take the data type object. Run the `contract-stores-data-type` script on your contract space, raise your peer dependency floor to this release, and publish a `--data-type` line for each codec you own. The Postgres runtime driver now returns every column as server text, so a codec's `decode` receives text. A built-in codec's `decodeJson` refuses JSON that is not a stored form of its type. `SelectAstOptions` takes `locking`, DDL nodes hold SQL as `OpaqueSql`, `RenameCheckConstraintCall` is now `RenameConstraintCall`, `ControlFamilyInstance` gains `signSpaces`, and the SQLite target drops `sqlite/json`, `sqlite/datetime` and `sqlite/bigint`. See the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30547](https://github.com/prisma/orm/pull/30547), [#30576](https://github.com/prisma/orm/pull/30576), [#30597](https://github.com/prisma/orm/pull/30597), [#30451](https://github.com/prisma/orm/pull/30451), [#30549](https://github.com/prisma/orm/pull/30549), [#30546](https://github.com/prisma/orm/pull/30546), [#30331](https://github.com/prisma/orm/pull/30331), [#30534](https://github.com/prisma/orm/pull/30534)) + + Before: + + ```ts + export const pgvectorVector: DataType = dataType('pgvector/vector', { listCast }); + ``` + + After: + + ```ts + export const pgvectorVector = sqlDataType('pgvector/vector', { + params: pgvectorVectorParams, + texts: [{ text: 'vector({length})', written: true, catalog: true }], + listCast, + }); + ``` + +## Features + +- **The typed SQL builder locks the rows a select reads.** A select gains `forUpdate()`, `forNoKeyUpdate()`, `forShare()` and `forKeyShare()`, each with optional `of`, `nowait` and `skipLocked`. The methods exist only where the database supports them, so they are absent on SQLite. Emit the contract again to get the capabilities that enable them (`re-emit-for-the-row-locking-capabilities`). ([#30549](https://github.com/prisma/orm/pull/30549)) + + ```ts + tx.sql.public.job.select('id').where((f, fns) => fns.eq(f.state, 'queued')).limit(1).forUpdate({ skipLocked: true }).build() + ``` + +- **Scopes.** `db.orm.scope(fields, body)` defines a scope for any model that has the given fields, such as a soft-delete filter. `db.orm.public.Post.scope(body)` defines one for a single model, and `CollectionRowOf` names the row it produces. `orderByField` turns a sort field from a request into a checked order. `apply(fn)` runs any scope on a collection. ([#30564](https://github.com/prisma/orm/pull/30564), [#30560](https://github.com/prisma/orm/pull/30560)) +- **Custom collection methods chain.** Methods of a custom collection class stay available after `where`, `orderBy`, `limit`, `include` and the other chaining methods: `db.Post.where({ userId }).published()` compiles. ([#30560](https://github.com/prisma/orm/pull/30560)) +- **Middleware gains an `afterTransaction` stage.** It fires once per query when its effects are final, after the enclosing transaction commits or rolls back, with `result.outcome` set to `committed`, `rolled-back` or `unknown`. ([#30614](https://github.com/prisma/orm/pull/30614)) +- **The cache middleware can invalidate entries.** `cache.invalidate({ keys })` removes entries by the key a `cacheAnnotation({ key })` named, and `cache.invalidate({ meta })` removes entries by the `meta` a read carried, with a store that indexes it. `deriveKey` replaces how keys are made for reads that name none. ([#30530](https://github.com/prisma/orm/pull/30530)) +- **A hand-written migration can rename a table.** `this.renameTable({ table: 'userProfile', to: 'UserProfile' })` in a migration made with `prisma migration new` renames the table and the constraints and indexes named after it, on Postgres and SQLite, and keeps its rows. ([#30331](https://github.com/prisma/orm/pull/30331)) +- **List elements can be `null`.** `String?[]` allows `null` elements, `String[]?` allows a `null` list, and `String?[]?` allows both. In TypeScript, write `.many({ elementsNullable: true })`. ([#30051](https://github.com/prisma/orm/pull/30051)) +- **`db sign` signs every contract space.** It verifies the application's space and each extension's, then signs every space that verified in one transaction. ([#30576](https://github.com/prisma/orm/pull/30576)) +- **Hover in the PSL language server.** Hovering a model, field, type or block shows its declaration and its `///` doc comment. Hovering an attribute, argument key, function, constant or contributed type shows its signature and documentation. ([#30569](https://github.com/prisma/orm/pull/30569), [#30591](https://github.com/prisma/orm/pull/30591)) +- **Go to definition and find references in the PSL language server.** Both work across every schema file of the project, for models, composite types, named types, blocks, fields and namespaces. ([#30578](https://github.com/prisma/orm/pull/30578), [#30621](https://github.com/prisma/orm/pull/30621)) +- **Completion in block values.** The language server completes the values of a block such as `policy_select`, including in lists and function calls, and offers `ns.` for namespaces. A block value can name an entity in another namespace, as in `target = auth.Account`. Completion now follows the same name lookup as diagnostics. ([#30567](https://github.com/prisma/orm/pull/30567), [#30545](https://github.com/prisma/orm/pull/30545)) +- **`prisma6Schema` reads more Prisma 6 MongoDB schemas.** It accepts every native type Prisma 6 accepts except `DateTime @db.Timestamp`, and a dotted index path such as `@@index([author.name])` gets a clear diagnostic in place of a parse error. `prisma orm init` recognises a Prisma 6 MongoDB project. ([#30521](https://github.com/prisma/orm/pull/30521)) + +## Fixes + +- The Postgres driver returns every column as server text, so a `jsonb` column holding a JSON string such as `"standard"` reads back as that string. Before, it failed with `RUNTIME.DECODE_FAILED`, and `"123"` read as a number. An `interval` reads the text Postgres prints, and a computed boolean in a SQL builder select reads as `true`, not `'t'`. ([#30597](https://github.com/prisma/orm/pull/30597)) +- A query after `close()` fails once with `DRIVER.NOT_CONNECTED: Runtime is closed`, and work already started finishes. Before, a query returned without `await` from an `await using` scope failed with a misleading marker error or an unhandled rejection. ([#30533](https://github.com/prisma/orm/pull/30533)) +- `contract infer` and `prisma7Schema` contracts work on Node without `Temporal`. A text `timestamp` column filled with `now`, including Prisma 7's `@updatedAt`, receives UTC time on a host outside UTC (`text-timestamp-now-is-utc`). ([#30553](https://github.com/prisma/orm/pull/30553)) +- A `Bytes` literal default and a pgvector list default no longer roll back `db init`, `db update` and `db migrate` with `MIGRATION.SCHEMA_VERIFY_FAILED`. A `Bytes` default may be written as base64 or as Postgres hex. ([#30603](https://github.com/prisma/orm/pull/30603)) +- On SQLite, a `now()` default stores the same text the application writes, so rows that took the default compare and sort correctly. Existing tables keep their old default. ([#30612](https://github.com/prisma/orm/pull/30612)) +- On Postgres, verification accepts a column written with a type alias such as `varchar` or `int`, or without a length, and a `numeric` column takes a negative scale. Library errors no longer include the connection string. ([#30451](https://github.com/prisma/orm/pull/30451)) +- A Postgres `setDefault` with no default, or with `autoincrement()`, is refused with `CONTRACT.DEFAULT_INVALID` before it writes an invalid statement. A `sql/float@1` list on Postgres reads as numbers, not strings. ([#30552](https://github.com/prisma/orm/pull/30552)) +- Three Postgres column defaults are read correctly: a `json[]` default with an unquoted array element, a `jsonb[]` default holding a number too large for JavaScript, and an uncast nested `text[]` default. ([#30501](https://github.com/prisma/orm/pull/30501)) +- A raw SQL check, index or policy that ends in a `--` comment produces valid DDL. ([#30546](https://github.com/prisma/orm/pull/30546)) +- A generated `migration.ts` writes SQL that holds both quote kinds as a template literal, without backslashes. ([#30554](https://github.com/prisma/orm/pull/30554)) +- `migration status` and `db migrate` resolve `@contract` and `@db`, and each command's help lists only the reference forms it accepts. `db sign` and `db update --to` refuse a reserved reference with `MIGRATION.REF_WRONG_GRAMMAR`. Without a connection, the suggested retry command keeps your flags. ([#30475](https://github.com/prisma/orm/pull/30475)) +- After handing migrations from Prisma 7 to Prisma 8, the first `migration plan` names the baseline so it sorts before the change it plans. ([#30601](https://github.com/prisma/orm/pull/30601)) +- On MongoDB, a nullable list field accepts an explicit `null`. Before, the database validator refused it. ([#30568](https://github.com/prisma/orm/pull/30568)) +- An unknown or misspelled type name reports one diagnostic, `PSL_UNRESOLVED_REFERENCE: Cannot find type "…"`, in both the SQL and Mongo families. A field preset written without a call, such as `temporal.createdAt`, reports `PSL_PRESET_NOT_CALLED`. ([#30563](https://github.com/prisma/orm/pull/30563), [#30538](https://github.com/prisma/orm/pull/30538)) +- A `view` block is read as model fields only in Prisma 7 and Prisma 6 schemas. In a Prisma 8 schema it is an unsupported block like any other. ([#30507](https://github.com/prisma/orm/pull/30507)) From 62ee0df97523adb276d16dd31c18d09beb9c0844 Mon Sep 17 00:00:00 2001 From: willbot Date: Wed, 7 Oct 2026 09:22:57 +0200 Subject: [PATCH 3/3] docs(release): name the data-type-in-contract script by its file name in the notes Signed-off-by: willbot Signed-off-by: Will Madden --- CHANGELOG.md | 6 +++--- docs/releases/v8.0.0-rc.15.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 844287e5c0a7..6b258acd9d98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ Changelog tracking starts at **v0.12.0**, the first release cut after this conve In this release, each column in a SQL contract names its data type, such as `pg/text`, in place of the type name the database prints. One script and `prisma db sign` upgrade a project. Codecs now check every value a contract stores, and a field's type in the contract matches its column. Custom collection classes keep their methods through the chain, and scopes let you share a piece of a query across models. The typed SQL builder can lock the rows a select reads. Middleware gains an `afterTransaction` stage, and the cache middleware gains invalidation. A hand-written migration can rename a table with `this.renameTable`. Lists can hold `null` elements. The PSL language server adds hover, go to definition and find references. -The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/) and the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). Each breaking change below names the change id to look for in them. Run the `contract-stores-data-type` script before any other step that emits a contract again. +The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/) and the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). Each breaking change below names the change id to look for in them. Run the `data-type-in-contract` script (change `contract-stores-data-type`) before any other step that emits a contract again. ## Breaking changes @@ -36,7 +36,7 @@ The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm prisma db sign ``` -- **A list's cardinality is stored as an object.** A list field or column in `contract.json` stores `many: { elementNullable: false }` where it stored `many: true`, and `many: true` is refused. For SQL contracts, the `contract-stores-data-type` script makes this change. Emit MongoDB contracts again, and refresh their historical snapshots with the migrations that name them. A contract object written by hand changes the same way. See `reemit-explicit-list-cardinality` and `refresh-historical-list-contracts` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30051](https://github.com/prisma/orm/pull/30051)) +- **A list's cardinality is stored as an object.** A list field or column in `contract.json` stores `many: { elementNullable: false }` where it stored `many: true`, and `many: true` is refused. For SQL contracts, the `data-type-in-contract` script of `contract-stores-data-type` makes this change. Emit MongoDB contracts again, and refresh their historical snapshots with the migrations that name them. A contract object written by hand changes the same way. See `reemit-explicit-list-cardinality` and `refresh-historical-list-contracts` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30051](https://github.com/prisma/orm/pull/30051)) - **Codecs check every value a contract stores.** A TypeScript `.default()` or `enumType` member that its column's codec does not take is refused when the contract is built, with `CONTRACT.DEFAULT_INVALID` or `CONTRACT.ENUM_INVALID`. A PSL enum member or literal default that the column's type does not hold is refused by `contract emit`. A TypeScript enum member must be written as the column stores it, so an upper-case uuid member is refused with the value to write instead. Emit contracts again: the domain half now carries the type parameters and enum values of fields typed by a named type, of enum lists and of composite type members. Hashes do not change for that. Other changes: a `textArray()` element is typed `string | null`, a `char(n)` value reads without its padding through `.include()` too, NaN on SQLite throws `RUNTIME.ENCODE_FAILED`, an upper-case or braced uuid default is stored as PostgreSQL writes it, and an attribute on a composite type is refused. See `domain-types-match-their-columns`, `codecs-check-stored-json`, `psl-values-checked-by-codecs`, `ts-enum-member-written-as-stored` and the other entries of the same names in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30451](https://github.com/prisma/orm/pull/30451), [#30512](https://github.com/prisma/orm/pull/30512)) @@ -148,7 +148,7 @@ The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm - **Mongo validators accept a `null` list.** For a nullable list such as `String[]?`, the collection validator now admits `null`, so the storage hash changes. Emit the contract again, then plan and apply a migration that updates the validator before you write a `null` list. See `mongo-nullable-list-containers` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30568](https://github.com/prisma/orm/pull/30568)) -- **Extension authors: SQL data types declare their names, and codecs take their data type.** Declare a SQL data type with `sqlDataType(id, { params, texts })` from `@internal/sql-contract/data-type`; its `texts` replace codec `targetTypes`, the `nativeType()` and `expandNativeType` hooks and `normalizeNativeType`. A codec's `paramsSchema` is its data type's `params`, and `postgresCodec` and `sqliteCodec` take the data type object. Run the `contract-stores-data-type` script on your contract space, raise your peer dependency floor to this release, and publish a `--data-type` line for each codec you own. The Postgres runtime driver now returns every column as server text, so a codec's `decode` receives text. A built-in codec's `decodeJson` refuses JSON that is not a stored form of its type. `SelectAstOptions` takes `locking`, DDL nodes hold SQL as `OpaqueSql`, `RenameCheckConstraintCall` is now `RenameConstraintCall`, `ControlFamilyInstance` gains `signSpaces`, and the SQLite target drops `sqlite/json`, `sqlite/datetime` and `sqlite/bigint`. See the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30547](https://github.com/prisma/orm/pull/30547), [#30576](https://github.com/prisma/orm/pull/30576), [#30597](https://github.com/prisma/orm/pull/30597), [#30451](https://github.com/prisma/orm/pull/30451), [#30549](https://github.com/prisma/orm/pull/30549), [#30546](https://github.com/prisma/orm/pull/30546), [#30331](https://github.com/prisma/orm/pull/30331), [#30534](https://github.com/prisma/orm/pull/30534)) +- **Extension authors: SQL data types declare their names, and codecs take their data type.** Declare a SQL data type with `sqlDataType(id, { params, texts })` from `@internal/sql-contract/data-type`; its `texts` replace codec `targetTypes`, the `nativeType()` and `expandNativeType` hooks and `normalizeNativeType`. A codec's `paramsSchema` is its data type's `params`, and `postgresCodec` and `sqliteCodec` take the data type object. Run the `data-type-in-contract` script on your contract space, raise your peer dependency floor to this release, and publish a `--data-type` line for each codec you own. The Postgres runtime driver now returns every column as server text, so a codec's `decode` receives text. A built-in codec's `decodeJson` refuses JSON that is not a stored form of its type. `SelectAstOptions` takes `locking`, DDL nodes hold SQL as `OpaqueSql`, `RenameCheckConstraintCall` is now `RenameConstraintCall`, `ControlFamilyInstance` gains `signSpaces`, and the SQLite target drops `sqlite/json`, `sqlite/datetime` and `sqlite/bigint`. See the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30547](https://github.com/prisma/orm/pull/30547), [#30576](https://github.com/prisma/orm/pull/30576), [#30597](https://github.com/prisma/orm/pull/30597), [#30451](https://github.com/prisma/orm/pull/30451), [#30549](https://github.com/prisma/orm/pull/30549), [#30546](https://github.com/prisma/orm/pull/30546), [#30331](https://github.com/prisma/orm/pull/30331), [#30534](https://github.com/prisma/orm/pull/30534)) Before: diff --git a/docs/releases/v8.0.0-rc.15.md b/docs/releases/v8.0.0-rc.15.md index 0c5177fd4417..437cfec1c1b7 100644 --- a/docs/releases/v8.0.0-rc.15.md +++ b/docs/releases/v8.0.0-rc.15.md @@ -2,7 +2,7 @@ In this release, each column in a SQL contract names its data type, such as `pg/text`, in place of the type name the database prints. One script and `prisma db sign` upgrade a project. Codecs now check every value a contract stores, and a field's type in the contract matches its column. Custom collection classes keep their methods through the chain, and scopes let you share a piece of a query across models. The typed SQL builder can lock the rows a select reads. Middleware gains an `afterTransaction` stage, and the cache middleware gains invalidation. A hand-written migration can rename a table with `this.renameTable`. Lists can hold `null` elements. The PSL language server adds hover, go to definition and find references. -The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/) and the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). Each breaking change below names the change id to look for in them. Run the `contract-stores-data-type` script before any other step that emits a contract again. +The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/) and the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). Each breaking change below names the change id to look for in them. Run the `data-type-in-contract` script (change `contract-stores-data-type`) before any other step that emits a contract again. ## Breaking changes @@ -28,7 +28,7 @@ The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm prisma db sign ``` -- **A list's cardinality is stored as an object.** A list field or column in `contract.json` stores `many: { elementNullable: false }` where it stored `many: true`, and `many: true` is refused. For SQL contracts, the `contract-stores-data-type` script makes this change. Emit MongoDB contracts again, and refresh their historical snapshots with the migrations that name them. A contract object written by hand changes the same way. See `reemit-explicit-list-cardinality` and `refresh-historical-list-contracts` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30051](https://github.com/prisma/orm/pull/30051)) +- **A list's cardinality is stored as an object.** A list field or column in `contract.json` stores `many: { elementNullable: false }` where it stored `many: true`, and `many: true` is refused. For SQL contracts, the `data-type-in-contract` script of `contract-stores-data-type` makes this change. Emit MongoDB contracts again, and refresh their historical snapshots with the migrations that name them. A contract object written by hand changes the same way. See `reemit-explicit-list-cardinality` and `refresh-historical-list-contracts` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30051](https://github.com/prisma/orm/pull/30051)) - **Codecs check every value a contract stores.** A TypeScript `.default()` or `enumType` member that its column's codec does not take is refused when the contract is built, with `CONTRACT.DEFAULT_INVALID` or `CONTRACT.ENUM_INVALID`. A PSL enum member or literal default that the column's type does not hold is refused by `contract emit`. A TypeScript enum member must be written as the column stores it, so an upper-case uuid member is refused with the value to write instead. Emit contracts again: the domain half now carries the type parameters and enum values of fields typed by a named type, of enum lists and of composite type members. Hashes do not change for that. Other changes: a `textArray()` element is typed `string | null`, a `char(n)` value reads without its padding through `.include()` too, NaN on SQLite throws `RUNTIME.ENCODE_FAILED`, an upper-case or braced uuid default is stored as PostgreSQL writes it, and an attribute on a composite type is refused. See `domain-types-match-their-columns`, `codecs-check-stored-json`, `psl-values-checked-by-codecs`, `ts-enum-member-written-as-stored` and the other entries of the same names in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30451](https://github.com/prisma/orm/pull/30451), [#30512](https://github.com/prisma/orm/pull/30512)) @@ -140,7 +140,7 @@ The upgrade recipes for this hop: the [app recipe](https://github.com/prisma/orm - **Mongo validators accept a `null` list.** For a nullable list such as `String[]?`, the collection validator now admits `null`, so the storage hash changes. Emit the contract again, then plan and apply a migration that updates the validator before you write a `null` list. See `mongo-nullable-list-containers` in the [app recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/app/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30568](https://github.com/prisma/orm/pull/30568)) -- **Extension authors: SQL data types declare their names, and codecs take their data type.** Declare a SQL data type with `sqlDataType(id, { params, texts })` from `@internal/sql-contract/data-type`; its `texts` replace codec `targetTypes`, the `nativeType()` and `expandNativeType` hooks and `normalizeNativeType`. A codec's `paramsSchema` is its data type's `params`, and `postgresCodec` and `sqliteCodec` take the data type object. Run the `contract-stores-data-type` script on your contract space, raise your peer dependency floor to this release, and publish a `--data-type` line for each codec you own. The Postgres runtime driver now returns every column as server text, so a codec's `decode` receives text. A built-in codec's `decodeJson` refuses JSON that is not a stored form of its type. `SelectAstOptions` takes `locking`, DDL nodes hold SQL as `OpaqueSql`, `RenameCheckConstraintCall` is now `RenameConstraintCall`, `ControlFamilyInstance` gains `signSpaces`, and the SQLite target drops `sqlite/json`, `sqlite/datetime` and `sqlite/bigint`. See the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30547](https://github.com/prisma/orm/pull/30547), [#30576](https://github.com/prisma/orm/pull/30576), [#30597](https://github.com/prisma/orm/pull/30597), [#30451](https://github.com/prisma/orm/pull/30451), [#30549](https://github.com/prisma/orm/pull/30549), [#30546](https://github.com/prisma/orm/pull/30546), [#30331](https://github.com/prisma/orm/pull/30331), [#30534](https://github.com/prisma/orm/pull/30534)) +- **Extension authors: SQL data types declare their names, and codecs take their data type.** Declare a SQL data type with `sqlDataType(id, { params, texts })` from `@internal/sql-contract/data-type`; its `texts` replace codec `targetTypes`, the `nativeType()` and `expandNativeType` hooks and `normalizeNativeType`. A codec's `paramsSchema` is its data type's `params`, and `postgresCodec` and `sqliteCodec` take the data type object. Run the `data-type-in-contract` script on your contract space, raise your peer dependency floor to this release, and publish a `--data-type` line for each codec you own. The Postgres runtime driver now returns every column as server text, so a codec's `decode` receives text. A built-in codec's `decodeJson` refuses JSON that is not a stored form of its type. `SelectAstOptions` takes `locking`, DDL nodes hold SQL as `OpaqueSql`, `RenameCheckConstraintCall` is now `RenameConstraintCall`, `ControlFamilyInstance` gains `signSpaces`, and the SQLite target drops `sqlite/json`, `sqlite/datetime` and `sqlite/bigint`. See the [extension recipe](https://github.com/prisma/orm/blob/v8.0.0-rc.15/skills/prisma-8/upgrading/extension/upgrades/8.0.0-rc.14-to-8.0.0-rc.15/). ([#30547](https://github.com/prisma/orm/pull/30547), [#30576](https://github.com/prisma/orm/pull/30576), [#30597](https://github.com/prisma/orm/pull/30597), [#30451](https://github.com/prisma/orm/pull/30451), [#30549](https://github.com/prisma/orm/pull/30549), [#30546](https://github.com/prisma/orm/pull/30546), [#30331](https://github.com/prisma/orm/pull/30331), [#30534](https://github.com/prisma/orm/pull/30534)) Before: