Prisma Release Notes
269 release notes curated from 54 sources by the Releasebot Team. Last updated: Sep 25, 2026
- Sep 24, 2026
- Date parsed from source:Sep 24, 2026
- First seen by Releasebot:Sep 25, 2026
v8.0.0-rc.12
Prisma ships v8.0.0-rc.12 with Postgres full-text search, prepared ORM reads and aggregates, multi-file schema support, and Prisma 7 schema compatibility as a Prisma 8 contract source. It also tightens schema rules and updates migration and config behavior.
Breaking changes
The engine peer moves to @prisma/[email protected], and prisma.config.ts must import definePrismaConfig. @prisma/orm-toolchain peers the engine at an exact version, and this release peers 0.6.1 (up from 0.4.0). Projects assembled by the prisma CLI resolve the engine automatically; a project that pins @prisma/cli-engine itself must move the pin to 0.6.1. The engine no longer exports the deprecated defineConfig alias, so a config file that imports defineConfig from @prisma/cli-engine fails to load until it imports definePrismaConfig. The defineConfig helper from a product package such as @prisma/orm-postgres/config keeps its name. The new engine also changes how config files are read. It collects every prisma.config.ts from the current directory (or from the file passed to --config) up to the repository root, which is the first directory with a .git entry, and merges them key by key, with the nearest file winning; a project under a stray parent config now inherits its values, so remove that file or add parent: false to the project's config. A relative path such as contract or migrations.dir now resolves from the directory of the config file that wrote it, not from the working directory. Under the prisma CLI, a malformed orm field is reported as CLI.CONFIG_FIELD_INVALID, naming the field and the file, inside CLI.CONFIG_SECTION_INVALID, where it used to be CONFIG.VALIDATION_FAILED. See engine-pin-moves-to-0-6-1, config-paths-resolve-from-declaring-file and define-config-becomes-define-prisma-config in the app recipe. (#30372, #30129, prisma/prisma-cli#233, prisma/prisma-cli#279, prisma/prisma-cli#280, prisma/prisma-cli#284)
Before:
import { defineConfig } from '@prisma/cli-engine'; export default defineConfig({ ... });After:
import { definePrismaConfig } from '@prisma/cli-engine'; export default definePrismaConfig({ ... });A PSL model without @@map names its table exactly as written. model UserProfile used to read and write the table "userProfile". It now uses "UserProfile", and Mongo collections follow the same rule. Before you plan a migration, run the add-model-map script from the upgrade recipe over every .prisma file, including the contract.prisma copies under migrations/. It adds @@map("<current table name>") to each model that has none, so the emitted contract, the storage hash and the database stay the same. Run it once, and only on a schema written for an earlier release. If you plan without it, migration plan, db update and migrate stop with MIGRATION.TABLE_NAME_CASE_CHANGED instead of dropping the table and creating an empty one. Mongo has no planner, so an unmapped model reads an empty collection without any error; run the script before you deploy. contract infer follows the same rule, so a table already named "UserProfile" now infers without @@map and verifies clean. See psl-model-names-table-verbatim in the app recipe and the extension recipe. (#30317, #30321)
Before:
model UserProfile { id Int @id email String }After:
model UserProfile { id Int @id email String @@map("userProfile") }Every PSL schema file needs // use prisma-8 as its first line. contract emit now reads only the files that carry this header, which is how a schema split across several files knows its members (see Features). A file without it is left out of the contract without a warning, and when no file has it, emit fails with PSL_NO_OPTED_IN_SCHEMA_FILES. The older // use prisma-next header still counts. orm init already writes the header, and the upgrade recipe has a script that adds it to every file that lacks it. See psl-schema-requires-use-prisma-8-directive in the app recipe. (#30379)
dbgenerated(...) is removed, and a raw SQL default is written as a sql tagged literal. @default(dbgenerated("...")) now fails with PSL_UNKNOWN_DEFAULT_FUNCTION, and the message names the replacement. Write now() and autoincrement() as the named functions, a JSON value as a json literal, an enum member or a text value as a quoted string, and any other SQL as @default(sql
...). sqlnow()and sqlautoincrement()are refused. contract infer prints raw defaults in the new form. The JSON and enum rewrites change the default in contract.json from an expression to a literal, so the storage hash moves; the live default already matches, so no migration is needed. In the TypeScript contract builder, .defaultSql('...') is deprecated and will be removed in 8.0.0: write .default(now()), .default(autoincrement()) or .default(sql...) instead. A Prisma 7 schema read through prisma7Schema keeps its dbgenerated. See dbgenerated-removed-from-psl and default-sql-method-deprecated in the app recipe and the extension recipe. (#30325, #30380, #30347)Before:
id String @id @default(dbgenerated("gen_random_uuid()")) createdAt DateTime @default(dbgenerated("now()")) expiresAt DateTime @default(dbgenerated("(now() + '00:03:00'::interval)"))After:
id String @id @default(sql`gen_random_uuid()`) createdAt DateTime @default(now()) expiresAt DateTime @default(sql`(now() + '00:03:00'::interval)`)A written default must be a value its column's data type accepts. Every value written in PSL now has a data type, decided by how it is written, and a column takes it only if the column's type accepts that type. A quoted string therefore no longer works as a JSON, decimal or float default. Write a JSON default as a json literal, a decimal as a bare number, and NaN and Infinity without quotes. A list default on a column that holds one JSON value is one json literal, such as @default(json
[1, 2]). A refused default fails with PSL_DEFAULT_TYPE_INCOMPATIBLE and names the types the column accepts. Numbers now keep every digit: a Decimal or Numeric default emits as decimal text ("1.50"), and a BigInt default larger than 2^53 now emits instead of failing. A contract with such a default gets a new storage hash, so re-emit it and run prisma db sign. The same applies to a BigIntNumber column (pg/int8number@1 or sqlite/bigintnumber@1) with a literal default, which now stores digit text. contract infer prints each default in a form contract emit reads back. See a-json-default-is-a-json-tag, a-decimal-default-is-written-unquoted, a-float-non-finite-default-is-written-bare, a-json-list-default-is-one-json-literal, number-valued-64-bit-columns-store-their-default-as-digit-text and psl-number-defaults-keep-digits in the app recipe. (#30350, #30287)Before:
meta Jsonb @default("{}") price Decimal @default("1.50") ratio Float @default("NaN")After:
meta Jsonb @default(json`{}`) price Decimal @default(1.50) ratio Float @default(NaN)Creation timestamp presets use the application clock. temporal.createdAt() and temporal.createdAtString(), and the matching field.temporal.* helpers, no longer declare a database default. The ORM sets the value on create, from the same clock as the matching updatedAt preset. Re-emit the contract and apply a migration that removes the old database defaults. After that, code that inserts rows with raw SQL must supply the timestamp itself. To keep a database-generated value, use an explicit timestamp type with @default(now()). A preset backed by Temporal now needs a global Temporal before writes as well as reads. See client-generated-created-at-presets in the app recipe. (#30330)
Re-emit Postgres contracts: the query operation types moved from the adapter to the target. The emitted contract.d.ts now imports QueryOperationTypes from @prisma/orm-postgres/target/operation-types. The old subpath, @prisma/orm-postgres/adapter/operation-types, is gone, so a contract.d.ts emitted by an earlier release stops type-checking until you run prisma contract emit. Change any import of the old subpath in your own code the same way. contract.json does not change. See re-emit-the-contract-for-the-moved-query-operation-types in the app recipe. (#30348)
prepare callbacks on the Postgres and SQLite clients receive only the params. The callback no longer gets a SQL builder as its first argument; use the client's own .sql property instead. Calls to .query(target, params) do not change. See params-only-sql-facade-prepare in the app recipe. (#30260)
Before:
const query = await db.prepare({ id: 'pg/int4@1' }, (sql, params) => sql.public.users.select('id').where((f, fns) => fns.eq(f.id, params.id)).build(), );After:
const query = await db.prepare({ id: 'pg/int4@1' }, (params) => db.sql.public.users.select('id').where((f, fns) => fns.eq(f.id, params.id)).build(), );Native Postgres enum columns no longer offer text operations. Postgres has no LIKE, ILIKE or text search for an enum type, so like and ilike on a native enum column always failed when the query ran. They are now type errors, the new full-text operations do not accept such a column, and @@fullTextIndex on it is refused when the contract is built. Compare the column with eq or in instead. An enum stored as text (@@type("pg/text@1")) keeps every text operation. See native-enum-columns-have-no-text-operations in the app recipe. (#30390)
The Postgres target decodes list columns. Enum list columns now read back as arrays on every path, including create() results, without a cast in the SQL. Two values change. An element of a fixed-scale numeric list reads the way Postgres prints it: a numeric(30,10)[] element written as 1.5 reads as "1.5000000000". A row read directly through the lower-level Postgres driver returns a list column as raw Postgres array text, such as '{a,b}'. ORM and SQL builder reads still return JavaScript arrays. Update assertions and snapshots that pin those values. See postgres-target-owned-list-framing in the app recipe. (#30235)
migration new picks its starting point the way migration plan does, and three error codes are removed. Without --from, migration new used to build on the newest migration. It now starts from the db ref, or from an empty database when there are no migrations, and otherwise refuses with MIGRATION.PLAN_ORIGIN_UNKNOWN. A db ref on an empty migration graph is refused with a pointer to migration plan, which writes the baseline. Pass --from in scripts that relied on the old default. The CLI no longer looks for a single newest migration, so a migration history with two branches now reports the real error, such as MIGRATION.HASH_NOT_IN_GRAPH. MIGRATION.AMBIGUOUS_TARGET, MIGRATION.NO_TARGET and MIGRATION.NO_INITIAL_MIGRATION are removed, and graphTip and graphTipHash are no longer in the JSON meta of the errors that carried them. See migration-new-defaults-to-the-db-ref and migration-tip-error-codes-removed in the app recipe. (#30389)
The Supabase extension's contract changed, so re-sign databases that use it. @prisma/orm-extension-supabase now declares the two nullable list columns it used to leave out (storage.buckets.allowed_mime_types and storage.objects.path_tokens), the 43 check constraints of its reference Supabase build, its native enum defaults as member values, and its JSON defaults as json literals. Its storage hash changes, so run prisma db sign against every database signed with the previous version; if you re-emit your own contract, do that first. Your own contract.json does not change. If your Supabase build's check constraints differ from the reference build (supabase/postgres 17.6.1.106), db verify now reports the missing ones. See supabase-contract-declares-nullable-list-columns and supabase-contract-regenerated-from-the-reference-fixture in the extension recipe. (#30318, #30346, #30380)
Changes for extension authors. These affect packages built on @prisma/orm-framework, the @prisma/orm-family-* packages and @prisma/orm-toolchain. Each item names its change id in the extension recipe, except the last.
Every codec descriptor names the data type it represents in a required dataType, and a pack registers its data types, with their casts, through dataTypes on its component metadata. Casts replace literalTypes and each codec's list of accepted shapes, decodeJson takes only the data type's canonical form, and PSL support for a data type is an authoring entry under authoring.dataTypes. See every-codec-descriptor-names-a-data-type and the entries that follow it. (#30350)
A codec without params sets paramsSchema to undefined, and voidParamsSchema is removed (codec-without-params-has-no-params-schema). (#30372)
An extension that pins @prisma/cli-engine moves the pin to 0.6.1, and a config section's validate receives a second provenance argument (engine-pin-moves-to-0-6-1). (#30372)
emit() from @prisma/orm-toolchain/emitter requires a deserializeContract option and writes contract.d.ts in the order of contract.json (emit-requires-deserialize-contract). (#30319)
QueryOperationTypes moves from the Postgres adapter to the Postgres target (query-operation-types-move-to-the-postgres-target). (#30348)
SqlLoweringSpec loses its unused strategy field; delete it from operation descriptors (sql-lowering-spec-drops-strategy). (#30373)
pg/enum@1 no longer has the textual trait, so an operation declared on textual no longer attaches to native enum columns (native-enum-codec-is-not-textual). (#30390)
For prepared queries, an expression's codec moves to returnType.codec, ORM preparation uses the shared Preparable type, PreparedParamRef keeps its declared nullability, and the limit and offset in CollectionState and GroupPagingState can be expressions (expression-codec-on-return-type, shared-preparable-envelope, preserve-prepared-reference-nullability, preserve-orm-pagination-expressions, preserve-grouped-orm-pagination-expressions). (#30260, #30309, #30373, #30284)
A Postgres codec used for list columns receives each element as raw text (postgres-list-element-codecs-receive-raw-strings). (#30235)
parseRawDefault is no longer exported from family/psl-infer; import parsePostgresDefault from @prisma/orm-postgres/target/default-normalizer (psl-infer-raw-default-parser-is-target-owned). (#30287)
Code that runs several inserts for one logical create passes one defaultValueCache to all of them (share-create-default-cache-across-inserts). (#30330)
The PSL parser API changed. fieldAttribute, modelAttribute and blockAttribute require documentation, and identifier(name) takes { documentation } as a second argument. entityRef() takes a selector, such as entityRef({ kind: 'model' }), and returns the declaration it resolved; use identifier() for a name that is not checked. parse() requires a file name as its second argument, and the interpreter input takes a documents list in place of document. See psl-attribute-specs-are-documented, psl-entity-ref-takes-a-selector and psl-parse-takes-a-file-name in the extension recipe. (#30312, #30344, #30335, #30379)
Features
Postgres full-text search
Text columns gain fullTextMatches, fullTextRank and fullTextHeadline in the ORM and the SQL builder. The query argument is a tsquery, built with websearchToTsquery, plaintoTsquery, phrasetoTsquery or toTsquery from @prisma/orm-postgres/target/full-text, or with the tsquery template tag, which turns each interpolated value into one quoted term so user input cannot add operators. A bare string is a type error. @@fullTextIndex([field]) in PSL, or fullTextIndex(cols.field) in the TypeScript contract builder, creates the GIN index these queries use. Give the index and the operation the same language; otherwise Postgres does not use the index. examples/prisma-8-demo searches post titles end to end. (#30348, #30386, #30376)
model Post { id Int @id title String @@fullTextIndex([title], name: "post_title_search") }import { websearchToTsquery } from '@prisma/orm-postgres/target/full-text'; const q = websearchToTsquery(input); const posts = await db.orm.public.Post.select('id', 'title') .where((p) => p.title.fullTextMatches(q)) .orderBy((p) => p.title.fullTextRank(q).desc()) .all();A Prisma 7 schema as the contract source, on Postgres
prisma7Schema('prisma/schema.prisma') from @prisma/orm-postgres/config reads a Prisma 7 schema directly, so Prisma 8 can run beside Prisma 7 on the database Prisma 7 migrates. contract emit and db sign work as usual; run both again after each Prisma 7 migration. A construct Prisma 8 cannot describe exactly, such as a view, is an error that names the line and a Prisma 7 edit that removes it. prisma orm init --from-prisma7-schema prisma/schema.prisma sets this up, and a plain prisma orm init in a Prisma 7 project offers to. It checks that Prisma 8 can read the schema before it changes anything, keeps Prisma 7 installed as @prisma/prisma7 with its config renamed to prisma7.config.ts and its scripts pointed at prisma7, and writes the Prisma 8 config and client under src/prisma/. It does not touch prisma/ or the database. (#30287, #30291)
import { definePrismaConfig } from 'prisma/config'; import { defineConfig as ormConfig, prisma7Schema } from '@prisma/orm-postgres/config'; export default definePrismaConfig({ orm: ormConfig({ contract: prisma7Schema('prisma/schema.prisma'), db: { connection: process.env['DATABASE_URL']! }, }), });Schemas split across several files
The contract option accepts a glob such as './prisma/**/*.prisma'. Every matching file that starts with // use prisma-8 becomes part of one schema, and a new file joins it on the next emit without a config change. The default output goes in the glob's fixed directory (./prisma/contract.json), and orm format formats every file. Namespace blocks with the same name in one file now merge into one namespace. (#30379, #30343)
Prepared ORM reads and aggregates
Inside db.prepare(...), an ORM query can end in .prepared.all(), .prepared.first() or .prepared.aggregate(...), on ordinary and grouped collections. The query is built once. Each .query(target, params) call runs it with new values against the runtime, connection or transaction you pass, and returns the same result shape as the ordinary call. Reading included relations also does less work per row. (#30260, #30309, #30289, #30284)
const byId = await db.prepare({ id: 'pg/int4@1' }, (p) => db.orm.public.User.select('id').prepared.first({ id: p.id }), ); await byId.query(runtime, { id: 2 }); // { id: 2 }createAll and createAndCount can skip rows that collide with a unique constraint
Pass { onConflict: 'skip' }, and optionally conflictOn: ['email'] to name the constraint. createAll returns only the rows the database wrote, and createAndCount counts only those. Postgres and SQLite support it; multi-table inheritance variants refuse it. Re-emit your contract before you use it: the option needs two new capabilities that a contract from an earlier release does not list (re-emit-for-the-insert-conflict-skip-capabilities in the app recipe). (#30365)
JavaScript Date timestamps on Postgres
TimestamptzJsDate(p) in PSL, field.temporal.timestamptzJsDate() in TypeScript, and the createdAtJsDate() and updatedAtJsDate() presets read and write Date values, with no Temporal polyfill. A Date keeps milliseconds only. (#30288)
Editor support for attribute arguments
The language server shows signature help for attribute arguments, completes values inside nested arguments (lists, records, function calls and field references), names the placeholders in its snippets, and suggests only scalar fields where an attribute expects one. (#30312, #30266, #30329)
Each finding when a contract source fails to load
CONTRACT.SOURCE_LOAD_FAILED carries a diagnostics array, with one entry per finding giving its code, its summary and, where known, its file and line. The terminal prints them. meta.diagnostics and meta.issues are unchanged. (#30287)
Fixes
A command that reads a migration snapshot now checks that the file's content still matches the hash it is filed under, and stops with MIGRATION.CONTRACT_SNAPSHOT_CONTENT_MISMATCH if the file was edited. migration check reports the same problem as MIGRATION.CHECK_SNAPSHOT_CONTENT_MISMATCH. Before, an edited snapshot could make migration plan report no changes. This covers SQL targets; Mongo snapshots are not checked yet. (#30086)
migration plan warns when planning from the db ref would branch the migration history, and asks for consent before it writes a baseline with destructive operations, the way db update does (in scripts, pass --no-interactive --confirm <directory>). migration new --from now refuses a hash on an empty migrations directory, and a hash prefix that matches more than one migration, instead of ignoring them. (#30084)
db init, db update, db sign, migrate, migration plan and migration new no longer need contract.d.ts on disk. They render the snapshot's types from contract.json, and refuse with CONTRACT.TYPES_RENDER_FAILED before writing to the database if that fails. Before, a missing contract.d.ts let db init change the database and then exit on a file error without setting the ref. A package.json that depends on both @prisma/orm-postgres and @prisma/orm-mongo is now reported as CLI.PROJECT_MANIFEST_INVALID. (#30293, #30298)
contract emit writes contract.d.ts in the order of contract.json, so your next emit reorders the models, fields and relations in that file and changes nothing else. (#30298, #30319)
contract infer prints a nullable Postgres list column as Type[]? instead of as a required list. (#30313)
db verify on Postgres reads more default forms as values: negative and cast numbers, enum values cast to a type in another schema, timestamp values without a time zone, and ARRAY[...] lists. Columns reported as different for these now verify clean. Introspection now reads with fixed session settings (TimeZone = UTC, ISO dates), so a contract inferred from a server outside UTC may show one difference in a timestamptz value inside a check constraint or index predicate; re-emit and re-sign once. (#30287)
A "now" value that the ORM generates for a timestamp column without a time zone, such as temporal.timestamp(onUpdate: now), no longer fails at write time. (#30287)
createAndCount returns the number of rows the database inserted, not the length of the input array. (#30365)
The TypeScript contract builder reports a type error at defineContract when a model's ids, uniques, indexes or foreign keys share a name. The check existed but never fired, so a contract that reuses a name now fails to type-check. (#30373, #30387)
In the TypeScript contract builder, a foreign key to a model in another contract space whose .sql() stage is a function is now an authoring error (CONTRACT.FOREIGN_KEY_INVALID). Before, it produced a REFERENCES clause to a guessed lowercase table name. Give the target model a static .sql({ table: '...' }). (#30323)
@@base(...) can name a model declared later in the file. An argument that names no model, or names something that is not a model, is reported at the argument as PSL_INVALID_ATTRIBUTE_SYNTAX; PSL_BASE_TARGET_NOT_FOUND is removed. (#30344)
--confirm now works in an interactive terminal, and a command that prompted exits when it finishes instead of waiting for a key press. (prisma/prisma-cli#283)
The bundled prisma-8 agent skill: its upgrade references name the published @prisma/orm-* packages, its CI guidance deploys with one db migrate command, and its migration reference says that migration new refuses a db ref on an empty migration graph. (#30283, #30382, #30391)
Original source - Sep 24, 2026
- Date parsed from source:Sep 24, 2026
- First seen by Releasebot:Sep 25, 2026
v8.0.0-rc.12-dev.1: chore(release): bump to 8.0.0-rc.12 (#30395)
Prisma ships 8.0.0-rc.12, bumping workspace packages and Prisma dependencies, publishing the prerelease on npm, and updating release notes and upgrade guides. It also fixes publish workflow issues, conformance validation, and telemetry SDK rename updates.
Release: 8.0.0-rc.11 → 8.0.0-rc.12
This is the release PR described in docs/oss/versioning.md.
It bumps every workspace package to 8.0.0-rc.12 and moves the Prisma dependencies to their latest versions.
Merging this PR ships the release. The push to main carries the new root version. The Publish to npm workflow then publishes 8.0.0-rc.12 under latest and creates a pre-release GitHub Release from the notes file.
Review these first
docs/releases/v8.0.0-rc.12.md: the release notes, which become the GitHub Release body. The same entry is at the top of CHANGELOG.md.
The upgrade guides for apps and extensions.
They merge the 24 pending fragments. The original fragments are moved unchanged to upgrade-instructions/releases/8.0.0-rc.11-to-8.0.0-rc.12/sources/.
Four guide entries have no fragment behind them. The migration new default and its removed error codes (#30389) had no guide entry. Neither did the PSL parser API changes (#30312, #30344, #30335, #30379). I wrote those entries while preparing the release.
Where fragments contradicted later code, the guide follows the code. Examples: the Supabase storage hash, voidParamsSchema, and quoted defaults printed by infer.
Dependency updates
Package From To Where @prisma/cli-engine 0.4.0 0.6.1 examples, test fixtures, apps (the toolchain packages were already on 0.6.1 from #30372) @prisma/dev 0.25.1 0.25.2 the workspace catalog @prisma/compute-sdk ^0.39.0 ^0.43.0 apps/telemetry-backend @prisma/management-api-sdk ^1.56.0 ^1.76.0 apps/telemetry-backendcompute-sdk 0.43 renames "service" to "app" and "version" to "deployment". The telemetry deploy script now uses the new names. Both SDK versions call /v1/apps/{appId}, so the ID stored in the existing TELEMETRY_DEPLOY_SERVICE_ID secret is still correct. The app's typecheck now includes scripts/, so it catches the next SDK rename.
The repo does not depend on @prisma/composer.
Fixes needed to publish
The publish workflow has failed on main since #30372.
check:conformance called the orm config validator as validate(value). Engine 0.6 always calls validate(value, provenance), and the validator reads provenance.files, so it threw on every input. The check now passes the same provenance the engine would. The prisma-cli copy of this check already does this.
set-version rewrote workspace:@internal/cli@<version> to workspace:<version>, dropping the alias. The prisma7-adoption example uses that alias. This is the first bump since the alias was added.
lint:legacy-name and the add-model-map test pointed at the pending fragment paths. They now point at the archived sources.
Verification
Passed locally:
- pnpm build
- pnpm typecheck
- pnpm lint
- pnpm test:scripts (563 tests)
- pnpm check:conformance
- pnpm check:publish-deps
- pnpm check:upgrade-coverage, in both publish and PR mode
- pnpm check:release-notes, in both publish and PR mode
- pnpm lint:legacy-name
- pnpm lint:skills
- pnpm test:packages: all 18,196 tests passed
Not covered locally, left to CI:
- Three test:packages suites install packed tarballs from the registry. This machine's pnpm refuses @vercel/[email protected] because it has no provenance. CI passed the same suites on #30390.
- prisma-8-cloudflare-worker needs a local Hyperdrive database.
- The telemetry backend tests need Node 24.16 with Temporal. This machine has 24.13.
- fixtures:check needs Postgres.
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Added PostgreSQL full-text search, multi-file schemas, prepared ORM reads and aggregates, and conflict-skipping options for bulk creation.
Added support for using a Prisma 7 schema as the contract source, JavaScript Date timestamps on PostgreSQL, editor support for attribute arguments, and per-finding diagnostics.
Breaking Changes
Prisma 8 schema files now require // use prisma-8 on the first line; unmapped models use their names verbatim for table names.
Replace dbgenerated(...) with SQL tagged literals. Defaults must be valid for their column types, creation timestamps use the application clock, and native PostgreSQL enums no longer support text operations.
Config naming and path resolution, migration starting points, and extension contracts have changed.
Bug Fixes
Improved migration checks and branching warnings, contract generation and inference, default verification, and type checking.
Signed-off-by: willbot [email protected]
Signed-off-by: Will Madden [email protected]
Co-authored-by: Claude Opus 5.5 [email protected]
Original source All of your release notes in one feed
Join Releasebot and get updates from Prisma and hundreds of other software products.
- Sep 24, 2026
- Date parsed from source:Sep 24, 2026
- First seen by Releasebot:Sep 25, 2026
v8.0.0-rc.11-dev.56
Prisma fixes migration new to refuse DB refs on empty graphs.
- Sep 24, 2026
- Date parsed from source:Sep 24, 2026
- First seen by Releasebot:Sep 25, 2026
v8.0.0-rc.11-dev.55
Prisma fixes forked migration graphs to report the real error.
Forked migration graphs report the real error: remove the graph-tip l…
Original source - Sep 24, 2026
- Date parsed from source:Sep 24, 2026
- First seen by Releasebot:Sep 25, 2026
v8.0.0-rc.11-dev.54: feat(psl): multi-file schema support for contract emission (#30379)
Prisma adds multi-file PSL schema support with glob-based contract inputs, one merged symbol table and consistent emit behavior. It also expands orm format across member files, enforces the schema directive at emit, and ships upgrade guidance for existing projects.
Overview
PSL schemas can now span multiple files. contract.source.inputs accepts an array of glob patterns; a file is part of the schema when it matches a glob and carries the // use prisma-8 directive; all member files are parsed into one symbol table and interpreted into one contract. Membership is a standing rule — dropping a new orders.prisma next to the others adds it on the next emit, with no config change.
// prisma.config.ts
export default defineConfig({ contract: './prisma/**/*.prisma', });Changes
Config + expansion (@internal/config, @internal/config-loader): inputs entries are glob patterns. A new expansion helper partitions entries — wildcard-free literals pass through verbatim (no globbing, no existence check, so contract-prisma7's directory inputs and missing-file error surfacing are preserved bit-for-bit), glob entries expand via tinyglobby (expandDirectories: false, files only) — then dedupes by canonical absolute path and sorts. Every ContractSourceContext assembly site (contract-emit, control-api client, format, vite plugin) expands fresh per invocation. resolvedInputs is now the flat expanded list; its positional-matching contract is gone.
Interpreter input goes plural (@internal/psl-parser): PslInterpretInput.documents replaces the singular document. The two composition-context guard diagnostics (PSL_TARGET_CONTEXT_REQUIRED, PSL_SCALAR_TYPE_CONTEXT_REQUIRED) were unreachable through the typed config surface and are now InternalError assertions; the codes are removed entirely.
Providers emit the membership set (SQL + Mongo contract-psl): load() reads every resolved input, applies the directive gate per file (isPrismaNextSchema relocated from the language server into psl-parser), merges parse results via the new mergePslSources, builds one symbol table, interprets once. Zero matches and matched-but-none-opted-in produce dedicated error diagnostics; per-file read failures keep PSL_SCHEMA_READ_FAILED and don't abort collection. Emission is byte-identical under permuted file-discovery order (test-pinned, mutation-verified).
User surface: defineConfig({ contract: '<glob>' }) works end-to-end on postgres/sqlite/mongo; the default output derives from the glob's static prefix (./prisma/**/*.prisma → ./prisma/contract.json), single-path derivation unchanged. orm format formats every member file.
Directive enforcement at emit (breaking): emit now honors the same membership rule as the language server. Every in-repo example and fixture schema gained the directive line (218-file mechanical sweep), and upgrade instructions ship under upgrade-instructions/pending/multifile-psl/ including an executable codemod script.
Merge with main's provenance work: origin/main's independently landed source-provenance polish (#30335, ADR-254 groundwork) is merged in, with its refinements (symbols threading, dataTypeSupport, TaggedLiteralLowering) folded into the multi-file shapes.
Why
Schemas grow past one file; classic Prisma users already organize schemas across files. The design goal (see projects/multifile-psl/spec.md and design-decisions.md, 14 recorded decisions) is that the CLI and the editor agree on what the schema is — same membership predicate, same symbol table, same diagnostics. This PR delivers the emission half; the language-server half (reading unopened member files from disk, cross-file diagnostics pushed to closed files) is the project's third slice, with the playground test bench as the second.
Scope
In scope: config/expansion, both PSL providers and interpreters, extension defineConfig wrappers, orm format, the directive sweep with upgrade instructions, and compile-level language-server adaptation (documents: [document] in its existing per-open-document loop). Out of scope, deliberately: language-server behavior changes (slice lsp-whole-project), the playground (slice playground-scratchpad), workspace/diagnostic pull machinery, and contract-prisma7, which keeps its directory-based loading untouched.
Verification
All three slice acceptance criteria PASS with on-disk evidence (emission determinism under permuted order; directive-less file excluded from the contract; the singular input.document gone from both interpreters). Gates on the merged tree: workspace typecheck 168/169 (only the pre-existing prisma7-adoption network-404 baseline), pnpm fixtures:check clean, pnpm lint:deps clean, package suites green across psl-parser (893), both contract-psl packages (560/209), language-server (630), targets, adapters, and extensions. Review ledger: projects/multifile-psl/reviews/code-review.md — five dispatches, three findings filed and resolved.
🤖 Generated with Claude Code
Signed-off-by: Steven McClankerton [email protected]
Original source
Co-authored-by: Steven McClankerton [email protected]
Co-authored-by: Claude Fable 5 [email protected] Similar to Prisma with recent updates:
- Smokeball release notes145 release notes · Latest Sep 16, 2026
- Cosmolex release notes20 release notes · Latest Jul 30, 2025
- PracticePanther release notes36 release notes · Latest Aug 11, 2026
- Salesforce release notes73 release notes · Latest Sep 17, 2026
- Microsoft release notes874 release notes · Latest Sep 23, 2026
- Zoom release notes217 release notes · Latest Sep 21, 2026
- Sep 24, 2026
- Date parsed from source:Sep 24, 2026
- First seen by Releasebot:Sep 25, 2026
v8.0.0-rc.11-dev.53
Prisma adds parser helpers and a safe tsquery for full-text operations.
Full-text operations take a tsquery: parser helpers and a safe tsquer…
Original source - Sep 24, 2026
- Date parsed from source:Sep 24, 2026
- First seen by Releasebot:Sep 25, 2026
v8.0.0-rc.11-dev.52
Prisma adds Prisma 8 setup alongside existing Prisma 7 projects through the CLI.
feat(cli): a Prisma 7 project gets Prisma 8 set up beside it by runni…
Original source - Sep 24, 2026
- Date parsed from source:Sep 24, 2026
- First seen by Releasebot:Sep 25, 2026
v8.0.0-rc.11-dev.49: Composite map keys are JSON arrays, not NUL-joined strings (#30377)
Prisma fixes composite key handling by switching internal map keys to JSON-encoded arrays, replacing NUL-delimited and literal-NUL separators. The change improves duplicate detection and keeps behavior unchanged while making serialization unambiguous across the codebase.
Linked issue
n/a — small change.
Skill update
n/a — internal only.
At a glance
// before, validators.ts: a literal U+0000 byte sits between the braces const key = `${tableName}(U+0000)${name}`; // after const key = JSON.stringify([tableName, name]);Before this PR grep reported packages/2-sql/1-core/contract/src/validators.ts as a binary file and skipped it, because the source contained a real NUL byte inside a template string.
Decision
Every composite map key in the repo is now the JSON encoding of its parts. Eight sites changed: the one with the literal byte, and seven that joined parts with \0 or `` as a separator on the argument that the parts could never contain it.
Reviewer notes
This is the whole set. A scan of every tracked text file for a NUL byte found only validators.ts. A search for \0 and `` in source found the other seven key sites, plus three uses that are not delimiters and are unchanged: the Postgres and SQLite identifier escapers reject a NUL, and the tagged-literal canonicalizer reports one.
The migration-graph comments went with the delimiter. They justified \0 by appeal to validateInvariantId rejecting control characters and asked future readers to re-confirm dedup correctness if that were relaxed. JSON encoding is unambiguous for any string, so that argument is no longer needed.
The CLI recording script's cache hash changes shape. scripts/record.ts hashed [output, vhs, recording].join('\0'); it now hashes the JSON array. The cache file is local and gitignored, so the only effect is one full re-record the next time someone runs the script.
No behavior change in any key's users. Every site only ever compared keys for equality inside a Map or Set.
Behavior changes & evidence
None observable. The touched packages' suites pass unchanged: sql-contract, sql-orm-client, migration-tools, framework-components, cli.
Testing performed
pnpm typecheck:packages: pass.
pnpm --filter <the five packages> test: 4172 tests pass.
pnpm --filter <the five packages> lint: pass.
Alternatives considered
Keeping NUL but writing it as `` everywhere, which would have fixed only the binary-file symptom. Rejected: a separator that depends on an invariant about the parts is still a separator that has to be argued about.
A visible separator like :: or /. Rejected: table names, model names, warning summaries and invariant ids can contain any of them, so the argument would just move.
Checklist
All commits are signed off (git commit -s) per the DCO.
I read CONTRIBUTING.md and the change is scoped to one logical concern.
Tests are updated (n/a — no behavioral delta; existing suites cover every site).
The PR title is in TML-NNNN: <sentence-case title> form — no ticket.
The Skill update section above is filled in.
Notes for the reviewer
See Reviewer notes above.
🤖 Generated with Claude Code
Summary by CodeRabbit
Bug Fixes
Improved duplicate detection for table-scoped entry names, preventing distinct table/name combinations from being incorrectly flagged as duplicates.
Compound values are now distinguished reliably across schema comparisons, warning grouping, caching, and migration path tracking.
Maintenance
Updated internal key generation to use consistent, unambiguous serialization.
Signed-off-by: willbot [email protected]
Signed-off-by: Will Madden [email protected]
Co-authored-by: Claude Fable 5.1 [email protected]
Original source - Sep 23, 2026
- Date parsed from source:Sep 23, 2026
- First seen by Releasebot:Sep 24, 2026
v8.0.0-rc.11-dev.48
Prisma removes dbgenerated as raw SQL defaults now use sql tagged literals and inferred patterns.
- Sep 23, 2026
- Date parsed from source:Sep 23, 2026
- First seen by Releasebot:Sep 24, 2026
v8.0.0-rc.11-dev.47
Prisma fixes CI to use one db migrate command instead of migration status.
skill(prisma-8): CI is one db migrate command, not a migration status…
Original source - Sep 22, 2026
- Date parsed from source:Sep 22, 2026
- First seen by Releasebot:Sep 23, 2026
v8.0.0-rc.11-dev.46: prisma-8-demo: full-text search over post titles, end to end (#30376)
Prisma adds end-to-end Postgres full-text search for post titles in the Prisma 8 demo, with a new index, migration, ORM and SQL search examples, ranked results, highlighted headlines, CLI commands, and updated docs and tests.
Linked issue
n/a — demonstrates the feature shipped in #30348, which has no Linear ticket.
Skill update
n/a — the demo uses the surface skills/prisma-8/references/queries-postgres.md and contract.md already document; no wording changes.
At a glance
model Post { id Uuid @id @default(uuid()) title String // … @@fullTextIndex([title], name: "post_title_search") @@map("post") }export async function ormClientSearchPostsByTitle(query: string, limit: number, runtime: Runtime) { const db = createOrmClient(runtime); return db.Post.select('id', 'title', 'userId') .where((p) => p.title.fullTextMatches(query)) .orderBy((p) => p.title.fullTextRank(query).desc()) .limit(limit) .all(); }pnpm start -- repo-search-posts-text second pnpm start -- full-text-search "first or second"Before this PR no example app used full-text search; the only end-to-end proof was the integration test suite.
Decision
examples/prisma-8-demo demonstrates Postgres full-text search end to end: the index in the schema, the migration that creates it, an ORM query and a SQL DSL query that use it, two CLI commands, and integration tests for each query.
Reviewer notes
The migration was planned, not hand-written. prisma migration plan --from 62d81d60… --name add_post_title_search rendered migrations/app/20260922T1218_add_post_title_search/ and the new snapshot. Its one operation is CREATE INDEX "post_title_search_724b05e5" ON "public"."post" USING "gin" (to_tsvector('english', "title")). The migration replay test applies the whole chain from scratch and verifies the live schema against the contract.
The TypeScript contract twin was already out of sync with the PSL schema before this change. It has no Tag, Task, or engagement counters, so pnpm test:dual-mode does not produce the same contract from both forms today. I added fullTextIndex(cols.title, { name: 'post_title_search' }) to the twin and confirmed it emits the same index, but did not reconcile the rest.
The SQL DSL example orders by rank, then title. Rank ties on short titles, so the secondary order keeps the output and the test deterministic.
The seed's post titles are First Post, Second Post, Third Post. The README's suggested commands are chosen to show a single hit and an or query against those. The seed was not changed.
How it fits together
Schema. @@fullTextIndex([title], name: "post_title_search") on Post in src/prisma/contract.prisma, and the same index in prisma/contract.ts. The emitted contract carries a GIN expression index over to_tsvector('english', "title").
Migration. The planned package under migrations/app/ plus the new content-addressed snapshot.
ORM query. src/orm-client/search-posts-by-title.ts filters with fullTextMatches and orders with fullTextRank(...).desc(). The query string is a bound parameter lowered to websearch_to_tsquery, so "an exact phrase", -excluded and or work as in a search box.
SQL DSL query. src/queries/full-text-search.ts selects the rank and a -highlighted fullTextHeadline beside each hit, which the ORM's select() cannot express.
CLI and README. repo-search-posts-text and full-text-search in src/main.ts; the README lists both and explains the index.
Behavior changes & evidence
- Post gains a full-text index and the demo database gains a migration creating it.
- Implementation:
contract.prisma,
migration.ts. - Evidence:
migration-replay.integration.test.ts,
migration-integrity.test.ts.
- Implementation:
- ORM full-text search over titles, including phrase and exclusion syntax.
- Implementation:
search-posts-by-title.ts. - Evidence:
repositories.integration.test.ts.
- Implementation:
- SQL DSL full-text search with rank and highlighted headline.
- Implementation:
full-text-search.ts. - Evidence:
sql-dsl.integration.test.ts.
- Implementation:
Testing performed
pnpm typecheck and pnpm lint in examples/prisma-8-demo: pass.
pnpm test in examples/prisma-8-demo for repositories, sql-dsl, migration-integrity, migration-replay, contract-authoring, demo-dx.types, demo-dx.integration: 7 files, 51 tests pass against a dev Postgres.
pnpm check:upgrade-coverage --mode pr --prev ebfc118a25 --head HEAD: pass, with a no-op app declaration under upgrade-instructions/pending/demo-full-text-search/.
Alternatives considered
Putting the demo in react-router-demo or retail-store. Rejected: prisma-8-demo is the app the README positions as the native Prisma 8 showcase, and it already carries the pgvector similarity examples the search examples sit beside.
Searching a new body column instead of title. Rejected: adding a column would mean a second migration and seed changes for a demo whose point is the index and the operations, not the data model.
Skipping the migration and relying on db init. Rejected: the demo ships a migration chain and a replay test for it, so a schema change without a migration would break that proof.
Checklist
- All commits are signed off (git commit -s) per the DCO.
- I read CONTRIBUTING.md and the change is scoped to one logical concern.
- Tests are updated.
- The PR title is in TML-NNNN: form — no Linear ticket exists, as with #30348.
- The Skill update section above is filled in.
Notes for the reviewer
See Reviewer notes above.
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
- Added full-text search for post titles with relevance ranking.
- Added ORM and SQL search examples, including highlighted headlines.
- Supports phrases, excluded terms, and “or” searches.
- Added CLI commands for ranked and highlighted title searches.
Documentation
- Updated the demo README with full-text search usage.
Tests
- Added coverage for terms, phrases, exclusions, ranking, and highlighted results.
Signed-off-by: willbot [email protected]
Original source
Signed-off-by: Will Madden [email protected]
Co-authored-by: Claude Fable 5.1 [email protected] - Sep 22, 2026
- Date parsed from source:Sep 22, 2026
- First seen by Releasebot:Sep 23, 2026
v8.0.0-rc.11-dev.45
Prisma refuses duplicate index and foreign-key names at authoring.
Duplicate index and foreign-key names refused at authoring; SqlLoweri…
Original source - Sep 22, 2026
- Date parsed from source:Sep 22, 2026
- First seen by Releasebot:Sep 23, 2026
v8.0.0-rc.11-dev.44: Add checked PSL entity references and explicit unchecked names (#30344)
Prisma adds selector-based PSL entity references, unchecked names, and improved symbol-table traversal for forward references, clearer diagnostics, and preserved SQL and Mongo inheritance behavior while keeping block-value and other follow-up work out of scope.
Linked issue
Linear integration and ticket-prefixed naming explicitly waived by the operator. This is Slice 1 of the shared PSL value-specification work; Slice 2 is not implemented here.
Summary
This PR adds checked PSL entity references and explicit unchecked names, including SQL/Mongo inheritance consumers and existing attribute tooling. Checked references retain the selected declaration into lowering so validation and storage construction cannot independently select different same-named models.
Ready for review, not permission to merge. Independent review of the API correction and traversal follow-up is satisfied; the aggregate package-test gate remains unmet and final integrated handoff/DoD is outstanding. No packaging or build-order repair is included.
API and design
entityRef(expected) takes only a selector, for example entityRef({ kind: 'model' }), and returns ResolvedEntityReference<D> with the actual declaration and lexical namespace. There is no injected or factory-bound resolver.
AttributeCtx adds only readonly symbols: SymbolTable; its complete keys are sourceId, sourceFile, and symbols. No owner, scope, namespace, or resolver field is added. Production interpretation paths pass the real completed table.
The shared internal resolveEntityReference(expression, name, symbols) helper derives lexical scope from expression syntax ancestry. Lookup selects the containing namespace's binding, then top-level, never siblings; top-level expressions see only top-level declarations. Kind checking follows binding selection, so a wrong-kind local binding does not fall back.
Weak scope/declaration caching preserves resolved-wrapper identity across rules and repeated expressions. Failures are source-anchored; successful oneOf(entityRef(...), identifier()) alternatives discard failed-arm diagnostics.
identifier() accepts intentionally unchecked names; identifier(name, { documentation }) retains pinned literal matching.
Mongo wildcard scope uses optional(identifier()) and retains its separate field/indexability checks.
SQL/Mongo base factories no longer capture a resolver or require factory context. Other context-dependent factories retain their contracts. SQL preserves selected identity through inheritance coordinates and STI/MTI/root processing; Mongo preserves model-symbol identity within its existing namespace prohibition.
Existing block attributes, not a block-value DSL migration
Existing descriptor-backed block attributes are now interpreted after complete declaration collection, enabling forward checked references.
An explicit accepted-block worklist visits each accepted symbol exactly once, including prototype-named blocks and namespaces, while preserving first-wins duplicates, failed-first recovery, diagnostics, and declaration identity. This fixes traversal without claiming general symbol-dictionary hardening. Block-value descriptors, parameter reconstruction and validation grammar are unchanged; generic-block value DSL migration remains Slice 2 work.
Existing completion/signature consumers inspect metadata without parsing references. Unrestricted identifiers have name: undefined, so completion offers only pinned names. This adds no reference navigation or reference/block-value completion.
Implementation and evidence
Parser:
packages/1-framework/2-authoring/psl-parser/src/entity-reference.ts, src/attribute-spec/combinators/entity-ref.ts, and src/symbol-table.ts. Tests in the same package include test/entity-reference.test.ts, test/attribute-spec-combinators.test-d.ts, and test/symbol-table.block-attribute-traversal.test.ts for lexical identity, inference/negative API contracts, completed-table references, and exactly-once traversal/recovery.SQL: packages/2-sql/2-authoring/contract-psl/src/interpreter.ts and test/interpreter.polymorphism.test.ts preserve independently named inheritance graphs, declaration order independence, mapped STI/MTI storage and contract validation.
Mongo: packages/2-mongo-family/2-authoring/contract-psl/src/mongo-attribute-specs.ts, test/interpreter.polymorphism.test.ts, and test/interpreter.attribute-specs.test.ts cover checked bases and unchanged wildcard semantics.
Tooling: packages/1-framework/3-tooling/language-server/test/completion-values.test.ts, test/signature-help-values.test.ts, and test/attribute-spec-consumability.test.ts cover metadata-only completion/signatures and actual family factories.
Compatibility and scope
Extension authors must replace name-only entityRef() with selector-only entityRef(expected), supply the collected symbol table in the interpretation context, and consume declaration/namespace identity instead of a string. The intermediate two-argument resolver API and createEntityResolver/EntityResolver are removed without compatibility overloads. Checked expressions require attached document syntax for ancestry-based scope; use identifier() for intentionally unchecked names. Missing/wrong-kind bases now report shared PSL_INVALID_ATTRIBUTE_SYNTAX at the expression rather than late PSL_BASE_TARGET_NOT_FOUND.
Serialized contracts, generated contract types, migration artifacts and adapter protocols remain unchanged. Top-level fallback is a lookup guarantee, not new cross-namespace inheritance execution support.
Persisted inheritance-coordinate expansion, .variant() changes, unrelated relation resolution, typed generic-block values, policy/enum lowering migration, new block-value completion and Slice 2 are excluded.
Verification
These are recorded executions, not tests rerun during publication.
Published correction commits are cbad1e5a205fc40f65b7f198d6725c64d5e1893b (API) and 409b3faa1c95f85de088bdd0ba9dccd7011ac551 (bounded traversal fix).
After the traversal fix: parser test/typecheck/lint/build pass, with 850 tests / 33 files. Focused traversal/reference coverage passes 48 tests / 2 files, following 12 executed red regression assertions. SQL contract PSL 502 tests / 39 files, Mongo contract PSL 202 / 7, and language server 620 / 24 pass, along with downstream typecheck/lint/build and pnpm lint:deps.
On the API correction: affected-package gates, pnpm build, integration (2,161 tests plus 52 expected failures), e2e (119 tests / 22 files), and canonical pnpm fixtures:check pass. Fixtures produced no tracked artifact changes. Integration/e2e/fixtures and expensive root aggregates were not rerun solely for the small traversal follow-up.
Latest root typecheck evidence: 169/169 successful, with integration's compiler actually executed and 168 cache hits; a subsequent 169/169 all-cached run adds no fresh compiler evidence. These used the previously verified process-local PRISMA_SCHEMA_ENGINE_BINARY and TURBO_ENV_MODE=loose environment. The earlier 168/169 failures exposed a missing facade-build ordering edge: normal facade cleaning transiently removes required declarations. That infrastructure defect is independently demonstrated and not fixed; warm-cache success is not a cold-build guarantee. It is separate from the prepack race.
Root pnpm test:packages remains failed: the latest recorded run has 1,285 passing files / 17,292 passing tests and two prepack setup failures in the Postgres facade and pgvector tarball suites (ENOENT/ENOTEMPTY in shared skills materialization). Repair and an unweakened aggregate rerun are separately owned. Isolated passes do not clear this gate.
Independent review: selector-only API correction accepted; traversal finding closed on the follow-up. This is API-scoped acceptance, not full-slice completion or merge approval.
Latest reported diagnostic refresh: fresh synchronous semantic probes are clean for seven files: entity-ref, entity-reference, AttributeCtx types, symbol-table, traversal test, SQL specs and Mongo specs. The push-diagnostic cache remains stale/inconclusive; this is not a clean workspace sweep.
Earlier manual QA exercised built SDK/type inference, CLI diagnostics and real stdio LSP completions/signatures. GUI popup/rendering/keyboard interaction remains unverified; this is not a new manual QA run against the corrected API.
Skill update and follow-ups
Parser/family READMEs and ADR 231 document the authoring SPI and migration. No agent skill was changed: this is an extension-authoring API change, not an end-user CLI/query workflow.
Before merge, clear the separately owned package aggregate blocker, complete final integrated review/DoD, and retain the unrepaired build-order defect as an explicit handoff. Generic-block values and cross-namespace inheritance representation/query support remain separate follow-ups.
Alternatives considered
Keep name-only references and resolve again during lowering: permits inconsistent declaration selection.
Inject a resolver into each factory: duplicates context plumbing; selector-only rules instead use a shared syntax-ancestry helper and the real parse-context symbol table.
Validate every former reference site as an entity: wildcard scopes are field names and need the explicit unchecked rule.
Expand persisted inheritance coordinates or block-value grammar here: deliberately excluded to keep this authoring migration bounded.
Summary by CodeRabbit
New Features
Added validated, namespace-aware references for models and other declarations, including forward references.
Added support for unrestricted identifiers that do not need to match a declared model.
Preserved wildcard index scopes without requiring a matching model.
Improved SQL and Mongo inheritance handling for same-named models in different namespaces.
Added clearer documentation for reference completion and resolution behavior.
Bug Fixes
Improved diagnostics for missing, invalid, or incorrectly typed references.
Completion lists now omit unrestricted identifiers and avoid showing invalid alternatives.
Signed-off-by: Steven McClankerton [email protected]
Co-authored-by: Steven McClankerton [email protected]
Co-authored-by: Claude Fable 5 [email protected]
Original source - Sep 22, 2026
- Date parsed from source:Sep 22, 2026
- First seen by Releasebot:Sep 23, 2026
v8.0.0-rc.11-dev.43
Prisma adds data types and casts for written defaults and column casts.
- Sep 22, 2026
- Date parsed from source:Sep 22, 2026
- First seen by Releasebot:Sep 23, 2026
v8.0.0-rc.11-dev.41
Prisma refuses contract snapshots whose content no longer matches the current contract.
TML-2566: refuse contract snapshots whose content no longer matches t…
Original source
Curated by the Releasebot team
Releasebot is an aggregator of official release notes from hundreds of software vendors and thousands of sources.
Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.