@prisma-next/adapter-mongo 0.12.0-dev.17 → 0.12.0-dev.2
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 +2 -17
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +1 -45
- package/dist/control.mjs.map +1 -1
- package/package.json +22 -23
- package/src/core/marker-ledger.ts +2 -66
- package/src/core/mongo-control-adapter.ts +2 -17
- package/src/core/runner-deps.ts +5 -8
- package/src/exports/control.ts +0 -1
package/dist/control.d.mts
CHANGED
|
@@ -3,7 +3,7 @@ import { Db, Document, MongoClient } from "mongodb";
|
|
|
3
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
|
-
import { ContractMarkerRecord
|
|
6
|
+
import { ContractMarkerRecord } from "@prisma-next/contract/types";
|
|
7
7
|
import { ControlDriverInstance, ControlFamilyInstance } from "@prisma-next/framework-components/control";
|
|
8
8
|
import { MongoAdapter, MongoDriver } from "@prisma-next/mongo-lowering";
|
|
9
9
|
|
|
@@ -77,18 +77,10 @@ declare function updateMarker(db: Db, space: string, expectedFrom: string, desti
|
|
|
77
77
|
* a synthetic ∅→head edge on first apply), so the ledger key is
|
|
78
78
|
* `(space, edgeId)` — the doc carries `space` for partitioned reads.
|
|
79
79
|
*/
|
|
80
|
-
/**
|
|
81
|
-
* Reads per-migration ledger entries for `space` in apply order. Returns
|
|
82
|
-
* `[]` when no ledger documents exist for that space yet.
|
|
83
|
-
*/
|
|
84
|
-
declare function readLedger(db: Db, space: string): Promise<readonly LedgerEntryRecord[]>;
|
|
85
80
|
declare function writeLedgerEntry(db: Db, space: string, entry: {
|
|
86
81
|
readonly edgeId: string;
|
|
87
82
|
readonly from: string;
|
|
88
83
|
readonly to: string;
|
|
89
|
-
readonly migrationName: string;
|
|
90
|
-
readonly migrationHash: string;
|
|
91
|
-
readonly operations: readonly unknown[];
|
|
92
84
|
}): Promise<void>;
|
|
93
85
|
//#endregion
|
|
94
86
|
//#region src/core/mongo-control-adapter.d.ts
|
|
@@ -117,11 +109,7 @@ declare class MongoControlAdapterImpl implements MongoControlAdapter<'mongo'> {
|
|
|
117
109
|
readonly edgeId: string;
|
|
118
110
|
readonly from: string;
|
|
119
111
|
readonly to: string;
|
|
120
|
-
readonly migrationName: string;
|
|
121
|
-
readonly migrationHash: string;
|
|
122
|
-
readonly operations: readonly unknown[];
|
|
123
112
|
}): Promise<void>;
|
|
124
|
-
readLedger(driver: ControlDriverInstance<'mongo', 'mongo'>, space: string): Promise<readonly LedgerEntryRecord[]>;
|
|
125
113
|
introspectSchema(driver: ControlDriverInstance<'mongo', 'mongo'>): Promise<MongoSchemaIR>;
|
|
126
114
|
}
|
|
127
115
|
//#endregion
|
|
@@ -155,9 +143,6 @@ interface MarkerOperations {
|
|
|
155
143
|
readonly edgeId: string;
|
|
156
144
|
readonly from: string;
|
|
157
145
|
readonly to: string;
|
|
158
|
-
readonly migrationName: string;
|
|
159
|
-
readonly migrationHash: string;
|
|
160
|
-
readonly operations: readonly unknown[];
|
|
161
146
|
}): Promise<void>;
|
|
162
147
|
}
|
|
163
148
|
interface MongoRunnerDependencies {
|
|
@@ -182,5 +167,5 @@ declare function createMongoRunnerDeps(controlDriver: ControlDriverInstance<'mon
|
|
|
182
167
|
//#region src/exports/control.d.ts
|
|
183
168
|
declare const mongoAdapterDescriptor: MongoControlAdapterDescriptor<'mongo'>;
|
|
184
169
|
//#endregion
|
|
185
|
-
export { type MarkerOperations, MongoCommandExecutor, MongoControlAdapterImpl, type MongoControlDriverInstance, MongoInspectionExecutor, type MongoRunnerDependencies, createMongoAdapter, createMongoControlDriver, createMongoRunnerDeps, mongoAdapterDescriptor as default, mongoAdapterDescriptor, extractDb, initMarker, introspectSchema, readAllMarkers,
|
|
170
|
+
export { type MarkerOperations, MongoCommandExecutor, MongoControlAdapterImpl, type MongoControlDriverInstance, MongoInspectionExecutor, type MongoRunnerDependencies, createMongoAdapter, createMongoControlDriver, createMongoRunnerDeps, mongoAdapterDescriptor as default, mongoAdapterDescriptor, extractDb, initMarker, introspectSchema, readAllMarkers, readMarker, updateMarker, writeLedgerEntry };
|
|
186
171
|
//# 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/command-executor.ts","../src/core/introspect-schema.ts","../src/core/marker-ledger.ts","../src/core/mongo-control-adapter.ts","../src/core/mongo-control-driver.ts","../src/core/runner-deps.ts","../src/exports/control.ts"],"mappings":";;;;;;;;;;cAca,oBAAA,YAAgC,sBAAA,CAAuB,OAAA;EAAA,iBACrC,EAAA;cAAA,EAAA,EAAI,EAAA;EAE3B,WAAA,CAAY,GAAA,EAAK,kBAAA,GAAqB,OAAA;EAmBtC,SAAA,CAAU,GAAA,EAAK,gBAAA,GAAmB,OAAA;EAIlC,gBAAA,CAAiB,GAAA,EAAK,uBAAA,GAA0B,OAAA;EAgBhD,cAAA,CAAe,GAAA,EAAK,qBAAA,GAAwB,OAAA;EAI5C,OAAA,CAAQ,GAAA,EAAK,cAAA,GAAiB,OAAA;AAAA;AAAA,cAWzB,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;;;iBCMzC,gBAAA,CAAiB,EAAA,EAAI,EAAA,GAAK,OAAA,CAAQ,aAAA;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"control.d.mts","names":[],"sources":["../src/core/command-executor.ts","../src/core/introspect-schema.ts","../src/core/marker-ledger.ts","../src/core/mongo-control-adapter.ts","../src/core/mongo-control-driver.ts","../src/core/runner-deps.ts","../src/exports/control.ts"],"mappings":"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"}
|
package/dist/control.mjs
CHANGED
|
@@ -4,7 +4,6 @@ import { MongoServerError } from "mongodb";
|
|
|
4
4
|
import { keysToKeySpec } from "@prisma-next/mongo-query-ast/control";
|
|
5
5
|
import { MongoSchemaCollection, MongoSchemaCollectionOptions, MongoSchemaIR, MongoSchemaIndex, MongoSchemaValidator } from "@prisma-next/mongo-schema-ir";
|
|
6
6
|
import { parseMarkerRowSafely, withMarkerReadErrorHandling } from "@prisma-next/errors/execution";
|
|
7
|
-
import { ledgerOriginFromStored } from "@prisma-next/migration-tools/ledger-origin";
|
|
8
7
|
import { type } from "arktype";
|
|
9
8
|
//#region src/core/command-executor.ts
|
|
10
9
|
var MongoCommandExecutor = class {
|
|
@@ -168,7 +167,6 @@ async function introspectSchema(db) {
|
|
|
168
167
|
//#region src/core/marker-ledger.ts
|
|
169
168
|
const COLLECTION = "_prisma_migrations";
|
|
170
169
|
const MONGO_MARKER_COLLECTION = `_prisma_migrations marker documents in ${COLLECTION}`;
|
|
171
|
-
const MONGO_LEDGER_COLLECTION = `_prisma_migrations ledger documents in ${COLLECTION}`;
|
|
172
170
|
/**
|
|
173
171
|
* Marker doc shape.
|
|
174
172
|
*
|
|
@@ -320,42 +318,6 @@ async function updateMarker(db, space, expectedFrom, destination) {
|
|
|
320
318
|
* a synthetic ∅→head edge on first apply), so the ledger key is
|
|
321
319
|
* `(space, edgeId)` — the doc carries `space` for partitioned reads.
|
|
322
320
|
*/
|
|
323
|
-
/**
|
|
324
|
-
* Reads per-migration ledger entries for `space` in apply order. Returns
|
|
325
|
-
* `[]` when no ledger documents exist for that space yet.
|
|
326
|
-
*/
|
|
327
|
-
async function readLedger(db, space) {
|
|
328
|
-
const docs = await withMarkerReadErrorHandling(() => executeAggregate(db, new RawAggregateCommand(COLLECTION, [{ $match: {
|
|
329
|
-
type: "ledger",
|
|
330
|
-
space
|
|
331
|
-
} }, { $sort: { _id: 1 } }])), {
|
|
332
|
-
space,
|
|
333
|
-
markerLocation: MONGO_LEDGER_COLLECTION
|
|
334
|
-
});
|
|
335
|
-
const entries = [];
|
|
336
|
-
for (const doc of docs) {
|
|
337
|
-
const migrationName = doc["migrationName"];
|
|
338
|
-
const migrationHash = doc["migrationHash"];
|
|
339
|
-
const from = doc["from"];
|
|
340
|
-
const to = doc["to"];
|
|
341
|
-
if (typeof migrationName !== "string" || typeof migrationHash !== "string") continue;
|
|
342
|
-
if (typeof from !== "string" || typeof to !== "string") continue;
|
|
343
|
-
const appliedAt = doc["appliedAt"];
|
|
344
|
-
const appliedAtDate = appliedAt instanceof Date ? appliedAt : appliedAt !== void 0 ? new Date(String(appliedAt)) : /* @__PURE__ */ new Date();
|
|
345
|
-
const operations = doc["operations"];
|
|
346
|
-
const opList = Array.isArray(operations) ? operations : [];
|
|
347
|
-
entries.push({
|
|
348
|
-
space,
|
|
349
|
-
migrationName,
|
|
350
|
-
migrationHash,
|
|
351
|
-
from: ledgerOriginFromStored(from),
|
|
352
|
-
to,
|
|
353
|
-
appliedAt: appliedAtDate,
|
|
354
|
-
operationCount: opList.length
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
return entries;
|
|
358
|
-
}
|
|
359
321
|
async function writeLedgerEntry(db, space, entry) {
|
|
360
322
|
await executeInsertOne(db, new RawInsertOneCommand(COLLECTION, {
|
|
361
323
|
type: "ledger",
|
|
@@ -363,9 +325,6 @@ async function writeLedgerEntry(db, space, entry) {
|
|
|
363
325
|
edgeId: entry.edgeId,
|
|
364
326
|
from: entry.from,
|
|
365
327
|
to: entry.to,
|
|
366
|
-
migrationName: entry.migrationName,
|
|
367
|
-
migrationHash: entry.migrationHash,
|
|
368
|
-
operations: entry.operations,
|
|
369
328
|
appliedAt: /* @__PURE__ */ new Date()
|
|
370
329
|
}));
|
|
371
330
|
}
|
|
@@ -426,9 +385,6 @@ var MongoControlAdapterImpl = class {
|
|
|
426
385
|
async writeLedgerEntry(driver, space, entry) {
|
|
427
386
|
await writeLedgerEntry(extractDb(driver), space, entry);
|
|
428
387
|
}
|
|
429
|
-
async readLedger(driver, space) {
|
|
430
|
-
return readLedger(extractDb(driver), space);
|
|
431
|
-
}
|
|
432
388
|
async introspectSchema(driver) {
|
|
433
389
|
return introspectSchema(extractDb(driver));
|
|
434
390
|
}
|
|
@@ -488,6 +444,6 @@ const mongoAdapterDescriptor = {
|
|
|
488
444
|
}
|
|
489
445
|
};
|
|
490
446
|
//#endregion
|
|
491
|
-
export { MongoCommandExecutor, MongoControlAdapterImpl, MongoInspectionExecutor, createMongoAdapter, createMongoControlDriver, createMongoRunnerDeps, mongoAdapterDescriptor as default, mongoAdapterDescriptor, extractDb, initMarker, introspectSchema, readAllMarkers,
|
|
447
|
+
export { MongoCommandExecutor, MongoControlAdapterImpl, MongoInspectionExecutor, createMongoAdapter, createMongoControlDriver, createMongoRunnerDeps, mongoAdapterDescriptor as default, mongoAdapterDescriptor, extractDb, initMarker, introspectSchema, readAllMarkers, readMarker, updateMarker, writeLedgerEntry };
|
|
492
448
|
|
|
493
449
|
//# sourceMappingURL=control.mjs.map
|
package/dist/control.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.mjs","names":["#client"],"sources":["../src/core/command-executor.ts","../src/core/introspect-schema.ts","../src/core/marker-ledger.ts","../src/core/runner-deps.ts","../src/core/mongo-control-adapter.ts","../src/core/mongo-control-driver.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, LedgerEntryRecord } from '@prisma-next/contract/types';\nimport { parseMarkerRowSafely, withMarkerReadErrorHandling } from '@prisma-next/errors/execution';\nimport { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';\nimport {\n RawAggregateCommand,\n RawFindOneAndUpdateCommand,\n RawInsertOneCommand,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { type } from 'arktype';\nimport type { Db, Document, UpdateFilter } from 'mongodb';\n\nconst COLLECTION = '_prisma_migrations';\nconst MONGO_MARKER_COLLECTION = `_prisma_migrations marker documents in ${COLLECTION}`;\nconst MONGO_LEDGER_COLLECTION = `_prisma_migrations ledger documents in ${COLLECTION}`;\n\n/**\n * Marker doc shape.\n *\n * Same fields as the SQL marker row but camelCase + Mongo-native types:\n * `Date` is BSON-hydrated, `meta` is a native object (not JSON-stringified),\n * `_id` and any extension fields are tolerated. `invariants?` is optional —\n * absent reads as `[]` (schemaless default); present-but-malformed throws.\n *\n * `space` is required: every marker doc is keyed by its space id (`_id`)\n * and stamped with a matching `space` field for partitioned reads.\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\nfunction 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 as Record<string, unknown> | null) ?? {},\n invariants: result.invariants ?? [],\n };\n}\n\nfunction parseMongoMarkerDocSafely(doc: unknown, space: string): ContractMarkerRecord {\n return parseMarkerRowSafely(doc, parseMongoMarkerDoc, {\n space,\n markerLocation: MONGO_MARKER_COLLECTION,\n });\n}\n\nasync function executeAggregate(db: Db, cmd: RawAggregateCommand): Promise<Document[]> {\n return db\n .collection(cmd.collection)\n .aggregate(cmd.pipeline as Record<string, unknown>[])\n .toArray();\n}\n\nasync function executeInsertOne(db: Db, cmd: RawInsertOneCommand): Promise<void> {\n await db.collection(cmd.collection).insertOne(cmd.document);\n}\n\nasync function executeFindOneAndUpdate(\n db: Db,\n cmd: RawFindOneAndUpdateCommand,\n): Promise<Document | null> {\n // `cmd.update` is `Document | ReadonlyArray<Document>` per the AST. The\n // MongoDB driver's `findOneAndUpdate` accepts the same shape under the\n // type `UpdateFilter<T> | Document[]`. The driver's runtime path handles\n // both forms identically — pipelines (array) and update docs (object).\n // One cast to that union keeps the call single-arm.\n return db\n .collection(cmd.collection)\n .findOneAndUpdate(cmd.filter, cmd.update as UpdateFilter<Document> | Document[], {\n upsert: cmd.upsert,\n });\n}\n\n/**\n * Reads the marker document for the given contract space, or returns\n * `null` if no marker has been written for that space yet. Each space\n * owns one row keyed by `_id: <space>` — see ADR 212 for the per-space\n * mechanism this enables.\n */\nexport async function readMarker(db: Db, space: string): Promise<ContractMarkerRecord | null> {\n const markerContext = { space, markerLocation: MONGO_MARKER_COLLECTION };\n const docs = await withMarkerReadErrorHandling(\n () =>\n executeAggregate(\n db,\n new RawAggregateCommand(COLLECTION, [{ $match: { _id: space, space } }, { $limit: 1 }]),\n ),\n markerContext,\n );\n const doc = docs[0];\n if (!doc) return null;\n return parseMongoMarkerDocSafely(doc, space);\n}\n\n/**\n * Reads every marker doc in the collection (one per contract space)\n * and returns them keyed by `space`. Used by the per-space verifier\n * to detect marker-vs-on-disk drift and orphan marker rows. Returns\n * an empty map when no marker docs have been written yet.\n *\n * Marker docs are keyed by `_id: <space>` (string); ledger entries\n * live in the same collection but use a driver-generated `ObjectId`\n * `_id` plus `type: 'ledger'`. The filter selects string-keyed docs\n * with a `space` field, which excludes ledger entries by construction.\n */\nexport async function readAllMarkers(db: Db): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const markerContext = { space: 'app', markerLocation: MONGO_MARKER_COLLECTION };\n const docs = await withMarkerReadErrorHandling(\n () =>\n executeAggregate(\n db,\n new RawAggregateCommand(COLLECTION, [\n {\n $match: {\n _id: { $type: 'string' },\n space: { $type: 'string' },\n $expr: { $eq: ['$_id', '$space'] },\n },\n },\n ]),\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\nexport async function initMarker(\n db: Db,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n): Promise<void> {\n const cmd = new RawInsertOneCommand(COLLECTION, {\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 executeInsertOne(db, cmd);\n}\n\n/**\n * Updates the marker doc for the given space atomically (CAS on\n * `expectedFrom`).\n *\n * `destination.invariants`:\n * - `undefined` → existing field left untouched.\n * - explicit value → merged into the existing field server-side via an\n * aggregation pipeline (`$setUnion + $sortArray`), atomic at the\n * document level. `[]` is a no-op merge.\n */\nexport async function updateMarker(\n db: Db,\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 setBase: Record<string, unknown> = {\n storageHash: destination.storageHash,\n profileHash: destination.profileHash,\n updatedAt: new Date(),\n };\n // When invariants is supplied, use an aggregation pipeline so the\n // merge runs server-side against the doc's current value (atomic, no\n // read-then-write window). When omitted, a regular update doc keeps\n // the field untouched.\n const update: Document | Document[] =\n destination.invariants === undefined\n ? { $set: setBase }\n : [\n {\n $set: {\n ...setBase,\n invariants: {\n $sortArray: {\n input: { $setUnion: [{ $ifNull: ['$invariants', []] }, destination.invariants] },\n sortBy: 1,\n },\n },\n },\n },\n ];\n const cmd = new RawFindOneAndUpdateCommand(\n COLLECTION,\n { _id: space, space, storageHash: expectedFrom },\n update,\n false,\n );\n const result = await executeFindOneAndUpdate(db, cmd);\n return result !== null;\n}\n\n/**\n * Appends a ledger entry for the given space. Ledger entries co-exist\n * with marker docs in the same collection; marker docs use `_id: <space>`\n * (string), ledger entries use `type: 'ledger'` plus a driver-generated\n * ObjectId. Reads partition the two by filter shape.\n *\n * The same `edgeId` may legitimately recur across different spaces (e.g.\n * a synthetic ∅→head edge on first apply), so the ledger key is\n * `(space, edgeId)` — the doc carries `space` for partitioned reads.\n */\n/**\n * Reads per-migration ledger entries for `space` in apply order. Returns\n * `[]` when no ledger documents exist for that space yet.\n */\nexport async function readLedger(db: Db, space: string): Promise<readonly LedgerEntryRecord[]> {\n const ledgerContext = { space, markerLocation: MONGO_LEDGER_COLLECTION };\n const docs = await withMarkerReadErrorHandling(\n () =>\n executeAggregate(\n db,\n new RawAggregateCommand(COLLECTION, [\n { $match: { type: 'ledger', space } },\n { $sort: { _id: 1 } },\n ]),\n ),\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 if (typeof migrationName !== 'string' || typeof migrationHash !== 'string') {\n continue;\n }\n if (typeof from !== 'string' || typeof to !== '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,\n migrationName,\n migrationHash,\n from: ledgerOriginFromStored(from),\n to,\n appliedAt: appliedAtDate,\n operationCount: opList.length,\n });\n }\n return entries;\n}\n\nexport async function writeLedgerEntry(\n db: Db,\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 cmd = new RawInsertOneCommand(COLLECTION, {\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: entry.operations,\n appliedAt: new Date(),\n });\n await executeInsertOne(db, cmd);\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';\n\nexport function extractDb(driver: ControlDriverInstance<'mongo', 'mongo'>): Db {\n const mongoDriver = driver as ControlDriverInstance<'mongo', 'mongo'> & { db?: Db };\n if (!mongoDriver.db) {\n throw new Error(\n 'Mongo control driver does not expose a db property. ' +\n 'Use mongoControlDriver.create() from `@prisma-next/driver-mongo/control`.',\n );\n }\n return mongoDriver.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 type { MongoControlAdapter } from '@prisma-next/family-mongo/control-adapter';\nimport type { ControlDriverInstance } from '@prisma-next/framework-components/control';\nimport type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';\nimport { introspectSchema } from './introspect-schema';\nimport {\n initMarker,\n readAllMarkers,\n readLedger,\n readMarker,\n updateMarker,\n writeLedgerEntry,\n} from './marker-ledger';\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 by extracting the underlying `Db` from the framework-shaped driver\n * and forwarding to the wire-level helpers in this package.\n */\nexport class MongoControlAdapterImpl implements MongoControlAdapter<'mongo'> {\n readonly familyId = 'mongo' as const;\n readonly targetId = 'mongo' as const;\n\n async readMarker(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n ): Promise<ContractMarkerRecord | null> {\n return readMarker(extractDb(driver), space);\n }\n\n async readAllMarkers(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n return readAllMarkers(extractDb(driver));\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 await initMarker(extractDb(driver), space, destination);\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 return updateMarker(extractDb(driver), space, expectedFrom, destination);\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 await writeLedgerEntry(extractDb(driver), space, entry);\n }\n\n async readLedger(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n ): Promise<readonly LedgerEntryRecord[]> {\n return readLedger(extractDb(driver), space);\n }\n\n async introspectSchema(driver: ControlDriverInstance<'mongo', 'mongo'>): Promise<MongoSchemaIR> {\n return introspectSchema(extractDb(driver));\n }\n}\n","import type { ControlDriverInstance } from '@prisma-next/framework-components/control';\nimport type { Db, MongoClient } from 'mongodb';\n\nexport interface MongoControlDriverInstance extends ControlDriverInstance<'mongo', 'mongo'> {\n readonly db: Db;\n}\n\nclass MongoControlDriverImpl implements MongoControlDriverInstance {\n readonly familyId = 'mongo' as const;\n readonly targetId = 'mongo' as const;\n readonly db: Db;\n readonly #client: MongoClient;\n\n constructor(db: Db, client: MongoClient) {\n this.db = db;\n this.#client = client;\n }\n\n query(): Promise<never> {\n throw new Error('MongoDB control driver does not support SQL queries');\n }\n\n async close(): Promise<void> {\n await this.#client.close();\n }\n}\n\nexport function createMongoControlDriver(db: Db, client: MongoClient): MongoControlDriverInstance {\n return new MongoControlDriverImpl(db, client);\n}\n","import type { MongoControlAdapterDescriptor } from '@prisma-next/family-mongo/control-adapter';\n\nexport { MongoCommandExecutor, MongoInspectionExecutor } from '../core/command-executor';\nexport { introspectSchema } from '../core/introspect-schema';\nexport {\n initMarker,\n readAllMarkers,\n readLedger,\n readMarker,\n updateMarker,\n writeLedgerEntry,\n} from '../core/marker-ledger';\nexport { MongoControlAdapterImpl } from '../core/mongo-control-adapter';\nexport {\n createMongoControlDriver,\n type MongoControlDriverInstance,\n} 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';\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":["#client"],"sources":["../src/core/command-executor.ts","../src/core/introspect-schema.ts","../src/core/marker-ledger.ts","../src/core/runner-deps.ts","../src/core/mongo-control-adapter.ts","../src/core/mongo-control-driver.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, withMarkerReadErrorHandling } from '@prisma-next/errors/execution';\nimport {\n RawAggregateCommand,\n RawFindOneAndUpdateCommand,\n RawInsertOneCommand,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { type } from 'arktype';\nimport type { Db, Document, UpdateFilter } from 'mongodb';\n\nconst COLLECTION = '_prisma_migrations';\nconst MONGO_MARKER_COLLECTION = `_prisma_migrations marker documents in ${COLLECTION}`;\n\n/**\n * Marker doc shape.\n *\n * Same fields as the SQL marker row but camelCase + Mongo-native types:\n * `Date` is BSON-hydrated, `meta` is a native object (not JSON-stringified),\n * `_id` and any extension fields are tolerated. `invariants?` is optional —\n * absent reads as `[]` (schemaless default); present-but-malformed throws.\n *\n * `space` is required: every marker doc is keyed by its space id (`_id`)\n * and stamped with a matching `space` field for partitioned reads.\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\nfunction 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 as Record<string, unknown> | null) ?? {},\n invariants: result.invariants ?? [],\n };\n}\n\nfunction parseMongoMarkerDocSafely(doc: unknown, space: string): ContractMarkerRecord {\n return parseMarkerRowSafely(doc, parseMongoMarkerDoc, {\n space,\n markerLocation: MONGO_MARKER_COLLECTION,\n });\n}\n\nasync function executeAggregate(db: Db, cmd: RawAggregateCommand): Promise<Document[]> {\n return db\n .collection(cmd.collection)\n .aggregate(cmd.pipeline as Record<string, unknown>[])\n .toArray();\n}\n\nasync function executeInsertOne(db: Db, cmd: RawInsertOneCommand): Promise<void> {\n await db.collection(cmd.collection).insertOne(cmd.document);\n}\n\nasync function executeFindOneAndUpdate(\n db: Db,\n cmd: RawFindOneAndUpdateCommand,\n): Promise<Document | null> {\n // `cmd.update` is `Document | ReadonlyArray<Document>` per the AST. The\n // MongoDB driver's `findOneAndUpdate` accepts the same shape under the\n // type `UpdateFilter<T> | Document[]`. The driver's runtime path handles\n // both forms identically — pipelines (array) and update docs (object).\n // One cast to that union keeps the call single-arm.\n return db\n .collection(cmd.collection)\n .findOneAndUpdate(cmd.filter, cmd.update as UpdateFilter<Document> | Document[], {\n upsert: cmd.upsert,\n });\n}\n\n/**\n * Reads the marker document for the given contract space, or returns\n * `null` if no marker has been written for that space yet. Each space\n * owns one row keyed by `_id: <space>` — see ADR 212 for the per-space\n * mechanism this enables.\n */\nexport async function readMarker(db: Db, space: string): Promise<ContractMarkerRecord | null> {\n const markerContext = { space, markerLocation: MONGO_MARKER_COLLECTION };\n const docs = await withMarkerReadErrorHandling(\n () =>\n executeAggregate(\n db,\n new RawAggregateCommand(COLLECTION, [{ $match: { _id: space, space } }, { $limit: 1 }]),\n ),\n markerContext,\n );\n const doc = docs[0];\n if (!doc) return null;\n return parseMongoMarkerDocSafely(doc, space);\n}\n\n/**\n * Reads every marker doc in the collection (one per contract space)\n * and returns them keyed by `space`. Used by the per-space verifier\n * to detect marker-vs-on-disk drift and orphan marker rows. Returns\n * an empty map when no marker docs have been written yet.\n *\n * Marker docs are keyed by `_id: <space>` (string); ledger entries\n * live in the same collection but use a driver-generated `ObjectId`\n * `_id` plus `type: 'ledger'`. The filter selects string-keyed docs\n * with a `space` field, which excludes ledger entries by construction.\n */\nexport async function readAllMarkers(db: Db): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n const markerContext = { space: 'app', markerLocation: MONGO_MARKER_COLLECTION };\n const docs = await withMarkerReadErrorHandling(\n () =>\n executeAggregate(\n db,\n new RawAggregateCommand(COLLECTION, [\n {\n $match: {\n _id: { $type: 'string' },\n space: { $type: 'string' },\n $expr: { $eq: ['$_id', '$space'] },\n },\n },\n ]),\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\nexport async function initMarker(\n db: Db,\n space: string,\n destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n readonly invariants?: readonly string[];\n },\n): Promise<void> {\n const cmd = new RawInsertOneCommand(COLLECTION, {\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 executeInsertOne(db, cmd);\n}\n\n/**\n * Updates the marker doc for the given space atomically (CAS on\n * `expectedFrom`).\n *\n * `destination.invariants`:\n * - `undefined` → existing field left untouched.\n * - explicit value → merged into the existing field server-side via an\n * aggregation pipeline (`$setUnion + $sortArray`), atomic at the\n * document level. `[]` is a no-op merge.\n */\nexport async function updateMarker(\n db: Db,\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 setBase: Record<string, unknown> = {\n storageHash: destination.storageHash,\n profileHash: destination.profileHash,\n updatedAt: new Date(),\n };\n // When invariants is supplied, use an aggregation pipeline so the\n // merge runs server-side against the doc's current value (atomic, no\n // read-then-write window). When omitted, a regular update doc keeps\n // the field untouched.\n const update: Document | Document[] =\n destination.invariants === undefined\n ? { $set: setBase }\n : [\n {\n $set: {\n ...setBase,\n invariants: {\n $sortArray: {\n input: { $setUnion: [{ $ifNull: ['$invariants', []] }, destination.invariants] },\n sortBy: 1,\n },\n },\n },\n },\n ];\n const cmd = new RawFindOneAndUpdateCommand(\n COLLECTION,\n { _id: space, space, storageHash: expectedFrom },\n update,\n false,\n );\n const result = await executeFindOneAndUpdate(db, cmd);\n return result !== null;\n}\n\n/**\n * Appends a ledger entry for the given space. Ledger entries co-exist\n * with marker docs in the same collection; marker docs use `_id: <space>`\n * (string), ledger entries use `type: 'ledger'` plus a driver-generated\n * ObjectId. Reads partition the two by filter shape.\n *\n * The same `edgeId` may legitimately recur across different spaces (e.g.\n * a synthetic ∅→head edge on first apply), so the ledger key is\n * `(space, edgeId)` — the doc carries `space` for partitioned reads.\n */\nexport async function writeLedgerEntry(\n db: Db,\n space: string,\n entry: { readonly edgeId: string; readonly from: string; readonly to: string },\n): Promise<void> {\n const cmd = new RawInsertOneCommand(COLLECTION, {\n type: 'ledger',\n space,\n edgeId: entry.edgeId,\n from: entry.from,\n to: entry.to,\n appliedAt: new Date(),\n });\n await executeInsertOne(db, cmd);\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';\n\nexport function extractDb(driver: ControlDriverInstance<'mongo', 'mongo'>): Db {\n const mongoDriver = driver as ControlDriverInstance<'mongo', 'mongo'> & { db?: Db };\n if (!mongoDriver.db) {\n throw new Error(\n 'Mongo control driver does not expose a db property. ' +\n 'Use mongoControlDriver.create() from `@prisma-next/driver-mongo/control`.',\n );\n }\n return mongoDriver.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 },\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 M2.5 family→adapter SPI dispatch refactor: the runner\n // dependencies now route every wire-level call through `controlAdapter`, so\n // the `family` instance is no longer consulted. Kept on the signature to\n // avoid rippling through ~14 call sites mid-orchestration; a follow-up that\n // already touches this factory 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 } from '@prisma-next/contract/types';\nimport type { MongoControlAdapter } from '@prisma-next/family-mongo/control-adapter';\nimport type { ControlDriverInstance } from '@prisma-next/framework-components/control';\nimport type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';\nimport { introspectSchema } from './introspect-schema';\nimport {\n initMarker,\n readAllMarkers,\n readMarker,\n updateMarker,\n writeLedgerEntry,\n} from './marker-ledger';\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 by extracting the underlying `Db` from the framework-shaped driver\n * and forwarding to the wire-level helpers in this package.\n */\nexport class MongoControlAdapterImpl implements MongoControlAdapter<'mongo'> {\n readonly familyId = 'mongo' as const;\n readonly targetId = 'mongo' as const;\n\n async readMarker(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n ): Promise<ContractMarkerRecord | null> {\n return readMarker(extractDb(driver), space);\n }\n\n async readAllMarkers(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n ): Promise<ReadonlyMap<string, ContractMarkerRecord>> {\n return readAllMarkers(extractDb(driver));\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 await initMarker(extractDb(driver), space, destination);\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 return updateMarker(extractDb(driver), space, expectedFrom, destination);\n }\n\n async writeLedgerEntry(\n driver: ControlDriverInstance<'mongo', 'mongo'>,\n space: string,\n entry: { readonly edgeId: string; readonly from: string; readonly to: string },\n ): Promise<void> {\n await writeLedgerEntry(extractDb(driver), space, entry);\n }\n\n async introspectSchema(driver: ControlDriverInstance<'mongo', 'mongo'>): Promise<MongoSchemaIR> {\n return introspectSchema(extractDb(driver));\n }\n}\n","import type { ControlDriverInstance } from '@prisma-next/framework-components/control';\nimport type { Db, MongoClient } from 'mongodb';\n\nexport interface MongoControlDriverInstance extends ControlDriverInstance<'mongo', 'mongo'> {\n readonly db: Db;\n}\n\nclass MongoControlDriverImpl implements MongoControlDriverInstance {\n readonly familyId = 'mongo' as const;\n readonly targetId = 'mongo' as const;\n readonly db: Db;\n readonly #client: MongoClient;\n\n constructor(db: Db, client: MongoClient) {\n this.db = db;\n this.#client = client;\n }\n\n query(): Promise<never> {\n throw new Error('MongoDB control driver does not support SQL queries');\n }\n\n async close(): Promise<void> {\n await this.#client.close();\n }\n}\n\nexport function createMongoControlDriver(db: Db, client: MongoClient): MongoControlDriverInstance {\n return new MongoControlDriverImpl(db, client);\n}\n","import type { MongoControlAdapterDescriptor } from '@prisma-next/family-mongo/control-adapter';\n\nexport { MongoCommandExecutor, MongoInspectionExecutor } from '../core/command-executor';\nexport { introspectSchema } from '../core/introspect-schema';\nexport {\n initMarker,\n readAllMarkers,\n readMarker,\n updateMarker,\n writeLedgerEntry,\n} from '../core/marker-ledger';\nexport { MongoControlAdapterImpl } from '../core/mongo-control-adapter';\nexport {\n createMongoControlDriver,\n type MongoControlDriverInstance,\n} 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';\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/package.json
CHANGED
|
@@ -1,37 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/adapter-mongo",
|
|
3
|
-
"version": "0.12.0-dev.
|
|
3
|
+
"version": "0.12.0-dev.2",
|
|
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.12.0-dev.
|
|
10
|
-
"@prisma-next/contract": "0.12.0-dev.
|
|
11
|
-
"@prisma-next/errors": "0.12.0-dev.
|
|
12
|
-
"@prisma-next/family-mongo": "0.12.0-dev.
|
|
13
|
-
"@prisma-next/framework-components": "0.12.0-dev.
|
|
14
|
-
"@prisma-next/
|
|
15
|
-
"@prisma-next/mongo-
|
|
16
|
-
"@prisma-next/mongo-
|
|
17
|
-
"@prisma-next/mongo-
|
|
18
|
-
"@prisma-next/mongo-
|
|
19
|
-
"@prisma-next/mongo-
|
|
20
|
-
"@prisma-next/mongo-
|
|
21
|
-
"@prisma-next/
|
|
22
|
-
"@prisma-next/
|
|
23
|
-
"@prisma-next/utils": "0.12.0-dev.17",
|
|
9
|
+
"@prisma-next/config": "0.12.0-dev.2",
|
|
10
|
+
"@prisma-next/contract": "0.12.0-dev.2",
|
|
11
|
+
"@prisma-next/errors": "0.12.0-dev.2",
|
|
12
|
+
"@prisma-next/family-mongo": "0.12.0-dev.2",
|
|
13
|
+
"@prisma-next/framework-components": "0.12.0-dev.2",
|
|
14
|
+
"@prisma-next/mongo-codec": "0.12.0-dev.2",
|
|
15
|
+
"@prisma-next/mongo-contract": "0.12.0-dev.2",
|
|
16
|
+
"@prisma-next/mongo-lowering": "0.12.0-dev.2",
|
|
17
|
+
"@prisma-next/mongo-query-ast": "0.12.0-dev.2",
|
|
18
|
+
"@prisma-next/mongo-schema-ir": "0.12.0-dev.2",
|
|
19
|
+
"@prisma-next/mongo-value": "0.12.0-dev.2",
|
|
20
|
+
"@prisma-next/mongo-wire": "0.12.0-dev.2",
|
|
21
|
+
"@prisma-next/operations": "0.12.0-dev.2",
|
|
22
|
+
"@prisma-next/utils": "0.12.0-dev.2",
|
|
24
23
|
"arktype": "^2.2.0"
|
|
25
24
|
},
|
|
26
25
|
"devDependencies": {
|
|
27
26
|
"mongodb": "^7.2.0",
|
|
28
|
-
"@prisma-next/driver-mongo": "0.12.0-dev.
|
|
29
|
-
"@prisma-next/errors": "0.12.0-dev.
|
|
30
|
-
"@prisma-next/mongo-contract-psl": "0.12.0-dev.
|
|
31
|
-
"@prisma-next/psl-parser": "0.12.0-dev.
|
|
32
|
-
"@prisma-next/test-utils": "0.12.0-dev.
|
|
33
|
-
"@prisma-next/tsconfig": "0.12.0-dev.
|
|
34
|
-
"@prisma-next/tsdown": "0.12.0-dev.
|
|
27
|
+
"@prisma-next/driver-mongo": "0.12.0-dev.2",
|
|
28
|
+
"@prisma-next/errors": "0.12.0-dev.2",
|
|
29
|
+
"@prisma-next/mongo-contract-psl": "0.12.0-dev.2",
|
|
30
|
+
"@prisma-next/psl-parser": "0.12.0-dev.2",
|
|
31
|
+
"@prisma-next/test-utils": "0.12.0-dev.2",
|
|
32
|
+
"@prisma-next/tsconfig": "0.12.0-dev.2",
|
|
33
|
+
"@prisma-next/tsdown": "0.12.0-dev.2",
|
|
35
34
|
"mongodb-memory-server": "11.1.0",
|
|
36
35
|
"tsdown": "0.22.0",
|
|
37
36
|
"typescript": "5.9.3",
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { ContractMarkerRecord
|
|
1
|
+
import type { ContractMarkerRecord } from '@prisma-next/contract/types';
|
|
2
2
|
import { parseMarkerRowSafely, withMarkerReadErrorHandling } from '@prisma-next/errors/execution';
|
|
3
|
-
import { ledgerOriginFromStored } from '@prisma-next/migration-tools/ledger-origin';
|
|
4
3
|
import {
|
|
5
4
|
RawAggregateCommand,
|
|
6
5
|
RawFindOneAndUpdateCommand,
|
|
@@ -11,7 +10,6 @@ import type { Db, Document, UpdateFilter } from 'mongodb';
|
|
|
11
10
|
|
|
12
11
|
const COLLECTION = '_prisma_migrations';
|
|
13
12
|
const MONGO_MARKER_COLLECTION = `_prisma_migrations marker documents in ${COLLECTION}`;
|
|
14
|
-
const MONGO_LEDGER_COLLECTION = `_prisma_migrations ledger documents in ${COLLECTION}`;
|
|
15
13
|
|
|
16
14
|
/**
|
|
17
15
|
* Marker doc shape.
|
|
@@ -237,69 +235,10 @@ export async function updateMarker(
|
|
|
237
235
|
* a synthetic ∅→head edge on first apply), so the ledger key is
|
|
238
236
|
* `(space, edgeId)` — the doc carries `space` for partitioned reads.
|
|
239
237
|
*/
|
|
240
|
-
/**
|
|
241
|
-
* Reads per-migration ledger entries for `space` in apply order. Returns
|
|
242
|
-
* `[]` when no ledger documents exist for that space yet.
|
|
243
|
-
*/
|
|
244
|
-
export async function readLedger(db: Db, space: string): Promise<readonly LedgerEntryRecord[]> {
|
|
245
|
-
const ledgerContext = { space, markerLocation: MONGO_LEDGER_COLLECTION };
|
|
246
|
-
const docs = await withMarkerReadErrorHandling(
|
|
247
|
-
() =>
|
|
248
|
-
executeAggregate(
|
|
249
|
-
db,
|
|
250
|
-
new RawAggregateCommand(COLLECTION, [
|
|
251
|
-
{ $match: { type: 'ledger', space } },
|
|
252
|
-
{ $sort: { _id: 1 } },
|
|
253
|
-
]),
|
|
254
|
-
),
|
|
255
|
-
ledgerContext,
|
|
256
|
-
);
|
|
257
|
-
|
|
258
|
-
const entries: LedgerEntryRecord[] = [];
|
|
259
|
-
for (const doc of docs) {
|
|
260
|
-
const migrationName = doc['migrationName'];
|
|
261
|
-
const migrationHash = doc['migrationHash'];
|
|
262
|
-
const from = doc['from'];
|
|
263
|
-
const to = doc['to'];
|
|
264
|
-
if (typeof migrationName !== 'string' || typeof migrationHash !== 'string') {
|
|
265
|
-
continue;
|
|
266
|
-
}
|
|
267
|
-
if (typeof from !== 'string' || typeof to !== 'string') {
|
|
268
|
-
continue;
|
|
269
|
-
}
|
|
270
|
-
const appliedAt = doc['appliedAt'];
|
|
271
|
-
const appliedAtDate =
|
|
272
|
-
appliedAt instanceof Date
|
|
273
|
-
? appliedAt
|
|
274
|
-
: appliedAt !== undefined
|
|
275
|
-
? new Date(String(appliedAt))
|
|
276
|
-
: new Date();
|
|
277
|
-
const operations = doc['operations'];
|
|
278
|
-
const opList = Array.isArray(operations) ? operations : [];
|
|
279
|
-
entries.push({
|
|
280
|
-
space,
|
|
281
|
-
migrationName,
|
|
282
|
-
migrationHash,
|
|
283
|
-
from: ledgerOriginFromStored(from),
|
|
284
|
-
to,
|
|
285
|
-
appliedAt: appliedAtDate,
|
|
286
|
-
operationCount: opList.length,
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
return entries;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
238
|
export async function writeLedgerEntry(
|
|
293
239
|
db: Db,
|
|
294
240
|
space: string,
|
|
295
|
-
entry: {
|
|
296
|
-
readonly edgeId: string;
|
|
297
|
-
readonly from: string;
|
|
298
|
-
readonly to: string;
|
|
299
|
-
readonly migrationName: string;
|
|
300
|
-
readonly migrationHash: string;
|
|
301
|
-
readonly operations: readonly unknown[];
|
|
302
|
-
},
|
|
241
|
+
entry: { readonly edgeId: string; readonly from: string; readonly to: string },
|
|
303
242
|
): Promise<void> {
|
|
304
243
|
const cmd = new RawInsertOneCommand(COLLECTION, {
|
|
305
244
|
type: 'ledger',
|
|
@@ -307,9 +246,6 @@ export async function writeLedgerEntry(
|
|
|
307
246
|
edgeId: entry.edgeId,
|
|
308
247
|
from: entry.from,
|
|
309
248
|
to: entry.to,
|
|
310
|
-
migrationName: entry.migrationName,
|
|
311
|
-
migrationHash: entry.migrationHash,
|
|
312
|
-
operations: entry.operations,
|
|
313
249
|
appliedAt: new Date(),
|
|
314
250
|
});
|
|
315
251
|
await executeInsertOne(db, cmd);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ContractMarkerRecord
|
|
1
|
+
import type { ContractMarkerRecord } from '@prisma-next/contract/types';
|
|
2
2
|
import type { MongoControlAdapter } from '@prisma-next/family-mongo/control-adapter';
|
|
3
3
|
import type { ControlDriverInstance } from '@prisma-next/framework-components/control';
|
|
4
4
|
import type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';
|
|
@@ -6,7 +6,6 @@ import { introspectSchema } from './introspect-schema';
|
|
|
6
6
|
import {
|
|
7
7
|
initMarker,
|
|
8
8
|
readAllMarkers,
|
|
9
|
-
readLedger,
|
|
10
9
|
readMarker,
|
|
11
10
|
updateMarker,
|
|
12
11
|
writeLedgerEntry,
|
|
@@ -64,25 +63,11 @@ export class MongoControlAdapterImpl implements MongoControlAdapter<'mongo'> {
|
|
|
64
63
|
async writeLedgerEntry(
|
|
65
64
|
driver: ControlDriverInstance<'mongo', 'mongo'>,
|
|
66
65
|
space: string,
|
|
67
|
-
entry: {
|
|
68
|
-
readonly edgeId: string;
|
|
69
|
-
readonly from: string;
|
|
70
|
-
readonly to: string;
|
|
71
|
-
readonly migrationName: string;
|
|
72
|
-
readonly migrationHash: string;
|
|
73
|
-
readonly operations: readonly unknown[];
|
|
74
|
-
},
|
|
66
|
+
entry: { readonly edgeId: string; readonly from: string; readonly to: string },
|
|
75
67
|
): Promise<void> {
|
|
76
68
|
await writeLedgerEntry(extractDb(driver), space, entry);
|
|
77
69
|
}
|
|
78
70
|
|
|
79
|
-
async readLedger(
|
|
80
|
-
driver: ControlDriverInstance<'mongo', 'mongo'>,
|
|
81
|
-
space: string,
|
|
82
|
-
): Promise<readonly LedgerEntryRecord[]> {
|
|
83
|
-
return readLedger(extractDb(driver), space);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
71
|
async introspectSchema(driver: ControlDriverInstance<'mongo', 'mongo'>): Promise<MongoSchemaIR> {
|
|
87
72
|
return introspectSchema(extractDb(driver));
|
|
88
73
|
}
|
package/src/core/runner-deps.ts
CHANGED
|
@@ -57,9 +57,6 @@ export interface MarkerOperations {
|
|
|
57
57
|
readonly edgeId: string;
|
|
58
58
|
readonly from: string;
|
|
59
59
|
readonly to: string;
|
|
60
|
-
readonly migrationName: string;
|
|
61
|
-
readonly migrationHash: string;
|
|
62
|
-
readonly operations: readonly unknown[];
|
|
63
60
|
},
|
|
64
61
|
): Promise<void>;
|
|
65
62
|
}
|
|
@@ -85,11 +82,11 @@ export interface MongoRunnerDependencies {
|
|
|
85
82
|
export function createMongoRunnerDeps(
|
|
86
83
|
controlDriver: ControlDriverInstance<'mongo', 'mongo'>,
|
|
87
84
|
driver: MongoDriver,
|
|
88
|
-
// Vestigial after the family→adapter SPI refactor: the runner
|
|
89
|
-
// now route every wire-level call through `controlAdapter`, so
|
|
90
|
-
// instance is no longer consulted. Kept on the signature to
|
|
91
|
-
// through ~14 call sites; a follow-up that
|
|
92
|
-
// should drop the parameter outright.
|
|
85
|
+
// Vestigial after the M2.5 family→adapter SPI dispatch refactor: the runner
|
|
86
|
+
// dependencies now route every wire-level call through `controlAdapter`, so
|
|
87
|
+
// the `family` instance is no longer consulted. Kept on the signature to
|
|
88
|
+
// avoid rippling through ~14 call sites mid-orchestration; a follow-up that
|
|
89
|
+
// already touches this factory should drop the parameter outright.
|
|
93
90
|
_family: ControlFamilyInstance<'mongo', MongoSchemaIR>,
|
|
94
91
|
controlAdapter: MongoControlAdapter<'mongo'> = new MongoControlAdapterImpl(),
|
|
95
92
|
): MongoRunnerDependencies {
|