| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
db init, db update and migrate no longer strand the database when contract.d.ts is missing (#30293) ## Linked issue n/a — no Linear ticket; follows up the `db sign` preflight that landed in #30251 (after `db sign`, `migration plan` proposes only the change). ## Skill update n/a — no skill told users to keep `contract.d.ts` next to `contract.json` for the database commands, and the new error code carries its own fix (`prisma contract emit`). ## At a glance Before, with `contract.d.ts` missing, `db init` migrated the database, wrote the marker, then died on the snapshot write: ```text $ prisma db init … Database initialized ENOENT: no such file or directory, open '/app/prisma/contract.d.ts' $ echo $? 2 ``` No ref, no snapshot, and the next `migration plan` started from the wrong place. Now the command refuses before it connects: ```text $ prisma db init ✖ Failed to render contract types (CONTRACT.TYPES_RENDER_FAILED) The types for the contract at /app/prisma/contract.json could not be rendered: … Run prisma contract emit to see why the contract does not emit, fix it, then advance the ref again. ``` The snapshot's `contract.d.ts` is no longer read from disk at all. It is rendered from the `contract.json` being snapshotted: ```ts // packages/1-framework/3-tooling/cli/src/control-api/operations/ref-advancement.ts const rendered = await args.client.renderContractDts({ contract: args.contractJson, resolveImportSpecifier, }); ``` ## Decision This PR ships three things: 1. **`ControlClient.renderContractDts`.** Given a parsed `contract.json`, the client deserializes it through the family and renders `contract.d.ts` through the same `emit()` call `emit` uses, with the import specifiers the caller asks for. A snapshot is that JSON plus these declarations, so whoever writes a snapshot renders them from the JSON it is storing. 2. **Ref advancement renders before the database write.** `preflightRefAdvancement` validates the ref name, builds the project's import-specifier resolver, and renders the declarations through the client. `db sign`, `db init`, `db update`, and `migrate --advance-ref` all run it before anything is applied. The sibling-file read (`readContractIR`) and the after-the-fact `resolveRefAdvancementFields` are gone. 3. **A two-facade project manifest is a structured refusal.** Resolving the import root threw a bare `ImportRootError` when a `package.json` depends on both `@prisma/orm-postgres` and `@prisma/orm-mongo`. It now maps to `CLI.PROJECT_MANIFEST_INVALID`, naming the manifest. ## Reviewer notes - **Why render at all, given `migration.ts` imports the snapshot `.d.ts` by path.** That import is exactly why the file must exist on disk, and why it should be the declarations of that snapshot's JSON. Reading a sibling file only guaranteed that by convention. Rendering guarantees it by construction. - **`migrate` orders differently from `init` and `update`.** In [migrate.ts](packages/1-framework/3-tooling/cli/src/orm/migrate.ts) the preflight sits after `connect` and the marker read, right before `client.migrate`. A first cut hoisted it above `connect`, which made a missing `--to` snapshot beat the invariant pre-check that an existing test rightly expects to win. Reads before, the write after, is the property that matters. - **Environment drift is a deliberate behaviour change.** The rendered declarations reflect the packages installed now, not at emit time. If an extension was upgraded between `contract emit` and `db update`, the snapshot `.d.ts` differs from the project's `contract.d.ts`. The snapshot is then consistent with its JSON under the current install, which is the honest answer. - **Cost.** Each ref advance now runs the type render plus prettier, on a command that already connects to a database. - **The CLI test fixture package declares both facades.** That is why the two-facade error surfaced, and why the command tests now write their own single-facade manifest with `writeProjectManifest`. - **Deferred on purpose.** `migration plan` and `migration new` still read the sibling `.d.ts` when writing the destination snapshot ([migration-plan.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-plan.ts), [migration-new.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-new.ts)). They touch no database, and their offline tests use fake descriptors that cannot drive the real emitter. The `contractDts` field on the `contractAt` path stays for the same reason. ## How it fits together 1. **The client renders.** [client.ts](packages/1-framework/3-tooling/cli/src/control-api/client.ts) adds `renderContractDts` next to `emit`, both calling one private `emitArtifacts` so they cannot drift. Failures come back as `CONTRACT_VALIDATION_FAILED` (the family rejected the JSON) or `RENDER_FAILED` (the emitter refused it). The fixture client in [fixture-client.ts](packages/1-framework/3-tooling/cli/src/control-api/testing/fixture-client.ts) gets a matching default. 2. **The preflight maps.** [ref-advancement.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/ref-advancement.ts) turns those into `CONTRACT.VALIDATION_FAILED` and the new `CONTRACT.TYPES_RENDER_FAILED`, both locating the contract JSON. `buildRefAdvancementFields` becomes the pure after-the-write tail for `init` and `update`. 3. **The commands split around the write.** [init.ts](packages/1-framework/3-tooling/cli/src/orm/db/init.ts) and [update.ts](packages/1-framework/3-tooling/cli/src/orm/db/update.ts) compute the ref name and preflight before `connect`, then build the fields after the apply. [sign.ts](packages/1-framework/3-tooling/cli/src/orm/db/sign.ts) creates the client before its existing preflight so it can render. `migrate` preflights after resolving the apply contract and before applying. 4. **The manifest refusal.** [project-import-root.ts](packages/1-framework/3-tooling/cli/src/utils/project-import-root.ts) catches `ImportRootError` where it reads the manifest, so every caller of the resolver gets a structured error. ## Behavior changes & evidence - **`db init`, `db update`, and `migrate --advance-ref` refuse before any database write when the snapshot cannot be rendered**, with a structured code and a fix, instead of migrating and then exiting on a bare ENOENT. Implementation: [init.ts](packages/1-framework/3-tooling/cli/src/orm/db/init.ts), [update.ts](packages/1-framework/3-tooling/cli/src/orm/db/update.ts), [migrate.ts](packages/1-framework/3-tooling/cli/src/orm/migrate.ts). Evidence: [db-init.test.ts](packages/1-framework/3-tooling/cli/test/orm/db-init.test.ts), [migrate.test.ts](packages/1-framework/3-tooling/cli/test/orm/migrate.test.ts). - **Every ref advance stores declarations rendered from the snapshotted JSON**, and none of the four commands needs `contract.d.ts` on disk any more. `db sign` without the file now succeeds. Implementation: [ref-advancement.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/ref-advancement.ts). Evidence: [db-sign.ref-advancement.test.ts](packages/1-framework/3-tooling/cli/test/orm/db-sign.ref-advancement.test.ts), [ref-advancement.test.ts](packages/1-framework/3-tooling/cli/test/control-api/ref-advancement.test.ts). - **`renderContractDts` produces the text `emit` produces** for the same contract, and rewrites imports through the resolver it is given. Implementation: [client.ts](packages/1-framework/3-tooling/cli/src/control-api/client.ts). Evidence: [client.test.ts](packages/1-framework/3-tooling/cli/test/control-api/client.test.ts). - **A project depending on two database facades gets `CLI.PROJECT_MANIFEST_INVALID`** naming the manifest, instead of an uncaught error. Implementation: [project-import-root.ts](packages/1-framework/3-tooling/cli/src/utils/project-import-root.ts). Evidence: [project-import-root.test.ts](packages/1-framework/3-tooling/cli/test/utils/project-import-root.test.ts). - **Docs.** The migration-system subsystem doc says where a ref's snapshot declarations come from, and [error-reference.md](docs/reference/error-reference.md) documents `CONTRACT.TYPES_RENDER_FAILED`. ## Testing performed - `pnpm typecheck` in `@internal/cli` and `@internal/extension-sqlite` (against the rebuilt CLI dist) - `pnpm test` in `@internal/cli`: 116 files, 1472 tests - `pnpm test test/migrations/db-init-update.cli.test.ts` in the sqlite adapter (real stack) - `pnpm check:error-reference` - Review pass by a second agent; its findings (error-reference entry, two prose inaccuracies, a test path) are folded into the last commit ## Alternatives considered - **Keep reading the sibling `.d.ts`, just earlier.** This was the original proposal: give `init`, `update`, and `migrate` the same read-before-write preflight `db sign` got. It removes the stranded-database bug but keeps the snapshot's declarations coupled to whichever file happens to sit next to `contract.json`. Rendering makes the snapshot a pure function of its JSON and the installed stack. - **Stop storing `contract.d.ts` in the snapshot and render on read.** `migration.ts` imports `../../snapshots/<hash>/contract` by path and `tsc` has to find it without Prisma running, so the file must be materialised. Rendering at write time keeps that. - **A standalone renderer keyed off the config instead of a client method.** The CLI command tests mount fake control clients, and the fake families in those fixtures cannot drive the real emitter. Putting the renderer on the client gives those tests their seam and keeps the real path one function. - **Also switching `migration plan` and `migration new` to render.** Deferred; see reviewer notes. ## Checklist - [x] All commits are signed off (`git commit -s`) per the [DCO](../CONTRIBUTING.md#developer-certificate-of-origin-dco). - [x] I read [CONTRIBUTING.md](../CONTRIBUTING.md) and the change is scoped to one logical concern. - [x] Tests are updated. - [ ] The PR title is in `TML-NNNN: <sentence-case title>` form — no Linear ticket exists for this change; the prefix will be added if one is assigned. - [x] The **Skill update** section above is filled in. ## Notes for the reviewer See the reviewer notes above. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Ref-advancing commands now generate and store contract type declarations from the contract snapshot before migrations or reference updates. - Planning modes continue to show the proposed reference without applying changes. - **Bug Fixes** - Validation or type-generation failures now stop execution before database, migration, reference, or snapshot changes occur. - Invalid project manifests now produce structured, actionable CLI errors. - **Documentation** - Added reference documentation for contract type-generation failures and their effects. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: willbot <w.a.madden+machine@gmail.com> Signed-off-by: Will Madden <madden@prisma.io> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> | 18 小时前 | |
Complete recursive PSL attribute values (#30266) ## Summary Extend configured PSL attribute completion through nested functions, lists, records, literals, and namespace-correct field references. Attribute factories remain authoritative: completion inspects combinator metadata, never invokes parsing to choose alternatives, and preserves matching union/function signatures. Prerequisite: #30249 (merged). The maintainer explicitly waived Linear linking and the ticket-prefixed title convention. ## Classification boundary The classifier alone traverses cursor AST syntax and recovery. Concrete field/model/block contexts capture the precise nested grammar path, full replacement range, supplied keys, positional index, existing parentheses, and colon presence. Separate named-key, ambiguous-slot, and value providers consume those facts without rediscovering cursor syntax. Owner AST lookup remains only for symbol/spec resolution. ## Automatic completion and accepted edits The server advertises `['.', '@', '[', '(', '{', ':', ',']`. Suggestions remain contextual: list elements, function arguments, and record values use their configured grammar; arbitrary record keys yield no invented suggestions. Named-key acceptance inserts `key: `, with an empty value tab stop for snippet clients. Mid-key edits replace the whole key. Existing colons, whitespace, and values are preserved without a duplicate colon. Post-acceptance value suggestions require explicit client opt-in: ```ts initializationOptions: { completion: { supportsTriggerSuggestCommand: true } } ``` This is a Prisma-specific client contract, not a standard LSP capability. The playground advertises it through typed `clientOptions.initializationOptions`. Only literal `true` permits the fixed `editor.action.triggerSuggest` command on newly inserted named-key/value slots. Unsupported or non-opted-in clients retain normal plain/snippet completion without commands. Existing-colon edits and non-key candidates never issue this command. No arbitrary client-supplied command identifier or client-brand inference is used. The earlier changes also report empty SQL mappings as source diagnostics and preserve parser findings when interpretation unexpectedly fails. Failed diagnostic attempts are not cached, enabling same-version retry and later-edit recovery without changing successful caching or cancellation behavior. ## Reviewed checkpoint and scope Published head: `079d8d7b70f4ffde890d4b901e51ea3359530750`. Independent review passed for this commit and `550834e9b8872bb097d73172d76c420b102034cb`; both carry DCO sign-offs. The earlier classification checkpoint `91be96f533ee197c242515f6872ff5069a9432cf` also passed independent review. The latest changes are limited to language-server implementation, existing tests/documentation, CLI initialization expectations, and one playground client initialization line. No playground tests, dependencies, settings, or infrastructure were added. User-local README, Drive, and project edits are excluded. ## Verification - Language server: **470 tests passed**; CLI: **1,455 tests passed**. Negotiation tests were red before implementation and cover absent, invalid, false, and true opt-in, plain/snippet clients, existing-colon edits, and non-key candidates. - LS/CLI builds; LS/CLI/playground typechecks and lint; dependency lint; owned-scope diagnostics and diff checks passed. - Full staged-index legacy-name check: **7,343 files, zero violations**. User-local README edits were not changed to satisfy this gate. - PR-mode upgrade coverage passed against branch merge-base `1e8b6a627daab8c267ee3f4bdede2f284deaebf9`. No fetch/rebase or fabricated upgrade declarations for main-only changes were used. - Actual Nix Chromium 151 against rebuilt LS/CLI verified punctuation-triggered requests with `triggerKind: 2` and correct caret positions, contextual suggestions, separator insertion, and existing-colon preservation. - **Enter and Tab both immediately open the value popup without Ctrl+Space or additional punctuation**: nested Mongo `sort` offers `Asc`/`Desc`; SQL `onDelete` offers `NoAction`, `Restrict`, `Cascade`, `SetNull`, and `SetDefault`. CDP confirms initialization opt-in, the completion-item command, and the subsequent value-slot request. Existing-colon acceptance produces no misplaced popup. Zero browser JavaScript errors; workers returned HTTP 200. - Browser evidence: `/tmp/optin-browser-events.json`, `/tmp/optin-sql-browser-events.json`; screenshots `/tmp/optin-{Enter,Tab}-value-popup.png` and `/tmp/optin-sql-{Enter,Tab}-value-popup.png`. - Earlier controlled-exception browser regression verified parser/internal-error coexistence, same-version retry, non-looping deterministic failures, and later-edit recovery. This is historical evidence from the prior reviewed checkpoint, not a newly rerun recovery test. These are local test and real-browser results, **not a claim that remote CI is green**. The popup behavior is verified for the opted-in playground, not universally for all LSP clients. ## Compatibility Parser metadata exports remain additive; erased `ArgType`/`Param` contracts and inference are unchanged. No migration steps are introduced. Unrestricted literals, arbitrary record keys, unavailable cross-contract references, and unrelated generic-block parameter values do not invent suggestions. The language-server README documents the classification boundary and explicit client opt-in. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Expanded language-server autocomplete for nested arguments, literals, booleans, lists, records, functions, and field references. - Added context-aware suggestions for local and referenced model fields, including namespace resolution. - Added snippets for required arguments and nested values with tab stops. - Improved completion in incomplete expressions and while editing existing values. - Expanded completion triggers and optional suggestion retriggering after named-key insertion. - **Bug Fixes** - Empty mapped names now produce clear validation diagnostics. - Improved recovery and diagnostics when interpretation fails. - **Documentation** - Updated completion documentation with supported scenarios and trigger behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Steven McClankerton <tatarintsev@prisma.io> Co-authored-by: Steven McClankerton <tatarintsev@prisma.io> | 16 小时前 | |
migration plan and migration new no longer need contract.d.ts on disk; vitest configs cannot budget with timeouts.default (#30298) ## Linked issue n/a — the two follow-ups deferred from #30293 (db init, db update and migrate no longer strand the database when contract.d.ts is missing). ## Skill update n/a — no user-facing surface changes; `migration plan` and `migration new` stop needing a `contract.d.ts` next to `contract.json`, which no skill ever told users to keep. ## At a glance Before, `migration plan` copied whatever `contract.d.ts` sat next to `contract.json` into the snapshot store, after the package was already written: ```ts const [contractJsonRaw, contractDts] = await Promise.all([ readFile(destinationArtifacts.jsonPath, 'utf-8'), readFile(destinationArtifacts.dtsPath, 'utf-8'), ]); await writeContractSnapshot(migrationsDir, destHash, { contractJson: JSON.parse(contractJsonRaw), contractDts }); ``` Now it renders the declarations from the emitted JSON it already parsed, before anything is written, through the same client method the db commands use: ```ts // packages/1-framework/3-tooling/cli/src/control-api/operations/migration-plan.ts const rendered = await renderSnapshotDeclarations({ client: options.client, contractJson: emittedContractJson, contractJsonPath: contractPathAbsolute, resolveImportSpecifier, }); ``` And a vitest config can no longer do this: ```text $ pnpm lint:vitest-timeouts lint-vitest-timeouts: timeouts.default is 100ms (200ms on CI) and fails healthy tests; use timeouts.vitestPackageDefault, or timeouts.databaseOperation for a package that talks to a database: packages/a/vitest.config.ts:6 testTimeout: timeouts.default ``` ## Decision This PR ships three things: 1. **Every snapshot writer renders its declarations from the JSON it stores.** `migration plan` and `migration new` were the last two writers that copied the sibling `contract.d.ts` from disk. They now render through `renderContractDts` on the control client, before any package or store entry is written. With no reader left, `readContractSnapshotDts` and the `contractDts` field on `contractAt` are gone from `@internal/migration-tools`. 2. **`contract.d.ts` is generated from the canonical contract.** `emit()` canonicalised the contract for `contract.json` but generated the declarations from the contract as authored, so a snapshot rendered from the JSON could differ from the emitted file in the order of models, fields, relations, and the keys of literal types. The mongo e2e journey compares the two byte for byte and caught it. `emit()` now generates from the canonical JSON round-trip and the literal-type serializer sorts keys, so a render from `contract.json` reproduces the emitted file exactly. Every committed `contract.d.ts` fixture is re-emitted in that order; the diff is reordering only. 3. **A lint keeps `timeouts.default` out of vitest test and hook budgets.** #30293 swept 31 configs off the 100ms value that CI doubles into a false failure. `timeouts.default` stays, because tests use it for short waits, so the guard is a lint over tracked `vitest.config.ts` files, wired into `pnpm lint:vitest-timeouts`, `test:scripts`, and CI. ## Reviewer notes - **The fixture re-emit is large but mechanical.** 227 `contract.d.ts` files change, all of them collections reordered into canonical order. Nothing in `contract.json` changes. The in-flight upgrade entry for rc.11 to rc.12 declares `changes: []`, since a consumer who re-emits sees the same reordering and has nothing to do. - **The from-side snapshot writes are gone, not moved.** `migration plan` used to write the from contract's store entry when the origin was a ref or an auto-baseline. In both cases that contract came out of the store through `contractAt`, so the entry already existed and the write-if-absent store made the write a no-op. The same holds for a `--to` destination. Only the emitted contract can be new, so only it is rendered and written. - **The plan and new commands now take the client factory** like the db commands, with `migrationPlanCommand` and `migrationNewCommand` kept as the constants the family tree mounts. The command tests mount a fake client from [offline-project.ts](packages/1-framework/3-tooling/cli/test/orm/fixtures/offline-project.ts), whose fake family cannot drive the real emitter. - **`timeouts.default` is not retired.** Ten tests use it as a short wait: a connection timeout, a polling budget. The lint rejects it only as `testTimeout` or `hookTimeout` in a vitest config, and its doc comment now says so. ## How it fits together 1. **One helper renders for every writer.** [snapshot-declarations.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/snapshot-declarations.ts) takes a client, the JSON, its path and the project's import resolver, and returns the declarations or the same structured errors the ref preflight already produced. `preflightRefAdvancement` in [ref-advancement.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/ref-advancement.ts) now calls it. 2. **The scaffolding operations render before they write.** [migration-plan.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-plan.ts) renders right after the import resolver is built, ahead of the seed phase, and writes the destination entry with the planned package. [migration-new.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-new.ts) renders before `writeMigrationPackage`. 3. **The store stops serving declarations.** [aggregate.ts](packages/1-framework/3-tooling/migration/src/aggregate/aggregate.ts) reads only `contract.json` for `contractAt`; [plan-resolution.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/plan-resolution.ts) drops the fields nobody consumes. 4. **The lint.** [lint-vitest-timeouts.mjs](scripts/lint-vitest-timeouts.mjs) walks `git ls-files` for vitest configs and names each `testTimeout` or `hookTimeout` set to `timeouts.default`. ## Behavior changes & evidence - **`migration plan` and `migration new` refuse before writing anything when the destination's declarations cannot be rendered**, and write a snapshot whose `contract.d.ts` is rendered from the emitted JSON. Implementation: [migration-plan.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-plan.ts), [migration-new.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-new.ts). Evidence: [migration-plan.test.ts](packages/1-framework/3-tooling/cli/test/orm/migration-plan.test.ts), [migration-new.test.ts](packages/1-framework/3-tooling/cli/test/orm/migration-new.test.ts). - **Neither command needs `contract.d.ts` on disk any more.** The offline fixture stopped writing one, and every existing plan, new, and tamper test still passes. Evidence: [offline-project.ts](packages/1-framework/3-tooling/cli/test/orm/fixtures/offline-project.ts). - **`contractAt` no longer carries `contractDts`, and `readContractSnapshotDts` is gone.** Implementation: [contract-snapshot-store.ts](packages/1-framework/3-tooling/migration/src/contract-snapshot-store.ts), [types.ts](packages/1-framework/3-tooling/migration/src/aggregate/types.ts). Evidence: [contract-at.test.ts](packages/1-framework/3-tooling/migration/test/aggregate/contract-at.test.ts). - **A vitest config budgeting with `timeouts.default` fails CI.** Implementation: [lint-vitest-timeouts.mjs](scripts/lint-vitest-timeouts.mjs), [ci.yml](.github/workflows/ci.yml). Evidence: [lint-vitest-timeouts.test.mjs](scripts/lint-vitest-timeouts.test.mjs). - **Docs.** The migration-system subsystem doc describes the scaffolding snapshot write and states that nothing reads a `.d.ts` out of the store. ## Testing performed - `pnpm typecheck` and `pnpm test` in `@internal/migration-tools` (43 files, 601 tests), then `pnpm build` - `pnpm typecheck` and `pnpm test` in `@internal/cli` (116 files, 1476 tests) against the rebuilt migration-tools, then `pnpm build` - `pnpm typecheck` in `@internal/extension-sqlite` against the rebuilt CLI - `node --test scripts/lint-vitest-timeouts.test.mjs` (9 tests) and `pnpm lint:vitest-timeouts` on the repo - `pnpm test` in `@internal/emitter` (234 tests) and in the sql and mongo family emitters, then a full `pnpm build` - `pnpm fixtures:check` against the full build, and `pnpm check:upgrade-coverage --mode pr --prev origin/main` - `test/cli-journeys/mongo-migration.e2e.test.ts` in the integration suite, which compares a snapshot's `contract.d.ts` with the emitted one byte for byte ## Alternatives considered - **Render the from-side snapshots too.** Rendering an old snapshot's JSON under the current install could refuse a plan for a contract that already has a valid entry, for no gain: the write was a no-op. Dropping the write is both simpler and safer. - **Retire `timeouts.default`.** Its ten remaining uses are real short waits inside tests. A lint on the two config settings catches the class without taking a value away. - **Make the fake families in the offline fixtures render for real.** That would mean shipping a real target's serializer and emission hook into structural stand-ins. The client is the seam the db command tests already use, so the plan and new commands take the same factory. ## Checklist - [x] All commits are signed off (`git commit -s`) per the [DCO](../CONTRIBUTING.md#developer-certificate-of-origin-dco). - [x] I read [CONTRIBUTING.md](../CONTRIBUTING.md) and the change is scoped to one logical concern. - [x] Tests are updated. - [ ] The PR title is in `TML-NNNN: <sentence-case title>` form — no Linear ticket exists for this change. - [x] The **Skill update** section above is filled in. ## Notes for the reviewer See the reviewer notes above. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Migration creation and planning now generate contract declarations for destination snapshots. - Contract rendering errors prevent incomplete migration outputs from being written. - **Bug Fixes** - Improved migration snapshot consistency by deriving declarations from contract definitions. - Standardized generated contract declaration ordering for consistent output. - **Chores** - Added automated checks for inappropriate default timeout budgets in Vitest configurations. - **Documentation** - Clarified recommended timeout settings and migration contract snapshot behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: willbot <w.a.madden+machine@gmail.com> Signed-off-by: Will Madden <madden@prisma.io> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> | 13 小时前 | |
migration plan and migration new no longer need contract.d.ts on disk; vitest configs cannot budget with timeouts.default (#30298) ## Linked issue n/a — the two follow-ups deferred from #30293 (db init, db update and migrate no longer strand the database when contract.d.ts is missing). ## Skill update n/a — no user-facing surface changes; `migration plan` and `migration new` stop needing a `contract.d.ts` next to `contract.json`, which no skill ever told users to keep. ## At a glance Before, `migration plan` copied whatever `contract.d.ts` sat next to `contract.json` into the snapshot store, after the package was already written: ```ts const [contractJsonRaw, contractDts] = await Promise.all([ readFile(destinationArtifacts.jsonPath, 'utf-8'), readFile(destinationArtifacts.dtsPath, 'utf-8'), ]); await writeContractSnapshot(migrationsDir, destHash, { contractJson: JSON.parse(contractJsonRaw), contractDts }); ``` Now it renders the declarations from the emitted JSON it already parsed, before anything is written, through the same client method the db commands use: ```ts // packages/1-framework/3-tooling/cli/src/control-api/operations/migration-plan.ts const rendered = await renderSnapshotDeclarations({ client: options.client, contractJson: emittedContractJson, contractJsonPath: contractPathAbsolute, resolveImportSpecifier, }); ``` And a vitest config can no longer do this: ```text $ pnpm lint:vitest-timeouts lint-vitest-timeouts: timeouts.default is 100ms (200ms on CI) and fails healthy tests; use timeouts.vitestPackageDefault, or timeouts.databaseOperation for a package that talks to a database: packages/a/vitest.config.ts:6 testTimeout: timeouts.default ``` ## Decision This PR ships three things: 1. **Every snapshot writer renders its declarations from the JSON it stores.** `migration plan` and `migration new` were the last two writers that copied the sibling `contract.d.ts` from disk. They now render through `renderContractDts` on the control client, before any package or store entry is written. With no reader left, `readContractSnapshotDts` and the `contractDts` field on `contractAt` are gone from `@internal/migration-tools`. 2. **`contract.d.ts` is generated from the canonical contract.** `emit()` canonicalised the contract for `contract.json` but generated the declarations from the contract as authored, so a snapshot rendered from the JSON could differ from the emitted file in the order of models, fields, relations, and the keys of literal types. The mongo e2e journey compares the two byte for byte and caught it. `emit()` now generates from the canonical JSON round-trip and the literal-type serializer sorts keys, so a render from `contract.json` reproduces the emitted file exactly. Every committed `contract.d.ts` fixture is re-emitted in that order; the diff is reordering only. 3. **A lint keeps `timeouts.default` out of vitest test and hook budgets.** #30293 swept 31 configs off the 100ms value that CI doubles into a false failure. `timeouts.default` stays, because tests use it for short waits, so the guard is a lint over tracked `vitest.config.ts` files, wired into `pnpm lint:vitest-timeouts`, `test:scripts`, and CI. ## Reviewer notes - **The fixture re-emit is large but mechanical.** 227 `contract.d.ts` files change, all of them collections reordered into canonical order. Nothing in `contract.json` changes. The in-flight upgrade entry for rc.11 to rc.12 declares `changes: []`, since a consumer who re-emits sees the same reordering and has nothing to do. - **The from-side snapshot writes are gone, not moved.** `migration plan` used to write the from contract's store entry when the origin was a ref or an auto-baseline. In both cases that contract came out of the store through `contractAt`, so the entry already existed and the write-if-absent store made the write a no-op. The same holds for a `--to` destination. Only the emitted contract can be new, so only it is rendered and written. - **The plan and new commands now take the client factory** like the db commands, with `migrationPlanCommand` and `migrationNewCommand` kept as the constants the family tree mounts. The command tests mount a fake client from [offline-project.ts](packages/1-framework/3-tooling/cli/test/orm/fixtures/offline-project.ts), whose fake family cannot drive the real emitter. - **`timeouts.default` is not retired.** Ten tests use it as a short wait: a connection timeout, a polling budget. The lint rejects it only as `testTimeout` or `hookTimeout` in a vitest config, and its doc comment now says so. ## How it fits together 1. **One helper renders for every writer.** [snapshot-declarations.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/snapshot-declarations.ts) takes a client, the JSON, its path and the project's import resolver, and returns the declarations or the same structured errors the ref preflight already produced. `preflightRefAdvancement` in [ref-advancement.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/ref-advancement.ts) now calls it. 2. **The scaffolding operations render before they write.** [migration-plan.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-plan.ts) renders right after the import resolver is built, ahead of the seed phase, and writes the destination entry with the planned package. [migration-new.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-new.ts) renders before `writeMigrationPackage`. 3. **The store stops serving declarations.** [aggregate.ts](packages/1-framework/3-tooling/migration/src/aggregate/aggregate.ts) reads only `contract.json` for `contractAt`; [plan-resolution.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/plan-resolution.ts) drops the fields nobody consumes. 4. **The lint.** [lint-vitest-timeouts.mjs](scripts/lint-vitest-timeouts.mjs) walks `git ls-files` for vitest configs and names each `testTimeout` or `hookTimeout` set to `timeouts.default`. ## Behavior changes & evidence - **`migration plan` and `migration new` refuse before writing anything when the destination's declarations cannot be rendered**, and write a snapshot whose `contract.d.ts` is rendered from the emitted JSON. Implementation: [migration-plan.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-plan.ts), [migration-new.ts](packages/1-framework/3-tooling/cli/src/control-api/operations/migration-new.ts). Evidence: [migration-plan.test.ts](packages/1-framework/3-tooling/cli/test/orm/migration-plan.test.ts), [migration-new.test.ts](packages/1-framework/3-tooling/cli/test/orm/migration-new.test.ts). - **Neither command needs `contract.d.ts` on disk any more.** The offline fixture stopped writing one, and every existing plan, new, and tamper test still passes. Evidence: [offline-project.ts](packages/1-framework/3-tooling/cli/test/orm/fixtures/offline-project.ts). - **`contractAt` no longer carries `contractDts`, and `readContractSnapshotDts` is gone.** Implementation: [contract-snapshot-store.ts](packages/1-framework/3-tooling/migration/src/contract-snapshot-store.ts), [types.ts](packages/1-framework/3-tooling/migration/src/aggregate/types.ts). Evidence: [contract-at.test.ts](packages/1-framework/3-tooling/migration/test/aggregate/contract-at.test.ts). - **A vitest config budgeting with `timeouts.default` fails CI.** Implementation: [lint-vitest-timeouts.mjs](scripts/lint-vitest-timeouts.mjs), [ci.yml](.github/workflows/ci.yml). Evidence: [lint-vitest-timeouts.test.mjs](scripts/lint-vitest-timeouts.test.mjs). - **Docs.** The migration-system subsystem doc describes the scaffolding snapshot write and states that nothing reads a `.d.ts` out of the store. ## Testing performed - `pnpm typecheck` and `pnpm test` in `@internal/migration-tools` (43 files, 601 tests), then `pnpm build` - `pnpm typecheck` and `pnpm test` in `@internal/cli` (116 files, 1476 tests) against the rebuilt migration-tools, then `pnpm build` - `pnpm typecheck` in `@internal/extension-sqlite` against the rebuilt CLI - `node --test scripts/lint-vitest-timeouts.test.mjs` (9 tests) and `pnpm lint:vitest-timeouts` on the repo - `pnpm test` in `@internal/emitter` (234 tests) and in the sql and mongo family emitters, then a full `pnpm build` - `pnpm fixtures:check` against the full build, and `pnpm check:upgrade-coverage --mode pr --prev origin/main` - `test/cli-journeys/mongo-migration.e2e.test.ts` in the integration suite, which compares a snapshot's `contract.d.ts` with the emitted one byte for byte ## Alternatives considered - **Render the from-side snapshots too.** Rendering an old snapshot's JSON under the current install could refuse a plan for a contract that already has a valid entry, for no gain: the write was a no-op. Dropping the write is both simpler and safer. - **Retire `timeouts.default`.** Its ten remaining uses are real short waits inside tests. A lint on the two config settings catches the class without taking a value away. - **Make the fake families in the offline fixtures render for real.** That would mean shipping a real target's serializer and emission hook into structural stand-ins. The client is the seam the db command tests already use, so the plan and new commands take the same factory. ## Checklist - [x] All commits are signed off (`git commit -s`) per the [DCO](../CONTRIBUTING.md#developer-certificate-of-origin-dco). - [x] I read [CONTRIBUTING.md](../CONTRIBUTING.md) and the change is scoped to one logical concern. - [x] Tests are updated. - [ ] The PR title is in `TML-NNNN: <sentence-case title>` form — no Linear ticket exists for this change. - [x] The **Skill update** section above is filled in. ## Notes for the reviewer See the reviewer notes above. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Migration creation and planning now generate contract declarations for destination snapshots. - Contract rendering errors prevent incomplete migration outputs from being written. - **Bug Fixes** - Improved migration snapshot consistency by deriving declarations from contract definitions. - Standardized generated contract declaration ordering for consistent output. - **Chores** - Added automated checks for inappropriate default timeout budgets in Vitest configurations. - **Documentation** - Clarified recommended timeout settings and migration contract snapshot behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: willbot <w.a.madden+machine@gmail.com> Signed-off-by: Will Madden <madden@prisma.io> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> | 13 小时前 | |
Make Postgres targets own inbound list decoding (#30235) ## Linked issue Closes <https://github.com/prisma/orm/issues/30164>. No Linear ticket/project for this branch by request; this PR intentionally does not close or prefix a Linear issue. ## Summary Postgres list decoding now follows the contract-declared list shape instead of the driver's static parser table, so enum arrays and builtin arrays enter one target-owned decode path. The PR also records the approved fixed-scale numeric-list string migration and the direct-driver raw-array behavior. ## Skill update Updated the Prisma 8 app and extension upgrade instructions under `skills/prisma-8/upgrading/.../8.0.0-rc.11-to-8.0.0-rc.12/instructions.md`; no separate new skill is required because the migration guidance lives in the existing upgrade-skill surface. ## At a glance ```ts const created = await db.public.TestModel.create({ id: 4, enum: 'a', enum2: ['a', 'b'] }); expect(created).toEqual({ id: 4, enum: 'a', enum2: ['a', 'b'] }); const rows = await db.public.TestModel.select('id', 'enum2').all(); expect(rows).toEqual([ { id: 1, enum2: ['a', 'b'] }, { id: 2, enum2: ['a', 'c'] }, { id: 3, enum2: [] }, ]); expect(sql).not.toContain('::text[]'); ``` Before this change, database-local enum-array OIDs could arrive as raw `"{a,b}"` strings while registered builtin arrays arrived as native JS arrays, so identical contract-declared list fields could fail or decode through different paths. ## Decision This PR ships target-owned inbound Postgres list framing. The SQL runtime exposes a list-decoder hook, the Postgres target parses raw array text and applies the bound element codec, the Postgres driver returns registered array OIDs as raw text, and Postgres control-plane reads parse raw array fields before strict shared validation. [ADR 251](docs/architecture%20docs/adrs/ADR%20251%20-%20Target-owned%20Postgres%20list%20framing.md) records the ownership boundary and the approved fixed-scale numeric-list spelling consequence. ## Notes for the reviewer - The largest implementation diff is [packages/3-targets/6-adapters/postgres/src/core/control-adapter.ts](packages/3-targets/6-adapters/postgres/src/core/control-adapter.ts), because marker/control rows do not pass through SQL runtime row decoding and therefore need a narrow target-owned parse boundary before shared validation. - Numeric strings are intentionally not spelling-preserving for fixed-scale lists: `numeric(30,10)[]` can read back as `"1.5000000000"`; the operator explicitly approved keeping that scalar-parity behavior. - Direct lower-level Postgres driver consumers now receive registered array result columns as raw Postgres array literals; runtime callers still receive decoded application values. - `pnpm lint:docs` is not claimed green; it is blocked by unrelated untracked legacy package directories and was not repaired in this PR. - The default parallel `pnpm test:packages` run hit two shared-directory tarball setup races; the same root script passed with `--fileParallelism=false`, and no TypeScript errors were reported. ## How it fits together 1. [packages/3-targets/7-drivers/postgres/src/temporal-text-parsers.ts](packages/3-targets/7-drivers/postgres/src/temporal-text-parsers.ts) makes `pg` hand registered arrays back as raw server text, matching unknown enum-array OIDs that were already raw. 2. [packages/2-sql/5-runtime/src/codecs/decoding.ts](packages/2-sql/5-runtime/src/codecs/decoding.ts) keeps codec lookup, column context, null handling, abort handling, and error wrapping in the SQL runtime, but delegates `CodecRef.many` frame traversal to a target-supplied list decoder when present. 3. [packages/3-targets/3-targets/postgres/src/core/list-decoder.ts](packages/3-targets/3-targets/postgres/src/core/list-decoder.ts) parses only raw Postgres array text with `postgres-array`, preserves SQL null elements, and maps the existing bound element decoder over non-null values. 4. [packages/3-extensions/postgres/src/runtime/postgres-runtime.ts](packages/3-extensions/postgres/src/runtime/postgres-runtime.ts) wires the Postgres runtime to the target descriptor's list decoder without making the target import SQL runtime types. 5. [packages/3-targets/6-adapters/postgres/src/core/control-adapter.ts](packages/3-targets/6-adapters/postgres/src/core/control-adapter.ts) applies the same raw-text parser boundary to marker `invariants`, policy roles, and reloptions before target-agnostic validation or IR construction. 6. Package manifests, the lockfile, README updates, [ADR 251](docs/architecture%20docs/adrs/ADR%20251%20-%20Target-owned%20Postgres%20list%20framing.md), and the upgrade instructions disclose the runtime and migration consequences. ## Behavior changes & evidence - **Enum-array columns read as application arrays without projection casts.** Implementation: [list-decoder.ts](packages/3-targets/3-targets/postgres/src/core/list-decoder.ts), [decoding.ts](packages/2-sql/5-runtime/src/codecs/decoding.ts), and [postgres-runtime.ts](packages/3-extensions/postgres/src/runtime/postgres-runtime.ts). Evidence: [enum_filter.test.ts](test/integration/test/ports/engines/queries/filters/field_reference/enum_filter/enum_filter.test.ts) covers `create()` RETURNING, ordinary reads, type shape, and the no-`::text[]` SQL assertion. - **Builtin scalar lists decode through raw array text while preserving application values.** Implementation: [codecs.ts](packages/3-targets/3-targets/postgres/src/core/codecs.ts) and [codec-helpers.ts](packages/3-targets/3-targets/postgres/src/core/codec-helpers.ts). Evidence: [scalar-list-codec-roundtrip.integration.test.ts](packages/3-targets/6-adapters/postgres/test/scalar-list-codec-roundtrip.integration.test.ts), [psl-list-roundtrip.integration.test.ts](test/integration/test/scalar-lists/psl-list-roundtrip.integration.test.ts), and [list-decoder.test.ts](packages/3-targets/3-targets/postgres/test/list-decoder.test.ts). - **Registered Postgres arrays are raw at the direct-driver boundary.** Implementation: [temporal-text-parsers.ts](packages/3-targets/7-drivers/postgres/src/temporal-text-parsers.ts) and [exports/control.ts](packages/3-targets/7-drivers/postgres/src/exports/control.ts). Evidence: [driver.temporal-text.integration.test.ts](packages/3-targets/7-drivers/postgres/test/driver.temporal-text.integration.test.ts), [control.test.ts](packages/3-targets/7-drivers/postgres/test/control.test.ts), and [temporal-text-parsers.lazy-pg-types.test.ts](packages/3-targets/7-drivers/postgres/test/temporal-text-parsers.lazy-pg-types.test.ts). - **Control-plane array fields normalize before shared validation.** Implementation: [control-adapter.ts](packages/3-targets/6-adapters/postgres/src/core/control-adapter.ts). Evidence: [control-adapter.test.ts](packages/3-targets/6-adapters/postgres/test/control-adapter.test.ts), [adapter-errors.test.ts](packages/3-targets/6-adapters/postgres/test/adapter-errors.test.ts), and [marker-ledger-writes.test.ts](packages/3-targets/6-adapters/postgres/test/marker-ledger-writes.test.ts). - **Public packaging and upgrade surfaces include the parser dependency and migration note.** Implementation/docs: [packages/3-targets/3-targets/postgres/package.json](packages/3-targets/3-targets/postgres/package.json), [packages/3-targets/7-drivers/postgres/package.json](packages/3-targets/7-drivers/postgres/package.json), [packages/9-public/@prisma/orm-target-postgres/package.json](packages/9-public/@prisma/orm-target-postgres/package.json), [pnpm-lock.yaml](pnpm-lock.yaml), and the two `skills/prisma-8/upgrading/.../instructions.md` files. Evidence: root build/package-test validation plus pre-commit focused dependency lint. ## Testing performed - Primary LSP diagnostics on the 13 affected source files: clean, 0 diagnostics. - `pnpm build`: passed, 85 Turbo tasks successful. - `pnpm lint:deps`: passed, dependency-cruiser checked 2013 modules and 3131 dependencies; framework-target imports, app-space ID, and single-import-root checks passed. - `pnpm fixtures:check`: passed with no contract fixture diff. - `pnpm test:integration`: passed, 373 files / 2069 tests passed / 52 expected failures. - Postgres adapter package gate: passed, 871 tests passed / 3 expected failures / 1 skipped. - Manual QA: passed all three scenarios for enum ORM reads, corrupt marker rows, and runtime adapter scalar array edge inputs. - `pnpm test:packages --fileParallelism=false`: passed through the root script, 1184 files passed / 1 skipped; 15736 tests passed / 3 expected failures / 1 skipped; Type Errors: no errors. - `pnpm test:packages`: default parallel run failed in two public-shell tarball setup tests due shared-directory races (`ENOTEMPTY`/`EEXIST` under `packages/9-public/@prisma/orm-postgres/skills/prisma-8`); the failures are reported as caveats, not fixed here. - `git diff origin/main...HEAD --check`: passed. - Pre-commit hooks ran `biome format`, `biome check`, and focused dependency lint on staged files successfully. ## Compatibility / migration / risk Direct users of `@internal/driver-postgres` queries should treat array-valued result columns as raw Postgres array text. Runtime/ORM users keep decoded list values, except fixed-scale numeric lists can now expose database-normalized decimal strings such as `"1.5000000000"`; ADR 251 and the app/extension upgrade instructions disclose this. The `PG_TYPES_ARRAY_OIDS` copy is a maintenance point guarded by the new divergence test against `pg-types` registrations. ## Follow-ups No follow-up PR is required for the scoped ownership change. #30165 remains an explicit non-goal and is not auto-closed by this PR. ## Alternatives considered - **Accept native arrays and raw array text at the target boundary.** Rejected because it preserves the hidden two-path behavior where builtin arrays and enum arrays decode differently. - **Resolve array OIDs dynamically from Postgres catalogs.** Rejected because the contract already identifies list-valued columns, and catalog lookups would add connection state and invalidation without improving the semantic source of truth. - **Force projection casts such as `::text[]`.** Rejected because renderers and query authors should not need decode-policy casts that can alter query shape. - **Move outbound framing to the target in the same PR.** Rejected because outbound binding has different information requirements and `pg` already serializes JavaScript arrays under the SQL type context. ## Checklist - [x] All commits are signed off (`git commit -s`) per the [DCO](../CONTRIBUTING.md#developer-certificate-of-origin-dco). - [x] I read [CONTRIBUTING.md](../CONTRIBUTING.md) and the change is scoped to one logical concern. - [x] Tests are updated. - [x] The PR title intentionally omits a Linear prefix because this branch/project is explicitly no-Linear. - [x] The **Skill update** section above is filled in. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * PostgreSQL list values now use consistent target-side decoding, preserving nulls and supporting scalar and enum lists. * PostgreSQL numeric list elements retain database-defined precision and scale. * Bytea, numeric, and boolean codecs now accept PostgreSQL text wire formats. * PostgreSQL control-plane array values are parsed and validated consistently. * **Bug Fixes** * Improved errors for malformed PostgreSQL arrays, JSON, bytea, and marker rows. * **Documentation** * Added architecture, runtime behavior, driver policy, and upgrade guidance for PostgreSQL list handling. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Steven McClankerton <tatarintsev@prisma.io> Co-authored-by: Steven McClankerton <tatarintsev@prisma.io> | 11 小时前 | |
chore(release): bump to 8.0.0-rc.11 (#30272) ## Release: 8.0.0-rc.10 → 8.0.0-rc.11 This is the routine release PR per [docs/oss/versioning.md](https://github.com/prisma/prisma/blob/main/docs/oss/versioning.md). It bumps every workspace package to 8.0.0-rc.11 and moves every `@prisma/cli-engine` pin from 0.3.0 to 0.4.0. No other change has merged since rc.10; the engine move is the whole release. The engine change: `@prisma/cli-engine@0.4.0` adds a `--format markdown` output format to every command and widens the engine's `Format` type from `"human" | "json"` to `"human" | "json" | "markdown"` ([prisma/prisma-cli#260](https://github.com/prisma/prisma-cli/pull/260)). No other public API changed. `@prisma/orm-toolchain` peers the engine at an exact version, so the toolchain has to republish to run under a host CLI on 0.4.0. The lockfile change is exactly the engine resolution (0.3.0 → 0.4.0, same peers) plus the routine `workspace:` specifier bumps. Review surface: [docs/releases/v8.0.0-rc.11.md](https://github.com/prisma/prisma/blob/release/8.0.0-rc.11/docs/releases/v8.0.0-rc.11.md) is the release notes file that becomes the GitHub Release body. The matching `CHANGELOG.md` entry and the `8.0.0-rc.10-to-8.0.0-rc.11` upgrade recipes (app and extension) are included; `check:upgrade-coverage` requires the recipes because the bump touches `examples/` and `packages/3-extensions/`. The supabase contract fixtures carry the new version stamp, as in every release. **Merging this PR ships the release**: the push to `main` carries the bumped root `version`, the `Publish to npm` workflow detects the change and publishes 8.0.0-rc.11 under `latest`, creates a pre-release GitHub Release from the notes file, then publishes `8.0.0-rc.11-dev.1` under `dev`. Local verification: `check:release-notes` (PR mode), `check:upgrade-coverage`, and `test:scripts` (507 tests) pass; the CLI tooling package's typecheck and its 1455 tests pass against engine 0.4.0. `fixtures:check` passes against a local Postgres (the emitted contracts are unchanged apart from the version stamp). 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * CLI commands now support Markdown output through `--format markdown`, alongside human-readable and JSON formats. * **Breaking Changes** * The CLI engine requirement is updated to version 0.4.0. * **Documentation** * Added release notes and upgrade guidance for applications and extensions, including refreshed generated contract metadata. * **Release Updates** * Updated Prisma 8 packages, examples, fixtures, and tooling to version 8.0.0-rc.11. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: willbot <w.a.madden+machine@gmail.com> Signed-off-by: Will Madden <madden@prisma.io> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> | 2 天前 |