@prisma-next/adapter-mongo 0.5.0-dev.7 → 0.5.0-dev.8

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 CHANGED
@@ -4,8 +4,10 @@ MongoDB adapter for Prisma Next. Lowers abstract MongoDB commands into wire-prot
4
4
 
5
5
  ## Responsibilities
6
6
 
7
- - **Command lowering**: Converts `MongoCommand` instances (find, aggregate) into MongoDB wire-protocol documents
8
- - **Codec application**: Applies codec transformations to query parameters and result documents
7
+ - **Command lowering**: `MongoAdapter.lower(plan)` converts a `MongoCommand` (find, aggregate, …) into a wire-protocol document. The method is `async` so it can await codec encode work on parameter values; the runtime (`MongoRuntime.execute`) awaits `adapter.lower(plan)` before issuing the command to the driver.
8
+ - **Codec application on encode**: `resolveValue` walks parameter trees and dispatches codec-encoded leaves concurrently via `Promise.all`. The codec's `encode` is awaited (whether the codec body is sync or async), and the resolved wire value is placed into the lowered document.
9
+
10
+ Mongo does not currently decode rows — documents pass through from the driver directly — so this adapter has no decode-side codec application today. See [ADR 204 — Single-Path Async Codec Runtime](../../../docs/architecture%20docs/adrs/ADR%20204%20-%20Single-Path%20Async%20Codec%20Runtime.md) for the codec runtime's async boundary contract.
9
11
 
10
12
  ## Dependencies
11
13
 
package/dist/control.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as mongoInt32Codec, c as mongoVectorCodec, i as mongoDoubleCodec, n as mongoBooleanCodec, o as mongoObjectIdCodec, r as mongoDateCodec, s as mongoStringCodec, t as createMongoAdapter } from "./mongo-adapter-aVo8aZrf.mjs";
1
+ import { a as mongoInt32Codec, c as mongoVectorCodec, i as mongoDoubleCodec, n as mongoBooleanCodec, o as mongoObjectIdCodec, r as mongoDateCodec, s as mongoStringCodec, t as createMongoAdapter } from "./mongo-adapter-B3Mh3rXi.mjs";
2
2
  import { MongoServerError } from "mongodb";
3
3
  import { keysToKeySpec } from "@prisma-next/mongo-query-ast/control";
4
4
  import { MongoSchemaCollection, MongoSchemaCollectionOptions, MongoSchemaIR, MongoSchemaIndex, MongoSchemaValidator } from "@prisma-next/mongo-schema-ir";
package/dist/index.d.mts CHANGED
@@ -20,9 +20,9 @@ declare const mongoVectorOperationDescriptors: readonly OperationDescriptor[];
20
20
  //#endregion
21
21
  //#region src/lowering.d.ts
22
22
  declare function lowerAggExpr(expr: MongoAggExpr): unknown;
23
- declare function lowerFilter(filter: MongoFilterExpr): Document;
24
- declare function lowerStage(stage: MongoPipelineStage): Record<string, unknown>;
25
- declare function lowerPipeline(stages: ReadonlyArray<MongoPipelineStage>): Array<Record<string, unknown>>;
23
+ declare function lowerFilter(filter: MongoFilterExpr, codecs?: MongoCodecRegistry): Promise<Document>;
24
+ declare function lowerStage(stage: MongoPipelineStage, codecs?: MongoCodecRegistry): Promise<Record<string, unknown>>;
25
+ declare function lowerPipeline(stages: ReadonlyArray<MongoPipelineStage>, codecs?: MongoCodecRegistry): Promise<Array<Record<string, unknown>>>;
26
26
  //#endregion
27
27
  //#region src/mongo-adapter.d.ts
28
28
  declare function createMongoAdapter(codecs?: MongoCodecRegistry): MongoAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/operations.ts","../src/lowering.ts","../src/mongo-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;cAGa,0BAAwB;;;;;;EAAxB,OAAA,EAAA;IAMA,OAAA,EAAA,eAAA;;;;AC6HG,cD7HH,+BC6HkC,EAAA,SD7HQ,mBC6HR,EAAA;;;iBAA/B,YAAA,OAAmB;iBAInB,WAAA,SAAoB,kBAAkB;iBA8DtC,UAAA,QAAkB,qBAAqB;iBAqMvC,aAAA,SACN,cAAc,sBACrB,MAAM;;;iBChPO,kBAAA,UAA4B,qBAAqB"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/operations.ts","../src/lowering.ts","../src/mongo-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;cAGa,0BAAwB;;;;;;EAAxB,OAAA,EAAA;IAMA,OAAA,EAAA,eAAA;;;;AC8HG,cD9HH,+BC8HkC,EAAA,SD9HQ,mBC8HR,EAAA;;;iBAA/B,YAAA,OAAmB;iBAIb,WAAA,SACZ,0BACC,qBACR,QAAQ;iBA8DW,UAAA,QACb,6BACE,qBACR,QAAQ;iBA+MW,aAAA,SACZ,cAAc,8BACb,qBACR,QAAQ,MAAM;;;iBC/OD,kBAAA,UAA4B,qBAAqB"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { d as lowerPipeline, f as lowerStage, l as lowerAggExpr, m as MONGO_VECTOR_CODEC_ID, p as MONGO_INT32_CODEC_ID, t as createMongoAdapter, u as lowerFilter } from "./mongo-adapter-aVo8aZrf.mjs";
1
+ import { d as lowerPipeline, f as lowerStage, l as lowerAggExpr, m as MONGO_VECTOR_CODEC_ID, p as MONGO_INT32_CODEC_ID, t as createMongoAdapter, u as lowerFilter } from "./mongo-adapter-B3Mh3rXi.mjs";
2
2
 
3
3
  //#region src/core/operations.ts
4
4
  const mongoVectorNearOperation = Object.freeze({
@@ -1,4 +1,5 @@
1
1
  import { isExprArray, isRecordArgs } from "@prisma-next/mongo-query-ast/execution";
2
+ import { runtimeError } from "@prisma-next/framework-components/runtime";
2
3
  import { MongoParamRef } from "@prisma-next/mongo-value";
3
4
  import { createMongoCodecRegistry, mongoCodec } from "@prisma-next/mongo-codec";
4
5
  import { AggregateWireCommand, DeleteManyWireCommand, DeleteOneWireCommand, FindOneAndDeleteWireCommand, FindOneAndUpdateWireCommand, InsertManyWireCommand, InsertOneWireCommand, UpdateManyWireCommand, UpdateOneWireCommand } from "@prisma-next/mongo-wire";
@@ -15,21 +16,60 @@ const MONGO_VECTOR_CODEC_ID = "mongo/vector@1";
15
16
 
16
17
  //#endregion
17
18
  //#region src/resolve-value.ts
18
- function resolveValue(value, codecs) {
19
+ /**
20
+ * Resolves a `MongoValue` (which may contain `MongoParamRef` leaves) into the
21
+ * driver-ready wire shape. When a leaf has a `codecId` and the registry has a
22
+ * codec for it, the codec's async `encode` is awaited so codecs may perform
23
+ * asynchronous work (e.g. lookups, key derivations).
24
+ *
25
+ * Object/array nodes dispatch their child resolutions concurrently via
26
+ * `Promise.all` so independent leaves encode in parallel.
27
+ *
28
+ * Codec encode failures are wrapped in a `RUNTIME.ENCODE_FAILED` envelope
29
+ * (mirroring SQL's `wrapEncodeFailure` shape) with `{ label, codec }` details
30
+ * and the original error attached on `cause`. An already-wrapped envelope is
31
+ * re-thrown verbatim so nested resolvers don't double-wrap.
32
+ */
33
+ async function resolveValue(value, codecs) {
19
34
  if (value instanceof MongoParamRef) {
20
35
  if (value.codecId && codecs) {
21
36
  const codec = codecs.get(value.codecId);
22
- if (codec?.encode) return codec.encode(value.value);
37
+ if (codec?.encode) try {
38
+ return await codec.encode(value.value);
39
+ } catch (error) {
40
+ wrapEncodeFailure(error, value, codec.id);
41
+ }
23
42
  }
24
43
  return value.value;
25
44
  }
26
45
  if (value === null || typeof value !== "object") return value;
27
46
  if (value instanceof Date) return value;
28
- if (Array.isArray(value)) return value.map((v) => resolveValue(v, codecs));
47
+ if (Array.isArray(value)) return Promise.all(value.map((v) => resolveValue(v, codecs)));
48
+ const entries = Object.entries(value);
49
+ const resolved = await Promise.all(entries.map(([, val]) => resolveValue(val, codecs)));
29
50
  const result = {};
30
- for (const [key, val] of Object.entries(value)) result[key] = resolveValue(val, codecs);
51
+ for (let i = 0; i < entries.length; i++) {
52
+ const entry = entries[i];
53
+ if (entry) result[entry[0]] = resolved[i];
54
+ }
31
55
  return result;
32
56
  }
57
+ function paramRefLabel(ref, codecId) {
58
+ return ref.name ?? codecId;
59
+ }
60
+ function isAlreadyEncodeFailure(error) {
61
+ return error instanceof Error && "code" in error && error.code === "RUNTIME.ENCODE_FAILED";
62
+ }
63
+ function wrapEncodeFailure(error, ref, codecId) {
64
+ if (isAlreadyEncodeFailure(error)) throw error;
65
+ const label = paramRefLabel(ref, codecId);
66
+ const wrapped = runtimeError("RUNTIME.ENCODE_FAILED", `Failed to encode parameter ${label} with codec '${codecId}': ${error instanceof Error ? error.message : String(error)}`, {
67
+ label,
68
+ codec: codecId
69
+ });
70
+ wrapped.cause = error;
71
+ throw wrapped;
72
+ }
33
73
 
34
74
  //#endregion
35
75
  //#region src/lowering.ts
@@ -110,12 +150,12 @@ function needsLiteralWrap(value) {
110
150
  function lowerAggExpr(expr) {
111
151
  return expr.accept(aggExprLoweringVisitor);
112
152
  }
113
- function lowerFilter(filter) {
153
+ async function lowerFilter(filter, codecs) {
114
154
  switch (filter.kind) {
115
- case "field": return { [filter.field]: { [filter.op]: resolveValue(filter.value) } };
116
- case "and": return { $and: filter.exprs.map((e) => lowerFilter(e)) };
117
- case "or": return { $or: filter.exprs.map((e) => lowerFilter(e)) };
118
- case "not": return { $nor: [lowerFilter(filter.expr)] };
155
+ case "field": return { [filter.field]: { [filter.op]: await resolveValue(filter.value, codecs) } };
156
+ case "and": return { $and: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs))) };
157
+ case "or": return { $or: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs))) };
158
+ case "not": return { $nor: [await lowerFilter(filter.expr, codecs)] };
119
159
  case "exists": return { [filter.field]: { $exists: filter.exists } };
120
160
  case "expr": return { $expr: lowerAggExpr(filter.aggExpr) };
121
161
  default: {
@@ -149,9 +189,9 @@ function lowerWindowField(wf) {
149
189
  if (wf.window) result["window"] = { ...wf.window };
150
190
  return result;
151
191
  }
152
- function lowerStage(stage) {
192
+ async function lowerStage(stage, codecs) {
153
193
  switch (stage.kind) {
154
- case "match": return { $match: lowerFilter(stage.filter) };
194
+ case "match": return { $match: await lowerFilter(stage.filter, codecs) };
155
195
  case "project": {
156
196
  const projection = {};
157
197
  for (const [key, val] of Object.entries(stage.projection)) projection[key] = lowerProjectionValue(val);
@@ -167,7 +207,7 @@ function lowerStage(stage) {
167
207
  };
168
208
  if (stage.localField !== void 0) lookup["localField"] = stage.localField;
169
209
  if (stage.foreignField !== void 0) lookup["foreignField"] = stage.foreignField;
170
- if (stage.pipeline) lookup["pipeline"] = stage.pipeline.map((s) => lowerStage(s));
210
+ if (stage.pipeline) lookup["pipeline"] = await Promise.all(stage.pipeline.map((s) => lowerStage(s, codecs)));
171
211
  if (stage.let_) lookup["let"] = lowerExprRecord(stage.let_);
172
212
  return { $lookup: lookup };
173
213
  }
@@ -196,7 +236,7 @@ function lowerStage(stage) {
196
236
  } : stage.collection };
197
237
  case "unionWith": {
198
238
  const unionWith = { coll: stage.collection };
199
- if (stage.pipeline) unionWith["pipeline"] = stage.pipeline.map((s) => lowerStage(s));
239
+ if (stage.pipeline) unionWith["pipeline"] = await Promise.all(stage.pipeline.map((s) => lowerStage(s, codecs)));
200
240
  return { $unionWith: unionWith };
201
241
  }
202
242
  case "bucket": {
@@ -225,15 +265,20 @@ function lowerStage(stage) {
225
265
  if (stage.spherical !== void 0) geoNear["spherical"] = stage.spherical;
226
266
  if (stage.maxDistance !== void 0) geoNear["maxDistance"] = stage.maxDistance;
227
267
  if (stage.minDistance !== void 0) geoNear["minDistance"] = stage.minDistance;
228
- if (stage.query) geoNear["query"] = lowerFilter(stage.query);
268
+ if (stage.query) geoNear["query"] = await lowerFilter(stage.query, codecs);
229
269
  if (stage.key !== void 0) geoNear["key"] = stage.key;
230
270
  if (stage.distanceMultiplier !== void 0) geoNear["distanceMultiplier"] = stage.distanceMultiplier;
231
271
  if (stage.includeLocs !== void 0) geoNear["includeLocs"] = stage.includeLocs;
232
272
  return { $geoNear: geoNear };
233
273
  }
234
274
  case "facet": {
275
+ const facetEntries = Object.entries(stage.facets);
276
+ const facetPipelines = await Promise.all(facetEntries.map(([, pipeline]) => Promise.all(pipeline.map((s) => lowerStage(s, codecs)))));
235
277
  const facet = {};
236
- for (const [key, pipeline] of Object.entries(stage.facets)) facet[key] = pipeline.map((s) => lowerStage(s));
278
+ for (let i = 0; i < facetEntries.length; i++) {
279
+ const entry = facetEntries[i];
280
+ if (entry) facet[entry[0]] = facetPipelines[i];
281
+ }
237
282
  return { $facet: facet };
238
283
  }
239
284
  case "graphLookup": {
@@ -246,13 +291,13 @@ function lowerStage(stage) {
246
291
  };
247
292
  if (stage.maxDepth !== void 0) graphLookup["maxDepth"] = stage.maxDepth;
248
293
  if (stage.depthField !== void 0) graphLookup["depthField"] = stage.depthField;
249
- if (stage.restrictSearchWithMatch) graphLookup["restrictSearchWithMatch"] = lowerFilter(stage.restrictSearchWithMatch);
294
+ if (stage.restrictSearchWithMatch) graphLookup["restrictSearchWithMatch"] = await lowerFilter(stage.restrictSearchWithMatch, codecs);
250
295
  return { $graphLookup: graphLookup };
251
296
  }
252
297
  case "merge": {
253
298
  const merge = { into: stage.into };
254
299
  if (stage.on !== void 0) merge["on"] = stage.on;
255
- if (stage.whenMatched !== void 0) merge["whenMatched"] = Array.isArray(stage.whenMatched) ? stage.whenMatched.map((s) => lowerStage(s)) : stage.whenMatched;
300
+ if (stage.whenMatched !== void 0) merge["whenMatched"] = Array.isArray(stage.whenMatched) ? await Promise.all(stage.whenMatched.map((s) => lowerStage(s, codecs))) : stage.whenMatched;
256
301
  if (stage.whenNotMatched !== void 0) merge["whenNotMatched"] = stage.whenNotMatched;
257
302
  return { $merge: merge };
258
303
  }
@@ -315,8 +360,8 @@ function lowerStage(stage) {
315
360
  }
316
361
  }
317
362
  }
318
- function lowerPipeline(stages) {
319
- return stages.map(lowerStage);
363
+ async function lowerPipeline(stages, codecs) {
364
+ return Promise.all(stages.map((s) => lowerStage(s, codecs)));
320
365
  }
321
366
 
322
367
  //#endregion
@@ -373,7 +418,12 @@ const mongoDateCodec = mongoCodec({
373
418
  targetTypes: ["date"],
374
419
  traits: ["equality", "order"],
375
420
  decode: (wire) => wire,
376
- encode: (value) => value
421
+ encode: (value) => value,
422
+ encodeJson: (value) => value.toISOString(),
423
+ decodeJson: (json) => {
424
+ if (typeof json !== "string") throw new Error("expected ISO date string");
425
+ return new Date(json);
426
+ }
377
427
  });
378
428
  const mongoVectorCodec = mongoCodec({
379
429
  typeId: MONGO_VECTOR_CODEC_ID,
@@ -399,27 +449,41 @@ var MongoAdapterImpl = class {
399
449
  constructor(codecs) {
400
450
  this.#codecs = codecs;
401
451
  }
402
- #resolveDocument(expr) {
452
+ async #resolveDocument(expr) {
453
+ const entries = Object.entries(expr);
454
+ const resolved = await Promise.all(entries.map(([, val]) => resolveValue(val, this.#codecs)));
403
455
  const result = {};
404
- for (const [key, val] of Object.entries(expr)) result[key] = resolveValue(val, this.#codecs);
456
+ for (let i = 0; i < entries.length; i++) {
457
+ const entry = entries[i];
458
+ if (entry) result[entry[0]] = resolved[i];
459
+ }
405
460
  return result;
406
461
  }
407
- #lowerUpdate(update) {
408
- if (isUpdatePipeline(update)) return update.map((stage) => lowerStage(stage));
462
+ async #lowerUpdate(update) {
463
+ if (isUpdatePipeline(update)) return Promise.all(update.map((stage) => lowerStage(stage, this.#codecs)));
409
464
  return this.#resolveDocument(update);
410
465
  }
411
- lower(plan) {
466
+ async lower(plan) {
412
467
  const { command } = plan;
413
468
  switch (command.kind) {
414
- case "insertOne": return new InsertOneWireCommand(command.collection, this.#resolveDocument(command.document));
415
- case "updateOne": return new UpdateOneWireCommand(command.collection, lowerFilter(command.filter), this.#lowerUpdate(command.update), command.upsert);
416
- case "insertMany": return new InsertManyWireCommand(command.collection, command.documents.map((doc) => this.#resolveDocument(doc)));
417
- case "updateMany": return new UpdateManyWireCommand(command.collection, lowerFilter(command.filter), this.#lowerUpdate(command.update), command.upsert);
418
- case "deleteOne": return new DeleteOneWireCommand(command.collection, lowerFilter(command.filter));
419
- case "deleteMany": return new DeleteManyWireCommand(command.collection, lowerFilter(command.filter));
420
- case "findOneAndUpdate": return new FindOneAndUpdateWireCommand(command.collection, lowerFilter(command.filter), this.#lowerUpdate(command.update), command.upsert, command.sort, command.returnDocument);
421
- case "findOneAndDelete": return new FindOneAndDeleteWireCommand(command.collection, lowerFilter(command.filter), command.sort);
422
- case "aggregate": return new AggregateWireCommand(command.collection, lowerPipeline(command.pipeline));
469
+ case "insertOne": return new InsertOneWireCommand(command.collection, await this.#resolveDocument(command.document));
470
+ case "updateOne": {
471
+ const [filter, update] = await Promise.all([lowerFilter(command.filter, this.#codecs), this.#lowerUpdate(command.update)]);
472
+ return new UpdateOneWireCommand(command.collection, filter, update, command.upsert);
473
+ }
474
+ case "insertMany": return new InsertManyWireCommand(command.collection, await Promise.all(command.documents.map((doc) => this.#resolveDocument(doc))));
475
+ case "updateMany": {
476
+ const [filter, update] = await Promise.all([lowerFilter(command.filter, this.#codecs), this.#lowerUpdate(command.update)]);
477
+ return new UpdateManyWireCommand(command.collection, filter, update, command.upsert);
478
+ }
479
+ case "deleteOne": return new DeleteOneWireCommand(command.collection, await lowerFilter(command.filter, this.#codecs));
480
+ case "deleteMany": return new DeleteManyWireCommand(command.collection, await lowerFilter(command.filter, this.#codecs));
481
+ case "findOneAndUpdate": {
482
+ const [filter, update] = await Promise.all([lowerFilter(command.filter, this.#codecs), this.#lowerUpdate(command.update)]);
483
+ return new FindOneAndUpdateWireCommand(command.collection, filter, update, command.upsert, command.sort, command.returnDocument);
484
+ }
485
+ case "findOneAndDelete": return new FindOneAndDeleteWireCommand(command.collection, await lowerFilter(command.filter, this.#codecs), command.sort);
486
+ case "aggregate": return new AggregateWireCommand(command.collection, await lowerPipeline(command.pipeline, this.#codecs));
423
487
  case "rawAggregate": return new AggregateWireCommand(command.collection, command.pipeline);
424
488
  case "rawInsertOne": return new InsertOneWireCommand(command.collection, command.document);
425
489
  case "rawInsertMany": return new InsertManyWireCommand(command.collection, command.documents);
@@ -455,4 +519,4 @@ function createMongoAdapter(codecs) {
455
519
 
456
520
  //#endregion
457
521
  export { mongoInt32Codec as a, mongoVectorCodec as c, lowerPipeline as d, lowerStage as f, mongoDoubleCodec as i, lowerAggExpr as l, MONGO_VECTOR_CODEC_ID as m, mongoBooleanCodec as n, mongoObjectIdCodec as o, MONGO_INT32_CODEC_ID as p, mongoDateCodec as r, mongoStringCodec as s, createMongoAdapter as t, lowerFilter as u };
458
- //# sourceMappingURL=mongo-adapter-aVo8aZrf.mjs.map
522
+ //# sourceMappingURL=mongo-adapter-B3Mh3rXi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo-adapter-B3Mh3rXi.mjs","names":["result: Record<string, unknown>","entries: Array<[string, unknown]>","aggExprLoweringVisitor: MongoAggExprVisitor<unknown>","loweredArgs: unknown","vars: Record<string, unknown>","_exhaustive: never","result: Record<string, unknown>","projection: Record<string, unknown>","lookup: Record<string, unknown>","unwind: Record<string, unknown>","group: Record<string, unknown>","unionWith: Record<string, unknown>","bucket: Record<string, unknown>","bucketAuto: Record<string, unknown>","geoNear: Record<string, unknown>","facet: Record<string, unknown>","graphLookup: Record<string, unknown>","merge: Record<string, unknown>","swf: Record<string, unknown>","output: Record<string, unknown>","densify: Record<string, unknown>","fill: Record<string, unknown>","entry: Record<string, unknown>","search: Record<string, unknown>","searchMeta: Record<string, unknown>","vs: Record<string, unknown>","#codecs","#resolveDocument","result: Record<string, unknown>","#lowerUpdate","_exhaustive: never"],"sources":["../src/core/codec-ids.ts","../src/resolve-value.ts","../src/lowering.ts","../src/core/codecs.ts","../src/mongo-adapter.ts"],"sourcesContent":["export const MONGO_OBJECTID_CODEC_ID = 'mongo/objectId@1' as const;\nexport const MONGO_STRING_CODEC_ID = 'mongo/string@1' as const;\nexport const MONGO_DOUBLE_CODEC_ID = 'mongo/double@1' as const;\nexport const MONGO_INT32_CODEC_ID = 'mongo/int32@1' as const;\nexport const MONGO_BOOLEAN_CODEC_ID = 'mongo/bool@1' as const;\nexport const MONGO_DATE_CODEC_ID = 'mongo/date@1' as const;\nexport const MONGO_VECTOR_CODEC_ID = 'mongo/vector@1' as const;\n","import { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { MongoCodecRegistry } from '@prisma-next/mongo-codec';\nimport type { MongoValue } from '@prisma-next/mongo-value';\nimport { MongoParamRef } from '@prisma-next/mongo-value';\n\n/**\n * Resolves a `MongoValue` (which may contain `MongoParamRef` leaves) into the\n * driver-ready wire shape. When a leaf has a `codecId` and the registry has a\n * codec for it, the codec's async `encode` is awaited so codecs may perform\n * asynchronous work (e.g. lookups, key derivations).\n *\n * Object/array nodes dispatch their child resolutions concurrently via\n * `Promise.all` so independent leaves encode in parallel.\n *\n * Codec encode failures are wrapped in a `RUNTIME.ENCODE_FAILED` envelope\n * (mirroring SQL's `wrapEncodeFailure` shape) with `{ label, codec }` details\n * and the original error attached on `cause`. An already-wrapped envelope is\n * re-thrown verbatim so nested resolvers don't double-wrap.\n */\nexport async function resolveValue(\n value: MongoValue,\n codecs?: MongoCodecRegistry,\n): Promise<unknown> {\n if (value instanceof MongoParamRef) {\n if (value.codecId && codecs) {\n const codec = codecs.get(value.codecId);\n if (codec?.encode) {\n try {\n return await codec.encode(value.value);\n } catch (error) {\n wrapEncodeFailure(error, value, codec.id);\n }\n }\n }\n return value.value;\n }\n if (value === null || typeof value !== 'object') {\n return value;\n }\n if (value instanceof Date) {\n return value;\n }\n if (Array.isArray(value)) {\n return Promise.all(value.map((v) => resolveValue(v, codecs)));\n }\n const entries = Object.entries(value);\n const resolved = await Promise.all(entries.map(([, val]) => resolveValue(val, codecs)));\n const result: Record<string, unknown> = {};\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (entry) {\n result[entry[0]] = resolved[i];\n }\n }\n return result;\n}\n\nfunction paramRefLabel(ref: MongoParamRef, codecId: string): string {\n return ref.name ?? codecId;\n}\n\nfunction isAlreadyEncodeFailure(error: unknown): boolean {\n return (\n error instanceof Error &&\n 'code' in error &&\n (error as Error & { code?: unknown }).code === 'RUNTIME.ENCODE_FAILED'\n );\n}\n\nfunction wrapEncodeFailure(error: unknown, ref: MongoParamRef, codecId: string): never {\n if (isAlreadyEncodeFailure(error)) {\n throw error;\n }\n const label = paramRefLabel(ref, codecId);\n const message = error instanceof Error ? error.message : String(error);\n const wrapped = runtimeError(\n 'RUNTIME.ENCODE_FAILED',\n `Failed to encode parameter ${label} with codec '${codecId}': ${message}`,\n { label, codec: codecId },\n );\n wrapped.cause = error;\n throw wrapped;\n}\n","import type { MongoCodecRegistry } from '@prisma-next/mongo-codec';\nimport type {\n MongoAggExpr,\n MongoAggExprVisitor,\n MongoFilterExpr,\n MongoGroupId,\n MongoPipelineStage,\n MongoProjectionValue,\n MongoWindowField,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { isExprArray, isRecordArgs } from '@prisma-next/mongo-query-ast/execution';\nimport type { Document } from '@prisma-next/mongo-value';\nimport { resolveValue } from './resolve-value';\n\n// Biome flags `{ then: ... }` as a thenable object (noThenProperty). Build via Object.fromEntries to avoid.\nconst THEN_KEY = 'then';\n\nfunction condBranch(\n caseOrIf: MongoAggExpr,\n thenExpr: MongoAggExpr,\n elseExpr?: MongoAggExpr,\n): Record<string, unknown> {\n const entries: Array<[string, unknown]> = [\n [elseExpr ? 'if' : 'case', lowerAggExpr(caseOrIf)],\n [THEN_KEY, lowerAggExpr(thenExpr)],\n ];\n if (elseExpr) {\n entries.push(['else', lowerAggExpr(elseExpr)]);\n }\n return Object.fromEntries(entries);\n}\n\nconst aggExprLoweringVisitor: MongoAggExprVisitor<unknown> = {\n fieldRef(expr) {\n return `$${expr.path}`;\n },\n\n literal(expr) {\n return needsLiteralWrap(expr.value) ? { $literal: expr.value } : expr.value;\n },\n\n operator(expr) {\n const { args } = expr;\n let loweredArgs: unknown;\n if (isExprArray(args)) {\n loweredArgs = args.map((a) => lowerAggExpr(a));\n } else if (isRecordArgs(args)) {\n loweredArgs = lowerExprRecord(args);\n } else {\n loweredArgs = lowerAggExpr(args);\n }\n return { [expr.op]: loweredArgs };\n },\n\n accumulator(expr) {\n if (expr.arg === null) {\n return { [expr.op]: {} };\n }\n if (isRecordArgs(expr.arg)) {\n return { [expr.op]: lowerExprRecord(expr.arg) };\n }\n return { [expr.op]: lowerAggExpr(expr.arg) };\n },\n\n cond(expr) {\n return { $cond: condBranch(expr.condition, expr.then_, expr.else_) };\n },\n\n switch_(expr) {\n return {\n $switch: {\n branches: expr.branches.map((b) => condBranch(b.case_, b.then_)),\n default: lowerAggExpr(expr.default_),\n },\n };\n },\n\n filter(expr) {\n return {\n $filter: {\n input: lowerAggExpr(expr.input),\n cond: lowerAggExpr(expr.cond),\n as: expr.as,\n },\n };\n },\n\n map(expr) {\n return {\n $map: {\n input: lowerAggExpr(expr.input),\n in: lowerAggExpr(expr.in_),\n as: expr.as,\n },\n };\n },\n\n reduce(expr) {\n return {\n $reduce: {\n input: lowerAggExpr(expr.input),\n initialValue: lowerAggExpr(expr.initialValue),\n in: lowerAggExpr(expr.in_),\n },\n };\n },\n\n let_(expr) {\n const vars: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(expr.vars)) {\n vars[key] = lowerAggExpr(val);\n }\n return { $let: { vars, in: lowerAggExpr(expr.in_) } };\n },\n\n mergeObjects(expr) {\n return { $mergeObjects: expr.exprs.map((e) => lowerAggExpr(e)) };\n },\n};\n\nfunction needsLiteralWrap(value: unknown): boolean {\n if (typeof value === 'string' && value.startsWith('$')) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.some((v) => needsLiteralWrap(v));\n }\n if (value !== null && typeof value === 'object') {\n return Object.entries(value as Record<string, unknown>).some(\n ([k, v]) => k.startsWith('$') || needsLiteralWrap(v),\n );\n }\n return false;\n}\n\nexport function lowerAggExpr(expr: MongoAggExpr): unknown {\n return expr.accept(aggExprLoweringVisitor);\n}\n\nexport async function lowerFilter(\n filter: MongoFilterExpr,\n codecs?: MongoCodecRegistry,\n): Promise<Document> {\n switch (filter.kind) {\n case 'field':\n return { [filter.field]: { [filter.op]: await resolveValue(filter.value, codecs) } };\n case 'and':\n return { $and: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs))) };\n case 'or':\n return { $or: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs))) };\n case 'not':\n return { $nor: [await lowerFilter(filter.expr, codecs)] };\n case 'exists':\n return { [filter.field]: { $exists: filter.exists } };\n case 'expr':\n return { $expr: lowerAggExpr(filter.aggExpr) };\n default: {\n const _exhaustive: never = filter;\n throw new Error(`Unhandled filter kind: ${(_exhaustive as MongoFilterExpr).kind}`);\n }\n }\n}\n\nfunction isAggExprNode(value: object): value is MongoAggExpr {\n return 'accept' in value && typeof value.accept === 'function';\n}\n\nfunction lowerGroupId(groupId: MongoGroupId): unknown {\n if (groupId === null) return null;\n if (isAggExprNode(groupId)) return lowerAggExpr(groupId);\n return lowerExprRecord(groupId);\n}\n\nfunction lowerExprRecord(\n fields: Readonly<Record<string, MongoAggExpr | ReadonlyArray<MongoAggExpr>>>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(fields)) {\n if (Array.isArray(val)) {\n result[key] = val.map((v: MongoAggExpr) => lowerAggExpr(v));\n } else {\n result[key] = lowerAggExpr(val as MongoAggExpr);\n }\n }\n return result;\n}\n\nfunction lowerProjectionValue(value: MongoProjectionValue): unknown {\n if (typeof value === 'number') return value;\n return lowerAggExpr(value);\n}\n\nfunction lowerWindowField(wf: MongoWindowField): Record<string, unknown> {\n const lowered = lowerAggExpr(wf.operator);\n if (typeof lowered !== 'object' || lowered === null) {\n throw new Error('Window field operator must lower to an object');\n }\n const result: Record<string, unknown> = { ...lowered };\n if (wf.window) {\n result['window'] = { ...wf.window };\n }\n return result;\n}\n\nexport async function lowerStage(\n stage: MongoPipelineStage,\n codecs?: MongoCodecRegistry,\n): Promise<Record<string, unknown>> {\n switch (stage.kind) {\n case 'match':\n return { $match: await lowerFilter(stage.filter, codecs) };\n case 'project': {\n const projection: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(stage.projection)) {\n projection[key] = lowerProjectionValue(val);\n }\n return { $project: projection };\n }\n case 'sort':\n return { $sort: { ...stage.sort } };\n case 'limit':\n return { $limit: stage.limit };\n case 'skip':\n return { $skip: stage.skip };\n case 'lookup': {\n const lookup: Record<string, unknown> = {\n from: stage.from,\n as: stage.as,\n };\n if (stage.localField !== undefined) lookup['localField'] = stage.localField;\n if (stage.foreignField !== undefined) lookup['foreignField'] = stage.foreignField;\n if (stage.pipeline) {\n lookup['pipeline'] = await Promise.all(stage.pipeline.map((s) => lowerStage(s, codecs)));\n }\n if (stage.let_) {\n lookup['let'] = lowerExprRecord(stage.let_);\n }\n return { $lookup: lookup };\n }\n case 'unwind': {\n const unwind: Record<string, unknown> = {\n path: stage.path,\n preserveNullAndEmptyArrays: stage.preserveNullAndEmptyArrays,\n };\n if (stage.includeArrayIndex !== undefined) {\n unwind['includeArrayIndex'] = stage.includeArrayIndex;\n }\n return { $unwind: unwind };\n }\n case 'group': {\n const group: Record<string, unknown> = { _id: lowerGroupId(stage.groupId) };\n for (const [key, acc] of Object.entries(stage.accumulators)) {\n group[key] = lowerAggExpr(acc);\n }\n return { $group: group };\n }\n case 'addFields':\n return { $addFields: lowerExprRecord(stage.fields) };\n case 'replaceRoot':\n return { $replaceRoot: { newRoot: lowerAggExpr(stage.newRoot) } };\n case 'count':\n return { $count: stage.field };\n case 'sortByCount':\n return { $sortByCount: lowerAggExpr(stage.expr) };\n case 'sample':\n return { $sample: { size: stage.size } };\n case 'redact':\n return { $redact: lowerAggExpr(stage.expr) };\n case 'out':\n return { $out: stage.db ? { db: stage.db, coll: stage.collection } : stage.collection };\n case 'unionWith': {\n const unionWith: Record<string, unknown> = { coll: stage.collection };\n if (stage.pipeline) {\n unionWith['pipeline'] = await Promise.all(stage.pipeline.map((s) => lowerStage(s, codecs)));\n }\n return { $unionWith: unionWith };\n }\n case 'bucket': {\n const bucket: Record<string, unknown> = {\n groupBy: lowerAggExpr(stage.groupBy),\n boundaries: [...stage.boundaries],\n };\n if (stage.default_ !== undefined) bucket['default'] = stage.default_;\n if (stage.output) bucket['output'] = lowerExprRecord(stage.output);\n return { $bucket: bucket };\n }\n case 'bucketAuto': {\n const bucketAuto: Record<string, unknown> = {\n groupBy: lowerAggExpr(stage.groupBy),\n buckets: stage.buckets,\n };\n if (stage.output) bucketAuto['output'] = lowerExprRecord(stage.output);\n if (stage.granularity !== undefined) bucketAuto['granularity'] = stage.granularity;\n return { $bucketAuto: bucketAuto };\n }\n case 'geoNear': {\n const geoNear: Record<string, unknown> = {\n near: stage.near,\n distanceField: stage.distanceField,\n };\n if (stage.spherical !== undefined) geoNear['spherical'] = stage.spherical;\n if (stage.maxDistance !== undefined) geoNear['maxDistance'] = stage.maxDistance;\n if (stage.minDistance !== undefined) geoNear['minDistance'] = stage.minDistance;\n if (stage.query) geoNear['query'] = await lowerFilter(stage.query, codecs);\n if (stage.key !== undefined) geoNear['key'] = stage.key;\n if (stage.distanceMultiplier !== undefined)\n geoNear['distanceMultiplier'] = stage.distanceMultiplier;\n if (stage.includeLocs !== undefined) geoNear['includeLocs'] = stage.includeLocs;\n return { $geoNear: geoNear };\n }\n case 'facet': {\n const facetEntries = Object.entries(stage.facets);\n const facetPipelines = await Promise.all(\n facetEntries.map(([, pipeline]) => Promise.all(pipeline.map((s) => lowerStage(s, codecs)))),\n );\n const facet: Record<string, unknown> = {};\n for (let i = 0; i < facetEntries.length; i++) {\n const entry = facetEntries[i];\n if (entry) {\n facet[entry[0]] = facetPipelines[i];\n }\n }\n return { $facet: facet };\n }\n case 'graphLookup': {\n const graphLookup: Record<string, unknown> = {\n from: stage.from,\n startWith: lowerAggExpr(stage.startWith),\n connectFromField: stage.connectFromField,\n connectToField: stage.connectToField,\n as: stage.as,\n };\n if (stage.maxDepth !== undefined) graphLookup['maxDepth'] = stage.maxDepth;\n if (stage.depthField !== undefined) graphLookup['depthField'] = stage.depthField;\n if (stage.restrictSearchWithMatch)\n graphLookup['restrictSearchWithMatch'] = await lowerFilter(\n stage.restrictSearchWithMatch,\n codecs,\n );\n return { $graphLookup: graphLookup };\n }\n case 'merge': {\n const merge: Record<string, unknown> = { into: stage.into };\n if (stage.on !== undefined) merge['on'] = stage.on;\n if (stage.whenMatched !== undefined) {\n merge['whenMatched'] = Array.isArray(stage.whenMatched)\n ? await Promise.all(stage.whenMatched.map((s) => lowerStage(s, codecs)))\n : stage.whenMatched;\n }\n if (stage.whenNotMatched !== undefined) merge['whenNotMatched'] = stage.whenNotMatched;\n return { $merge: merge };\n }\n case 'setWindowFields': {\n const swf: Record<string, unknown> = {};\n if (stage.partitionBy) swf['partitionBy'] = lowerAggExpr(stage.partitionBy);\n if (stage.sortBy) swf['sortBy'] = { ...stage.sortBy };\n const output: Record<string, unknown> = {};\n for (const [key, wf] of Object.entries(stage.output)) {\n output[key] = lowerWindowField(wf);\n }\n swf['output'] = output;\n return { $setWindowFields: swf };\n }\n case 'densify': {\n const densify: Record<string, unknown> = {\n field: stage.field,\n range: { ...stage.range },\n };\n if (stage.partitionByFields) densify['partitionByFields'] = [...stage.partitionByFields];\n return { $densify: densify };\n }\n case 'fill': {\n const fill: Record<string, unknown> = {};\n if (stage.partitionBy) fill['partitionBy'] = lowerAggExpr(stage.partitionBy);\n if (stage.partitionByFields) fill['partitionByFields'] = [...stage.partitionByFields];\n if (stage.sortBy) fill['sortBy'] = { ...stage.sortBy };\n const output: Record<string, unknown> = {};\n for (const [key, fo] of Object.entries(stage.output)) {\n const entry: Record<string, unknown> = {};\n if (fo.method !== undefined) entry['method'] = fo.method;\n if (fo.value !== undefined) entry['value'] = lowerAggExpr(fo.value);\n output[key] = entry;\n }\n fill['output'] = output;\n return { $fill: fill };\n }\n case 'search': {\n const search: Record<string, unknown> = { ...stage.config };\n if (stage.index !== undefined) search['index'] = stage.index;\n return { $search: search };\n }\n case 'searchMeta': {\n const searchMeta: Record<string, unknown> = { ...stage.config };\n if (stage.index !== undefined) searchMeta['index'] = stage.index;\n return { $searchMeta: searchMeta };\n }\n case 'vectorSearch': {\n const vs: Record<string, unknown> = {\n index: stage.index,\n path: stage.path,\n queryVector: [...stage.queryVector],\n numCandidates: stage.numCandidates,\n limit: stage.limit,\n };\n if (stage.filter) vs['filter'] = { ...stage.filter };\n return { $vectorSearch: vs };\n }\n default: {\n const _exhaustive: never = stage;\n throw new Error(`Unhandled stage kind: ${(_exhaustive as MongoPipelineStage).kind}`);\n }\n }\n}\n\nexport async function lowerPipeline(\n stages: ReadonlyArray<MongoPipelineStage>,\n codecs?: MongoCodecRegistry,\n): Promise<Array<Record<string, unknown>>> {\n return Promise.all(stages.map((s) => lowerStage(s, codecs)));\n}\n","import { mongoCodec } from '@prisma-next/mongo-codec';\nimport { ObjectId } from 'mongodb';\nimport {\n MONGO_BOOLEAN_CODEC_ID,\n MONGO_DATE_CODEC_ID,\n MONGO_DOUBLE_CODEC_ID,\n MONGO_INT32_CODEC_ID,\n MONGO_OBJECTID_CODEC_ID,\n MONGO_STRING_CODEC_ID,\n MONGO_VECTOR_CODEC_ID,\n} from './codec-ids';\n\nexport const mongoObjectIdCodec = mongoCodec({\n typeId: MONGO_OBJECTID_CODEC_ID,\n targetTypes: ['objectId'],\n traits: ['equality'],\n decode: (wire: ObjectId) => wire.toHexString(),\n encode: (value: string) => new ObjectId(value),\n});\n\nexport const mongoStringCodec = mongoCodec({\n typeId: MONGO_STRING_CODEC_ID,\n targetTypes: ['string'],\n traits: ['equality', 'order', 'textual'],\n decode: (wire: string) => wire,\n encode: (value: string) => value,\n});\n\nexport const mongoDoubleCodec = mongoCodec({\n typeId: MONGO_DOUBLE_CODEC_ID,\n targetTypes: ['double'],\n traits: ['equality', 'order', 'numeric'],\n decode: (wire: number) => wire,\n encode: (value: number) => value,\n});\n\nexport const mongoInt32Codec = mongoCodec({\n typeId: MONGO_INT32_CODEC_ID,\n targetTypes: ['int'],\n traits: ['equality', 'order', 'numeric'],\n decode: (wire: number) => wire,\n encode: (value: number) => value,\n});\n\nexport const mongoBooleanCodec = mongoCodec({\n typeId: MONGO_BOOLEAN_CODEC_ID,\n targetTypes: ['bool'],\n traits: ['equality', 'boolean'],\n decode: (wire: boolean) => wire,\n encode: (value: boolean) => value,\n});\n\nexport const mongoDateCodec = mongoCodec({\n typeId: MONGO_DATE_CODEC_ID,\n targetTypes: ['date'],\n traits: ['equality', 'order'],\n decode: (wire: Date) => wire,\n encode: (value: Date) => value,\n encodeJson: (value: Date) => value.toISOString(),\n decodeJson: (json) => {\n if (typeof json !== 'string') throw new Error('expected ISO date string');\n return new Date(json);\n },\n});\n\nexport const mongoVectorCodec = mongoCodec({\n typeId: MONGO_VECTOR_CODEC_ID,\n targetTypes: ['vector'],\n traits: ['equality'],\n decode: (wire: readonly number[]) => wire,\n encode: (value: readonly number[]) => value,\n renderOutputType: (typeParams) => {\n const length = typeParams['length'];\n if (length === undefined) return undefined;\n if (typeof length !== 'number' || !Number.isFinite(length) || !Number.isInteger(length)) {\n throw new Error('renderOutputType: expected positive integer \"length\" for Vector');\n }\n return `Vector<${length}>`;\n },\n});\n","import { createMongoCodecRegistry, type MongoCodecRegistry } from '@prisma-next/mongo-codec';\nimport type { MongoAdapter } from '@prisma-next/mongo-lowering';\nimport type {\n MongoQueryPlan,\n MongoUpdatePipelineStage,\n MongoUpdateSpec,\n} from '@prisma-next/mongo-query-ast/execution';\nimport type { Document, MongoExpr } from '@prisma-next/mongo-value';\nimport type { AnyMongoWireCommand } from '@prisma-next/mongo-wire';\nimport {\n AggregateWireCommand,\n DeleteManyWireCommand,\n DeleteOneWireCommand,\n FindOneAndDeleteWireCommand,\n FindOneAndUpdateWireCommand,\n InsertManyWireCommand,\n InsertOneWireCommand,\n UpdateManyWireCommand,\n UpdateOneWireCommand,\n} from '@prisma-next/mongo-wire';\nimport { lowerFilter, lowerPipeline, lowerStage } from './lowering';\nimport { resolveValue } from './resolve-value';\n\nfunction isUpdatePipeline(\n update: MongoUpdateSpec,\n): update is ReadonlyArray<MongoUpdatePipelineStage> {\n return Array.isArray(update);\n}\n\nclass MongoAdapterImpl implements MongoAdapter {\n readonly #codecs: MongoCodecRegistry | undefined;\n\n constructor(codecs?: MongoCodecRegistry) {\n this.#codecs = codecs;\n }\n\n async #resolveDocument(expr: MongoExpr): Promise<Document> {\n const entries = Object.entries(expr);\n const resolved = await Promise.all(entries.map(([, val]) => resolveValue(val, this.#codecs)));\n const result: Record<string, unknown> = {};\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (entry) {\n result[entry[0]] = resolved[i];\n }\n }\n return result;\n }\n\n async #lowerUpdate(update: MongoUpdateSpec): Promise<Document | ReadonlyArray<Document>> {\n if (isUpdatePipeline(update)) {\n return Promise.all(update.map((stage) => lowerStage(stage, this.#codecs)));\n }\n return this.#resolveDocument(update);\n }\n\n async lower(plan: MongoQueryPlan): Promise<AnyMongoWireCommand> {\n const { command } = plan;\n switch (command.kind) {\n case 'insertOne':\n return new InsertOneWireCommand(\n command.collection,\n await this.#resolveDocument(command.document),\n );\n case 'updateOne': {\n const [filter, update] = await Promise.all([\n lowerFilter(command.filter, this.#codecs),\n this.#lowerUpdate(command.update),\n ]);\n return new UpdateOneWireCommand(command.collection, filter, update, command.upsert);\n }\n case 'insertMany':\n return new InsertManyWireCommand(\n command.collection,\n await Promise.all(command.documents.map((doc) => this.#resolveDocument(doc))),\n );\n case 'updateMany': {\n const [filter, update] = await Promise.all([\n lowerFilter(command.filter, this.#codecs),\n this.#lowerUpdate(command.update),\n ]);\n return new UpdateManyWireCommand(command.collection, filter, update, command.upsert);\n }\n case 'deleteOne':\n return new DeleteOneWireCommand(\n command.collection,\n await lowerFilter(command.filter, this.#codecs),\n );\n case 'deleteMany':\n return new DeleteManyWireCommand(\n command.collection,\n await lowerFilter(command.filter, this.#codecs),\n );\n case 'findOneAndUpdate': {\n const [filter, update] = await Promise.all([\n lowerFilter(command.filter, this.#codecs),\n this.#lowerUpdate(command.update),\n ]);\n return new FindOneAndUpdateWireCommand(\n command.collection,\n filter,\n update,\n command.upsert,\n command.sort,\n command.returnDocument,\n );\n }\n case 'findOneAndDelete':\n return new FindOneAndDeleteWireCommand(\n command.collection,\n await lowerFilter(command.filter, this.#codecs),\n command.sort,\n );\n case 'aggregate':\n return new AggregateWireCommand(\n command.collection,\n await lowerPipeline(command.pipeline, this.#codecs),\n );\n case 'rawAggregate':\n return new AggregateWireCommand(command.collection, command.pipeline);\n case 'rawInsertOne':\n return new InsertOneWireCommand(command.collection, command.document);\n case 'rawInsertMany':\n return new InsertManyWireCommand(command.collection, command.documents);\n case 'rawUpdateOne':\n return new UpdateOneWireCommand(command.collection, command.filter, command.update);\n case 'rawUpdateMany':\n return new UpdateManyWireCommand(command.collection, command.filter, command.update);\n case 'rawDeleteOne':\n return new DeleteOneWireCommand(command.collection, command.filter);\n case 'rawDeleteMany':\n return new DeleteManyWireCommand(command.collection, command.filter);\n case 'rawFindOneAndUpdate':\n return new FindOneAndUpdateWireCommand(\n command.collection,\n command.filter,\n command.update,\n command.upsert,\n command.sort,\n command.returnDocument,\n );\n case 'rawFindOneAndDelete':\n return new FindOneAndDeleteWireCommand(command.collection, command.filter, command.sort);\n // v8 ignore next 4\n default: {\n const _exhaustive: never = command;\n throw new Error(`Unknown command kind: ${(_exhaustive as { kind: string }).kind}`);\n }\n }\n }\n}\n\nimport {\n mongoBooleanCodec,\n mongoDateCodec,\n mongoDoubleCodec,\n mongoInt32Codec,\n mongoObjectIdCodec,\n mongoStringCodec,\n mongoVectorCodec,\n} from './core/codecs';\n\nfunction defaultCodecRegistry(): MongoCodecRegistry {\n const registry = createMongoCodecRegistry();\n for (const codec of [\n mongoObjectIdCodec,\n mongoStringCodec,\n mongoDoubleCodec,\n mongoInt32Codec,\n mongoBooleanCodec,\n mongoDateCodec,\n mongoVectorCodec,\n ]) {\n registry.register(codec);\n }\n return registry;\n}\n\nexport function createMongoAdapter(codecs?: MongoCodecRegistry): MongoAdapter {\n return new MongoAdapterImpl(codecs ?? defaultCodecRegistry());\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,34 +1,34 @@
1
1
  {
2
2
  "name": "@prisma-next/adapter-mongo",
3
- "version": "0.5.0-dev.7",
3
+ "version": "0.5.0-dev.8",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "MongoDB adapter for Prisma Next (lowers commands to wire format)",
7
7
  "dependencies": {
8
8
  "arktype": "^2.1.29",
9
9
  "mongodb": "^6.16.0",
10
- "@prisma-next/config": "0.5.0-dev.7",
11
- "@prisma-next/target-mongo": "0.5.0-dev.7",
12
- "@prisma-next/contract": "0.5.0-dev.7",
13
- "@prisma-next/mongo-codec": "0.5.0-dev.7",
14
- "@prisma-next/framework-components": "0.5.0-dev.7",
15
- "@prisma-next/mongo-contract": "0.5.0-dev.7",
16
- "@prisma-next/mongo-lowering": "0.5.0-dev.7",
17
- "@prisma-next/mongo-query-ast": "0.5.0-dev.7",
18
- "@prisma-next/mongo-value": "0.5.0-dev.7",
19
- "@prisma-next/mongo-schema-ir": "0.5.0-dev.7",
20
- "@prisma-next/operations": "0.5.0-dev.7",
21
- "@prisma-next/mongo-wire": "0.5.0-dev.7",
22
- "@prisma-next/utils": "0.5.0-dev.7"
10
+ "@prisma-next/contract": "0.5.0-dev.8",
11
+ "@prisma-next/framework-components": "0.5.0-dev.8",
12
+ "@prisma-next/target-mongo": "0.5.0-dev.8",
13
+ "@prisma-next/config": "0.5.0-dev.8",
14
+ "@prisma-next/mongo-codec": "0.5.0-dev.8",
15
+ "@prisma-next/mongo-lowering": "0.5.0-dev.8",
16
+ "@prisma-next/mongo-schema-ir": "0.5.0-dev.8",
17
+ "@prisma-next/mongo-value": "0.5.0-dev.8",
18
+ "@prisma-next/mongo-wire": "0.5.0-dev.8",
19
+ "@prisma-next/mongo-contract": "0.5.0-dev.8",
20
+ "@prisma-next/mongo-query-ast": "0.5.0-dev.8",
21
+ "@prisma-next/operations": "0.5.0-dev.8",
22
+ "@prisma-next/utils": "0.5.0-dev.8"
23
23
  },
24
24
  "devDependencies": {
25
25
  "mongodb-memory-server": "10.4.3",
26
26
  "tsdown": "0.18.4",
27
27
  "typescript": "5.9.3",
28
28
  "vitest": "4.0.17",
29
- "@prisma-next/driver-mongo": "0.5.0-dev.7",
30
- "@prisma-next/test-utils": "0.0.1",
29
+ "@prisma-next/driver-mongo": "0.5.0-dev.8",
31
30
  "@prisma-next/tsconfig": "0.0.0",
31
+ "@prisma-next/test-utils": "0.0.1",
32
32
  "@prisma-next/tsdown": "0.0.0"
33
33
  },
34
34
  "files": [
@@ -56,6 +56,11 @@ export const mongoDateCodec = mongoCodec({
56
56
  traits: ['equality', 'order'],
57
57
  decode: (wire: Date) => wire,
58
58
  encode: (value: Date) => value,
59
+ encodeJson: (value: Date) => value.toISOString(),
60
+ decodeJson: (json) => {
61
+ if (typeof json !== 'string') throw new Error('expected ISO date string');
62
+ return new Date(json);
63
+ },
59
64
  });
60
65
 
61
66
  export const mongoVectorCodec = mongoCodec({
package/src/lowering.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { MongoCodecRegistry } from '@prisma-next/mongo-codec';
1
2
  import type {
2
3
  MongoAggExpr,
3
4
  MongoAggExprVisitor,
@@ -136,16 +137,19 @@ export function lowerAggExpr(expr: MongoAggExpr): unknown {
136
137
  return expr.accept(aggExprLoweringVisitor);
137
138
  }
138
139
 
139
- export function lowerFilter(filter: MongoFilterExpr): Document {
140
+ export async function lowerFilter(
141
+ filter: MongoFilterExpr,
142
+ codecs?: MongoCodecRegistry,
143
+ ): Promise<Document> {
140
144
  switch (filter.kind) {
141
145
  case 'field':
142
- return { [filter.field]: { [filter.op]: resolveValue(filter.value) } };
146
+ return { [filter.field]: { [filter.op]: await resolveValue(filter.value, codecs) } };
143
147
  case 'and':
144
- return { $and: filter.exprs.map((e) => lowerFilter(e)) };
148
+ return { $and: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs))) };
145
149
  case 'or':
146
- return { $or: filter.exprs.map((e) => lowerFilter(e)) };
150
+ return { $or: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs))) };
147
151
  case 'not':
148
- return { $nor: [lowerFilter(filter.expr)] };
152
+ return { $nor: [await lowerFilter(filter.expr, codecs)] };
149
153
  case 'exists':
150
154
  return { [filter.field]: { $exists: filter.exists } };
151
155
  case 'expr':
@@ -198,10 +202,13 @@ function lowerWindowField(wf: MongoWindowField): Record<string, unknown> {
198
202
  return result;
199
203
  }
200
204
 
201
- export function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {
205
+ export async function lowerStage(
206
+ stage: MongoPipelineStage,
207
+ codecs?: MongoCodecRegistry,
208
+ ): Promise<Record<string, unknown>> {
202
209
  switch (stage.kind) {
203
210
  case 'match':
204
- return { $match: lowerFilter(stage.filter) };
211
+ return { $match: await lowerFilter(stage.filter, codecs) };
205
212
  case 'project': {
206
213
  const projection: Record<string, unknown> = {};
207
214
  for (const [key, val] of Object.entries(stage.projection)) {
@@ -223,7 +230,7 @@ export function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {
223
230
  if (stage.localField !== undefined) lookup['localField'] = stage.localField;
224
231
  if (stage.foreignField !== undefined) lookup['foreignField'] = stage.foreignField;
225
232
  if (stage.pipeline) {
226
- lookup['pipeline'] = stage.pipeline.map((s) => lowerStage(s));
233
+ lookup['pipeline'] = await Promise.all(stage.pipeline.map((s) => lowerStage(s, codecs)));
227
234
  }
228
235
  if (stage.let_) {
229
236
  lookup['let'] = lowerExprRecord(stage.let_);
@@ -264,7 +271,7 @@ export function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {
264
271
  case 'unionWith': {
265
272
  const unionWith: Record<string, unknown> = { coll: stage.collection };
266
273
  if (stage.pipeline) {
267
- unionWith['pipeline'] = stage.pipeline.map((s) => lowerStage(s));
274
+ unionWith['pipeline'] = await Promise.all(stage.pipeline.map((s) => lowerStage(s, codecs)));
268
275
  }
269
276
  return { $unionWith: unionWith };
270
277
  }
@@ -294,7 +301,7 @@ export function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {
294
301
  if (stage.spherical !== undefined) geoNear['spherical'] = stage.spherical;
295
302
  if (stage.maxDistance !== undefined) geoNear['maxDistance'] = stage.maxDistance;
296
303
  if (stage.minDistance !== undefined) geoNear['minDistance'] = stage.minDistance;
297
- if (stage.query) geoNear['query'] = lowerFilter(stage.query);
304
+ if (stage.query) geoNear['query'] = await lowerFilter(stage.query, codecs);
298
305
  if (stage.key !== undefined) geoNear['key'] = stage.key;
299
306
  if (stage.distanceMultiplier !== undefined)
300
307
  geoNear['distanceMultiplier'] = stage.distanceMultiplier;
@@ -302,9 +309,16 @@ export function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {
302
309
  return { $geoNear: geoNear };
303
310
  }
304
311
  case 'facet': {
312
+ const facetEntries = Object.entries(stage.facets);
313
+ const facetPipelines = await Promise.all(
314
+ facetEntries.map(([, pipeline]) => Promise.all(pipeline.map((s) => lowerStage(s, codecs)))),
315
+ );
305
316
  const facet: Record<string, unknown> = {};
306
- for (const [key, pipeline] of Object.entries(stage.facets)) {
307
- facet[key] = pipeline.map((s) => lowerStage(s));
317
+ for (let i = 0; i < facetEntries.length; i++) {
318
+ const entry = facetEntries[i];
319
+ if (entry) {
320
+ facet[entry[0]] = facetPipelines[i];
321
+ }
308
322
  }
309
323
  return { $facet: facet };
310
324
  }
@@ -319,7 +333,10 @@ export function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {
319
333
  if (stage.maxDepth !== undefined) graphLookup['maxDepth'] = stage.maxDepth;
320
334
  if (stage.depthField !== undefined) graphLookup['depthField'] = stage.depthField;
321
335
  if (stage.restrictSearchWithMatch)
322
- graphLookup['restrictSearchWithMatch'] = lowerFilter(stage.restrictSearchWithMatch);
336
+ graphLookup['restrictSearchWithMatch'] = await lowerFilter(
337
+ stage.restrictSearchWithMatch,
338
+ codecs,
339
+ );
323
340
  return { $graphLookup: graphLookup };
324
341
  }
325
342
  case 'merge': {
@@ -327,7 +344,7 @@ export function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {
327
344
  if (stage.on !== undefined) merge['on'] = stage.on;
328
345
  if (stage.whenMatched !== undefined) {
329
346
  merge['whenMatched'] = Array.isArray(stage.whenMatched)
330
- ? stage.whenMatched.map((s) => lowerStage(s))
347
+ ? await Promise.all(stage.whenMatched.map((s) => lowerStage(s, codecs)))
331
348
  : stage.whenMatched;
332
349
  }
333
350
  if (stage.whenNotMatched !== undefined) merge['whenNotMatched'] = stage.whenNotMatched;
@@ -395,8 +412,9 @@ export function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {
395
412
  }
396
413
  }
397
414
 
398
- export function lowerPipeline(
415
+ export async function lowerPipeline(
399
416
  stages: ReadonlyArray<MongoPipelineStage>,
400
- ): Array<Record<string, unknown>> {
401
- return stages.map(lowerStage);
417
+ codecs?: MongoCodecRegistry,
418
+ ): Promise<Array<Record<string, unknown>>> {
419
+ return Promise.all(stages.map((s) => lowerStage(s, codecs)));
402
420
  }
@@ -34,69 +34,88 @@ class MongoAdapterImpl implements MongoAdapter {
34
34
  this.#codecs = codecs;
35
35
  }
36
36
 
37
- #resolveDocument(expr: MongoExpr): Document {
37
+ async #resolveDocument(expr: MongoExpr): Promise<Document> {
38
+ const entries = Object.entries(expr);
39
+ const resolved = await Promise.all(entries.map(([, val]) => resolveValue(val, this.#codecs)));
38
40
  const result: Record<string, unknown> = {};
39
- for (const [key, val] of Object.entries(expr)) {
40
- result[key] = resolveValue(val, this.#codecs);
41
+ for (let i = 0; i < entries.length; i++) {
42
+ const entry = entries[i];
43
+ if (entry) {
44
+ result[entry[0]] = resolved[i];
45
+ }
41
46
  }
42
47
  return result;
43
48
  }
44
49
 
45
- #lowerUpdate(update: MongoUpdateSpec): Document | ReadonlyArray<Document> {
50
+ async #lowerUpdate(update: MongoUpdateSpec): Promise<Document | ReadonlyArray<Document>> {
46
51
  if (isUpdatePipeline(update)) {
47
- return update.map((stage) => lowerStage(stage));
52
+ return Promise.all(update.map((stage) => lowerStage(stage, this.#codecs)));
48
53
  }
49
54
  return this.#resolveDocument(update);
50
55
  }
51
56
 
52
- lower(plan: MongoQueryPlan): AnyMongoWireCommand {
57
+ async lower(plan: MongoQueryPlan): Promise<AnyMongoWireCommand> {
53
58
  const { command } = plan;
54
59
  switch (command.kind) {
55
60
  case 'insertOne':
56
61
  return new InsertOneWireCommand(
57
62
  command.collection,
58
- this.#resolveDocument(command.document),
63
+ await this.#resolveDocument(command.document),
59
64
  );
60
- case 'updateOne':
61
- return new UpdateOneWireCommand(
62
- command.collection,
63
- lowerFilter(command.filter),
65
+ case 'updateOne': {
66
+ const [filter, update] = await Promise.all([
67
+ lowerFilter(command.filter, this.#codecs),
64
68
  this.#lowerUpdate(command.update),
65
- command.upsert,
66
- );
69
+ ]);
70
+ return new UpdateOneWireCommand(command.collection, filter, update, command.upsert);
71
+ }
67
72
  case 'insertMany':
68
73
  return new InsertManyWireCommand(
69
74
  command.collection,
70
- command.documents.map((doc) => this.#resolveDocument(doc)),
75
+ await Promise.all(command.documents.map((doc) => this.#resolveDocument(doc))),
71
76
  );
72
- case 'updateMany':
73
- return new UpdateManyWireCommand(
74
- command.collection,
75
- lowerFilter(command.filter),
77
+ case 'updateMany': {
78
+ const [filter, update] = await Promise.all([
79
+ lowerFilter(command.filter, this.#codecs),
76
80
  this.#lowerUpdate(command.update),
77
- command.upsert,
78
- );
81
+ ]);
82
+ return new UpdateManyWireCommand(command.collection, filter, update, command.upsert);
83
+ }
79
84
  case 'deleteOne':
80
- return new DeleteOneWireCommand(command.collection, lowerFilter(command.filter));
85
+ return new DeleteOneWireCommand(
86
+ command.collection,
87
+ await lowerFilter(command.filter, this.#codecs),
88
+ );
81
89
  case 'deleteMany':
82
- return new DeleteManyWireCommand(command.collection, lowerFilter(command.filter));
83
- case 'findOneAndUpdate':
84
- return new FindOneAndUpdateWireCommand(
90
+ return new DeleteManyWireCommand(
85
91
  command.collection,
86
- lowerFilter(command.filter),
92
+ await lowerFilter(command.filter, this.#codecs),
93
+ );
94
+ case 'findOneAndUpdate': {
95
+ const [filter, update] = await Promise.all([
96
+ lowerFilter(command.filter, this.#codecs),
87
97
  this.#lowerUpdate(command.update),
98
+ ]);
99
+ return new FindOneAndUpdateWireCommand(
100
+ command.collection,
101
+ filter,
102
+ update,
88
103
  command.upsert,
89
104
  command.sort,
90
105
  command.returnDocument,
91
106
  );
107
+ }
92
108
  case 'findOneAndDelete':
93
109
  return new FindOneAndDeleteWireCommand(
94
110
  command.collection,
95
- lowerFilter(command.filter),
111
+ await lowerFilter(command.filter, this.#codecs),
96
112
  command.sort,
97
113
  );
98
114
  case 'aggregate':
99
- return new AggregateWireCommand(command.collection, lowerPipeline(command.pipeline));
115
+ return new AggregateWireCommand(
116
+ command.collection,
117
+ await lowerPipeline(command.pipeline, this.#codecs),
118
+ );
100
119
  case 'rawAggregate':
101
120
  return new AggregateWireCommand(command.collection, command.pipeline);
102
121
  case 'rawInsertOne':
@@ -1,12 +1,36 @@
1
+ import { runtimeError } from '@prisma-next/framework-components/runtime';
1
2
  import type { MongoCodecRegistry } from '@prisma-next/mongo-codec';
2
3
  import type { MongoValue } from '@prisma-next/mongo-value';
3
4
  import { MongoParamRef } from '@prisma-next/mongo-value';
4
5
 
5
- export function resolveValue(value: MongoValue, codecs?: MongoCodecRegistry): unknown {
6
+ /**
7
+ * Resolves a `MongoValue` (which may contain `MongoParamRef` leaves) into the
8
+ * driver-ready wire shape. When a leaf has a `codecId` and the registry has a
9
+ * codec for it, the codec's async `encode` is awaited so codecs may perform
10
+ * asynchronous work (e.g. lookups, key derivations).
11
+ *
12
+ * Object/array nodes dispatch their child resolutions concurrently via
13
+ * `Promise.all` so independent leaves encode in parallel.
14
+ *
15
+ * Codec encode failures are wrapped in a `RUNTIME.ENCODE_FAILED` envelope
16
+ * (mirroring SQL's `wrapEncodeFailure` shape) with `{ label, codec }` details
17
+ * and the original error attached on `cause`. An already-wrapped envelope is
18
+ * re-thrown verbatim so nested resolvers don't double-wrap.
19
+ */
20
+ export async function resolveValue(
21
+ value: MongoValue,
22
+ codecs?: MongoCodecRegistry,
23
+ ): Promise<unknown> {
6
24
  if (value instanceof MongoParamRef) {
7
25
  if (value.codecId && codecs) {
8
26
  const codec = codecs.get(value.codecId);
9
- if (codec?.encode) return codec.encode(value.value);
27
+ if (codec?.encode) {
28
+ try {
29
+ return await codec.encode(value.value);
30
+ } catch (error) {
31
+ wrapEncodeFailure(error, value, codec.id);
32
+ }
33
+ }
10
34
  }
11
35
  return value.value;
12
36
  }
@@ -17,11 +41,43 @@ export function resolveValue(value: MongoValue, codecs?: MongoCodecRegistry): un
17
41
  return value;
18
42
  }
19
43
  if (Array.isArray(value)) {
20
- return value.map((v) => resolveValue(v, codecs));
44
+ return Promise.all(value.map((v) => resolveValue(v, codecs)));
21
45
  }
46
+ const entries = Object.entries(value);
47
+ const resolved = await Promise.all(entries.map(([, val]) => resolveValue(val, codecs)));
22
48
  const result: Record<string, unknown> = {};
23
- for (const [key, val] of Object.entries(value)) {
24
- result[key] = resolveValue(val, codecs);
49
+ for (let i = 0; i < entries.length; i++) {
50
+ const entry = entries[i];
51
+ if (entry) {
52
+ result[entry[0]] = resolved[i];
53
+ }
25
54
  }
26
55
  return result;
27
56
  }
57
+
58
+ function paramRefLabel(ref: MongoParamRef, codecId: string): string {
59
+ return ref.name ?? codecId;
60
+ }
61
+
62
+ function isAlreadyEncodeFailure(error: unknown): boolean {
63
+ return (
64
+ error instanceof Error &&
65
+ 'code' in error &&
66
+ (error as Error & { code?: unknown }).code === 'RUNTIME.ENCODE_FAILED'
67
+ );
68
+ }
69
+
70
+ function wrapEncodeFailure(error: unknown, ref: MongoParamRef, codecId: string): never {
71
+ if (isAlreadyEncodeFailure(error)) {
72
+ throw error;
73
+ }
74
+ const label = paramRefLabel(ref, codecId);
75
+ const message = error instanceof Error ? error.message : String(error);
76
+ const wrapped = runtimeError(
77
+ 'RUNTIME.ENCODE_FAILED',
78
+ `Failed to encode parameter ${label} with codec '${codecId}': ${message}`,
79
+ { label, codec: codecId },
80
+ );
81
+ wrapped.cause = error;
82
+ throw wrapped;
83
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"mongo-adapter-aVo8aZrf.mjs","names":["result: Record<string, unknown>","entries: Array<[string, unknown]>","aggExprLoweringVisitor: MongoAggExprVisitor<unknown>","loweredArgs: unknown","vars: Record<string, unknown>","_exhaustive: never","result: Record<string, unknown>","projection: Record<string, unknown>","lookup: Record<string, unknown>","unwind: Record<string, unknown>","group: Record<string, unknown>","unionWith: Record<string, unknown>","bucket: Record<string, unknown>","bucketAuto: Record<string, unknown>","geoNear: Record<string, unknown>","facet: Record<string, unknown>","graphLookup: Record<string, unknown>","merge: Record<string, unknown>","swf: Record<string, unknown>","output: Record<string, unknown>","densify: Record<string, unknown>","fill: Record<string, unknown>","entry: Record<string, unknown>","search: Record<string, unknown>","searchMeta: Record<string, unknown>","vs: Record<string, unknown>","#codecs","result: Record<string, unknown>","#resolveDocument","#lowerUpdate","_exhaustive: never"],"sources":["../src/core/codec-ids.ts","../src/resolve-value.ts","../src/lowering.ts","../src/core/codecs.ts","../src/mongo-adapter.ts"],"sourcesContent":["export const MONGO_OBJECTID_CODEC_ID = 'mongo/objectId@1' as const;\nexport const MONGO_STRING_CODEC_ID = 'mongo/string@1' as const;\nexport const MONGO_DOUBLE_CODEC_ID = 'mongo/double@1' as const;\nexport const MONGO_INT32_CODEC_ID = 'mongo/int32@1' as const;\nexport const MONGO_BOOLEAN_CODEC_ID = 'mongo/bool@1' as const;\nexport const MONGO_DATE_CODEC_ID = 'mongo/date@1' as const;\nexport const MONGO_VECTOR_CODEC_ID = 'mongo/vector@1' as const;\n","import type { MongoCodecRegistry } from '@prisma-next/mongo-codec';\nimport type { MongoValue } from '@prisma-next/mongo-value';\nimport { MongoParamRef } from '@prisma-next/mongo-value';\n\nexport function resolveValue(value: MongoValue, codecs?: MongoCodecRegistry): unknown {\n if (value instanceof MongoParamRef) {\n if (value.codecId && codecs) {\n const codec = codecs.get(value.codecId);\n if (codec?.encode) return codec.encode(value.value);\n }\n return value.value;\n }\n if (value === null || typeof value !== 'object') {\n return value;\n }\n if (value instanceof Date) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v) => resolveValue(v, codecs));\n }\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = resolveValue(val, codecs);\n }\n return result;\n}\n","import type {\n MongoAggExpr,\n MongoAggExprVisitor,\n MongoFilterExpr,\n MongoGroupId,\n MongoPipelineStage,\n MongoProjectionValue,\n MongoWindowField,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { isExprArray, isRecordArgs } from '@prisma-next/mongo-query-ast/execution';\nimport type { Document } from '@prisma-next/mongo-value';\nimport { resolveValue } from './resolve-value';\n\n// Biome flags `{ then: ... }` as a thenable object (noThenProperty). Build via Object.fromEntries to avoid.\nconst THEN_KEY = 'then';\n\nfunction condBranch(\n caseOrIf: MongoAggExpr,\n thenExpr: MongoAggExpr,\n elseExpr?: MongoAggExpr,\n): Record<string, unknown> {\n const entries: Array<[string, unknown]> = [\n [elseExpr ? 'if' : 'case', lowerAggExpr(caseOrIf)],\n [THEN_KEY, lowerAggExpr(thenExpr)],\n ];\n if (elseExpr) {\n entries.push(['else', lowerAggExpr(elseExpr)]);\n }\n return Object.fromEntries(entries);\n}\n\nconst aggExprLoweringVisitor: MongoAggExprVisitor<unknown> = {\n fieldRef(expr) {\n return `$${expr.path}`;\n },\n\n literal(expr) {\n return needsLiteralWrap(expr.value) ? { $literal: expr.value } : expr.value;\n },\n\n operator(expr) {\n const { args } = expr;\n let loweredArgs: unknown;\n if (isExprArray(args)) {\n loweredArgs = args.map((a) => lowerAggExpr(a));\n } else if (isRecordArgs(args)) {\n loweredArgs = lowerExprRecord(args);\n } else {\n loweredArgs = lowerAggExpr(args);\n }\n return { [expr.op]: loweredArgs };\n },\n\n accumulator(expr) {\n if (expr.arg === null) {\n return { [expr.op]: {} };\n }\n if (isRecordArgs(expr.arg)) {\n return { [expr.op]: lowerExprRecord(expr.arg) };\n }\n return { [expr.op]: lowerAggExpr(expr.arg) };\n },\n\n cond(expr) {\n return { $cond: condBranch(expr.condition, expr.then_, expr.else_) };\n },\n\n switch_(expr) {\n return {\n $switch: {\n branches: expr.branches.map((b) => condBranch(b.case_, b.then_)),\n default: lowerAggExpr(expr.default_),\n },\n };\n },\n\n filter(expr) {\n return {\n $filter: {\n input: lowerAggExpr(expr.input),\n cond: lowerAggExpr(expr.cond),\n as: expr.as,\n },\n };\n },\n\n map(expr) {\n return {\n $map: {\n input: lowerAggExpr(expr.input),\n in: lowerAggExpr(expr.in_),\n as: expr.as,\n },\n };\n },\n\n reduce(expr) {\n return {\n $reduce: {\n input: lowerAggExpr(expr.input),\n initialValue: lowerAggExpr(expr.initialValue),\n in: lowerAggExpr(expr.in_),\n },\n };\n },\n\n let_(expr) {\n const vars: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(expr.vars)) {\n vars[key] = lowerAggExpr(val);\n }\n return { $let: { vars, in: lowerAggExpr(expr.in_) } };\n },\n\n mergeObjects(expr) {\n return { $mergeObjects: expr.exprs.map((e) => lowerAggExpr(e)) };\n },\n};\n\nfunction needsLiteralWrap(value: unknown): boolean {\n if (typeof value === 'string' && value.startsWith('$')) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.some((v) => needsLiteralWrap(v));\n }\n if (value !== null && typeof value === 'object') {\n return Object.entries(value as Record<string, unknown>).some(\n ([k, v]) => k.startsWith('$') || needsLiteralWrap(v),\n );\n }\n return false;\n}\n\nexport function lowerAggExpr(expr: MongoAggExpr): unknown {\n return expr.accept(aggExprLoweringVisitor);\n}\n\nexport function lowerFilter(filter: MongoFilterExpr): Document {\n switch (filter.kind) {\n case 'field':\n return { [filter.field]: { [filter.op]: resolveValue(filter.value) } };\n case 'and':\n return { $and: filter.exprs.map((e) => lowerFilter(e)) };\n case 'or':\n return { $or: filter.exprs.map((e) => lowerFilter(e)) };\n case 'not':\n return { $nor: [lowerFilter(filter.expr)] };\n case 'exists':\n return { [filter.field]: { $exists: filter.exists } };\n case 'expr':\n return { $expr: lowerAggExpr(filter.aggExpr) };\n default: {\n const _exhaustive: never = filter;\n throw new Error(`Unhandled filter kind: ${(_exhaustive as MongoFilterExpr).kind}`);\n }\n }\n}\n\nfunction isAggExprNode(value: object): value is MongoAggExpr {\n return 'accept' in value && typeof value.accept === 'function';\n}\n\nfunction lowerGroupId(groupId: MongoGroupId): unknown {\n if (groupId === null) return null;\n if (isAggExprNode(groupId)) return lowerAggExpr(groupId);\n return lowerExprRecord(groupId);\n}\n\nfunction lowerExprRecord(\n fields: Readonly<Record<string, MongoAggExpr | ReadonlyArray<MongoAggExpr>>>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(fields)) {\n if (Array.isArray(val)) {\n result[key] = val.map((v: MongoAggExpr) => lowerAggExpr(v));\n } else {\n result[key] = lowerAggExpr(val as MongoAggExpr);\n }\n }\n return result;\n}\n\nfunction lowerProjectionValue(value: MongoProjectionValue): unknown {\n if (typeof value === 'number') return value;\n return lowerAggExpr(value);\n}\n\nfunction lowerWindowField(wf: MongoWindowField): Record<string, unknown> {\n const lowered = lowerAggExpr(wf.operator);\n if (typeof lowered !== 'object' || lowered === null) {\n throw new Error('Window field operator must lower to an object');\n }\n const result: Record<string, unknown> = { ...lowered };\n if (wf.window) {\n result['window'] = { ...wf.window };\n }\n return result;\n}\n\nexport function lowerStage(stage: MongoPipelineStage): Record<string, unknown> {\n switch (stage.kind) {\n case 'match':\n return { $match: lowerFilter(stage.filter) };\n case 'project': {\n const projection: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(stage.projection)) {\n projection[key] = lowerProjectionValue(val);\n }\n return { $project: projection };\n }\n case 'sort':\n return { $sort: { ...stage.sort } };\n case 'limit':\n return { $limit: stage.limit };\n case 'skip':\n return { $skip: stage.skip };\n case 'lookup': {\n const lookup: Record<string, unknown> = {\n from: stage.from,\n as: stage.as,\n };\n if (stage.localField !== undefined) lookup['localField'] = stage.localField;\n if (stage.foreignField !== undefined) lookup['foreignField'] = stage.foreignField;\n if (stage.pipeline) {\n lookup['pipeline'] = stage.pipeline.map((s) => lowerStage(s));\n }\n if (stage.let_) {\n lookup['let'] = lowerExprRecord(stage.let_);\n }\n return { $lookup: lookup };\n }\n case 'unwind': {\n const unwind: Record<string, unknown> = {\n path: stage.path,\n preserveNullAndEmptyArrays: stage.preserveNullAndEmptyArrays,\n };\n if (stage.includeArrayIndex !== undefined) {\n unwind['includeArrayIndex'] = stage.includeArrayIndex;\n }\n return { $unwind: unwind };\n }\n case 'group': {\n const group: Record<string, unknown> = { _id: lowerGroupId(stage.groupId) };\n for (const [key, acc] of Object.entries(stage.accumulators)) {\n group[key] = lowerAggExpr(acc);\n }\n return { $group: group };\n }\n case 'addFields':\n return { $addFields: lowerExprRecord(stage.fields) };\n case 'replaceRoot':\n return { $replaceRoot: { newRoot: lowerAggExpr(stage.newRoot) } };\n case 'count':\n return { $count: stage.field };\n case 'sortByCount':\n return { $sortByCount: lowerAggExpr(stage.expr) };\n case 'sample':\n return { $sample: { size: stage.size } };\n case 'redact':\n return { $redact: lowerAggExpr(stage.expr) };\n case 'out':\n return { $out: stage.db ? { db: stage.db, coll: stage.collection } : stage.collection };\n case 'unionWith': {\n const unionWith: Record<string, unknown> = { coll: stage.collection };\n if (stage.pipeline) {\n unionWith['pipeline'] = stage.pipeline.map((s) => lowerStage(s));\n }\n return { $unionWith: unionWith };\n }\n case 'bucket': {\n const bucket: Record<string, unknown> = {\n groupBy: lowerAggExpr(stage.groupBy),\n boundaries: [...stage.boundaries],\n };\n if (stage.default_ !== undefined) bucket['default'] = stage.default_;\n if (stage.output) bucket['output'] = lowerExprRecord(stage.output);\n return { $bucket: bucket };\n }\n case 'bucketAuto': {\n const bucketAuto: Record<string, unknown> = {\n groupBy: lowerAggExpr(stage.groupBy),\n buckets: stage.buckets,\n };\n if (stage.output) bucketAuto['output'] = lowerExprRecord(stage.output);\n if (stage.granularity !== undefined) bucketAuto['granularity'] = stage.granularity;\n return { $bucketAuto: bucketAuto };\n }\n case 'geoNear': {\n const geoNear: Record<string, unknown> = {\n near: stage.near,\n distanceField: stage.distanceField,\n };\n if (stage.spherical !== undefined) geoNear['spherical'] = stage.spherical;\n if (stage.maxDistance !== undefined) geoNear['maxDistance'] = stage.maxDistance;\n if (stage.minDistance !== undefined) geoNear['minDistance'] = stage.minDistance;\n if (stage.query) geoNear['query'] = lowerFilter(stage.query);\n if (stage.key !== undefined) geoNear['key'] = stage.key;\n if (stage.distanceMultiplier !== undefined)\n geoNear['distanceMultiplier'] = stage.distanceMultiplier;\n if (stage.includeLocs !== undefined) geoNear['includeLocs'] = stage.includeLocs;\n return { $geoNear: geoNear };\n }\n case 'facet': {\n const facet: Record<string, unknown> = {};\n for (const [key, pipeline] of Object.entries(stage.facets)) {\n facet[key] = pipeline.map((s) => lowerStage(s));\n }\n return { $facet: facet };\n }\n case 'graphLookup': {\n const graphLookup: Record<string, unknown> = {\n from: stage.from,\n startWith: lowerAggExpr(stage.startWith),\n connectFromField: stage.connectFromField,\n connectToField: stage.connectToField,\n as: stage.as,\n };\n if (stage.maxDepth !== undefined) graphLookup['maxDepth'] = stage.maxDepth;\n if (stage.depthField !== undefined) graphLookup['depthField'] = stage.depthField;\n if (stage.restrictSearchWithMatch)\n graphLookup['restrictSearchWithMatch'] = lowerFilter(stage.restrictSearchWithMatch);\n return { $graphLookup: graphLookup };\n }\n case 'merge': {\n const merge: Record<string, unknown> = { into: stage.into };\n if (stage.on !== undefined) merge['on'] = stage.on;\n if (stage.whenMatched !== undefined) {\n merge['whenMatched'] = Array.isArray(stage.whenMatched)\n ? stage.whenMatched.map((s) => lowerStage(s))\n : stage.whenMatched;\n }\n if (stage.whenNotMatched !== undefined) merge['whenNotMatched'] = stage.whenNotMatched;\n return { $merge: merge };\n }\n case 'setWindowFields': {\n const swf: Record<string, unknown> = {};\n if (stage.partitionBy) swf['partitionBy'] = lowerAggExpr(stage.partitionBy);\n if (stage.sortBy) swf['sortBy'] = { ...stage.sortBy };\n const output: Record<string, unknown> = {};\n for (const [key, wf] of Object.entries(stage.output)) {\n output[key] = lowerWindowField(wf);\n }\n swf['output'] = output;\n return { $setWindowFields: swf };\n }\n case 'densify': {\n const densify: Record<string, unknown> = {\n field: stage.field,\n range: { ...stage.range },\n };\n if (stage.partitionByFields) densify['partitionByFields'] = [...stage.partitionByFields];\n return { $densify: densify };\n }\n case 'fill': {\n const fill: Record<string, unknown> = {};\n if (stage.partitionBy) fill['partitionBy'] = lowerAggExpr(stage.partitionBy);\n if (stage.partitionByFields) fill['partitionByFields'] = [...stage.partitionByFields];\n if (stage.sortBy) fill['sortBy'] = { ...stage.sortBy };\n const output: Record<string, unknown> = {};\n for (const [key, fo] of Object.entries(stage.output)) {\n const entry: Record<string, unknown> = {};\n if (fo.method !== undefined) entry['method'] = fo.method;\n if (fo.value !== undefined) entry['value'] = lowerAggExpr(fo.value);\n output[key] = entry;\n }\n fill['output'] = output;\n return { $fill: fill };\n }\n case 'search': {\n const search: Record<string, unknown> = { ...stage.config };\n if (stage.index !== undefined) search['index'] = stage.index;\n return { $search: search };\n }\n case 'searchMeta': {\n const searchMeta: Record<string, unknown> = { ...stage.config };\n if (stage.index !== undefined) searchMeta['index'] = stage.index;\n return { $searchMeta: searchMeta };\n }\n case 'vectorSearch': {\n const vs: Record<string, unknown> = {\n index: stage.index,\n path: stage.path,\n queryVector: [...stage.queryVector],\n numCandidates: stage.numCandidates,\n limit: stage.limit,\n };\n if (stage.filter) vs['filter'] = { ...stage.filter };\n return { $vectorSearch: vs };\n }\n default: {\n const _exhaustive: never = stage;\n throw new Error(`Unhandled stage kind: ${(_exhaustive as MongoPipelineStage).kind}`);\n }\n }\n}\n\nexport function lowerPipeline(\n stages: ReadonlyArray<MongoPipelineStage>,\n): Array<Record<string, unknown>> {\n return stages.map(lowerStage);\n}\n","import { mongoCodec } from '@prisma-next/mongo-codec';\nimport { ObjectId } from 'mongodb';\nimport {\n MONGO_BOOLEAN_CODEC_ID,\n MONGO_DATE_CODEC_ID,\n MONGO_DOUBLE_CODEC_ID,\n MONGO_INT32_CODEC_ID,\n MONGO_OBJECTID_CODEC_ID,\n MONGO_STRING_CODEC_ID,\n MONGO_VECTOR_CODEC_ID,\n} from './codec-ids';\n\nexport const mongoObjectIdCodec = mongoCodec({\n typeId: MONGO_OBJECTID_CODEC_ID,\n targetTypes: ['objectId'],\n traits: ['equality'],\n decode: (wire: ObjectId) => wire.toHexString(),\n encode: (value: string) => new ObjectId(value),\n});\n\nexport const mongoStringCodec = mongoCodec({\n typeId: MONGO_STRING_CODEC_ID,\n targetTypes: ['string'],\n traits: ['equality', 'order', 'textual'],\n decode: (wire: string) => wire,\n encode: (value: string) => value,\n});\n\nexport const mongoDoubleCodec = mongoCodec({\n typeId: MONGO_DOUBLE_CODEC_ID,\n targetTypes: ['double'],\n traits: ['equality', 'order', 'numeric'],\n decode: (wire: number) => wire,\n encode: (value: number) => value,\n});\n\nexport const mongoInt32Codec = mongoCodec({\n typeId: MONGO_INT32_CODEC_ID,\n targetTypes: ['int'],\n traits: ['equality', 'order', 'numeric'],\n decode: (wire: number) => wire,\n encode: (value: number) => value,\n});\n\nexport const mongoBooleanCodec = mongoCodec({\n typeId: MONGO_BOOLEAN_CODEC_ID,\n targetTypes: ['bool'],\n traits: ['equality', 'boolean'],\n decode: (wire: boolean) => wire,\n encode: (value: boolean) => value,\n});\n\nexport const mongoDateCodec = mongoCodec({\n typeId: MONGO_DATE_CODEC_ID,\n targetTypes: ['date'],\n traits: ['equality', 'order'],\n decode: (wire: Date) => wire,\n encode: (value: Date) => value,\n});\n\nexport const mongoVectorCodec = mongoCodec({\n typeId: MONGO_VECTOR_CODEC_ID,\n targetTypes: ['vector'],\n traits: ['equality'],\n decode: (wire: readonly number[]) => wire,\n encode: (value: readonly number[]) => value,\n renderOutputType: (typeParams) => {\n const length = typeParams['length'];\n if (length === undefined) return undefined;\n if (typeof length !== 'number' || !Number.isFinite(length) || !Number.isInteger(length)) {\n throw new Error('renderOutputType: expected positive integer \"length\" for Vector');\n }\n return `Vector<${length}>`;\n },\n});\n","import { createMongoCodecRegistry, type MongoCodecRegistry } from '@prisma-next/mongo-codec';\nimport type { MongoAdapter } from '@prisma-next/mongo-lowering';\nimport type {\n MongoQueryPlan,\n MongoUpdatePipelineStage,\n MongoUpdateSpec,\n} from '@prisma-next/mongo-query-ast/execution';\nimport type { Document, MongoExpr } from '@prisma-next/mongo-value';\nimport type { AnyMongoWireCommand } from '@prisma-next/mongo-wire';\nimport {\n AggregateWireCommand,\n DeleteManyWireCommand,\n DeleteOneWireCommand,\n FindOneAndDeleteWireCommand,\n FindOneAndUpdateWireCommand,\n InsertManyWireCommand,\n InsertOneWireCommand,\n UpdateManyWireCommand,\n UpdateOneWireCommand,\n} from '@prisma-next/mongo-wire';\nimport { lowerFilter, lowerPipeline, lowerStage } from './lowering';\nimport { resolveValue } from './resolve-value';\n\nfunction isUpdatePipeline(\n update: MongoUpdateSpec,\n): update is ReadonlyArray<MongoUpdatePipelineStage> {\n return Array.isArray(update);\n}\n\nclass MongoAdapterImpl implements MongoAdapter {\n readonly #codecs: MongoCodecRegistry | undefined;\n\n constructor(codecs?: MongoCodecRegistry) {\n this.#codecs = codecs;\n }\n\n #resolveDocument(expr: MongoExpr): Document {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(expr)) {\n result[key] = resolveValue(val, this.#codecs);\n }\n return result;\n }\n\n #lowerUpdate(update: MongoUpdateSpec): Document | ReadonlyArray<Document> {\n if (isUpdatePipeline(update)) {\n return update.map((stage) => lowerStage(stage));\n }\n return this.#resolveDocument(update);\n }\n\n lower(plan: MongoQueryPlan): AnyMongoWireCommand {\n const { command } = plan;\n switch (command.kind) {\n case 'insertOne':\n return new InsertOneWireCommand(\n command.collection,\n this.#resolveDocument(command.document),\n );\n case 'updateOne':\n return new UpdateOneWireCommand(\n command.collection,\n lowerFilter(command.filter),\n this.#lowerUpdate(command.update),\n command.upsert,\n );\n case 'insertMany':\n return new InsertManyWireCommand(\n command.collection,\n command.documents.map((doc) => this.#resolveDocument(doc)),\n );\n case 'updateMany':\n return new UpdateManyWireCommand(\n command.collection,\n lowerFilter(command.filter),\n this.#lowerUpdate(command.update),\n command.upsert,\n );\n case 'deleteOne':\n return new DeleteOneWireCommand(command.collection, lowerFilter(command.filter));\n case 'deleteMany':\n return new DeleteManyWireCommand(command.collection, lowerFilter(command.filter));\n case 'findOneAndUpdate':\n return new FindOneAndUpdateWireCommand(\n command.collection,\n lowerFilter(command.filter),\n this.#lowerUpdate(command.update),\n command.upsert,\n command.sort,\n command.returnDocument,\n );\n case 'findOneAndDelete':\n return new FindOneAndDeleteWireCommand(\n command.collection,\n lowerFilter(command.filter),\n command.sort,\n );\n case 'aggregate':\n return new AggregateWireCommand(command.collection, lowerPipeline(command.pipeline));\n case 'rawAggregate':\n return new AggregateWireCommand(command.collection, command.pipeline);\n case 'rawInsertOne':\n return new InsertOneWireCommand(command.collection, command.document);\n case 'rawInsertMany':\n return new InsertManyWireCommand(command.collection, command.documents);\n case 'rawUpdateOne':\n return new UpdateOneWireCommand(command.collection, command.filter, command.update);\n case 'rawUpdateMany':\n return new UpdateManyWireCommand(command.collection, command.filter, command.update);\n case 'rawDeleteOne':\n return new DeleteOneWireCommand(command.collection, command.filter);\n case 'rawDeleteMany':\n return new DeleteManyWireCommand(command.collection, command.filter);\n case 'rawFindOneAndUpdate':\n return new FindOneAndUpdateWireCommand(\n command.collection,\n command.filter,\n command.update,\n command.upsert,\n command.sort,\n command.returnDocument,\n );\n case 'rawFindOneAndDelete':\n return new FindOneAndDeleteWireCommand(command.collection, command.filter, command.sort);\n // v8 ignore next 4\n default: {\n const _exhaustive: never = command;\n throw new Error(`Unknown command kind: ${(_exhaustive as { kind: string }).kind}`);\n }\n }\n }\n}\n\nimport {\n mongoBooleanCodec,\n mongoDateCodec,\n mongoDoubleCodec,\n mongoInt32Codec,\n mongoObjectIdCodec,\n mongoStringCodec,\n mongoVectorCodec,\n} from './core/codecs';\n\nfunction defaultCodecRegistry(): MongoCodecRegistry {\n const registry = createMongoCodecRegistry();\n for (const codec of [\n mongoObjectIdCodec,\n mongoStringCodec,\n mongoDoubleCodec,\n mongoInt32Codec,\n mongoBooleanCodec,\n mongoDateCodec,\n mongoVectorCodec,\n ]) {\n registry.register(codec);\n }\n return registry;\n}\n\nexport function createMongoAdapter(codecs?: MongoCodecRegistry): MongoAdapter {\n return new MongoAdapterImpl(codecs ?? defaultCodecRegistry());\n}\n"],"mappings":"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"}