[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-prisma-prisma-composer-core-concepts":3,"mdc-pzw5x8-key":33,"related-repo-prisma-prisma-composer-core-concepts":3860,"related-org-prisma-prisma-composer-core-concepts":3869},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":31,"mdContent":32},"prisma-composer-core-concepts","deploy and manage Prisma Composer applications","Use when deploying or managing an app that uses Prisma Composer (`@prisma\u002Fcomposer`): wiring its services and Modules, running it locally, testing composed services, or standing up \u002F tearing down an environment. Triggers on \"prisma composer\", \"@prisma\u002Fcomposer\", \"prisma app\", the `prisma-composer` CLI, `compute()`, `module()`, `contract()`, `service.load()`, `mockService`, `bootstrapService`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"prisma","Prisma","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fprisma.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"ORM","orm","tag",{"name":17,"slug":18,"type":15},"Deployment","deployment",{"name":20,"slug":21,"type":15},"Engineering","engineering",{"name":9,"slug":8,"type":15},3,"https:\u002F\u002Fgithub.com\u002Fprisma\u002Fcomposer","2026-09-04T08:00:56.083778",null,0,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fprisma\u002Fcomposer\u002Ftree\u002FHEAD\u002Fskills\u002Fprisma-composer-core-concepts","---\nname: prisma-composer-core-concepts\nmetadata:\n  library: \"@prisma\u002Fcomposer\"\n  library_version: \"0.16.0\"\n  version: 2026.9.1\ndescription: >-\n  Use when deploying or managing an app that uses Prisma Composer\n  (`@prisma\u002Fcomposer`): wiring its services and Modules, running it locally,\n  testing composed services, or standing up \u002F tearing down an environment.\n  Triggers on \"prisma composer\", \"@prisma\u002Fcomposer\", \"prisma app\", the\n  `prisma-composer` CLI, `compute()`, `module()`, `contract()`,\n  `service.load()`, `mockService`, `bootstrapService`.\n---\n\n# Prisma Composer core concepts\n\nA **Prisma App** is a tree of typed declarations composed in TypeScript and\nhanded to the `prisma-composer` CLI. This file covers structures,\nhierarchies, relationships, and workflows: the concepts you cannot observe\nfrom the code or the CLI's help output. It is not a CLI reference; discover\nany individual command and its flags with `--help`. Commands named here\nbelong to the `prisma-composer` CLI itself; a host CLI that embeds Composer\nmay not carry every verb, so confirm a command exists via `--help` rather\nthan inferring it. The Prisma platform moves fast, so treat this file as the\nstable conceptual core and find current, fuller documentation at\n\u003Chttps:\u002F\u002Fwww.prisma.io\u002Fdocs>. For working code, read `examples\u002F` in the\nprisma\u002Fcomposer repo.\n\nTwo principles govern everything and are binding\n(`docs\u002Fdesign\u002F01-principles\u002F`):\n\n1. **Your code never reads its environment.** Dependencies, configuration,\n   credentials, and the port all arrive through the service node, typed.\n   `process.env` is never the answer.\n2. **Composer never bundles or transforms your code.** You build with your own\n   bundler; the framework assembles the built output by deterministic steps\n   and hands it to the configured deploy target.\n\n## Declarations are data\n\nEverything you author is a declaration: plain data describing a piece of the\napp, executing nothing when imported. Three node kinds exist:\n\n| Kind | Declared with | Purpose |\n| --- | --- | --- |\n| Service | `compute()` | A running unit of your code; atomic, Composer sees only its ports |\n| Resource | `rawPostgres()`, `bucket()` | A stateful managed dependency |\n| Module | `module()` | A grouping boundary; runs no code of its own, exposes typed ports |\n\nNodes connect through **ports**: `deps` declares what a node requires,\n`expose` declares what it offers. Wiring happens in a Module's builder via\n`provision()`, and the root Module, handed to the CLI, is the App:\n\n```ts\n\u002F\u002F module.ts\nimport { module } from '@prisma\u002Fcomposer';\n\nexport default module('store', ({ provision }) => {\n  const catalog = provision(catalogModule);\n  provision(storefrontService, { deps: { catalog: catalog.rpc } });\n});\n```\n\nBecause ports are typed, **the compiler verifies every wire**. A dependency\nwired to the wrong producer, a missing RPC handler, a literal input value of\nthe wrong shape: all of it fails `tsc`, not the deploy. Env-bound input is\nthe exception: those values exist only at deploy, so secret-binding\nmismatches and missing platform variables surface as early deploy-time\nrefusals instead (see Two channels below). Typecheck, then build, then\ndeploy; don't use the cloud to find out whether the wiring is correct.\n\nComposer itself is target-agnostic: `@prisma\u002Fcomposer` carries authoring,\ntesting, and the CLI, coupled to no platform. A deploy target is an extension\nregistered in the deploy config; `@prisma\u002Fcomposer-prisma-cloud` is the\nPrisma Cloud target and the one this skill's deploy sections assume. Its\nroot exports `compute`, `rawPostgres`, `bucket`, `envSecret`, and\n`envParam`; the ORM vocabulary (`postgres`, `dataContract`) lives under the\n`\u002Form` subpath, alongside the shared `\u002Fcron`, `\u002Fstorage`, `\u002Fstreams`,\n`\u002Fauth`, and `\u002Femail` modules. These are the only two Composer packages a\nbasic Prisma Cloud app needs, and nothing installs them for you: a fresh\nproject starts with neither, so add both as dependencies first. An\nextension adds its own `prisma-composer-*` package alongside them. Compose\nan existing Module before implementing a capability yourself; wiring one in\nis a couple of lines.\n\nWithin the entry graph (everything reachable from `module.ts`), write\nrelative imports with explicit `.ts` extensions (`.\u002Fservice.ts`, with\n`allowImportingTsExtensions` in tsconfig): that form resolves everywhere.\nThe `prisma-composer` CLI also maps `.\u002Fservice.js` and extensionless\n`.\u002Fservice` to the `.ts` source, but other hosts may not.\n\n## The service node is the only doorway\n\nYour runtime code receives everything from the service declaration it\nimports:\n\n1. `service.load()`: dependencies (typed RPC clients, database bindings).\n2. `service.input()`: the whole input as one schema-validated object;\n   credentials in it are redacting `SecretString` boxes.\n3. `service.port()`: the reserved port to bind (default 3000).\n\nA service declaration is pure data; the server entry is what your build\nproduces and the platform boots:\n\n```ts\n\u002F\u002F service.ts\nexport default compute({\n  name: 'auth',\n  deps: { db: rawPostgres() },\n  build: node({ module: import.meta.url, entry: '..\u002Fdist\u002Fserver.mjs' }),\n  expose: { rpc: authContract },\n});\n\n\u002F\u002F server.ts\nconst { db } = service.load(); \u002F\u002F { url }: you construct your own client\nconst handler = serve(service, {\n  rpc: { verify: async ({ token }) => ({ ok: token.length > 0 }) },\n});\nBun.serve({ port: service.port(), hostname: '0.0.0.0', fetch: handler });\n```\n\nThe consumer declares `deps: { auth: rpc(authContract) }` and gets a typed\nclient back from `load()`.\n\n## Two channels: dependencies and input\n\n| The value is… | Declare | Provide | Read |\n| --- | --- | --- | --- |\n| produced by another node | `deps: { db: rawPostgres() }` | wire at `provision()` | `load()` |\n| anything else (config or credential) | one field of the `input` schema | bind at `provision()`: literal, `envParam()`, or `envSecret()` | `input()` |\n\nThe service declares its whole incoming configuration, plain values and\ncredentials together, as **one [Standard Schema](https:\u002F\u002Fstandardschema.dev)**\n(arktype is the house choice). A credential is a field typed as\n`secretString()` from `@prisma\u002Fcomposer\u002Farktype`; conditional legality (\"no\nstripe key unless billing is on\") is an ordinary schema union. The binding at\n`provision()` mirrors the schema's shape; `envSecret('NAME')` names the\nplatform variable and never carries the value.\n\nRules that bite:\n\n1. **Secretness is enforced by validation.** A literal bound where the schema\n   expects `SecretString` fails the deploy; `envSecret` bound to a plain\n   string field fails the same way.\n2. **`envParam` values arrive as raw strings**; bind them to string fields.\n   The stage's platform variable is the store; the deploying shell only seeds\n   a missing name (and the deploy fails early, naming the variable, when both\n   lack it). Changing the platform value needs a redeploy.\n3. **Absence is the schema's call.** An env-bound field whose variable is\n   unset or empty resolves to *key omitted*, which is legal only if the\n   schema allows it (optional field, union arm). The deploy report prints the\n   serialized input document (secrets ride as `{\"$secret\":\"VAR\"}` pointers)\n   and every key that resolved absent.\n4. **The reserved `port` is outside the schema.** Read it through\n   `service.port()`, never `process.env`. The framework also exports `PORT`\n   for Next.js standalone, which binds it itself.\n5. **A Module forwards a secret need without learning the platform name.**\n   Declare `secrets: { signingKey: secret() }` on the Module boundary and\n   pass the forwarded ref as a binding leaf; the parent binds the real\n   source.\n6. `input.apiKey.expose()` is the only way to a secret's value; the box\n   redacts everywhere else (logs, JSON, errors).\n\n## Contracts and RPC\n\nA contract is the typed interface through which services communicate. It\nlives with the service that owns it, typed by any Standard Schema validator,\nand both provider (`serve()`, exhaustive over the contract's methods at\ncompile time) and consumer (`rpc(contract)`) reference the same value. Calls\ntravel as RPC over HTTP. Two behaviours are provisioned for you and must not\nbe reimplemented:\n\n1. **Service keys.** At deploy, Composer mints a distinct unguessable key per\n   consumer→provider binding; `serve()` returns `401` to anything else before\n   the handler runs. Nothing in your code declares it. Consequences: don't\n   build your own service-to-service auth, and don't `curl` a deployed\n   `\u002Frpc\u002F\u003Cmethod>` to check it works. An unwired caller always gets `401`,\n   which looks like a broken deploy and isn't. Debug through a consumer, or\n   locally, where nothing is enforced. Keys are per binding (one leaking\n   can't impersonate another consumer), service-scoped (any valid key\n   reaches every method; split services to gate separately), rotated only by\n   removing the binding or destroying the stack and redeploying, and stored\n   in deploy-owned `COMPOSER_*` variables you never hand-edit.\n2. **Idempotency and retries.** Every generated-client call carries an\n   `Idempotency-Key`; dropped calls retry with backoff, and `serve()` runs\n   one call per key, replaying the completed answer to late retries. Every\n   method is therefore safely retryable and no contract declares anything\n   about it (there is no \"is this idempotent\" flag; don't invent one). A\n   handler may take an optional third argument `(input, deps, ctx)` and read\n   `ctx.idempotencyKey` (`string | undefined`) if it needs exactly-once\n   beyond one instance's memory; most don't. Locally and in tests nothing is\n   provisioned, so `serve()` passes every call through: never supply a key\n   in test inputs.\n\n## Builds are yours\n\nYou build, the framework assembles. For a plain server process, `entry` must\npoint at a single self-contained ESM file: everything inlined except runtime\nbuilt-ins (`bun`, `bun:*`, `node:*`). Deploy copies that one file and never\nships `node_modules`, so anything left un-inlined fails at boot, not at\ndeploy. Rules that bite:\n\n1. **Two services in one package means two separate builds**, one per entry.\n   A single multi-entry build splits shared code into a chunk neither output\n   contains.\n2. **A directory build uses `dir` + `entry`** (`dir` relative to the service\n   module, `entry` a file inside `dir`; `..\u002F` is an error). The tree is\n   copied verbatim, so the server must resolve siblings against\n   `import.meta.url`, not the working directory. The tree must contain no\n   symlinks: the packager rejects them, names the link, and assembly fails.\n3. **Next.js**: `next build` with `output: 'standalone'` is the whole build;\n   `nextjs({ module, appDir })` names the app root. Any page or action that\n   calls `load()` needs `export const dynamic = 'force-dynamic'`, because\n   the runtime environment doesn't exist at build time and Next ignores\n   runtime env for prerendered routes.\n4. **Always build before `deploy` or `dev`.** Neither builds for you.\n\nDeploy configuration lives in `prisma-composer.config.ts` (or `.mts`, `.mjs`,\n`.js`; nearest ancestor of the entry wins, `.ts` first within a directory).\nIt registers extensions (`prismaCloud()`, `nodeBuild()`, `nextjsBuild()` when\nthe app has a Next.js service) and the deploy-state backend\n(`prismaState()`). It is read by the CLI's operations (deploy, destroy, and\ndev; a `dev` run without one refuses, naming the missing file) and never\nimported by app code.\n\n## Databases and migrations\n\nTwo kinds of Postgres dependency:\n\n1. **`rawPostgres()`**: the binding is `{ url }` and the app owns its client.\n2. **`postgres(...)`**: a Prisma-ORM-typed database. The binding is\n   `{ url, client }` (ADR-0040): the raw connection URL plus the typed\n   client Composer constructs from your data contract, lazily on first\n   access, so queries go through `binding.client` and are compile-time\n   checked. Both `postgres` and `dataContract` import from\n   `@prisma\u002Fcomposer-prisma-cloud\u002Form`, not the package root. One\n   `dataContract`-wrapped value (emitted from `contract.prisma` by\n   `prisma contract emit`) is referenced by both the dependency end\n   (`deps: { db: postgres(catalogData) }`) and the resource end, which also\n   names the `prisma.config.ts` path so the deploy's migration step can\n   find `migrations\u002F`.\n\n**Deploys are replay-only**: they apply the migrations committed under\n`migrations\u002F` and never create schema themselves. Every schema change,\nincluding the first schema of a new database, follows one loop:\n\n1. Edit `contract.prisma`.\n2. `prisma contract emit` regenerates `contract.json` + `contract.d.ts`.\n3. `prisma migration plan --name \u003Cslug>` authors the migration (on an empty\n   graph this authors the baseline).\n4. Commit `migrations\u002F` with the change, then deploy. A fresh database\n   replays the whole path from empty.\n\nIf no authored path reaches the target contract, deploy (and `dev` against a\nstale local database) refuses with `MIGRATION_PATH_NOT_FOUND`; its message\nlists the two ways out: author the missing migration, or, when iterating\nagainst a local\ndatabase only, `prisma db update`. Never skip step 3 before a deploy. See\n`examples\u002Fstore\u002Fmodules\u002Fcatalog` for the complete pattern.\n\n## Deploy model: converge, don't script\n\nDeploy compares the declared topology against recorded deploy state and\napplies only the difference. Re-deploying with nothing changed is a no-op;\nremoving a node removes its deployed resource. The Prisma Cloud target\nrequires exactly two environment variables: `PRISMA_SERVICE_TOKEN` and\n`PRISMA_WORKSPACE_ID`. There is no interactive login.\n\n**Stages.** A stage is an environment name chosen on the command line at\ndeploy time, never written in the topology. The identical graph deploys\neverywhere. On the Prisma Cloud target, a Prisma App is one Project and a\nstage is a Branch of it, with its own running services, its own empty\ndatabase, its own configuration. A stage name must be a valid git ref name;\nan invalid name is a hard error.\n\n**Destroy** always requires an explicit target: a bare destroy is an error,\nand naming a stage and production together is too. Destroying a stage\ndeletes its Branch after removing its resources. Destroying production\nremoves only the resources inside the production Branch, never the Branch\nitself directly; once the Project is empty it is deleted too, and that\ndeletion takes the production Branch with it. A Project still holding\nanother stage's resources is kept. Destroy never creates anything:\ndestroying a\nnever-deployed stage fails rather than standing one up.\n\n**The engine underneath is alchemy.** Convergence is executed by\n[alchemy](https:\u002F\u002Falchemy.run), a third-party infrastructure-as-code engine\nthat arrives as an ordinary, exactly-pinned npm dependency of\n`@prisma\u002Fcomposer` (2.0.0-beta.74 at this library version). Your code never\nimports or configures it; consult alchemy's own docs for the engine itself.\nWhat matters operationally:\n\n1. Deploy and destroy write the pipeline's results to a generated, gitignored\n   stack file at `.prisma-composer\u002Falchemy.run.ts`, then run the alchemy CLI\n   against it as a child process; `dev` does the same at\n   `.prisma-composer\u002Fdev\u002Falchemy.run.ts` with local providers. The file\n   carries the computed values as literals but reads credentials via\n   `fromEnv()`, so nothing sensitive lands on disk, and it is regenerated\n   every run: output, not configuration, never edited.\n2. Failures are bisectable through that file. A failing deploy names its\n   path; running `alchemy deploy .prisma-composer\u002Falchemy.run.ts` directly\n   separates \"the framework computed the wrong thing\" from \"the engine or\n   platform rejected the right thing\". An engine failure surfaces as\n   `DEPLOY.ENGINE_FAILED` carrying the exit code and that reproduce command;\n   the child's live output streams to the terminal either way.\n3. Destroy evaluates the same stack program as deploy, and evaluating it\n   packages the assembled bundles, so **an app must be built before it can\n   be torn down**.\n4. alchemy is why the `effect` pin exists: it resolves the `effect`\n   constellation, and a hoisted newer `effect` halts every command (failure\n   mode 1 below).\n\n**The deploy report** ends with the app's own topology: authored names, the\nplatform resource each became, and public URLs. Read ids out of it rather\nthan hunting in the Console. A URL appears only where the address is\ngenuinely public: a service prints one, a database never does, and a\nnode whose product is secret material reports no resource line at all.\n\n**Connection contract refusals.** A connection declares the values it needs\nby name; a producer that omits one fails the deploy, naming the edge, the\nparam, and what the producer did supply:\n\n```text\nConnection input \"auth.db\" declares param \"url\", but its producer \"db\" did not\nsupply it — the producer's outputs carry [host].\n```\n\nThis is a deploy-time refusal, not a broken deploy, and it can appear on an\napp whose code didn't change (the gap used to pass silently as `undefined`\nand crash the consumer at boot). Fix whichever end is wrong; don't mark the\nparam `optional` unless absent really is legal. Only reachable if you\nauthored the connection or an extension on one side.\n\n**Driving deploys from code.** `@prisma\u002Fcomposer\u002Fcontrol` exposes typed\n`deploy`, `destroy`, `dev`, and `log` returning structured results. Failures\ncome back as `{ ok: false, failure }` with a dotted `failure.code` from a\nclosed registry (e.g. `ASSEMBLE.BUILD_FAILED`, `DEPLOY.ENGINE_FAILED`,\n`DEPS.EFFECT_VERSION_CONFLICT`); branch on the code, not the message. A\nnon-structured rejection out of an operation is a bug in composer, not an\nexpected failure.\n\n## Local development\n\nThe `dev` command runs the whole app on this machine, wired as it deploys,\nagainst local emulators. No cloud credentials are needed or read. Concepts\nthat surprise:\n\n1. It runs the same pipeline as deploy, so **build first**, exactly like\n   deploy. It watches built output and restarts a service when its build\n   changes.\n2. Ctrl-C stops the app's processes but leaves local databases, buckets, and\n   their data up: the next `dev` is a warm start. Starting clean, wiping\n   this app's local instances and data first, is an explicit opt-in flag.\n3. `dev` does not print service logs; `log` is a separate, read-only command\n   that follows the already-running app's merged logs. It never builds,\n   provisions, starts, or stops anything.\n4. An unset secret doesn't block a local run: it becomes a placeholder plus a\n   warning, and only the code path that spends it fails, at the external\n   service it calls.\n5. Windows isn't supported yet.\n\n## Testing is an environment seam\n\nA test is just another environment: one where you decide what `load()` and\n`input()` return, never by editing the code under test.\n\n| You want to… | Use | From |\n| --- | --- | --- |\n| Test a page \u002F action \u002F handler in isolation | `mockService` | `@prisma\u002Fcomposer\u002Ftesting` |\n| Run the real boot + request path against a fake dependency | `bootstrapService` | `@prisma\u002Fcomposer-prisma-cloud\u002Ftesting` |\n\n`mockService` returns a copy of the service whose `load()` yields your\ndoubles (type-checked against the declared deps) and whose `input()` yields\nthe object passed under the reserved `input` key (required exactly when the\nservice declares an input schema; handed over as-is, not validated). Wiring\nthe module substitution is your runner's job (`vi.mock` in Vitest,\n`mock.module` in bun test).\n\n`bootstrapService` boots the service's real built entry in-process against a\nconfig you choose; drive it over real HTTP. Gotchas:\n\n1. `service.port` must be concrete: the entry self-listens, and no\n   OS-assigned port is reported back.\n2. There is no `close()`; run each integration-test file in its own process\n   (bun test does).\n3. Next.js services take a third argument, a boot thunk, resolved with\n   `standaloneServerPath` from `@prisma\u002Fcomposer\u002Fnextjs\u002Fcontrol`.\n4. A service with an input schema takes `input` in the config, a binding\n   exactly like `provision()`'s, run through the real serialize\u002Fread path.\n\nA dependency's type is its contract, so any value of that shape is a valid\ndouble: a bare object, the real client over an in-memory handler, or a real\nlocal server. Ship a dependency's fake from its own package as a `\u002Ffake`\nentry point, outside `src\u002F`, so the fake and the real service share one\ncontract.\n\n## Building blocks and extensions\n\nFirst-party Modules ship inside `@prisma\u002Fcomposer-prisma-cloud` and\nprovision exactly like your own:\n\n| Import | What it provisions | Exposes |\n| --- | --- | --- |\n| `cron` from `\u002Fcron` | An always-on scheduler firing your schedule at your runner service | nothing |\n| `storage` from `\u002Fstorage` | An S3-backed blob store (own Postgres + minted credentials) | `store` |\n| `streams` from `\u002Fstreams` | Durable append-only event streams over a `store` | `streams` |\n| `auth` from `\u002Fauth` | Signup, login, sessions, and JWT verification (Better Auth in one service, own database) | `api`, `session`, `admin` |\n| `email` from `\u002Femail` | Transactional email with a stored outbox (own service and database) | `send`, `outbox` |\n\n`bucket()` (imported alongside `rawPostgres`) is a raw S3-compatible bucket:\nthe dependency end receives `{ url, bucket, accessKeyId, secretAccessKey }`,\nshape-compatible with `\u002Fstorage`'s `s3()` dependency, so a service wired to\n`s3()` can be rewired to a `bucket` resource unchanged.\n\nAn extension (a package bringing its own Modules, resources, or deploy\ntarget) is published on npm as `prisma-composer-*`. The ecosystem is new:\ntoday the blocks above plus your own Modules are the whole set, so verify a\n`prisma-composer-*` package exists on npm before reaching for it.\n\n## Failure modes quick reference\n\n1. **Every `prisma-composer` command halts at start-up on an `effect`\n   version conflict** (`Dependency conflict: alchemy resolves effect@...`).\n   Another dependency floated a newer `effect` and the package manager\n   hoisted it over Composer's pin. Pin the whole `effect` constellation in\n   the app's `package.json` `overrides` (yarn: `resolutions`; pnpm:\n   `pnpm.overrides`): `effect` plus `@effect\u002Fsql-d1`, `@effect\u002Fsql-pg`,\n   `@effect\u002Fvitest`, and `@effect\u002Fplatform-bun`\u002F`-node`\u002F`-node-shared`, all\n   at Composer's exact pin, then reinstall. The repo's examples carry the\n   block.\n2. **A deployed `\u002Frpc\u002F\u003Cmethod>` returns `401` to anything but a wired\n   peer.** Not a broken deploy; see Contracts above.\n3. **Scale-to-zero closes idle database connections.** A persistent client\n   crashes into a 502 restart loop unless the pool is small and\n   reconnect-friendly (`new SQL({ url, max: 1, idleTimeout: 10 })` for Bun)\n   and the process logs `uncaughtException`\u002F`unhandledRejection` instead of\n   dying. Under `dev` watch-restarts against the local emulator, add\n   `prepare: false` as well: restarted processes collide on\n   prepared-statement names in the emulator's shared session.\n4. **Cold starts reset service-to-service connections.** A call into a\n   scaled-to-zero service can get `ECONNRESET`; retry it.\n5. **Bind `0.0.0.0`, not loopback.** The platform routes external HTTP to\n   the VM; a loopback-only listener is unreachable.\n6. **The ingress buffers streaming responses.** An open SSE tail delivers\n   nothing and times out at 60s; don't build on streamed HTTP responses.\n7. **Naming rules fail at load, not typecheck.** Provision ids and declared\n   node names must be ASCII letters and digits only (`[A-Za-z0-9]`): they\n   derive config keys and address segments, so a hyphenated name like\n   `my-db` passes `tsc` and then fails the load. The root module's name is\n   exempt. A provision id shorter than 3 characters is rejected by the\n   platform (name the database `'database'`, not `'db'`), and a service\n   whose name equals its enclosing Module's reads as `auth.auth` unless\n   given an explicit `id`.\n8. **`MIGRATION_PATH_NOT_FOUND`**: see Databases above; author the missing\n   migration, don't skip the plan step.\n9. **Date\u002Ftime columns hand back `Temporal.*` values on read.** Bun and\n   stock Node ship no global `Temporal`, so a service with `DateTime`\n   contract columns compiles and deploys, then fails on the first timestamp\n   read. Provide the global at the server entry\n   (`import 'temporal-polyfill\u002Fglobal'`) or use string column types.\n\n## What Composer doesn't do yet\n\nName the gap instead of inventing an API:\n\n1. **No interactive auth in the `prisma-composer` CLI.** Its deploys\n   authenticate only via a static\n   `PRISMA_SERVICE_TOKEN`; there is no `login` flow.\n2. **No in-memory contract bindings.** A dependency can't yet be wired to a\n   co-located handler without HTTP; use `bootstrapService` with a loopback\n   fake.\n3. **RPC over HTTP is the only contract kind.** No gRPC, WebSocket, or\n   streaming contracts.\n\nFor anything else missing, check `examples\u002F`, `docs\u002Fdesign\u002F10-domains\u002F`, and\n`docs\u002Fdesign\u002F90-decisions\u002F` in the prisma\u002Fcomposer repo, then file an issue\nthere rather than guessing.\n",{"data":34,"body":39},{"name":4,"metadata":35,"description":6},{"library":36,"library_version":37,"version":38},"@prisma\u002Fcomposer","0.16.0","2026.9.1",{"type":40,"children":41},"root",[42,50,113,126,159,166,171,278,314,604,624,750,817,823,828,872,877,1464,1484,1490,1613,1663,1668,1804,1810,1831,1945,1951,1994,2139,2218,2224,2229,2351,2368,2429,2465,2471,2492,2502,2512,2538,2636,2646,2656,2666,2687,2769,2775,2787,2841,2847,2865,2944,2991,3001,3066,3087,3093,3105,3311,3365,3384,3390,3755,3761,3766,3828,3854],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","Prisma Composer core concepts",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54,56,62,64,71,73,79,81,86,88,93,95,103,105,111],{"type":48,"value":55},"A ",{"type":43,"tag":57,"props":58,"children":59},"strong",{},[60],{"type":48,"value":61},"Prisma App",{"type":48,"value":63}," is a tree of typed declarations composed in TypeScript and\nhanded to the ",{"type":43,"tag":65,"props":66,"children":68},"code",{"className":67},[],[69],{"type":48,"value":70},"prisma-composer",{"type":48,"value":72}," CLI. This file covers structures,\nhierarchies, relationships, and workflows: the concepts you cannot observe\nfrom the code or the CLI's help output. It is not a CLI reference; discover\nany individual command and its flags with ",{"type":43,"tag":65,"props":74,"children":76},{"className":75},[],[77],{"type":48,"value":78},"--help",{"type":48,"value":80},". Commands named here\nbelong to the ",{"type":43,"tag":65,"props":82,"children":84},{"className":83},[],[85],{"type":48,"value":70},{"type":48,"value":87}," CLI itself; a host CLI that embeds Composer\nmay not carry every verb, so confirm a command exists via ",{"type":43,"tag":65,"props":89,"children":91},{"className":90},[],[92],{"type":48,"value":78},{"type":48,"value":94}," rather\nthan inferring it. The Prisma platform moves fast, so treat this file as the\nstable conceptual core and find current, fuller documentation at\n",{"type":43,"tag":96,"props":97,"children":101},"a",{"href":98,"rel":99},"https:\u002F\u002Fwww.prisma.io\u002Fdocs",[100],"nofollow",[102],{"type":48,"value":98},{"type":48,"value":104},". For working code, read ",{"type":43,"tag":65,"props":106,"children":108},{"className":107},[],[109],{"type":48,"value":110},"examples\u002F",{"type":48,"value":112}," in the\nprisma\u002Fcomposer repo.",{"type":43,"tag":51,"props":114,"children":115},{},[116,118,124],{"type":48,"value":117},"Two principles govern everything and are binding\n(",{"type":43,"tag":65,"props":119,"children":121},{"className":120},[],[122],{"type":48,"value":123},"docs\u002Fdesign\u002F01-principles\u002F",{"type":48,"value":125},"):",{"type":43,"tag":127,"props":128,"children":129},"ol",{},[130,149],{"type":43,"tag":131,"props":132,"children":133},"li",{},[134,139,141,147],{"type":43,"tag":57,"props":135,"children":136},{},[137],{"type":48,"value":138},"Your code never reads its environment.",{"type":48,"value":140}," Dependencies, configuration,\ncredentials, and the port all arrive through the service node, typed.\n",{"type":43,"tag":65,"props":142,"children":144},{"className":143},[],[145],{"type":48,"value":146},"process.env",{"type":48,"value":148}," is never the answer.",{"type":43,"tag":131,"props":150,"children":151},{},[152,157],{"type":43,"tag":57,"props":153,"children":154},{},[155],{"type":48,"value":156},"Composer never bundles or transforms your code.",{"type":48,"value":158}," You build with your own\nbundler; the framework assembles the built output by deterministic steps\nand hands it to the configured deploy target.",{"type":43,"tag":160,"props":161,"children":163},"h2",{"id":162},"declarations-are-data",[164],{"type":48,"value":165},"Declarations are data",{"type":43,"tag":51,"props":167,"children":168},{},[169],{"type":48,"value":170},"Everything you author is a declaration: plain data describing a piece of the\napp, executing nothing when imported. Three node kinds exist:",{"type":43,"tag":172,"props":173,"children":174},"table",{},[175,199],{"type":43,"tag":176,"props":177,"children":178},"thead",{},[179],{"type":43,"tag":180,"props":181,"children":182},"tr",{},[183,189,194],{"type":43,"tag":184,"props":185,"children":186},"th",{},[187],{"type":48,"value":188},"Kind",{"type":43,"tag":184,"props":190,"children":191},{},[192],{"type":48,"value":193},"Declared with",{"type":43,"tag":184,"props":195,"children":196},{},[197],{"type":48,"value":198},"Purpose",{"type":43,"tag":200,"props":201,"children":202},"tbody",{},[203,226,256],{"type":43,"tag":180,"props":204,"children":205},{},[206,212,221],{"type":43,"tag":207,"props":208,"children":209},"td",{},[210],{"type":48,"value":211},"Service",{"type":43,"tag":207,"props":213,"children":214},{},[215],{"type":43,"tag":65,"props":216,"children":218},{"className":217},[],[219],{"type":48,"value":220},"compute()",{"type":43,"tag":207,"props":222,"children":223},{},[224],{"type":48,"value":225},"A running unit of your code; atomic, Composer sees only its ports",{"type":43,"tag":180,"props":227,"children":228},{},[229,234,251],{"type":43,"tag":207,"props":230,"children":231},{},[232],{"type":48,"value":233},"Resource",{"type":43,"tag":207,"props":235,"children":236},{},[237,243,245],{"type":43,"tag":65,"props":238,"children":240},{"className":239},[],[241],{"type":48,"value":242},"rawPostgres()",{"type":48,"value":244},", ",{"type":43,"tag":65,"props":246,"children":248},{"className":247},[],[249],{"type":48,"value":250},"bucket()",{"type":43,"tag":207,"props":252,"children":253},{},[254],{"type":48,"value":255},"A stateful managed dependency",{"type":43,"tag":180,"props":257,"children":258},{},[259,264,273],{"type":43,"tag":207,"props":260,"children":261},{},[262],{"type":48,"value":263},"Module",{"type":43,"tag":207,"props":265,"children":266},{},[267],{"type":43,"tag":65,"props":268,"children":270},{"className":269},[],[271],{"type":48,"value":272},"module()",{"type":43,"tag":207,"props":274,"children":275},{},[276],{"type":48,"value":277},"A grouping boundary; runs no code of its own, exposes typed ports",{"type":43,"tag":51,"props":279,"children":280},{},[281,283,288,290,296,298,304,306,312],{"type":48,"value":282},"Nodes connect through ",{"type":43,"tag":57,"props":284,"children":285},{},[286],{"type":48,"value":287},"ports",{"type":48,"value":289},": ",{"type":43,"tag":65,"props":291,"children":293},{"className":292},[],[294],{"type":48,"value":295},"deps",{"type":48,"value":297}," declares what a node requires,\n",{"type":43,"tag":65,"props":299,"children":301},{"className":300},[],[302],{"type":48,"value":303},"expose",{"type":48,"value":305}," declares what it offers. Wiring happens in a Module's builder via\n",{"type":43,"tag":65,"props":307,"children":309},{"className":308},[],[310],{"type":48,"value":311},"provision()",{"type":48,"value":313},", and the root Module, handed to the CLI, is the App:",{"type":43,"tag":315,"props":316,"children":321},"pre",{"className":317,"code":318,"language":319,"meta":320,"style":320},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F module.ts\nimport { module } from '@prisma\u002Fcomposer';\n\nexport default module('store', ({ provision }) => {\n  const catalog = provision(catalogModule);\n  provision(storefrontService, { deps: { catalog: catalog.rpc } });\n});\n","ts","",[322],{"type":43,"tag":65,"props":323,"children":324},{"__ignoreMap":320},[325,337,389,398,466,509,587],{"type":43,"tag":326,"props":327,"children":330},"span",{"class":328,"line":329},"line",1,[331],{"type":43,"tag":326,"props":332,"children":334},{"style":333},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[335],{"type":48,"value":336},"\u002F\u002F module.ts\n",{"type":43,"tag":326,"props":338,"children":340},{"class":328,"line":339},2,[341,347,353,359,364,369,374,379,384],{"type":43,"tag":326,"props":342,"children":344},{"style":343},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[345],{"type":48,"value":346},"import",{"type":43,"tag":326,"props":348,"children":350},{"style":349},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[351],{"type":48,"value":352}," {",{"type":43,"tag":326,"props":354,"children":356},{"style":355},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[357],{"type":48,"value":358}," module",{"type":43,"tag":326,"props":360,"children":361},{"style":349},[362],{"type":48,"value":363}," }",{"type":43,"tag":326,"props":365,"children":366},{"style":343},[367],{"type":48,"value":368}," from",{"type":43,"tag":326,"props":370,"children":371},{"style":349},[372],{"type":48,"value":373}," '",{"type":43,"tag":326,"props":375,"children":377},{"style":376},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[378],{"type":48,"value":36},{"type":43,"tag":326,"props":380,"children":381},{"style":349},[382],{"type":48,"value":383},"'",{"type":43,"tag":326,"props":385,"children":386},{"style":349},[387],{"type":48,"value":388},";\n",{"type":43,"tag":326,"props":390,"children":391},{"class":328,"line":23},[392],{"type":43,"tag":326,"props":393,"children":395},{"emptyLinePlaceholder":394},true,[396],{"type":48,"value":397},"\n",{"type":43,"tag":326,"props":399,"children":401},{"class":328,"line":400},4,[402,407,412,416,421,425,430,434,439,444,450,455,461],{"type":43,"tag":326,"props":403,"children":404},{"style":343},[405],{"type":48,"value":406},"export",{"type":43,"tag":326,"props":408,"children":409},{"style":343},[410],{"type":48,"value":411}," default",{"type":43,"tag":326,"props":413,"children":414},{"style":349},[415],{"type":48,"value":358},{"type":43,"tag":326,"props":417,"children":418},{"style":355},[419],{"type":48,"value":420},"(",{"type":43,"tag":326,"props":422,"children":423},{"style":349},[424],{"type":48,"value":383},{"type":43,"tag":326,"props":426,"children":427},{"style":376},[428],{"type":48,"value":429},"store",{"type":43,"tag":326,"props":431,"children":432},{"style":349},[433],{"type":48,"value":383},{"type":43,"tag":326,"props":435,"children":436},{"style":349},[437],{"type":48,"value":438},",",{"type":43,"tag":326,"props":440,"children":441},{"style":349},[442],{"type":48,"value":443}," ({",{"type":43,"tag":326,"props":445,"children":447},{"style":446},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[448],{"type":48,"value":449}," provision",{"type":43,"tag":326,"props":451,"children":452},{"style":349},[453],{"type":48,"value":454}," })",{"type":43,"tag":326,"props":456,"children":458},{"style":457},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[459],{"type":48,"value":460}," =>",{"type":43,"tag":326,"props":462,"children":463},{"style":349},[464],{"type":48,"value":465}," {\n",{"type":43,"tag":326,"props":467,"children":469},{"class":328,"line":468},5,[470,475,480,485,490,495,500,505],{"type":43,"tag":326,"props":471,"children":472},{"style":457},[473],{"type":48,"value":474},"  const",{"type":43,"tag":326,"props":476,"children":477},{"style":355},[478],{"type":48,"value":479}," catalog",{"type":43,"tag":326,"props":481,"children":482},{"style":349},[483],{"type":48,"value":484}," =",{"type":43,"tag":326,"props":486,"children":488},{"style":487},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[489],{"type":48,"value":449},{"type":43,"tag":326,"props":491,"children":493},{"style":492},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[494],{"type":48,"value":420},{"type":43,"tag":326,"props":496,"children":497},{"style":355},[498],{"type":48,"value":499},"catalogModule",{"type":43,"tag":326,"props":501,"children":502},{"style":492},[503],{"type":48,"value":504},")",{"type":43,"tag":326,"props":506,"children":507},{"style":349},[508],{"type":48,"value":388},{"type":43,"tag":326,"props":510,"children":512},{"class":328,"line":511},6,[513,518,522,527,531,535,540,545,549,553,557,561,566,571,575,579,583],{"type":43,"tag":326,"props":514,"children":515},{"style":487},[516],{"type":48,"value":517},"  provision",{"type":43,"tag":326,"props":519,"children":520},{"style":492},[521],{"type":48,"value":420},{"type":43,"tag":326,"props":523,"children":524},{"style":355},[525],{"type":48,"value":526},"storefrontService",{"type":43,"tag":326,"props":528,"children":529},{"style":349},[530],{"type":48,"value":438},{"type":43,"tag":326,"props":532,"children":533},{"style":349},[534],{"type":48,"value":352},{"type":43,"tag":326,"props":536,"children":537},{"style":492},[538],{"type":48,"value":539}," deps",{"type":43,"tag":326,"props":541,"children":542},{"style":349},[543],{"type":48,"value":544},":",{"type":43,"tag":326,"props":546,"children":547},{"style":349},[548],{"type":48,"value":352},{"type":43,"tag":326,"props":550,"children":551},{"style":492},[552],{"type":48,"value":479},{"type":43,"tag":326,"props":554,"children":555},{"style":349},[556],{"type":48,"value":544},{"type":43,"tag":326,"props":558,"children":559},{"style":355},[560],{"type":48,"value":479},{"type":43,"tag":326,"props":562,"children":563},{"style":349},[564],{"type":48,"value":565},".",{"type":43,"tag":326,"props":567,"children":568},{"style":355},[569],{"type":48,"value":570},"rpc",{"type":43,"tag":326,"props":572,"children":573},{"style":349},[574],{"type":48,"value":363},{"type":43,"tag":326,"props":576,"children":577},{"style":349},[578],{"type":48,"value":363},{"type":43,"tag":326,"props":580,"children":581},{"style":492},[582],{"type":48,"value":504},{"type":43,"tag":326,"props":584,"children":585},{"style":349},[586],{"type":48,"value":388},{"type":43,"tag":326,"props":588,"children":590},{"class":328,"line":589},7,[591,596,600],{"type":43,"tag":326,"props":592,"children":593},{"style":349},[594],{"type":48,"value":595},"}",{"type":43,"tag":326,"props":597,"children":598},{"style":355},[599],{"type":48,"value":504},{"type":43,"tag":326,"props":601,"children":602},{"style":349},[603],{"type":48,"value":388},{"type":43,"tag":51,"props":605,"children":606},{},[607,609,614,616,622],{"type":48,"value":608},"Because ports are typed, ",{"type":43,"tag":57,"props":610,"children":611},{},[612],{"type":48,"value":613},"the compiler verifies every wire",{"type":48,"value":615},". A dependency\nwired to the wrong producer, a missing RPC handler, a literal input value of\nthe wrong shape: all of it fails ",{"type":43,"tag":65,"props":617,"children":619},{"className":618},[],[620],{"type":48,"value":621},"tsc",{"type":48,"value":623},", not the deploy. Env-bound input is\nthe exception: those values exist only at deploy, so secret-binding\nmismatches and missing platform variables surface as early deploy-time\nrefusals instead (see Two channels below). Typecheck, then build, then\ndeploy; don't use the cloud to find out whether the wiring is correct.",{"type":43,"tag":51,"props":625,"children":626},{},[627,629,634,636,642,644,650,651,657,658,664,665,671,673,679,681,687,688,694,696,702,704,710,711,717,718,724,726,732,734,740,742,748],{"type":48,"value":628},"Composer itself is target-agnostic: ",{"type":43,"tag":65,"props":630,"children":632},{"className":631},[],[633],{"type":48,"value":36},{"type":48,"value":635}," carries authoring,\ntesting, and the CLI, coupled to no platform. A deploy target is an extension\nregistered in the deploy config; ",{"type":43,"tag":65,"props":637,"children":639},{"className":638},[],[640],{"type":48,"value":641},"@prisma\u002Fcomposer-prisma-cloud",{"type":48,"value":643}," is the\nPrisma Cloud target and the one this skill's deploy sections assume. Its\nroot exports ",{"type":43,"tag":65,"props":645,"children":647},{"className":646},[],[648],{"type":48,"value":649},"compute",{"type":48,"value":244},{"type":43,"tag":65,"props":652,"children":654},{"className":653},[],[655],{"type":48,"value":656},"rawPostgres",{"type":48,"value":244},{"type":43,"tag":65,"props":659,"children":661},{"className":660},[],[662],{"type":48,"value":663},"bucket",{"type":48,"value":244},{"type":43,"tag":65,"props":666,"children":668},{"className":667},[],[669],{"type":48,"value":670},"envSecret",{"type":48,"value":672},", and\n",{"type":43,"tag":65,"props":674,"children":676},{"className":675},[],[677],{"type":48,"value":678},"envParam",{"type":48,"value":680},"; the ORM vocabulary (",{"type":43,"tag":65,"props":682,"children":684},{"className":683},[],[685],{"type":48,"value":686},"postgres",{"type":48,"value":244},{"type":43,"tag":65,"props":689,"children":691},{"className":690},[],[692],{"type":48,"value":693},"dataContract",{"type":48,"value":695},") lives under the\n",{"type":43,"tag":65,"props":697,"children":699},{"className":698},[],[700],{"type":48,"value":701},"\u002Form",{"type":48,"value":703}," subpath, alongside the shared ",{"type":43,"tag":65,"props":705,"children":707},{"className":706},[],[708],{"type":48,"value":709},"\u002Fcron",{"type":48,"value":244},{"type":43,"tag":65,"props":712,"children":714},{"className":713},[],[715],{"type":48,"value":716},"\u002Fstorage",{"type":48,"value":244},{"type":43,"tag":65,"props":719,"children":721},{"className":720},[],[722],{"type":48,"value":723},"\u002Fstreams",{"type":48,"value":725},",\n",{"type":43,"tag":65,"props":727,"children":729},{"className":728},[],[730],{"type":48,"value":731},"\u002Fauth",{"type":48,"value":733},", and ",{"type":43,"tag":65,"props":735,"children":737},{"className":736},[],[738],{"type":48,"value":739},"\u002Femail",{"type":48,"value":741}," modules. These are the only two Composer packages a\nbasic Prisma Cloud app needs, and nothing installs them for you: a fresh\nproject starts with neither, so add both as dependencies first. An\nextension adds its own ",{"type":43,"tag":65,"props":743,"children":745},{"className":744},[],[746],{"type":48,"value":747},"prisma-composer-*",{"type":48,"value":749}," package alongside them. Compose\nan existing Module before implementing a capability yourself; wiring one in\nis a couple of lines.",{"type":43,"tag":51,"props":751,"children":752},{},[753,755,761,763,769,771,777,779,785,787,792,794,800,802,808,810,815],{"type":48,"value":754},"Within the entry graph (everything reachable from ",{"type":43,"tag":65,"props":756,"children":758},{"className":757},[],[759],{"type":48,"value":760},"module.ts",{"type":48,"value":762},"), write\nrelative imports with explicit ",{"type":43,"tag":65,"props":764,"children":766},{"className":765},[],[767],{"type":48,"value":768},".ts",{"type":48,"value":770}," extensions (",{"type":43,"tag":65,"props":772,"children":774},{"className":773},[],[775],{"type":48,"value":776},".\u002Fservice.ts",{"type":48,"value":778},", with\n",{"type":43,"tag":65,"props":780,"children":782},{"className":781},[],[783],{"type":48,"value":784},"allowImportingTsExtensions",{"type":48,"value":786}," in tsconfig): that form resolves everywhere.\nThe ",{"type":43,"tag":65,"props":788,"children":790},{"className":789},[],[791],{"type":48,"value":70},{"type":48,"value":793}," CLI also maps ",{"type":43,"tag":65,"props":795,"children":797},{"className":796},[],[798],{"type":48,"value":799},".\u002Fservice.js",{"type":48,"value":801}," and extensionless\n",{"type":43,"tag":65,"props":803,"children":805},{"className":804},[],[806],{"type":48,"value":807},".\u002Fservice",{"type":48,"value":809}," to the ",{"type":43,"tag":65,"props":811,"children":813},{"className":812},[],[814],{"type":48,"value":768},{"type":48,"value":816}," source, but other hosts may not.",{"type":43,"tag":160,"props":818,"children":820},{"id":819},"the-service-node-is-the-only-doorway",[821],{"type":48,"value":822},"The service node is the only doorway",{"type":43,"tag":51,"props":824,"children":825},{},[826],{"type":48,"value":827},"Your runtime code receives everything from the service declaration it\nimports:",{"type":43,"tag":127,"props":829,"children":830},{},[831,842,861],{"type":43,"tag":131,"props":832,"children":833},{},[834,840],{"type":43,"tag":65,"props":835,"children":837},{"className":836},[],[838],{"type":48,"value":839},"service.load()",{"type":48,"value":841},": dependencies (typed RPC clients, database bindings).",{"type":43,"tag":131,"props":843,"children":844},{},[845,851,853,859],{"type":43,"tag":65,"props":846,"children":848},{"className":847},[],[849],{"type":48,"value":850},"service.input()",{"type":48,"value":852},": the whole input as one schema-validated object;\ncredentials in it are redacting ",{"type":43,"tag":65,"props":854,"children":856},{"className":855},[],[857],{"type":48,"value":858},"SecretString",{"type":48,"value":860}," boxes.",{"type":43,"tag":131,"props":862,"children":863},{},[864,870],{"type":43,"tag":65,"props":865,"children":867},{"className":866},[],[868],{"type":48,"value":869},"service.port()",{"type":48,"value":871},": the reserved port to bind (default 3000).",{"type":43,"tag":51,"props":873,"children":874},{},[875],{"type":48,"value":876},"A service declaration is pure data; the server entry is what your build\nproduces and the platform boots:",{"type":43,"tag":315,"props":878,"children":880},{"className":317,"code":879,"language":319,"meta":320,"style":320},"\u002F\u002F service.ts\nexport default compute({\n  name: 'auth',\n  deps: { db: rawPostgres() },\n  build: node({ module: import.meta.url, entry: '..\u002Fdist\u002Fserver.mjs' }),\n  expose: { rpc: authContract },\n});\n\n\u002F\u002F server.ts\nconst { db } = service.load(); \u002F\u002F { url }: you construct your own client\nconst handler = serve(service, {\n  rpc: { verify: async ({ token }) => ({ ok: token.length > 0 }) },\n});\nBun.serve({ port: service.port(), hostname: '0.0.0.0', fetch: handler });\n",[881],{"type":43,"tag":65,"props":882,"children":883},{"__ignoreMap":320},[884,892,917,946,986,1081,1115,1130,1138,1147,1202,1238,1341,1357],{"type":43,"tag":326,"props":885,"children":886},{"class":328,"line":329},[887],{"type":43,"tag":326,"props":888,"children":889},{"style":333},[890],{"type":48,"value":891},"\u002F\u002F service.ts\n",{"type":43,"tag":326,"props":893,"children":894},{"class":328,"line":339},[895,899,903,908,912],{"type":43,"tag":326,"props":896,"children":897},{"style":343},[898],{"type":48,"value":406},{"type":43,"tag":326,"props":900,"children":901},{"style":343},[902],{"type":48,"value":411},{"type":43,"tag":326,"props":904,"children":905},{"style":487},[906],{"type":48,"value":907}," compute",{"type":43,"tag":326,"props":909,"children":910},{"style":355},[911],{"type":48,"value":420},{"type":43,"tag":326,"props":913,"children":914},{"style":349},[915],{"type":48,"value":916},"{\n",{"type":43,"tag":326,"props":918,"children":919},{"class":328,"line":23},[920,925,929,933,938,942],{"type":43,"tag":326,"props":921,"children":922},{"style":492},[923],{"type":48,"value":924},"  name",{"type":43,"tag":326,"props":926,"children":927},{"style":349},[928],{"type":48,"value":544},{"type":43,"tag":326,"props":930,"children":931},{"style":349},[932],{"type":48,"value":373},{"type":43,"tag":326,"props":934,"children":935},{"style":376},[936],{"type":48,"value":937},"auth",{"type":43,"tag":326,"props":939,"children":940},{"style":349},[941],{"type":48,"value":383},{"type":43,"tag":326,"props":943,"children":944},{"style":349},[945],{"type":48,"value":725},{"type":43,"tag":326,"props":947,"children":948},{"class":328,"line":400},[949,954,958,962,967,971,976,981],{"type":43,"tag":326,"props":950,"children":951},{"style":492},[952],{"type":48,"value":953},"  deps",{"type":43,"tag":326,"props":955,"children":956},{"style":349},[957],{"type":48,"value":544},{"type":43,"tag":326,"props":959,"children":960},{"style":349},[961],{"type":48,"value":352},{"type":43,"tag":326,"props":963,"children":964},{"style":492},[965],{"type":48,"value":966}," db",{"type":43,"tag":326,"props":968,"children":969},{"style":349},[970],{"type":48,"value":544},{"type":43,"tag":326,"props":972,"children":973},{"style":487},[974],{"type":48,"value":975}," rawPostgres",{"type":43,"tag":326,"props":977,"children":978},{"style":355},[979],{"type":48,"value":980},"() ",{"type":43,"tag":326,"props":982,"children":983},{"style":349},[984],{"type":48,"value":985},"},\n",{"type":43,"tag":326,"props":987,"children":988},{"class":328,"line":468},[989,994,998,1003,1007,1012,1016,1020,1025,1029,1034,1038,1043,1047,1052,1056,1060,1065,1069,1073,1077],{"type":43,"tag":326,"props":990,"children":991},{"style":492},[992],{"type":48,"value":993},"  build",{"type":43,"tag":326,"props":995,"children":996},{"style":349},[997],{"type":48,"value":544},{"type":43,"tag":326,"props":999,"children":1000},{"style":487},[1001],{"type":48,"value":1002}," node",{"type":43,"tag":326,"props":1004,"children":1005},{"style":355},[1006],{"type":48,"value":420},{"type":43,"tag":326,"props":1008,"children":1009},{"style":349},[1010],{"type":48,"value":1011},"{",{"type":43,"tag":326,"props":1013,"children":1014},{"style":492},[1015],{"type":48,"value":358},{"type":43,"tag":326,"props":1017,"children":1018},{"style":349},[1019],{"type":48,"value":544},{"type":43,"tag":326,"props":1021,"children":1022},{"style":343},[1023],{"type":48,"value":1024}," import",{"type":43,"tag":326,"props":1026,"children":1027},{"style":349},[1028],{"type":48,"value":565},{"type":43,"tag":326,"props":1030,"children":1031},{"style":355},[1032],{"type":48,"value":1033},"meta",{"type":43,"tag":326,"props":1035,"children":1036},{"style":349},[1037],{"type":48,"value":565},{"type":43,"tag":326,"props":1039,"children":1040},{"style":355},[1041],{"type":48,"value":1042},"url",{"type":43,"tag":326,"props":1044,"children":1045},{"style":349},[1046],{"type":48,"value":438},{"type":43,"tag":326,"props":1048,"children":1049},{"style":492},[1050],{"type":48,"value":1051}," entry",{"type":43,"tag":326,"props":1053,"children":1054},{"style":349},[1055],{"type":48,"value":544},{"type":43,"tag":326,"props":1057,"children":1058},{"style":349},[1059],{"type":48,"value":373},{"type":43,"tag":326,"props":1061,"children":1062},{"style":376},[1063],{"type":48,"value":1064},"..\u002Fdist\u002Fserver.mjs",{"type":43,"tag":326,"props":1066,"children":1067},{"style":349},[1068],{"type":48,"value":383},{"type":43,"tag":326,"props":1070,"children":1071},{"style":349},[1072],{"type":48,"value":363},{"type":43,"tag":326,"props":1074,"children":1075},{"style":355},[1076],{"type":48,"value":504},{"type":43,"tag":326,"props":1078,"children":1079},{"style":349},[1080],{"type":48,"value":725},{"type":43,"tag":326,"props":1082,"children":1083},{"class":328,"line":511},[1084,1089,1093,1097,1102,1106,1111],{"type":43,"tag":326,"props":1085,"children":1086},{"style":492},[1087],{"type":48,"value":1088},"  expose",{"type":43,"tag":326,"props":1090,"children":1091},{"style":349},[1092],{"type":48,"value":544},{"type":43,"tag":326,"props":1094,"children":1095},{"style":349},[1096],{"type":48,"value":352},{"type":43,"tag":326,"props":1098,"children":1099},{"style":492},[1100],{"type":48,"value":1101}," rpc",{"type":43,"tag":326,"props":1103,"children":1104},{"style":349},[1105],{"type":48,"value":544},{"type":43,"tag":326,"props":1107,"children":1108},{"style":355},[1109],{"type":48,"value":1110}," authContract ",{"type":43,"tag":326,"props":1112,"children":1113},{"style":349},[1114],{"type":48,"value":985},{"type":43,"tag":326,"props":1116,"children":1117},{"class":328,"line":589},[1118,1122,1126],{"type":43,"tag":326,"props":1119,"children":1120},{"style":349},[1121],{"type":48,"value":595},{"type":43,"tag":326,"props":1123,"children":1124},{"style":355},[1125],{"type":48,"value":504},{"type":43,"tag":326,"props":1127,"children":1128},{"style":349},[1129],{"type":48,"value":388},{"type":43,"tag":326,"props":1131,"children":1133},{"class":328,"line":1132},8,[1134],{"type":43,"tag":326,"props":1135,"children":1136},{"emptyLinePlaceholder":394},[1137],{"type":48,"value":397},{"type":43,"tag":326,"props":1139,"children":1141},{"class":328,"line":1140},9,[1142],{"type":43,"tag":326,"props":1143,"children":1144},{"style":333},[1145],{"type":48,"value":1146},"\u002F\u002F server.ts\n",{"type":43,"tag":326,"props":1148,"children":1150},{"class":328,"line":1149},10,[1151,1156,1160,1165,1169,1173,1178,1182,1187,1192,1197],{"type":43,"tag":326,"props":1152,"children":1153},{"style":457},[1154],{"type":48,"value":1155},"const",{"type":43,"tag":326,"props":1157,"children":1158},{"style":349},[1159],{"type":48,"value":352},{"type":43,"tag":326,"props":1161,"children":1162},{"style":355},[1163],{"type":48,"value":1164}," db ",{"type":43,"tag":326,"props":1166,"children":1167},{"style":349},[1168],{"type":48,"value":595},{"type":43,"tag":326,"props":1170,"children":1171},{"style":349},[1172],{"type":48,"value":484},{"type":43,"tag":326,"props":1174,"children":1175},{"style":355},[1176],{"type":48,"value":1177}," service",{"type":43,"tag":326,"props":1179,"children":1180},{"style":349},[1181],{"type":48,"value":565},{"type":43,"tag":326,"props":1183,"children":1184},{"style":487},[1185],{"type":48,"value":1186},"load",{"type":43,"tag":326,"props":1188,"children":1189},{"style":355},[1190],{"type":48,"value":1191},"()",{"type":43,"tag":326,"props":1193,"children":1194},{"style":349},[1195],{"type":48,"value":1196},";",{"type":43,"tag":326,"props":1198,"children":1199},{"style":333},[1200],{"type":48,"value":1201}," \u002F\u002F { url }: you construct your own client\n",{"type":43,"tag":326,"props":1203,"children":1205},{"class":328,"line":1204},11,[1206,1210,1215,1220,1225,1230,1234],{"type":43,"tag":326,"props":1207,"children":1208},{"style":457},[1209],{"type":48,"value":1155},{"type":43,"tag":326,"props":1211,"children":1212},{"style":355},[1213],{"type":48,"value":1214}," handler ",{"type":43,"tag":326,"props":1216,"children":1217},{"style":349},[1218],{"type":48,"value":1219},"=",{"type":43,"tag":326,"props":1221,"children":1222},{"style":487},[1223],{"type":48,"value":1224}," serve",{"type":43,"tag":326,"props":1226,"children":1227},{"style":355},[1228],{"type":48,"value":1229},"(service",{"type":43,"tag":326,"props":1231,"children":1232},{"style":349},[1233],{"type":48,"value":438},{"type":43,"tag":326,"props":1235,"children":1236},{"style":349},[1237],{"type":48,"value":465},{"type":43,"tag":326,"props":1239,"children":1241},{"class":328,"line":1240},12,[1242,1247,1251,1255,1260,1264,1269,1273,1278,1282,1286,1291,1295,1300,1304,1308,1312,1317,1322,1328,1332,1337],{"type":43,"tag":326,"props":1243,"children":1244},{"style":492},[1245],{"type":48,"value":1246},"  rpc",{"type":43,"tag":326,"props":1248,"children":1249},{"style":349},[1250],{"type":48,"value":544},{"type":43,"tag":326,"props":1252,"children":1253},{"style":349},[1254],{"type":48,"value":352},{"type":43,"tag":326,"props":1256,"children":1257},{"style":487},[1258],{"type":48,"value":1259}," verify",{"type":43,"tag":326,"props":1261,"children":1262},{"style":349},[1263],{"type":48,"value":544},{"type":43,"tag":326,"props":1265,"children":1266},{"style":457},[1267],{"type":48,"value":1268}," async",{"type":43,"tag":326,"props":1270,"children":1271},{"style":349},[1272],{"type":48,"value":443},{"type":43,"tag":326,"props":1274,"children":1275},{"style":446},[1276],{"type":48,"value":1277}," token",{"type":43,"tag":326,"props":1279,"children":1280},{"style":349},[1281],{"type":48,"value":454},{"type":43,"tag":326,"props":1283,"children":1284},{"style":457},[1285],{"type":48,"value":460},{"type":43,"tag":326,"props":1287,"children":1288},{"style":355},[1289],{"type":48,"value":1290}," (",{"type":43,"tag":326,"props":1292,"children":1293},{"style":349},[1294],{"type":48,"value":1011},{"type":43,"tag":326,"props":1296,"children":1297},{"style":492},[1298],{"type":48,"value":1299}," ok",{"type":43,"tag":326,"props":1301,"children":1302},{"style":349},[1303],{"type":48,"value":544},{"type":43,"tag":326,"props":1305,"children":1306},{"style":355},[1307],{"type":48,"value":1277},{"type":43,"tag":326,"props":1309,"children":1310},{"style":349},[1311],{"type":48,"value":565},{"type":43,"tag":326,"props":1313,"children":1314},{"style":355},[1315],{"type":48,"value":1316},"length ",{"type":43,"tag":326,"props":1318,"children":1319},{"style":349},[1320],{"type":48,"value":1321},">",{"type":43,"tag":326,"props":1323,"children":1325},{"style":1324},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1326],{"type":48,"value":1327}," 0",{"type":43,"tag":326,"props":1329,"children":1330},{"style":349},[1331],{"type":48,"value":363},{"type":43,"tag":326,"props":1333,"children":1334},{"style":355},[1335],{"type":48,"value":1336},") ",{"type":43,"tag":326,"props":1338,"children":1339},{"style":349},[1340],{"type":48,"value":985},{"type":43,"tag":326,"props":1342,"children":1344},{"class":328,"line":1343},13,[1345,1349,1353],{"type":43,"tag":326,"props":1346,"children":1347},{"style":349},[1348],{"type":48,"value":595},{"type":43,"tag":326,"props":1350,"children":1351},{"style":355},[1352],{"type":48,"value":504},{"type":43,"tag":326,"props":1354,"children":1355},{"style":349},[1356],{"type":48,"value":388},{"type":43,"tag":326,"props":1358,"children":1360},{"class":328,"line":1359},14,[1361,1366,1370,1375,1379,1383,1388,1392,1396,1400,1405,1409,1413,1418,1422,1426,1431,1435,1439,1444,1448,1452,1456,1460],{"type":43,"tag":326,"props":1362,"children":1363},{"style":355},[1364],{"type":48,"value":1365},"Bun",{"type":43,"tag":326,"props":1367,"children":1368},{"style":349},[1369],{"type":48,"value":565},{"type":43,"tag":326,"props":1371,"children":1372},{"style":487},[1373],{"type":48,"value":1374},"serve",{"type":43,"tag":326,"props":1376,"children":1377},{"style":355},[1378],{"type":48,"value":420},{"type":43,"tag":326,"props":1380,"children":1381},{"style":349},[1382],{"type":48,"value":1011},{"type":43,"tag":326,"props":1384,"children":1385},{"style":492},[1386],{"type":48,"value":1387}," port",{"type":43,"tag":326,"props":1389,"children":1390},{"style":349},[1391],{"type":48,"value":544},{"type":43,"tag":326,"props":1393,"children":1394},{"style":355},[1395],{"type":48,"value":1177},{"type":43,"tag":326,"props":1397,"children":1398},{"style":349},[1399],{"type":48,"value":565},{"type":43,"tag":326,"props":1401,"children":1402},{"style":487},[1403],{"type":48,"value":1404},"port",{"type":43,"tag":326,"props":1406,"children":1407},{"style":355},[1408],{"type":48,"value":1191},{"type":43,"tag":326,"props":1410,"children":1411},{"style":349},[1412],{"type":48,"value":438},{"type":43,"tag":326,"props":1414,"children":1415},{"style":492},[1416],{"type":48,"value":1417}," hostname",{"type":43,"tag":326,"props":1419,"children":1420},{"style":349},[1421],{"type":48,"value":544},{"type":43,"tag":326,"props":1423,"children":1424},{"style":349},[1425],{"type":48,"value":373},{"type":43,"tag":326,"props":1427,"children":1428},{"style":376},[1429],{"type":48,"value":1430},"0.0.0.0",{"type":43,"tag":326,"props":1432,"children":1433},{"style":349},[1434],{"type":48,"value":383},{"type":43,"tag":326,"props":1436,"children":1437},{"style":349},[1438],{"type":48,"value":438},{"type":43,"tag":326,"props":1440,"children":1441},{"style":492},[1442],{"type":48,"value":1443}," fetch",{"type":43,"tag":326,"props":1445,"children":1446},{"style":349},[1447],{"type":48,"value":544},{"type":43,"tag":326,"props":1449,"children":1450},{"style":355},[1451],{"type":48,"value":1214},{"type":43,"tag":326,"props":1453,"children":1454},{"style":349},[1455],{"type":48,"value":595},{"type":43,"tag":326,"props":1457,"children":1458},{"style":355},[1459],{"type":48,"value":504},{"type":43,"tag":326,"props":1461,"children":1462},{"style":349},[1463],{"type":48,"value":388},{"type":43,"tag":51,"props":1465,"children":1466},{},[1467,1469,1475,1477,1483],{"type":48,"value":1468},"The consumer declares ",{"type":43,"tag":65,"props":1470,"children":1472},{"className":1471},[],[1473],{"type":48,"value":1474},"deps: { auth: rpc(authContract) }",{"type":48,"value":1476}," and gets a typed\nclient back from ",{"type":43,"tag":65,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":48,"value":1482},"load()",{"type":48,"value":565},{"type":43,"tag":160,"props":1485,"children":1487},{"id":1486},"two-channels-dependencies-and-input",[1488],{"type":48,"value":1489},"Two channels: dependencies and input",{"type":43,"tag":172,"props":1491,"children":1492},{},[1493,1519],{"type":43,"tag":176,"props":1494,"children":1495},{},[1496],{"type":43,"tag":180,"props":1497,"children":1498},{},[1499,1504,1509,1514],{"type":43,"tag":184,"props":1500,"children":1501},{},[1502],{"type":48,"value":1503},"The value is…",{"type":43,"tag":184,"props":1505,"children":1506},{},[1507],{"type":48,"value":1508},"Declare",{"type":43,"tag":184,"props":1510,"children":1511},{},[1512],{"type":48,"value":1513},"Provide",{"type":43,"tag":184,"props":1515,"children":1516},{},[1517],{"type":48,"value":1518},"Read",{"type":43,"tag":200,"props":1520,"children":1521},{},[1522,1557],{"type":43,"tag":180,"props":1523,"children":1524},{},[1525,1530,1539,1549],{"type":43,"tag":207,"props":1526,"children":1527},{},[1528],{"type":48,"value":1529},"produced by another node",{"type":43,"tag":207,"props":1531,"children":1532},{},[1533],{"type":43,"tag":65,"props":1534,"children":1536},{"className":1535},[],[1537],{"type":48,"value":1538},"deps: { db: rawPostgres() }",{"type":43,"tag":207,"props":1540,"children":1541},{},[1542,1544],{"type":48,"value":1543},"wire at ",{"type":43,"tag":65,"props":1545,"children":1547},{"className":1546},[],[1548],{"type":48,"value":311},{"type":43,"tag":207,"props":1550,"children":1551},{},[1552],{"type":43,"tag":65,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":48,"value":1482},{"type":43,"tag":180,"props":1558,"children":1559},{},[1560,1565,1578,1604],{"type":43,"tag":207,"props":1561,"children":1562},{},[1563],{"type":48,"value":1564},"anything else (config or credential)",{"type":43,"tag":207,"props":1566,"children":1567},{},[1568,1570,1576],{"type":48,"value":1569},"one field of the ",{"type":43,"tag":65,"props":1571,"children":1573},{"className":1572},[],[1574],{"type":48,"value":1575},"input",{"type":48,"value":1577}," schema",{"type":43,"tag":207,"props":1579,"children":1580},{},[1581,1583,1588,1590,1596,1598],{"type":48,"value":1582},"bind at ",{"type":43,"tag":65,"props":1584,"children":1586},{"className":1585},[],[1587],{"type":48,"value":311},{"type":48,"value":1589},": literal, ",{"type":43,"tag":65,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":48,"value":1595},"envParam()",{"type":48,"value":1597},", or ",{"type":43,"tag":65,"props":1599,"children":1601},{"className":1600},[],[1602],{"type":48,"value":1603},"envSecret()",{"type":43,"tag":207,"props":1605,"children":1606},{},[1607],{"type":43,"tag":65,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":48,"value":1612},"input()",{"type":43,"tag":51,"props":1614,"children":1615},{},[1616,1618,1630,1632,1638,1640,1646,1648,1653,1655,1661],{"type":48,"value":1617},"The service declares its whole incoming configuration, plain values and\ncredentials together, as ",{"type":43,"tag":57,"props":1619,"children":1620},{},[1621,1623],{"type":48,"value":1622},"one ",{"type":43,"tag":96,"props":1624,"children":1627},{"href":1625,"rel":1626},"https:\u002F\u002Fstandardschema.dev",[100],[1628],{"type":48,"value":1629},"Standard Schema",{"type":48,"value":1631},"\n(arktype is the house choice). A credential is a field typed as\n",{"type":43,"tag":65,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":48,"value":1637},"secretString()",{"type":48,"value":1639}," from ",{"type":43,"tag":65,"props":1641,"children":1643},{"className":1642},[],[1644],{"type":48,"value":1645},"@prisma\u002Fcomposer\u002Farktype",{"type":48,"value":1647},"; conditional legality (\"no\nstripe key unless billing is on\") is an ordinary schema union. The binding at\n",{"type":43,"tag":65,"props":1649,"children":1651},{"className":1650},[],[1652],{"type":48,"value":311},{"type":48,"value":1654}," mirrors the schema's shape; ",{"type":43,"tag":65,"props":1656,"children":1658},{"className":1657},[],[1659],{"type":48,"value":1660},"envSecret('NAME')",{"type":48,"value":1662}," names the\nplatform variable and never carries the value.",{"type":43,"tag":51,"props":1664,"children":1665},{},[1666],{"type":48,"value":1667},"Rules that bite:",{"type":43,"tag":127,"props":1669,"children":1670},{},[1671,1695,1710,1736,1775,1793],{"type":43,"tag":131,"props":1672,"children":1673},{},[1674,1679,1681,1686,1688,1693],{"type":43,"tag":57,"props":1675,"children":1676},{},[1677],{"type":48,"value":1678},"Secretness is enforced by validation.",{"type":48,"value":1680}," A literal bound where the schema\nexpects ",{"type":43,"tag":65,"props":1682,"children":1684},{"className":1683},[],[1685],{"type":48,"value":858},{"type":48,"value":1687}," fails the deploy; ",{"type":43,"tag":65,"props":1689,"children":1691},{"className":1690},[],[1692],{"type":48,"value":670},{"type":48,"value":1694}," bound to a plain\nstring field fails the same way.",{"type":43,"tag":131,"props":1696,"children":1697},{},[1698,1708],{"type":43,"tag":57,"props":1699,"children":1700},{},[1701,1706],{"type":43,"tag":65,"props":1702,"children":1704},{"className":1703},[],[1705],{"type":48,"value":678},{"type":48,"value":1707}," values arrive as raw strings",{"type":48,"value":1709},"; bind them to string fields.\nThe stage's platform variable is the store; the deploying shell only seeds\na missing name (and the deploy fails early, naming the variable, when both\nlack it). Changing the platform value needs a redeploy.",{"type":43,"tag":131,"props":1711,"children":1712},{},[1713,1718,1720,1726,1728,1734],{"type":43,"tag":57,"props":1714,"children":1715},{},[1716],{"type":48,"value":1717},"Absence is the schema's call.",{"type":48,"value":1719}," An env-bound field whose variable is\nunset or empty resolves to ",{"type":43,"tag":1721,"props":1722,"children":1723},"em",{},[1724],{"type":48,"value":1725},"key omitted",{"type":48,"value":1727},", which is legal only if the\nschema allows it (optional field, union arm). The deploy report prints the\nserialized input document (secrets ride as ",{"type":43,"tag":65,"props":1729,"children":1731},{"className":1730},[],[1732],{"type":48,"value":1733},"{\"$secret\":\"VAR\"}",{"type":48,"value":1735}," pointers)\nand every key that resolved absent.",{"type":43,"tag":131,"props":1737,"children":1738},{},[1739,1751,1753,1758,1760,1765,1767,1773],{"type":43,"tag":57,"props":1740,"children":1741},{},[1742,1744,1749],{"type":48,"value":1743},"The reserved ",{"type":43,"tag":65,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":48,"value":1404},{"type":48,"value":1750}," is outside the schema.",{"type":48,"value":1752}," Read it through\n",{"type":43,"tag":65,"props":1754,"children":1756},{"className":1755},[],[1757],{"type":48,"value":869},{"type":48,"value":1759},", never ",{"type":43,"tag":65,"props":1761,"children":1763},{"className":1762},[],[1764],{"type":48,"value":146},{"type":48,"value":1766},". The framework also exports ",{"type":43,"tag":65,"props":1768,"children":1770},{"className":1769},[],[1771],{"type":48,"value":1772},"PORT",{"type":48,"value":1774},"\nfor Next.js standalone, which binds it itself.",{"type":43,"tag":131,"props":1776,"children":1777},{},[1778,1783,1785,1791],{"type":43,"tag":57,"props":1779,"children":1780},{},[1781],{"type":48,"value":1782},"A Module forwards a secret need without learning the platform name.",{"type":48,"value":1784},"\nDeclare ",{"type":43,"tag":65,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":48,"value":1790},"secrets: { signingKey: secret() }",{"type":48,"value":1792}," on the Module boundary and\npass the forwarded ref as a binding leaf; the parent binds the real\nsource.",{"type":43,"tag":131,"props":1794,"children":1795},{},[1796,1802],{"type":43,"tag":65,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":48,"value":1801},"input.apiKey.expose()",{"type":48,"value":1803}," is the only way to a secret's value; the box\nredacts everywhere else (logs, JSON, errors).",{"type":43,"tag":160,"props":1805,"children":1807},{"id":1806},"contracts-and-rpc",[1808],{"type":48,"value":1809},"Contracts and RPC",{"type":43,"tag":51,"props":1811,"children":1812},{},[1813,1815,1821,1823,1829],{"type":48,"value":1814},"A contract is the typed interface through which services communicate. It\nlives with the service that owns it, typed by any Standard Schema validator,\nand both provider (",{"type":43,"tag":65,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":48,"value":1820},"serve()",{"type":48,"value":1822},", exhaustive over the contract's methods at\ncompile time) and consumer (",{"type":43,"tag":65,"props":1824,"children":1826},{"className":1825},[],[1827],{"type":48,"value":1828},"rpc(contract)",{"type":48,"value":1830},") reference the same value. Calls\ntravel as RPC over HTTP. Two behaviours are provisioned for you and must not\nbe reimplemented:",{"type":43,"tag":127,"props":1832,"children":1833},{},[1834,1890],{"type":43,"tag":131,"props":1835,"children":1836},{},[1837,1842,1844,1849,1851,1857,1859,1865,1867,1873,1875,1880,1882,1888],{"type":43,"tag":57,"props":1838,"children":1839},{},[1840],{"type":48,"value":1841},"Service keys.",{"type":48,"value":1843}," At deploy, Composer mints a distinct unguessable key per\nconsumer→provider binding; ",{"type":43,"tag":65,"props":1845,"children":1847},{"className":1846},[],[1848],{"type":48,"value":1820},{"type":48,"value":1850}," returns ",{"type":43,"tag":65,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":48,"value":1856},"401",{"type":48,"value":1858}," to anything else before\nthe handler runs. Nothing in your code declares it. Consequences: don't\nbuild your own service-to-service auth, and don't ",{"type":43,"tag":65,"props":1860,"children":1862},{"className":1861},[],[1863],{"type":48,"value":1864},"curl",{"type":48,"value":1866}," a deployed\n",{"type":43,"tag":65,"props":1868,"children":1870},{"className":1869},[],[1871],{"type":48,"value":1872},"\u002Frpc\u002F\u003Cmethod>",{"type":48,"value":1874}," to check it works. An unwired caller always gets ",{"type":43,"tag":65,"props":1876,"children":1878},{"className":1877},[],[1879],{"type":48,"value":1856},{"type":48,"value":1881},",\nwhich looks like a broken deploy and isn't. Debug through a consumer, or\nlocally, where nothing is enforced. Keys are per binding (one leaking\ncan't impersonate another consumer), service-scoped (any valid key\nreaches every method; split services to gate separately), rotated only by\nremoving the binding or destroying the stack and redeploying, and stored\nin deploy-owned ",{"type":43,"tag":65,"props":1883,"children":1885},{"className":1884},[],[1886],{"type":48,"value":1887},"COMPOSER_*",{"type":48,"value":1889}," variables you never hand-edit.",{"type":43,"tag":131,"props":1891,"children":1892},{},[1893,1898,1900,1906,1908,1913,1915,1921,1923,1929,1930,1936,1938,1943],{"type":43,"tag":57,"props":1894,"children":1895},{},[1896],{"type":48,"value":1897},"Idempotency and retries.",{"type":48,"value":1899}," Every generated-client call carries an\n",{"type":43,"tag":65,"props":1901,"children":1903},{"className":1902},[],[1904],{"type":48,"value":1905},"Idempotency-Key",{"type":48,"value":1907},"; dropped calls retry with backoff, and ",{"type":43,"tag":65,"props":1909,"children":1911},{"className":1910},[],[1912],{"type":48,"value":1820},{"type":48,"value":1914}," runs\none call per key, replaying the completed answer to late retries. Every\nmethod is therefore safely retryable and no contract declares anything\nabout it (there is no \"is this idempotent\" flag; don't invent one). A\nhandler may take an optional third argument ",{"type":43,"tag":65,"props":1916,"children":1918},{"className":1917},[],[1919],{"type":48,"value":1920},"(input, deps, ctx)",{"type":48,"value":1922}," and read\n",{"type":43,"tag":65,"props":1924,"children":1926},{"className":1925},[],[1927],{"type":48,"value":1928},"ctx.idempotencyKey",{"type":48,"value":1290},{"type":43,"tag":65,"props":1931,"children":1933},{"className":1932},[],[1934],{"type":48,"value":1935},"string | undefined",{"type":48,"value":1937},") if it needs exactly-once\nbeyond one instance's memory; most don't. Locally and in tests nothing is\nprovisioned, so ",{"type":43,"tag":65,"props":1939,"children":1941},{"className":1940},[],[1942],{"type":48,"value":1820},{"type":48,"value":1944}," passes every call through: never supply a key\nin test inputs.",{"type":43,"tag":160,"props":1946,"children":1948},{"id":1947},"builds-are-yours",[1949],{"type":48,"value":1950},"Builds are yours",{"type":43,"tag":51,"props":1952,"children":1953},{},[1954,1956,1962,1964,1970,1971,1977,1978,1984,1986,1992],{"type":48,"value":1955},"You build, the framework assembles. For a plain server process, ",{"type":43,"tag":65,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":48,"value":1961},"entry",{"type":48,"value":1963}," must\npoint at a single self-contained ESM file: everything inlined except runtime\nbuilt-ins (",{"type":43,"tag":65,"props":1965,"children":1967},{"className":1966},[],[1968],{"type":48,"value":1969},"bun",{"type":48,"value":244},{"type":43,"tag":65,"props":1972,"children":1974},{"className":1973},[],[1975],{"type":48,"value":1976},"bun:*",{"type":48,"value":244},{"type":43,"tag":65,"props":1979,"children":1981},{"className":1980},[],[1982],{"type":48,"value":1983},"node:*",{"type":48,"value":1985},"). Deploy copies that one file and never\nships ",{"type":43,"tag":65,"props":1987,"children":1989},{"className":1988},[],[1990],{"type":48,"value":1991},"node_modules",{"type":48,"value":1993},", so anything left un-inlined fails at boot, not at\ndeploy. Rules that bite:",{"type":43,"tag":127,"props":1995,"children":1996},{},[1997,2007,2066,2114],{"type":43,"tag":131,"props":1998,"children":1999},{},[2000,2005],{"type":43,"tag":57,"props":2001,"children":2002},{},[2003],{"type":48,"value":2004},"Two services in one package means two separate builds",{"type":48,"value":2006},", one per entry.\nA single multi-entry build splits shared code into a chunk neither output\ncontains.",{"type":43,"tag":131,"props":2008,"children":2009},{},[2010,2028,2029,2034,2036,2041,2043,2048,2050,2056,2058,2064],{"type":43,"tag":57,"props":2011,"children":2012},{},[2013,2015,2021,2023],{"type":48,"value":2014},"A directory build uses ",{"type":43,"tag":65,"props":2016,"children":2018},{"className":2017},[],[2019],{"type":48,"value":2020},"dir",{"type":48,"value":2022}," + ",{"type":43,"tag":65,"props":2024,"children":2026},{"className":2025},[],[2027],{"type":48,"value":1961},{"type":48,"value":1290},{"type":43,"tag":65,"props":2030,"children":2032},{"className":2031},[],[2033],{"type":48,"value":2020},{"type":48,"value":2035}," relative to the service\nmodule, ",{"type":43,"tag":65,"props":2037,"children":2039},{"className":2038},[],[2040],{"type":48,"value":1961},{"type":48,"value":2042}," a file inside ",{"type":43,"tag":65,"props":2044,"children":2046},{"className":2045},[],[2047],{"type":48,"value":2020},{"type":48,"value":2049},"; ",{"type":43,"tag":65,"props":2051,"children":2053},{"className":2052},[],[2054],{"type":48,"value":2055},"..\u002F",{"type":48,"value":2057}," is an error). The tree is\ncopied verbatim, so the server must resolve siblings against\n",{"type":43,"tag":65,"props":2059,"children":2061},{"className":2060},[],[2062],{"type":48,"value":2063},"import.meta.url",{"type":48,"value":2065},", not the working directory. The tree must contain no\nsymlinks: the packager rejects them, names the link, and assembly fails.",{"type":43,"tag":131,"props":2067,"children":2068},{},[2069,2074,2075,2081,2083,2089,2091,2097,2099,2104,2106,2112],{"type":43,"tag":57,"props":2070,"children":2071},{},[2072],{"type":48,"value":2073},"Next.js",{"type":48,"value":289},{"type":43,"tag":65,"props":2076,"children":2078},{"className":2077},[],[2079],{"type":48,"value":2080},"next build",{"type":48,"value":2082}," with ",{"type":43,"tag":65,"props":2084,"children":2086},{"className":2085},[],[2087],{"type":48,"value":2088},"output: 'standalone'",{"type":48,"value":2090}," is the whole build;\n",{"type":43,"tag":65,"props":2092,"children":2094},{"className":2093},[],[2095],{"type":48,"value":2096},"nextjs({ module, appDir })",{"type":48,"value":2098}," names the app root. Any page or action that\ncalls ",{"type":43,"tag":65,"props":2100,"children":2102},{"className":2101},[],[2103],{"type":48,"value":1482},{"type":48,"value":2105}," needs ",{"type":43,"tag":65,"props":2107,"children":2109},{"className":2108},[],[2110],{"type":48,"value":2111},"export const dynamic = 'force-dynamic'",{"type":48,"value":2113},", because\nthe runtime environment doesn't exist at build time and Next ignores\nruntime env for prerendered routes.",{"type":43,"tag":131,"props":2115,"children":2116},{},[2117,2137],{"type":43,"tag":57,"props":2118,"children":2119},{},[2120,2122,2128,2130,2136],{"type":48,"value":2121},"Always build before ",{"type":43,"tag":65,"props":2123,"children":2125},{"className":2124},[],[2126],{"type":48,"value":2127},"deploy",{"type":48,"value":2129}," or ",{"type":43,"tag":65,"props":2131,"children":2133},{"className":2132},[],[2134],{"type":48,"value":2135},"dev",{"type":48,"value":565},{"type":48,"value":2138}," Neither builds for you.",{"type":43,"tag":51,"props":2140,"children":2141},{},[2142,2144,2150,2152,2158,2159,2165,2166,2172,2174,2179,2181,2187,2188,2194,2195,2201,2203,2209,2211,2216],{"type":48,"value":2143},"Deploy configuration lives in ",{"type":43,"tag":65,"props":2145,"children":2147},{"className":2146},[],[2148],{"type":48,"value":2149},"prisma-composer.config.ts",{"type":48,"value":2151}," (or ",{"type":43,"tag":65,"props":2153,"children":2155},{"className":2154},[],[2156],{"type":48,"value":2157},".mts",{"type":48,"value":244},{"type":43,"tag":65,"props":2160,"children":2162},{"className":2161},[],[2163],{"type":48,"value":2164},".mjs",{"type":48,"value":725},{"type":43,"tag":65,"props":2167,"children":2169},{"className":2168},[],[2170],{"type":48,"value":2171},".js",{"type":48,"value":2173},"; nearest ancestor of the entry wins, ",{"type":43,"tag":65,"props":2175,"children":2177},{"className":2176},[],[2178],{"type":48,"value":768},{"type":48,"value":2180}," first within a directory).\nIt registers extensions (",{"type":43,"tag":65,"props":2182,"children":2184},{"className":2183},[],[2185],{"type":48,"value":2186},"prismaCloud()",{"type":48,"value":244},{"type":43,"tag":65,"props":2189,"children":2191},{"className":2190},[],[2192],{"type":48,"value":2193},"nodeBuild()",{"type":48,"value":244},{"type":43,"tag":65,"props":2196,"children":2198},{"className":2197},[],[2199],{"type":48,"value":2200},"nextjsBuild()",{"type":48,"value":2202}," when\nthe app has a Next.js service) and the deploy-state backend\n(",{"type":43,"tag":65,"props":2204,"children":2206},{"className":2205},[],[2207],{"type":48,"value":2208},"prismaState()",{"type":48,"value":2210},"). It is read by the CLI's operations (deploy, destroy, and\ndev; a ",{"type":43,"tag":65,"props":2212,"children":2214},{"className":2213},[],[2215],{"type":48,"value":2135},{"type":48,"value":2217}," run without one refuses, naming the missing file) and never\nimported by app code.",{"type":43,"tag":160,"props":2219,"children":2221},{"id":2220},"databases-and-migrations",[2222],{"type":48,"value":2223},"Databases and migrations",{"type":43,"tag":51,"props":2225,"children":2226},{},[2227],{"type":48,"value":2228},"Two kinds of Postgres dependency:",{"type":43,"tag":127,"props":2230,"children":2231},{},[2232,2253],{"type":43,"tag":131,"props":2233,"children":2234},{},[2235,2243,2245,2251],{"type":43,"tag":57,"props":2236,"children":2237},{},[2238],{"type":43,"tag":65,"props":2239,"children":2241},{"className":2240},[],[2242],{"type":48,"value":242},{"type":48,"value":2244},": the binding is ",{"type":43,"tag":65,"props":2246,"children":2248},{"className":2247},[],[2249],{"type":48,"value":2250},"{ url }",{"type":48,"value":2252}," and the app owns its client.",{"type":43,"tag":131,"props":2254,"children":2255},{},[2256,2265,2267,2273,2275,2281,2283,2288,2290,2295,2297,2303,2305,2310,2312,2318,2320,2326,2328,2334,2336,2342,2344,2350],{"type":43,"tag":57,"props":2257,"children":2258},{},[2259],{"type":43,"tag":65,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":48,"value":2264},"postgres(...)",{"type":48,"value":2266},": a Prisma-ORM-typed database. The binding is\n",{"type":43,"tag":65,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":48,"value":2272},"{ url, client }",{"type":48,"value":2274}," (ADR-0040): the raw connection URL plus the typed\nclient Composer constructs from your data contract, lazily on first\naccess, so queries go through ",{"type":43,"tag":65,"props":2276,"children":2278},{"className":2277},[],[2279],{"type":48,"value":2280},"binding.client",{"type":48,"value":2282}," and are compile-time\nchecked. Both ",{"type":43,"tag":65,"props":2284,"children":2286},{"className":2285},[],[2287],{"type":48,"value":686},{"type":48,"value":2289}," and ",{"type":43,"tag":65,"props":2291,"children":2293},{"className":2292},[],[2294],{"type":48,"value":693},{"type":48,"value":2296}," import from\n",{"type":43,"tag":65,"props":2298,"children":2300},{"className":2299},[],[2301],{"type":48,"value":2302},"@prisma\u002Fcomposer-prisma-cloud\u002Form",{"type":48,"value":2304},", not the package root. One\n",{"type":43,"tag":65,"props":2306,"children":2308},{"className":2307},[],[2309],{"type":48,"value":693},{"type":48,"value":2311},"-wrapped value (emitted from ",{"type":43,"tag":65,"props":2313,"children":2315},{"className":2314},[],[2316],{"type":48,"value":2317},"contract.prisma",{"type":48,"value":2319}," by\n",{"type":43,"tag":65,"props":2321,"children":2323},{"className":2322},[],[2324],{"type":48,"value":2325},"prisma contract emit",{"type":48,"value":2327},") is referenced by both the dependency end\n(",{"type":43,"tag":65,"props":2329,"children":2331},{"className":2330},[],[2332],{"type":48,"value":2333},"deps: { db: postgres(catalogData) }",{"type":48,"value":2335},") and the resource end, which also\nnames the ",{"type":43,"tag":65,"props":2337,"children":2339},{"className":2338},[],[2340],{"type":48,"value":2341},"prisma.config.ts",{"type":48,"value":2343}," path so the deploy's migration step can\nfind ",{"type":43,"tag":65,"props":2345,"children":2347},{"className":2346},[],[2348],{"type":48,"value":2349},"migrations\u002F",{"type":48,"value":565},{"type":43,"tag":51,"props":2352,"children":2353},{},[2354,2359,2361,2366],{"type":43,"tag":57,"props":2355,"children":2356},{},[2357],{"type":48,"value":2358},"Deploys are replay-only",{"type":48,"value":2360},": they apply the migrations committed under\n",{"type":43,"tag":65,"props":2362,"children":2364},{"className":2363},[],[2365],{"type":48,"value":2349},{"type":48,"value":2367}," and never create schema themselves. Every schema change,\nincluding the first schema of a new database, follows one loop:",{"type":43,"tag":127,"props":2369,"children":2370},{},[2371,2382,2406,2417],{"type":43,"tag":131,"props":2372,"children":2373},{},[2374,2376,2381],{"type":48,"value":2375},"Edit ",{"type":43,"tag":65,"props":2377,"children":2379},{"className":2378},[],[2380],{"type":48,"value":2317},{"type":48,"value":565},{"type":43,"tag":131,"props":2383,"children":2384},{},[2385,2390,2392,2398,2399,2405],{"type":43,"tag":65,"props":2386,"children":2388},{"className":2387},[],[2389],{"type":48,"value":2325},{"type":48,"value":2391}," regenerates ",{"type":43,"tag":65,"props":2393,"children":2395},{"className":2394},[],[2396],{"type":48,"value":2397},"contract.json",{"type":48,"value":2022},{"type":43,"tag":65,"props":2400,"children":2402},{"className":2401},[],[2403],{"type":48,"value":2404},"contract.d.ts",{"type":48,"value":565},{"type":43,"tag":131,"props":2407,"children":2408},{},[2409,2415],{"type":43,"tag":65,"props":2410,"children":2412},{"className":2411},[],[2413],{"type":48,"value":2414},"prisma migration plan --name \u003Cslug>",{"type":48,"value":2416}," authors the migration (on an empty\ngraph this authors the baseline).",{"type":43,"tag":131,"props":2418,"children":2419},{},[2420,2422,2427],{"type":48,"value":2421},"Commit ",{"type":43,"tag":65,"props":2423,"children":2425},{"className":2424},[],[2426],{"type":48,"value":2349},{"type":48,"value":2428}," with the change, then deploy. A fresh database\nreplays the whole path from empty.",{"type":43,"tag":51,"props":2430,"children":2431},{},[2432,2434,2439,2441,2447,2449,2455,2457,2463],{"type":48,"value":2433},"If no authored path reaches the target contract, deploy (and ",{"type":43,"tag":65,"props":2435,"children":2437},{"className":2436},[],[2438],{"type":48,"value":2135},{"type":48,"value":2440}," against a\nstale local database) refuses with ",{"type":43,"tag":65,"props":2442,"children":2444},{"className":2443},[],[2445],{"type":48,"value":2446},"MIGRATION_PATH_NOT_FOUND",{"type":48,"value":2448},"; its message\nlists the two ways out: author the missing migration, or, when iterating\nagainst a local\ndatabase only, ",{"type":43,"tag":65,"props":2450,"children":2452},{"className":2451},[],[2453],{"type":48,"value":2454},"prisma db update",{"type":48,"value":2456},". Never skip step 3 before a deploy. See\n",{"type":43,"tag":65,"props":2458,"children":2460},{"className":2459},[],[2461],{"type":48,"value":2462},"examples\u002Fstore\u002Fmodules\u002Fcatalog",{"type":48,"value":2464}," for the complete pattern.",{"type":43,"tag":160,"props":2466,"children":2468},{"id":2467},"deploy-model-converge-dont-script",[2469],{"type":48,"value":2470},"Deploy model: converge, don't script",{"type":43,"tag":51,"props":2472,"children":2473},{},[2474,2476,2482,2484,2490],{"type":48,"value":2475},"Deploy compares the declared topology against recorded deploy state and\napplies only the difference. Re-deploying with nothing changed is a no-op;\nremoving a node removes its deployed resource. The Prisma Cloud target\nrequires exactly two environment variables: ",{"type":43,"tag":65,"props":2477,"children":2479},{"className":2478},[],[2480],{"type":48,"value":2481},"PRISMA_SERVICE_TOKEN",{"type":48,"value":2483}," and\n",{"type":43,"tag":65,"props":2485,"children":2487},{"className":2486},[],[2488],{"type":48,"value":2489},"PRISMA_WORKSPACE_ID",{"type":48,"value":2491},". There is no interactive login.",{"type":43,"tag":51,"props":2493,"children":2494},{},[2495,2500],{"type":43,"tag":57,"props":2496,"children":2497},{},[2498],{"type":48,"value":2499},"Stages.",{"type":48,"value":2501}," A stage is an environment name chosen on the command line at\ndeploy time, never written in the topology. The identical graph deploys\neverywhere. On the Prisma Cloud target, a Prisma App is one Project and a\nstage is a Branch of it, with its own running services, its own empty\ndatabase, its own configuration. A stage name must be a valid git ref name;\nan invalid name is a hard error.",{"type":43,"tag":51,"props":2503,"children":2504},{},[2505,2510],{"type":43,"tag":57,"props":2506,"children":2507},{},[2508],{"type":48,"value":2509},"Destroy",{"type":48,"value":2511}," always requires an explicit target: a bare destroy is an error,\nand naming a stage and production together is too. Destroying a stage\ndeletes its Branch after removing its resources. Destroying production\nremoves only the resources inside the production Branch, never the Branch\nitself directly; once the Project is empty it is deleted too, and that\ndeletion takes the production Branch with it. A Project still holding\nanother stage's resources is kept. Destroy never creates anything:\ndestroying a\nnever-deployed stage fails rather than standing one up.",{"type":43,"tag":51,"props":2513,"children":2514},{},[2515,2520,2522,2529,2531,2536],{"type":43,"tag":57,"props":2516,"children":2517},{},[2518],{"type":48,"value":2519},"The engine underneath is alchemy.",{"type":48,"value":2521}," Convergence is executed by\n",{"type":43,"tag":96,"props":2523,"children":2526},{"href":2524,"rel":2525},"https:\u002F\u002Falchemy.run",[100],[2527],{"type":48,"value":2528},"alchemy",{"type":48,"value":2530},", a third-party infrastructure-as-code engine\nthat arrives as an ordinary, exactly-pinned npm dependency of\n",{"type":43,"tag":65,"props":2532,"children":2534},{"className":2533},[],[2535],{"type":48,"value":36},{"type":48,"value":2537}," (2.0.0-beta.74 at this library version). Your code never\nimports or configures it; consult alchemy's own docs for the engine itself.\nWhat matters operationally:",{"type":43,"tag":127,"props":2539,"children":2540},{},[2541,2577,2598,2609],{"type":43,"tag":131,"props":2542,"children":2543},{},[2544,2546,2552,2554,2559,2561,2567,2569,2575],{"type":48,"value":2545},"Deploy and destroy write the pipeline's results to a generated, gitignored\nstack file at ",{"type":43,"tag":65,"props":2547,"children":2549},{"className":2548},[],[2550],{"type":48,"value":2551},".prisma-composer\u002Falchemy.run.ts",{"type":48,"value":2553},", then run the alchemy CLI\nagainst it as a child process; ",{"type":43,"tag":65,"props":2555,"children":2557},{"className":2556},[],[2558],{"type":48,"value":2135},{"type":48,"value":2560}," does the same at\n",{"type":43,"tag":65,"props":2562,"children":2564},{"className":2563},[],[2565],{"type":48,"value":2566},".prisma-composer\u002Fdev\u002Falchemy.run.ts",{"type":48,"value":2568}," with local providers. The file\ncarries the computed values as literals but reads credentials via\n",{"type":43,"tag":65,"props":2570,"children":2572},{"className":2571},[],[2573],{"type":48,"value":2574},"fromEnv()",{"type":48,"value":2576},", so nothing sensitive lands on disk, and it is regenerated\nevery run: output, not configuration, never edited.",{"type":43,"tag":131,"props":2578,"children":2579},{},[2580,2582,2588,2590,2596],{"type":48,"value":2581},"Failures are bisectable through that file. A failing deploy names its\npath; running ",{"type":43,"tag":65,"props":2583,"children":2585},{"className":2584},[],[2586],{"type":48,"value":2587},"alchemy deploy .prisma-composer\u002Falchemy.run.ts",{"type":48,"value":2589}," directly\nseparates \"the framework computed the wrong thing\" from \"the engine or\nplatform rejected the right thing\". An engine failure surfaces as\n",{"type":43,"tag":65,"props":2591,"children":2593},{"className":2592},[],[2594],{"type":48,"value":2595},"DEPLOY.ENGINE_FAILED",{"type":48,"value":2597}," carrying the exit code and that reproduce command;\nthe child's live output streams to the terminal either way.",{"type":43,"tag":131,"props":2599,"children":2600},{},[2601,2603,2608],{"type":48,"value":2602},"Destroy evaluates the same stack program as deploy, and evaluating it\npackages the assembled bundles, so ",{"type":43,"tag":57,"props":2604,"children":2605},{},[2606],{"type":48,"value":2607},"an app must be built before it can\nbe torn down",{"type":48,"value":565},{"type":43,"tag":131,"props":2610,"children":2611},{},[2612,2614,2620,2622,2627,2629,2634],{"type":48,"value":2613},"alchemy is why the ",{"type":43,"tag":65,"props":2615,"children":2617},{"className":2616},[],[2618],{"type":48,"value":2619},"effect",{"type":48,"value":2621}," pin exists: it resolves the ",{"type":43,"tag":65,"props":2623,"children":2625},{"className":2624},[],[2626],{"type":48,"value":2619},{"type":48,"value":2628},"\nconstellation, and a hoisted newer ",{"type":43,"tag":65,"props":2630,"children":2632},{"className":2631},[],[2633],{"type":48,"value":2619},{"type":48,"value":2635}," halts every command (failure\nmode 1 below).",{"type":43,"tag":51,"props":2637,"children":2638},{},[2639,2644],{"type":43,"tag":57,"props":2640,"children":2641},{},[2642],{"type":48,"value":2643},"The deploy report",{"type":48,"value":2645}," ends with the app's own topology: authored names, the\nplatform resource each became, and public URLs. Read ids out of it rather\nthan hunting in the Console. A URL appears only where the address is\ngenuinely public: a service prints one, a database never does, and a\nnode whose product is secret material reports no resource line at all.",{"type":43,"tag":51,"props":2647,"children":2648},{},[2649,2654],{"type":43,"tag":57,"props":2650,"children":2651},{},[2652],{"type":48,"value":2653},"Connection contract refusals.",{"type":48,"value":2655}," A connection declares the values it needs\nby name; a producer that omits one fails the deploy, naming the edge, the\nparam, and what the producer did supply:",{"type":43,"tag":315,"props":2657,"children":2661},{"className":2658,"code":2660,"language":48,"meta":320},[2659],"language-text","Connection input \"auth.db\" declares param \"url\", but its producer \"db\" did not\nsupply it — the producer's outputs carry [host].\n",[2662],{"type":43,"tag":65,"props":2663,"children":2664},{"__ignoreMap":320},[2665],{"type":48,"value":2660},{"type":43,"tag":51,"props":2667,"children":2668},{},[2669,2671,2677,2679,2685],{"type":48,"value":2670},"This is a deploy-time refusal, not a broken deploy, and it can appear on an\napp whose code didn't change (the gap used to pass silently as ",{"type":43,"tag":65,"props":2672,"children":2674},{"className":2673},[],[2675],{"type":48,"value":2676},"undefined",{"type":48,"value":2678},"\nand crash the consumer at boot). Fix whichever end is wrong; don't mark the\nparam ",{"type":43,"tag":65,"props":2680,"children":2682},{"className":2681},[],[2683],{"type":48,"value":2684},"optional",{"type":48,"value":2686}," unless absent really is legal. Only reachable if you\nauthored the connection or an extension on one side.",{"type":43,"tag":51,"props":2688,"children":2689},{},[2690,2695,2697,2703,2705,2710,2711,2717,2718,2723,2724,2730,2732,2738,2740,2746,2748,2754,2755,2760,2761,2767],{"type":43,"tag":57,"props":2691,"children":2692},{},[2693],{"type":48,"value":2694},"Driving deploys from code.",{"type":48,"value":2696}," ",{"type":43,"tag":65,"props":2698,"children":2700},{"className":2699},[],[2701],{"type":48,"value":2702},"@prisma\u002Fcomposer\u002Fcontrol",{"type":48,"value":2704}," exposes typed\n",{"type":43,"tag":65,"props":2706,"children":2708},{"className":2707},[],[2709],{"type":48,"value":2127},{"type":48,"value":244},{"type":43,"tag":65,"props":2712,"children":2714},{"className":2713},[],[2715],{"type":48,"value":2716},"destroy",{"type":48,"value":244},{"type":43,"tag":65,"props":2719,"children":2721},{"className":2720},[],[2722],{"type":48,"value":2135},{"type":48,"value":733},{"type":43,"tag":65,"props":2725,"children":2727},{"className":2726},[],[2728],{"type":48,"value":2729},"log",{"type":48,"value":2731}," returning structured results. Failures\ncome back as ",{"type":43,"tag":65,"props":2733,"children":2735},{"className":2734},[],[2736],{"type":48,"value":2737},"{ ok: false, failure }",{"type":48,"value":2739}," with a dotted ",{"type":43,"tag":65,"props":2741,"children":2743},{"className":2742},[],[2744],{"type":48,"value":2745},"failure.code",{"type":48,"value":2747}," from a\nclosed registry (e.g. ",{"type":43,"tag":65,"props":2749,"children":2751},{"className":2750},[],[2752],{"type":48,"value":2753},"ASSEMBLE.BUILD_FAILED",{"type":48,"value":244},{"type":43,"tag":65,"props":2756,"children":2758},{"className":2757},[],[2759],{"type":48,"value":2595},{"type":48,"value":725},{"type":43,"tag":65,"props":2762,"children":2764},{"className":2763},[],[2765],{"type":48,"value":2766},"DEPS.EFFECT_VERSION_CONFLICT",{"type":48,"value":2768},"); branch on the code, not the message. A\nnon-structured rejection out of an operation is a bug in composer, not an\nexpected failure.",{"type":43,"tag":160,"props":2770,"children":2772},{"id":2771},"local-development",[2773],{"type":48,"value":2774},"Local development",{"type":43,"tag":51,"props":2776,"children":2777},{},[2778,2780,2785],{"type":48,"value":2779},"The ",{"type":43,"tag":65,"props":2781,"children":2783},{"className":2782},[],[2784],{"type":48,"value":2135},{"type":48,"value":2786}," command runs the whole app on this machine, wired as it deploys,\nagainst local emulators. No cloud credentials are needed or read. Concepts\nthat surprise:",{"type":43,"tag":127,"props":2788,"children":2789},{},[2790,2802,2814,2831,2836],{"type":43,"tag":131,"props":2791,"children":2792},{},[2793,2795,2800],{"type":48,"value":2794},"It runs the same pipeline as deploy, so ",{"type":43,"tag":57,"props":2796,"children":2797},{},[2798],{"type":48,"value":2799},"build first",{"type":48,"value":2801},", exactly like\ndeploy. It watches built output and restarts a service when its build\nchanges.",{"type":43,"tag":131,"props":2803,"children":2804},{},[2805,2807,2812],{"type":48,"value":2806},"Ctrl-C stops the app's processes but leaves local databases, buckets, and\ntheir data up: the next ",{"type":43,"tag":65,"props":2808,"children":2810},{"className":2809},[],[2811],{"type":48,"value":2135},{"type":48,"value":2813}," is a warm start. Starting clean, wiping\nthis app's local instances and data first, is an explicit opt-in flag.",{"type":43,"tag":131,"props":2815,"children":2816},{},[2817,2822,2824,2829],{"type":43,"tag":65,"props":2818,"children":2820},{"className":2819},[],[2821],{"type":48,"value":2135},{"type":48,"value":2823}," does not print service logs; ",{"type":43,"tag":65,"props":2825,"children":2827},{"className":2826},[],[2828],{"type":48,"value":2729},{"type":48,"value":2830}," is a separate, read-only command\nthat follows the already-running app's merged logs. It never builds,\nprovisions, starts, or stops anything.",{"type":43,"tag":131,"props":2832,"children":2833},{},[2834],{"type":48,"value":2835},"An unset secret doesn't block a local run: it becomes a placeholder plus a\nwarning, and only the code path that spends it fails, at the external\nservice it calls.",{"type":43,"tag":131,"props":2837,"children":2838},{},[2839],{"type":48,"value":2840},"Windows isn't supported yet.",{"type":43,"tag":160,"props":2842,"children":2844},{"id":2843},"testing-is-an-environment-seam",[2845],{"type":48,"value":2846},"Testing is an environment seam",{"type":43,"tag":51,"props":2848,"children":2849},{},[2850,2852,2857,2858,2863],{"type":48,"value":2851},"A test is just another environment: one where you decide what ",{"type":43,"tag":65,"props":2853,"children":2855},{"className":2854},[],[2856],{"type":48,"value":1482},{"type":48,"value":2483},{"type":43,"tag":65,"props":2859,"children":2861},{"className":2860},[],[2862],{"type":48,"value":1612},{"type":48,"value":2864}," return, never by editing the code under test.",{"type":43,"tag":172,"props":2866,"children":2867},{},[2868,2889],{"type":43,"tag":176,"props":2869,"children":2870},{},[2871],{"type":43,"tag":180,"props":2872,"children":2873},{},[2874,2879,2884],{"type":43,"tag":184,"props":2875,"children":2876},{},[2877],{"type":48,"value":2878},"You want to…",{"type":43,"tag":184,"props":2880,"children":2881},{},[2882],{"type":48,"value":2883},"Use",{"type":43,"tag":184,"props":2885,"children":2886},{},[2887],{"type":48,"value":2888},"From",{"type":43,"tag":200,"props":2890,"children":2891},{},[2892,2918],{"type":43,"tag":180,"props":2893,"children":2894},{},[2895,2900,2909],{"type":43,"tag":207,"props":2896,"children":2897},{},[2898],{"type":48,"value":2899},"Test a page \u002F action \u002F handler in isolation",{"type":43,"tag":207,"props":2901,"children":2902},{},[2903],{"type":43,"tag":65,"props":2904,"children":2906},{"className":2905},[],[2907],{"type":48,"value":2908},"mockService",{"type":43,"tag":207,"props":2910,"children":2911},{},[2912],{"type":43,"tag":65,"props":2913,"children":2915},{"className":2914},[],[2916],{"type":48,"value":2917},"@prisma\u002Fcomposer\u002Ftesting",{"type":43,"tag":180,"props":2919,"children":2920},{},[2921,2926,2935],{"type":43,"tag":207,"props":2922,"children":2923},{},[2924],{"type":48,"value":2925},"Run the real boot + request path against a fake dependency",{"type":43,"tag":207,"props":2927,"children":2928},{},[2929],{"type":43,"tag":65,"props":2930,"children":2932},{"className":2931},[],[2933],{"type":48,"value":2934},"bootstrapService",{"type":43,"tag":207,"props":2936,"children":2937},{},[2938],{"type":43,"tag":65,"props":2939,"children":2941},{"className":2940},[],[2942],{"type":48,"value":2943},"@prisma\u002Fcomposer-prisma-cloud\u002Ftesting",{"type":43,"tag":51,"props":2945,"children":2946},{},[2947,2952,2954,2959,2961,2966,2968,2973,2975,2981,2983,2989],{"type":43,"tag":65,"props":2948,"children":2950},{"className":2949},[],[2951],{"type":48,"value":2908},{"type":48,"value":2953}," returns a copy of the service whose ",{"type":43,"tag":65,"props":2955,"children":2957},{"className":2956},[],[2958],{"type":48,"value":1482},{"type":48,"value":2960}," yields your\ndoubles (type-checked against the declared deps) and whose ",{"type":43,"tag":65,"props":2962,"children":2964},{"className":2963},[],[2965],{"type":48,"value":1612},{"type":48,"value":2967}," yields\nthe object passed under the reserved ",{"type":43,"tag":65,"props":2969,"children":2971},{"className":2970},[],[2972],{"type":48,"value":1575},{"type":48,"value":2974}," key (required exactly when the\nservice declares an input schema; handed over as-is, not validated). Wiring\nthe module substitution is your runner's job (",{"type":43,"tag":65,"props":2976,"children":2978},{"className":2977},[],[2979],{"type":48,"value":2980},"vi.mock",{"type":48,"value":2982}," in Vitest,\n",{"type":43,"tag":65,"props":2984,"children":2986},{"className":2985},[],[2987],{"type":48,"value":2988},"mock.module",{"type":48,"value":2990}," in bun test).",{"type":43,"tag":51,"props":2992,"children":2993},{},[2994,2999],{"type":43,"tag":65,"props":2995,"children":2997},{"className":2996},[],[2998],{"type":48,"value":2934},{"type":48,"value":3000}," boots the service's real built entry in-process against a\nconfig you choose; drive it over real HTTP. Gotchas:",{"type":43,"tag":127,"props":3002,"children":3003},{},[3004,3015,3028,3047],{"type":43,"tag":131,"props":3005,"children":3006},{},[3007,3013],{"type":43,"tag":65,"props":3008,"children":3010},{"className":3009},[],[3011],{"type":48,"value":3012},"service.port",{"type":48,"value":3014}," must be concrete: the entry self-listens, and no\nOS-assigned port is reported back.",{"type":43,"tag":131,"props":3016,"children":3017},{},[3018,3020,3026],{"type":48,"value":3019},"There is no ",{"type":43,"tag":65,"props":3021,"children":3023},{"className":3022},[],[3024],{"type":48,"value":3025},"close()",{"type":48,"value":3027},"; run each integration-test file in its own process\n(bun test does).",{"type":43,"tag":131,"props":3029,"children":3030},{},[3031,3033,3039,3040,3046],{"type":48,"value":3032},"Next.js services take a third argument, a boot thunk, resolved with\n",{"type":43,"tag":65,"props":3034,"children":3036},{"className":3035},[],[3037],{"type":48,"value":3038},"standaloneServerPath",{"type":48,"value":1639},{"type":43,"tag":65,"props":3041,"children":3043},{"className":3042},[],[3044],{"type":48,"value":3045},"@prisma\u002Fcomposer\u002Fnextjs\u002Fcontrol",{"type":48,"value":565},{"type":43,"tag":131,"props":3048,"children":3049},{},[3050,3052,3057,3059,3064],{"type":48,"value":3051},"A service with an input schema takes ",{"type":43,"tag":65,"props":3053,"children":3055},{"className":3054},[],[3056],{"type":48,"value":1575},{"type":48,"value":3058}," in the config, a binding\nexactly like ",{"type":43,"tag":65,"props":3060,"children":3062},{"className":3061},[],[3063],{"type":48,"value":311},{"type":48,"value":3065},"'s, run through the real serialize\u002Fread path.",{"type":43,"tag":51,"props":3067,"children":3068},{},[3069,3071,3077,3079,3085],{"type":48,"value":3070},"A dependency's type is its contract, so any value of that shape is a valid\ndouble: a bare object, the real client over an in-memory handler, or a real\nlocal server. Ship a dependency's fake from its own package as a ",{"type":43,"tag":65,"props":3072,"children":3074},{"className":3073},[],[3075],{"type":48,"value":3076},"\u002Ffake",{"type":48,"value":3078},"\nentry point, outside ",{"type":43,"tag":65,"props":3080,"children":3082},{"className":3081},[],[3083],{"type":48,"value":3084},"src\u002F",{"type":48,"value":3086},", so the fake and the real service share one\ncontract.",{"type":43,"tag":160,"props":3088,"children":3090},{"id":3089},"building-blocks-and-extensions",[3091],{"type":48,"value":3092},"Building blocks and extensions",{"type":43,"tag":51,"props":3094,"children":3095},{},[3096,3098,3103],{"type":48,"value":3097},"First-party Modules ship inside ",{"type":43,"tag":65,"props":3099,"children":3101},{"className":3100},[],[3102],{"type":48,"value":641},{"type":48,"value":3104}," and\nprovision exactly like your own:",{"type":43,"tag":172,"props":3106,"children":3107},{},[3108,3129],{"type":43,"tag":176,"props":3109,"children":3110},{},[3111],{"type":43,"tag":180,"props":3112,"children":3113},{},[3114,3119,3124],{"type":43,"tag":184,"props":3115,"children":3116},{},[3117],{"type":48,"value":3118},"Import",{"type":43,"tag":184,"props":3120,"children":3121},{},[3122],{"type":48,"value":3123},"What it provisions",{"type":43,"tag":184,"props":3125,"children":3126},{},[3127],{"type":48,"value":3128},"Exposes",{"type":43,"tag":200,"props":3130,"children":3131},{},[3132,3160,3191,3227,3272],{"type":43,"tag":180,"props":3133,"children":3134},{},[3135,3150,3155],{"type":43,"tag":207,"props":3136,"children":3137},{},[3138,3144,3145],{"type":43,"tag":65,"props":3139,"children":3141},{"className":3140},[],[3142],{"type":48,"value":3143},"cron",{"type":48,"value":1639},{"type":43,"tag":65,"props":3146,"children":3148},{"className":3147},[],[3149],{"type":48,"value":709},{"type":43,"tag":207,"props":3151,"children":3152},{},[3153],{"type":48,"value":3154},"An always-on scheduler firing your schedule at your runner service",{"type":43,"tag":207,"props":3156,"children":3157},{},[3158],{"type":48,"value":3159},"nothing",{"type":43,"tag":180,"props":3161,"children":3162},{},[3163,3178,3183],{"type":43,"tag":207,"props":3164,"children":3165},{},[3166,3172,3173],{"type":43,"tag":65,"props":3167,"children":3169},{"className":3168},[],[3170],{"type":48,"value":3171},"storage",{"type":48,"value":1639},{"type":43,"tag":65,"props":3174,"children":3176},{"className":3175},[],[3177],{"type":48,"value":716},{"type":43,"tag":207,"props":3179,"children":3180},{},[3181],{"type":48,"value":3182},"An S3-backed blob store (own Postgres + minted credentials)",{"type":43,"tag":207,"props":3184,"children":3185},{},[3186],{"type":43,"tag":65,"props":3187,"children":3189},{"className":3188},[],[3190],{"type":48,"value":429},{"type":43,"tag":180,"props":3192,"children":3193},{},[3194,3209,3219],{"type":43,"tag":207,"props":3195,"children":3196},{},[3197,3203,3204],{"type":43,"tag":65,"props":3198,"children":3200},{"className":3199},[],[3201],{"type":48,"value":3202},"streams",{"type":48,"value":1639},{"type":43,"tag":65,"props":3205,"children":3207},{"className":3206},[],[3208],{"type":48,"value":723},{"type":43,"tag":207,"props":3210,"children":3211},{},[3212,3214],{"type":48,"value":3213},"Durable append-only event streams over a ",{"type":43,"tag":65,"props":3215,"children":3217},{"className":3216},[],[3218],{"type":48,"value":429},{"type":43,"tag":207,"props":3220,"children":3221},{},[3222],{"type":43,"tag":65,"props":3223,"children":3225},{"className":3224},[],[3226],{"type":48,"value":3202},{"type":43,"tag":180,"props":3228,"children":3229},{},[3230,3244,3249],{"type":43,"tag":207,"props":3231,"children":3232},{},[3233,3238,3239],{"type":43,"tag":65,"props":3234,"children":3236},{"className":3235},[],[3237],{"type":48,"value":937},{"type":48,"value":1639},{"type":43,"tag":65,"props":3240,"children":3242},{"className":3241},[],[3243],{"type":48,"value":731},{"type":43,"tag":207,"props":3245,"children":3246},{},[3247],{"type":48,"value":3248},"Signup, login, sessions, and JWT verification (Better Auth in one service, own database)",{"type":43,"tag":207,"props":3250,"children":3251},{},[3252,3258,3259,3265,3266],{"type":43,"tag":65,"props":3253,"children":3255},{"className":3254},[],[3256],{"type":48,"value":3257},"api",{"type":48,"value":244},{"type":43,"tag":65,"props":3260,"children":3262},{"className":3261},[],[3263],{"type":48,"value":3264},"session",{"type":48,"value":244},{"type":43,"tag":65,"props":3267,"children":3269},{"className":3268},[],[3270],{"type":48,"value":3271},"admin",{"type":43,"tag":180,"props":3273,"children":3274},{},[3275,3290,3295],{"type":43,"tag":207,"props":3276,"children":3277},{},[3278,3284,3285],{"type":43,"tag":65,"props":3279,"children":3281},{"className":3280},[],[3282],{"type":48,"value":3283},"email",{"type":48,"value":1639},{"type":43,"tag":65,"props":3286,"children":3288},{"className":3287},[],[3289],{"type":48,"value":739},{"type":43,"tag":207,"props":3291,"children":3292},{},[3293],{"type":48,"value":3294},"Transactional email with a stored outbox (own service and database)",{"type":43,"tag":207,"props":3296,"children":3297},{},[3298,3304,3305],{"type":43,"tag":65,"props":3299,"children":3301},{"className":3300},[],[3302],{"type":48,"value":3303},"send",{"type":48,"value":244},{"type":43,"tag":65,"props":3306,"children":3308},{"className":3307},[],[3309],{"type":48,"value":3310},"outbox",{"type":43,"tag":51,"props":3312,"children":3313},{},[3314,3319,3321,3326,3328,3334,3336,3341,3343,3349,3351,3356,3358,3363],{"type":43,"tag":65,"props":3315,"children":3317},{"className":3316},[],[3318],{"type":48,"value":250},{"type":48,"value":3320}," (imported alongside ",{"type":43,"tag":65,"props":3322,"children":3324},{"className":3323},[],[3325],{"type":48,"value":656},{"type":48,"value":3327},") is a raw S3-compatible bucket:\nthe dependency end receives ",{"type":43,"tag":65,"props":3329,"children":3331},{"className":3330},[],[3332],{"type":48,"value":3333},"{ url, bucket, accessKeyId, secretAccessKey }",{"type":48,"value":3335},",\nshape-compatible with ",{"type":43,"tag":65,"props":3337,"children":3339},{"className":3338},[],[3340],{"type":48,"value":716},{"type":48,"value":3342},"'s ",{"type":43,"tag":65,"props":3344,"children":3346},{"className":3345},[],[3347],{"type":48,"value":3348},"s3()",{"type":48,"value":3350}," dependency, so a service wired to\n",{"type":43,"tag":65,"props":3352,"children":3354},{"className":3353},[],[3355],{"type":48,"value":3348},{"type":48,"value":3357}," can be rewired to a ",{"type":43,"tag":65,"props":3359,"children":3361},{"className":3360},[],[3362],{"type":48,"value":663},{"type":48,"value":3364}," resource unchanged.",{"type":43,"tag":51,"props":3366,"children":3367},{},[3368,3370,3375,3377,3382],{"type":48,"value":3369},"An extension (a package bringing its own Modules, resources, or deploy\ntarget) is published on npm as ",{"type":43,"tag":65,"props":3371,"children":3373},{"className":3372},[],[3374],{"type":48,"value":747},{"type":48,"value":3376},". The ecosystem is new:\ntoday the blocks above plus your own Modules are the whole set, so verify a\n",{"type":43,"tag":65,"props":3378,"children":3380},{"className":3379},[],[3381],{"type":48,"value":747},{"type":48,"value":3383}," package exists on npm before reaching for it.",{"type":43,"tag":160,"props":3385,"children":3387},{"id":3386},"failure-modes-quick-reference",[3388],{"type":48,"value":3389},"Failure modes quick reference",{"type":43,"tag":127,"props":3391,"children":3392},{},[3393,3520,3543,3591,3609,3626,3636,3700,3713],{"type":43,"tag":131,"props":3394,"children":3395},{},[3396,3415,3416,3422,3424,3429,3431,3436,3438,3444,3445,3451,3453,3459,3461,3467,3469,3474,3476,3482,3483,3489,3490,3496,3497,3503,3505,3511,3512,3518],{"type":43,"tag":57,"props":3397,"children":3398},{},[3399,3401,3406,3408,3413],{"type":48,"value":3400},"Every ",{"type":43,"tag":65,"props":3402,"children":3404},{"className":3403},[],[3405],{"type":48,"value":70},{"type":48,"value":3407}," command halts at start-up on an ",{"type":43,"tag":65,"props":3409,"children":3411},{"className":3410},[],[3412],{"type":48,"value":2619},{"type":48,"value":3414},"\nversion conflict",{"type":48,"value":1290},{"type":43,"tag":65,"props":3417,"children":3419},{"className":3418},[],[3420],{"type":48,"value":3421},"Dependency conflict: alchemy resolves effect@...",{"type":48,"value":3423},").\nAnother dependency floated a newer ",{"type":43,"tag":65,"props":3425,"children":3427},{"className":3426},[],[3428],{"type":48,"value":2619},{"type":48,"value":3430}," and the package manager\nhoisted it over Composer's pin. Pin the whole ",{"type":43,"tag":65,"props":3432,"children":3434},{"className":3433},[],[3435],{"type":48,"value":2619},{"type":48,"value":3437}," constellation in\nthe app's ",{"type":43,"tag":65,"props":3439,"children":3441},{"className":3440},[],[3442],{"type":48,"value":3443},"package.json",{"type":48,"value":2696},{"type":43,"tag":65,"props":3446,"children":3448},{"className":3447},[],[3449],{"type":48,"value":3450},"overrides",{"type":48,"value":3452}," (yarn: ",{"type":43,"tag":65,"props":3454,"children":3456},{"className":3455},[],[3457],{"type":48,"value":3458},"resolutions",{"type":48,"value":3460},"; pnpm:\n",{"type":43,"tag":65,"props":3462,"children":3464},{"className":3463},[],[3465],{"type":48,"value":3466},"pnpm.overrides",{"type":48,"value":3468},"): ",{"type":43,"tag":65,"props":3470,"children":3472},{"className":3471},[],[3473],{"type":48,"value":2619},{"type":48,"value":3475}," plus ",{"type":43,"tag":65,"props":3477,"children":3479},{"className":3478},[],[3480],{"type":48,"value":3481},"@effect\u002Fsql-d1",{"type":48,"value":244},{"type":43,"tag":65,"props":3484,"children":3486},{"className":3485},[],[3487],{"type":48,"value":3488},"@effect\u002Fsql-pg",{"type":48,"value":725},{"type":43,"tag":65,"props":3491,"children":3493},{"className":3492},[],[3494],{"type":48,"value":3495},"@effect\u002Fvitest",{"type":48,"value":733},{"type":43,"tag":65,"props":3498,"children":3500},{"className":3499},[],[3501],{"type":48,"value":3502},"@effect\u002Fplatform-bun",{"type":48,"value":3504},"\u002F",{"type":43,"tag":65,"props":3506,"children":3508},{"className":3507},[],[3509],{"type":48,"value":3510},"-node",{"type":48,"value":3504},{"type":43,"tag":65,"props":3513,"children":3515},{"className":3514},[],[3516],{"type":48,"value":3517},"-node-shared",{"type":48,"value":3519},", all\nat Composer's exact pin, then reinstall. The repo's examples carry the\nblock.",{"type":43,"tag":131,"props":3521,"children":3522},{},[3523,3541],{"type":43,"tag":57,"props":3524,"children":3525},{},[3526,3528,3533,3534,3539],{"type":48,"value":3527},"A deployed ",{"type":43,"tag":65,"props":3529,"children":3531},{"className":3530},[],[3532],{"type":48,"value":1872},{"type":48,"value":1850},{"type":43,"tag":65,"props":3535,"children":3537},{"className":3536},[],[3538],{"type":48,"value":1856},{"type":48,"value":3540}," to anything but a wired\npeer.",{"type":48,"value":3542}," Not a broken deploy; see Contracts above.",{"type":43,"tag":131,"props":3544,"children":3545},{},[3546,3551,3553,3559,3561,3567,3568,3574,3576,3581,3583,3589],{"type":43,"tag":57,"props":3547,"children":3548},{},[3549],{"type":48,"value":3550},"Scale-to-zero closes idle database connections.",{"type":48,"value":3552}," A persistent client\ncrashes into a 502 restart loop unless the pool is small and\nreconnect-friendly (",{"type":43,"tag":65,"props":3554,"children":3556},{"className":3555},[],[3557],{"type":48,"value":3558},"new SQL({ url, max: 1, idleTimeout: 10 })",{"type":48,"value":3560}," for Bun)\nand the process logs ",{"type":43,"tag":65,"props":3562,"children":3564},{"className":3563},[],[3565],{"type":48,"value":3566},"uncaughtException",{"type":48,"value":3504},{"type":43,"tag":65,"props":3569,"children":3571},{"className":3570},[],[3572],{"type":48,"value":3573},"unhandledRejection",{"type":48,"value":3575}," instead of\ndying. Under ",{"type":43,"tag":65,"props":3577,"children":3579},{"className":3578},[],[3580],{"type":48,"value":2135},{"type":48,"value":3582}," watch-restarts against the local emulator, add\n",{"type":43,"tag":65,"props":3584,"children":3586},{"className":3585},[],[3587],{"type":48,"value":3588},"prepare: false",{"type":48,"value":3590}," as well: restarted processes collide on\nprepared-statement names in the emulator's shared session.",{"type":43,"tag":131,"props":3592,"children":3593},{},[3594,3599,3601,3607],{"type":43,"tag":57,"props":3595,"children":3596},{},[3597],{"type":48,"value":3598},"Cold starts reset service-to-service connections.",{"type":48,"value":3600}," A call into a\nscaled-to-zero service can get ",{"type":43,"tag":65,"props":3602,"children":3604},{"className":3603},[],[3605],{"type":48,"value":3606},"ECONNRESET",{"type":48,"value":3608},"; retry it.",{"type":43,"tag":131,"props":3610,"children":3611},{},[3612,3624],{"type":43,"tag":57,"props":3613,"children":3614},{},[3615,3617,3622],{"type":48,"value":3616},"Bind ",{"type":43,"tag":65,"props":3618,"children":3620},{"className":3619},[],[3621],{"type":48,"value":1430},{"type":48,"value":3623},", not loopback.",{"type":48,"value":3625}," The platform routes external HTTP to\nthe VM; a loopback-only listener is unreachable.",{"type":43,"tag":131,"props":3627,"children":3628},{},[3629,3634],{"type":43,"tag":57,"props":3630,"children":3631},{},[3632],{"type":48,"value":3633},"The ingress buffers streaming responses.",{"type":48,"value":3635}," An open SSE tail delivers\nnothing and times out at 60s; don't build on streamed HTTP responses.",{"type":43,"tag":131,"props":3637,"children":3638},{},[3639,3644,3646,3652,3654,3660,3662,3667,3669,3675,3677,3683,3685,3691,3693,3699],{"type":43,"tag":57,"props":3640,"children":3641},{},[3642],{"type":48,"value":3643},"Naming rules fail at load, not typecheck.",{"type":48,"value":3645}," Provision ids and declared\nnode names must be ASCII letters and digits only (",{"type":43,"tag":65,"props":3647,"children":3649},{"className":3648},[],[3650],{"type":48,"value":3651},"[A-Za-z0-9]",{"type":48,"value":3653},"): they\nderive config keys and address segments, so a hyphenated name like\n",{"type":43,"tag":65,"props":3655,"children":3657},{"className":3656},[],[3658],{"type":48,"value":3659},"my-db",{"type":48,"value":3661}," passes ",{"type":43,"tag":65,"props":3663,"children":3665},{"className":3664},[],[3666],{"type":48,"value":621},{"type":48,"value":3668}," and then fails the load. The root module's name is\nexempt. A provision id shorter than 3 characters is rejected by the\nplatform (name the database ",{"type":43,"tag":65,"props":3670,"children":3672},{"className":3671},[],[3673],{"type":48,"value":3674},"'database'",{"type":48,"value":3676},", not ",{"type":43,"tag":65,"props":3678,"children":3680},{"className":3679},[],[3681],{"type":48,"value":3682},"'db'",{"type":48,"value":3684},"), and a service\nwhose name equals its enclosing Module's reads as ",{"type":43,"tag":65,"props":3686,"children":3688},{"className":3687},[],[3689],{"type":48,"value":3690},"auth.auth",{"type":48,"value":3692}," unless\ngiven an explicit ",{"type":43,"tag":65,"props":3694,"children":3696},{"className":3695},[],[3697],{"type":48,"value":3698},"id",{"type":48,"value":565},{"type":43,"tag":131,"props":3701,"children":3702},{},[3703,3711],{"type":43,"tag":57,"props":3704,"children":3705},{},[3706],{"type":43,"tag":65,"props":3707,"children":3709},{"className":3708},[],[3710],{"type":48,"value":2446},{"type":48,"value":3712},": see Databases above; author the missing\nmigration, don't skip the plan step.",{"type":43,"tag":131,"props":3714,"children":3715},{},[3716,3729,3731,3737,3739,3745,3747,3753],{"type":43,"tag":57,"props":3717,"children":3718},{},[3719,3721,3727],{"type":48,"value":3720},"Date\u002Ftime columns hand back ",{"type":43,"tag":65,"props":3722,"children":3724},{"className":3723},[],[3725],{"type":48,"value":3726},"Temporal.*",{"type":48,"value":3728}," values on read.",{"type":48,"value":3730}," Bun and\nstock Node ship no global ",{"type":43,"tag":65,"props":3732,"children":3734},{"className":3733},[],[3735],{"type":48,"value":3736},"Temporal",{"type":48,"value":3738},", so a service with ",{"type":43,"tag":65,"props":3740,"children":3742},{"className":3741},[],[3743],{"type":48,"value":3744},"DateTime",{"type":48,"value":3746},"\ncontract columns compiles and deploys, then fails on the first timestamp\nread. Provide the global at the server entry\n(",{"type":43,"tag":65,"props":3748,"children":3750},{"className":3749},[],[3751],{"type":48,"value":3752},"import 'temporal-polyfill\u002Fglobal'",{"type":48,"value":3754},") or use string column types.",{"type":43,"tag":160,"props":3756,"children":3758},{"id":3757},"what-composer-doesnt-do-yet",[3759],{"type":48,"value":3760},"What Composer doesn't do yet",{"type":43,"tag":51,"props":3762,"children":3763},{},[3764],{"type":48,"value":3765},"Name the gap instead of inventing an API:",{"type":43,"tag":127,"props":3767,"children":3768},{},[3769,3801,3818],{"type":43,"tag":131,"props":3770,"children":3771},{},[3772,3784,3786,3791,3793,3799],{"type":43,"tag":57,"props":3773,"children":3774},{},[3775,3777,3782],{"type":48,"value":3776},"No interactive auth in the ",{"type":43,"tag":65,"props":3778,"children":3780},{"className":3779},[],[3781],{"type":48,"value":70},{"type":48,"value":3783}," CLI.",{"type":48,"value":3785}," Its deploys\nauthenticate only via a static\n",{"type":43,"tag":65,"props":3787,"children":3789},{"className":3788},[],[3790],{"type":48,"value":2481},{"type":48,"value":3792},"; there is no ",{"type":43,"tag":65,"props":3794,"children":3796},{"className":3795},[],[3797],{"type":48,"value":3798},"login",{"type":48,"value":3800}," flow.",{"type":43,"tag":131,"props":3802,"children":3803},{},[3804,3809,3811,3816],{"type":43,"tag":57,"props":3805,"children":3806},{},[3807],{"type":48,"value":3808},"No in-memory contract bindings.",{"type":48,"value":3810}," A dependency can't yet be wired to a\nco-located handler without HTTP; use ",{"type":43,"tag":65,"props":3812,"children":3814},{"className":3813},[],[3815],{"type":48,"value":2934},{"type":48,"value":3817}," with a loopback\nfake.",{"type":43,"tag":131,"props":3819,"children":3820},{},[3821,3826],{"type":43,"tag":57,"props":3822,"children":3823},{},[3824],{"type":48,"value":3825},"RPC over HTTP is the only contract kind.",{"type":48,"value":3827}," No gRPC, WebSocket, or\nstreaming contracts.",{"type":43,"tag":51,"props":3829,"children":3830},{},[3831,3833,3838,3839,3845,3846,3852],{"type":48,"value":3832},"For anything else missing, check ",{"type":43,"tag":65,"props":3834,"children":3836},{"className":3835},[],[3837],{"type":48,"value":110},{"type":48,"value":244},{"type":43,"tag":65,"props":3840,"children":3842},{"className":3841},[],[3843],{"type":48,"value":3844},"docs\u002Fdesign\u002F10-domains\u002F",{"type":48,"value":672},{"type":43,"tag":65,"props":3847,"children":3849},{"className":3848},[],[3850],{"type":48,"value":3851},"docs\u002Fdesign\u002F90-decisions\u002F",{"type":48,"value":3853}," in the prisma\u002Fcomposer repo, then file an issue\nthere rather than guessing.",{"type":43,"tag":3855,"props":3856,"children":3857},"style",{},[3858],{"type":48,"value":3859},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3861,"total":329},[3862],{"slug":4,"name":4,"fn":5,"description":6,"org":3863,"tags":3864,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3865,3866,3867,3868],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"items":3870,"total":4037},[3871,3888,3902,3915,3928,3941,3955,3973,3984,4000,4011,4022],{"slug":3872,"name":3872,"fn":3873,"description":3874,"org":3875,"tags":3876,"stars":3885,"repoUrl":3886,"updatedAt":3887},"prisma-8","build data layers with Prisma 8","Comprehensive guide for building with Prisma 8 (Prisma Next), the contract-first data layer. Use whenever working on Prisma code in a project that uses it — authoring or editing the data contract (contract.prisma, PSL, TypeScript builders), migrations, queries (db.orm \u002F db.sql), runtime wiring (db.ts, middleware, DATABASE_URL), build-tool integration, Supabase \u002F RLS, reading PN-* structured errors, or filing feedback — and for orientation questions like \"what is Prisma Next\" or comparisons to other ORMs. Signals that this skill applies: @internal\u002F* imports, prisma.config.ts, contract.prisma \u002F contract.json \u002F contract.d.ts, the prisma-next CLI, PN-* error codes. Also covers upgrading Prisma in a project — \"upgrade Prisma 8\", \"bump Prisma Next\", \"move to Prisma Next X.Y\", or dealing with an @internal\u002F* version bump, in a consumer app or in an extension package. Does not apply to Prisma ORM 7 or earlier (schema.prisma + @prisma\u002Fclient projects).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3877,3880,3881,3882],{"name":3878,"slug":3879,"type":15},"Database","database",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":3883,"slug":3884,"type":15},"TypeScript","typescript",47567,"https:\u002F\u002Fgithub.com\u002Fprisma\u002Form","2026-08-28T15:10:15.879012",{"slug":3889,"name":3889,"fn":3890,"description":3891,"org":3892,"tags":3893,"stars":3899,"repoUrl":3900,"updatedAt":3901},"prisma-next","guide Prisma Next project setup and usage","Route a vague Prisma Next prompt to the right specific skill. Use for \"help me with Prisma Next\", \"what is Prisma Next\", \"explain Prisma Next\", \"I'm new to PN\", \"where do I start\", \"what can I do with Prisma Next\", \"what can I do next with Prisma\", \"just ran createprisma\", \"tour of Prisma Next\", \"Prisma Next overview\", and comparison questions like \"Prisma Next vs Prisma 7\", \"PN vs Drizzle\", \"PN vs Kysely\", \"PN vs TypeORM\". Do NOT use when the prompt clearly matches a workflow skill — adoption \u002F quickstart \u002F first-touch orientation \u002F brownfield introspection, schema \u002F contract editing, migration authoring (db update \u002F migration plan \u002F migrate), migration review on deploy \u002F concurrent migrations, queries \u002F db.orm \u002F db.sql \u002F TypedSQL, Supabase \u002F RLS \u002F role binding, runtime \u002F db.ts \u002F middleware wiring, build \u002F Vite plugin \u002F Next.js plugin, debug \u002F structured error envelopes \u002F PN-* error codes, or feedback \u002F bug report \u002F feature request — load that sibling skill directly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3894,3895,3897,3898],{"name":3878,"slug":3879,"type":15},{"name":2073,"slug":3896,"type":15},"next-js",{"name":9,"slug":8,"type":15},{"name":3883,"slug":3884,"type":15},415,"https:\u002F\u002Fgithub.com\u002Fprisma\u002Fprisma-next","2026-07-17T05:32:04.322957",{"slug":3903,"name":3903,"fn":3904,"description":3905,"org":3906,"tags":3907,"stars":3899,"repoUrl":3900,"updatedAt":3914},"prisma-next-build","integrate Prisma Next into build systems","Wire Prisma Next into the project's build system with the right build-tool plugin — Vite today via @prisma-next\u002Fvite-plugin-contract-emit (Vite 7 \u002F 8); Next.js \u002F Webpack \u002F esbuild \u002F Rollup \u002F Turbopack are named as gaps rather than fabricated. Always offers the Vite plugin proactively when the project is using Vite. Use for vite plugin, vite-plugin, vite.config.ts, prismaVitePlugin, contract emit on save, HMR, hot reload contract, dev server, Next.js plugin, next plugin, withPrismaNext, webpack plugin, esbuild plugin, rollup plugin, build integration, dev server plugin, vite 7, vite 8.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3908,3909,3910,3911],{"name":17,"slug":18,"type":15},{"name":2073,"slug":3896,"type":15},{"name":9,"slug":8,"type":15},{"name":3912,"slug":3913,"type":15},"Vite","vite","2026-07-02T07:31:36.108254",{"slug":3916,"name":3916,"fn":3917,"description":3918,"org":3919,"tags":3920,"stars":3899,"repoUrl":3900,"updatedAt":3927},"prisma-next-contract","edit Prisma Next data contracts and models","Edit the Prisma Next data contract — add models, fields, relations, indexes, enums, value objects (composite types), type aliases, namespaces (Postgres schemas), cross-contract foreign keys (cross-space FK), polymorphic types (`@@discriminator` \u002F `@@base`), use extension namespaces (`pgvector.Vector(...)`, `cipherstash.EncryptedString(...)`), wire `prisma-next.config.ts` with `defineConfig` from the `@prisma-next\u002F\u003Ctarget>\u002Fconfig` façade, and run `prisma-next contract emit`. Use for schema, models, fields, attributes, soft delete, paranoid, scopes, validations, callbacks, prisma schema, PSL, contract.prisma, contract.ts, contract.json, contract.d.ts, `@prisma-next\u002Fpostgres\u002Fconfig`, `@prisma-next\u002Fpostgres\u002Fcontract-builder`, `@prisma-next\u002Fpostgres\u002Fcontrol`, `@prisma-next\u002Fmongo\u002Fconfig`, `@prisma-next\u002Fmongo\u002Fcontract-builder`, `extensions:`, pgvector, cipherstash, postgis, paradedb, supabase, `@prisma-next\u002Fextension-supabase`, `@@control`, control policy, managed, tolerated, external, observed.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3921,3924,3925,3926],{"name":3922,"slug":3923,"type":15},"Data Modeling","data-modeling",{"name":3878,"slug":3879,"type":15},{"name":9,"slug":8,"type":15},{"name":3883,"slug":3884,"type":15},"2026-07-30T05:30:10.426962",{"slug":3929,"name":3929,"fn":3930,"description":3931,"org":3932,"tags":3933,"stars":3899,"repoUrl":3900,"updatedAt":3940},"prisma-next-debug","debug and recover from Prisma Next errors","Read a Prisma Next structured error envelope and route to the right recovery — code, domain, severity, why, fix, meta. Use for error, exception, my emit failed, my query won't typecheck, my query crashed, my migration won't apply, MIGRATION.HASH_MISMATCH, BUDGET.ROWS_EXCEEDED, BUDGET.TIME_EXCEEDED, RUNTIME.ABORTED, PLAN.HASH_MISMATCH, CONTRACT.MARKER_MISSING, PN-RUN-3001, PN-RUN-3002, PN-RUN-3030, PN-MIG-2001, PN-CLI-4011, PN-SCHEMA-0001, drift, capability missing, planner conflict, prisma studio, EXPLAIN, query log, db.end, db.close, script won't exit, hangs, close connection, pool.end, client is closed.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3934,3935,3938,3939],{"name":3878,"slug":3879,"type":15},{"name":3936,"slug":3937,"type":15},"Debugging","debugging",{"name":2073,"slug":3896,"type":15},{"name":9,"slug":8,"type":15},"2026-07-24T05:37:10.436314",{"slug":3942,"name":3942,"fn":3943,"description":3944,"org":3945,"tags":3946,"stars":3899,"repoUrl":3900,"updatedAt":3954},"prisma-next-feedback","report Prisma Next issues and feedback","Hand a Prisma Next question or report off to the team — file a GitHub issue (bug or feature request), or route Q&A \u002F design discussion \u002F direct-team-contact to the Prisma Discord at pris.ly\u002Fdiscord. Use for bug, bug report, file an issue, report a bug, feature request, missing feature, this should be a feature, file this, this is a bug, this is broken, surprising behaviour, this doesn't work, file feedback, send feedback, capability gap, file via prisma-next-feedback, ask the team, talk to the team, talk to the Prisma team, talk to Prisma, Discord, Prisma Discord, Q&A, design feedback, is this the intended way, how should I do X, extension author question, extension author needs help.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3947,3950,3953],{"name":3948,"slug":3949,"type":15},"Documentation","documentation",{"name":3951,"slug":3952,"type":15},"GitHub","github",{"name":9,"slug":8,"type":15},"2026-07-02T07:31:34.870809",{"slug":3956,"name":3956,"fn":3957,"description":3958,"org":3959,"tags":3960,"stars":3899,"repoUrl":3900,"updatedAt":3972},"prisma-next-migration-review","review and resolve Prisma Next migrations","Review what Prisma Next migrations will run on merge or deploy, render the migration graph, resolve concurrent \u002F diamond-convergence conflicts, and configure environment refs for CI. Use for \"what migrations are going to run\", \"what runs on deploy\", merge conflict, diamond convergence, concurrent migrations, migration status, ref management, staging, production, MIGRATION.DIVERGED, MIGRATION.NO_MARKER, MIGRATION.MARKER_NOT_IN_HISTORY, prisma migrate status, prisma migrate diff, prisma migrate resolve.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3961,3964,3967,3968,3971],{"name":3962,"slug":3963,"type":15},"CI\u002FCD","ci-cd",{"name":3965,"slug":3966,"type":15},"Code Review","code-review",{"name":3878,"slug":3879,"type":15},{"name":3969,"slug":3970,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-07-24T05:37:11.422323",{"slug":3974,"name":3974,"fn":3975,"description":3976,"org":3977,"tags":3978,"stars":3899,"repoUrl":3900,"updatedAt":3983},"prisma-next-migrations","author and manage Prisma Next migrations","Author Prisma Next migrations — choose db update vs migration plan, edit the framework-rendered migration.ts (replace placeholder sentinels with dataTransform closures), recover from MIGRATION.HASH_MISMATCH or PN-MIG-2001 unfilled placeholder. Use for prisma migrate dev, prisma migrate deploy, prisma db push, db update, db update --dry-run, migration plan, migrate, migration new, migration show, db verify, db sign, data migration, this.dataTransform, dataTransform, placeholder, generated migration.ts, edit migration.ts, MIGRATION.HASH_MISMATCH, schema drift.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3979,3980,3981,3982],{"name":3878,"slug":3879,"type":15},{"name":3969,"slug":3970,"type":15},{"name":9,"slug":8,"type":15},{"name":3883,"slug":3884,"type":15},"2026-07-24T05:37:13.469138",{"slug":3985,"name":3985,"fn":3986,"description":3987,"org":3988,"tags":3989,"stars":3899,"repoUrl":3900,"updatedAt":3999},"prisma-next-queries","write Prisma Next queries for database operations","Write Prisma Next queries for Postgres, SQLite, or Mongo — pick a lane (Postgres\u002FSQLite `db.orm.\u003CModel>` + `db.sql.\u003Ctable>`; Mongo `db.orm.\u003Croot>` + `db.query.from(...)` pipeline builder), filter \u002F project \u002F sort \u002F paginate, eager-load with `.include(...)`, Postgres\u002FSQLite `db.transaction(...)`, Postgres\u002FSQLite ORM `.aggregate(...)`, Mongo aggregations via query builder, namespace-aware accessors (`db.orm.\u003Cns>.\u003CModel>`, `db.sql.\u003Cns>.\u003Ctable>`). Triggers: query, where, match, select, project, orderBy, take, skip, include, lookup, first, all, count, aggregate, group, create, update, delete, upsert, returning, transaction, db.close, script teardown, variant, polymorphism, drizzle-style, kysely-style. Notes: `.all()` is a Thenable (just `await` it), iterators are single-use (`RUNTIME.ITERATOR_CONSUMED`), Postgres `count` is `number` while sum\u002Favg\u002Fmin\u002Fmax are `number | null`, ranges use chained `.where()` or `and(...)` (no `.between(...)`).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3990,3991,3992,3995,3996],{"name":3878,"slug":3879,"type":15},{"name":2073,"slug":3896,"type":15},{"name":3993,"slug":3994,"type":15},"PostgreSQL","postgresql",{"name":9,"slug":8,"type":15},{"name":3997,"slug":3998,"type":15},"SQL","sql","2026-07-17T05:32:03.35373",{"slug":4001,"name":4001,"fn":4002,"description":4003,"org":4004,"tags":4005,"stars":3899,"repoUrl":3900,"updatedAt":4010},"prisma-next-quickstart","adopt Prisma Next in projects","Adopt Prisma Next into a new project, onto an existing database, or as the first move after a bootstrap tool dropped you into a scaffold. Use for \"what can I do with Prisma Next\", \"what can I do next with Prisma\", \"where do I start\", \"what should I do first\", \"just ran createprisma\", \"createprisma\", \"npx createprisma\", \"npx create-prisma\", \"first steps\", \"first query\", \"I have a scaffolded Prisma Next project what now\"; for `pnpm dlx prisma-next init` greenfield setup; and for `prisma-next contract infer` + `db sign` against an existing database. Also covers the connect-write-read first-arc orientation, the day-to-day commands (`contract emit`, `db init`, `db update`, `migration plan`, `migrate`, `db schema`, `db verify`), and routing to `prisma-next-contract` \u002F `prisma-next-queries` \u002F `prisma-next-runtime` for the next move. Flags: --target, --authoring, --schema-path, --probe-db, --output.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4006,4007,4008,4009],{"name":3878,"slug":3879,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":3883,"slug":3884,"type":15},"2026-07-24T05:37:12.462072",{"slug":4012,"name":4012,"fn":4013,"description":4014,"org":4015,"tags":4016,"stars":3899,"repoUrl":3900,"updatedAt":4021},"prisma-next-runtime","configure Prisma Next runtime and database connections","Wire the Prisma Next runtime — `db.ts` setup using `postgres\u003CContract>(...)` from `@prisma-next\u002Fpostgres\u002Fruntime`, `sqlite\u003CContract>(...)` from `@prisma-next\u002Fsqlite\u002Fruntime`, or `mongo\u003CContract>(...)` from `@prisma-next\u002Fmongo\u002Fruntime`; middleware composition (telemetry from `@prisma-next\u002Fmiddleware-telemetry`; lints and budgets), `DATABASE_URL` config, per-environment branching, switching between Postgres, SQLite, and Mongo façades. Use for db.ts, postgres(), sqlite(), mongo(), middleware, telemetry, lints, budgets, DATABASE_URL, .env, connection pool, poolOptions, dev vs prod config, transactions, db.transaction, read replicas, multi-database, script won't exit, hangs, close connection, db.end, db.close, pool.end, [Symbol.asyncDispose], await using.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4017,4018,4019,4020],{"name":3878,"slug":3879,"type":15},{"name":2073,"slug":3896,"type":15},{"name":3993,"slug":3994,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:32:05.347316",{"slug":4023,"name":4023,"fn":4024,"description":4025,"org":4026,"tags":4027,"stars":3899,"repoUrl":3900,"updatedAt":4036},"prisma-next-supabase","integrate Prisma with Supabase","Use Prisma Next with a Supabase project via `@prisma-next\u002Fextension-supabase` — wire `extensions: [supabasePack]`, declare cross-space FKs to `supabase:auth.AuthUser`, author RLS policies (`policy_select` \u002F `policy_update` \u002F `@@rls`, `auth.uid()` predicates), build `db.ts` with the `supabase()` factory, bind roles per request (`asUser(jwt)` \u002F `asAnon()` \u002F `asServiceRole()`), query `auth.*` \u002F `storage.*` via the `db.asServiceRole().supabase` admin root, and validate JWTs (`jwksUrl` for current projects \u002F `jwtSecret` for legacy HS256). Use for supabase, RLS, row level security, policy, role binding, anon, authenticated, service_role, auth.users, auth.uid(), JWT, JWKS, SUPABASE_JWKS_URL, SUPABASE_JWT_SECRET, SUPABASE.JWT_INVALID, SUPABASE.CONFIG_INVALID, RoleBoundDb, session pooler, supabase:auth.AuthUser, @prisma-next\u002Fextension-supabase.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4028,4030,4031,4032,4033],{"name":4029,"slug":937,"type":15},"Auth",{"name":13,"slug":14,"type":15},{"name":3993,"slug":3994,"type":15},{"name":9,"slug":8,"type":15},{"name":4034,"slug":4035,"type":15},"Supabase","supabase","2026-07-30T05:30:11.065251",22]