@prisma-next/adapter-mongo 0.13.0 → 0.14.0
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/dist/control.d.mts +11 -13
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +18 -57
- package/dist/control.mjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{mongo-adapter-ifsSo1o1.mjs → mongo-adapter-CORsfDZK.mjs} +16 -3
- package/dist/{mongo-adapter-ifsSo1o1.mjs.map → mongo-adapter-CORsfDZK.mjs.map} +1 -1
- package/dist/mongo-adapter-Ch21r_Sr.d.mts.map +1 -1
- package/dist/runtime.mjs +1 -1
- package/package.json +24 -24
- package/src/core/inspection-executor.ts +31 -0
- package/src/core/introspect-schema.ts +12 -2
- package/src/core/mongo-control-adapter.ts +7 -1
- package/src/core/runner-deps.ts +6 -5
- package/src/exports/control.ts +1 -1
- package/src/mongo-adapter.ts +43 -5
- package/src/core/command-executor.ts +0 -89
package/dist/control.d.mts
CHANGED
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
import { t as createMongoAdapter } from "./mongo-adapter-Ch21r_Sr.mjs";
|
|
2
|
+
import { AnyMongoDdlCommand, ListCollectionsCommand, ListIndexesCommand, MongoInspectionCommandVisitor } from "@prisma-next/mongo-query-ast/control";
|
|
2
3
|
import { Db, Document } from "mongodb";
|
|
3
|
-
import { CollModCommand, CreateCollectionCommand, CreateIndexCommand, DropCollectionCommand, DropIndexCommand, ListCollectionsCommand, ListIndexesCommand, MongoDdlCommandVisitor, MongoInspectionCommandVisitor } from "@prisma-next/mongo-query-ast/control";
|
|
4
4
|
import { MongoSchemaIR } from "@prisma-next/mongo-schema-ir";
|
|
5
5
|
import { MongoControlAdapter, MongoControlAdapterDescriptor } from "@prisma-next/family-mongo/control-adapter";
|
|
6
6
|
import { MongoAdapter, MongoControlDriverInstance, MongoControlDriverInstance as MongoControlDriverInstance$1, MongoDriver } from "@prisma-next/mongo-lowering";
|
|
7
7
|
import { ContractMarkerRecord, LedgerEntryRecord } from "@prisma-next/contract/types";
|
|
8
8
|
import { ControlDriverInstance, ControlFamilyInstance } from "@prisma-next/framework-components/control";
|
|
9
9
|
|
|
10
|
-
//#region src/core/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
dropCollection(cmd: DropCollectionCommand): Promise<void>;
|
|
18
|
-
collMod(cmd: CollModCommand): Promise<void>;
|
|
19
|
-
}
|
|
10
|
+
//#region src/core/inspection-executor.d.ts
|
|
11
|
+
/**
|
|
12
|
+
* Executes the read-only catalog inspections (`listCollections` / `listIndexes`)
|
|
13
|
+
* that migration prechecks/postchecks and operation preview evaluate, directly
|
|
14
|
+
* against `db`. Routing these checks through the adapter's lowering seam is
|
|
15
|
+
* deferred to the `typed-migration-verification-queries` slice.
|
|
16
|
+
*/
|
|
20
17
|
declare class MongoInspectionExecutor implements MongoInspectionCommandVisitor<Promise<Document[]>> {
|
|
21
18
|
private readonly db;
|
|
22
19
|
constructor(db: Db);
|
|
@@ -41,6 +38,7 @@ declare class MongoControlAdapterImpl implements MongoControlAdapter<'mongo'> {
|
|
|
41
38
|
#private;
|
|
42
39
|
readonly familyId: "mongo";
|
|
43
40
|
readonly targetId: "mongo";
|
|
41
|
+
executeDdl(driver: MongoDriver, command: AnyMongoDdlCommand): Promise<void>;
|
|
44
42
|
readMarker(driver: ControlDriverInstance<'mongo', 'mongo'>, space: string): Promise<ContractMarkerRecord | null>;
|
|
45
43
|
readAllMarkers(driver: ControlDriverInstance<'mongo', 'mongo'>): Promise<ReadonlyMap<string, ContractMarkerRecord>>;
|
|
46
44
|
initMarker(driver: ControlDriverInstance<'mongo', 'mongo'>, space: string, destination: {
|
|
@@ -98,10 +96,10 @@ interface MarkerOperations {
|
|
|
98
96
|
}): Promise<void>;
|
|
99
97
|
}
|
|
100
98
|
interface MongoRunnerDependencies {
|
|
101
|
-
readonly commandExecutor: MongoDdlCommandVisitor<Promise<void>>;
|
|
102
99
|
readonly inspectionExecutor: MongoInspectionCommandVisitor<Promise<Record<string, unknown>[]>>;
|
|
103
100
|
readonly adapter: MongoAdapter;
|
|
104
101
|
readonly driver: MongoDriver;
|
|
102
|
+
readonly executeDdl: (command: AnyMongoDdlCommand) => Promise<void>;
|
|
105
103
|
readonly markerOps: MarkerOperations;
|
|
106
104
|
readonly introspectSchema: () => Promise<MongoSchemaIR>;
|
|
107
105
|
}
|
|
@@ -119,5 +117,5 @@ declare function createMongoRunnerDeps(controlDriver: ControlDriverInstance<'mon
|
|
|
119
117
|
//#region src/exports/control.d.ts
|
|
120
118
|
declare const mongoAdapterDescriptor: MongoControlAdapterDescriptor<'mongo'>;
|
|
121
119
|
//#endregion
|
|
122
|
-
export { type MarkerOperations,
|
|
120
|
+
export { type MarkerOperations, MongoControlAdapterImpl, type MongoControlDriverInstance, MongoInspectionExecutor, type MongoRunnerDependencies, createMongoAdapter, createMongoRunnerDeps, mongoAdapterDescriptor as default, mongoAdapterDescriptor, extractDb, introspectSchema, isMongoControlDriver };
|
|
123
121
|
//# sourceMappingURL=control.d.mts.map
|
package/dist/control.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/
|
|
1
|
+
{"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/inspection-executor.ts","../src/core/introspect-schema.ts","../src/core/mongo-control-adapter.ts","../src/core/mongo-control-driver.ts","../src/core/runner-deps.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;;;;;;;cAaa,uBAAA,YAAmC,6BAAA,CAA8B,OAAA,CAAQ,QAAA;EAAA,iBACvD,EAAA;cAAA,EAAA,EAAI,EAAA;EAE3B,WAAA,CAAY,GAAA,EAAK,kBAAA,GAAqB,OAAA,CAAQ,QAAA;EAW9C,eAAA,CAAgB,IAAA,EAAM,sBAAA,GAAyB,OAAA,CAAQ,QAAA;AAAA;;;iBC0EzC,gBAAA,CAAiB,EAAA,EAAI,EAAA,GAAK,OAAA,CAAQ,aAAA;;;;;;;ADxFxD;;;;;cE2Ba,uBAAA,YAAmC,mBAAA;EAAA;WACrC,QAAA;EAAA,SACA,QAAA;EA2BH,UAAA,CAAW,MAAA,EAAQ,WAAA,EAAa,OAAA,EAAS,kBAAA,GAAqB,OAAA;EA6B9D,UAAA,CACJ,MAAA,EAAQ,qBAAA,oBACR,KAAA,WACC,OAAA,CAAQ,oBAAA;EAoBL,cAAA,CACJ,MAAA,EAAQ,qBAAA,qBACP,OAAA,CAAQ,WAAA,SAAoB,oBAAA;EAyBzB,UAAA,CACJ,MAAA,EAAQ,qBAAA,oBACR,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAgBG,YAAA,CACJ,MAAA,EAAQ,qBAAA,oBACR,KAAA,UACA,YAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EA+BG,gBAAA,CACJ,MAAA,EAAQ,qBAAA,oBACR,KAAA,UACA,KAAA;IAAA,SACW,MAAA;IAAA,SACA,IAAA;IAAA,SACA,EAAA;IAAA,SACA,aAAA;IAAA,SACA,aAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EAiBG,UAAA,CACJ,MAAA,EAAQ,qBAAA,oBACR,KAAA,YACC,OAAA,UAAiB,iBAAA;EAqDd,gBAAA,CAAiB,MAAA,EAAQ,qBAAA,qBAA0C,OAAA,CAAQ,aAAA;AAAA;;;iBCrSnE,oBAAA,CACd,MAAA,EAAQ,qBAAA,oBACP,MAAA,IAAU,4BAA0B;;;iBCavB,SAAA,CAAU,MAAA,EAAQ,qBAAA,qBAA0C,EAAE;;;AJL9E;;;;UIqBiB,gBAAA;EACf,UAAA,CAAW,KAAA,WAAgB,OAAA,CAAQ,oBAAA;EACnC,UAAA,CACE,KAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EACH,YAAA,CACE,KAAA,UACA,YAAA,UACA,WAAA;IAAA,SACW,WAAA;IAAA,SACA,WAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;EACH,gBAAA,CACE,KAAA,UACA,KAAA;IAAA,SACW,MAAA;IAAA,SACA,IAAA;IAAA,SACA,EAAA;IAAA,SACA,aAAA;IAAA,SACA,aAAA;IAAA,SACA,UAAA;EAAA,IAEV,OAAA;AAAA;AAAA,UAGY,uBAAA;EAAA,SACN,kBAAA,EAAoB,6BAAA,CAA8B,OAAA,CAAQ,MAAA;EAAA,SAC1D,OAAA,EAAS,YAAA;EAAA,SACT,MAAA,EAAQ,WAAA;EAAA,SACR,UAAA,GAAa,OAAA,EAAS,kBAAA,KAAuB,OAAA;EAAA,SAC7C,SAAA,EAAW,gBAAA;EAAA,SACX,gBAAA,QAAwB,OAAA,CAAQ,aAAA;AAAA;AJ7C4B;;;;AC0EvE;;;;;AD1EuE,iBIyDvD,qBAAA,CACd,aAAA,EAAe,qBAAA,oBACf,MAAA,EAAQ,WAAA,EAMR,OAAA,EAAS,qBAAA,UAA+B,aAAA,GACxC,cAAA,GAAgB,mBAAA,YACf,uBAAA;;;cC3EU,sBAAA,EAAwB,6BAA6B"}
|
package/dist/control.mjs
CHANGED
|
@@ -1,64 +1,20 @@
|
|
|
1
|
-
import { r as mongoCodecDescriptors, t as createMongoAdapter } from "./mongo-adapter-
|
|
1
|
+
import { r as mongoCodecDescriptors, t as createMongoAdapter } from "./mongo-adapter-CORsfDZK.mjs";
|
|
2
2
|
import { MongoAggFieldRef, MongoAggLiteral, MongoAggOperator } from "@prisma-next/mongo-query-ast/execution";
|
|
3
3
|
import { blindCast } from "@prisma-next/utils/casts";
|
|
4
4
|
import { MongoServerError } from "mongodb";
|
|
5
|
-
import { keysToKeySpec } from "@prisma-next/mongo-query-ast/control";
|
|
6
5
|
import { MongoSchemaCollection, MongoSchemaCollectionOptions, MongoSchemaIR, MongoSchemaIndex, MongoSchemaValidator } from "@prisma-next/mongo-schema-ir";
|
|
7
6
|
import { parseMarkerRowSafely, withMarkerReadErrorHandling } from "@prisma-next/errors/execution";
|
|
8
7
|
import { ledgerOriginFromStored } from "@prisma-next/migration-tools/ledger-origin";
|
|
9
8
|
import { expr, fn } from "@prisma-next/mongo-query-builder";
|
|
10
9
|
import { collection } from "@prisma-next/mongo-query-builder/contract-free";
|
|
11
10
|
import { type } from "arktype";
|
|
12
|
-
//#region src/core/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const keySpec = keysToKeySpec(cmd.keys);
|
|
20
|
-
const options = {};
|
|
21
|
-
if (cmd.unique !== void 0) options["unique"] = cmd.unique;
|
|
22
|
-
if (cmd.sparse !== void 0) options["sparse"] = cmd.sparse;
|
|
23
|
-
if (cmd.expireAfterSeconds !== void 0) options["expireAfterSeconds"] = cmd.expireAfterSeconds;
|
|
24
|
-
if (cmd.partialFilterExpression !== void 0) options["partialFilterExpression"] = cmd.partialFilterExpression;
|
|
25
|
-
if (cmd.name !== void 0) options["name"] = cmd.name;
|
|
26
|
-
if (cmd.wildcardProjection !== void 0) options["wildcardProjection"] = cmd.wildcardProjection;
|
|
27
|
-
if (cmd.collation !== void 0) options["collation"] = cmd.collation;
|
|
28
|
-
if (cmd.weights !== void 0) options["weights"] = cmd.weights;
|
|
29
|
-
if (cmd.default_language !== void 0) options["default_language"] = cmd.default_language;
|
|
30
|
-
if (cmd.language_override !== void 0) options["language_override"] = cmd.language_override;
|
|
31
|
-
await this.db.collection(cmd.collection).createIndex(keySpec, options);
|
|
32
|
-
}
|
|
33
|
-
async dropIndex(cmd) {
|
|
34
|
-
await this.db.collection(cmd.collection).dropIndex(cmd.name);
|
|
35
|
-
}
|
|
36
|
-
async createCollection(cmd) {
|
|
37
|
-
const options = {};
|
|
38
|
-
if (cmd.capped !== void 0) options["capped"] = cmd.capped;
|
|
39
|
-
if (cmd.size !== void 0) options["size"] = cmd.size;
|
|
40
|
-
if (cmd.max !== void 0) options["max"] = cmd.max;
|
|
41
|
-
if (cmd.timeseries !== void 0) options["timeseries"] = cmd.timeseries;
|
|
42
|
-
if (cmd.collation !== void 0) options["collation"] = cmd.collation;
|
|
43
|
-
if (cmd.clusteredIndex !== void 0) options["clusteredIndex"] = cmd.clusteredIndex;
|
|
44
|
-
if (cmd.validator !== void 0) options["validator"] = cmd.validator;
|
|
45
|
-
if (cmd.validationLevel !== void 0) options["validationLevel"] = cmd.validationLevel;
|
|
46
|
-
if (cmd.validationAction !== void 0) options["validationAction"] = cmd.validationAction;
|
|
47
|
-
if (cmd.changeStreamPreAndPostImages !== void 0) options["changeStreamPreAndPostImages"] = cmd.changeStreamPreAndPostImages;
|
|
48
|
-
await this.db.createCollection(cmd.collection, options);
|
|
49
|
-
}
|
|
50
|
-
async dropCollection(cmd) {
|
|
51
|
-
await this.db.collection(cmd.collection).drop();
|
|
52
|
-
}
|
|
53
|
-
async collMod(cmd) {
|
|
54
|
-
const command = { collMod: cmd.collection };
|
|
55
|
-
if (cmd.validator !== void 0) command["validator"] = cmd.validator;
|
|
56
|
-
if (cmd.validationLevel !== void 0) command["validationLevel"] = cmd.validationLevel;
|
|
57
|
-
if (cmd.validationAction !== void 0) command["validationAction"] = cmd.validationAction;
|
|
58
|
-
if (cmd.changeStreamPreAndPostImages !== void 0) command["changeStreamPreAndPostImages"] = cmd.changeStreamPreAndPostImages;
|
|
59
|
-
await this.db.command(command);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
11
|
+
//#region src/core/inspection-executor.ts
|
|
12
|
+
/**
|
|
13
|
+
* Executes the read-only catalog inspections (`listCollections` / `listIndexes`)
|
|
14
|
+
* that migration prechecks/postchecks and operation preview evaluate, directly
|
|
15
|
+
* against `db`. Routing these checks through the adapter's lowering seam is
|
|
16
|
+
* deferred to the `typed-migration-verification-queries` slice.
|
|
17
|
+
*/
|
|
62
18
|
var MongoInspectionExecutor = class {
|
|
63
19
|
db;
|
|
64
20
|
constructor(db) {
|
|
@@ -107,7 +63,7 @@ function parseIndex(doc) {
|
|
|
107
63
|
expireAfterSeconds: doc["expireAfterSeconds"],
|
|
108
64
|
partialFilterExpression: doc["partialFilterExpression"],
|
|
109
65
|
wildcardProjection: doc["wildcardProjection"],
|
|
110
|
-
collation: doc["collation"],
|
|
66
|
+
collation: doc["collation"] ? blindCast(doc["collation"]) : void 0,
|
|
111
67
|
weights: doc["weights"],
|
|
112
68
|
default_language: doc["default_language"],
|
|
113
69
|
language_override: doc["language_override"]
|
|
@@ -131,7 +87,7 @@ function parseCollectionOptions(info) {
|
|
|
131
87
|
const size = options["size"];
|
|
132
88
|
const max = options["max"];
|
|
133
89
|
const timeseries = options["timeseries"];
|
|
134
|
-
const collation = options["collation"];
|
|
90
|
+
const collation = options["collation"] ? blindCast(options["collation"]) : void 0;
|
|
135
91
|
const changeStreamPreAndPostImages = options["changeStreamPreAndPostImages"];
|
|
136
92
|
const clusteredIndex = options["clusteredIndex"];
|
|
137
93
|
if (!(capped || timeseries || collation || changeStreamPreAndPostImages || clusteredIndex)) return void 0;
|
|
@@ -228,11 +184,12 @@ function extractDb(driver) {
|
|
|
228
184
|
* constructed locally.
|
|
229
185
|
*/
|
|
230
186
|
function createMongoRunnerDeps(controlDriver, driver, _family, controlAdapter = new MongoControlAdapterImpl()) {
|
|
187
|
+
const adapter = createMongoAdapter();
|
|
231
188
|
return {
|
|
232
|
-
commandExecutor: new MongoCommandExecutor(extractDb(controlDriver)),
|
|
233
189
|
inspectionExecutor: new MongoInspectionExecutor(extractDb(controlDriver)),
|
|
234
|
-
adapter
|
|
190
|
+
adapter,
|
|
235
191
|
driver,
|
|
192
|
+
executeDdl: (command) => adapter.lower({ command }, {}).then((wire) => driver.run(wire)),
|
|
236
193
|
markerOps: {
|
|
237
194
|
readMarker: (space) => controlAdapter.readMarker(controlDriver, space),
|
|
238
195
|
initMarker: (space, dest) => controlAdapter.initMarker(controlDriver, space, dest),
|
|
@@ -275,6 +232,10 @@ var MongoControlAdapterImpl = class {
|
|
|
275
232
|
for await (const row of driver.execute(wireCommand)) rows.push(row);
|
|
276
233
|
return rows;
|
|
277
234
|
}
|
|
235
|
+
async executeDdl(driver, command) {
|
|
236
|
+
const wire = await this.#adapter.lower({ command }, {});
|
|
237
|
+
await driver.run(wire);
|
|
238
|
+
}
|
|
278
239
|
/**
|
|
279
240
|
* Server-side invariant-merge aggregation expression:
|
|
280
241
|
* `$sortArray({ input: $setUnion([$ifNull('$invariants', []), incoming]), sortBy: 1 })`.
|
|
@@ -440,6 +401,6 @@ const mongoAdapterDescriptor = {
|
|
|
440
401
|
}
|
|
441
402
|
};
|
|
442
403
|
//#endregion
|
|
443
|
-
export {
|
|
404
|
+
export { MongoControlAdapterImpl, MongoInspectionExecutor, createMongoAdapter, createMongoRunnerDeps, mongoAdapterDescriptor as default, mongoAdapterDescriptor, extractDb, introspectSchema, isMongoControlDriver };
|
|
444
405
|
|
|
445
406
|
//# sourceMappingURL=control.mjs.map
|
package/dist/control.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.mjs","names":["#adapter","#markerLedgerCollection","#execute","#invariantMergeExpr"],"sources":["../src/core/command-executor.ts","../src/core/introspect-schema.ts","../src/core/marker-ledger.ts","../src/core/marker-ledger-collection.ts","../src/core/mongo-control-driver.ts","../src/core/runner-deps.ts","../src/core/mongo-control-adapter.ts","../src/exports/control.ts"],"sourcesContent":["import type {\n CollModCommand,\n CreateCollectionCommand,\n CreateIndexCommand,\n DropCollectionCommand,\n DropIndexCommand,\n ListCollectionsCommand,\n ListIndexesCommand,\n MongoDdlCommandVisitor,\n MongoInspectionCommandVisitor,\n} from '@prisma-next/mongo-query-ast/control';\nimport { keysToKeySpec } from '@prisma-next/mongo-query-ast/control';\nimport { type Db, type Document, MongoServerError } from 'mongodb';\n\nexport class MongoCommandExecutor implements MongoDdlCommandVisitor<Promise<void>> {\n constructor(private readonly db: Db) {}\n\n async createIndex(cmd: CreateIndexCommand): Promise<void> {\n const keySpec: Document = keysToKeySpec(cmd.keys);\n const options: Record<string, unknown> = {};\n if (cmd.unique !== undefined) options['unique'] = cmd.unique;\n if (cmd.sparse !== undefined) options['sparse'] = cmd.sparse;\n if (cmd.expireAfterSeconds !== undefined)\n options['expireAfterSeconds'] = cmd.expireAfterSeconds;\n if (cmd.partialFilterExpression !== undefined)\n options['partialFilterExpression'] = cmd.partialFilterExpression;\n if (cmd.name !== undefined) options['name'] = cmd.name;\n if (cmd.wildcardProjection !== undefined)\n options['wildcardProjection'] = cmd.wildcardProjection;\n if (cmd.collation !== undefined) options['collation'] = cmd.collation;\n if (cmd.weights !== undefined) options['weights'] = cmd.weights;\n if (cmd.default_language !== undefined) options['default_language'] = cmd.default_language;\n if (cmd.language_override !== undefined) options['language_override'] = cmd.language_override;\n await this.db.collection(cmd.collection).createIndex(keySpec, options);\n }\n\n async dropIndex(cmd: DropIndexCommand): Promise<void> {\n await this.db.collection(cmd.collection).dropIndex(cmd.name);\n }\n\n async createCollection(cmd: CreateCollectionCommand): Promise<void> {\n const options: Record<string, unknown> = {};\n if (cmd.capped !== undefined) options['capped'] = cmd.capped;\n if (cmd.size !== undefined) options['size'] = cmd.size;\n if (cmd.max !== undefined) options['max'] = cmd.max;\n if (cmd.timeseries !== undefined) options['timeseries'] = cmd.timeseries;\n if (cmd.collation !== undefined) options['collation'] = cmd.collation;\n if (cmd.clusteredIndex !== undefined) options['clusteredIndex'] = cmd.clusteredIndex;\n if (cmd.validator !== undefined) options['validator'] = cmd.validator;\n if (cmd.validationLevel !== undefined) options['validationLevel'] = cmd.validationLevel;\n if (cmd.validationAction !== undefined) options['validationAction'] = cmd.validationAction;\n if (cmd.changeStreamPreAndPostImages !== undefined)\n options['changeStreamPreAndPostImages'] = cmd.changeStreamPreAndPostImages;\n await this.db.createCollection(cmd.collection, options);\n }\n\n async dropCollection(cmd: DropCollectionCommand): Promise<void> {\n await this.db.collection(cmd.collection).drop();\n }\n\n async collMod(cmd: CollModCommand): Promise<void> {\n const command: Record<string, unknown> = { collMod: cmd.collection };\n if (cmd.validator !== undefined) command['validator'] = cmd.validator;\n if (cmd.validationLevel !== undefined) command['validationLevel'] = cmd.validationLevel;\n if (cmd.validationAction !== undefined) command['validationAction'] = cmd.validationAction;\n if (cmd.changeStreamPreAndPostImages !== undefined)\n command['changeStreamPreAndPostImages'] = cmd.changeStreamPreAndPostImages;\n await this.db.command(command);\n }\n}\n\nexport class MongoInspectionExecutor implements MongoInspectionCommandVisitor<Promise<Document[]>> {\n constructor(private readonly db: Db) {}\n\n async listIndexes(cmd: ListIndexesCommand): Promise<Document[]> {\n try {\n return await this.db.collection(cmd.collection).listIndexes().toArray();\n } catch (error: unknown) {\n if (error instanceof MongoServerError && error.code === 26) {\n return [];\n }\n throw error;\n }\n }\n\n async listCollections(_cmd: ListCollectionsCommand): Promise<Document[]> {\n return this.db.listCollections().toArray();\n }\n}\n","import type { MongoIndexKey, MongoIndexKeyDirection } from '@prisma-next/mongo-contract';\nimport {\n MongoSchemaCollection,\n MongoSchemaCollectionOptions,\n MongoSchemaIndex,\n MongoSchemaIR,\n MongoSchemaValidator,\n} from '@prisma-next/mongo-schema-ir';\nimport type { Db, Document } from 'mongodb';\n\nconst PRISMA_MIGRATIONS_COLLECTION = '_prisma_migrations';\n\nfunction parseIndexKeys(keySpec: Record<string, unknown>): MongoIndexKey[] {\n const keys: MongoIndexKey[] = [];\n for (const [field, direction] of Object.entries(keySpec)) {\n keys.push({ field, direction: direction as MongoIndexKeyDirection });\n }\n return keys;\n}\n\n/**\n * Exported for unit tests to exercise the defensive `!key` guard; not part of\n * the public API. Callers in this package use it via the `introspectSchema`\n * pipeline only.\n */\nexport function isDefaultIdIndex(doc: Document): boolean {\n const key = doc['key'] as Record<string, unknown> | undefined;\n if (!key) return false;\n const entries = Object.entries(key);\n return entries.length === 1 && entries[0]?.[0] === '_id' && entries[0]?.[1] === 1;\n}\n\nfunction parseIndex(doc: Document): MongoSchemaIndex {\n const keySpec = doc['key'] as Record<string, unknown>;\n return new MongoSchemaIndex({\n keys: parseIndexKeys(keySpec),\n unique: doc['unique'] as boolean | undefined,\n sparse: doc['sparse'] as boolean | undefined,\n expireAfterSeconds: doc['expireAfterSeconds'] as number | undefined,\n partialFilterExpression: doc['partialFilterExpression'] as Record<string, unknown> | undefined,\n wildcardProjection: doc['wildcardProjection'] as Record<string, 0 | 1> | undefined,\n collation: doc['collation'] as Record<string, unknown> | undefined,\n weights: doc['weights'] as Record<string, number> | undefined,\n default_language: doc['default_language'] as string | undefined,\n language_override: doc['language_override'] as string | undefined,\n });\n}\n\nfunction parseValidator(options: Document): MongoSchemaValidator | undefined {\n const validator = options['validator'] as Record<string, unknown> | undefined;\n if (!validator) return undefined;\n\n const jsonSchema = validator['$jsonSchema'] as Record<string, unknown> | undefined;\n if (!jsonSchema) return undefined;\n\n return new MongoSchemaValidator({\n jsonSchema,\n validationLevel: (options['validationLevel'] as 'strict' | 'moderate') ?? 'strict',\n validationAction: (options['validationAction'] as 'error' | 'warn') ?? 'error',\n });\n}\n\nfunction parseCollectionOptions(info: Document): MongoSchemaCollectionOptions | undefined {\n const options = info['options'] as Record<string, unknown> | undefined;\n if (!options) return undefined;\n\n const capped = options['capped'] as boolean | undefined;\n const size = options['size'] as number | undefined;\n const max = options['max'] as number | undefined;\n const timeseries = options['timeseries'] as\n | { timeField: string; metaField?: string; granularity?: 'seconds' | 'minutes' | 'hours' }\n | undefined;\n const collation = options['collation'] as Record<string, unknown> | undefined;\n const changeStreamPreAndPostImages = options['changeStreamPreAndPostImages'] as\n | { enabled: boolean }\n | undefined;\n const clusteredIndex = options['clusteredIndex'] as { name?: string } | undefined;\n\n const hasMeaningfulOptions =\n capped || timeseries || collation || changeStreamPreAndPostImages || clusteredIndex;\n if (!hasMeaningfulOptions) return undefined;\n\n return new MongoSchemaCollectionOptions({\n ...(capped ? { capped: { size: size ?? 0, ...(max != null ? { max } : {}) } } : {}),\n ...(timeseries ? { timeseries } : {}),\n ...(collation ? { collation } : {}),\n ...(changeStreamPreAndPostImages ? { changeStreamPreAndPostImages } : {}),\n ...(clusteredIndex ? { clusteredIndex } : {}),\n });\n}\n\nexport async function introspectSchema(db: Db): Promise<MongoSchemaIR> {\n const collectionInfos = await db.listCollections().toArray();\n\n const collections: MongoSchemaCollection[] = [];\n\n for (const info of collectionInfos) {\n const name = info['name'] as string;\n const type = info['type'] as string | undefined;\n\n if (name === PRISMA_MIGRATIONS_COLLECTION) continue;\n if (name.startsWith('system.')) continue;\n if (type === 'view') continue;\n\n const indexDocs = await db.collection(name).listIndexes().toArray();\n const indexes = indexDocs.filter((doc) => !isDefaultIdIndex(doc)).map(parseIndex);\n\n const infoOptions = 'options' in info ? (info['options'] as Record<string, unknown>) : {};\n const validator = parseValidator(infoOptions);\n const options = parseCollectionOptions(info);\n\n collections.push(\n new MongoSchemaCollection({\n name,\n indexes,\n ...(validator ? { validator } : {}),\n ...(options ? { options } : {}),\n }),\n );\n }\n\n return new MongoSchemaIR(collections);\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { parseMarkerRowSafely } from '@prisma-next/errors/execution';\nimport { type } from 'arktype';\n\nexport const COLLECTION = '_prisma_migrations';\nexport const MONGO_MARKER_COLLECTION = `_prisma_migrations marker documents in ${COLLECTION}`;\nexport const MONGO_LEDGER_COLLECTION = `_prisma_migrations ledger documents in ${COLLECTION}`;\n\nconst MongoMarkerDocSchema = type({\n space: 'string',\n storageHash: 'string',\n profileHash: 'string',\n 'contractJson?': 'unknown | null',\n 'canonicalVersion?': 'number | null',\n 'updatedAt?': 'Date',\n 'appTag?': 'string | null',\n 'meta?': type({ '[string]': 'unknown' }).or('null'),\n 'invariants?': type('string').array(),\n '+': 'delete',\n});\n\nexport function parseMongoMarkerDoc(doc: unknown): ContractMarkerRecord {\n const result = MongoMarkerDocSchema(doc);\n if (result instanceof type.errors) {\n throw new Error(`Invalid marker doc on ${COLLECTION}: ${result.summary}`);\n }\n return {\n storageHash: result.storageHash,\n profileHash: result.profileHash,\n contractJson: result.contractJson ?? null,\n canonicalVersion: result.canonicalVersion ?? null,\n updatedAt: result.updatedAt ?? new Date(),\n appTag: result.appTag ?? null,\n meta: result.meta ?? {},\n invariants: result.invariants ?? [],\n };\n}\n\nexport function parseMongoMarkerDocSafely(doc: unknown, space: string): ContractMarkerRecord {\n return parseMarkerRowSafely(doc, parseMongoMarkerDoc, {\n space,\n markerLocation: MONGO_MARKER_COLLECTION,\n });\n}\n","/**\n * Document shape of the `_prisma_migrations` collection, which stores both the\n * per-space contract **markers** (`space` / `storageHash` / … / `invariants`)\n * and the migration **ledger** entries (`type` / `edgeId` / … / `appliedAt`) —\n * so the shape is their union. Declared once so the contract-free field\n * accessor is typed without threading a contract, codecs, or paths at the call\n * sites.\n */\nexport type MarkerLedgerDocShape = {\n readonly _id: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n // Marker fields\n readonly space: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly storageHash: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly profileHash: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly contractJson: { readonly codecId: 'mongo/string@1'; readonly nullable: true };\n readonly canonicalVersion: { readonly codecId: 'mongo/double@1'; readonly nullable: true };\n readonly updatedAt: { readonly codecId: 'mongo/date@1'; readonly nullable: false };\n readonly appTag: { readonly codecId: 'mongo/string@1'; readonly nullable: true };\n readonly meta: { readonly codecId: 'mongo/document@1'; readonly nullable: true };\n readonly invariants: { readonly codecId: 'mongo/array@1'; readonly nullable: false };\n // Ledger fields\n readonly type: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly edgeId: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly from: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly to: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly migrationName: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly migrationHash: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly operations: { readonly codecId: 'mongo/array@1'; readonly nullable: false };\n readonly appliedAt: { readonly codecId: 'mongo/date@1'; readonly nullable: false };\n};\n\nexport const MARKER_LEDGER_COLLECTION = '_prisma_migrations';\n","import type { ControlDriverInstance } from '@prisma-next/framework-components/control';\nimport type { MongoControlDriverInstance } from '@prisma-next/mongo-lowering';\n\nexport function isMongoControlDriver(\n driver: ControlDriverInstance<'mongo', string>,\n): driver is MongoControlDriverInstance {\n return (\n driver.familyId === 'mongo' &&\n driver.targetId === 'mongo' &&\n 'execute' in driver &&\n typeof driver.execute === 'function'\n );\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport type { MongoControlAdapter } from '@prisma-next/family-mongo/control-adapter';\nimport type {\n ControlDriverInstance,\n ControlFamilyInstance,\n} from '@prisma-next/framework-components/control';\nimport type { MongoAdapter, MongoDriver } from '@prisma-next/mongo-lowering';\nimport type {\n MongoDdlCommandVisitor,\n MongoInspectionCommandVisitor,\n} from '@prisma-next/mongo-query-ast/control';\nimport type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';\nimport type { Db } from 'mongodb';\nimport { createMongoAdapter } from '../mongo-adapter';\nimport { MongoCommandExecutor, MongoInspectionExecutor } from './command-executor';\nimport { MongoControlAdapterImpl } from './mongo-control-adapter';\nimport { isMongoControlDriver } from './mongo-control-driver';\n\nexport function extractDb(driver: ControlDriverInstance<'mongo', 'mongo'>): Db {\n if (!isMongoControlDriver(driver)) {\n throw new Error(\n 'Expected a Mongo control driver created by ' +\n 'mongoControlDriver.create() from `@prisma-next/driver-mongo/control`.',\n );\n }\n return driver.db;\n}\n\n/**\n * Marker / ledger operations the Mongo runner depends on. Every method\n * takes a `space` parameter so each loaded contract space addresses its\n * own marker row independently — see ADR 212 for the per-space\n * mechanism.\n */\nexport interface MarkerOperations {\n readMarker(space: string): Promise<ContractMarkerRecord | null>;\n initMarker(\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void>;\n updateMarker(\n space: string,\n expectedFrom: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<boolean>;\n writeLedgerEntry(\n space: string,\n entry: {\n readonly edgeId: string;\n readonly from: string;\n readonly to: string;\n readonly migrationName: string;\n readonly migrationHash: string;\n readonly operations: readonly unknown[];\n },\n ): Promise<void>;\n}\n\nexport interface MongoRunnerDependencies {\n readonly commandExecutor: MongoDdlCommandVisitor<Promise<void>>;\n readonly inspectionExecutor: MongoInspectionCommandVisitor<Promise<Record<string, unknown>[]>>;\n readonly adapter: MongoAdapter;\n readonly driver: MongoDriver;\n readonly markerOps: MarkerOperations;\n readonly introspectSchema: () => Promise<MongoSchemaIR>;\n}\n\n/**\n * Build the runner-dependencies envelope. `controlAdapter` is the\n * dispatch surface for wire-level Mongo CAS operations (marker reads,\n * marker advances, ledger appends, introspection); the envelope's\n * `markerOps` shim simply forwards each call through it. When the\n * caller already has a `MongoControlAdapter` on the control stack it\n * can pass it in; otherwise a default `MongoControlAdapterImpl` is\n * constructed locally.\n */\nexport function createMongoRunnerDeps(\n controlDriver: ControlDriverInstance<'mongo', 'mongo'>,\n driver: MongoDriver,\n // Vestigial after the family→adapter SPI refactor: the runner dependencies\n // now route every wire-level call through `controlAdapter`, so the `family`\n // instance is no longer consulted. Kept on the signature to avoid rippling\n // through ~14 call sites; a follow-up that already touches this factory\n // should drop the parameter outright.\n _family: ControlFamilyInstance<'mongo', MongoSchemaIR>,\n controlAdapter: MongoControlAdapter<'mongo'> = new MongoControlAdapterImpl(),\n): MongoRunnerDependencies {\n return {\n commandExecutor: new MongoCommandExecutor(extractDb(controlDriver)),\n inspectionExecutor: new MongoInspectionExecutor(extractDb(controlDriver)),\n adapter: createMongoAdapter(),\n driver,\n markerOps: {\n readMarker: (space) => controlAdapter.readMarker(controlDriver, space),\n initMarker: (space, dest) => controlAdapter.initMarker(controlDriver, space, dest),\n updateMarker: (space, expectedFrom, dest) =>\n controlAdapter.updateMarker(controlDriver, space, expectedFrom, dest),\n writeLedgerEntry: (space, entry) =>\n controlAdapter.writeLedgerEntry(controlDriver, space, entry),\n },\n introspectSchema: () => controlAdapter.introspectSchema(controlDriver),\n };\n}\n","import type { ContractMarkerRecord, LedgerEntryRecord } from '@prisma-next/contract/types';\nimport { withMarkerReadErrorHandling } from '@prisma-next/errors/execution';\nimport type { MongoControlAdapter } from '@prisma-next/family-mongo/control-adapter';\nimport type { ControlDriverInstance } from '@prisma-next/framework-components/control';\nimport { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';\nimport type { MongoAdapter } from '@prisma-next/mongo-lowering';\nimport {\n type AnyMongoCommand,\n MongoAggFieldRef,\n MongoAggLiteral,\n MongoAggOperator,\n type MongoQueryPlan,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { expr, fn } from '@prisma-next/mongo-query-builder';\nimport { collection } from '@prisma-next/mongo-query-builder/contract-free';\nimport type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';\nimport type { MongoValue } from '@prisma-next/mongo-value';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport type { Document } from 'mongodb';\nimport { createMongoAdapter } from '../mongo-adapter';\nimport { introspectSchema } from './introspect-schema';\nimport {\n MONGO_LEDGER_COLLECTION,\n MONGO_MARKER_COLLECTION,\n parseMongoMarkerDocSafely,\n} from './marker-ledger';\nimport { MARKER_LEDGER_COLLECTION, type MarkerLedgerDocShape } from './marker-ledger-collection';\nimport { isMongoControlDriver } from './mongo-control-driver';\nimport { extractDb } from './runner-deps';\n\n/**\n * Mongo control adapter for control-plane operations like introspection\n * and marker-ledger CAS. Implements the family-level `MongoControlAdapter`\n * SPI. Every marker/ledger operation builds a canonical command inline via\n * the contract-free fluent builder and dispatches it through the family\n * adapter's lowering path (`createMongoAdapter().lower(plan, {})`) onto the\n * Mongo wire transport (`driver.execute(wireCommand)`) — the same route SQL\n * marker/ledger ops take through `adapter.lower()` → `driver.query()`.\n */\nexport class MongoControlAdapterImpl implements MongoControlAdapter<'mongo'> {\n readonly familyId = 'mongo' as const;\n readonly targetId = 'mongo' as const;\n readonly #adapter: MongoAdapter = createMongoAdapter();\n readonly #markerLedgerCollection = collection<MarkerLedgerDocShape>(MARKER_LEDGER_COLLECTION);\n\n async #execute(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n command: AnyMongoCommand,\n ): Promise<Document[]> {\n const plan: MongoQueryPlan = {\n collection: MARKER_LEDGER_COLLECTION,\n command,\n meta: { target: 'mongo', targetFamily: 'mongo', storageHash: '', lane: 'control' },\n };\n const wireCommand = await this.#adapter.lower(plan, {});\n if (!isMongoControlDriver(driver)) {\n throw new Error(\n 'Mongo control adapter requires a Mongo control driver with an execute() transport. ' +\n 'Provide a MongoControlDriver from `@prisma-next/driver-mongo/control`.',\n );\n }\n const rows: Document[] = [];\n for await (const row of driver.execute<Document>(wireCommand)) {\n rows.push(row);\n }\n return rows;\n }\n\n /**\n * Server-side invariant-merge aggregation expression:\n * `$sortArray({ input: $setUnion([$ifNull('$invariants', []), incoming]), sortBy: 1 })`.\n *\n * Built through the typed agg-expr layer — `fn.setUnion` plus the generic\n * `MongoAggOperator` for `$ifNull` / `$sortArray` (neither has a named `fn`\n * helper). Returns a `MongoAggOperator` that is passed directly to\n * `f.stage.set({ invariants: ... })` in the update pipeline.\n */\n #invariantMergeExpr(incoming: readonly string[]): MongoAggOperator {\n const existingOrEmpty = MongoAggOperator.of('$ifNull', [\n MongoAggFieldRef.of('invariants'),\n MongoAggLiteral.of([]),\n ]);\n const merged = fn.setUnion(\n { _field: { codecId: 'mongo/array@1', nullable: false }, node: existingOrEmpty },\n {\n _field: { codecId: 'mongo/array@1', nullable: false },\n node: MongoAggLiteral.of([...incoming]),\n },\n );\n return MongoAggOperator.of('$sortArray', { input: merged.node, sortBy: MongoAggLiteral.of(1) });\n }\n\n async readMarker(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n ): Promise<ContractMarkerRecord | null> {\n const markerContext = { space, markerLocation: MONGO_MARKER_COLLECTION };\n const docs = await withMarkerReadErrorHandling(\n () =>\n this.#execute(\n driver,\n this.#markerLedgerCollection\n .aggregate()\n .match((f) => f._id.eq(space))\n .match((f) => f.space.eq(space))\n .limit(1)\n .build(),\n ),\n markerContext,\n );\n const doc = docs[0];\n if (!doc) return null;\n return parseMongoMarkerDocSafely(doc, space);\n }\n\n async readAllMarkers(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const markerContext = { space: 'app', markerLocation: MONGO_MARKER_COLLECTION };\n const docs = await withMarkerReadErrorHandling(\n () =>\n this.#execute(\n driver,\n this.#markerLedgerCollection\n .aggregate()\n .match((f) => f._id.type('string'))\n .match((f) => f.space.type('string'))\n .match((f) => expr(fn.eq(f._id, f.space)))\n .build(),\n ),\n markerContext,\n );\n const out = new Map<string, ContractMarkerRecord>();\n for (const doc of docs) {\n const space = doc['space'];\n /* v8 ignore next -- @preserve type-narrowing guard: the $match stage above filters on `space: { $type: 'string' }`, so this branch is unreachable at runtime. The check exists so the `out.set(space, ...)` call below can accept `string`. */\n if (typeof space !== 'string') continue;\n out.set(space, parseMongoMarkerDocSafely(doc, space));\n }\n return out;\n }\n\n async initMarker(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void> {\n const document: Record<string, MongoValue> = {\n _id: space,\n space,\n storageHash: destination.storageHash,\n profileHash: destination.profileHash,\n contractJson: null,\n canonicalVersion: null,\n updatedAt: new Date(),\n appTag: null,\n meta: {},\n invariants: [...(destination.invariants ?? [])],\n };\n await this.#execute(driver, this.#markerLedgerCollection.insertOne(document));\n }\n\n async updateMarker(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n expectedFrom: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<boolean> {\n const { invariants } = destination;\n const docs = await this.#execute(\n driver,\n this.#markerLedgerCollection\n .match((f) => f._id.eq(space))\n .match((f) => f.space.eq(space))\n .match((f) => f.storageHash.eq(expectedFrom))\n .findOneAndUpdate(\n (f) => [\n f.stage.set(\n invariants === undefined\n ? {\n storageHash: MongoAggLiteral.of(destination.storageHash),\n profileHash: MongoAggLiteral.of(destination.profileHash),\n updatedAt: MongoAggLiteral.of(new Date()),\n }\n : {\n storageHash: MongoAggLiteral.of(destination.storageHash),\n profileHash: MongoAggLiteral.of(destination.profileHash),\n updatedAt: MongoAggLiteral.of(new Date()),\n invariants: this.#invariantMergeExpr(invariants),\n },\n ),\n ],\n { upsert: false },\n ),\n );\n return docs.length > 0;\n }\n\n async writeLedgerEntry(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n entry: {\n readonly edgeId: string;\n readonly from: string;\n readonly to: string;\n readonly migrationName: string;\n readonly migrationHash: string;\n readonly operations: readonly unknown[];\n },\n ): Promise<void> {\n const document: Record<string, MongoValue> = {\n type: 'ledger',\n space,\n edgeId: entry.edgeId,\n from: entry.from,\n to: entry.to,\n migrationName: entry.migrationName,\n migrationHash: entry.migrationHash,\n operations: blindCast<ReadonlyArray<MongoValue>, 'ledger operation docs are BSON values'>(\n entry.operations,\n ),\n appliedAt: new Date(),\n };\n await this.#execute(driver, this.#markerLedgerCollection.insertOne(document));\n }\n\n async readLedger(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space?: string,\n ): Promise<readonly LedgerEntryRecord[]> {\n const ledgerContext = { space: space ?? '*', markerLocation: MONGO_LEDGER_COLLECTION };\n const chain = this.#markerLedgerCollection.aggregate().match((f) => f.type.eq('ledger'));\n const command =\n space === undefined\n ? chain.sort({ _id: 1 }).build()\n : chain\n .match((f) => f.space.eq(space))\n .sort({ _id: 1 })\n .build();\n const docs = await withMarkerReadErrorHandling(\n () => this.#execute(driver, command),\n ledgerContext,\n );\n\n const entries: LedgerEntryRecord[] = [];\n for (const doc of docs) {\n const migrationName = doc['migrationName'];\n const migrationHash = doc['migrationHash'];\n const from = doc['from'];\n const to = doc['to'];\n const docSpace = doc['space'];\n if (typeof migrationName !== 'string' || typeof migrationHash !== 'string') {\n continue;\n }\n if (typeof from !== 'string' || typeof to !== 'string') {\n continue;\n }\n if (typeof docSpace !== 'string') {\n continue;\n }\n const appliedAt = doc['appliedAt'];\n const appliedAtDate =\n appliedAt instanceof Date\n ? appliedAt\n : appliedAt !== undefined\n ? new Date(String(appliedAt))\n : new Date();\n const operations = doc['operations'];\n const opList = Array.isArray(operations) ? operations : [];\n entries.push({\n space: docSpace,\n migrationName,\n migrationHash,\n from: ledgerOriginFromStored(from),\n to,\n appliedAt: appliedAtDate,\n operationCount: opList.length,\n });\n }\n return entries;\n }\n\n async introspectSchema(driver: ControlDriverInstance<'mongo', 'mongo'>): Promise<MongoSchemaIR> {\n return introspectSchema(extractDb(driver));\n }\n}\n","import type { MongoControlAdapterDescriptor } from '@prisma-next/family-mongo/control-adapter';\nimport type { MongoControlDriverInstance } from '@prisma-next/mongo-lowering';\n\nexport { MongoCommandExecutor, MongoInspectionExecutor } from '../core/command-executor';\nexport { introspectSchema } from '../core/introspect-schema';\nexport { MongoControlAdapterImpl } from '../core/mongo-control-adapter';\nexport { isMongoControlDriver } from '../core/mongo-control-driver';\nexport {\n createMongoRunnerDeps,\n extractDb,\n type MarkerOperations,\n type MongoRunnerDependencies,\n} from '../core/runner-deps';\nexport { createMongoAdapter } from '../mongo-adapter';\nexport type { MongoControlDriverInstance };\n\nimport { mongoCodecDescriptors } from '../core/codecs';\nimport { MongoControlAdapterImpl } from '../core/mongo-control-adapter';\n\nexport const mongoAdapterDescriptor: MongoControlAdapterDescriptor<'mongo'> = {\n kind: 'adapter',\n id: 'mongo',\n familyId: 'mongo',\n targetId: 'mongo',\n version: '0.0.1',\n scalarTypeDescriptors: new Map([\n ['String', 'mongo/string@1'],\n ['Int', 'mongo/int32@1'],\n ['Boolean', 'mongo/bool@1'],\n ['DateTime', 'mongo/date@1'],\n ['ObjectId', 'mongo/objectId@1'],\n ['Float', 'mongo/double@1'],\n ]),\n types: {\n codecTypes: {\n codecDescriptors: mongoCodecDescriptors,\n import: {\n package: '@prisma-next/adapter-mongo/codec-types',\n named: 'CodecTypes',\n alias: 'MongoCodecTypes',\n },\n typeImports: [\n {\n package: '@prisma-next/adapter-mongo/codec-types',\n named: 'Vector',\n alias: 'Vector',\n },\n ],\n },\n },\n create(_stack) {\n return new MongoControlAdapterImpl();\n },\n};\n\nexport default mongoAdapterDescriptor;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"control.mjs","names":["#adapter","#markerLedgerCollection","#execute","#invariantMergeExpr"],"sources":["../src/core/inspection-executor.ts","../src/core/introspect-schema.ts","../src/core/marker-ledger.ts","../src/core/marker-ledger-collection.ts","../src/core/mongo-control-driver.ts","../src/core/runner-deps.ts","../src/core/mongo-control-adapter.ts","../src/exports/control.ts"],"sourcesContent":["import type {\n ListCollectionsCommand,\n ListIndexesCommand,\n MongoInspectionCommandVisitor,\n} from '@prisma-next/mongo-query-ast/control';\nimport { type Db, type Document, MongoServerError } from 'mongodb';\n\n/**\n * Executes the read-only catalog inspections (`listCollections` / `listIndexes`)\n * that migration prechecks/postchecks and operation preview evaluate, directly\n * against `db`. Routing these checks through the adapter's lowering seam is\n * deferred to the `typed-migration-verification-queries` slice.\n */\nexport class MongoInspectionExecutor implements MongoInspectionCommandVisitor<Promise<Document[]>> {\n constructor(private readonly db: Db) {}\n\n async listIndexes(cmd: ListIndexesCommand): Promise<Document[]> {\n try {\n return await this.db.collection(cmd.collection).listIndexes().toArray();\n } catch (error: unknown) {\n if (error instanceof MongoServerError && error.code === 26) {\n return [];\n }\n throw error;\n }\n }\n\n async listCollections(_cmd: ListCollectionsCommand): Promise<Document[]> {\n return this.db.listCollections().toArray();\n }\n}\n","import type { MongoIndexKey, MongoIndexKeyDirection } from '@prisma-next/mongo-contract';\nimport {\n MongoSchemaCollection,\n MongoSchemaCollectionOptions,\n MongoSchemaIndex,\n MongoSchemaIR,\n MongoSchemaValidator,\n} from '@prisma-next/mongo-schema-ir';\nimport type { CollationOptions } from '@prisma-next/mongo-value/mongodb-types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport type { Db, Document } from 'mongodb';\n\nconst PRISMA_MIGRATIONS_COLLECTION = '_prisma_migrations';\n\nfunction parseIndexKeys(keySpec: Record<string, unknown>): MongoIndexKey[] {\n const keys: MongoIndexKey[] = [];\n for (const [field, direction] of Object.entries(keySpec)) {\n keys.push({ field, direction: direction as MongoIndexKeyDirection });\n }\n return keys;\n}\n\n/**\n * Exported for unit tests to exercise the defensive `!key` guard; not part of\n * the public API. Callers in this package use it via the `introspectSchema`\n * pipeline only.\n */\nexport function isDefaultIdIndex(doc: Document): boolean {\n const key = doc['key'] as Record<string, unknown> | undefined;\n if (!key) return false;\n const entries = Object.entries(key);\n return entries.length === 1 && entries[0]?.[0] === '_id' && entries[0]?.[1] === 1;\n}\n\nfunction parseIndex(doc: Document): MongoSchemaIndex {\n const keySpec = doc['key'] as Record<string, unknown>;\n return new MongoSchemaIndex({\n keys: parseIndexKeys(keySpec),\n unique: doc['unique'] as boolean | undefined,\n sparse: doc['sparse'] as boolean | undefined,\n expireAfterSeconds: doc['expireAfterSeconds'] as number | undefined,\n partialFilterExpression: doc['partialFilterExpression'] as Record<string, unknown> | undefined,\n wildcardProjection: doc['wildcardProjection'] as Record<string, 0 | 1> | undefined,\n collation: doc['collation']\n ? blindCast<CollationOptions, 'collation from mongodb listIndexes result has locale'>(\n doc['collation'],\n )\n : undefined,\n weights: doc['weights'] as Record<string, number> | undefined,\n default_language: doc['default_language'] as string | undefined,\n language_override: doc['language_override'] as string | undefined,\n });\n}\n\nfunction parseValidator(options: Document): MongoSchemaValidator | undefined {\n const validator = options['validator'] as Record<string, unknown> | undefined;\n if (!validator) return undefined;\n\n const jsonSchema = validator['$jsonSchema'] as Record<string, unknown> | undefined;\n if (!jsonSchema) return undefined;\n\n return new MongoSchemaValidator({\n jsonSchema,\n validationLevel: (options['validationLevel'] as 'strict' | 'moderate') ?? 'strict',\n validationAction: (options['validationAction'] as 'error' | 'warn') ?? 'error',\n });\n}\n\nfunction parseCollectionOptions(info: Document): MongoSchemaCollectionOptions | undefined {\n const options = info['options'] as Record<string, unknown> | undefined;\n if (!options) return undefined;\n\n const capped = options['capped'] as boolean | undefined;\n const size = options['size'] as number | undefined;\n const max = options['max'] as number | undefined;\n const timeseries = options['timeseries'] as\n | { timeField: string; metaField?: string; granularity?: 'seconds' | 'minutes' | 'hours' }\n | undefined;\n const collation = options['collation']\n ? blindCast<CollationOptions, 'collation from mongodb listCollections result has locale'>(\n options['collation'],\n )\n : undefined;\n const changeStreamPreAndPostImages = options['changeStreamPreAndPostImages'] as\n | { enabled: boolean }\n | undefined;\n const clusteredIndex = options['clusteredIndex'] as { name?: string } | undefined;\n\n const hasMeaningfulOptions =\n capped || timeseries || collation || changeStreamPreAndPostImages || clusteredIndex;\n if (!hasMeaningfulOptions) return undefined;\n\n return new MongoSchemaCollectionOptions({\n ...(capped ? { capped: { size: size ?? 0, ...(max != null ? { max } : {}) } } : {}),\n ...(timeseries ? { timeseries } : {}),\n ...(collation ? { collation } : {}),\n ...(changeStreamPreAndPostImages ? { changeStreamPreAndPostImages } : {}),\n ...(clusteredIndex ? { clusteredIndex } : {}),\n });\n}\n\nexport async function introspectSchema(db: Db): Promise<MongoSchemaIR> {\n const collectionInfos = await db.listCollections().toArray();\n\n const collections: MongoSchemaCollection[] = [];\n\n for (const info of collectionInfos) {\n const name = info['name'] as string;\n const type = info['type'] as string | undefined;\n\n if (name === PRISMA_MIGRATIONS_COLLECTION) continue;\n if (name.startsWith('system.')) continue;\n if (type === 'view') continue;\n\n const indexDocs = await db.collection(name).listIndexes().toArray();\n const indexes = indexDocs.filter((doc) => !isDefaultIdIndex(doc)).map(parseIndex);\n\n const infoOptions = 'options' in info ? (info['options'] as Record<string, unknown>) : {};\n const validator = parseValidator(infoOptions);\n const options = parseCollectionOptions(info);\n\n collections.push(\n new MongoSchemaCollection({\n name,\n indexes,\n ...(validator ? { validator } : {}),\n ...(options ? { options } : {}),\n }),\n );\n }\n\n return new MongoSchemaIR(collections);\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { parseMarkerRowSafely } from '@prisma-next/errors/execution';\nimport { type } from 'arktype';\n\nexport const COLLECTION = '_prisma_migrations';\nexport const MONGO_MARKER_COLLECTION = `_prisma_migrations marker documents in ${COLLECTION}`;\nexport const MONGO_LEDGER_COLLECTION = `_prisma_migrations ledger documents in ${COLLECTION}`;\n\nconst MongoMarkerDocSchema = type({\n space: 'string',\n storageHash: 'string',\n profileHash: 'string',\n 'contractJson?': 'unknown | null',\n 'canonicalVersion?': 'number | null',\n 'updatedAt?': 'Date',\n 'appTag?': 'string | null',\n 'meta?': type({ '[string]': 'unknown' }).or('null'),\n 'invariants?': type('string').array(),\n '+': 'delete',\n});\n\nexport function parseMongoMarkerDoc(doc: unknown): ContractMarkerRecord {\n const result = MongoMarkerDocSchema(doc);\n if (result instanceof type.errors) {\n throw new Error(`Invalid marker doc on ${COLLECTION}: ${result.summary}`);\n }\n return {\n storageHash: result.storageHash,\n profileHash: result.profileHash,\n contractJson: result.contractJson ?? null,\n canonicalVersion: result.canonicalVersion ?? null,\n updatedAt: result.updatedAt ?? new Date(),\n appTag: result.appTag ?? null,\n meta: result.meta ?? {},\n invariants: result.invariants ?? [],\n };\n}\n\nexport function parseMongoMarkerDocSafely(doc: unknown, space: string): ContractMarkerRecord {\n return parseMarkerRowSafely(doc, parseMongoMarkerDoc, {\n space,\n markerLocation: MONGO_MARKER_COLLECTION,\n });\n}\n","/**\n * Document shape of the `_prisma_migrations` collection, which stores both the\n * per-space contract **markers** (`space` / `storageHash` / … / `invariants`)\n * and the migration **ledger** entries (`type` / `edgeId` / … / `appliedAt`) —\n * so the shape is their union. Declared once so the contract-free field\n * accessor is typed without threading a contract, codecs, or paths at the call\n * sites.\n */\nexport type MarkerLedgerDocShape = {\n readonly _id: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n // Marker fields\n readonly space: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly storageHash: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly profileHash: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly contractJson: { readonly codecId: 'mongo/string@1'; readonly nullable: true };\n readonly canonicalVersion: { readonly codecId: 'mongo/double@1'; readonly nullable: true };\n readonly updatedAt: { readonly codecId: 'mongo/date@1'; readonly nullable: false };\n readonly appTag: { readonly codecId: 'mongo/string@1'; readonly nullable: true };\n readonly meta: { readonly codecId: 'mongo/document@1'; readonly nullable: true };\n readonly invariants: { readonly codecId: 'mongo/array@1'; readonly nullable: false };\n // Ledger fields\n readonly type: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly edgeId: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly from: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly to: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly migrationName: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly migrationHash: { readonly codecId: 'mongo/string@1'; readonly nullable: false };\n readonly operations: { readonly codecId: 'mongo/array@1'; readonly nullable: false };\n readonly appliedAt: { readonly codecId: 'mongo/date@1'; readonly nullable: false };\n};\n\nexport const MARKER_LEDGER_COLLECTION = '_prisma_migrations';\n","import type { ControlDriverInstance } from '@prisma-next/framework-components/control';\nimport type { MongoControlDriverInstance } from '@prisma-next/mongo-lowering';\n\nexport function isMongoControlDriver(\n driver: ControlDriverInstance<'mongo', string>,\n): driver is MongoControlDriverInstance {\n return (\n driver.familyId === 'mongo' &&\n driver.targetId === 'mongo' &&\n 'execute' in driver &&\n typeof driver.execute === 'function'\n );\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport type { MongoControlAdapter } from '@prisma-next/family-mongo/control-adapter';\nimport type {\n ControlDriverInstance,\n ControlFamilyInstance,\n} from '@prisma-next/framework-components/control';\nimport type { MongoAdapter, MongoDriver } from '@prisma-next/mongo-lowering';\nimport type {\n AnyMongoDdlCommand,\n MongoInspectionCommandVisitor,\n} from '@prisma-next/mongo-query-ast/control';\nimport type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';\nimport type { Db } from 'mongodb';\nimport { createMongoAdapter } from '../mongo-adapter';\nimport { MongoInspectionExecutor } from './inspection-executor';\nimport { MongoControlAdapterImpl } from './mongo-control-adapter';\nimport { isMongoControlDriver } from './mongo-control-driver';\n\nexport function extractDb(driver: ControlDriverInstance<'mongo', 'mongo'>): Db {\n if (!isMongoControlDriver(driver)) {\n throw new Error(\n 'Expected a Mongo control driver created by ' +\n 'mongoControlDriver.create() from `@prisma-next/driver-mongo/control`.',\n );\n }\n return driver.db;\n}\n\n/**\n * Marker / ledger operations the Mongo runner depends on. Every method\n * takes a `space` parameter so each loaded contract space addresses its\n * own marker row independently — see ADR 212 for the per-space\n * mechanism.\n */\nexport interface MarkerOperations {\n readMarker(space: string): Promise<ContractMarkerRecord | null>;\n initMarker(\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void>;\n updateMarker(\n space: string,\n expectedFrom: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<boolean>;\n writeLedgerEntry(\n space: string,\n entry: {\n readonly edgeId: string;\n readonly from: string;\n readonly to: string;\n readonly migrationName: string;\n readonly migrationHash: string;\n readonly operations: readonly unknown[];\n },\n ): Promise<void>;\n}\n\nexport interface MongoRunnerDependencies {\n readonly inspectionExecutor: MongoInspectionCommandVisitor<Promise<Record<string, unknown>[]>>;\n readonly adapter: MongoAdapter;\n readonly driver: MongoDriver;\n readonly executeDdl: (command: AnyMongoDdlCommand) => Promise<void>;\n readonly markerOps: MarkerOperations;\n readonly introspectSchema: () => Promise<MongoSchemaIR>;\n}\n\n/**\n * Build the runner-dependencies envelope. `controlAdapter` is the\n * dispatch surface for wire-level Mongo CAS operations (marker reads,\n * marker advances, ledger appends, introspection); the envelope's\n * `markerOps` shim simply forwards each call through it. When the\n * caller already has a `MongoControlAdapter` on the control stack it\n * can pass it in; otherwise a default `MongoControlAdapterImpl` is\n * constructed locally.\n */\nexport function createMongoRunnerDeps(\n controlDriver: ControlDriverInstance<'mongo', 'mongo'>,\n driver: MongoDriver,\n // Vestigial after the family→adapter SPI refactor: the runner dependencies\n // now route every wire-level call through `controlAdapter`, so the `family`\n // instance is no longer consulted. Kept on the signature to avoid rippling\n // through ~14 call sites; a follow-up that already touches this factory\n // should drop the parameter outright.\n _family: ControlFamilyInstance<'mongo', MongoSchemaIR>,\n controlAdapter: MongoControlAdapter<'mongo'> = new MongoControlAdapterImpl(),\n): MongoRunnerDependencies {\n const adapter = createMongoAdapter();\n return {\n inspectionExecutor: new MongoInspectionExecutor(extractDb(controlDriver)),\n adapter,\n driver,\n executeDdl: (command) => adapter.lower({ command }, {}).then((wire) => driver.run(wire)),\n markerOps: {\n readMarker: (space) => controlAdapter.readMarker(controlDriver, space),\n initMarker: (space, dest) => controlAdapter.initMarker(controlDriver, space, dest),\n updateMarker: (space, expectedFrom, dest) =>\n controlAdapter.updateMarker(controlDriver, space, expectedFrom, dest),\n writeLedgerEntry: (space, entry) =>\n controlAdapter.writeLedgerEntry(controlDriver, space, entry),\n },\n introspectSchema: () => controlAdapter.introspectSchema(controlDriver),\n };\n}\n","import type { ContractMarkerRecord, LedgerEntryRecord } from '@prisma-next/contract/types';\nimport { withMarkerReadErrorHandling } from '@prisma-next/errors/execution';\nimport type { MongoControlAdapter } from '@prisma-next/family-mongo/control-adapter';\nimport type { ControlDriverInstance } from '@prisma-next/framework-components/control';\nimport { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';\nimport type { MongoAdapter, MongoDriver } from '@prisma-next/mongo-lowering';\nimport type { AnyMongoDdlCommand } from '@prisma-next/mongo-query-ast/control';\nimport {\n type AnyMongoCommand,\n MongoAggFieldRef,\n MongoAggLiteral,\n MongoAggOperator,\n type MongoQueryPlan,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { expr, fn } from '@prisma-next/mongo-query-builder';\nimport { collection } from '@prisma-next/mongo-query-builder/contract-free';\nimport type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';\nimport type { MongoValue } from '@prisma-next/mongo-value';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport type { Document } from 'mongodb';\nimport { createMongoAdapter } from '../mongo-adapter';\nimport { introspectSchema } from './introspect-schema';\nimport {\n MONGO_LEDGER_COLLECTION,\n MONGO_MARKER_COLLECTION,\n parseMongoMarkerDocSafely,\n} from './marker-ledger';\nimport { MARKER_LEDGER_COLLECTION, type MarkerLedgerDocShape } from './marker-ledger-collection';\nimport { isMongoControlDriver } from './mongo-control-driver';\nimport { extractDb } from './runner-deps';\n\n/**\n * Mongo control adapter for control-plane operations like introspection\n * and marker-ledger CAS. Implements the family-level `MongoControlAdapter`\n * SPI. Every marker/ledger operation builds a canonical command inline via\n * the contract-free fluent builder and dispatches it through the family\n * adapter's lowering path (`createMongoAdapter().lower(plan, {})`) onto the\n * Mongo wire transport (`driver.execute(wireCommand)`) — the same route SQL\n * marker/ledger ops take through `adapter.lower()` → `driver.query()`.\n */\nexport class MongoControlAdapterImpl implements MongoControlAdapter<'mongo'> {\n readonly familyId = 'mongo' as const;\n readonly targetId = 'mongo' as const;\n readonly #adapter: MongoAdapter = createMongoAdapter();\n readonly #markerLedgerCollection = collection<MarkerLedgerDocShape>(MARKER_LEDGER_COLLECTION);\n\n async #execute(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n command: AnyMongoCommand,\n ): Promise<Document[]> {\n const plan: MongoQueryPlan = {\n collection: MARKER_LEDGER_COLLECTION,\n command,\n meta: { target: 'mongo', targetFamily: 'mongo', storageHash: '', lane: 'control' },\n };\n const wireCommand = await this.#adapter.lower(plan, {});\n if (!isMongoControlDriver(driver)) {\n throw new Error(\n 'Mongo control adapter requires a Mongo control driver with an execute() transport. ' +\n 'Provide a MongoControlDriver from `@prisma-next/driver-mongo/control`.',\n );\n }\n const rows: Document[] = [];\n for await (const row of driver.execute<Document>(wireCommand)) {\n rows.push(row);\n }\n return rows;\n }\n\n async executeDdl(driver: MongoDriver, command: AnyMongoDdlCommand): Promise<void> {\n const wire = await this.#adapter.lower({ command }, {});\n await driver.run(wire);\n }\n\n /**\n * Server-side invariant-merge aggregation expression:\n * `$sortArray({ input: $setUnion([$ifNull('$invariants', []), incoming]), sortBy: 1 })`.\n *\n * Built through the typed agg-expr layer — `fn.setUnion` plus the generic\n * `MongoAggOperator` for `$ifNull` / `$sortArray` (neither has a named `fn`\n * helper). Returns a `MongoAggOperator` that is passed directly to\n * `f.stage.set({ invariants: ... })` in the update pipeline.\n */\n #invariantMergeExpr(incoming: readonly string[]): MongoAggOperator {\n const existingOrEmpty = MongoAggOperator.of('$ifNull', [\n MongoAggFieldRef.of('invariants'),\n MongoAggLiteral.of([]),\n ]);\n const merged = fn.setUnion(\n { _field: { codecId: 'mongo/array@1', nullable: false }, node: existingOrEmpty },\n {\n _field: { codecId: 'mongo/array@1', nullable: false },\n node: MongoAggLiteral.of([...incoming]),\n },\n );\n return MongoAggOperator.of('$sortArray', { input: merged.node, sortBy: MongoAggLiteral.of(1) });\n }\n\n async readMarker(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n ): Promise<ContractMarkerRecord | null> {\n const markerContext = { space, markerLocation: MONGO_MARKER_COLLECTION };\n const docs = await withMarkerReadErrorHandling(\n () =>\n this.#execute(\n driver,\n this.#markerLedgerCollection\n .aggregate()\n .match((f) => f._id.eq(space))\n .match((f) => f.space.eq(space))\n .limit(1)\n .build(),\n ),\n markerContext,\n );\n const doc = docs[0];\n if (!doc) return null;\n return parseMongoMarkerDocSafely(doc, space);\n }\n\n async readAllMarkers(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const markerContext = { space: 'app', markerLocation: MONGO_MARKER_COLLECTION };\n const docs = await withMarkerReadErrorHandling(\n () =>\n this.#execute(\n driver,\n this.#markerLedgerCollection\n .aggregate()\n .match((f) => f._id.type('string'))\n .match((f) => f.space.type('string'))\n .match((f) => expr(fn.eq(f._id, f.space)))\n .build(),\n ),\n markerContext,\n );\n const out = new Map<string, ContractMarkerRecord>();\n for (const doc of docs) {\n const space = doc['space'];\n /* v8 ignore next -- @preserve type-narrowing guard: the $match stage above filters on `space: { $type: 'string' }`, so this branch is unreachable at runtime. The check exists so the `out.set(space, ...)` call below can accept `string`. */\n if (typeof space !== 'string') continue;\n out.set(space, parseMongoMarkerDocSafely(doc, space));\n }\n return out;\n }\n\n async initMarker(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<void> {\n const document: Record<string, MongoValue> = {\n _id: space,\n space,\n storageHash: destination.storageHash,\n profileHash: destination.profileHash,\n contractJson: null,\n canonicalVersion: null,\n updatedAt: new Date(),\n appTag: null,\n meta: {},\n invariants: [...(destination.invariants ?? [])],\n };\n await this.#execute(driver, this.#markerLedgerCollection.insertOne(document));\n }\n\n async updateMarker(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n expectedFrom: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n ): Promise<boolean> {\n const { invariants } = destination;\n const docs = await this.#execute(\n driver,\n this.#markerLedgerCollection\n .match((f) => f._id.eq(space))\n .match((f) => f.space.eq(space))\n .match((f) => f.storageHash.eq(expectedFrom))\n .findOneAndUpdate(\n (f) => [\n f.stage.set(\n invariants === undefined\n ? {\n storageHash: MongoAggLiteral.of(destination.storageHash),\n profileHash: MongoAggLiteral.of(destination.profileHash),\n updatedAt: MongoAggLiteral.of(new Date()),\n }\n : {\n storageHash: MongoAggLiteral.of(destination.storageHash),\n profileHash: MongoAggLiteral.of(destination.profileHash),\n updatedAt: MongoAggLiteral.of(new Date()),\n invariants: this.#invariantMergeExpr(invariants),\n },\n ),\n ],\n { upsert: false },\n ),\n );\n return docs.length > 0;\n }\n\n async writeLedgerEntry(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n entry: {\n readonly edgeId: string;\n readonly from: string;\n readonly to: string;\n readonly migrationName: string;\n readonly migrationHash: string;\n readonly operations: readonly unknown[];\n },\n ): Promise<void> {\n const document: Record<string, MongoValue> = {\n type: 'ledger',\n space,\n edgeId: entry.edgeId,\n from: entry.from,\n to: entry.to,\n migrationName: entry.migrationName,\n migrationHash: entry.migrationHash,\n operations: blindCast<ReadonlyArray<MongoValue>, 'ledger operation docs are BSON values'>(\n entry.operations,\n ),\n appliedAt: new Date(),\n };\n await this.#execute(driver, this.#markerLedgerCollection.insertOne(document));\n }\n\n async readLedger(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space?: string,\n ): Promise<readonly LedgerEntryRecord[]> {\n const ledgerContext = { space: space ?? '*', markerLocation: MONGO_LEDGER_COLLECTION };\n const chain = this.#markerLedgerCollection.aggregate().match((f) => f.type.eq('ledger'));\n const command =\n space === undefined\n ? chain.sort({ _id: 1 }).build()\n : chain\n .match((f) => f.space.eq(space))\n .sort({ _id: 1 })\n .build();\n const docs = await withMarkerReadErrorHandling(\n () => this.#execute(driver, command),\n ledgerContext,\n );\n\n const entries: LedgerEntryRecord[] = [];\n for (const doc of docs) {\n const migrationName = doc['migrationName'];\n const migrationHash = doc['migrationHash'];\n const from = doc['from'];\n const to = doc['to'];\n const docSpace = doc['space'];\n if (typeof migrationName !== 'string' || typeof migrationHash !== 'string') {\n continue;\n }\n if (typeof from !== 'string' || typeof to !== 'string') {\n continue;\n }\n if (typeof docSpace !== 'string') {\n continue;\n }\n const appliedAt = doc['appliedAt'];\n const appliedAtDate =\n appliedAt instanceof Date\n ? appliedAt\n : appliedAt !== undefined\n ? new Date(String(appliedAt))\n : new Date();\n const operations = doc['operations'];\n const opList = Array.isArray(operations) ? operations : [];\n entries.push({\n space: docSpace,\n migrationName,\n migrationHash,\n from: ledgerOriginFromStored(from),\n to,\n appliedAt: appliedAtDate,\n operationCount: opList.length,\n });\n }\n return entries;\n }\n\n async introspectSchema(driver: ControlDriverInstance<'mongo', 'mongo'>): Promise<MongoSchemaIR> {\n return introspectSchema(extractDb(driver));\n }\n}\n","import type { MongoControlAdapterDescriptor } from '@prisma-next/family-mongo/control-adapter';\nimport type { MongoControlDriverInstance } from '@prisma-next/mongo-lowering';\n\nexport { MongoInspectionExecutor } from '../core/inspection-executor';\nexport { introspectSchema } from '../core/introspect-schema';\nexport { MongoControlAdapterImpl } from '../core/mongo-control-adapter';\nexport { isMongoControlDriver } from '../core/mongo-control-driver';\nexport {\n createMongoRunnerDeps,\n extractDb,\n type MarkerOperations,\n type MongoRunnerDependencies,\n} from '../core/runner-deps';\nexport { createMongoAdapter } from '../mongo-adapter';\nexport type { MongoControlDriverInstance };\n\nimport { mongoCodecDescriptors } from '../core/codecs';\nimport { MongoControlAdapterImpl } from '../core/mongo-control-adapter';\n\nexport const mongoAdapterDescriptor: MongoControlAdapterDescriptor<'mongo'> = {\n kind: 'adapter',\n id: 'mongo',\n familyId: 'mongo',\n targetId: 'mongo',\n version: '0.0.1',\n scalarTypeDescriptors: new Map([\n ['String', 'mongo/string@1'],\n ['Int', 'mongo/int32@1'],\n ['Boolean', 'mongo/bool@1'],\n ['DateTime', 'mongo/date@1'],\n ['ObjectId', 'mongo/objectId@1'],\n ['Float', 'mongo/double@1'],\n ]),\n types: {\n codecTypes: {\n codecDescriptors: mongoCodecDescriptors,\n import: {\n package: '@prisma-next/adapter-mongo/codec-types',\n named: 'CodecTypes',\n alias: 'MongoCodecTypes',\n },\n typeImports: [\n {\n package: '@prisma-next/adapter-mongo/codec-types',\n named: 'Vector',\n alias: 'Vector',\n },\n ],\n },\n },\n create(_stack) {\n return new MongoControlAdapterImpl();\n },\n};\n\nexport default mongoAdapterDescriptor;\n"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as lowerFilter, c as MONGO_VECTOR_CODEC_ID, i as lowerAggExpr, o as lowerPipeline, s as lowerStage, t as createMongoAdapter } from "./mongo-adapter-
|
|
1
|
+
import { a as lowerFilter, c as MONGO_VECTOR_CODEC_ID, i as lowerAggExpr, o as lowerPipeline, s as lowerStage, t as createMongoAdapter } from "./mongo-adapter-CORsfDZK.mjs";
|
|
2
2
|
//#region src/core/operations.ts
|
|
3
3
|
const mongoVectorNearOperation = Object.freeze({
|
|
4
4
|
self: { codecId: MONGO_VECTOR_CODEC_ID },
|
|
@@ -2,7 +2,8 @@ import { isExprArray, isRecordArgs } from "@prisma-next/mongo-query-ast/executio
|
|
|
2
2
|
import { blindCast } from "@prisma-next/utils/casts";
|
|
3
3
|
import { checkAborted, raceAgainstAbort, runtimeError } from "@prisma-next/framework-components/runtime";
|
|
4
4
|
import { MongoParamRef } from "@prisma-next/mongo-value";
|
|
5
|
-
import {
|
|
5
|
+
import { keysToKeySpec } from "@prisma-next/mongo-query-ast/control";
|
|
6
|
+
import { AggregateWireCommand, CollModWireCommand, CreateCollectionWireCommand, CreateIndexWireCommand, DeleteManyWireCommand, DeleteOneWireCommand, DropCollectionWireCommand, DropIndexWireCommand, FindOneAndDeleteWireCommand, FindOneAndUpdateWireCommand, InsertManyWireCommand, InsertOneWireCommand, UpdateManyWireCommand, UpdateOneWireCommand } from "@prisma-next/mongo-wire";
|
|
6
7
|
import { voidParamsSchema } from "@prisma-next/framework-components/codec";
|
|
7
8
|
import { mongoCodec, newMongoCodecRegistry } from "@prisma-next/mongo-codec";
|
|
8
9
|
import { ObjectId } from "mongodb";
|
|
@@ -753,6 +754,17 @@ async function resolveUpdate(update, codecs, ctx) {
|
|
|
753
754
|
if (isDraftUpdatePipeline(update)) return Promise.all(update.map((stage) => resolveDraftDoc(stage, codecs, ctx)));
|
|
754
755
|
return resolveDraftDoc(update, codecs, ctx);
|
|
755
756
|
}
|
|
757
|
+
function lowerDdlCommand(command) {
|
|
758
|
+
switch (command.kind) {
|
|
759
|
+
case "createCollection": return new CreateCollectionWireCommand(command.collection, command);
|
|
760
|
+
case "createIndex": return new CreateIndexWireCommand(command.collection, keysToKeySpec(command.keys), command);
|
|
761
|
+
case "dropCollection": return new DropCollectionWireCommand(command.collection);
|
|
762
|
+
case "dropIndex": return new DropIndexWireCommand(command.collection, command.name);
|
|
763
|
+
case "collMod": return new CollModWireCommand(command.collection, command);
|
|
764
|
+
// v8 ignore next 4
|
|
765
|
+
default: throw new Error(`Unknown DDL command kind: ${blindCast(command).kind}`);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
756
768
|
var MongoAdapterImpl = class {
|
|
757
769
|
#codecs;
|
|
758
770
|
constructor(codecs) {
|
|
@@ -905,7 +917,8 @@ var MongoAdapterImpl = class {
|
|
|
905
917
|
}
|
|
906
918
|
}
|
|
907
919
|
lower(plan, ctx) {
|
|
908
|
-
return this.resolveParams(this.structuralLower(plan), ctx);
|
|
920
|
+
if ("collection" in plan) return this.resolveParams(this.structuralLower(plan), ctx);
|
|
921
|
+
return Promise.resolve(lowerDdlCommand(plan.command));
|
|
909
922
|
}
|
|
910
923
|
};
|
|
911
924
|
/**
|
|
@@ -923,4 +936,4 @@ function createMongoAdapter() {
|
|
|
923
936
|
//#endregion
|
|
924
937
|
export { lowerFilter as a, MONGO_VECTOR_CODEC_ID as c, lowerAggExpr as i, buildStandardCodecRegistry as n, lowerPipeline as o, mongoCodecDescriptors as r, lowerStage as s, createMongoAdapter as t };
|
|
925
938
|
|
|
926
|
-
//# sourceMappingURL=mongo-adapter-
|
|
939
|
+
//# sourceMappingURL=mongo-adapter-CORsfDZK.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo-adapter-ifsSo1o1.mjs","names":["_exhaustive","#codecs","_exhaustive"],"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 { CodecCallContext } from '@prisma-next/framework-components/codec';\nimport {\n checkAborted,\n raceAgainstAbort,\n runtimeError,\n} from '@prisma-next/framework-components/runtime';\nimport type { MongoCodecRegistry } from '@prisma-next/mongo-codec';\nimport type { Document, MongoValue } from '@prisma-next/mongo-value';\nimport { MongoParamRef } from '@prisma-next/mongo-value';\nimport { blindCast } from '@prisma-next/utils/casts';\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 *\n * `ctx: CodecCallContext` is forwarded verbatim to every\n * `codec.encode(value, ctx)` call. The same `ctx` reference is also passed\n * to nested `resolveValue` invocations so codec authors observe **signal\n * identity** across the entire recursive walk for one `runtime.execute()`.\n *\n * Abort observation (only when `ctx.signal` is provided):\n *\n * - **Already-aborted at entry** — every recursive call pre-checks\n * `ctx.signal.aborted` and short-circuits with\n * `RUNTIME.ABORTED { phase: 'encode' }` before any codec is invoked.\n * - **Mid-flight abort** — each per-level `Promise.all` races against the\n * signal via `raceAgainstAbort`. The runtime returns\n * `RUNTIME.ABORTED { phase: 'encode' }` promptly even if codec bodies\n * ignore the signal; in-flight bodies run to completion in the background\n * (cooperative cancellation, see ADR 204).\n * - `RUNTIME.ENCODE_FAILED` envelopes thrown by a codec body before the\n * runtime sees the abort pass through unchanged (AC-ERR4).\n */\nexport async function resolveValue(\n value: MongoValue,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<unknown> {\n checkAborted(ctx, 'encode');\n const signal = ctx.signal;\n\n if (value instanceof MongoParamRef) {\n if (value.codecId) {\n const codec = codecs.get(value.codecId);\n if (codec?.encode) {\n try {\n // Race even leaf scalar encodes against the signal so a leaf\n // `MongoParamRef` (e.g. a simple field filter, or any leaf reached\n // from `MongoAdapterImpl.#resolveDocument()` outside an enclosing\n // `Promise.all`) surfaces `RUNTIME.ABORTED` promptly instead of\n // blocking on a slow codec body.\n const encoded = codec.encode(value.value, ctx);\n return await raceAgainstAbort(encoded, signal, 'encode');\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 const tasks = Promise.all(value.map((v) => resolveValue(v, codecs, ctx)));\n return raceAgainstAbort(tasks, signal, 'encode');\n }\n const entries = Object.entries(value);\n const all = Promise.all(entries.map(([, val]) => resolveValue(val, codecs, ctx)));\n const resolved = await raceAgainstAbort(all, signal, 'encode');\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/**\n * Resolves a draft slot value — which may be `MongoParamRef`, a primitive, a\n * nested plain-object, or an array — into the corresponding wire value.\n * Mirrors `resolveValue`'s traversal strategy but accepts `unknown` so it can\n * handle pipeline stage documents whose field types cannot be narrowed to\n * `MongoValue` statically (e.g. `$geoNear.near: unknown`).\n */\nasync function resolveDraftSlot(\n value: unknown,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<unknown> {\n if (value instanceof MongoParamRef) {\n return resolveValue(value, codecs, ctx);\n }\n if (value === null || typeof value !== 'object') return value;\n if (value instanceof Date) return value;\n if (Array.isArray(value)) {\n const tasks = Promise.all(value.map((v: unknown) => resolveDraftSlot(v, codecs, ctx)));\n return raceAgainstAbort(tasks, ctx.signal, 'encode');\n }\n return resolveDraftDoc(\n blindCast<\n Record<string, unknown>,\n 'narrowed by instanceof/typeof guards: non-null, non-Date, non-array object'\n >(value),\n codecs,\n ctx,\n );\n}\n\n/**\n * Resolves a pipeline stage draft document by walking every entry and\n * forwarding to {@link resolveDraftSlot}. Used by `MongoAdapterImpl.resolveParams`\n * for aggregate pipeline stages, which carry `unknown`-typed fields (e.g.\n * `$geoNear.near`) alongside filter sub-documents that may contain\n * `MongoParamRef` leaves.\n */\nexport async function resolveDraftDoc(\n doc: Record<string, unknown>,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<Document> {\n checkAborted(ctx, 'encode');\n const entries = Object.entries(doc);\n const all = Promise.all(entries.map(([, val]) => resolveDraftSlot(val, codecs, ctx)));\n const resolved = await raceAgainstAbort(all, ctx.signal, 'encode');\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 isErrorWithCode(error: unknown): error is Error & { code: unknown } {\n return error instanceof Error && 'code' in error;\n}\n\nfunction isAlreadyEncodeFailure(error: unknown): boolean {\n return isErrorWithCode(error) && error.code === 'RUNTIME.ENCODE_FAILED';\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 { CodecCallContext } from '@prisma-next/framework-components/codec';\nimport 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 { blindCast } from '@prisma-next/utils/casts';\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\n/**\n * Structural phase of filter lowering: transforms the filter AST into a\n * plain object without resolving any `MongoParamRef` leaves. Field filter\n * values remain as `MongoValue` (which includes `MongoParamRef`), so the\n * returned document can be passed to `resolveDraftDoc` in the resolve phase.\n * Synchronous — no codec calls.\n */\nexport function structuralLowerFilter(filter: MongoFilterExpr): Record<string, unknown> {\n switch (filter.kind) {\n case 'field':\n return { [filter.field]: { [filter.op]: filter.value } };\n case 'and':\n return { $and: filter.exprs.map((e) => structuralLowerFilter(e)) };\n case 'or':\n return { $or: filter.exprs.map((e) => structuralLowerFilter(e)) };\n case 'not':\n return { $nor: [structuralLowerFilter(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(\n `Unhandled filter kind: ${blindCast<MongoFilterExpr, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n}\n\nexport async function lowerFilter(\n filter: MongoFilterExpr,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<Document> {\n switch (filter.kind) {\n case 'field':\n return { [filter.field]: { [filter.op]: await resolveValue(filter.value, codecs, ctx) } };\n case 'and':\n return { $and: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs, ctx))) };\n case 'or':\n return { $or: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs, ctx))) };\n case 'not':\n return { $nor: [await lowerFilter(filter.expr, codecs, ctx)] };\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(\n `Unhandled filter kind: ${blindCast<MongoFilterExpr, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n}\n\nfunction isAggExprNode(value: object): value is MongoAggExpr {\n return 'accept' in value && typeof value.accept === 'function';\n}\n\nfunction isAggExprArray(\n val: MongoAggExpr | ReadonlyArray<MongoAggExpr>,\n): val is ReadonlyArray<MongoAggExpr> {\n return Array.isArray(val);\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 (isAggExprArray(val)) {\n result[key] = val.map((v) => lowerAggExpr(v));\n } else {\n result[key] = lowerAggExpr(val);\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 ctx: CodecCallContext,\n): Promise<Record<string, unknown>> {\n switch (stage.kind) {\n case 'match':\n return { $match: await lowerFilter(stage.filter, codecs, ctx) };\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(\n stage.pipeline.map((s) => lowerStage(s, codecs, ctx)),\n );\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(\n stage.pipeline.map((s) => lowerStage(s, codecs, ctx)),\n );\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, ctx);\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]) =>\n Promise.all(pipeline.map((s) => lowerStage(s, codecs, ctx))),\n ),\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 ctx,\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, ctx)))\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(\n `Unhandled stage kind: ${blindCast<MongoPipelineStage, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n}\n\nexport async function lowerPipeline(\n stages: ReadonlyArray<MongoPipelineStage>,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<Array<Record<string, unknown>>> {\n return Promise.all(stages.map((s) => lowerStage(s, codecs, ctx)));\n}\n\n/**\n * Structural phase of stage lowering: mirrors `lowerStage` but defers all\n * `MongoParamRef` resolution. Filter sub-documents within stages (e.g.\n * `$match`, `$geoNear.query`, `$graphLookup.restrictSearchWithMatch`) are\n * produced by `structuralLowerFilter` and therefore retain `MongoParamRef`\n * leaves. Sub-pipelines (e.g. `$lookup.pipeline`, `$facet.*`) recurse via\n * `structuralLowerPipeline`. Synchronous — no codec calls.\n */\nexport function structuralLowerStage(stage: MongoPipelineStage): Record<string, unknown> {\n switch (stage.kind) {\n case 'match':\n return { $match: structuralLowerFilter(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'] = structuralLowerPipeline(stage.pipeline);\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'] = structuralLowerPipeline(stage.pipeline);\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'] = structuralLowerFilter(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] = structuralLowerPipeline(pipeline);\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'] = structuralLowerFilter(\n stage.restrictSearchWithMatch,\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 ? structuralLowerPipeline(stage.whenMatched)\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(\n `Unhandled stage kind: ${blindCast<MongoPipelineStage, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n}\n\nexport function structuralLowerPipeline(\n stages: ReadonlyArray<MongoPipelineStage>,\n): Array<Record<string, unknown>> {\n return stages.map((s) => structuralLowerStage(s));\n}\n","import type { CodecDescriptor, CodecTrait } from '@prisma-next/framework-components/codec';\nimport { voidParamsSchema } from '@prisma-next/framework-components/codec';\nimport {\n type MongoCodec,\n type MongoCodecRegistry,\n mongoCodec,\n newMongoCodecRegistry,\n} 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 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 decode: (wire: string) => wire,\n encode: (value: string) => value,\n});\n\nexport const mongoDoubleCodec = mongoCodec({\n typeId: MONGO_DOUBLE_CODEC_ID,\n decode: (wire: number) => wire,\n encode: (value: number) => value,\n});\n\nexport const mongoInt32Codec = mongoCodec({\n typeId: MONGO_INT32_CODEC_ID,\n decode: (wire: number) => wire,\n encode: (value: number) => value,\n});\n\nexport const mongoBooleanCodec = mongoCodec({\n typeId: MONGO_BOOLEAN_CODEC_ID,\n decode: (wire: boolean) => wire,\n encode: (value: boolean) => value,\n});\n\nexport const mongoDateCodec = mongoCodec({\n typeId: MONGO_DATE_CODEC_ID,\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 decode: (wire: readonly number[]) => wire,\n encode: (value: readonly number[]) => value,\n});\n\n/**\n * The canonical set of Mongo wire-type codecs.\n *\n * Single source of truth for both control- and runtime-plane adapter descriptors. Don't duplicate this list — import it.\n */\nexport const mongoStandardCodecs = [\n mongoObjectIdCodec,\n mongoStringCodec,\n mongoDoubleCodec,\n mongoInt32Codec,\n mongoBooleanCodec,\n mongoDateCodec,\n mongoVectorCodec,\n] as const;\n\n/**\n * Build a {@link CodecDescriptor} for a Mongo wire-type codec.\n *\n * Wraps an existing {@link MongoCodec} instance into a descriptor whose factory hands out the same shared codec. Mongo's full migration to descriptor-first authoring is tracked under TML-2324; for now the descriptor view is composed from the existing `mongoCodec()` outputs.\n */\nfunction descriptorFor<Id extends string>(\n codec: MongoCodec<Id, readonly CodecTrait[]>,\n metadata: {\n readonly traits: readonly CodecTrait[];\n readonly targetTypes: readonly string[];\n readonly renderOutputType?: (typeParams: Record<string, unknown>) => string | undefined;\n },\n): CodecDescriptor {\n // The descriptor's `P` is structurally `Record<string, unknown>` for codecs that take params (Mongo `vector`); non-parameterized codecs ignore the slot. Cast through `unknown` to fit the `CodecDescriptor` slot's `(params: P) => …` typing without leaking a per-codec `P` into the heterogeneous descriptor list.\n const renderOutputType = metadata.renderOutputType as\n | CodecDescriptor['renderOutputType']\n | undefined;\n return {\n codecId: codec.id,\n traits: metadata.traits,\n targetTypes: metadata.targetTypes,\n paramsSchema: voidParamsSchema as CodecDescriptor['paramsSchema'],\n isParameterized: false,\n factory: (() => () => codec) as CodecDescriptor['factory'],\n ...(renderOutputType !== undefined ? { renderOutputType } : {}),\n };\n}\n\nconst renderVectorOutputType = (typeParams: Record<string, unknown>): string | undefined => {\n const length = typeParams['length'];\n if (length === undefined) return undefined;\n if (\n typeof length !== 'number' ||\n !Number.isFinite(length) ||\n !Number.isInteger(length) ||\n length <= 0\n ) {\n throw new Error('renderOutputType: expected positive integer \"length\" for Vector');\n }\n return `Vector<${length}>`;\n};\n\n/**\n * Mongo wire-type codec descriptors. Static metadata for `traits`, `targetTypes`, and `renderOutputType` lives here (the descriptor shape) — `MongoCodec` itself is narrow and only carries the four conversion methods (TML-2357).\n */\nexport const mongoCodecDescriptors: ReadonlyArray<CodecDescriptor> = [\n descriptorFor(mongoObjectIdCodec, { traits: ['equality'], targetTypes: ['objectId'] }),\n descriptorFor(mongoStringCodec, {\n traits: ['equality', 'order', 'textual'],\n targetTypes: ['string'],\n }),\n descriptorFor(mongoDoubleCodec, {\n traits: ['equality', 'order', 'numeric'],\n targetTypes: ['double'],\n }),\n descriptorFor(mongoInt32Codec, {\n traits: ['equality', 'order', 'numeric'],\n targetTypes: ['int'],\n }),\n descriptorFor(mongoBooleanCodec, { traits: ['equality', 'boolean'], targetTypes: ['bool'] }),\n descriptorFor(mongoDateCodec, { traits: ['equality', 'order'], targetTypes: ['date'] }),\n descriptorFor(mongoVectorCodec, {\n traits: ['equality'],\n targetTypes: ['vector'],\n renderOutputType: renderVectorOutputType,\n }),\n];\n\n/**\n * Lookup descriptor metadata by codec id — used by tests and for descriptor-side reads of static metadata.\n */\nexport function mongoDescriptorById(codecId: string): CodecDescriptor | undefined {\n return mongoCodecDescriptors.find((d) => d.codecId === codecId);\n}\n\n/**\n * Build a {@link MongoCodecRegistry} preloaded with the standard Mongo wire-type codecs.\n *\n * Single point of truth for adapter-side codec construction: used by the legacy synchronous `createMongoAdapter()` factory and by the runtime adapter descriptor's `codecs()` getter. Userland code obtains a registry via the framework's execution-stack composition (see `createMongoExecutionContext`) instead of calling this directly.\n */\nexport function buildStandardCodecRegistry(): MongoCodecRegistry {\n const registry = newMongoCodecRegistry();\n for (const codec of mongoStandardCodecs) {\n registry.register(codec);\n }\n return registry;\n}\n","import type { CodecCallContext } from '@prisma-next/framework-components/codec';\nimport type { MongoCodecRegistry } from '@prisma-next/mongo-codec';\nimport type { MongoAdapter, MongoLoweredDraft } from '@prisma-next/mongo-lowering';\nimport type {\n MongoQueryPlan,\n MongoUpdatePipelineStage,\n MongoUpdateSpec,\n} from '@prisma-next/mongo-query-ast/execution';\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 { blindCast } from '@prisma-next/utils/casts';\nimport { buildStandardCodecRegistry } from './core/codecs';\nimport { structuralLowerFilter, structuralLowerPipeline } from './lowering';\nimport { resolveDraftDoc } from './resolve-value';\n\nfunction isUpdatePipeline(\n update: MongoUpdateSpec,\n): update is ReadonlyArray<MongoUpdatePipelineStage> {\n return Array.isArray(update);\n}\n\nfunction isDraftUpdatePipeline(\n update: Record<string, unknown> | ReadonlyArray<Record<string, unknown>>,\n): update is ReadonlyArray<Record<string, unknown>> {\n return Array.isArray(update);\n}\n\nasync function resolveUpdate(\n update: Record<string, unknown> | ReadonlyArray<Record<string, unknown>>,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<Record<string, unknown> | ReadonlyArray<Record<string, unknown>>> {\n if (isDraftUpdatePipeline(update)) {\n return Promise.all(update.map((stage) => resolveDraftDoc(stage, codecs, ctx)));\n }\n return resolveDraftDoc(update, codecs, ctx);\n}\n\nclass MongoAdapterImpl implements MongoAdapter {\n readonly #codecs: MongoCodecRegistry;\n\n constructor(codecs: MongoCodecRegistry) {\n this.#codecs = codecs;\n }\n\n structuralLower(plan: MongoQueryPlan): MongoLoweredDraft {\n const { command } = plan;\n switch (command.kind) {\n case 'insertOne':\n return { kind: 'insertOne', collection: command.collection, document: command.document };\n case 'insertMany':\n return {\n kind: 'insertMany',\n collection: command.collection,\n documents: command.documents,\n };\n case 'updateOne':\n return {\n kind: 'updateOne',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n update: isUpdatePipeline(command.update)\n ? structuralLowerPipeline(command.update)\n : command.update,\n upsert: command.upsert,\n };\n case 'updateMany':\n return {\n kind: 'updateMany',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n update: isUpdatePipeline(command.update)\n ? structuralLowerPipeline(command.update)\n : command.update,\n upsert: command.upsert,\n };\n case 'deleteOne':\n return {\n kind: 'deleteOne',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n };\n case 'deleteMany':\n return {\n kind: 'deleteMany',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n };\n case 'findOneAndUpdate':\n return {\n kind: 'findOneAndUpdate',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n update: isUpdatePipeline(command.update)\n ? structuralLowerPipeline(command.update)\n : command.update,\n upsert: command.upsert,\n sort: command.sort,\n returnDocument: command.returnDocument,\n };\n case 'findOneAndDelete':\n return {\n kind: 'findOneAndDelete',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n sort: command.sort,\n };\n case 'aggregate':\n return {\n kind: 'aggregate',\n collection: command.collection,\n pipeline: structuralLowerPipeline(command.pipeline),\n };\n case 'rawAggregate':\n return { kind: 'rawAggregate', collection: command.collection, pipeline: command.pipeline };\n case 'rawInsertOne':\n return {\n kind: 'rawInsertOne',\n collection: command.collection,\n document: command.document,\n };\n case 'rawInsertMany':\n return {\n kind: 'rawInsertMany',\n collection: command.collection,\n documents: command.documents,\n };\n case 'rawUpdateOne':\n return {\n kind: 'rawUpdateOne',\n collection: command.collection,\n filter: command.filter,\n update: command.update,\n };\n case 'rawUpdateMany':\n return {\n kind: 'rawUpdateMany',\n collection: command.collection,\n filter: command.filter,\n update: command.update,\n };\n case 'rawDeleteOne':\n return { kind: 'rawDeleteOne', collection: command.collection, filter: command.filter };\n case 'rawDeleteMany':\n return { kind: 'rawDeleteMany', collection: command.collection, filter: command.filter };\n case 'rawFindOneAndUpdate':\n return {\n kind: 'rawFindOneAndUpdate',\n collection: command.collection,\n filter: command.filter,\n update: command.update,\n upsert: command.upsert,\n sort: command.sort,\n returnDocument: command.returnDocument,\n };\n case 'rawFindOneAndDelete':\n return {\n kind: 'rawFindOneAndDelete',\n collection: command.collection,\n filter: command.filter,\n sort: command.sort,\n };\n // v8 ignore next 4\n default: {\n const _exhaustive: never = command;\n throw new Error(\n `Unknown command kind: ${blindCast<{ kind: string }, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n }\n\n async resolveParams(\n draft: MongoLoweredDraft,\n ctx: CodecCallContext,\n ): Promise<AnyMongoWireCommand> {\n switch (draft.kind) {\n case 'insertOne':\n return new InsertOneWireCommand(\n draft.collection,\n await resolveDraftDoc(draft.document, this.#codecs, ctx),\n );\n case 'insertMany':\n return new InsertManyWireCommand(\n draft.collection,\n await Promise.all(draft.documents.map((doc) => resolveDraftDoc(doc, this.#codecs, ctx))),\n );\n case 'updateOne': {\n const [filter, update] = await Promise.all([\n resolveDraftDoc(draft.filter, this.#codecs, ctx),\n resolveUpdate(draft.update, this.#codecs, ctx),\n ]);\n return new UpdateOneWireCommand(draft.collection, filter, update, draft.upsert);\n }\n case 'updateMany': {\n const [filter, update] = await Promise.all([\n resolveDraftDoc(draft.filter, this.#codecs, ctx),\n resolveUpdate(draft.update, this.#codecs, ctx),\n ]);\n return new UpdateManyWireCommand(draft.collection, filter, update, draft.upsert);\n }\n case 'deleteOne':\n return new DeleteOneWireCommand(\n draft.collection,\n await resolveDraftDoc(draft.filter, this.#codecs, ctx),\n );\n case 'deleteMany':\n return new DeleteManyWireCommand(\n draft.collection,\n await resolveDraftDoc(draft.filter, this.#codecs, ctx),\n );\n case 'findOneAndUpdate': {\n const [filter, update] = await Promise.all([\n resolveDraftDoc(draft.filter, this.#codecs, ctx),\n resolveUpdate(draft.update, this.#codecs, ctx),\n ]);\n return new FindOneAndUpdateWireCommand(\n draft.collection,\n filter,\n update,\n draft.upsert,\n draft.sort,\n draft.returnDocument,\n );\n }\n case 'findOneAndDelete':\n return new FindOneAndDeleteWireCommand(\n draft.collection,\n await resolveDraftDoc(draft.filter, this.#codecs, ctx),\n draft.sort,\n );\n case 'aggregate':\n return new AggregateWireCommand(\n draft.collection,\n await Promise.all(\n draft.pipeline.map((stage) => resolveDraftDoc(stage, this.#codecs, ctx)),\n ),\n );\n case 'rawAggregate':\n return new AggregateWireCommand(draft.collection, draft.pipeline);\n case 'rawInsertOne':\n return new InsertOneWireCommand(draft.collection, draft.document);\n case 'rawInsertMany':\n return new InsertManyWireCommand(draft.collection, draft.documents);\n case 'rawUpdateOne':\n return new UpdateOneWireCommand(draft.collection, draft.filter, draft.update);\n case 'rawUpdateMany':\n return new UpdateManyWireCommand(draft.collection, draft.filter, draft.update);\n case 'rawDeleteOne':\n return new DeleteOneWireCommand(draft.collection, draft.filter);\n case 'rawDeleteMany':\n return new DeleteManyWireCommand(draft.collection, draft.filter);\n case 'rawFindOneAndUpdate':\n return new FindOneAndUpdateWireCommand(\n draft.collection,\n draft.filter,\n draft.update,\n draft.upsert,\n draft.sort,\n draft.returnDocument,\n );\n case 'rawFindOneAndDelete':\n return new FindOneAndDeleteWireCommand(draft.collection, draft.filter, draft.sort);\n // v8 ignore next 4\n default: {\n const _exhaustive: never = draft;\n throw new Error(\n `Unknown draft kind: ${blindCast<{ kind: string }, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n }\n\n lower(plan: MongoQueryPlan, ctx: CodecCallContext): Promise<AnyMongoWireCommand> {\n return this.resolveParams(this.structuralLower(plan), ctx);\n }\n}\n\n/**\n * Construct a Mongo adapter with the standard wire-type codecs registered\n * for encode-side dispatch (`MongoParamRef.codecId` lookups).\n *\n * The runtime-side codec registry the runtime decodes against is composed\n * separately by `createMongoExecutionContext`. This factory exists for\n * direct adapter use (the runtime descriptor's `create(stack)` calls\n * through it). User code should compose a stack/context instead.\n */\nexport function createMongoAdapter(): MongoAdapter {\n return new MongoAdapterImpl(buildStandardCodecRegistry());\n}\n\n/**\n * Internal escape hatch — direct adapter construction with a caller-supplied\n * codec registry, used only by adapter unit tests that exercise the\n * encode-side codec-dispatch path with synthetic codecs. Not re-exported\n * from the package's public surface and not for production use; production\n * callers compose a `MongoExecutionStack` and `MongoExecutionContext`.\n */\nexport function _unstable_createMongoAdapterWithCodecs(codecs: MongoCodecRegistry): MongoAdapter {\n return new MongoAdapterImpl(codecs);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mongo-adapter-CORsfDZK.mjs","names":["_exhaustive","_exhaustive","#codecs"],"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 { CodecCallContext } from '@prisma-next/framework-components/codec';\nimport {\n checkAborted,\n raceAgainstAbort,\n runtimeError,\n} from '@prisma-next/framework-components/runtime';\nimport type { MongoCodecRegistry } from '@prisma-next/mongo-codec';\nimport type { Document, MongoValue } from '@prisma-next/mongo-value';\nimport { MongoParamRef } from '@prisma-next/mongo-value';\nimport { blindCast } from '@prisma-next/utils/casts';\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 *\n * `ctx: CodecCallContext` is forwarded verbatim to every\n * `codec.encode(value, ctx)` call. The same `ctx` reference is also passed\n * to nested `resolveValue` invocations so codec authors observe **signal\n * identity** across the entire recursive walk for one `runtime.execute()`.\n *\n * Abort observation (only when `ctx.signal` is provided):\n *\n * - **Already-aborted at entry** — every recursive call pre-checks\n * `ctx.signal.aborted` and short-circuits with\n * `RUNTIME.ABORTED { phase: 'encode' }` before any codec is invoked.\n * - **Mid-flight abort** — each per-level `Promise.all` races against the\n * signal via `raceAgainstAbort`. The runtime returns\n * `RUNTIME.ABORTED { phase: 'encode' }` promptly even if codec bodies\n * ignore the signal; in-flight bodies run to completion in the background\n * (cooperative cancellation, see ADR 204).\n * - `RUNTIME.ENCODE_FAILED` envelopes thrown by a codec body before the\n * runtime sees the abort pass through unchanged (AC-ERR4).\n */\nexport async function resolveValue(\n value: MongoValue,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<unknown> {\n checkAborted(ctx, 'encode');\n const signal = ctx.signal;\n\n if (value instanceof MongoParamRef) {\n if (value.codecId) {\n const codec = codecs.get(value.codecId);\n if (codec?.encode) {\n try {\n // Race even leaf scalar encodes against the signal so a leaf\n // `MongoParamRef` (e.g. a simple field filter, or any leaf reached\n // from `MongoAdapterImpl.#resolveDocument()` outside an enclosing\n // `Promise.all`) surfaces `RUNTIME.ABORTED` promptly instead of\n // blocking on a slow codec body.\n const encoded = codec.encode(value.value, ctx);\n return await raceAgainstAbort(encoded, signal, 'encode');\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 const tasks = Promise.all(value.map((v) => resolveValue(v, codecs, ctx)));\n return raceAgainstAbort(tasks, signal, 'encode');\n }\n const entries = Object.entries(value);\n const all = Promise.all(entries.map(([, val]) => resolveValue(val, codecs, ctx)));\n const resolved = await raceAgainstAbort(all, signal, 'encode');\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/**\n * Resolves a draft slot value — which may be `MongoParamRef`, a primitive, a\n * nested plain-object, or an array — into the corresponding wire value.\n * Mirrors `resolveValue`'s traversal strategy but accepts `unknown` so it can\n * handle pipeline stage documents whose field types cannot be narrowed to\n * `MongoValue` statically (e.g. `$geoNear.near: unknown`).\n */\nasync function resolveDraftSlot(\n value: unknown,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<unknown> {\n if (value instanceof MongoParamRef) {\n return resolveValue(value, codecs, ctx);\n }\n if (value === null || typeof value !== 'object') return value;\n if (value instanceof Date) return value;\n if (Array.isArray(value)) {\n const tasks = Promise.all(value.map((v: unknown) => resolveDraftSlot(v, codecs, ctx)));\n return raceAgainstAbort(tasks, ctx.signal, 'encode');\n }\n return resolveDraftDoc(\n blindCast<\n Record<string, unknown>,\n 'narrowed by instanceof/typeof guards: non-null, non-Date, non-array object'\n >(value),\n codecs,\n ctx,\n );\n}\n\n/**\n * Resolves a pipeline stage draft document by walking every entry and\n * forwarding to {@link resolveDraftSlot}. Used by `MongoAdapterImpl.resolveParams`\n * for aggregate pipeline stages, which carry `unknown`-typed fields (e.g.\n * `$geoNear.near`) alongside filter sub-documents that may contain\n * `MongoParamRef` leaves.\n */\nexport async function resolveDraftDoc(\n doc: Record<string, unknown>,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<Document> {\n checkAborted(ctx, 'encode');\n const entries = Object.entries(doc);\n const all = Promise.all(entries.map(([, val]) => resolveDraftSlot(val, codecs, ctx)));\n const resolved = await raceAgainstAbort(all, ctx.signal, 'encode');\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 isErrorWithCode(error: unknown): error is Error & { code: unknown } {\n return error instanceof Error && 'code' in error;\n}\n\nfunction isAlreadyEncodeFailure(error: unknown): boolean {\n return isErrorWithCode(error) && error.code === 'RUNTIME.ENCODE_FAILED';\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 { CodecCallContext } from '@prisma-next/framework-components/codec';\nimport 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 { blindCast } from '@prisma-next/utils/casts';\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\n/**\n * Structural phase of filter lowering: transforms the filter AST into a\n * plain object without resolving any `MongoParamRef` leaves. Field filter\n * values remain as `MongoValue` (which includes `MongoParamRef`), so the\n * returned document can be passed to `resolveDraftDoc` in the resolve phase.\n * Synchronous — no codec calls.\n */\nexport function structuralLowerFilter(filter: MongoFilterExpr): Record<string, unknown> {\n switch (filter.kind) {\n case 'field':\n return { [filter.field]: { [filter.op]: filter.value } };\n case 'and':\n return { $and: filter.exprs.map((e) => structuralLowerFilter(e)) };\n case 'or':\n return { $or: filter.exprs.map((e) => structuralLowerFilter(e)) };\n case 'not':\n return { $nor: [structuralLowerFilter(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(\n `Unhandled filter kind: ${blindCast<MongoFilterExpr, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n}\n\nexport async function lowerFilter(\n filter: MongoFilterExpr,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<Document> {\n switch (filter.kind) {\n case 'field':\n return { [filter.field]: { [filter.op]: await resolveValue(filter.value, codecs, ctx) } };\n case 'and':\n return { $and: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs, ctx))) };\n case 'or':\n return { $or: await Promise.all(filter.exprs.map((e) => lowerFilter(e, codecs, ctx))) };\n case 'not':\n return { $nor: [await lowerFilter(filter.expr, codecs, ctx)] };\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(\n `Unhandled filter kind: ${blindCast<MongoFilterExpr, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n}\n\nfunction isAggExprNode(value: object): value is MongoAggExpr {\n return 'accept' in value && typeof value.accept === 'function';\n}\n\nfunction isAggExprArray(\n val: MongoAggExpr | ReadonlyArray<MongoAggExpr>,\n): val is ReadonlyArray<MongoAggExpr> {\n return Array.isArray(val);\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 (isAggExprArray(val)) {\n result[key] = val.map((v) => lowerAggExpr(v));\n } else {\n result[key] = lowerAggExpr(val);\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 ctx: CodecCallContext,\n): Promise<Record<string, unknown>> {\n switch (stage.kind) {\n case 'match':\n return { $match: await lowerFilter(stage.filter, codecs, ctx) };\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(\n stage.pipeline.map((s) => lowerStage(s, codecs, ctx)),\n );\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(\n stage.pipeline.map((s) => lowerStage(s, codecs, ctx)),\n );\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, ctx);\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]) =>\n Promise.all(pipeline.map((s) => lowerStage(s, codecs, ctx))),\n ),\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 ctx,\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, ctx)))\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(\n `Unhandled stage kind: ${blindCast<MongoPipelineStage, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n}\n\nexport async function lowerPipeline(\n stages: ReadonlyArray<MongoPipelineStage>,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<Array<Record<string, unknown>>> {\n return Promise.all(stages.map((s) => lowerStage(s, codecs, ctx)));\n}\n\n/**\n * Structural phase of stage lowering: mirrors `lowerStage` but defers all\n * `MongoParamRef` resolution. Filter sub-documents within stages (e.g.\n * `$match`, `$geoNear.query`, `$graphLookup.restrictSearchWithMatch`) are\n * produced by `structuralLowerFilter` and therefore retain `MongoParamRef`\n * leaves. Sub-pipelines (e.g. `$lookup.pipeline`, `$facet.*`) recurse via\n * `structuralLowerPipeline`. Synchronous — no codec calls.\n */\nexport function structuralLowerStage(stage: MongoPipelineStage): Record<string, unknown> {\n switch (stage.kind) {\n case 'match':\n return { $match: structuralLowerFilter(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'] = structuralLowerPipeline(stage.pipeline);\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'] = structuralLowerPipeline(stage.pipeline);\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'] = structuralLowerFilter(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] = structuralLowerPipeline(pipeline);\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'] = structuralLowerFilter(\n stage.restrictSearchWithMatch,\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 ? structuralLowerPipeline(stage.whenMatched)\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(\n `Unhandled stage kind: ${blindCast<MongoPipelineStage, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n}\n\nexport function structuralLowerPipeline(\n stages: ReadonlyArray<MongoPipelineStage>,\n): Array<Record<string, unknown>> {\n return stages.map((s) => structuralLowerStage(s));\n}\n","import type { CodecDescriptor, CodecTrait } from '@prisma-next/framework-components/codec';\nimport { voidParamsSchema } from '@prisma-next/framework-components/codec';\nimport {\n type MongoCodec,\n type MongoCodecRegistry,\n mongoCodec,\n newMongoCodecRegistry,\n} 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 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 decode: (wire: string) => wire,\n encode: (value: string) => value,\n});\n\nexport const mongoDoubleCodec = mongoCodec({\n typeId: MONGO_DOUBLE_CODEC_ID,\n decode: (wire: number) => wire,\n encode: (value: number) => value,\n});\n\nexport const mongoInt32Codec = mongoCodec({\n typeId: MONGO_INT32_CODEC_ID,\n decode: (wire: number) => wire,\n encode: (value: number) => value,\n});\n\nexport const mongoBooleanCodec = mongoCodec({\n typeId: MONGO_BOOLEAN_CODEC_ID,\n decode: (wire: boolean) => wire,\n encode: (value: boolean) => value,\n});\n\nexport const mongoDateCodec = mongoCodec({\n typeId: MONGO_DATE_CODEC_ID,\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 decode: (wire: readonly number[]) => wire,\n encode: (value: readonly number[]) => value,\n});\n\n/**\n * The canonical set of Mongo wire-type codecs.\n *\n * Single source of truth for both control- and runtime-plane adapter descriptors. Don't duplicate this list — import it.\n */\nexport const mongoStandardCodecs = [\n mongoObjectIdCodec,\n mongoStringCodec,\n mongoDoubleCodec,\n mongoInt32Codec,\n mongoBooleanCodec,\n mongoDateCodec,\n mongoVectorCodec,\n] as const;\n\n/**\n * Build a {@link CodecDescriptor} for a Mongo wire-type codec.\n *\n * Wraps an existing {@link MongoCodec} instance into a descriptor whose factory hands out the same shared codec. Mongo's full migration to descriptor-first authoring is tracked under TML-2324; for now the descriptor view is composed from the existing `mongoCodec()` outputs.\n */\nfunction descriptorFor<Id extends string>(\n codec: MongoCodec<Id, readonly CodecTrait[]>,\n metadata: {\n readonly traits: readonly CodecTrait[];\n readonly targetTypes: readonly string[];\n readonly renderOutputType?: (typeParams: Record<string, unknown>) => string | undefined;\n },\n): CodecDescriptor {\n // The descriptor's `P` is structurally `Record<string, unknown>` for codecs that take params (Mongo `vector`); non-parameterized codecs ignore the slot. Cast through `unknown` to fit the `CodecDescriptor` slot's `(params: P) => …` typing without leaking a per-codec `P` into the heterogeneous descriptor list.\n const renderOutputType = metadata.renderOutputType as\n | CodecDescriptor['renderOutputType']\n | undefined;\n return {\n codecId: codec.id,\n traits: metadata.traits,\n targetTypes: metadata.targetTypes,\n paramsSchema: voidParamsSchema as CodecDescriptor['paramsSchema'],\n isParameterized: false,\n factory: (() => () => codec) as CodecDescriptor['factory'],\n ...(renderOutputType !== undefined ? { renderOutputType } : {}),\n };\n}\n\nconst renderVectorOutputType = (typeParams: Record<string, unknown>): string | undefined => {\n const length = typeParams['length'];\n if (length === undefined) return undefined;\n if (\n typeof length !== 'number' ||\n !Number.isFinite(length) ||\n !Number.isInteger(length) ||\n length <= 0\n ) {\n throw new Error('renderOutputType: expected positive integer \"length\" for Vector');\n }\n return `Vector<${length}>`;\n};\n\n/**\n * Mongo wire-type codec descriptors. Static metadata for `traits`, `targetTypes`, and `renderOutputType` lives here (the descriptor shape) — `MongoCodec` itself is narrow and only carries the four conversion methods (TML-2357).\n */\nexport const mongoCodecDescriptors: ReadonlyArray<CodecDescriptor> = [\n descriptorFor(mongoObjectIdCodec, { traits: ['equality'], targetTypes: ['objectId'] }),\n descriptorFor(mongoStringCodec, {\n traits: ['equality', 'order', 'textual'],\n targetTypes: ['string'],\n }),\n descriptorFor(mongoDoubleCodec, {\n traits: ['equality', 'order', 'numeric'],\n targetTypes: ['double'],\n }),\n descriptorFor(mongoInt32Codec, {\n traits: ['equality', 'order', 'numeric'],\n targetTypes: ['int'],\n }),\n descriptorFor(mongoBooleanCodec, { traits: ['equality', 'boolean'], targetTypes: ['bool'] }),\n descriptorFor(mongoDateCodec, { traits: ['equality', 'order'], targetTypes: ['date'] }),\n descriptorFor(mongoVectorCodec, {\n traits: ['equality'],\n targetTypes: ['vector'],\n renderOutputType: renderVectorOutputType,\n }),\n];\n\n/**\n * Lookup descriptor metadata by codec id — used by tests and for descriptor-side reads of static metadata.\n */\nexport function mongoDescriptorById(codecId: string): CodecDescriptor | undefined {\n return mongoCodecDescriptors.find((d) => d.codecId === codecId);\n}\n\n/**\n * Build a {@link MongoCodecRegistry} preloaded with the standard Mongo wire-type codecs.\n *\n * Single point of truth for adapter-side codec construction: used by the legacy synchronous `createMongoAdapter()` factory and by the runtime adapter descriptor's `codecs()` getter. Userland code obtains a registry via the framework's execution-stack composition (see `createMongoExecutionContext`) instead of calling this directly.\n */\nexport function buildStandardCodecRegistry(): MongoCodecRegistry {\n const registry = newMongoCodecRegistry();\n for (const codec of mongoStandardCodecs) {\n registry.register(codec);\n }\n return registry;\n}\n","import type { CodecCallContext } from '@prisma-next/framework-components/codec';\nimport type { MongoCodecRegistry } from '@prisma-next/mongo-codec';\nimport type { MongoAdapter, MongoDdlPlan, MongoLoweredDraft } from '@prisma-next/mongo-lowering';\nimport type { AnyMongoDdlCommand } from '@prisma-next/mongo-query-ast/control';\nimport { keysToKeySpec } from '@prisma-next/mongo-query-ast/control';\nimport type {\n MongoQueryPlan,\n MongoUpdatePipelineStage,\n MongoUpdateSpec,\n} from '@prisma-next/mongo-query-ast/execution';\nimport type {\n AnyMongoDdlWireCommand,\n AnyMongoDmlWireCommand,\n AnyMongoWireCommand,\n} from '@prisma-next/mongo-wire';\nimport {\n AggregateWireCommand,\n CollModWireCommand,\n CreateCollectionWireCommand,\n CreateIndexWireCommand,\n DeleteManyWireCommand,\n DeleteOneWireCommand,\n DropCollectionWireCommand,\n DropIndexWireCommand,\n FindOneAndDeleteWireCommand,\n FindOneAndUpdateWireCommand,\n InsertManyWireCommand,\n InsertOneWireCommand,\n UpdateManyWireCommand,\n UpdateOneWireCommand,\n} from '@prisma-next/mongo-wire';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { buildStandardCodecRegistry } from './core/codecs';\nimport { structuralLowerFilter, structuralLowerPipeline } from './lowering';\nimport { resolveDraftDoc } from './resolve-value';\n\nfunction isUpdatePipeline(\n update: MongoUpdateSpec,\n): update is ReadonlyArray<MongoUpdatePipelineStage> {\n return Array.isArray(update);\n}\n\nfunction isDraftUpdatePipeline(\n update: Record<string, unknown> | ReadonlyArray<Record<string, unknown>>,\n): update is ReadonlyArray<Record<string, unknown>> {\n return Array.isArray(update);\n}\n\nasync function resolveUpdate(\n update: Record<string, unknown> | ReadonlyArray<Record<string, unknown>>,\n codecs: MongoCodecRegistry,\n ctx: CodecCallContext,\n): Promise<Record<string, unknown> | ReadonlyArray<Record<string, unknown>>> {\n if (isDraftUpdatePipeline(update)) {\n return Promise.all(update.map((stage) => resolveDraftDoc(stage, codecs, ctx)));\n }\n return resolveDraftDoc(update, codecs, ctx);\n}\n\nfunction lowerDdlCommand(command: AnyMongoDdlCommand): AnyMongoDdlWireCommand {\n switch (command.kind) {\n case 'createCollection':\n return new CreateCollectionWireCommand(command.collection, command);\n case 'createIndex':\n return new CreateIndexWireCommand(command.collection, keysToKeySpec(command.keys), command);\n case 'dropCollection':\n return new DropCollectionWireCommand(command.collection);\n case 'dropIndex':\n return new DropIndexWireCommand(command.collection, command.name);\n case 'collMod':\n return new CollModWireCommand(command.collection, command);\n // v8 ignore next 4\n default: {\n const _exhaustive: never = command;\n throw new Error(\n `Unknown DDL command kind: ${blindCast<{ kind: string }, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n}\n\nclass MongoAdapterImpl implements MongoAdapter {\n readonly #codecs: MongoCodecRegistry;\n\n constructor(codecs: MongoCodecRegistry) {\n this.#codecs = codecs;\n }\n\n structuralLower(plan: MongoQueryPlan): MongoLoweredDraft {\n const { command } = plan;\n switch (command.kind) {\n case 'insertOne':\n return { kind: 'insertOne', collection: command.collection, document: command.document };\n case 'insertMany':\n return {\n kind: 'insertMany',\n collection: command.collection,\n documents: command.documents,\n };\n case 'updateOne':\n return {\n kind: 'updateOne',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n update: isUpdatePipeline(command.update)\n ? structuralLowerPipeline(command.update)\n : command.update,\n upsert: command.upsert,\n };\n case 'updateMany':\n return {\n kind: 'updateMany',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n update: isUpdatePipeline(command.update)\n ? structuralLowerPipeline(command.update)\n : command.update,\n upsert: command.upsert,\n };\n case 'deleteOne':\n return {\n kind: 'deleteOne',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n };\n case 'deleteMany':\n return {\n kind: 'deleteMany',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n };\n case 'findOneAndUpdate':\n return {\n kind: 'findOneAndUpdate',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n update: isUpdatePipeline(command.update)\n ? structuralLowerPipeline(command.update)\n : command.update,\n upsert: command.upsert,\n sort: command.sort,\n returnDocument: command.returnDocument,\n };\n case 'findOneAndDelete':\n return {\n kind: 'findOneAndDelete',\n collection: command.collection,\n filter: structuralLowerFilter(command.filter),\n sort: command.sort,\n };\n case 'aggregate':\n return {\n kind: 'aggregate',\n collection: command.collection,\n pipeline: structuralLowerPipeline(command.pipeline),\n };\n case 'rawAggregate':\n return { kind: 'rawAggregate', collection: command.collection, pipeline: command.pipeline };\n case 'rawInsertOne':\n return {\n kind: 'rawInsertOne',\n collection: command.collection,\n document: command.document,\n };\n case 'rawInsertMany':\n return {\n kind: 'rawInsertMany',\n collection: command.collection,\n documents: command.documents,\n };\n case 'rawUpdateOne':\n return {\n kind: 'rawUpdateOne',\n collection: command.collection,\n filter: command.filter,\n update: command.update,\n };\n case 'rawUpdateMany':\n return {\n kind: 'rawUpdateMany',\n collection: command.collection,\n filter: command.filter,\n update: command.update,\n };\n case 'rawDeleteOne':\n return { kind: 'rawDeleteOne', collection: command.collection, filter: command.filter };\n case 'rawDeleteMany':\n return { kind: 'rawDeleteMany', collection: command.collection, filter: command.filter };\n case 'rawFindOneAndUpdate':\n return {\n kind: 'rawFindOneAndUpdate',\n collection: command.collection,\n filter: command.filter,\n update: command.update,\n upsert: command.upsert,\n sort: command.sort,\n returnDocument: command.returnDocument,\n };\n case 'rawFindOneAndDelete':\n return {\n kind: 'rawFindOneAndDelete',\n collection: command.collection,\n filter: command.filter,\n sort: command.sort,\n };\n // v8 ignore next 4\n default: {\n const _exhaustive: never = command;\n throw new Error(\n `Unknown command kind: ${blindCast<{ kind: string }, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n }\n\n async resolveParams(\n draft: MongoLoweredDraft,\n ctx: CodecCallContext,\n ): Promise<AnyMongoDmlWireCommand> {\n switch (draft.kind) {\n case 'insertOne':\n return new InsertOneWireCommand(\n draft.collection,\n await resolveDraftDoc(draft.document, this.#codecs, ctx),\n );\n case 'insertMany':\n return new InsertManyWireCommand(\n draft.collection,\n await Promise.all(draft.documents.map((doc) => resolveDraftDoc(doc, this.#codecs, ctx))),\n );\n case 'updateOne': {\n const [filter, update] = await Promise.all([\n resolveDraftDoc(draft.filter, this.#codecs, ctx),\n resolveUpdate(draft.update, this.#codecs, ctx),\n ]);\n return new UpdateOneWireCommand(draft.collection, filter, update, draft.upsert);\n }\n case 'updateMany': {\n const [filter, update] = await Promise.all([\n resolveDraftDoc(draft.filter, this.#codecs, ctx),\n resolveUpdate(draft.update, this.#codecs, ctx),\n ]);\n return new UpdateManyWireCommand(draft.collection, filter, update, draft.upsert);\n }\n case 'deleteOne':\n return new DeleteOneWireCommand(\n draft.collection,\n await resolveDraftDoc(draft.filter, this.#codecs, ctx),\n );\n case 'deleteMany':\n return new DeleteManyWireCommand(\n draft.collection,\n await resolveDraftDoc(draft.filter, this.#codecs, ctx),\n );\n case 'findOneAndUpdate': {\n const [filter, update] = await Promise.all([\n resolveDraftDoc(draft.filter, this.#codecs, ctx),\n resolveUpdate(draft.update, this.#codecs, ctx),\n ]);\n return new FindOneAndUpdateWireCommand(\n draft.collection,\n filter,\n update,\n draft.upsert,\n draft.sort,\n draft.returnDocument,\n );\n }\n case 'findOneAndDelete':\n return new FindOneAndDeleteWireCommand(\n draft.collection,\n await resolveDraftDoc(draft.filter, this.#codecs, ctx),\n draft.sort,\n );\n case 'aggregate':\n return new AggregateWireCommand(\n draft.collection,\n await Promise.all(\n draft.pipeline.map((stage) => resolveDraftDoc(stage, this.#codecs, ctx)),\n ),\n );\n case 'rawAggregate':\n return new AggregateWireCommand(draft.collection, draft.pipeline);\n case 'rawInsertOne':\n return new InsertOneWireCommand(draft.collection, draft.document);\n case 'rawInsertMany':\n return new InsertManyWireCommand(draft.collection, draft.documents);\n case 'rawUpdateOne':\n return new UpdateOneWireCommand(draft.collection, draft.filter, draft.update);\n case 'rawUpdateMany':\n return new UpdateManyWireCommand(draft.collection, draft.filter, draft.update);\n case 'rawDeleteOne':\n return new DeleteOneWireCommand(draft.collection, draft.filter);\n case 'rawDeleteMany':\n return new DeleteManyWireCommand(draft.collection, draft.filter);\n case 'rawFindOneAndUpdate':\n return new FindOneAndUpdateWireCommand(\n draft.collection,\n draft.filter,\n draft.update,\n draft.upsert,\n draft.sort,\n draft.returnDocument,\n );\n case 'rawFindOneAndDelete':\n return new FindOneAndDeleteWireCommand(draft.collection, draft.filter, draft.sort);\n // v8 ignore next 4\n default: {\n const _exhaustive: never = draft;\n throw new Error(\n `Unknown draft kind: ${blindCast<{ kind: string }, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,\n );\n }\n }\n }\n\n lower(plan: MongoDdlPlan, ctx: CodecCallContext): Promise<AnyMongoDdlWireCommand>;\n lower(plan: MongoQueryPlan, ctx: CodecCallContext): Promise<AnyMongoDmlWireCommand>;\n lower(plan: MongoQueryPlan | MongoDdlPlan, ctx: CodecCallContext): Promise<AnyMongoWireCommand> {\n if ('collection' in plan) {\n return this.resolveParams(this.structuralLower(plan), ctx);\n }\n return Promise.resolve(lowerDdlCommand(plan.command));\n }\n}\n\n/**\n * Construct a Mongo adapter with the standard wire-type codecs registered\n * for encode-side dispatch (`MongoParamRef.codecId` lookups).\n *\n * The runtime-side codec registry the runtime decodes against is composed\n * separately by `createMongoExecutionContext`. This factory exists for\n * direct adapter use (the runtime descriptor's `create(stack)` calls\n * through it). User code should compose a stack/context instead.\n */\nexport function createMongoAdapter(): MongoAdapter {\n return new MongoAdapterImpl(buildStandardCodecRegistry());\n}\n\n/**\n * Internal escape hatch — direct adapter construction with a caller-supplied\n * codec registry, used only by adapter unit tests that exercise the\n * encode-side codec-dispatch path with synthetic codecs. Not re-exported\n * from the package's public surface and not for production use; production\n * callers compose a `MongoExecutionStack` and `MongoExecutionContext`.\n */\nexport function _unstable_createMongoAdapterWithCodecs(codecs: MongoCodecRegistry): MongoAdapter {\n return new MongoAdapterImpl(codecs);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo-adapter-Ch21r_Sr.d.mts","names":[],"sources":["../src/mongo-adapter.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"mongo-adapter-Ch21r_Sr.d.mts","names":[],"sources":["../src/mongo-adapter.ts"],"mappings":";;;;;;AA+UA;;;;AAAkD;;;iBAAlC,kBAAA,IAAsB,YAAY"}
|
package/dist/runtime.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as buildStandardCodecRegistry, r as mongoCodecDescriptors, t as createMongoAdapter } from "./mongo-adapter-
|
|
1
|
+
import { n as buildStandardCodecRegistry, r as mongoCodecDescriptors, t as createMongoAdapter } from "./mongo-adapter-CORsfDZK.mjs";
|
|
2
2
|
//#region src/exports/runtime.ts
|
|
3
3
|
const mongoRuntimeAdapterDescriptor = {
|
|
4
4
|
kind: "adapter",
|
package/package.json
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/adapter-mongo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"description": "MongoDB adapter for Prisma Next (lowers commands to wire format)",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@prisma-next/config": "0.
|
|
10
|
-
"@prisma-next/contract": "0.
|
|
11
|
-
"@prisma-next/errors": "0.
|
|
12
|
-
"@prisma-next/family-mongo": "0.
|
|
13
|
-
"@prisma-next/framework-components": "0.
|
|
14
|
-
"@prisma-next/migration-tools": "0.
|
|
15
|
-
"@prisma-next/mongo-codec": "0.
|
|
16
|
-
"@prisma-next/mongo-contract": "0.
|
|
17
|
-
"@prisma-next/mongo-lowering": "0.
|
|
18
|
-
"@prisma-next/mongo-query-ast": "0.
|
|
19
|
-
"@prisma-next/mongo-query-builder": "0.
|
|
20
|
-
"@prisma-next/mongo-schema-ir": "0.
|
|
21
|
-
"@prisma-next/mongo-value": "0.
|
|
22
|
-
"@prisma-next/mongo-wire": "0.
|
|
23
|
-
"@prisma-next/operations": "0.
|
|
24
|
-
"@prisma-next/utils": "0.
|
|
9
|
+
"@prisma-next/config": "0.14.0",
|
|
10
|
+
"@prisma-next/contract": "0.14.0",
|
|
11
|
+
"@prisma-next/errors": "0.14.0",
|
|
12
|
+
"@prisma-next/family-mongo": "0.14.0",
|
|
13
|
+
"@prisma-next/framework-components": "0.14.0",
|
|
14
|
+
"@prisma-next/migration-tools": "0.14.0",
|
|
15
|
+
"@prisma-next/mongo-codec": "0.14.0",
|
|
16
|
+
"@prisma-next/mongo-contract": "0.14.0",
|
|
17
|
+
"@prisma-next/mongo-lowering": "0.14.0",
|
|
18
|
+
"@prisma-next/mongo-query-ast": "0.14.0",
|
|
19
|
+
"@prisma-next/mongo-query-builder": "0.14.0",
|
|
20
|
+
"@prisma-next/mongo-schema-ir": "0.14.0",
|
|
21
|
+
"@prisma-next/mongo-value": "0.14.0",
|
|
22
|
+
"@prisma-next/mongo-wire": "0.14.0",
|
|
23
|
+
"@prisma-next/operations": "0.14.0",
|
|
24
|
+
"@prisma-next/utils": "0.14.0",
|
|
25
25
|
"arktype": "^2.2.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"mongodb": "^7.2.0",
|
|
29
|
-
"@prisma-next/driver-mongo": "0.
|
|
30
|
-
"@prisma-next/errors": "0.
|
|
31
|
-
"@prisma-next/mongo-contract-psl": "0.
|
|
32
|
-
"@prisma-next/psl-parser": "0.
|
|
33
|
-
"@prisma-next/test-utils": "0.
|
|
34
|
-
"@prisma-next/tsconfig": "0.
|
|
35
|
-
"@prisma-next/tsdown": "0.
|
|
29
|
+
"@prisma-next/driver-mongo": "0.14.0",
|
|
30
|
+
"@prisma-next/errors": "0.14.0",
|
|
31
|
+
"@prisma-next/mongo-contract-psl": "0.14.0",
|
|
32
|
+
"@prisma-next/psl-parser": "0.14.0",
|
|
33
|
+
"@prisma-next/test-utils": "0.14.0",
|
|
34
|
+
"@prisma-next/tsconfig": "0.14.0",
|
|
35
|
+
"@prisma-next/tsdown": "0.14.0",
|
|
36
36
|
"mongodb-memory-server": "11.2.0",
|
|
37
37
|
"tsdown": "0.22.1",
|
|
38
38
|
"typescript": "5.9.3",
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ListCollectionsCommand,
|
|
3
|
+
ListIndexesCommand,
|
|
4
|
+
MongoInspectionCommandVisitor,
|
|
5
|
+
} from '@prisma-next/mongo-query-ast/control';
|
|
6
|
+
import { type Db, type Document, MongoServerError } from 'mongodb';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Executes the read-only catalog inspections (`listCollections` / `listIndexes`)
|
|
10
|
+
* that migration prechecks/postchecks and operation preview evaluate, directly
|
|
11
|
+
* against `db`. Routing these checks through the adapter's lowering seam is
|
|
12
|
+
* deferred to the `typed-migration-verification-queries` slice.
|
|
13
|
+
*/
|
|
14
|
+
export class MongoInspectionExecutor implements MongoInspectionCommandVisitor<Promise<Document[]>> {
|
|
15
|
+
constructor(private readonly db: Db) {}
|
|
16
|
+
|
|
17
|
+
async listIndexes(cmd: ListIndexesCommand): Promise<Document[]> {
|
|
18
|
+
try {
|
|
19
|
+
return await this.db.collection(cmd.collection).listIndexes().toArray();
|
|
20
|
+
} catch (error: unknown) {
|
|
21
|
+
if (error instanceof MongoServerError && error.code === 26) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async listCollections(_cmd: ListCollectionsCommand): Promise<Document[]> {
|
|
29
|
+
return this.db.listCollections().toArray();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -6,6 +6,8 @@ import {
|
|
|
6
6
|
MongoSchemaIR,
|
|
7
7
|
MongoSchemaValidator,
|
|
8
8
|
} from '@prisma-next/mongo-schema-ir';
|
|
9
|
+
import type { CollationOptions } from '@prisma-next/mongo-value/mongodb-types';
|
|
10
|
+
import { blindCast } from '@prisma-next/utils/casts';
|
|
9
11
|
import type { Db, Document } from 'mongodb';
|
|
10
12
|
|
|
11
13
|
const PRISMA_MIGRATIONS_COLLECTION = '_prisma_migrations';
|
|
@@ -39,7 +41,11 @@ function parseIndex(doc: Document): MongoSchemaIndex {
|
|
|
39
41
|
expireAfterSeconds: doc['expireAfterSeconds'] as number | undefined,
|
|
40
42
|
partialFilterExpression: doc['partialFilterExpression'] as Record<string, unknown> | undefined,
|
|
41
43
|
wildcardProjection: doc['wildcardProjection'] as Record<string, 0 | 1> | undefined,
|
|
42
|
-
collation: doc['collation']
|
|
44
|
+
collation: doc['collation']
|
|
45
|
+
? blindCast<CollationOptions, 'collation from mongodb listIndexes result has locale'>(
|
|
46
|
+
doc['collation'],
|
|
47
|
+
)
|
|
48
|
+
: undefined,
|
|
43
49
|
weights: doc['weights'] as Record<string, number> | undefined,
|
|
44
50
|
default_language: doc['default_language'] as string | undefined,
|
|
45
51
|
language_override: doc['language_override'] as string | undefined,
|
|
@@ -70,7 +76,11 @@ function parseCollectionOptions(info: Document): MongoSchemaCollectionOptions |
|
|
|
70
76
|
const timeseries = options['timeseries'] as
|
|
71
77
|
| { timeField: string; metaField?: string; granularity?: 'seconds' | 'minutes' | 'hours' }
|
|
72
78
|
| undefined;
|
|
73
|
-
const collation = options['collation']
|
|
79
|
+
const collation = options['collation']
|
|
80
|
+
? blindCast<CollationOptions, 'collation from mongodb listCollections result has locale'>(
|
|
81
|
+
options['collation'],
|
|
82
|
+
)
|
|
83
|
+
: undefined;
|
|
74
84
|
const changeStreamPreAndPostImages = options['changeStreamPreAndPostImages'] as
|
|
75
85
|
| { enabled: boolean }
|
|
76
86
|
| undefined;
|
|
@@ -3,7 +3,8 @@ import { withMarkerReadErrorHandling } from '@prisma-next/errors/execution';
|
|
|
3
3
|
import type { MongoControlAdapter } from '@prisma-next/family-mongo/control-adapter';
|
|
4
4
|
import type { ControlDriverInstance } from '@prisma-next/framework-components/control';
|
|
5
5
|
import { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';
|
|
6
|
-
import type { MongoAdapter } from '@prisma-next/mongo-lowering';
|
|
6
|
+
import type { MongoAdapter, MongoDriver } from '@prisma-next/mongo-lowering';
|
|
7
|
+
import type { AnyMongoDdlCommand } from '@prisma-next/mongo-query-ast/control';
|
|
7
8
|
import {
|
|
8
9
|
type AnyMongoCommand,
|
|
9
10
|
MongoAggFieldRef,
|
|
@@ -66,6 +67,11 @@ export class MongoControlAdapterImpl implements MongoControlAdapter<'mongo'> {
|
|
|
66
67
|
return rows;
|
|
67
68
|
}
|
|
68
69
|
|
|
70
|
+
async executeDdl(driver: MongoDriver, command: AnyMongoDdlCommand): Promise<void> {
|
|
71
|
+
const wire = await this.#adapter.lower({ command }, {});
|
|
72
|
+
await driver.run(wire);
|
|
73
|
+
}
|
|
74
|
+
|
|
69
75
|
/**
|
|
70
76
|
* Server-side invariant-merge aggregation expression:
|
|
71
77
|
* `$sortArray({ input: $setUnion([$ifNull('$invariants', []), incoming]), sortBy: 1 })`.
|
package/src/core/runner-deps.ts
CHANGED
|
@@ -6,13 +6,13 @@ import type {
|
|
|
6
6
|
} from '@prisma-next/framework-components/control';
|
|
7
7
|
import type { MongoAdapter, MongoDriver } from '@prisma-next/mongo-lowering';
|
|
8
8
|
import type {
|
|
9
|
-
|
|
9
|
+
AnyMongoDdlCommand,
|
|
10
10
|
MongoInspectionCommandVisitor,
|
|
11
11
|
} from '@prisma-next/mongo-query-ast/control';
|
|
12
12
|
import type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';
|
|
13
13
|
import type { Db } from 'mongodb';
|
|
14
14
|
import { createMongoAdapter } from '../mongo-adapter';
|
|
15
|
-
import {
|
|
15
|
+
import { MongoInspectionExecutor } from './inspection-executor';
|
|
16
16
|
import { MongoControlAdapterImpl } from './mongo-control-adapter';
|
|
17
17
|
import { isMongoControlDriver } from './mongo-control-driver';
|
|
18
18
|
|
|
@@ -65,10 +65,10 @@ export interface MarkerOperations {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
export interface MongoRunnerDependencies {
|
|
68
|
-
readonly commandExecutor: MongoDdlCommandVisitor<Promise<void>>;
|
|
69
68
|
readonly inspectionExecutor: MongoInspectionCommandVisitor<Promise<Record<string, unknown>[]>>;
|
|
70
69
|
readonly adapter: MongoAdapter;
|
|
71
70
|
readonly driver: MongoDriver;
|
|
71
|
+
readonly executeDdl: (command: AnyMongoDdlCommand) => Promise<void>;
|
|
72
72
|
readonly markerOps: MarkerOperations;
|
|
73
73
|
readonly introspectSchema: () => Promise<MongoSchemaIR>;
|
|
74
74
|
}
|
|
@@ -93,11 +93,12 @@ export function createMongoRunnerDeps(
|
|
|
93
93
|
_family: ControlFamilyInstance<'mongo', MongoSchemaIR>,
|
|
94
94
|
controlAdapter: MongoControlAdapter<'mongo'> = new MongoControlAdapterImpl(),
|
|
95
95
|
): MongoRunnerDependencies {
|
|
96
|
+
const adapter = createMongoAdapter();
|
|
96
97
|
return {
|
|
97
|
-
commandExecutor: new MongoCommandExecutor(extractDb(controlDriver)),
|
|
98
98
|
inspectionExecutor: new MongoInspectionExecutor(extractDb(controlDriver)),
|
|
99
|
-
adapter
|
|
99
|
+
adapter,
|
|
100
100
|
driver,
|
|
101
|
+
executeDdl: (command) => adapter.lower({ command }, {}).then((wire) => driver.run(wire)),
|
|
101
102
|
markerOps: {
|
|
102
103
|
readMarker: (space) => controlAdapter.readMarker(controlDriver, space),
|
|
103
104
|
initMarker: (space, dest) => controlAdapter.initMarker(controlDriver, space, dest),
|
package/src/exports/control.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { MongoControlAdapterDescriptor } from '@prisma-next/family-mongo/control-adapter';
|
|
2
2
|
import type { MongoControlDriverInstance } from '@prisma-next/mongo-lowering';
|
|
3
3
|
|
|
4
|
-
export {
|
|
4
|
+
export { MongoInspectionExecutor } from '../core/inspection-executor';
|
|
5
5
|
export { introspectSchema } from '../core/introspect-schema';
|
|
6
6
|
export { MongoControlAdapterImpl } from '../core/mongo-control-adapter';
|
|
7
7
|
export { isMongoControlDriver } from '../core/mongo-control-driver';
|
package/src/mongo-adapter.ts
CHANGED
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
import type { CodecCallContext } from '@prisma-next/framework-components/codec';
|
|
2
2
|
import type { MongoCodecRegistry } from '@prisma-next/mongo-codec';
|
|
3
|
-
import type { MongoAdapter, MongoLoweredDraft } from '@prisma-next/mongo-lowering';
|
|
3
|
+
import type { MongoAdapter, MongoDdlPlan, MongoLoweredDraft } from '@prisma-next/mongo-lowering';
|
|
4
|
+
import type { AnyMongoDdlCommand } from '@prisma-next/mongo-query-ast/control';
|
|
5
|
+
import { keysToKeySpec } from '@prisma-next/mongo-query-ast/control';
|
|
4
6
|
import type {
|
|
5
7
|
MongoQueryPlan,
|
|
6
8
|
MongoUpdatePipelineStage,
|
|
7
9
|
MongoUpdateSpec,
|
|
8
10
|
} from '@prisma-next/mongo-query-ast/execution';
|
|
9
|
-
import type {
|
|
11
|
+
import type {
|
|
12
|
+
AnyMongoDdlWireCommand,
|
|
13
|
+
AnyMongoDmlWireCommand,
|
|
14
|
+
AnyMongoWireCommand,
|
|
15
|
+
} from '@prisma-next/mongo-wire';
|
|
10
16
|
import {
|
|
11
17
|
AggregateWireCommand,
|
|
18
|
+
CollModWireCommand,
|
|
19
|
+
CreateCollectionWireCommand,
|
|
20
|
+
CreateIndexWireCommand,
|
|
12
21
|
DeleteManyWireCommand,
|
|
13
22
|
DeleteOneWireCommand,
|
|
23
|
+
DropCollectionWireCommand,
|
|
24
|
+
DropIndexWireCommand,
|
|
14
25
|
FindOneAndDeleteWireCommand,
|
|
15
26
|
FindOneAndUpdateWireCommand,
|
|
16
27
|
InsertManyWireCommand,
|
|
@@ -46,6 +57,28 @@ async function resolveUpdate(
|
|
|
46
57
|
return resolveDraftDoc(update, codecs, ctx);
|
|
47
58
|
}
|
|
48
59
|
|
|
60
|
+
function lowerDdlCommand(command: AnyMongoDdlCommand): AnyMongoDdlWireCommand {
|
|
61
|
+
switch (command.kind) {
|
|
62
|
+
case 'createCollection':
|
|
63
|
+
return new CreateCollectionWireCommand(command.collection, command);
|
|
64
|
+
case 'createIndex':
|
|
65
|
+
return new CreateIndexWireCommand(command.collection, keysToKeySpec(command.keys), command);
|
|
66
|
+
case 'dropCollection':
|
|
67
|
+
return new DropCollectionWireCommand(command.collection);
|
|
68
|
+
case 'dropIndex':
|
|
69
|
+
return new DropIndexWireCommand(command.collection, command.name);
|
|
70
|
+
case 'collMod':
|
|
71
|
+
return new CollModWireCommand(command.collection, command);
|
|
72
|
+
// v8 ignore next 4
|
|
73
|
+
default: {
|
|
74
|
+
const _exhaustive: never = command;
|
|
75
|
+
throw new Error(
|
|
76
|
+
`Unknown DDL command kind: ${blindCast<{ kind: string }, 'exhaustive switch fallback for error message'>(_exhaustive).kind}`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
49
82
|
class MongoAdapterImpl implements MongoAdapter {
|
|
50
83
|
readonly #codecs: MongoCodecRegistry;
|
|
51
84
|
|
|
@@ -183,7 +216,7 @@ class MongoAdapterImpl implements MongoAdapter {
|
|
|
183
216
|
async resolveParams(
|
|
184
217
|
draft: MongoLoweredDraft,
|
|
185
218
|
ctx: CodecCallContext,
|
|
186
|
-
): Promise<
|
|
219
|
+
): Promise<AnyMongoDmlWireCommand> {
|
|
187
220
|
switch (draft.kind) {
|
|
188
221
|
case 'insertOne':
|
|
189
222
|
return new InsertOneWireCommand(
|
|
@@ -281,8 +314,13 @@ class MongoAdapterImpl implements MongoAdapter {
|
|
|
281
314
|
}
|
|
282
315
|
}
|
|
283
316
|
|
|
284
|
-
lower(plan:
|
|
285
|
-
|
|
317
|
+
lower(plan: MongoDdlPlan, ctx: CodecCallContext): Promise<AnyMongoDdlWireCommand>;
|
|
318
|
+
lower(plan: MongoQueryPlan, ctx: CodecCallContext): Promise<AnyMongoDmlWireCommand>;
|
|
319
|
+
lower(plan: MongoQueryPlan | MongoDdlPlan, ctx: CodecCallContext): Promise<AnyMongoWireCommand> {
|
|
320
|
+
if ('collection' in plan) {
|
|
321
|
+
return this.resolveParams(this.structuralLower(plan), ctx);
|
|
322
|
+
}
|
|
323
|
+
return Promise.resolve(lowerDdlCommand(plan.command));
|
|
286
324
|
}
|
|
287
325
|
}
|
|
288
326
|
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
CollModCommand,
|
|
3
|
-
CreateCollectionCommand,
|
|
4
|
-
CreateIndexCommand,
|
|
5
|
-
DropCollectionCommand,
|
|
6
|
-
DropIndexCommand,
|
|
7
|
-
ListCollectionsCommand,
|
|
8
|
-
ListIndexesCommand,
|
|
9
|
-
MongoDdlCommandVisitor,
|
|
10
|
-
MongoInspectionCommandVisitor,
|
|
11
|
-
} from '@prisma-next/mongo-query-ast/control';
|
|
12
|
-
import { keysToKeySpec } from '@prisma-next/mongo-query-ast/control';
|
|
13
|
-
import { type Db, type Document, MongoServerError } from 'mongodb';
|
|
14
|
-
|
|
15
|
-
export class MongoCommandExecutor implements MongoDdlCommandVisitor<Promise<void>> {
|
|
16
|
-
constructor(private readonly db: Db) {}
|
|
17
|
-
|
|
18
|
-
async createIndex(cmd: CreateIndexCommand): Promise<void> {
|
|
19
|
-
const keySpec: Document = keysToKeySpec(cmd.keys);
|
|
20
|
-
const options: Record<string, unknown> = {};
|
|
21
|
-
if (cmd.unique !== undefined) options['unique'] = cmd.unique;
|
|
22
|
-
if (cmd.sparse !== undefined) options['sparse'] = cmd.sparse;
|
|
23
|
-
if (cmd.expireAfterSeconds !== undefined)
|
|
24
|
-
options['expireAfterSeconds'] = cmd.expireAfterSeconds;
|
|
25
|
-
if (cmd.partialFilterExpression !== undefined)
|
|
26
|
-
options['partialFilterExpression'] = cmd.partialFilterExpression;
|
|
27
|
-
if (cmd.name !== undefined) options['name'] = cmd.name;
|
|
28
|
-
if (cmd.wildcardProjection !== undefined)
|
|
29
|
-
options['wildcardProjection'] = cmd.wildcardProjection;
|
|
30
|
-
if (cmd.collation !== undefined) options['collation'] = cmd.collation;
|
|
31
|
-
if (cmd.weights !== undefined) options['weights'] = cmd.weights;
|
|
32
|
-
if (cmd.default_language !== undefined) options['default_language'] = cmd.default_language;
|
|
33
|
-
if (cmd.language_override !== undefined) options['language_override'] = cmd.language_override;
|
|
34
|
-
await this.db.collection(cmd.collection).createIndex(keySpec, options);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async dropIndex(cmd: DropIndexCommand): Promise<void> {
|
|
38
|
-
await this.db.collection(cmd.collection).dropIndex(cmd.name);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async createCollection(cmd: CreateCollectionCommand): Promise<void> {
|
|
42
|
-
const options: Record<string, unknown> = {};
|
|
43
|
-
if (cmd.capped !== undefined) options['capped'] = cmd.capped;
|
|
44
|
-
if (cmd.size !== undefined) options['size'] = cmd.size;
|
|
45
|
-
if (cmd.max !== undefined) options['max'] = cmd.max;
|
|
46
|
-
if (cmd.timeseries !== undefined) options['timeseries'] = cmd.timeseries;
|
|
47
|
-
if (cmd.collation !== undefined) options['collation'] = cmd.collation;
|
|
48
|
-
if (cmd.clusteredIndex !== undefined) options['clusteredIndex'] = cmd.clusteredIndex;
|
|
49
|
-
if (cmd.validator !== undefined) options['validator'] = cmd.validator;
|
|
50
|
-
if (cmd.validationLevel !== undefined) options['validationLevel'] = cmd.validationLevel;
|
|
51
|
-
if (cmd.validationAction !== undefined) options['validationAction'] = cmd.validationAction;
|
|
52
|
-
if (cmd.changeStreamPreAndPostImages !== undefined)
|
|
53
|
-
options['changeStreamPreAndPostImages'] = cmd.changeStreamPreAndPostImages;
|
|
54
|
-
await this.db.createCollection(cmd.collection, options);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
async dropCollection(cmd: DropCollectionCommand): Promise<void> {
|
|
58
|
-
await this.db.collection(cmd.collection).drop();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async collMod(cmd: CollModCommand): Promise<void> {
|
|
62
|
-
const command: Record<string, unknown> = { collMod: cmd.collection };
|
|
63
|
-
if (cmd.validator !== undefined) command['validator'] = cmd.validator;
|
|
64
|
-
if (cmd.validationLevel !== undefined) command['validationLevel'] = cmd.validationLevel;
|
|
65
|
-
if (cmd.validationAction !== undefined) command['validationAction'] = cmd.validationAction;
|
|
66
|
-
if (cmd.changeStreamPreAndPostImages !== undefined)
|
|
67
|
-
command['changeStreamPreAndPostImages'] = cmd.changeStreamPreAndPostImages;
|
|
68
|
-
await this.db.command(command);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export class MongoInspectionExecutor implements MongoInspectionCommandVisitor<Promise<Document[]>> {
|
|
73
|
-
constructor(private readonly db: Db) {}
|
|
74
|
-
|
|
75
|
-
async listIndexes(cmd: ListIndexesCommand): Promise<Document[]> {
|
|
76
|
-
try {
|
|
77
|
-
return await this.db.collection(cmd.collection).listIndexes().toArray();
|
|
78
|
-
} catch (error: unknown) {
|
|
79
|
-
if (error instanceof MongoServerError && error.code === 26) {
|
|
80
|
-
return [];
|
|
81
|
-
}
|
|
82
|
-
throw error;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
async listCollections(_cmd: ListCollectionsCommand): Promise<Document[]> {
|
|
87
|
-
return this.db.listCollections().toArray();
|
|
88
|
-
}
|
|
89
|
-
}
|