@prisma/orm-mongo 8.0.0-rc.23-dev.6 → 8.0.0-rc.23-dev.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/dist/{mongo-static-AaffxZRP-D45kxMt-.mjs → mongo-static-Dgiq4thY-lDOWM65j.mjs} +3 -3
- package/dist/{mongo-static-AaffxZRP-D45kxMt-.mjs.map → mongo-static-Dgiq4thY-lDOWM65j.mjs.map} +1 -1
- package/dist/runtime.d.mts +6 -3
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +5 -1
- package/dist/runtime.mjs.map +1 -1
- package/dist/static.mjs +1 -1
- package/package.json +8 -8
- package/skills/prisma-8/SKILL.md +1 -1
- package/skills/prisma-8/references/queries-mongo.md +23 -0
- package/skills/prisma-8/references/queries.md +3 -1
package/README.md
CHANGED
|
@@ -40,6 +40,22 @@ Generated contract files import their types from the facade, so an application n
|
|
|
40
40
|
|
|
41
41
|
These forward; they do not copy. `@prisma/orm-mongo/contract/types` and `@prisma/orm-framework/contract/types` are the same module, so shared registries and `instanceof` checks hold across the boundary.
|
|
42
42
|
|
|
43
|
+
## Prepared statements
|
|
44
|
+
|
|
45
|
+
`db.prepare(declaration, callback)` builds a query once and runs it many times with different values. Run the handle against `await db.runtime()`:
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
const byEmail = await db.prepare({ email: 'mongo/string@1' }, (p) =>
|
|
49
|
+
db.query
|
|
50
|
+
.from('users')
|
|
51
|
+
.match((f) => f.email.eq(p.email))
|
|
52
|
+
.build(),
|
|
53
|
+
);
|
|
54
|
+
const users = await byEmail.query(await db.runtime(), { email: 'alice@example.com' }).toArray();
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The handle and declaration types (`MongoPreparedStatement`, `MongoPreparedExecution`, `MongoDeclaration`, `MongoParamsFromDeclaration`) are exported from `@prisma/orm-mongo/family-runtime`.
|
|
58
|
+
|
|
43
59
|
## The CLI
|
|
44
60
|
|
|
45
61
|
This package ships no bin. The ORM commands run inside the unified `prisma` CLI, which mounts the command family published at `@prisma/orm-toolchain/cli`.
|
|
@@ -8,8 +8,8 @@ import { buildNamespacedEnums } from "@prisma/orm-framework/contract/enum-access
|
|
|
8
8
|
import { UNBOUND_NAMESPACE_ID } from "@prisma/orm-framework/components/ir";
|
|
9
9
|
import { mongoQuery } from "@prisma/orm-family-mongo/query-builder";
|
|
10
10
|
import { assertDefined } from "@prisma/orm-framework/utils/assertions";
|
|
11
|
-
//#region ../../../3-targets/mongo/9-facade/dist/mongo-static-
|
|
12
|
-
var version = "8.0.0-rc.23-dev.
|
|
11
|
+
//#region ../../../3-targets/mongo/9-facade/dist/mongo-static-Dgiq4thY.mjs
|
|
12
|
+
var version = "8.0.0-rc.23-dev.7";
|
|
13
13
|
const serializer = new MongoContractSerializer();
|
|
14
14
|
const validator = `${mongoRuntimeTarget.targetId}@${version}`;
|
|
15
15
|
/**
|
|
@@ -69,4 +69,4 @@ function mongoStatic(options) {
|
|
|
69
69
|
//#endregion
|
|
70
70
|
export { validateMongoContract as i, contractFromJson as n, mongoStatic as r, buildMongoStaticContext as t };
|
|
71
71
|
|
|
72
|
-
//# sourceMappingURL=mongo-static-
|
|
72
|
+
//# sourceMappingURL=mongo-static-Dgiq4thY-lDOWM65j.mjs.map
|
package/dist/{mongo-static-AaffxZRP-D45kxMt-.mjs.map → mongo-static-Dgiq4thY-lDOWM65j.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo-static-
|
|
1
|
+
{"version":3,"file":"mongo-static-Dgiq4thY-lDOWM65j.mjs","names":[],"sources":["../../../../3-targets/mongo/9-facade/dist/mongo-static-Dgiq4thY.mjs"],"sourcesContent":["import mongoRuntimeAdapter from \"@internal/adapter-mongo/runtime\";\nimport { mongoRaw } from \"@internal/mongo-orm\";\nimport { createMongoExecutionContext, createMongoExecutionStack, enumMemberCodecFor } from \"@internal/mongo-runtime\";\nimport mongoRuntimeTarget from \"@internal/target-mongo/runtime\";\nimport { validateContractOnce } from \"@internal/contract/validate-once\";\nimport { MongoContractSerializer } from \"@internal/family-mongo/ir\";\nimport { buildNamespacedEnums } from \"@internal/contract/enum-accessor\";\nimport { UNBOUND_NAMESPACE_ID } from \"@internal/framework-components/ir\";\nimport { mongoQuery } from \"@internal/mongo-query-builder\";\nimport { assertDefined } from \"@internal/utils/assertions\";\n//#region package.json\nvar version = \"8.0.0-rc.23-dev.7\";\n//#endregion\n//#region src/static/contract-from-json.ts\nconst serializer = new MongoContractSerializer();\nconst validator = `${mongoRuntimeTarget.targetId}@${version}`;\n/**\n* Validates an emitted Mongo `contract.json` and returns it as the contract type the application\n* names, ready to pass to `mongo({ contract })` and `mongoStatic({ contract })`. Clients built from\n* the result do not validate it again.\n*\n* The returned value's top level is frozen; its nested objects are not. Do not change `json` or the\n* returned value after the call: clients built from the value later do not validate it again.\n*\n* @example\n* ```ts\n* import type { Contract } from './contract.d';\n* import contractJson from './contract.json' with { type: 'json' };\n*\n* export const contract = contractFromJson<Contract>(contractJson);\n* ```\n*/\nfunction contractFromJson(json) {\n\treturn validateContractOnce(json, validator, (input) => serializer.deserializeContract(input));\n}\nfunction validateMongoContract(contract) {\n\treturn contractFromJson(contract);\n}\n//#endregion\n//#region src/static/mongo-static.ts\nfunction buildMongoStaticContext(contract, stack) {\n\tconst context = createMongoExecutionContext({\n\t\tcontract,\n\t\tstack\n\t});\n\tconst enums = Object.freeze(buildNamespacedEnums(context.contract.domain, enumMemberCodecFor(context.codecs)))[UNBOUND_NAMESPACE_ID];\n\tassertDefined(enums, \"the unbound namespace always exists on a mongo builder output\");\n\treturn {\n\t\tcontext,\n\t\tcontract,\n\t\tenums,\n\t\tquery: mongoQuery({ context }),\n\t\traw: mongoRaw({ context })\n\t};\n}\n/**\n* The query surfaces of a Mongo client without a driver: `query`, `raw` and `enums`. Use it where\n* loading `mongodb` is not wanted.\n*\n* @example\n* ```ts\n* const { enums } = mongoStatic({ contract: contractFromJson<Contract>(contractJson) });\n* ```\n*/\nfunction mongoStatic(options) {\n\tconst stack = createMongoExecutionStack({\n\t\ttarget: mongoRuntimeTarget,\n\t\tadapter: mongoRuntimeAdapter,\n\t\textensions: options.extensions ?? []\n\t});\n\treturn buildMongoStaticContext(validateMongoContract(options.contract), stack);\n}\n//#endregion\nexport { validateMongoContract as i, mongoStatic as n, contractFromJson as r, buildMongoStaticContext as t };\n\n//# sourceMappingURL=mongo-static-Dgiq4thY.mjs.map"],"mappings":";;;;;;;;;;;AAWA,IAAI,UAAU;AAGd,MAAM,aAAa,IAAI,wBAAwB;AAC/C,MAAM,YAAY,GAAG,mBAAmB,SAAS,GAAG;;;;;;;;;;;;;;;;;AAiBpD,SAAS,iBAAiB,MAAM;CAC/B,OAAO,qBAAqB,MAAM,YAAY,UAAU,WAAW,oBAAoB,KAAK,CAAC;AAC9F;AACA,SAAS,sBAAsB,UAAU;CACxC,OAAO,iBAAiB,QAAQ;AACjC;AAGA,SAAS,wBAAwB,UAAU,OAAO;CACjD,MAAM,UAAU,4BAA4B;EAC3C;EACA;CACD,CAAC;CACD,MAAM,QAAQ,OAAO,OAAO,qBAAqB,QAAQ,SAAS,QAAQ,mBAAmB,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC;CAC/G,cAAc,OAAO,+DAA+D;CACpF,OAAO;EACN;EACA;EACA;EACA,OAAO,WAAW,EAAE,QAAQ,CAAC;EAC7B,KAAK,SAAS,EAAE,QAAQ,CAAC;CAC1B;AACD;;;;;;;;;;AAUA,SAAS,YAAY,SAAS;CAC7B,MAAM,QAAQ,0BAA0B;EACvC,QAAQ;EACR,SAAS;EACT,YAAY,QAAQ,cAAc,CAAC;CACpC,CAAC;CACD,OAAO,wBAAwB,sBAAsB,QAAQ,QAAQ,GAAG,KAAK;AAC9E"}
|
package/dist/runtime.d.mts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { n as MongoTargetId, t as MongoStaticContext } from "./mongo-static-DabeBtmV-DILuhcbE.mjs";
|
|
2
2
|
import { MongoClient as MongoClient$1 } from "mongodb";
|
|
3
3
|
import { MongoOrmClient, MongoRawClient } from "@prisma/orm-family-mongo/orm";
|
|
4
|
-
import { MongoExecutionContext, MongoMiddleware, MongoRuntime, MongoRuntimeExtensionDescriptor } from "@prisma/orm-family-mongo/runtime";
|
|
4
|
+
import { MongoExecutionContext, MongoMiddleware, MongoPrepareMember, MongoRuntime, MongoRuntimeExtensionDescriptor } from "@prisma/orm-family-mongo/runtime";
|
|
5
5
|
import { MongoBinding, MongoBinding as MongoBinding$1 } from "@prisma/orm-target-mongo/driver/runtime";
|
|
6
6
|
import { RuntimeMode } from "@prisma/orm-framework/components/runtime";
|
|
7
|
-
import { AnyMongoTypeMaps, MongoContract, MongoContractWithTypeMaps } from "@prisma/orm-family-mongo/contract";
|
|
7
|
+
import { AnyMongoTypeMaps, ExtractMongoCodecTypes, MongoContract, MongoContractWithTypeMaps } from "@prisma/orm-family-mongo/contract";
|
|
8
8
|
//#region ../../../3-targets/mongo/9-facade/dist/runtime.d.mts
|
|
9
9
|
//#region src/runtime/binding.d.ts
|
|
10
10
|
type MongoBindingInput = {
|
|
@@ -35,7 +35,10 @@ type MongoBindingInput = {
|
|
|
35
35
|
//#endregion
|
|
36
36
|
//#region src/runtime/mongo.d.ts
|
|
37
37
|
type UnboundEnums<TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>> = MongoStaticContext<TContract>['enums'];
|
|
38
|
-
|
|
38
|
+
/**
|
|
39
|
+
* A MongoDB client. `prepare` opens no connection, so a client with no binding can prepare; run the handle against `await db.runtime()`. Declarations are checked against the contract's codec types.
|
|
40
|
+
*/
|
|
41
|
+
interface MongoClient<TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>> extends MongoPrepareMember<ExtractMongoCodecTypes<TContract>> {
|
|
39
42
|
readonly orm: MongoOrmClient<TContract>;
|
|
40
43
|
readonly query: MongoStaticContext<TContract>['query'];
|
|
41
44
|
readonly raw: MongoRawClient<TContract>;
|
package/dist/runtime.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.mts","names":[],"sources":["../../../../3-targets/mongo/9-facade/dist/runtime.d.mts"],"mappings":";;;;;;;;;KAQK;WACM,SAAS;WACT;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA,aAAa;WACb;WACA;WACA;WACA;;;;KAIN,aAAa,kBAAkB,0BAA0B,eAAe,qBAAqB,mBAAmB
|
|
1
|
+
{"version":3,"file":"runtime.d.mts","names":[],"sources":["../../../../3-targets/mongo/9-facade/dist/runtime.d.mts"],"mappings":";;;;;;;;;KAQK;WACM,SAAS;WACT;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA,aAAa;WACb;WACA;WACA;WACA;;;;KAIN,aAAa,kBAAkB,0BAA0B,eAAe,qBAAqB,mBAAmB;;;;UAI3G,YAAY,kBAAkB,0BAA0B,eAAe,2BAA2B,mBAAmB,uBAAuB;WAC3I,KAAK,eAAe;WACpB,OAAO,mBAAmB;WAC1B,KAAK,eAAe;WACpB,UAAU;WACV,OAAO,aAAa;WACpB,SAAS,sBAAsB;EACxC,QAAQ,eAAe,oBAAoB,QAAQ;EACnD,WAAW,QAAQ;EACnB,SAAS;GACR,OAAO,iBAAiB;;UAEjB;WACC,sBAAsB,gCAAgC;WACtD,OAAO;;;;WAIP,sBAAsB;;UAEvB;WACC,UAAU;WACV;WACA;WACA;WACA,gCAAgC;;KAEtC,aAAa,kBAAkB,0BAA0B,eAAe,qBAAqB,sBAAsB;WAC7G,UAAU;;;;;;;;;;;;;;;;;;;iBAmBJ,MAAM,kBAAkB,0BAA0B,eAAe,mBAAmB,SAAS,aAAa,aAAa,YAAY"}
|
package/dist/runtime.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as validateMongoContract, t as buildMongoStaticContext } from "./mongo-static-
|
|
1
|
+
import { i as validateMongoContract, t as buildMongoStaticContext } from "./mongo-static-Dgiq4thY-lDOWM65j.mjs";
|
|
2
2
|
import { ifDefined } from "@prisma/orm-framework/utils/defined";
|
|
3
3
|
import mongoRuntimeAdapter from "@prisma/orm-target-mongo/adapter/runtime";
|
|
4
4
|
import { mongoOrm } from "@prisma/orm-family-mongo/orm";
|
|
@@ -200,6 +200,10 @@ function mongo(options) {
|
|
|
200
200
|
runtime() {
|
|
201
201
|
return getRuntime();
|
|
202
202
|
},
|
|
203
|
+
async prepare(declaration, callback) {
|
|
204
|
+
if (closed) throw closedError();
|
|
205
|
+
return createRuntime().runtime.prepare(declaration, callback);
|
|
206
|
+
},
|
|
203
207
|
async close() {
|
|
204
208
|
if (closed) return;
|
|
205
209
|
closed = true;
|
package/dist/runtime.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.mjs","names":[],"sources":["../../../../3-targets/mongo/9-facade/dist/runtime.mjs"],"sourcesContent":["import { i as validateMongoContract, t as buildMongoStaticContext } from \"./mongo-static-AaffxZRP.mjs\";\nimport { ifDefined } from \"@internal/utils/defined\";\nimport mongoRuntimeAdapter from \"@internal/adapter-mongo/runtime\";\nimport mongoRuntimeDriver from \"@internal/driver-mongo/runtime\";\nimport { AsyncIterableResult } from \"@internal/framework-components/runtime\";\nimport { mongoOrm } from \"@internal/mongo-orm\";\nimport { createMongoExecutionStack, createMongoRuntime } from \"@internal/mongo-runtime\";\nimport mongoRuntimeTarget from \"@internal/target-mongo/runtime\";\nimport { InternalError } from \"@internal/utils/internal-error\";\nimport { ConnectionString } from \"mongodb-connection-string-url\";\nimport { structuredError } from \"@internal/utils/structured-error\";\n//#region src/runtime/mongo-errors.ts\nfunction mongoError(code, message, options) {\n\treturn structuredError(code, message, {\n\t\t...options,\n\t\tmeta: {\n\t\t\t...options?.meta,\n\t\t\textension: \"mongo\"\n\t\t}\n\t});\n}\n//#endregion\n//#region src/runtime/binding.ts\nconst URL_SCHEME_PATTERN = /^([a-z][a-z\\d+.-]*):\\/\\//i;\nconst MONGO_SCHEMES = /* @__PURE__ */ new Set([\"mongodb\", \"mongodb+srv\"]);\nfunction validateMongoUrl(url) {\n\tconst trimmed = url.trim();\n\tif (trimmed.length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must be a non-empty string\");\n\tconst scheme = URL_SCHEME_PATTERN.exec(trimmed)?.[1];\n\tif (scheme === void 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must be a valid URL\");\n\tif (!MONGO_SCHEMES.has(scheme)) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must use mongodb:// or mongodb+srv://\");\n\ttry {\n\t\treturn new ConnectionString(trimmed);\n\t} catch {\n\t\tthrow mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must be a valid URL\");\n\t}\n}\nfunction extractDbNameFromUrl(parsed) {\n\tconst [encodedDbName = \"\"] = parsed.pathname.slice(1).split(\"/\");\n\tif (encodedDbName.length === 0) return;\n\ttry {\n\t\treturn decodeURIComponent(encodedDbName);\n\t} catch {\n\t\tthrow mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must be a valid URL\");\n\t}\n}\nfunction resolveMongoBinding(options) {\n\tconst providedCount = Number(options.binding !== void 0) + Number(options.url !== void 0) + Number(options.uri !== void 0) + Number(options.mongoClient !== void 0);\n\tif (providedCount !== 1) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Provide one binding input: binding, url, uri+dbName, or mongoClient+dbName\", { meta: { received: providedCount } });\n\tif (options.binding !== void 0) return options.binding;\n\tif (options.url !== void 0) {\n\t\tconst parsed = validateMongoUrl(options.url);\n\t\tif (options.dbName !== void 0 && options.dbName.trim().length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo binding via { url, dbName } requires a non-empty dbName\");\n\t\tconst explicitDbName = options.dbName?.trim();\n\t\tconst dbName = explicitDbName !== void 0 && explicitDbName.length > 0 ? explicitDbName : extractDbNameFromUrl(parsed);\n\t\tif (dbName === void 0 || dbName.length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must include a database name in its path (e.g. mongodb://host:27017/mydb), or pass dbName explicitly\");\n\t\treturn {\n\t\t\tkind: \"url\",\n\t\t\turl: options.url.trim(),\n\t\t\tdbName\n\t\t};\n\t}\n\tif (options.uri !== void 0) {\n\t\tvalidateMongoUrl(options.uri);\n\t\tconst dbName = options.dbName?.trim();\n\t\tif (dbName === void 0 || dbName.length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo binding via { uri, dbName } requires a non-empty dbName\");\n\t\treturn {\n\t\t\tkind: \"url\",\n\t\t\turl: options.uri.trim(),\n\t\t\tdbName\n\t\t};\n\t}\n\tconst mongoClient = options.mongoClient;\n\tif (mongoClient === void 0) throw new InternalError(\"Invariant violation: expected mongo binding after validation\");\n\tconst dbName = options.dbName?.trim();\n\tif (dbName === void 0 || dbName.length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo binding via { mongoClient, dbName } requires a non-empty dbName\");\n\treturn {\n\t\tkind: \"mongoClient\",\n\t\tclient: mongoClient,\n\t\tdbName\n\t};\n}\nfunction resolveOptionalMongoBinding(options) {\n\tconst providedCount = Number(options.binding !== void 0) + Number(options.url !== void 0) + Number(options.uri !== void 0) + Number(options.mongoClient !== void 0);\n\tif (providedCount === 0) return;\n\tif (providedCount !== 1) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Provide one binding input: binding, url, uri+dbName, or mongoClient+dbName\", { meta: { received: providedCount } });\n\tif (options.binding !== void 0) return resolveMongoBinding({ binding: options.binding });\n\tif (options.url !== void 0) return resolveMongoBinding(options.dbName !== void 0 ? {\n\t\turl: options.url,\n\t\tdbName: options.dbName\n\t} : { url: options.url });\n\tif (options.uri !== void 0) return resolveMongoBinding({\n\t\turi: options.uri,\n\t\tdbName: options.dbName ?? \"\"\n\t});\n\tif (options.mongoClient !== void 0) return resolveMongoBinding({\n\t\tmongoClient: options.mongoClient,\n\t\tdbName: options.dbName ?? \"\"\n\t});\n\tthrow new InternalError(\"Invariant violation: expected one mongo binding branch\");\n}\n//#endregion\n//#region src/runtime/mongo.ts\n/**\n* Creates a lazy Mongo client. The client infers its contract type from `contract`: a value from\n* `contractFromJson` for an emitted contract, or a TypeScript-authored contract. A contract is\n* validated once, however many clients are built from it. The `orm` and `query` surfaces are\n* available at once; the driver connects on the first query or `connect()`.\n*\n* @example\n* ```ts\n* import { contractFromJson } from '@prisma/orm-mongo/static';\n* import mongo from '@prisma/orm-mongo/runtime';\n* import type { Contract } from './contract.d';\n* import contractJson from './contract.json' with { type: 'json' };\n*\n* export const contract = contractFromJson<Contract>(contractJson);\n* export const db = mongo({ contract, url: process.env['MONGODB_URL']! });\n* ```\n*/\nfunction mongo(options) {\n\tconst contract = validateMongoContract(options.contract);\n\tlet binding = resolveOptionalMongoBinding(options);\n\tconst stack = createMongoExecutionStack({\n\t\ttarget: mongoRuntimeTarget,\n\t\tadapter: mongoRuntimeAdapter,\n\t\tdriver: mongoRuntimeDriver,\n\t\textensions: options.extensions ?? []\n\t});\n\tconst { context, query, enums, raw } = buildMongoStaticContext(contract, stack);\n\tlet runtimePromise;\n\tlet closed = false;\n\tlet runtimeInstance;\n\tconst closedError = () => mongoError(\"DRIVER.NOT_CONNECTED\", \"Mongo client is closed\");\n\tconst createRuntime = () => {\n\t\tif (runtimeInstance !== void 0) return runtimeInstance;\n\t\tconst driver = stack.driver.create();\n\t\truntimeInstance = {\n\t\t\truntime: createMongoRuntime({\n\t\t\t\tcontext,\n\t\t\t\tadapter: stack.adapter.create(stack),\n\t\t\t\tdriver,\n\t\t\t\t...ifDefined(\"mode\", options.mode),\n\t\t\t\t...ifDefined(\"middleware\", options.middleware)\n\t\t\t}),\n\t\t\tdriver\n\t\t};\n\t\treturn runtimeInstance;\n\t};\n\tconst buildRuntime = async (resolvedBinding) => {\n\t\tconst { runtime, driver } = createRuntime();\n\t\tawait driver.connect(resolvedBinding);\n\t\treturn runtime;\n\t};\n\tconst getRuntime = () => {\n\t\tif (closed) return Promise.reject(closedError());\n\t\tif (runtimePromise !== void 0) return runtimePromise;\n\t\tif (binding === void 0) return Promise.reject(mongoError(\"RUNTIME.BINDING_MISSING\", \"Mongo binding not configured. Pass url/uri+dbName/mongoClient+dbName/binding to mongo(...) or call db.connect({ ... }).\"));\n\t\truntimePromise = buildRuntime(binding).catch((err) => {\n\t\t\truntimePromise = void 0;\n\t\t\tthrow err;\n\t\t});\n\t\treturn runtimePromise;\n\t};\n\tfunction queryRows(plan) {\n\t\tasync function* iterate() {\n\t\t\tyield* (await getRuntime()).query(plan);\n\t\t}\n\t\treturn new AsyncIterableResult(iterate());\n\t}\n\tasync function executeStats(plan) {\n\t\treturn (await getRuntime()).execute(plan);\n\t}\n\treturn {\n\t\torm: mongoOrm({\n\t\t\tcontext,\n\t\t\truntime: {\n\t\t\t\tquery: queryRows,\n\t\t\t\texecute: executeStats\n\t\t\t}\n\t\t}),\n\t\tquery,\n\t\traw,\n\t\tcontract,\n\t\tenums,\n\t\tcontext,\n\t\tasync connect(bindingInput) {\n\t\t\tif (closed) throw closedError();\n\t\t\tif (runtimePromise !== void 0) {\n\t\t\t\tif (bindingInput !== void 0) throw mongoError(\"DRIVER.ALREADY_CONNECTED\", \"Mongo client is already bound\", {\n\t\t\t\t\twhy: \"connect() was given options after the client was bound to a database.\",\n\t\t\t\t\tfix: \"Call connect() without options, or create a new client for another database.\"\n\t\t\t\t});\n\t\t\t\tconst runtime = await runtimePromise;\n\t\t\t\tif (closed) throw closedError();\n\t\t\t\treturn runtime;\n\t\t\t}\n\t\t\tif (bindingInput !== void 0) binding = resolveMongoBinding(bindingInput);\n\t\t\tif (binding === void 0) throw mongoError(\"RUNTIME.BINDING_MISSING\", \"Mongo binding not configured. Pass url/uri+dbName/mongoClient+dbName/binding to mongo(...) or call db.connect({ ... }).\");\n\t\t\tconst runtime = await getRuntime();\n\t\t\tif (closed) throw closedError();\n\t\t\treturn runtime;\n\t\t},\n\t\truntime() {\n\t\t\treturn getRuntime();\n\t\t},\n\t\tasync close() {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tawait runtimePromise?.catch(() => void 0);\n\t\t\tawait runtimeInstance?.runtime.close();\n\t\t},\n\t\t[Symbol.asyncDispose]() {\n\t\t\treturn this.close();\n\t\t}\n\t};\n}\n//#endregion\nexport { mongo as default };\n\n//# sourceMappingURL=runtime.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.mjs","names":[],"sources":["../../../../3-targets/mongo/9-facade/dist/runtime.mjs"],"sourcesContent":["import { i as validateMongoContract, t as buildMongoStaticContext } from \"./mongo-static-Dgiq4thY.mjs\";\nimport { ifDefined } from \"@internal/utils/defined\";\nimport mongoRuntimeAdapter from \"@internal/adapter-mongo/runtime\";\nimport mongoRuntimeDriver from \"@internal/driver-mongo/runtime\";\nimport { AsyncIterableResult } from \"@internal/framework-components/runtime\";\nimport { mongoOrm } from \"@internal/mongo-orm\";\nimport { createMongoExecutionStack, createMongoRuntime } from \"@internal/mongo-runtime\";\nimport mongoRuntimeTarget from \"@internal/target-mongo/runtime\";\nimport { InternalError } from \"@internal/utils/internal-error\";\nimport { ConnectionString } from \"mongodb-connection-string-url\";\nimport { structuredError } from \"@internal/utils/structured-error\";\n//#region src/runtime/mongo-errors.ts\nfunction mongoError(code, message, options) {\n\treturn structuredError(code, message, {\n\t\t...options,\n\t\tmeta: {\n\t\t\t...options?.meta,\n\t\t\textension: \"mongo\"\n\t\t}\n\t});\n}\n//#endregion\n//#region src/runtime/binding.ts\nconst URL_SCHEME_PATTERN = /^([a-z][a-z\\d+.-]*):\\/\\//i;\nconst MONGO_SCHEMES = /* @__PURE__ */ new Set([\"mongodb\", \"mongodb+srv\"]);\nfunction validateMongoUrl(url) {\n\tconst trimmed = url.trim();\n\tif (trimmed.length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must be a non-empty string\");\n\tconst scheme = URL_SCHEME_PATTERN.exec(trimmed)?.[1];\n\tif (scheme === void 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must be a valid URL\");\n\tif (!MONGO_SCHEMES.has(scheme)) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must use mongodb:// or mongodb+srv://\");\n\ttry {\n\t\treturn new ConnectionString(trimmed);\n\t} catch {\n\t\tthrow mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must be a valid URL\");\n\t}\n}\nfunction extractDbNameFromUrl(parsed) {\n\tconst [encodedDbName = \"\"] = parsed.pathname.slice(1).split(\"/\");\n\tif (encodedDbName.length === 0) return;\n\ttry {\n\t\treturn decodeURIComponent(encodedDbName);\n\t} catch {\n\t\tthrow mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must be a valid URL\");\n\t}\n}\nfunction resolveMongoBinding(options) {\n\tconst providedCount = Number(options.binding !== void 0) + Number(options.url !== void 0) + Number(options.uri !== void 0) + Number(options.mongoClient !== void 0);\n\tif (providedCount !== 1) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Provide one binding input: binding, url, uri+dbName, or mongoClient+dbName\", { meta: { received: providedCount } });\n\tif (options.binding !== void 0) return options.binding;\n\tif (options.url !== void 0) {\n\t\tconst parsed = validateMongoUrl(options.url);\n\t\tif (options.dbName !== void 0 && options.dbName.trim().length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo binding via { url, dbName } requires a non-empty dbName\");\n\t\tconst explicitDbName = options.dbName?.trim();\n\t\tconst dbName = explicitDbName !== void 0 && explicitDbName.length > 0 ? explicitDbName : extractDbNameFromUrl(parsed);\n\t\tif (dbName === void 0 || dbName.length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo URL must include a database name in its path (e.g. mongodb://host:27017/mydb), or pass dbName explicitly\");\n\t\treturn {\n\t\t\tkind: \"url\",\n\t\t\turl: options.url.trim(),\n\t\t\tdbName\n\t\t};\n\t}\n\tif (options.uri !== void 0) {\n\t\tvalidateMongoUrl(options.uri);\n\t\tconst dbName = options.dbName?.trim();\n\t\tif (dbName === void 0 || dbName.length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo binding via { uri, dbName } requires a non-empty dbName\");\n\t\treturn {\n\t\t\tkind: \"url\",\n\t\t\turl: options.uri.trim(),\n\t\t\tdbName\n\t\t};\n\t}\n\tconst mongoClient = options.mongoClient;\n\tif (mongoClient === void 0) throw new InternalError(\"Invariant violation: expected mongo binding after validation\");\n\tconst dbName = options.dbName?.trim();\n\tif (dbName === void 0 || dbName.length === 0) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Mongo binding via { mongoClient, dbName } requires a non-empty dbName\");\n\treturn {\n\t\tkind: \"mongoClient\",\n\t\tclient: mongoClient,\n\t\tdbName\n\t};\n}\nfunction resolveOptionalMongoBinding(options) {\n\tconst providedCount = Number(options.binding !== void 0) + Number(options.url !== void 0) + Number(options.uri !== void 0) + Number(options.mongoClient !== void 0);\n\tif (providedCount === 0) return;\n\tif (providedCount !== 1) throw mongoError(\"RUNTIME.BINDING_INVALID\", \"Provide one binding input: binding, url, uri+dbName, or mongoClient+dbName\", { meta: { received: providedCount } });\n\tif (options.binding !== void 0) return resolveMongoBinding({ binding: options.binding });\n\tif (options.url !== void 0) return resolveMongoBinding(options.dbName !== void 0 ? {\n\t\turl: options.url,\n\t\tdbName: options.dbName\n\t} : { url: options.url });\n\tif (options.uri !== void 0) return resolveMongoBinding({\n\t\turi: options.uri,\n\t\tdbName: options.dbName ?? \"\"\n\t});\n\tif (options.mongoClient !== void 0) return resolveMongoBinding({\n\t\tmongoClient: options.mongoClient,\n\t\tdbName: options.dbName ?? \"\"\n\t});\n\tthrow new InternalError(\"Invariant violation: expected one mongo binding branch\");\n}\n//#endregion\n//#region src/runtime/mongo.ts\n/**\n* Creates a lazy Mongo client. The client infers its contract type from `contract`: a value from\n* `contractFromJson` for an emitted contract, or a TypeScript-authored contract. A contract is\n* validated once, however many clients are built from it. The `orm` and `query` surfaces are\n* available at once; the driver connects on the first query or `connect()`.\n*\n* @example\n* ```ts\n* import { contractFromJson } from '@prisma/orm-mongo/static';\n* import mongo from '@prisma/orm-mongo/runtime';\n* import type { Contract } from './contract.d';\n* import contractJson from './contract.json' with { type: 'json' };\n*\n* export const contract = contractFromJson<Contract>(contractJson);\n* export const db = mongo({ contract, url: process.env['MONGODB_URL']! });\n* ```\n*/\nfunction mongo(options) {\n\tconst contract = validateMongoContract(options.contract);\n\tlet binding = resolveOptionalMongoBinding(options);\n\tconst stack = createMongoExecutionStack({\n\t\ttarget: mongoRuntimeTarget,\n\t\tadapter: mongoRuntimeAdapter,\n\t\tdriver: mongoRuntimeDriver,\n\t\textensions: options.extensions ?? []\n\t});\n\tconst { context, query, enums, raw } = buildMongoStaticContext(contract, stack);\n\tlet runtimePromise;\n\tlet closed = false;\n\tlet runtimeInstance;\n\tconst closedError = () => mongoError(\"DRIVER.NOT_CONNECTED\", \"Mongo client is closed\");\n\tconst createRuntime = () => {\n\t\tif (runtimeInstance !== void 0) return runtimeInstance;\n\t\tconst driver = stack.driver.create();\n\t\truntimeInstance = {\n\t\t\truntime: createMongoRuntime({\n\t\t\t\tcontext,\n\t\t\t\tadapter: stack.adapter.create(stack),\n\t\t\t\tdriver,\n\t\t\t\t...ifDefined(\"mode\", options.mode),\n\t\t\t\t...ifDefined(\"middleware\", options.middleware)\n\t\t\t}),\n\t\t\tdriver\n\t\t};\n\t\treturn runtimeInstance;\n\t};\n\tconst buildRuntime = async (resolvedBinding) => {\n\t\tconst { runtime, driver } = createRuntime();\n\t\tawait driver.connect(resolvedBinding);\n\t\treturn runtime;\n\t};\n\tconst getRuntime = () => {\n\t\tif (closed) return Promise.reject(closedError());\n\t\tif (runtimePromise !== void 0) return runtimePromise;\n\t\tif (binding === void 0) return Promise.reject(mongoError(\"RUNTIME.BINDING_MISSING\", \"Mongo binding not configured. Pass url/uri+dbName/mongoClient+dbName/binding to mongo(...) or call db.connect({ ... }).\"));\n\t\truntimePromise = buildRuntime(binding).catch((err) => {\n\t\t\truntimePromise = void 0;\n\t\t\tthrow err;\n\t\t});\n\t\treturn runtimePromise;\n\t};\n\tfunction queryRows(plan) {\n\t\tasync function* iterate() {\n\t\t\tyield* (await getRuntime()).query(plan);\n\t\t}\n\t\treturn new AsyncIterableResult(iterate());\n\t}\n\tasync function executeStats(plan) {\n\t\treturn (await getRuntime()).execute(plan);\n\t}\n\treturn {\n\t\torm: mongoOrm({\n\t\t\tcontext,\n\t\t\truntime: {\n\t\t\t\tquery: queryRows,\n\t\t\t\texecute: executeStats\n\t\t\t}\n\t\t}),\n\t\tquery,\n\t\traw,\n\t\tcontract,\n\t\tenums,\n\t\tcontext,\n\t\tasync connect(bindingInput) {\n\t\t\tif (closed) throw closedError();\n\t\t\tif (runtimePromise !== void 0) {\n\t\t\t\tif (bindingInput !== void 0) throw mongoError(\"DRIVER.ALREADY_CONNECTED\", \"Mongo client is already bound\", {\n\t\t\t\t\twhy: \"connect() was given options after the client was bound to a database.\",\n\t\t\t\t\tfix: \"Call connect() without options, or create a new client for another database.\"\n\t\t\t\t});\n\t\t\t\tconst runtime = await runtimePromise;\n\t\t\t\tif (closed) throw closedError();\n\t\t\t\treturn runtime;\n\t\t\t}\n\t\t\tif (bindingInput !== void 0) binding = resolveMongoBinding(bindingInput);\n\t\t\tif (binding === void 0) throw mongoError(\"RUNTIME.BINDING_MISSING\", \"Mongo binding not configured. Pass url/uri+dbName/mongoClient+dbName/binding to mongo(...) or call db.connect({ ... }).\");\n\t\t\tconst runtime = await getRuntime();\n\t\t\tif (closed) throw closedError();\n\t\t\treturn runtime;\n\t\t},\n\t\truntime() {\n\t\t\treturn getRuntime();\n\t\t},\n\t\tasync prepare(declaration, callback) {\n\t\t\tif (closed) throw closedError();\n\t\t\treturn createRuntime().runtime.prepare(declaration, callback);\n\t\t},\n\t\tasync close() {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tawait runtimePromise?.catch(() => void 0);\n\t\t\tawait runtimeInstance?.runtime.close();\n\t\t},\n\t\t[Symbol.asyncDispose]() {\n\t\t\treturn this.close();\n\t\t}\n\t};\n}\n//#endregion\nexport { mongo as default };\n\n//# sourceMappingURL=runtime.mjs.map"],"mappings":"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"}
|
package/dist/static.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as contractFromJson, r as mongoStatic } from "./mongo-static-
|
|
1
|
+
import { n as contractFromJson, r as mongoStatic } from "./mongo-static-Dgiq4thY-lDOWM65j.mjs";
|
|
2
2
|
export { contractFromJson, mongoStatic as default };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma/orm-mongo",
|
|
3
|
-
"version": "8.0.0-rc.23-dev.
|
|
3
|
+
"version": "8.0.0-rc.23-dev.7",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -10,18 +10,18 @@
|
|
|
10
10
|
"skills"
|
|
11
11
|
],
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@prisma/orm-family-mongo": "8.0.0-rc.23-dev.
|
|
14
|
-
"@prisma/orm-framework": "8.0.0-rc.23-dev.
|
|
15
|
-
"@prisma/orm-target-mongo": "8.0.0-rc.23-dev.
|
|
16
|
-
"@prisma/orm-toolchain": "8.0.0-rc.23-dev.
|
|
13
|
+
"@prisma/orm-family-mongo": "8.0.0-rc.23-dev.7",
|
|
14
|
+
"@prisma/orm-framework": "8.0.0-rc.23-dev.7",
|
|
15
|
+
"@prisma/orm-target-mongo": "8.0.0-rc.23-dev.7",
|
|
16
|
+
"@prisma/orm-toolchain": "8.0.0-rc.23-dev.7",
|
|
17
17
|
"mongodb-connection-string-url": "^7.0.1",
|
|
18
18
|
"pathe": "^2.0.3",
|
|
19
19
|
"tinyglobby": "^0.2.17"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@internal/mongo": "8.0.0-rc.23-dev.
|
|
23
|
-
"@repo/tsconfig": "8.0.0-rc.23-dev.
|
|
24
|
-
"@repo/tsdown": "8.0.0-rc.23-dev.
|
|
22
|
+
"@internal/mongo": "8.0.0-rc.23-dev.7",
|
|
23
|
+
"@repo/tsconfig": "8.0.0-rc.23-dev.7",
|
|
24
|
+
"@repo/tsdown": "8.0.0-rc.23-dev.7",
|
|
25
25
|
"tsdown": "0.22.14",
|
|
26
26
|
"typescript": "5.9.3"
|
|
27
27
|
},
|
package/skills/prisma-8/SKILL.md
CHANGED
|
@@ -208,6 +208,28 @@ Update callbacks return arrays of field operations (`.set`, `.inc`, `.push`, `.p
|
|
|
208
208
|
|
|
209
209
|
**Plans vs ORM.** The ORM's `.create` / `.update` / `.all` issue queries directly. Don't pass ORM collections to `runtime.query` / `runtime.execute` — those entry points are for `db.query` plans (and migration/runtime internals).
|
|
210
210
|
|
|
211
|
+
## Workflow — Prepared statements (`db.prepare`)
|
|
212
|
+
|
|
213
|
+
The concept: `db.prepare(declaration, (p) => plan)` builds a query-builder plan once and runs it many times with different values. The declaration names each parameter's codec (`{ email: 'mongo/string@1' }`, or `{ codecId: 'mongo/string@1', nullable: true }` to allow `null`); unknown codec ids fail to compile. The callback receives one placeholder per name and puts it where a value goes: filter operators (`eq`, `in`, …), update operators (`set`, `push`, …), insert documents, `fn.literal(p.x)`, and `limit` / `skip` (with a codec whose input is a number, such as `mongo/int32@1`). Each run encodes the value with the declared codec. Preparing opens no connection; run the handle against `await db.runtime()`:
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
const byAuthor = await db.prepare(
|
|
217
|
+
{ authorId: 'mongo/objectId@1', take: 'mongo/int32@1' },
|
|
218
|
+
(p) =>
|
|
219
|
+
db.query
|
|
220
|
+
.from('posts')
|
|
221
|
+
.match((f) => f.authorId.eq(p.authorId))
|
|
222
|
+
.sort({ createdAt: -1 })
|
|
223
|
+
.limit(p.take)
|
|
224
|
+
.build(),
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
const runtime = await db.runtime();
|
|
228
|
+
const recent = await byAuthor.query(runtime, { authorId: someHexId, take: 10 }).toArray();
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
An `updateOne`, `updateMany`, `deleteOne` or `deleteMany` plan gives a handle with `execute(runtime, params)` as well as `query`, resolving `{ affectedRows }`. `runtime.prepare(...)` is the same thing on a `MongoRuntime`. A declared name the plan never uses throws `RUNTIME.PREPARE_UNUSED_PARAM`; a placeholder in a `db.raw` command throws `RUNTIME.PREPARE_RAW_PLACEHOLDER`; a placeholder whose name, codec id or nullability the declaration does not give throws `RUNTIME.PREPARE_UNDECLARED_PARAM`; a missing value at run time throws `RUNTIME.PREPARE_MISSING_PARAM`. A `db.raw` command with no placeholders can be prepared and is sent as written on each run. ORM reads (`.prepared.all()`) cannot be prepared yet. Design: [ADR 318](../../../docs/architecture%20docs/adrs/ADR%20318%20-%20MongoDB%20prepared%20statements.md).
|
|
232
|
+
|
|
211
233
|
## Common Pitfalls (Mongo)
|
|
212
234
|
|
|
213
235
|
1. **Reaching for the lower-level lane when the ORM would have done.** Default to the ORM; drop to `db.query` only for shapes the ORM can't express.
|
|
@@ -233,6 +255,7 @@ Update callbacks return arrays of field operations (`.set`, `.inc`, `.push`, `.p
|
|
|
233
255
|
- [ ] Chose the right lane (ORM by default; `db.query` for shapes the ORM doesn't express).
|
|
234
256
|
- [ ] Used `.where({ ... }).first()` for single-row reads — not `.all()`.
|
|
235
257
|
- [ ] Ran query-builder plans via `(await db.runtime()).query(plan)`; used `execute(plan)` only for an affected count on a write.
|
|
258
|
+
- [ ] For a query run many times with different values, used `db.prepare(...)` and ran the handle against `await db.runtime()`.
|
|
236
259
|
- [ ] For aggregations, used `db.query.from(...).group(...)` rather than a non-existent ORM `.aggregate(...)`.
|
|
237
260
|
- [ ] Did NOT confabulate `db.transaction`, `db.sql`, or ORM `.aggregate(...)` — routed to *What Prisma 8 doesn't do yet* / `references/feedback.md` instead.
|
|
238
261
|
- [ ] Did NOT use the lower-level builder for something the ORM cleanly expresses.
|
|
@@ -147,7 +147,9 @@ Every read terminal (`.all()`, and `db.query(plan)` for a SQL-builder plan) retu
|
|
|
147
147
|
|
|
148
148
|
There is no `.stream()` method on a client or on a connection.
|
|
149
149
|
|
|
150
|
-
## Prepared statements (Postgres, SQLite)
|
|
150
|
+
## Prepared statements (Postgres, SQLite, MySQL, MongoDB)
|
|
151
|
+
|
|
152
|
+
This section covers the SQL clients. MongoDB's `db.prepare` has the same shape and runs against `await db.runtime()`; see *Workflow — Prepared statements* in [`queries-mongo.md`](queries-mongo.md).
|
|
151
153
|
|
|
152
154
|
`db.prepare(declaration, (params) => plan)` builds a statement once and binds it per call. The declaration names each parameter's codec (`{ email: 'pg/text@1' }`); the callback receives typed `params`, builds the plan with `db.sql` (or an ORM `.prepared` description), and returns it. A row-returning plan gives a `PreparedStatement` you run with `ps.query(target, params)`; a plan whose result is an affected count gives a `PreparedExecution` you run with `ps.execute(target, params)`. A prepared statement runs on what it is given: the runtime, a connection, a transaction's `tx`, or a Supabase role-bound client, which runs it under its role. `ps.query(tx, params)` runs inside the transaction. Preparing sends nothing to the database. Inside a transaction, `tx.prepare(...)` prepares without the outer client. Declaring a parameter the plan never references throws `RUNTIME.PREPARE_UNUSED_PARAM`. `runtime.prepare(declaration, (params) => plan)` is the same thing on a `Runtime`.
|
|
153
155
|
|