@prisma-next/target-mongo 0.5.0-dev.7 → 0.5.0-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/control.mjs +2 -2
- package/dist/control.mjs.map +1 -1
- package/package.json +14 -14
- package/src/core/mongo-runner.ts +2 -2
package/dist/control.mjs
CHANGED
|
@@ -1195,7 +1195,7 @@ var MongoMigrationRunner = class {
|
|
|
1195
1195
|
};
|
|
1196
1196
|
}
|
|
1197
1197
|
for (const plan of op.run) {
|
|
1198
|
-
const wireCommand = adapter.lower(plan);
|
|
1198
|
+
const wireCommand = await adapter.lower(plan);
|
|
1199
1199
|
for await (const _ of driver.execute(wireCommand));
|
|
1200
1200
|
}
|
|
1201
1201
|
if (runPostchecks && op.postcheck.length > 0) {
|
|
@@ -1221,7 +1221,7 @@ var MongoMigrationRunner = class {
|
|
|
1221
1221
|
collection: check.source.collection
|
|
1222
1222
|
}
|
|
1223
1223
|
});
|
|
1224
|
-
const wireCommand = adapter.lower(check.source);
|
|
1224
|
+
const wireCommand = await adapter.lower(check.source);
|
|
1225
1225
|
let matchFound = false;
|
|
1226
1226
|
for await (const row of driver.execute(wireCommand)) if (filterEvaluator.evaluate(check.filter, row)) {
|
|
1227
1227
|
matchFound = true;
|
package/dist/control.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.mjs","names":["parts: string[]","statements: string[]","current: unknown","opts: {\n from: string;\n as: string;\n localField?: string;\n foreignField?: string;\n pipeline?: ReadonlyArray<MongoPipelineStage>;\n let_?: Record<string, never>;\n }","opts: {\n into: string | { db: string; coll: string };\n on?: string | ReadonlyArray<string>;\n whenMatched?: string | ReadonlyArray<MongoUpdatePipelineStage>;\n whenNotMatched?: string;\n }","meta: PlanMeta","opts: MongoSchemaCollectionOptions | undefined","validator: MongoSchemaValidator | undefined","BASE_IMPORTS: readonly ImportRequirement[]","requirements: ImportRequirement[]","lines: string[]","calls: readonly OpFactoryCall[]","meta: MigrationMeta","collCreates: OpFactoryCall[]","drops: OpFactoryCall[]","creates: OpFactoryCall[]","validatorOps: OpFactoryCall[]","mutableOptionOps: OpFactoryCall[]","collDrops: OpFactoryCall[]","conflicts: MigrationPlannerConflict[]","operationClass: MigrationOperationClass","READ_ONLY_CHECK_COMMAND_KINDS: ReadonlySet<string>","deps: MongoRunnerDependencies"],"sources":["../src/core/ddl-formatter.ts","../src/core/filter-evaluator.ts","../src/core/marker-ledger.ts","../src/core/mongo-ops-serializer.ts","../src/core/op-factory-call.ts","../src/core/render-ops.ts","../src/core/render-typescript.ts","../src/core/planner-produced-migration.ts","../src/core/mongo-planner.ts","../src/core/mongo-runner.ts"],"sourcesContent":["import type { MigrationPlanOperation } from '@prisma-next/framework-components/control';\nimport type {\n CollModCommand,\n CreateCollectionCommand,\n CreateIndexCommand,\n DropCollectionCommand,\n DropIndexCommand,\n MongoDdlCommandVisitor,\n MongoIndexKey,\n} from '@prisma-next/mongo-query-ast/control';\n\nfunction formatKeySpec(keys: ReadonlyArray<MongoIndexKey>): string {\n const entries = keys.map((k) => `${JSON.stringify(k.field)}: ${JSON.stringify(k.direction)}`);\n return `{ ${entries.join(', ')} }`;\n}\n\nfunction formatOptions(cmd: CreateIndexCommand): string | undefined {\n const parts: string[] = [];\n if (cmd.unique) parts.push('unique: true');\n if (cmd.sparse) parts.push('sparse: true');\n if (cmd.expireAfterSeconds !== undefined)\n parts.push(`expireAfterSeconds: ${cmd.expireAfterSeconds}`);\n if (cmd.name) parts.push(`name: ${JSON.stringify(cmd.name)}`);\n if (cmd.collation) parts.push(`collation: ${JSON.stringify(cmd.collation)}`);\n if (cmd.weights) parts.push(`weights: ${JSON.stringify(cmd.weights)}`);\n if (cmd.default_language) parts.push(`default_language: ${JSON.stringify(cmd.default_language)}`);\n if (cmd.language_override)\n parts.push(`language_override: ${JSON.stringify(cmd.language_override)}`);\n if (cmd.wildcardProjection)\n parts.push(`wildcardProjection: ${JSON.stringify(cmd.wildcardProjection)}`);\n if (cmd.partialFilterExpression)\n parts.push(`partialFilterExpression: ${JSON.stringify(cmd.partialFilterExpression)}`);\n if (parts.length === 0) return undefined;\n return `{ ${parts.join(', ')} }`;\n}\n\nfunction formatCreateCollectionOptions(cmd: CreateCollectionCommand): string | undefined {\n const parts: string[] = [];\n if (cmd.capped) parts.push('capped: true');\n if (cmd.size !== undefined) parts.push(`size: ${cmd.size}`);\n if (cmd.max !== undefined) parts.push(`max: ${cmd.max}`);\n if (cmd.timeseries) parts.push(`timeseries: ${JSON.stringify(cmd.timeseries)}`);\n if (cmd.collation) parts.push(`collation: ${JSON.stringify(cmd.collation)}`);\n if (cmd.clusteredIndex) parts.push(`clusteredIndex: ${JSON.stringify(cmd.clusteredIndex)}`);\n if (cmd.validator) parts.push(`validator: ${JSON.stringify(cmd.validator)}`);\n if (cmd.validationLevel) parts.push(`validationLevel: ${JSON.stringify(cmd.validationLevel)}`);\n if (cmd.validationAction) parts.push(`validationAction: ${JSON.stringify(cmd.validationAction)}`);\n if (cmd.changeStreamPreAndPostImages)\n parts.push(`changeStreamPreAndPostImages: ${JSON.stringify(cmd.changeStreamPreAndPostImages)}`);\n if (parts.length === 0) return undefined;\n return `{ ${parts.join(', ')} }`;\n}\n\nclass MongoDdlCommandFormatter implements MongoDdlCommandVisitor<string> {\n createIndex(cmd: CreateIndexCommand): string {\n const keySpec = formatKeySpec(cmd.keys);\n const opts = formatOptions(cmd);\n return opts\n ? `db.${cmd.collection}.createIndex(${keySpec}, ${opts})`\n : `db.${cmd.collection}.createIndex(${keySpec})`;\n }\n\n dropIndex(cmd: DropIndexCommand): string {\n return `db.${cmd.collection}.dropIndex(${JSON.stringify(cmd.name)})`;\n }\n\n createCollection(cmd: CreateCollectionCommand): string {\n const opts = formatCreateCollectionOptions(cmd);\n return opts\n ? `db.createCollection(${JSON.stringify(cmd.collection)}, ${opts})`\n : `db.createCollection(${JSON.stringify(cmd.collection)})`;\n }\n\n dropCollection(cmd: DropCollectionCommand): string {\n return `db.${cmd.collection}.drop()`;\n }\n\n collMod(cmd: CollModCommand): string {\n const parts: string[] = [`collMod: ${JSON.stringify(cmd.collection)}`];\n if (cmd.validator) parts.push(`validator: ${JSON.stringify(cmd.validator)}`);\n if (cmd.validationLevel) parts.push(`validationLevel: ${JSON.stringify(cmd.validationLevel)}`);\n if (cmd.validationAction)\n parts.push(`validationAction: ${JSON.stringify(cmd.validationAction)}`);\n if (cmd.changeStreamPreAndPostImages)\n parts.push(\n `changeStreamPreAndPostImages: ${JSON.stringify(cmd.changeStreamPreAndPostImages)}`,\n );\n return `db.runCommand({ ${parts.join(', ')} })`;\n }\n}\n\nconst formatter = new MongoDdlCommandFormatter();\n\ninterface MongoExecuteStep {\n readonly command: { readonly accept: <R>(visitor: MongoDdlCommandVisitor<R>) => R };\n}\n\nexport function formatMongoOperations(operations: readonly MigrationPlanOperation[]): string[] {\n const statements: string[] = [];\n for (const operation of operations) {\n const candidate = operation as unknown as Record<string, unknown>;\n if (!('execute' in candidate) || !Array.isArray(candidate['execute'])) {\n continue;\n }\n for (const step of candidate['execute'] as MongoExecuteStep[]) {\n if (step.command && typeof step.command.accept === 'function') {\n statements.push(step.command.accept(formatter));\n }\n }\n }\n return statements;\n}\n","import type {\n MongoAndExpr,\n MongoExistsExpr,\n MongoExprFilter,\n MongoFieldFilter,\n MongoFilterExpr,\n MongoFilterVisitor,\n MongoNotExpr,\n MongoOrExpr,\n} from '@prisma-next/mongo-query-ast/control';\nimport { deepEqual } from '@prisma-next/mongo-schema-ir';\nimport type { MongoValue } from '@prisma-next/mongo-value';\n\nfunction getNestedField(doc: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = doc;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n const record = current as Record<string, unknown>;\n if (!Object.hasOwn(record, part)) {\n return undefined;\n }\n current = record[part];\n }\n return current;\n}\n\nfunction evaluateFieldOp(op: string, actual: unknown, expected: MongoValue): boolean {\n switch (op) {\n case '$eq':\n return deepEqual(actual, expected);\n case '$ne':\n return !deepEqual(actual, expected);\n case '$gt':\n return typeof actual === typeof expected && (actual as number) > (expected as number);\n case '$gte':\n return typeof actual === typeof expected && (actual as number) >= (expected as number);\n case '$lt':\n return typeof actual === typeof expected && (actual as number) < (expected as number);\n case '$lte':\n return typeof actual === typeof expected && (actual as number) <= (expected as number);\n case '$in':\n return Array.isArray(expected) && expected.some((v) => deepEqual(actual, v));\n default:\n throw new Error(`Unsupported filter operator in migration check: ${op}`);\n }\n}\n\nexport class FilterEvaluator implements MongoFilterVisitor<boolean> {\n private doc: Record<string, unknown> = {};\n\n evaluate(filter: MongoFilterExpr, doc: Record<string, unknown>): boolean {\n this.doc = doc;\n return filter.accept(this);\n }\n\n field(expr: MongoFieldFilter): boolean {\n const value = getNestedField(this.doc, expr.field);\n return evaluateFieldOp(expr.op, value, expr.value);\n }\n\n and(expr: MongoAndExpr): boolean {\n return expr.exprs.every((child) => child.accept(this));\n }\n\n or(expr: MongoOrExpr): boolean {\n return expr.exprs.some((child) => child.accept(this));\n }\n\n not(expr: MongoNotExpr): boolean {\n return !expr.expr.accept(this);\n }\n\n exists(expr: MongoExistsExpr): boolean {\n const has = getNestedField(this.doc, expr.field) !== undefined;\n return expr.exists ? has : !has;\n }\n\n expr(_expr: MongoExprFilter): boolean {\n throw new Error('Aggregation expression filters are not supported in migration checks');\n }\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport {\n RawAggregateCommand,\n RawFindOneAndUpdateCommand,\n RawInsertOneCommand,\n} from '@prisma-next/mongo-query-ast/execution';\nimport type { Db, Document } from 'mongodb';\n\nconst COLLECTION = '_prisma_migrations';\nconst MARKER_ID = 'marker';\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 return db\n .collection(cmd.collection)\n .findOneAndUpdate(cmd.filter, cmd.update as Record<string, unknown>, { upsert: cmd.upsert });\n}\n\nexport async function readMarker(db: Db): Promise<ContractMarkerRecord | null> {\n const cmd = new RawAggregateCommand(COLLECTION, [{ $match: { _id: MARKER_ID } }, { $limit: 1 }]);\n const docs = await executeAggregate(db, cmd);\n const doc = docs[0];\n if (!doc) return null;\n return {\n storageHash: doc['storageHash'] as string,\n profileHash: doc['profileHash'] as string,\n contractJson: (doc['contractJson'] as unknown) ?? null,\n canonicalVersion: (doc['canonicalVersion'] as number) ?? null,\n updatedAt: doc['updatedAt'] as Date,\n appTag: (doc['appTag'] as string) ?? null,\n meta: (doc['meta'] as Record<string, unknown>) ?? {},\n };\n}\n\nexport async function initMarker(\n db: Db,\n destination: { readonly storageHash: string; readonly profileHash: string },\n): Promise<void> {\n const cmd = new RawInsertOneCommand(COLLECTION, {\n _id: MARKER_ID,\n storageHash: destination.storageHash,\n profileHash: destination.profileHash,\n contractJson: null,\n canonicalVersion: null,\n updatedAt: new Date(),\n appTag: null,\n meta: {},\n });\n await executeInsertOne(db, cmd);\n}\n\nexport async function updateMarker(\n db: Db,\n expectedFrom: string,\n destination: { readonly storageHash: string; readonly profileHash: string },\n): Promise<boolean> {\n const cmd = new RawFindOneAndUpdateCommand(\n COLLECTION,\n { _id: MARKER_ID, storageHash: expectedFrom },\n {\n $set: {\n storageHash: destination.storageHash,\n profileHash: destination.profileHash,\n updatedAt: new Date(),\n },\n },\n false,\n );\n const result = await executeFindOneAndUpdate(db, cmd);\n return result !== null;\n}\n\nexport async function writeLedgerEntry(\n db: Db,\n entry: { readonly edgeId: string; readonly from: string; readonly to: string },\n): Promise<void> {\n const cmd = new RawInsertOneCommand(COLLECTION, {\n type: 'ledger',\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 { PlanMeta } from '@prisma-next/contract/types';\nimport type { MigrationOperationClass } from '@prisma-next/framework-components/control';\nimport {\n type AnyMongoDdlCommand,\n type AnyMongoInspectionCommand,\n type AnyMongoMigrationOperation,\n CollModCommand,\n CreateCollectionCommand,\n CreateIndexCommand,\n DropCollectionCommand,\n DropIndexCommand,\n ListCollectionsCommand,\n ListIndexesCommand,\n MongoAndExpr,\n type MongoDataTransformCheck,\n type MongoDataTransformOperation,\n MongoExistsExpr,\n MongoFieldFilter,\n type MongoFilterExpr,\n type MongoMigrationCheck,\n type MongoMigrationPlanOperation,\n type MongoMigrationStep,\n MongoNotExpr,\n MongoOrExpr,\n} from '@prisma-next/mongo-query-ast/control';\nimport {\n AggregateCommand,\n type AnyMongoCommand,\n MongoAddFieldsStage,\n MongoLimitStage,\n MongoLookupStage,\n MongoMatchStage,\n MongoMergeStage,\n type MongoPipelineStage,\n MongoProjectStage,\n type MongoQueryPlan,\n MongoSortStage,\n type MongoUpdatePipelineStage,\n RawAggregateCommand,\n RawDeleteManyCommand,\n RawDeleteOneCommand,\n RawFindOneAndDeleteCommand,\n RawFindOneAndUpdateCommand,\n RawInsertManyCommand,\n RawInsertOneCommand,\n RawUpdateManyCommand,\n RawUpdateOneCommand,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { type } from 'arktype';\n\nconst IndexKeyDirection = type('1 | -1 | \"text\" | \"2dsphere\" | \"2d\" | \"hashed\"');\nconst IndexKeyJson = type({ field: 'string', direction: IndexKeyDirection });\n\nconst CreateIndexJson = type({\n kind: '\"createIndex\"',\n collection: 'string',\n keys: IndexKeyJson.array().atLeastLength(1),\n 'unique?': 'boolean',\n 'sparse?': 'boolean',\n 'expireAfterSeconds?': 'number',\n 'partialFilterExpression?': 'Record<string, unknown>',\n 'name?': 'string',\n 'wildcardProjection?': 'Record<string, unknown>',\n 'collation?': 'Record<string, unknown>',\n 'weights?': 'Record<string, unknown>',\n 'default_language?': 'string',\n 'language_override?': 'string',\n});\n\nconst DropIndexJson = type({\n kind: '\"dropIndex\"',\n collection: 'string',\n name: 'string',\n});\n\nconst CreateCollectionJson = type({\n kind: '\"createCollection\"',\n collection: 'string',\n 'validator?': 'Record<string, unknown>',\n 'validationLevel?': '\"strict\" | \"moderate\"',\n 'validationAction?': '\"error\" | \"warn\"',\n 'capped?': 'boolean',\n 'size?': 'number',\n 'max?': 'number',\n 'timeseries?': 'Record<string, unknown>',\n 'collation?': 'Record<string, unknown>',\n 'changeStreamPreAndPostImages?': 'Record<string, unknown>',\n 'clusteredIndex?': 'Record<string, unknown>',\n});\n\nconst DropCollectionJson = type({\n kind: '\"dropCollection\"',\n collection: 'string',\n});\n\nconst CollModJson = type({\n kind: '\"collMod\"',\n collection: 'string',\n 'validator?': 'Record<string, unknown>',\n 'validationLevel?': '\"strict\" | \"moderate\"',\n 'validationAction?': '\"error\" | \"warn\"',\n 'changeStreamPreAndPostImages?': 'Record<string, unknown>',\n});\n\nconst ListIndexesJson = type({\n kind: '\"listIndexes\"',\n collection: 'string',\n});\n\nconst ListCollectionsJson = type({\n kind: '\"listCollections\"',\n});\n\nconst FieldFilterJson = type({\n kind: '\"field\"',\n field: 'string',\n op: 'string',\n value: 'unknown',\n});\n\nconst ExistsFilterJson = type({\n kind: '\"exists\"',\n field: 'string',\n exists: 'boolean',\n});\n\n// ============================================================================\n// DML command schemas\n// ============================================================================\n\nconst RawInsertOneJson = type({\n kind: '\"rawInsertOne\"',\n collection: 'string',\n document: 'Record<string, unknown>',\n});\n\nconst RawInsertManyJson = type({\n kind: '\"rawInsertMany\"',\n collection: 'string',\n documents: 'Record<string, unknown>[]',\n});\n\nconst RawUpdateOneJson = type({\n kind: '\"rawUpdateOne\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n update: 'Record<string, unknown> | Record<string, unknown>[]',\n});\n\nconst RawUpdateManyJson = type({\n kind: '\"rawUpdateMany\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n update: 'Record<string, unknown> | Record<string, unknown>[]',\n});\n\nconst RawDeleteOneJson = type({\n kind: '\"rawDeleteOne\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n});\n\nconst RawDeleteManyJson = type({\n kind: '\"rawDeleteMany\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n});\n\nconst RawAggregateJson = type({\n kind: '\"rawAggregate\"',\n collection: 'string',\n pipeline: 'Record<string, unknown>[]',\n});\n\nconst RawFindOneAndUpdateJson = type({\n kind: '\"rawFindOneAndUpdate\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n update: 'Record<string, unknown> | Record<string, unknown>[]',\n upsert: 'boolean',\n});\n\nconst RawFindOneAndDeleteJson = type({\n kind: '\"rawFindOneAndDelete\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n});\n\nconst TypedAggregateJson = type({\n kind: '\"aggregate\"',\n collection: 'string',\n pipeline: 'Record<string, unknown>[]',\n});\n\nconst PlanMetaJson = type({\n target: 'string',\n storageHash: 'string',\n lane: 'string',\n paramDescriptors: 'unknown[]',\n 'targetFamily?': 'string',\n 'profileHash?': 'string',\n 'annotations?': 'Record<string, unknown>',\n 'refs?': 'Record<string, unknown>',\n 'projection?': 'Record<string, string> | string[]',\n 'projectionTypes?': 'Record<string, string>',\n});\n\nconst QueryPlanJson = type({\n collection: 'string',\n command: 'Record<string, unknown>',\n meta: PlanMetaJson,\n});\n\n// ============================================================================\n// DDL check/step schemas\n// ============================================================================\n\nconst CheckJson = type({\n description: 'string',\n source: 'Record<string, unknown>',\n filter: 'Record<string, unknown>',\n expect: '\"exists\" | \"notExists\"',\n});\n\nconst StepJson = type({\n description: 'string',\n command: 'Record<string, unknown>',\n});\n\nconst DdlOperationJson = type({\n id: 'string',\n label: 'string',\n operationClass: '\"additive\" | \"widening\" | \"destructive\"',\n precheck: 'Record<string, unknown>[]',\n execute: 'Record<string, unknown>[]',\n postcheck: 'Record<string, unknown>[]',\n});\n\nconst DataTransformCheckJson = type({\n description: 'string',\n source: 'Record<string, unknown>',\n filter: 'Record<string, unknown>',\n expect: '\"exists\" | \"notExists\"',\n});\n\nconst DataTransformOperationJson = type({\n id: 'string',\n label: 'string',\n operationClass: '\"data\"',\n name: 'string',\n precheck: 'Record<string, unknown>[]',\n run: 'Record<string, unknown>[]',\n postcheck: 'Record<string, unknown>[]',\n});\n\nfunction validate<T>(schema: { assert: (data: unknown) => T }, data: unknown, context: string): T {\n try {\n return schema.assert(data);\n } catch (error) {\n /* v8 ignore start -- assertion libraries always throw Error instances */\n const message = error instanceof Error ? error.message : String(error);\n /* v8 ignore stop */\n throw new Error(`Invalid ${context}: ${message}`);\n }\n}\n\nfunction deserializeFilterExpr(json: unknown): MongoFilterExpr {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'field': {\n const data = validate(FieldFilterJson, json, 'field filter');\n return MongoFieldFilter.of(data.field, data.op, data.value as never);\n }\n case 'and': {\n const exprs = record['exprs'];\n if (!Array.isArray(exprs)) throw new Error('Invalid and filter: missing exprs array');\n return MongoAndExpr.of(exprs.map(deserializeFilterExpr));\n }\n case 'or': {\n const exprs = record['exprs'];\n if (!Array.isArray(exprs)) throw new Error('Invalid or filter: missing exprs array');\n return MongoOrExpr.of(exprs.map(deserializeFilterExpr));\n }\n case 'not': {\n const expr = record['expr'];\n if (!expr || typeof expr !== 'object') throw new Error('Invalid not filter: missing expr');\n return new MongoNotExpr(deserializeFilterExpr(expr));\n }\n case 'exists': {\n const data = validate(ExistsFilterJson, json, 'exists filter');\n return new MongoExistsExpr(data.field, data.exists);\n }\n default:\n throw new Error(`Unknown filter expression kind: ${kind}`);\n }\n}\n\n// ============================================================================\n// Pipeline stage deserialization\n// ============================================================================\n\nexport function deserializePipelineStage(json: unknown): MongoPipelineStage {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'match':\n return new MongoMatchStage(deserializeFilterExpr(record['filter']));\n case 'limit':\n return new MongoLimitStage(record['limit'] as number);\n case 'sort':\n return new MongoSortStage(record['sort'] as Record<string, 1 | -1>);\n case 'project':\n return new MongoProjectStage(record['projection'] as Record<string, 0 | 1>);\n case 'addFields':\n return new MongoAddFieldsStage(record['fields'] as Record<string, never>);\n case 'lookup': {\n const opts: {\n from: string;\n as: string;\n localField?: string;\n foreignField?: string;\n pipeline?: ReadonlyArray<MongoPipelineStage>;\n let_?: Record<string, never>;\n } = {\n from: record['from'] as string,\n as: record['as'] as string,\n };\n if (record['localField'] !== undefined) opts.localField = record['localField'] as string;\n if (record['foreignField'] !== undefined)\n opts.foreignField = record['foreignField'] as string;\n if (record['pipeline'] !== undefined)\n opts.pipeline = (record['pipeline'] as unknown[]).map(deserializePipelineStage);\n if (record['let_'] !== undefined) opts.let_ = record['let_'] as Record<string, never>;\n return new MongoLookupStage(opts);\n }\n case 'merge': {\n const opts: {\n into: string | { db: string; coll: string };\n on?: string | ReadonlyArray<string>;\n whenMatched?: string | ReadonlyArray<MongoUpdatePipelineStage>;\n whenNotMatched?: string;\n } = {\n into: record['into'] as string | { db: string; coll: string },\n };\n if (record['on'] !== undefined) opts.on = record['on'] as string | string[];\n if (record['whenMatched'] !== undefined) {\n const wm = record['whenMatched'];\n opts.whenMatched =\n typeof wm === 'string'\n ? wm\n : ((wm as unknown[]).map(deserializePipelineStage) as MongoUpdatePipelineStage[]);\n }\n if (record['whenNotMatched'] !== undefined)\n opts.whenNotMatched = record['whenNotMatched'] as string;\n return new MongoMergeStage(opts);\n }\n default:\n throw new Error(`Unknown pipeline stage kind: ${kind}`);\n }\n}\n\n// ============================================================================\n// DML command deserialization\n// ============================================================================\n\nexport function deserializeDmlCommand(json: unknown): AnyMongoCommand {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'rawInsertOne': {\n const data = validate(RawInsertOneJson, json, 'rawInsertOne command');\n return new RawInsertOneCommand(data.collection, data.document);\n }\n case 'rawInsertMany': {\n const data = validate(RawInsertManyJson, json, 'rawInsertMany command');\n return new RawInsertManyCommand(data.collection, data.documents);\n }\n case 'rawUpdateOne': {\n const data = validate(RawUpdateOneJson, json, 'rawUpdateOne command');\n return new RawUpdateOneCommand(data.collection, data.filter, data.update);\n }\n case 'rawUpdateMany': {\n const data = validate(RawUpdateManyJson, json, 'rawUpdateMany command');\n return new RawUpdateManyCommand(data.collection, data.filter, data.update);\n }\n case 'rawDeleteOne': {\n const data = validate(RawDeleteOneJson, json, 'rawDeleteOne command');\n return new RawDeleteOneCommand(data.collection, data.filter);\n }\n case 'rawDeleteMany': {\n const data = validate(RawDeleteManyJson, json, 'rawDeleteMany command');\n return new RawDeleteManyCommand(data.collection, data.filter);\n }\n case 'rawAggregate': {\n const data = validate(RawAggregateJson, json, 'rawAggregate command');\n return new RawAggregateCommand(data.collection, data.pipeline);\n }\n case 'rawFindOneAndUpdate': {\n const data = validate(RawFindOneAndUpdateJson, json, 'rawFindOneAndUpdate command');\n return new RawFindOneAndUpdateCommand(data.collection, data.filter, data.update, data.upsert);\n }\n case 'rawFindOneAndDelete': {\n const data = validate(RawFindOneAndDeleteJson, json, 'rawFindOneAndDelete command');\n return new RawFindOneAndDeleteCommand(data.collection, data.filter);\n }\n case 'aggregate': {\n const data = validate(TypedAggregateJson, json, 'aggregate command');\n const pipeline = data.pipeline.map(deserializePipelineStage);\n return new AggregateCommand(data.collection, pipeline);\n }\n default:\n throw new Error(`Unknown DML command kind: ${kind}`);\n }\n}\n\n// ============================================================================\n// MongoQueryPlan deserialization\n// ============================================================================\n\nexport function deserializeMongoQueryPlan(json: unknown): MongoQueryPlan {\n const data = validate(QueryPlanJson, json, 'Mongo query plan');\n const command = deserializeDmlCommand(data.command);\n const m = data.meta;\n const meta: PlanMeta = {\n target: m.target,\n storageHash: m.storageHash,\n lane: m.lane,\n paramDescriptors: m.paramDescriptors as PlanMeta['paramDescriptors'],\n ...ifDefined('targetFamily', m.targetFamily),\n ...ifDefined('profileHash', m.profileHash),\n ...ifDefined('annotations', m.annotations),\n ...ifDefined('refs', m.refs),\n ...ifDefined('projection', m.projection),\n ...ifDefined('projectionTypes', m.projectionTypes),\n };\n return { collection: data.collection, command, meta };\n}\n\n// ============================================================================\n// DDL command deserialization\n// ============================================================================\n\nfunction deserializeDdlCommand(json: unknown): AnyMongoDdlCommand {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'createIndex': {\n const data = validate(CreateIndexJson, json, 'createIndex command');\n return new CreateIndexCommand(data.collection, data.keys, {\n unique: data.unique,\n sparse: data.sparse,\n expireAfterSeconds: data.expireAfterSeconds,\n partialFilterExpression: data.partialFilterExpression,\n name: data.name,\n wildcardProjection: data.wildcardProjection as Record<string, 0 | 1> | undefined,\n collation: data.collation,\n weights: data.weights as Record<string, number> | undefined,\n default_language: data.default_language,\n language_override: data.language_override,\n });\n }\n case 'dropIndex': {\n const data = validate(DropIndexJson, json, 'dropIndex command');\n return new DropIndexCommand(data.collection, data.name);\n }\n case 'createCollection': {\n const data = validate(CreateCollectionJson, json, 'createCollection command');\n return new CreateCollectionCommand(data.collection, {\n validator: data.validator,\n validationLevel: data.validationLevel,\n validationAction: data.validationAction,\n capped: data.capped,\n size: data.size,\n max: data.max,\n timeseries: data.timeseries as CreateCollectionCommand['timeseries'],\n collation: data.collation,\n changeStreamPreAndPostImages: data.changeStreamPreAndPostImages as\n | { enabled: boolean }\n | undefined,\n clusteredIndex: data.clusteredIndex as CreateCollectionCommand['clusteredIndex'],\n });\n }\n case 'dropCollection': {\n const data = validate(DropCollectionJson, json, 'dropCollection command');\n return new DropCollectionCommand(data.collection);\n }\n case 'collMod': {\n const data = validate(CollModJson, json, 'collMod command');\n return new CollModCommand(data.collection, {\n validator: data.validator,\n validationLevel: data.validationLevel,\n validationAction: data.validationAction,\n changeStreamPreAndPostImages: data.changeStreamPreAndPostImages as\n | { enabled: boolean }\n | undefined,\n });\n }\n default:\n throw new Error(`Unknown DDL command kind: ${kind}`);\n }\n}\n\nfunction deserializeInspectionCommand(json: unknown): AnyMongoInspectionCommand {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'listIndexes': {\n const data = validate(ListIndexesJson, json, 'listIndexes command');\n return new ListIndexesCommand(data.collection);\n }\n case 'listCollections': {\n validate(ListCollectionsJson, json, 'listCollections command');\n return new ListCollectionsCommand();\n }\n default:\n throw new Error(`Unknown inspection command kind: ${kind}`);\n }\n}\n\nfunction deserializeCheck(json: unknown): MongoMigrationCheck {\n const data = validate(CheckJson, json, 'migration check');\n return {\n description: data.description,\n source: deserializeInspectionCommand(data.source),\n filter: deserializeFilterExpr(data.filter),\n expect: data.expect,\n };\n}\n\nfunction deserializeStep(json: unknown): MongoMigrationStep {\n const data = validate(StepJson, json, 'migration step');\n return {\n description: data.description,\n command: deserializeDdlCommand(data.command),\n };\n}\n\nfunction isDataTransformJson(json: unknown): boolean {\n return (\n typeof json === 'object' &&\n json !== null &&\n (json as Record<string, unknown>)['operationClass'] === 'data'\n );\n}\n\nfunction deserializeDdlOp(json: unknown): MongoMigrationPlanOperation {\n const data = validate(DdlOperationJson, json, 'migration operation');\n return {\n id: data.id,\n label: data.label,\n operationClass: data.operationClass as MigrationOperationClass,\n precheck: data.precheck.map(deserializeCheck),\n execute: data.execute.map(deserializeStep),\n postcheck: data.postcheck.map(deserializeCheck),\n };\n}\n\nfunction deserializeDataTransformCheck(json: unknown): MongoDataTransformCheck {\n const data = validate(DataTransformCheckJson, json, 'data transform check');\n return {\n description: data.description,\n source: deserializeMongoQueryPlan(data.source),\n filter: deserializeFilterExpr(data.filter),\n expect: data.expect,\n };\n}\n\nfunction deserializeDataTransformOp(json: unknown): MongoDataTransformOperation {\n const data = validate(DataTransformOperationJson, json, 'data transform operation');\n return {\n id: data.id,\n label: data.label,\n operationClass: 'data',\n name: data.name,\n precheck: data.precheck.map(deserializeDataTransformCheck),\n run: data.run.map(deserializeMongoQueryPlan),\n postcheck: data.postcheck.map(deserializeDataTransformCheck),\n };\n}\n\nexport function deserializeMongoOp(json: unknown): AnyMongoMigrationOperation {\n if (isDataTransformJson(json)) {\n return deserializeDataTransformOp(json);\n }\n return deserializeDdlOp(json);\n}\n\nexport function deserializeMongoOps(json: readonly unknown[]): AnyMongoMigrationOperation[] {\n return json.map(deserializeMongoOp);\n}\n\nexport function serializeMongoOps(ops: readonly AnyMongoMigrationOperation[]): string {\n return JSON.stringify(ops, null, 2);\n}\n","/**\n * Mongo migration IR: one concrete `*Call` class per pure factory under\n * `migration-factories.ts`, plus a shared `OpFactoryCallNode` abstract\n * base. Every call class carries the literal arguments its backing\n * factory would receive, computes a human-readable `label` in its\n * constructor, and implements two polymorphic hooks:\n *\n * - `toOp()` — converts the IR node to a runtime\n * `MongoMigrationPlanOperation` by delegating to the matching pure\n * factory in `migration-factories.ts`.\n * - `renderTypeScript()` / `importRequirements()` — inherited from\n * `TsExpression`. Used by `renderCallsToTypeScript` to emit the call\n * as a TypeScript expression inside the scaffolded `migration.ts`.\n *\n * The abstract base and all concrete classes are package-private.\n * External consumers see only the framework-level `OpFactoryCall`\n * interface and the `OpFactoryCall` union.\n */\n\nimport type {\n OpFactoryCall as FrameworkOpFactoryCall,\n MigrationOperationClass,\n} from '@prisma-next/framework-components/control';\nimport type {\n CollModOptions,\n CreateCollectionOptions,\n CreateIndexOptions,\n MongoIndexKey,\n MongoMigrationPlanOperation,\n} from '@prisma-next/mongo-query-ast/control';\nimport type {\n MongoSchemaCollection,\n MongoSchemaCollectionOptions,\n MongoSchemaIndex,\n MongoSchemaValidator,\n} from '@prisma-next/mongo-schema-ir';\nimport { type ImportRequirement, jsonToTsSource, TsExpression } from '@prisma-next/ts-render';\nimport {\n collMod,\n createCollection,\n createIndex,\n dropCollection,\n dropIndex,\n} from './migration-factories';\n\nexport interface CollModMeta {\n readonly id?: string;\n readonly label?: string;\n readonly operationClass?: MigrationOperationClass;\n}\n\nconst TARGET_MIGRATION_MODULE = '@prisma-next/target-mongo/migration';\n\nabstract class OpFactoryCallNode extends TsExpression implements FrameworkOpFactoryCall {\n abstract readonly factoryName: string;\n abstract readonly operationClass: MigrationOperationClass;\n abstract readonly label: string;\n abstract toOp(): MongoMigrationPlanOperation;\n\n importRequirements(): readonly ImportRequirement[] {\n return [{ moduleSpecifier: TARGET_MIGRATION_MODULE, symbol: this.factoryName }];\n }\n\n protected freeze(): void {\n Object.freeze(this);\n }\n}\n\nfunction formatKeys(keys: ReadonlyArray<MongoIndexKey>): string {\n return keys.map((k) => `${k.field}:${k.direction}`).join(', ');\n}\n\nexport class CreateIndexCall extends OpFactoryCallNode {\n readonly factoryName = 'createIndex' as const;\n readonly operationClass = 'additive' as const;\n readonly collection: string;\n readonly keys: ReadonlyArray<MongoIndexKey>;\n readonly options: CreateIndexOptions | undefined;\n readonly label: string;\n\n constructor(\n collection: string,\n keys: ReadonlyArray<MongoIndexKey>,\n options?: CreateIndexOptions,\n ) {\n super();\n this.collection = collection;\n this.keys = keys;\n this.options = options;\n this.label = `Create index on ${collection} (${formatKeys(keys)})`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return createIndex(this.collection, this.keys, this.options);\n }\n\n renderTypeScript(): string {\n return this.options\n ? `createIndex(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.keys)}, ${jsonToTsSource(this.options)})`\n : `createIndex(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.keys)})`;\n }\n}\n\nexport class DropIndexCall extends OpFactoryCallNode {\n readonly factoryName = 'dropIndex' as const;\n readonly operationClass = 'destructive' as const;\n readonly collection: string;\n readonly keys: ReadonlyArray<MongoIndexKey>;\n readonly label: string;\n\n constructor(collection: string, keys: ReadonlyArray<MongoIndexKey>) {\n super();\n this.collection = collection;\n this.keys = keys;\n this.label = `Drop index on ${collection} (${formatKeys(keys)})`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return dropIndex(this.collection, this.keys);\n }\n\n renderTypeScript(): string {\n return `dropIndex(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.keys)})`;\n }\n}\n\nexport class CreateCollectionCall extends OpFactoryCallNode {\n readonly factoryName = 'createCollection' as const;\n readonly operationClass = 'additive' as const;\n readonly collection: string;\n readonly options: CreateCollectionOptions | undefined;\n readonly label: string;\n\n constructor(collection: string, options?: CreateCollectionOptions) {\n super();\n this.collection = collection;\n this.options = options;\n this.label = `Create collection ${collection}`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return createCollection(this.collection, this.options);\n }\n\n renderTypeScript(): string {\n return this.options\n ? `createCollection(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.options)})`\n : `createCollection(${jsonToTsSource(this.collection)})`;\n }\n}\n\nexport class DropCollectionCall extends OpFactoryCallNode {\n readonly factoryName = 'dropCollection' as const;\n readonly operationClass = 'destructive' as const;\n readonly collection: string;\n readonly label: string;\n\n constructor(collection: string) {\n super();\n this.collection = collection;\n this.label = `Drop collection ${collection}`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return dropCollection(this.collection);\n }\n\n renderTypeScript(): string {\n return `dropCollection(${jsonToTsSource(this.collection)})`;\n }\n}\n\nexport class CollModCall extends OpFactoryCallNode {\n readonly factoryName = 'collMod' as const;\n readonly collection: string;\n readonly options: CollModOptions;\n readonly meta: CollModMeta | undefined;\n readonly operationClass: MigrationOperationClass;\n readonly label: string;\n\n constructor(collection: string, options: CollModOptions, meta?: CollModMeta) {\n super();\n this.collection = collection;\n this.options = options;\n this.meta = meta;\n this.operationClass = meta?.operationClass ?? 'destructive';\n this.label = meta?.label ?? `Modify collection ${collection}`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return collMod(this.collection, this.options, this.meta);\n }\n\n renderTypeScript(): string {\n return this.meta\n ? `collMod(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.options)}, ${jsonToTsSource(this.meta)})`\n : `collMod(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.options)})`;\n }\n}\n\nexport type OpFactoryCall =\n | CreateIndexCall\n | DropIndexCall\n | CreateCollectionCall\n | DropCollectionCall\n | CollModCall;\n\nexport function schemaIndexToCreateIndexOptions(index: MongoSchemaIndex): CreateIndexOptions {\n return {\n unique: index.unique || undefined,\n sparse: index.sparse,\n expireAfterSeconds: index.expireAfterSeconds,\n partialFilterExpression: index.partialFilterExpression,\n wildcardProjection: index.wildcardProjection,\n collation: index.collation,\n weights: index.weights,\n default_language: index.default_language,\n language_override: index.language_override,\n };\n}\n\nexport function schemaCollectionToCreateCollectionOptions(\n coll: MongoSchemaCollection,\n): CreateCollectionOptions | undefined {\n const opts: MongoSchemaCollectionOptions | undefined = coll.options;\n const validator: MongoSchemaValidator | undefined = coll.validator;\n if (!opts && !validator) return undefined;\n return {\n capped: opts?.capped ? true : undefined,\n size: opts?.capped?.size,\n max: opts?.capped?.max,\n timeseries: opts?.timeseries,\n collation: opts?.collation,\n clusteredIndex: opts?.clusteredIndex\n ? {\n key: { _id: 1 } as Record<string, number>,\n unique: true as boolean,\n ...(opts.clusteredIndex.name != null ? { name: opts.clusteredIndex.name } : {}),\n }\n : undefined,\n validator: validator ? { $jsonSchema: validator.jsonSchema } : undefined,\n validationLevel: validator?.validationLevel,\n validationAction: validator?.validationAction,\n changeStreamPreAndPostImages: opts?.changeStreamPreAndPostImages,\n };\n}\n","import type { MongoMigrationPlanOperation } from '@prisma-next/mongo-query-ast/control';\nimport type { OpFactoryCall } from './op-factory-call';\n\nexport function renderOps(calls: ReadonlyArray<OpFactoryCall>): MongoMigrationPlanOperation[] {\n return calls.map((call) => call.toOp());\n}\n","import { detectScaffoldRuntime, shebangLineFor } from '@prisma-next/migration-tools/migration-ts';\nimport { type ImportRequirement, jsonToTsSource, renderImports } from '@prisma-next/ts-render';\nimport type { OpFactoryCall } from './op-factory-call';\n\nexport interface RenderMigrationMeta {\n readonly from: string;\n readonly to: string;\n readonly kind?: string;\n readonly labels?: readonly string[];\n}\n\n/**\n * Always-present base imports for the rendered scaffold:\n *\n * - `Migration` from `@prisma-next/family-mongo/migration` — the\n * user-facing Mongo `Migration` base; subclasses don't need to\n * redeclare `targetId` or thread family/target generics.\n * - `MigrationCLI` from `@prisma-next/cli/migration-cli` — the\n * migration-file CLI entrypoint that loads `prisma-next.config.ts`,\n * assembles a `ControlStack`, and instantiates the migration class.\n * The migration file owns this dependency directly: pulling CLI\n * machinery in at script run time is acceptable because the script's\n * whole purpose is to be invoked from the project that owns the\n * config. (Mirrors the postgres facade pattern; pulling `MigrationCLI`\n * into `@prisma-next/family-mongo/migration` so a Mongo migration only\n * needs one import is tracked separately as a follow-up.)\n */\nconst BASE_IMPORTS: readonly ImportRequirement[] = [\n { moduleSpecifier: '@prisma-next/family-mongo/migration', symbol: 'Migration' },\n { moduleSpecifier: '@prisma-next/cli/migration-cli', symbol: 'MigrationCLI' },\n];\n\n/**\n * Render a list of Mongo `OpFactoryCall`s as a `migration.ts`\n * source string. The result is shebanged, extends the user-facing\n * `Migration` (i.e. `MongoMigration`) from `@prisma-next/family-mongo`, and\n * implements the abstract `operations` and `describe` members. `meta` is\n * always rendered — `describe()` is part of the `Migration` contract, so\n * even an empty stub must satisfy it; callers pass empty strings for a\n * migration-new scaffold.\n *\n * The walk is polymorphic: each call node contributes its own\n * `renderTypeScript()` expression and declares its own\n * `importRequirements()`. The top-level renderer aggregates imports\n * across all nodes and emits one `import { … } from \"…\"` line per module.\n * The `Migration` and `MigrationCLI` imports are always emitted — they're\n * structural to the rendered scaffold (extends `Migration`, calls\n * `MigrationCLI.run`), not driven by any node.\n */\nexport function renderCallsToTypeScript(\n calls: ReadonlyArray<OpFactoryCall>,\n meta: RenderMigrationMeta,\n): string {\n const imports = buildImports(calls);\n const operationsBody = calls.map((c) => c.renderTypeScript()).join(',\\n');\n\n return [\n shebangLineFor(detectScaffoldRuntime()),\n imports,\n '',\n 'class M extends Migration {',\n buildDescribeMethod(meta),\n ' override get operations() {',\n ' return [',\n indent(operationsBody, 6),\n ' ];',\n ' }',\n '}',\n '',\n 'export default M;',\n 'MigrationCLI.run(import.meta.url, M);',\n '',\n ].join('\\n');\n}\n\nfunction buildImports(calls: ReadonlyArray<OpFactoryCall>): string {\n const requirements: ImportRequirement[] = [...BASE_IMPORTS];\n for (const call of calls) {\n for (const req of call.importRequirements()) {\n requirements.push(req);\n }\n }\n return renderImports(requirements);\n}\n\nfunction buildDescribeMethod(meta: RenderMigrationMeta): string {\n const lines: string[] = [];\n lines.push(' override describe() {');\n lines.push(' return {');\n lines.push(` from: ${JSON.stringify(meta.from)},`);\n lines.push(` to: ${JSON.stringify(meta.to)},`);\n if (meta.kind) {\n lines.push(` kind: ${JSON.stringify(meta.kind)},`);\n }\n if (meta.labels && meta.labels.length > 0) {\n lines.push(` labels: ${jsonToTsSource(meta.labels)},`);\n }\n lines.push(' };');\n lines.push(' }');\n lines.push('');\n return lines.join('\\n');\n}\n\nfunction indent(text: string, spaces: number): string {\n const pad = ' '.repeat(spaces);\n return text\n .split('\\n')\n .map((line) => (line.trim() ? `${pad}${line}` : line))\n .join('\\n');\n}\n","import type { MigrationPlanWithAuthoringSurface } from '@prisma-next/framework-components/control';\nimport { Migration, type MigrationMeta } from '@prisma-next/migration-tools/migration';\nimport type { AnyMongoMigrationOperation } from '@prisma-next/mongo-query-ast/control';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { OpFactoryCall } from './op-factory-call';\nimport { renderOps } from './render-ops';\nimport { renderCallsToTypeScript } from './render-typescript';\n\n/**\n * Planner-produced Mongo migration, returned by `MongoMigrationPlanner.plan(...)`\n * and `MongoMigrationPlanner.emptyMigration(...)`.\n *\n * Unlike user-authored migrations (which extend `MongoMigration` from\n * `@prisma-next/family-mongo/migration`), this class lives inside the target\n * and holds the richer authoring IR (`OpFactoryCall[]`) needed to render\n * itself back to TypeScript source. It implements\n * `MigrationPlanWithAuthoringSurface` so that the CLI can uniformly ask any\n * planner result to serialize itself to a `migration.ts`.\n *\n * Extends the framework `Migration` base class directly (not\n * `MongoMigration`) because `MongoMigration` lives in `@prisma-next/family-mongo`,\n * which depends on this package — extending it here would create a dependency\n * cycle.\n */\nexport class PlannerProducedMongoMigration\n extends Migration<AnyMongoMigrationOperation>\n implements MigrationPlanWithAuthoringSurface\n{\n readonly targetId = 'mongo' as const;\n\n constructor(\n private readonly calls: readonly OpFactoryCall[],\n private readonly meta: MigrationMeta,\n ) {\n super();\n }\n\n override get operations(): readonly AnyMongoMigrationOperation[] {\n return renderOps(this.calls);\n }\n\n override describe(): MigrationMeta {\n return this.meta;\n }\n\n renderTypeScript(): string {\n return renderCallsToTypeScript(this.calls, {\n from: this.meta.from,\n to: this.meta.to,\n ...ifDefined('kind', this.meta.kind),\n ...ifDefined('labels', this.meta.labels),\n });\n }\n}\n","import type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type {\n MigrationOperationClass,\n MigrationOperationPolicy,\n MigrationPlanner,\n MigrationPlannerConflict,\n MigrationPlannerResult,\n MigrationPlanWithAuthoringSurface,\n MigrationScaffoldContext,\n} from '@prisma-next/framework-components/control';\nimport type { MongoContract } from '@prisma-next/mongo-contract';\nimport type {\n MongoSchemaCollection,\n MongoSchemaCollectionOptions,\n MongoSchemaIndex,\n MongoSchemaIR,\n MongoSchemaValidator,\n} from '@prisma-next/mongo-schema-ir';\nimport { canonicalize, deepEqual } from '@prisma-next/mongo-schema-ir';\nimport { contractToMongoSchemaIR } from './contract-to-schema';\nimport type { OpFactoryCall } from './op-factory-call';\nimport {\n CollModCall,\n CreateCollectionCall,\n CreateIndexCall,\n DropCollectionCall,\n DropIndexCall,\n schemaCollectionToCreateCollectionOptions,\n schemaIndexToCreateIndexOptions,\n} from './op-factory-call';\nimport { PlannerProducedMongoMigration } from './planner-produced-migration';\n\nfunction buildIndexLookupKey(index: MongoSchemaIndex): string {\n const keys = index.keys.map((k) => `${k.field}:${k.direction}`).join(',');\n const opts = [\n index.unique ? 'unique' : '',\n index.sparse ? 'sparse' : '',\n index.expireAfterSeconds != null ? `ttl:${index.expireAfterSeconds}` : '',\n index.partialFilterExpression ? `pfe:${canonicalize(index.partialFilterExpression)}` : '',\n index.wildcardProjection ? `wp:${canonicalize(index.wildcardProjection)}` : '',\n index.collation ? `col:${canonicalize(index.collation)}` : '',\n index.weights ? `wt:${canonicalize(index.weights)}` : '',\n index.default_language ? `dl:${index.default_language}` : '',\n index.language_override ? `lo:${index.language_override}` : '',\n ]\n .filter(Boolean)\n .join(';');\n return opts ? `${keys}|${opts}` : keys;\n}\n\nfunction validatorsEqual(\n a: MongoSchemaValidator | undefined,\n b: MongoSchemaValidator | undefined,\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.validationLevel === b.validationLevel &&\n a.validationAction === b.validationAction &&\n canonicalize(a.jsonSchema) === canonicalize(b.jsonSchema)\n );\n}\n\nfunction classifyValidatorUpdate(\n origin: MongoSchemaValidator,\n dest: MongoSchemaValidator,\n): 'widening' | 'destructive' {\n let hasDestructive = false;\n\n if (canonicalize(origin.jsonSchema) !== canonicalize(dest.jsonSchema)) {\n hasDestructive = true;\n }\n\n if (origin.validationAction !== dest.validationAction) {\n if (dest.validationAction === 'error') hasDestructive = true;\n }\n\n if (origin.validationLevel !== dest.validationLevel) {\n if (dest.validationLevel === 'strict') hasDestructive = true;\n }\n\n return hasDestructive ? 'destructive' : 'widening';\n}\n\nfunction hasImmutableOptionChange(\n origin: MongoSchemaCollectionOptions | undefined,\n dest: MongoSchemaCollectionOptions | undefined,\n): string | undefined {\n if (canonicalize(origin?.capped) !== canonicalize(dest?.capped)) return 'capped';\n if (canonicalize(origin?.timeseries) !== canonicalize(dest?.timeseries)) return 'timeseries';\n if (canonicalize(origin?.collation) !== canonicalize(dest?.collation)) return 'collation';\n if (canonicalize(origin?.clusteredIndex) !== canonicalize(dest?.clusteredIndex))\n return 'clusteredIndex';\n return undefined;\n}\n\nfunction collectionHasOptions(coll: MongoSchemaCollection): boolean {\n return !!(coll.options || coll.validator);\n}\n\nexport type PlanCallsResult =\n | { readonly kind: 'success'; readonly calls: OpFactoryCall[] }\n | { readonly kind: 'failure'; readonly conflicts: MigrationPlannerConflict[] };\n\nexport class MongoMigrationPlanner implements MigrationPlanner<'mongo', 'mongo'> {\n planCalls(options: {\n readonly contract: unknown;\n readonly schema: unknown;\n readonly policy: MigrationOperationPolicy;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'mongo', 'mongo'>>;\n }): PlanCallsResult {\n const contract = options.contract as MongoContract;\n const originIR = options.schema as MongoSchemaIR;\n const destinationIR = contractToMongoSchemaIR(contract);\n\n const collCreates: OpFactoryCall[] = [];\n const drops: OpFactoryCall[] = [];\n const creates: OpFactoryCall[] = [];\n const validatorOps: OpFactoryCall[] = [];\n const mutableOptionOps: OpFactoryCall[] = [];\n const collDrops: OpFactoryCall[] = [];\n const conflicts: MigrationPlannerConflict[] = [];\n\n const allCollectionNames = new Set([\n ...originIR.collectionNames,\n ...destinationIR.collectionNames,\n ]);\n\n for (const collName of [...allCollectionNames].sort()) {\n const originColl = originIR.collection(collName);\n const destColl = destinationIR.collection(collName);\n\n if (!originColl) {\n if (destColl && collectionHasOptions(destColl)) {\n const opts = schemaCollectionToCreateCollectionOptions(destColl);\n collCreates.push(new CreateCollectionCall(collName, opts));\n }\n } else if (!destColl) {\n collDrops.push(new DropCollectionCall(collName));\n } else {\n const immutableChange = hasImmutableOptionChange(originColl.options, destColl.options);\n if (immutableChange) {\n conflicts.push({\n kind: 'policy-violation',\n summary: `Cannot change immutable collection option '${immutableChange}' on ${collName}`,\n why: `MongoDB does not support modifying the '${immutableChange}' option after collection creation`,\n });\n }\n\n const mutableCall = planMutableOptionsDiffCall(\n collName,\n originColl.options,\n destColl.options,\n );\n if (mutableCall) mutableOptionOps.push(mutableCall);\n\n const validatorCall = planValidatorDiffCall(\n collName,\n originColl.validator,\n destColl.validator,\n );\n if (validatorCall) validatorOps.push(validatorCall);\n }\n\n const originLookup = new Map<string, MongoSchemaIndex>();\n if (originColl) {\n for (const idx of originColl.indexes) {\n originLookup.set(buildIndexLookupKey(idx), idx);\n }\n }\n\n const destLookup = new Map<string, MongoSchemaIndex>();\n if (destColl) {\n for (const idx of destColl.indexes) {\n destLookup.set(buildIndexLookupKey(idx), idx);\n }\n }\n\n for (const [lookupKey, idx] of originLookup) {\n if (!destLookup.has(lookupKey)) {\n drops.push(new DropIndexCall(collName, idx.keys));\n }\n }\n\n for (const [lookupKey, idx] of destLookup) {\n if (!originLookup.has(lookupKey)) {\n creates.push(\n new CreateIndexCall(collName, idx.keys, schemaIndexToCreateIndexOptions(idx)),\n );\n }\n }\n }\n\n if (conflicts.length > 0) {\n return { kind: 'failure', conflicts };\n }\n\n const allCalls = [\n ...collCreates,\n ...drops,\n ...creates,\n ...validatorOps,\n ...mutableOptionOps,\n ...collDrops,\n ];\n\n for (const call of allCalls) {\n if (!options.policy.allowedOperationClasses.includes(call.operationClass)) {\n conflicts.push({\n kind: 'policy-violation',\n summary: `${call.operationClass} operation disallowed: ${call.label}`,\n why: `Policy does not allow '${call.operationClass}' operations`,\n });\n }\n }\n\n if (conflicts.length > 0) {\n return { kind: 'failure', conflicts };\n }\n\n return { kind: 'success', calls: allCalls };\n }\n\n plan(options: {\n readonly contract: unknown;\n readonly schema: unknown;\n readonly policy: MigrationOperationPolicy;\n readonly fromHash: string;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'mongo', 'mongo'>>;\n }): MigrationPlannerResult {\n const contract = options.contract as MongoContract;\n const result = this.planCalls(options);\n if (result.kind === 'failure') return result;\n return {\n kind: 'success',\n plan: new PlannerProducedMongoMigration(result.calls, {\n from: options.fromHash,\n to: contract.storage.storageHash,\n }),\n };\n }\n\n /**\n * Produce an empty `migration.ts` authoring surface for `migration new`.\n *\n * The \"empty migration\" is a `PlannerProducedMongoMigration` with no\n * operations; `renderTypeScript()` emits a stub class with the correct\n * `from`/`to` metadata that the user then fills in with operations. The\n * contract path on the context is unused — Mongo's emitted source does\n * not import from the generated contract `.d.ts`.\n */\n emptyMigration(context: MigrationScaffoldContext): MigrationPlanWithAuthoringSurface {\n return new PlannerProducedMongoMigration([], {\n from: context.fromHash,\n to: context.toHash,\n });\n }\n}\n\nfunction planValidatorDiffCall(\n collName: string,\n originValidator: MongoSchemaValidator | undefined,\n destValidator: MongoSchemaValidator | undefined,\n): OpFactoryCall | undefined {\n if (validatorsEqual(originValidator, destValidator)) return undefined;\n\n if (destValidator) {\n const operationClass: MigrationOperationClass = originValidator\n ? classifyValidatorUpdate(originValidator, destValidator)\n : 'destructive';\n return new CollModCall(\n collName,\n {\n validator: { $jsonSchema: destValidator.jsonSchema },\n validationLevel: destValidator.validationLevel,\n validationAction: destValidator.validationAction,\n },\n {\n id: `validator.${collName}.${originValidator ? 'update' : 'add'}`,\n label: `${originValidator ? 'Update' : 'Add'} validator on ${collName}`,\n operationClass,\n },\n );\n }\n\n return new CollModCall(\n collName,\n {\n validator: {},\n validationLevel: 'strict',\n validationAction: 'error',\n },\n {\n id: `validator.${collName}.remove`,\n label: `Remove validator on ${collName}`,\n operationClass: 'widening',\n },\n );\n}\n\nfunction planMutableOptionsDiffCall(\n collName: string,\n origin: MongoSchemaCollectionOptions | undefined,\n dest: MongoSchemaCollectionOptions | undefined,\n): OpFactoryCall | undefined {\n const originCSPPI = origin?.changeStreamPreAndPostImages;\n const destCSPPI = dest?.changeStreamPreAndPostImages;\n if (deepEqual(originCSPPI, destCSPPI)) return undefined;\n\n const desiredCSPPI = destCSPPI ?? { enabled: false };\n return new CollModCall(\n collName,\n {\n changeStreamPreAndPostImages: desiredCSPPI,\n },\n {\n id: `options.${collName}.update`,\n label: `Update mutable options on ${collName}`,\n operationClass: desiredCSPPI.enabled ? 'widening' : 'destructive',\n },\n );\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { errorRunnerFailed } from '@prisma-next/errors/execution';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type {\n MigrationOperationPolicy,\n MigrationPlan,\n MigrationPlanOperation,\n MigrationRunnerExecutionChecks,\n MigrationRunnerFailure,\n MigrationRunnerResult,\n OperationContext,\n} from '@prisma-next/framework-components/control';\nimport type { MongoContract } from '@prisma-next/mongo-contract';\nimport type { MongoAdapter, MongoDriver } from '@prisma-next/mongo-lowering';\nimport type {\n AnyMongoMigrationOperation,\n MongoDataTransformCheck,\n MongoDataTransformOperation,\n MongoDdlCommandVisitor,\n MongoInspectionCommandVisitor,\n MongoMigrationCheck,\n MongoMigrationPlanOperation,\n} from '@prisma-next/mongo-query-ast/control';\nimport type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport { FilterEvaluator } from './filter-evaluator';\nimport { deserializeMongoOps } from './mongo-ops-serializer';\nimport { verifyMongoSchema } from './schema-verify/verify-mongo-schema';\n\nconst READ_ONLY_CHECK_COMMAND_KINDS: ReadonlySet<string> = new Set(['aggregate', 'rawAggregate']);\n\nexport interface MarkerOperations {\n readMarker(): Promise<ContractMarkerRecord | null>;\n initMarker(destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n }): Promise<void>;\n updateMarker(\n expectedFrom: string,\n destination: { readonly storageHash: string; readonly profileHash: string },\n ): Promise<boolean>;\n writeLedgerEntry(entry: {\n readonly edgeId: string;\n readonly from: string;\n readonly to: string;\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\nexport interface MongoMigrationRunnerExecuteOptions {\n readonly plan: MigrationPlan;\n readonly destinationContract: MongoContract;\n readonly policy: MigrationOperationPolicy;\n readonly callbacks?: {\n onOperationStart?(op: MigrationPlanOperation): void;\n onOperationComplete?(op: MigrationPlanOperation): void;\n };\n readonly executionChecks?: MigrationRunnerExecutionChecks;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'mongo', 'mongo'>>;\n readonly strictVerification?: boolean;\n readonly context?: OperationContext;\n}\n\nfunction runnerFailure(\n code: string,\n summary: string,\n opts?: { why?: string; meta?: Record<string, unknown> },\n): MigrationRunnerResult {\n return notOk<MigrationRunnerFailure>({\n code,\n summary,\n ...opts,\n });\n}\n\nexport class MongoMigrationRunner {\n constructor(private readonly deps: MongoRunnerDependencies) {}\n\n async execute(options: MongoMigrationRunnerExecuteOptions): Promise<MigrationRunnerResult> {\n const { commandExecutor, inspectionExecutor, adapter, driver, markerOps } = this.deps;\n const operations = deserializeMongoOps(options.plan.operations as readonly unknown[]);\n\n const policyCheck = this.enforcePolicyCompatibility(options.policy, operations);\n if (policyCheck) return policyCheck;\n\n const existingMarker = await markerOps.readMarker();\n\n const markerCheck = this.ensureMarkerCompatibility(existingMarker, options.plan);\n if (markerCheck) return markerCheck;\n\n const checks = options.executionChecks;\n const runPrechecks = checks?.prechecks !== false;\n const runPostchecks = checks?.postchecks !== false;\n const runIdempotency = checks?.idempotencyChecks !== false;\n\n const filterEvaluator = new FilterEvaluator();\n\n let operationsExecuted = 0;\n\n for (const operation of operations) {\n options.callbacks?.onOperationStart?.(operation);\n try {\n if (operation.operationClass === 'data') {\n const result = await this.executeDataTransform(\n operation as MongoDataTransformOperation,\n adapter,\n driver,\n filterEvaluator,\n runIdempotency,\n runPrechecks,\n runPostchecks,\n );\n if (result.failure) return result.failure;\n if (result.executed) operationsExecuted += 1;\n continue;\n }\n\n const ddlOp = operation as MongoMigrationPlanOperation;\n\n if (runPostchecks && runIdempotency) {\n const allSatisfied = await this.allChecksSatisfied(\n ddlOp.postcheck,\n inspectionExecutor,\n filterEvaluator,\n );\n if (allSatisfied) continue;\n }\n\n if (runPrechecks) {\n const precheckResult = await this.evaluateChecks(\n ddlOp.precheck,\n inspectionExecutor,\n filterEvaluator,\n );\n if (!precheckResult) {\n return runnerFailure(\n 'PRECHECK_FAILED',\n `Operation ${operation.id} failed during precheck`,\n { meta: { operationId: operation.id } },\n );\n }\n }\n\n for (const step of ddlOp.execute) {\n await step.command.accept(commandExecutor);\n }\n\n if (runPostchecks) {\n const postcheckResult = await this.evaluateChecks(\n ddlOp.postcheck,\n inspectionExecutor,\n filterEvaluator,\n );\n if (!postcheckResult) {\n return runnerFailure(\n 'POSTCHECK_FAILED',\n `Operation ${operation.id} failed during postcheck`,\n { meta: { operationId: operation.id } },\n );\n }\n }\n\n operationsExecuted += 1;\n } finally {\n options.callbacks?.onOperationComplete?.(operation);\n }\n }\n\n const destination = options.plan.destination;\n const profileHash = options.destinationContract.profileHash ?? destination.storageHash;\n\n if (\n operationsExecuted === 0 &&\n existingMarker?.storageHash === destination.storageHash &&\n existingMarker.profileHash === profileHash\n ) {\n return ok({ operationsPlanned: operations.length, operationsExecuted });\n }\n\n const liveSchema = await this.deps.introspectSchema();\n const verifyResult = verifyMongoSchema({\n contract: options.destinationContract,\n schema: liveSchema,\n strict: options.strictVerification ?? true,\n frameworkComponents: options.frameworkComponents,\n ...(options.context ? { context: options.context } : {}),\n });\n if (!verifyResult.ok) {\n return runnerFailure('SCHEMA_VERIFY_FAILED', verifyResult.summary, {\n why: 'The resulting database schema does not satisfy the destination contract.',\n meta: { issues: verifyResult.schema.issues },\n });\n }\n\n if (existingMarker) {\n const updated = await markerOps.updateMarker(existingMarker.storageHash, {\n storageHash: destination.storageHash,\n profileHash,\n });\n if (!updated) {\n return runnerFailure(\n 'MARKER_CAS_FAILURE',\n 'Marker was modified by another process during migration execution.',\n {\n meta: {\n expectedStorageHash: existingMarker.storageHash,\n destinationStorageHash: destination.storageHash,\n },\n },\n );\n }\n } else {\n await markerOps.initMarker({\n storageHash: destination.storageHash,\n profileHash,\n });\n }\n\n const originHash = existingMarker?.storageHash ?? '';\n await markerOps.writeLedgerEntry({\n edgeId: `${originHash}->${destination.storageHash}`,\n from: originHash,\n to: destination.storageHash,\n });\n\n return ok({ operationsPlanned: operations.length, operationsExecuted });\n }\n\n private async executeDataTransform(\n op: MongoDataTransformOperation,\n adapter: MongoAdapter,\n driver: MongoDriver,\n filterEvaluator: FilterEvaluator,\n runIdempotency: boolean,\n runPrechecks: boolean,\n runPostchecks: boolean,\n ): Promise<{ executed: boolean; failure?: MigrationRunnerResult }> {\n if (runPostchecks && runIdempotency && op.postcheck.length > 0) {\n const allSatisfied = await this.evaluateDataTransformChecks(\n op.postcheck,\n adapter,\n driver,\n filterEvaluator,\n );\n if (allSatisfied) return { executed: false };\n }\n\n if (runPrechecks && op.precheck.length > 0) {\n const passed = await this.evaluateDataTransformChecks(\n op.precheck,\n adapter,\n driver,\n filterEvaluator,\n );\n if (!passed) {\n return {\n executed: false,\n failure: runnerFailure('PRECHECK_FAILED', `Operation ${op.id} failed during precheck`, {\n meta: { operationId: op.id, name: op.name },\n }),\n };\n }\n }\n\n for (const plan of op.run) {\n const wireCommand = adapter.lower(plan);\n for await (const _ of driver.execute(wireCommand)) {\n /* consume */\n }\n }\n\n if (runPostchecks && op.postcheck.length > 0) {\n const passed = await this.evaluateDataTransformChecks(\n op.postcheck,\n adapter,\n driver,\n filterEvaluator,\n );\n if (!passed) {\n return {\n executed: false,\n failure: runnerFailure('POSTCHECK_FAILED', `Operation ${op.id} failed during postcheck`, {\n meta: { operationId: op.id, name: op.name },\n }),\n };\n }\n }\n\n return { executed: true };\n }\n\n private async evaluateDataTransformChecks(\n checks: readonly MongoDataTransformCheck[],\n adapter: MongoAdapter,\n driver: MongoDriver,\n filterEvaluator: FilterEvaluator,\n ): Promise<boolean> {\n for (const check of checks) {\n const commandKind = check.source.command.kind;\n if (!READ_ONLY_CHECK_COMMAND_KINDS.has(commandKind)) {\n throw errorRunnerFailed(\n `Data-transform check rejected: command kind \"${commandKind}\" is not read-only`,\n {\n why: 'Data-transform checks must use aggregate or rawAggregate commands so the pre/postcheck path cannot mutate the database.',\n fix: 'Author the check.source as an aggregate pipeline (or rawAggregate) rather than a DML write command.',\n meta: {\n checkDescription: check.description,\n commandKind,\n collection: check.source.collection,\n },\n },\n );\n }\n const wireCommand = adapter.lower(check.source);\n let matchFound = false;\n for await (const row of driver.execute<Record<string, unknown>>(wireCommand)) {\n if (filterEvaluator.evaluate(check.filter, row)) {\n matchFound = true;\n break;\n }\n }\n const passed = check.expect === 'exists' ? matchFound : !matchFound;\n if (!passed) return false;\n }\n return true;\n }\n\n private async evaluateChecks(\n checks: readonly MongoMigrationCheck[],\n inspectionExecutor: MongoInspectionCommandVisitor<Promise<Record<string, unknown>[]>>,\n filterEvaluator: FilterEvaluator,\n ): Promise<boolean> {\n for (const check of checks) {\n const documents = await check.source.accept(inspectionExecutor);\n const matchFound = documents.some((doc) =>\n filterEvaluator.evaluate(check.filter, doc as Record<string, unknown>),\n );\n const passed = check.expect === 'exists' ? matchFound : !matchFound;\n if (!passed) return false;\n }\n return true;\n }\n\n private async allChecksSatisfied(\n checks: readonly MongoMigrationCheck[],\n inspectionExecutor: MongoInspectionCommandVisitor<Promise<Record<string, unknown>[]>>,\n filterEvaluator: FilterEvaluator,\n ): Promise<boolean> {\n if (checks.length === 0) return false;\n return this.evaluateChecks(checks, inspectionExecutor, filterEvaluator);\n }\n\n private enforcePolicyCompatibility(\n policy: MigrationOperationPolicy,\n operations: readonly AnyMongoMigrationOperation[],\n ): MigrationRunnerResult | undefined {\n const allowedClasses = new Set(policy.allowedOperationClasses);\n for (const operation of operations) {\n if (!allowedClasses.has(operation.operationClass)) {\n return runnerFailure(\n 'POLICY_VIOLATION',\n `Operation ${operation.id} has class \"${operation.operationClass}\" which is not allowed by policy.`,\n {\n why: `Policy only allows: ${[...allowedClasses].join(', ')}.`,\n meta: {\n operationId: operation.id,\n operationClass: operation.operationClass,\n },\n },\n );\n }\n }\n return undefined;\n }\n\n private ensureMarkerCompatibility(\n marker: ContractMarkerRecord | null,\n plan: MigrationPlan,\n ): MigrationRunnerResult | undefined {\n const origin = plan.origin ?? null;\n if (!origin) {\n if (marker) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n 'Database already has a contract marker but the plan has no origin. This would silently overwrite the existing marker.',\n { meta: { markerStorageHash: marker.storageHash } },\n );\n }\n return undefined;\n }\n\n if (!marker) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Missing contract marker: expected origin storage hash ${origin.storageHash}.`,\n { meta: { expectedOriginStorageHash: origin.storageHash } },\n );\n }\n\n if (marker.storageHash !== origin.storageHash) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Existing contract marker (${marker.storageHash}) does not match plan origin (${origin.storageHash}).`,\n {\n meta: {\n markerStorageHash: marker.storageHash,\n expectedOriginStorageHash: origin.storageHash,\n },\n },\n );\n }\n\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"control.mjs","names":["parts: string[]","statements: string[]","current: unknown","opts: {\n from: string;\n as: string;\n localField?: string;\n foreignField?: string;\n pipeline?: ReadonlyArray<MongoPipelineStage>;\n let_?: Record<string, never>;\n }","opts: {\n into: string | { db: string; coll: string };\n on?: string | ReadonlyArray<string>;\n whenMatched?: string | ReadonlyArray<MongoUpdatePipelineStage>;\n whenNotMatched?: string;\n }","meta: PlanMeta","opts: MongoSchemaCollectionOptions | undefined","validator: MongoSchemaValidator | undefined","BASE_IMPORTS: readonly ImportRequirement[]","requirements: ImportRequirement[]","lines: string[]","calls: readonly OpFactoryCall[]","meta: MigrationMeta","collCreates: OpFactoryCall[]","drops: OpFactoryCall[]","creates: OpFactoryCall[]","validatorOps: OpFactoryCall[]","mutableOptionOps: OpFactoryCall[]","collDrops: OpFactoryCall[]","conflicts: MigrationPlannerConflict[]","operationClass: MigrationOperationClass","READ_ONLY_CHECK_COMMAND_KINDS: ReadonlySet<string>","deps: MongoRunnerDependencies"],"sources":["../src/core/ddl-formatter.ts","../src/core/filter-evaluator.ts","../src/core/marker-ledger.ts","../src/core/mongo-ops-serializer.ts","../src/core/op-factory-call.ts","../src/core/render-ops.ts","../src/core/render-typescript.ts","../src/core/planner-produced-migration.ts","../src/core/mongo-planner.ts","../src/core/mongo-runner.ts"],"sourcesContent":["import type { MigrationPlanOperation } from '@prisma-next/framework-components/control';\nimport type {\n CollModCommand,\n CreateCollectionCommand,\n CreateIndexCommand,\n DropCollectionCommand,\n DropIndexCommand,\n MongoDdlCommandVisitor,\n MongoIndexKey,\n} from '@prisma-next/mongo-query-ast/control';\n\nfunction formatKeySpec(keys: ReadonlyArray<MongoIndexKey>): string {\n const entries = keys.map((k) => `${JSON.stringify(k.field)}: ${JSON.stringify(k.direction)}`);\n return `{ ${entries.join(', ')} }`;\n}\n\nfunction formatOptions(cmd: CreateIndexCommand): string | undefined {\n const parts: string[] = [];\n if (cmd.unique) parts.push('unique: true');\n if (cmd.sparse) parts.push('sparse: true');\n if (cmd.expireAfterSeconds !== undefined)\n parts.push(`expireAfterSeconds: ${cmd.expireAfterSeconds}`);\n if (cmd.name) parts.push(`name: ${JSON.stringify(cmd.name)}`);\n if (cmd.collation) parts.push(`collation: ${JSON.stringify(cmd.collation)}`);\n if (cmd.weights) parts.push(`weights: ${JSON.stringify(cmd.weights)}`);\n if (cmd.default_language) parts.push(`default_language: ${JSON.stringify(cmd.default_language)}`);\n if (cmd.language_override)\n parts.push(`language_override: ${JSON.stringify(cmd.language_override)}`);\n if (cmd.wildcardProjection)\n parts.push(`wildcardProjection: ${JSON.stringify(cmd.wildcardProjection)}`);\n if (cmd.partialFilterExpression)\n parts.push(`partialFilterExpression: ${JSON.stringify(cmd.partialFilterExpression)}`);\n if (parts.length === 0) return undefined;\n return `{ ${parts.join(', ')} }`;\n}\n\nfunction formatCreateCollectionOptions(cmd: CreateCollectionCommand): string | undefined {\n const parts: string[] = [];\n if (cmd.capped) parts.push('capped: true');\n if (cmd.size !== undefined) parts.push(`size: ${cmd.size}`);\n if (cmd.max !== undefined) parts.push(`max: ${cmd.max}`);\n if (cmd.timeseries) parts.push(`timeseries: ${JSON.stringify(cmd.timeseries)}`);\n if (cmd.collation) parts.push(`collation: ${JSON.stringify(cmd.collation)}`);\n if (cmd.clusteredIndex) parts.push(`clusteredIndex: ${JSON.stringify(cmd.clusteredIndex)}`);\n if (cmd.validator) parts.push(`validator: ${JSON.stringify(cmd.validator)}`);\n if (cmd.validationLevel) parts.push(`validationLevel: ${JSON.stringify(cmd.validationLevel)}`);\n if (cmd.validationAction) parts.push(`validationAction: ${JSON.stringify(cmd.validationAction)}`);\n if (cmd.changeStreamPreAndPostImages)\n parts.push(`changeStreamPreAndPostImages: ${JSON.stringify(cmd.changeStreamPreAndPostImages)}`);\n if (parts.length === 0) return undefined;\n return `{ ${parts.join(', ')} }`;\n}\n\nclass MongoDdlCommandFormatter implements MongoDdlCommandVisitor<string> {\n createIndex(cmd: CreateIndexCommand): string {\n const keySpec = formatKeySpec(cmd.keys);\n const opts = formatOptions(cmd);\n return opts\n ? `db.${cmd.collection}.createIndex(${keySpec}, ${opts})`\n : `db.${cmd.collection}.createIndex(${keySpec})`;\n }\n\n dropIndex(cmd: DropIndexCommand): string {\n return `db.${cmd.collection}.dropIndex(${JSON.stringify(cmd.name)})`;\n }\n\n createCollection(cmd: CreateCollectionCommand): string {\n const opts = formatCreateCollectionOptions(cmd);\n return opts\n ? `db.createCollection(${JSON.stringify(cmd.collection)}, ${opts})`\n : `db.createCollection(${JSON.stringify(cmd.collection)})`;\n }\n\n dropCollection(cmd: DropCollectionCommand): string {\n return `db.${cmd.collection}.drop()`;\n }\n\n collMod(cmd: CollModCommand): string {\n const parts: string[] = [`collMod: ${JSON.stringify(cmd.collection)}`];\n if (cmd.validator) parts.push(`validator: ${JSON.stringify(cmd.validator)}`);\n if (cmd.validationLevel) parts.push(`validationLevel: ${JSON.stringify(cmd.validationLevel)}`);\n if (cmd.validationAction)\n parts.push(`validationAction: ${JSON.stringify(cmd.validationAction)}`);\n if (cmd.changeStreamPreAndPostImages)\n parts.push(\n `changeStreamPreAndPostImages: ${JSON.stringify(cmd.changeStreamPreAndPostImages)}`,\n );\n return `db.runCommand({ ${parts.join(', ')} })`;\n }\n}\n\nconst formatter = new MongoDdlCommandFormatter();\n\ninterface MongoExecuteStep {\n readonly command: { readonly accept: <R>(visitor: MongoDdlCommandVisitor<R>) => R };\n}\n\nexport function formatMongoOperations(operations: readonly MigrationPlanOperation[]): string[] {\n const statements: string[] = [];\n for (const operation of operations) {\n const candidate = operation as unknown as Record<string, unknown>;\n if (!('execute' in candidate) || !Array.isArray(candidate['execute'])) {\n continue;\n }\n for (const step of candidate['execute'] as MongoExecuteStep[]) {\n if (step.command && typeof step.command.accept === 'function') {\n statements.push(step.command.accept(formatter));\n }\n }\n }\n return statements;\n}\n","import type {\n MongoAndExpr,\n MongoExistsExpr,\n MongoExprFilter,\n MongoFieldFilter,\n MongoFilterExpr,\n MongoFilterVisitor,\n MongoNotExpr,\n MongoOrExpr,\n} from '@prisma-next/mongo-query-ast/control';\nimport { deepEqual } from '@prisma-next/mongo-schema-ir';\nimport type { MongoValue } from '@prisma-next/mongo-value';\n\nfunction getNestedField(doc: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = doc;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n const record = current as Record<string, unknown>;\n if (!Object.hasOwn(record, part)) {\n return undefined;\n }\n current = record[part];\n }\n return current;\n}\n\nfunction evaluateFieldOp(op: string, actual: unknown, expected: MongoValue): boolean {\n switch (op) {\n case '$eq':\n return deepEqual(actual, expected);\n case '$ne':\n return !deepEqual(actual, expected);\n case '$gt':\n return typeof actual === typeof expected && (actual as number) > (expected as number);\n case '$gte':\n return typeof actual === typeof expected && (actual as number) >= (expected as number);\n case '$lt':\n return typeof actual === typeof expected && (actual as number) < (expected as number);\n case '$lte':\n return typeof actual === typeof expected && (actual as number) <= (expected as number);\n case '$in':\n return Array.isArray(expected) && expected.some((v) => deepEqual(actual, v));\n default:\n throw new Error(`Unsupported filter operator in migration check: ${op}`);\n }\n}\n\nexport class FilterEvaluator implements MongoFilterVisitor<boolean> {\n private doc: Record<string, unknown> = {};\n\n evaluate(filter: MongoFilterExpr, doc: Record<string, unknown>): boolean {\n this.doc = doc;\n return filter.accept(this);\n }\n\n field(expr: MongoFieldFilter): boolean {\n const value = getNestedField(this.doc, expr.field);\n return evaluateFieldOp(expr.op, value, expr.value);\n }\n\n and(expr: MongoAndExpr): boolean {\n return expr.exprs.every((child) => child.accept(this));\n }\n\n or(expr: MongoOrExpr): boolean {\n return expr.exprs.some((child) => child.accept(this));\n }\n\n not(expr: MongoNotExpr): boolean {\n return !expr.expr.accept(this);\n }\n\n exists(expr: MongoExistsExpr): boolean {\n const has = getNestedField(this.doc, expr.field) !== undefined;\n return expr.exists ? has : !has;\n }\n\n expr(_expr: MongoExprFilter): boolean {\n throw new Error('Aggregation expression filters are not supported in migration checks');\n }\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport {\n RawAggregateCommand,\n RawFindOneAndUpdateCommand,\n RawInsertOneCommand,\n} from '@prisma-next/mongo-query-ast/execution';\nimport type { Db, Document } from 'mongodb';\n\nconst COLLECTION = '_prisma_migrations';\nconst MARKER_ID = 'marker';\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 return db\n .collection(cmd.collection)\n .findOneAndUpdate(cmd.filter, cmd.update as Record<string, unknown>, { upsert: cmd.upsert });\n}\n\nexport async function readMarker(db: Db): Promise<ContractMarkerRecord | null> {\n const cmd = new RawAggregateCommand(COLLECTION, [{ $match: { _id: MARKER_ID } }, { $limit: 1 }]);\n const docs = await executeAggregate(db, cmd);\n const doc = docs[0];\n if (!doc) return null;\n return {\n storageHash: doc['storageHash'] as string,\n profileHash: doc['profileHash'] as string,\n contractJson: (doc['contractJson'] as unknown) ?? null,\n canonicalVersion: (doc['canonicalVersion'] as number) ?? null,\n updatedAt: doc['updatedAt'] as Date,\n appTag: (doc['appTag'] as string) ?? null,\n meta: (doc['meta'] as Record<string, unknown>) ?? {},\n };\n}\n\nexport async function initMarker(\n db: Db,\n destination: { readonly storageHash: string; readonly profileHash: string },\n): Promise<void> {\n const cmd = new RawInsertOneCommand(COLLECTION, {\n _id: MARKER_ID,\n storageHash: destination.storageHash,\n profileHash: destination.profileHash,\n contractJson: null,\n canonicalVersion: null,\n updatedAt: new Date(),\n appTag: null,\n meta: {},\n });\n await executeInsertOne(db, cmd);\n}\n\nexport async function updateMarker(\n db: Db,\n expectedFrom: string,\n destination: { readonly storageHash: string; readonly profileHash: string },\n): Promise<boolean> {\n const cmd = new RawFindOneAndUpdateCommand(\n COLLECTION,\n { _id: MARKER_ID, storageHash: expectedFrom },\n {\n $set: {\n storageHash: destination.storageHash,\n profileHash: destination.profileHash,\n updatedAt: new Date(),\n },\n },\n false,\n );\n const result = await executeFindOneAndUpdate(db, cmd);\n return result !== null;\n}\n\nexport async function writeLedgerEntry(\n db: Db,\n entry: { readonly edgeId: string; readonly from: string; readonly to: string },\n): Promise<void> {\n const cmd = new RawInsertOneCommand(COLLECTION, {\n type: 'ledger',\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 { PlanMeta } from '@prisma-next/contract/types';\nimport type { MigrationOperationClass } from '@prisma-next/framework-components/control';\nimport {\n type AnyMongoDdlCommand,\n type AnyMongoInspectionCommand,\n type AnyMongoMigrationOperation,\n CollModCommand,\n CreateCollectionCommand,\n CreateIndexCommand,\n DropCollectionCommand,\n DropIndexCommand,\n ListCollectionsCommand,\n ListIndexesCommand,\n MongoAndExpr,\n type MongoDataTransformCheck,\n type MongoDataTransformOperation,\n MongoExistsExpr,\n MongoFieldFilter,\n type MongoFilterExpr,\n type MongoMigrationCheck,\n type MongoMigrationPlanOperation,\n type MongoMigrationStep,\n MongoNotExpr,\n MongoOrExpr,\n} from '@prisma-next/mongo-query-ast/control';\nimport {\n AggregateCommand,\n type AnyMongoCommand,\n MongoAddFieldsStage,\n MongoLimitStage,\n MongoLookupStage,\n MongoMatchStage,\n MongoMergeStage,\n type MongoPipelineStage,\n MongoProjectStage,\n type MongoQueryPlan,\n MongoSortStage,\n type MongoUpdatePipelineStage,\n RawAggregateCommand,\n RawDeleteManyCommand,\n RawDeleteOneCommand,\n RawFindOneAndDeleteCommand,\n RawFindOneAndUpdateCommand,\n RawInsertManyCommand,\n RawInsertOneCommand,\n RawUpdateManyCommand,\n RawUpdateOneCommand,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { type } from 'arktype';\n\nconst IndexKeyDirection = type('1 | -1 | \"text\" | \"2dsphere\" | \"2d\" | \"hashed\"');\nconst IndexKeyJson = type({ field: 'string', direction: IndexKeyDirection });\n\nconst CreateIndexJson = type({\n kind: '\"createIndex\"',\n collection: 'string',\n keys: IndexKeyJson.array().atLeastLength(1),\n 'unique?': 'boolean',\n 'sparse?': 'boolean',\n 'expireAfterSeconds?': 'number',\n 'partialFilterExpression?': 'Record<string, unknown>',\n 'name?': 'string',\n 'wildcardProjection?': 'Record<string, unknown>',\n 'collation?': 'Record<string, unknown>',\n 'weights?': 'Record<string, unknown>',\n 'default_language?': 'string',\n 'language_override?': 'string',\n});\n\nconst DropIndexJson = type({\n kind: '\"dropIndex\"',\n collection: 'string',\n name: 'string',\n});\n\nconst CreateCollectionJson = type({\n kind: '\"createCollection\"',\n collection: 'string',\n 'validator?': 'Record<string, unknown>',\n 'validationLevel?': '\"strict\" | \"moderate\"',\n 'validationAction?': '\"error\" | \"warn\"',\n 'capped?': 'boolean',\n 'size?': 'number',\n 'max?': 'number',\n 'timeseries?': 'Record<string, unknown>',\n 'collation?': 'Record<string, unknown>',\n 'changeStreamPreAndPostImages?': 'Record<string, unknown>',\n 'clusteredIndex?': 'Record<string, unknown>',\n});\n\nconst DropCollectionJson = type({\n kind: '\"dropCollection\"',\n collection: 'string',\n});\n\nconst CollModJson = type({\n kind: '\"collMod\"',\n collection: 'string',\n 'validator?': 'Record<string, unknown>',\n 'validationLevel?': '\"strict\" | \"moderate\"',\n 'validationAction?': '\"error\" | \"warn\"',\n 'changeStreamPreAndPostImages?': 'Record<string, unknown>',\n});\n\nconst ListIndexesJson = type({\n kind: '\"listIndexes\"',\n collection: 'string',\n});\n\nconst ListCollectionsJson = type({\n kind: '\"listCollections\"',\n});\n\nconst FieldFilterJson = type({\n kind: '\"field\"',\n field: 'string',\n op: 'string',\n value: 'unknown',\n});\n\nconst ExistsFilterJson = type({\n kind: '\"exists\"',\n field: 'string',\n exists: 'boolean',\n});\n\n// ============================================================================\n// DML command schemas\n// ============================================================================\n\nconst RawInsertOneJson = type({\n kind: '\"rawInsertOne\"',\n collection: 'string',\n document: 'Record<string, unknown>',\n});\n\nconst RawInsertManyJson = type({\n kind: '\"rawInsertMany\"',\n collection: 'string',\n documents: 'Record<string, unknown>[]',\n});\n\nconst RawUpdateOneJson = type({\n kind: '\"rawUpdateOne\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n update: 'Record<string, unknown> | Record<string, unknown>[]',\n});\n\nconst RawUpdateManyJson = type({\n kind: '\"rawUpdateMany\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n update: 'Record<string, unknown> | Record<string, unknown>[]',\n});\n\nconst RawDeleteOneJson = type({\n kind: '\"rawDeleteOne\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n});\n\nconst RawDeleteManyJson = type({\n kind: '\"rawDeleteMany\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n});\n\nconst RawAggregateJson = type({\n kind: '\"rawAggregate\"',\n collection: 'string',\n pipeline: 'Record<string, unknown>[]',\n});\n\nconst RawFindOneAndUpdateJson = type({\n kind: '\"rawFindOneAndUpdate\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n update: 'Record<string, unknown> | Record<string, unknown>[]',\n upsert: 'boolean',\n});\n\nconst RawFindOneAndDeleteJson = type({\n kind: '\"rawFindOneAndDelete\"',\n collection: 'string',\n filter: 'Record<string, unknown>',\n});\n\nconst TypedAggregateJson = type({\n kind: '\"aggregate\"',\n collection: 'string',\n pipeline: 'Record<string, unknown>[]',\n});\n\nconst PlanMetaJson = type({\n target: 'string',\n storageHash: 'string',\n lane: 'string',\n paramDescriptors: 'unknown[]',\n 'targetFamily?': 'string',\n 'profileHash?': 'string',\n 'annotations?': 'Record<string, unknown>',\n 'refs?': 'Record<string, unknown>',\n 'projection?': 'Record<string, string> | string[]',\n 'projectionTypes?': 'Record<string, string>',\n});\n\nconst QueryPlanJson = type({\n collection: 'string',\n command: 'Record<string, unknown>',\n meta: PlanMetaJson,\n});\n\n// ============================================================================\n// DDL check/step schemas\n// ============================================================================\n\nconst CheckJson = type({\n description: 'string',\n source: 'Record<string, unknown>',\n filter: 'Record<string, unknown>',\n expect: '\"exists\" | \"notExists\"',\n});\n\nconst StepJson = type({\n description: 'string',\n command: 'Record<string, unknown>',\n});\n\nconst DdlOperationJson = type({\n id: 'string',\n label: 'string',\n operationClass: '\"additive\" | \"widening\" | \"destructive\"',\n precheck: 'Record<string, unknown>[]',\n execute: 'Record<string, unknown>[]',\n postcheck: 'Record<string, unknown>[]',\n});\n\nconst DataTransformCheckJson = type({\n description: 'string',\n source: 'Record<string, unknown>',\n filter: 'Record<string, unknown>',\n expect: '\"exists\" | \"notExists\"',\n});\n\nconst DataTransformOperationJson = type({\n id: 'string',\n label: 'string',\n operationClass: '\"data\"',\n name: 'string',\n precheck: 'Record<string, unknown>[]',\n run: 'Record<string, unknown>[]',\n postcheck: 'Record<string, unknown>[]',\n});\n\nfunction validate<T>(schema: { assert: (data: unknown) => T }, data: unknown, context: string): T {\n try {\n return schema.assert(data);\n } catch (error) {\n /* v8 ignore start -- assertion libraries always throw Error instances */\n const message = error instanceof Error ? error.message : String(error);\n /* v8 ignore stop */\n throw new Error(`Invalid ${context}: ${message}`);\n }\n}\n\nfunction deserializeFilterExpr(json: unknown): MongoFilterExpr {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'field': {\n const data = validate(FieldFilterJson, json, 'field filter');\n return MongoFieldFilter.of(data.field, data.op, data.value as never);\n }\n case 'and': {\n const exprs = record['exprs'];\n if (!Array.isArray(exprs)) throw new Error('Invalid and filter: missing exprs array');\n return MongoAndExpr.of(exprs.map(deserializeFilterExpr));\n }\n case 'or': {\n const exprs = record['exprs'];\n if (!Array.isArray(exprs)) throw new Error('Invalid or filter: missing exprs array');\n return MongoOrExpr.of(exprs.map(deserializeFilterExpr));\n }\n case 'not': {\n const expr = record['expr'];\n if (!expr || typeof expr !== 'object') throw new Error('Invalid not filter: missing expr');\n return new MongoNotExpr(deserializeFilterExpr(expr));\n }\n case 'exists': {\n const data = validate(ExistsFilterJson, json, 'exists filter');\n return new MongoExistsExpr(data.field, data.exists);\n }\n default:\n throw new Error(`Unknown filter expression kind: ${kind}`);\n }\n}\n\n// ============================================================================\n// Pipeline stage deserialization\n// ============================================================================\n\nexport function deserializePipelineStage(json: unknown): MongoPipelineStage {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'match':\n return new MongoMatchStage(deserializeFilterExpr(record['filter']));\n case 'limit':\n return new MongoLimitStage(record['limit'] as number);\n case 'sort':\n return new MongoSortStage(record['sort'] as Record<string, 1 | -1>);\n case 'project':\n return new MongoProjectStage(record['projection'] as Record<string, 0 | 1>);\n case 'addFields':\n return new MongoAddFieldsStage(record['fields'] as Record<string, never>);\n case 'lookup': {\n const opts: {\n from: string;\n as: string;\n localField?: string;\n foreignField?: string;\n pipeline?: ReadonlyArray<MongoPipelineStage>;\n let_?: Record<string, never>;\n } = {\n from: record['from'] as string,\n as: record['as'] as string,\n };\n if (record['localField'] !== undefined) opts.localField = record['localField'] as string;\n if (record['foreignField'] !== undefined)\n opts.foreignField = record['foreignField'] as string;\n if (record['pipeline'] !== undefined)\n opts.pipeline = (record['pipeline'] as unknown[]).map(deserializePipelineStage);\n if (record['let_'] !== undefined) opts.let_ = record['let_'] as Record<string, never>;\n return new MongoLookupStage(opts);\n }\n case 'merge': {\n const opts: {\n into: string | { db: string; coll: string };\n on?: string | ReadonlyArray<string>;\n whenMatched?: string | ReadonlyArray<MongoUpdatePipelineStage>;\n whenNotMatched?: string;\n } = {\n into: record['into'] as string | { db: string; coll: string },\n };\n if (record['on'] !== undefined) opts.on = record['on'] as string | string[];\n if (record['whenMatched'] !== undefined) {\n const wm = record['whenMatched'];\n opts.whenMatched =\n typeof wm === 'string'\n ? wm\n : ((wm as unknown[]).map(deserializePipelineStage) as MongoUpdatePipelineStage[]);\n }\n if (record['whenNotMatched'] !== undefined)\n opts.whenNotMatched = record['whenNotMatched'] as string;\n return new MongoMergeStage(opts);\n }\n default:\n throw new Error(`Unknown pipeline stage kind: ${kind}`);\n }\n}\n\n// ============================================================================\n// DML command deserialization\n// ============================================================================\n\nexport function deserializeDmlCommand(json: unknown): AnyMongoCommand {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'rawInsertOne': {\n const data = validate(RawInsertOneJson, json, 'rawInsertOne command');\n return new RawInsertOneCommand(data.collection, data.document);\n }\n case 'rawInsertMany': {\n const data = validate(RawInsertManyJson, json, 'rawInsertMany command');\n return new RawInsertManyCommand(data.collection, data.documents);\n }\n case 'rawUpdateOne': {\n const data = validate(RawUpdateOneJson, json, 'rawUpdateOne command');\n return new RawUpdateOneCommand(data.collection, data.filter, data.update);\n }\n case 'rawUpdateMany': {\n const data = validate(RawUpdateManyJson, json, 'rawUpdateMany command');\n return new RawUpdateManyCommand(data.collection, data.filter, data.update);\n }\n case 'rawDeleteOne': {\n const data = validate(RawDeleteOneJson, json, 'rawDeleteOne command');\n return new RawDeleteOneCommand(data.collection, data.filter);\n }\n case 'rawDeleteMany': {\n const data = validate(RawDeleteManyJson, json, 'rawDeleteMany command');\n return new RawDeleteManyCommand(data.collection, data.filter);\n }\n case 'rawAggregate': {\n const data = validate(RawAggregateJson, json, 'rawAggregate command');\n return new RawAggregateCommand(data.collection, data.pipeline);\n }\n case 'rawFindOneAndUpdate': {\n const data = validate(RawFindOneAndUpdateJson, json, 'rawFindOneAndUpdate command');\n return new RawFindOneAndUpdateCommand(data.collection, data.filter, data.update, data.upsert);\n }\n case 'rawFindOneAndDelete': {\n const data = validate(RawFindOneAndDeleteJson, json, 'rawFindOneAndDelete command');\n return new RawFindOneAndDeleteCommand(data.collection, data.filter);\n }\n case 'aggregate': {\n const data = validate(TypedAggregateJson, json, 'aggregate command');\n const pipeline = data.pipeline.map(deserializePipelineStage);\n return new AggregateCommand(data.collection, pipeline);\n }\n default:\n throw new Error(`Unknown DML command kind: ${kind}`);\n }\n}\n\n// ============================================================================\n// MongoQueryPlan deserialization\n// ============================================================================\n\nexport function deserializeMongoQueryPlan(json: unknown): MongoQueryPlan {\n const data = validate(QueryPlanJson, json, 'Mongo query plan');\n const command = deserializeDmlCommand(data.command);\n const m = data.meta;\n const meta: PlanMeta = {\n target: m.target,\n storageHash: m.storageHash,\n lane: m.lane,\n paramDescriptors: m.paramDescriptors as PlanMeta['paramDescriptors'],\n ...ifDefined('targetFamily', m.targetFamily),\n ...ifDefined('profileHash', m.profileHash),\n ...ifDefined('annotations', m.annotations),\n ...ifDefined('refs', m.refs),\n ...ifDefined('projection', m.projection),\n ...ifDefined('projectionTypes', m.projectionTypes),\n };\n return { collection: data.collection, command, meta };\n}\n\n// ============================================================================\n// DDL command deserialization\n// ============================================================================\n\nfunction deserializeDdlCommand(json: unknown): AnyMongoDdlCommand {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'createIndex': {\n const data = validate(CreateIndexJson, json, 'createIndex command');\n return new CreateIndexCommand(data.collection, data.keys, {\n unique: data.unique,\n sparse: data.sparse,\n expireAfterSeconds: data.expireAfterSeconds,\n partialFilterExpression: data.partialFilterExpression,\n name: data.name,\n wildcardProjection: data.wildcardProjection as Record<string, 0 | 1> | undefined,\n collation: data.collation,\n weights: data.weights as Record<string, number> | undefined,\n default_language: data.default_language,\n language_override: data.language_override,\n });\n }\n case 'dropIndex': {\n const data = validate(DropIndexJson, json, 'dropIndex command');\n return new DropIndexCommand(data.collection, data.name);\n }\n case 'createCollection': {\n const data = validate(CreateCollectionJson, json, 'createCollection command');\n return new CreateCollectionCommand(data.collection, {\n validator: data.validator,\n validationLevel: data.validationLevel,\n validationAction: data.validationAction,\n capped: data.capped,\n size: data.size,\n max: data.max,\n timeseries: data.timeseries as CreateCollectionCommand['timeseries'],\n collation: data.collation,\n changeStreamPreAndPostImages: data.changeStreamPreAndPostImages as\n | { enabled: boolean }\n | undefined,\n clusteredIndex: data.clusteredIndex as CreateCollectionCommand['clusteredIndex'],\n });\n }\n case 'dropCollection': {\n const data = validate(DropCollectionJson, json, 'dropCollection command');\n return new DropCollectionCommand(data.collection);\n }\n case 'collMod': {\n const data = validate(CollModJson, json, 'collMod command');\n return new CollModCommand(data.collection, {\n validator: data.validator,\n validationLevel: data.validationLevel,\n validationAction: data.validationAction,\n changeStreamPreAndPostImages: data.changeStreamPreAndPostImages as\n | { enabled: boolean }\n | undefined,\n });\n }\n default:\n throw new Error(`Unknown DDL command kind: ${kind}`);\n }\n}\n\nfunction deserializeInspectionCommand(json: unknown): AnyMongoInspectionCommand {\n const record = json as Record<string, unknown>;\n const kind = record['kind'] as string;\n switch (kind) {\n case 'listIndexes': {\n const data = validate(ListIndexesJson, json, 'listIndexes command');\n return new ListIndexesCommand(data.collection);\n }\n case 'listCollections': {\n validate(ListCollectionsJson, json, 'listCollections command');\n return new ListCollectionsCommand();\n }\n default:\n throw new Error(`Unknown inspection command kind: ${kind}`);\n }\n}\n\nfunction deserializeCheck(json: unknown): MongoMigrationCheck {\n const data = validate(CheckJson, json, 'migration check');\n return {\n description: data.description,\n source: deserializeInspectionCommand(data.source),\n filter: deserializeFilterExpr(data.filter),\n expect: data.expect,\n };\n}\n\nfunction deserializeStep(json: unknown): MongoMigrationStep {\n const data = validate(StepJson, json, 'migration step');\n return {\n description: data.description,\n command: deserializeDdlCommand(data.command),\n };\n}\n\nfunction isDataTransformJson(json: unknown): boolean {\n return (\n typeof json === 'object' &&\n json !== null &&\n (json as Record<string, unknown>)['operationClass'] === 'data'\n );\n}\n\nfunction deserializeDdlOp(json: unknown): MongoMigrationPlanOperation {\n const data = validate(DdlOperationJson, json, 'migration operation');\n return {\n id: data.id,\n label: data.label,\n operationClass: data.operationClass as MigrationOperationClass,\n precheck: data.precheck.map(deserializeCheck),\n execute: data.execute.map(deserializeStep),\n postcheck: data.postcheck.map(deserializeCheck),\n };\n}\n\nfunction deserializeDataTransformCheck(json: unknown): MongoDataTransformCheck {\n const data = validate(DataTransformCheckJson, json, 'data transform check');\n return {\n description: data.description,\n source: deserializeMongoQueryPlan(data.source),\n filter: deserializeFilterExpr(data.filter),\n expect: data.expect,\n };\n}\n\nfunction deserializeDataTransformOp(json: unknown): MongoDataTransformOperation {\n const data = validate(DataTransformOperationJson, json, 'data transform operation');\n return {\n id: data.id,\n label: data.label,\n operationClass: 'data',\n name: data.name,\n precheck: data.precheck.map(deserializeDataTransformCheck),\n run: data.run.map(deserializeMongoQueryPlan),\n postcheck: data.postcheck.map(deserializeDataTransformCheck),\n };\n}\n\nexport function deserializeMongoOp(json: unknown): AnyMongoMigrationOperation {\n if (isDataTransformJson(json)) {\n return deserializeDataTransformOp(json);\n }\n return deserializeDdlOp(json);\n}\n\nexport function deserializeMongoOps(json: readonly unknown[]): AnyMongoMigrationOperation[] {\n return json.map(deserializeMongoOp);\n}\n\nexport function serializeMongoOps(ops: readonly AnyMongoMigrationOperation[]): string {\n return JSON.stringify(ops, null, 2);\n}\n","/**\n * Mongo migration IR: one concrete `*Call` class per pure factory under\n * `migration-factories.ts`, plus a shared `OpFactoryCallNode` abstract\n * base. Every call class carries the literal arguments its backing\n * factory would receive, computes a human-readable `label` in its\n * constructor, and implements two polymorphic hooks:\n *\n * - `toOp()` — converts the IR node to a runtime\n * `MongoMigrationPlanOperation` by delegating to the matching pure\n * factory in `migration-factories.ts`.\n * - `renderTypeScript()` / `importRequirements()` — inherited from\n * `TsExpression`. Used by `renderCallsToTypeScript` to emit the call\n * as a TypeScript expression inside the scaffolded `migration.ts`.\n *\n * The abstract base and all concrete classes are package-private.\n * External consumers see only the framework-level `OpFactoryCall`\n * interface and the `OpFactoryCall` union.\n */\n\nimport type {\n OpFactoryCall as FrameworkOpFactoryCall,\n MigrationOperationClass,\n} from '@prisma-next/framework-components/control';\nimport type {\n CollModOptions,\n CreateCollectionOptions,\n CreateIndexOptions,\n MongoIndexKey,\n MongoMigrationPlanOperation,\n} from '@prisma-next/mongo-query-ast/control';\nimport type {\n MongoSchemaCollection,\n MongoSchemaCollectionOptions,\n MongoSchemaIndex,\n MongoSchemaValidator,\n} from '@prisma-next/mongo-schema-ir';\nimport { type ImportRequirement, jsonToTsSource, TsExpression } from '@prisma-next/ts-render';\nimport {\n collMod,\n createCollection,\n createIndex,\n dropCollection,\n dropIndex,\n} from './migration-factories';\n\nexport interface CollModMeta {\n readonly id?: string;\n readonly label?: string;\n readonly operationClass?: MigrationOperationClass;\n}\n\nconst TARGET_MIGRATION_MODULE = '@prisma-next/target-mongo/migration';\n\nabstract class OpFactoryCallNode extends TsExpression implements FrameworkOpFactoryCall {\n abstract readonly factoryName: string;\n abstract readonly operationClass: MigrationOperationClass;\n abstract readonly label: string;\n abstract toOp(): MongoMigrationPlanOperation;\n\n importRequirements(): readonly ImportRequirement[] {\n return [{ moduleSpecifier: TARGET_MIGRATION_MODULE, symbol: this.factoryName }];\n }\n\n protected freeze(): void {\n Object.freeze(this);\n }\n}\n\nfunction formatKeys(keys: ReadonlyArray<MongoIndexKey>): string {\n return keys.map((k) => `${k.field}:${k.direction}`).join(', ');\n}\n\nexport class CreateIndexCall extends OpFactoryCallNode {\n readonly factoryName = 'createIndex' as const;\n readonly operationClass = 'additive' as const;\n readonly collection: string;\n readonly keys: ReadonlyArray<MongoIndexKey>;\n readonly options: CreateIndexOptions | undefined;\n readonly label: string;\n\n constructor(\n collection: string,\n keys: ReadonlyArray<MongoIndexKey>,\n options?: CreateIndexOptions,\n ) {\n super();\n this.collection = collection;\n this.keys = keys;\n this.options = options;\n this.label = `Create index on ${collection} (${formatKeys(keys)})`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return createIndex(this.collection, this.keys, this.options);\n }\n\n renderTypeScript(): string {\n return this.options\n ? `createIndex(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.keys)}, ${jsonToTsSource(this.options)})`\n : `createIndex(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.keys)})`;\n }\n}\n\nexport class DropIndexCall extends OpFactoryCallNode {\n readonly factoryName = 'dropIndex' as const;\n readonly operationClass = 'destructive' as const;\n readonly collection: string;\n readonly keys: ReadonlyArray<MongoIndexKey>;\n readonly label: string;\n\n constructor(collection: string, keys: ReadonlyArray<MongoIndexKey>) {\n super();\n this.collection = collection;\n this.keys = keys;\n this.label = `Drop index on ${collection} (${formatKeys(keys)})`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return dropIndex(this.collection, this.keys);\n }\n\n renderTypeScript(): string {\n return `dropIndex(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.keys)})`;\n }\n}\n\nexport class CreateCollectionCall extends OpFactoryCallNode {\n readonly factoryName = 'createCollection' as const;\n readonly operationClass = 'additive' as const;\n readonly collection: string;\n readonly options: CreateCollectionOptions | undefined;\n readonly label: string;\n\n constructor(collection: string, options?: CreateCollectionOptions) {\n super();\n this.collection = collection;\n this.options = options;\n this.label = `Create collection ${collection}`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return createCollection(this.collection, this.options);\n }\n\n renderTypeScript(): string {\n return this.options\n ? `createCollection(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.options)})`\n : `createCollection(${jsonToTsSource(this.collection)})`;\n }\n}\n\nexport class DropCollectionCall extends OpFactoryCallNode {\n readonly factoryName = 'dropCollection' as const;\n readonly operationClass = 'destructive' as const;\n readonly collection: string;\n readonly label: string;\n\n constructor(collection: string) {\n super();\n this.collection = collection;\n this.label = `Drop collection ${collection}`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return dropCollection(this.collection);\n }\n\n renderTypeScript(): string {\n return `dropCollection(${jsonToTsSource(this.collection)})`;\n }\n}\n\nexport class CollModCall extends OpFactoryCallNode {\n readonly factoryName = 'collMod' as const;\n readonly collection: string;\n readonly options: CollModOptions;\n readonly meta: CollModMeta | undefined;\n readonly operationClass: MigrationOperationClass;\n readonly label: string;\n\n constructor(collection: string, options: CollModOptions, meta?: CollModMeta) {\n super();\n this.collection = collection;\n this.options = options;\n this.meta = meta;\n this.operationClass = meta?.operationClass ?? 'destructive';\n this.label = meta?.label ?? `Modify collection ${collection}`;\n this.freeze();\n }\n\n toOp(): MongoMigrationPlanOperation {\n return collMod(this.collection, this.options, this.meta);\n }\n\n renderTypeScript(): string {\n return this.meta\n ? `collMod(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.options)}, ${jsonToTsSource(this.meta)})`\n : `collMod(${jsonToTsSource(this.collection)}, ${jsonToTsSource(this.options)})`;\n }\n}\n\nexport type OpFactoryCall =\n | CreateIndexCall\n | DropIndexCall\n | CreateCollectionCall\n | DropCollectionCall\n | CollModCall;\n\nexport function schemaIndexToCreateIndexOptions(index: MongoSchemaIndex): CreateIndexOptions {\n return {\n unique: index.unique || undefined,\n sparse: index.sparse,\n expireAfterSeconds: index.expireAfterSeconds,\n partialFilterExpression: index.partialFilterExpression,\n wildcardProjection: index.wildcardProjection,\n collation: index.collation,\n weights: index.weights,\n default_language: index.default_language,\n language_override: index.language_override,\n };\n}\n\nexport function schemaCollectionToCreateCollectionOptions(\n coll: MongoSchemaCollection,\n): CreateCollectionOptions | undefined {\n const opts: MongoSchemaCollectionOptions | undefined = coll.options;\n const validator: MongoSchemaValidator | undefined = coll.validator;\n if (!opts && !validator) return undefined;\n return {\n capped: opts?.capped ? true : undefined,\n size: opts?.capped?.size,\n max: opts?.capped?.max,\n timeseries: opts?.timeseries,\n collation: opts?.collation,\n clusteredIndex: opts?.clusteredIndex\n ? {\n key: { _id: 1 } as Record<string, number>,\n unique: true as boolean,\n ...(opts.clusteredIndex.name != null ? { name: opts.clusteredIndex.name } : {}),\n }\n : undefined,\n validator: validator ? { $jsonSchema: validator.jsonSchema } : undefined,\n validationLevel: validator?.validationLevel,\n validationAction: validator?.validationAction,\n changeStreamPreAndPostImages: opts?.changeStreamPreAndPostImages,\n };\n}\n","import type { MongoMigrationPlanOperation } from '@prisma-next/mongo-query-ast/control';\nimport type { OpFactoryCall } from './op-factory-call';\n\nexport function renderOps(calls: ReadonlyArray<OpFactoryCall>): MongoMigrationPlanOperation[] {\n return calls.map((call) => call.toOp());\n}\n","import { detectScaffoldRuntime, shebangLineFor } from '@prisma-next/migration-tools/migration-ts';\nimport { type ImportRequirement, jsonToTsSource, renderImports } from '@prisma-next/ts-render';\nimport type { OpFactoryCall } from './op-factory-call';\n\nexport interface RenderMigrationMeta {\n readonly from: string;\n readonly to: string;\n readonly kind?: string;\n readonly labels?: readonly string[];\n}\n\n/**\n * Always-present base imports for the rendered scaffold:\n *\n * - `Migration` from `@prisma-next/family-mongo/migration` — the\n * user-facing Mongo `Migration` base; subclasses don't need to\n * redeclare `targetId` or thread family/target generics.\n * - `MigrationCLI` from `@prisma-next/cli/migration-cli` — the\n * migration-file CLI entrypoint that loads `prisma-next.config.ts`,\n * assembles a `ControlStack`, and instantiates the migration class.\n * The migration file owns this dependency directly: pulling CLI\n * machinery in at script run time is acceptable because the script's\n * whole purpose is to be invoked from the project that owns the\n * config. (Mirrors the postgres facade pattern; pulling `MigrationCLI`\n * into `@prisma-next/family-mongo/migration` so a Mongo migration only\n * needs one import is tracked separately as a follow-up.)\n */\nconst BASE_IMPORTS: readonly ImportRequirement[] = [\n { moduleSpecifier: '@prisma-next/family-mongo/migration', symbol: 'Migration' },\n { moduleSpecifier: '@prisma-next/cli/migration-cli', symbol: 'MigrationCLI' },\n];\n\n/**\n * Render a list of Mongo `OpFactoryCall`s as a `migration.ts`\n * source string. The result is shebanged, extends the user-facing\n * `Migration` (i.e. `MongoMigration`) from `@prisma-next/family-mongo`, and\n * implements the abstract `operations` and `describe` members. `meta` is\n * always rendered — `describe()` is part of the `Migration` contract, so\n * even an empty stub must satisfy it; callers pass empty strings for a\n * migration-new scaffold.\n *\n * The walk is polymorphic: each call node contributes its own\n * `renderTypeScript()` expression and declares its own\n * `importRequirements()`. The top-level renderer aggregates imports\n * across all nodes and emits one `import { … } from \"…\"` line per module.\n * The `Migration` and `MigrationCLI` imports are always emitted — they're\n * structural to the rendered scaffold (extends `Migration`, calls\n * `MigrationCLI.run`), not driven by any node.\n */\nexport function renderCallsToTypeScript(\n calls: ReadonlyArray<OpFactoryCall>,\n meta: RenderMigrationMeta,\n): string {\n const imports = buildImports(calls);\n const operationsBody = calls.map((c) => c.renderTypeScript()).join(',\\n');\n\n return [\n shebangLineFor(detectScaffoldRuntime()),\n imports,\n '',\n 'class M extends Migration {',\n buildDescribeMethod(meta),\n ' override get operations() {',\n ' return [',\n indent(operationsBody, 6),\n ' ];',\n ' }',\n '}',\n '',\n 'export default M;',\n 'MigrationCLI.run(import.meta.url, M);',\n '',\n ].join('\\n');\n}\n\nfunction buildImports(calls: ReadonlyArray<OpFactoryCall>): string {\n const requirements: ImportRequirement[] = [...BASE_IMPORTS];\n for (const call of calls) {\n for (const req of call.importRequirements()) {\n requirements.push(req);\n }\n }\n return renderImports(requirements);\n}\n\nfunction buildDescribeMethod(meta: RenderMigrationMeta): string {\n const lines: string[] = [];\n lines.push(' override describe() {');\n lines.push(' return {');\n lines.push(` from: ${JSON.stringify(meta.from)},`);\n lines.push(` to: ${JSON.stringify(meta.to)},`);\n if (meta.kind) {\n lines.push(` kind: ${JSON.stringify(meta.kind)},`);\n }\n if (meta.labels && meta.labels.length > 0) {\n lines.push(` labels: ${jsonToTsSource(meta.labels)},`);\n }\n lines.push(' };');\n lines.push(' }');\n lines.push('');\n return lines.join('\\n');\n}\n\nfunction indent(text: string, spaces: number): string {\n const pad = ' '.repeat(spaces);\n return text\n .split('\\n')\n .map((line) => (line.trim() ? `${pad}${line}` : line))\n .join('\\n');\n}\n","import type { MigrationPlanWithAuthoringSurface } from '@prisma-next/framework-components/control';\nimport { Migration, type MigrationMeta } from '@prisma-next/migration-tools/migration';\nimport type { AnyMongoMigrationOperation } from '@prisma-next/mongo-query-ast/control';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { OpFactoryCall } from './op-factory-call';\nimport { renderOps } from './render-ops';\nimport { renderCallsToTypeScript } from './render-typescript';\n\n/**\n * Planner-produced Mongo migration, returned by `MongoMigrationPlanner.plan(...)`\n * and `MongoMigrationPlanner.emptyMigration(...)`.\n *\n * Unlike user-authored migrations (which extend `MongoMigration` from\n * `@prisma-next/family-mongo/migration`), this class lives inside the target\n * and holds the richer authoring IR (`OpFactoryCall[]`) needed to render\n * itself back to TypeScript source. It implements\n * `MigrationPlanWithAuthoringSurface` so that the CLI can uniformly ask any\n * planner result to serialize itself to a `migration.ts`.\n *\n * Extends the framework `Migration` base class directly (not\n * `MongoMigration`) because `MongoMigration` lives in `@prisma-next/family-mongo`,\n * which depends on this package — extending it here would create a dependency\n * cycle.\n */\nexport class PlannerProducedMongoMigration\n extends Migration<AnyMongoMigrationOperation>\n implements MigrationPlanWithAuthoringSurface\n{\n readonly targetId = 'mongo' as const;\n\n constructor(\n private readonly calls: readonly OpFactoryCall[],\n private readonly meta: MigrationMeta,\n ) {\n super();\n }\n\n override get operations(): readonly AnyMongoMigrationOperation[] {\n return renderOps(this.calls);\n }\n\n override describe(): MigrationMeta {\n return this.meta;\n }\n\n renderTypeScript(): string {\n return renderCallsToTypeScript(this.calls, {\n from: this.meta.from,\n to: this.meta.to,\n ...ifDefined('kind', this.meta.kind),\n ...ifDefined('labels', this.meta.labels),\n });\n }\n}\n","import type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type {\n MigrationOperationClass,\n MigrationOperationPolicy,\n MigrationPlanner,\n MigrationPlannerConflict,\n MigrationPlannerResult,\n MigrationPlanWithAuthoringSurface,\n MigrationScaffoldContext,\n} from '@prisma-next/framework-components/control';\nimport type { MongoContract } from '@prisma-next/mongo-contract';\nimport type {\n MongoSchemaCollection,\n MongoSchemaCollectionOptions,\n MongoSchemaIndex,\n MongoSchemaIR,\n MongoSchemaValidator,\n} from '@prisma-next/mongo-schema-ir';\nimport { canonicalize, deepEqual } from '@prisma-next/mongo-schema-ir';\nimport { contractToMongoSchemaIR } from './contract-to-schema';\nimport type { OpFactoryCall } from './op-factory-call';\nimport {\n CollModCall,\n CreateCollectionCall,\n CreateIndexCall,\n DropCollectionCall,\n DropIndexCall,\n schemaCollectionToCreateCollectionOptions,\n schemaIndexToCreateIndexOptions,\n} from './op-factory-call';\nimport { PlannerProducedMongoMigration } from './planner-produced-migration';\n\nfunction buildIndexLookupKey(index: MongoSchemaIndex): string {\n const keys = index.keys.map((k) => `${k.field}:${k.direction}`).join(',');\n const opts = [\n index.unique ? 'unique' : '',\n index.sparse ? 'sparse' : '',\n index.expireAfterSeconds != null ? `ttl:${index.expireAfterSeconds}` : '',\n index.partialFilterExpression ? `pfe:${canonicalize(index.partialFilterExpression)}` : '',\n index.wildcardProjection ? `wp:${canonicalize(index.wildcardProjection)}` : '',\n index.collation ? `col:${canonicalize(index.collation)}` : '',\n index.weights ? `wt:${canonicalize(index.weights)}` : '',\n index.default_language ? `dl:${index.default_language}` : '',\n index.language_override ? `lo:${index.language_override}` : '',\n ]\n .filter(Boolean)\n .join(';');\n return opts ? `${keys}|${opts}` : keys;\n}\n\nfunction validatorsEqual(\n a: MongoSchemaValidator | undefined,\n b: MongoSchemaValidator | undefined,\n): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return (\n a.validationLevel === b.validationLevel &&\n a.validationAction === b.validationAction &&\n canonicalize(a.jsonSchema) === canonicalize(b.jsonSchema)\n );\n}\n\nfunction classifyValidatorUpdate(\n origin: MongoSchemaValidator,\n dest: MongoSchemaValidator,\n): 'widening' | 'destructive' {\n let hasDestructive = false;\n\n if (canonicalize(origin.jsonSchema) !== canonicalize(dest.jsonSchema)) {\n hasDestructive = true;\n }\n\n if (origin.validationAction !== dest.validationAction) {\n if (dest.validationAction === 'error') hasDestructive = true;\n }\n\n if (origin.validationLevel !== dest.validationLevel) {\n if (dest.validationLevel === 'strict') hasDestructive = true;\n }\n\n return hasDestructive ? 'destructive' : 'widening';\n}\n\nfunction hasImmutableOptionChange(\n origin: MongoSchemaCollectionOptions | undefined,\n dest: MongoSchemaCollectionOptions | undefined,\n): string | undefined {\n if (canonicalize(origin?.capped) !== canonicalize(dest?.capped)) return 'capped';\n if (canonicalize(origin?.timeseries) !== canonicalize(dest?.timeseries)) return 'timeseries';\n if (canonicalize(origin?.collation) !== canonicalize(dest?.collation)) return 'collation';\n if (canonicalize(origin?.clusteredIndex) !== canonicalize(dest?.clusteredIndex))\n return 'clusteredIndex';\n return undefined;\n}\n\nfunction collectionHasOptions(coll: MongoSchemaCollection): boolean {\n return !!(coll.options || coll.validator);\n}\n\nexport type PlanCallsResult =\n | { readonly kind: 'success'; readonly calls: OpFactoryCall[] }\n | { readonly kind: 'failure'; readonly conflicts: MigrationPlannerConflict[] };\n\nexport class MongoMigrationPlanner implements MigrationPlanner<'mongo', 'mongo'> {\n planCalls(options: {\n readonly contract: unknown;\n readonly schema: unknown;\n readonly policy: MigrationOperationPolicy;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'mongo', 'mongo'>>;\n }): PlanCallsResult {\n const contract = options.contract as MongoContract;\n const originIR = options.schema as MongoSchemaIR;\n const destinationIR = contractToMongoSchemaIR(contract);\n\n const collCreates: OpFactoryCall[] = [];\n const drops: OpFactoryCall[] = [];\n const creates: OpFactoryCall[] = [];\n const validatorOps: OpFactoryCall[] = [];\n const mutableOptionOps: OpFactoryCall[] = [];\n const collDrops: OpFactoryCall[] = [];\n const conflicts: MigrationPlannerConflict[] = [];\n\n const allCollectionNames = new Set([\n ...originIR.collectionNames,\n ...destinationIR.collectionNames,\n ]);\n\n for (const collName of [...allCollectionNames].sort()) {\n const originColl = originIR.collection(collName);\n const destColl = destinationIR.collection(collName);\n\n if (!originColl) {\n if (destColl && collectionHasOptions(destColl)) {\n const opts = schemaCollectionToCreateCollectionOptions(destColl);\n collCreates.push(new CreateCollectionCall(collName, opts));\n }\n } else if (!destColl) {\n collDrops.push(new DropCollectionCall(collName));\n } else {\n const immutableChange = hasImmutableOptionChange(originColl.options, destColl.options);\n if (immutableChange) {\n conflicts.push({\n kind: 'policy-violation',\n summary: `Cannot change immutable collection option '${immutableChange}' on ${collName}`,\n why: `MongoDB does not support modifying the '${immutableChange}' option after collection creation`,\n });\n }\n\n const mutableCall = planMutableOptionsDiffCall(\n collName,\n originColl.options,\n destColl.options,\n );\n if (mutableCall) mutableOptionOps.push(mutableCall);\n\n const validatorCall = planValidatorDiffCall(\n collName,\n originColl.validator,\n destColl.validator,\n );\n if (validatorCall) validatorOps.push(validatorCall);\n }\n\n const originLookup = new Map<string, MongoSchemaIndex>();\n if (originColl) {\n for (const idx of originColl.indexes) {\n originLookup.set(buildIndexLookupKey(idx), idx);\n }\n }\n\n const destLookup = new Map<string, MongoSchemaIndex>();\n if (destColl) {\n for (const idx of destColl.indexes) {\n destLookup.set(buildIndexLookupKey(idx), idx);\n }\n }\n\n for (const [lookupKey, idx] of originLookup) {\n if (!destLookup.has(lookupKey)) {\n drops.push(new DropIndexCall(collName, idx.keys));\n }\n }\n\n for (const [lookupKey, idx] of destLookup) {\n if (!originLookup.has(lookupKey)) {\n creates.push(\n new CreateIndexCall(collName, idx.keys, schemaIndexToCreateIndexOptions(idx)),\n );\n }\n }\n }\n\n if (conflicts.length > 0) {\n return { kind: 'failure', conflicts };\n }\n\n const allCalls = [\n ...collCreates,\n ...drops,\n ...creates,\n ...validatorOps,\n ...mutableOptionOps,\n ...collDrops,\n ];\n\n for (const call of allCalls) {\n if (!options.policy.allowedOperationClasses.includes(call.operationClass)) {\n conflicts.push({\n kind: 'policy-violation',\n summary: `${call.operationClass} operation disallowed: ${call.label}`,\n why: `Policy does not allow '${call.operationClass}' operations`,\n });\n }\n }\n\n if (conflicts.length > 0) {\n return { kind: 'failure', conflicts };\n }\n\n return { kind: 'success', calls: allCalls };\n }\n\n plan(options: {\n readonly contract: unknown;\n readonly schema: unknown;\n readonly policy: MigrationOperationPolicy;\n readonly fromHash: string;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'mongo', 'mongo'>>;\n }): MigrationPlannerResult {\n const contract = options.contract as MongoContract;\n const result = this.planCalls(options);\n if (result.kind === 'failure') return result;\n return {\n kind: 'success',\n plan: new PlannerProducedMongoMigration(result.calls, {\n from: options.fromHash,\n to: contract.storage.storageHash,\n }),\n };\n }\n\n /**\n * Produce an empty `migration.ts` authoring surface for `migration new`.\n *\n * The \"empty migration\" is a `PlannerProducedMongoMigration` with no\n * operations; `renderTypeScript()` emits a stub class with the correct\n * `from`/`to` metadata that the user then fills in with operations. The\n * contract path on the context is unused — Mongo's emitted source does\n * not import from the generated contract `.d.ts`.\n */\n emptyMigration(context: MigrationScaffoldContext): MigrationPlanWithAuthoringSurface {\n return new PlannerProducedMongoMigration([], {\n from: context.fromHash,\n to: context.toHash,\n });\n }\n}\n\nfunction planValidatorDiffCall(\n collName: string,\n originValidator: MongoSchemaValidator | undefined,\n destValidator: MongoSchemaValidator | undefined,\n): OpFactoryCall | undefined {\n if (validatorsEqual(originValidator, destValidator)) return undefined;\n\n if (destValidator) {\n const operationClass: MigrationOperationClass = originValidator\n ? classifyValidatorUpdate(originValidator, destValidator)\n : 'destructive';\n return new CollModCall(\n collName,\n {\n validator: { $jsonSchema: destValidator.jsonSchema },\n validationLevel: destValidator.validationLevel,\n validationAction: destValidator.validationAction,\n },\n {\n id: `validator.${collName}.${originValidator ? 'update' : 'add'}`,\n label: `${originValidator ? 'Update' : 'Add'} validator on ${collName}`,\n operationClass,\n },\n );\n }\n\n return new CollModCall(\n collName,\n {\n validator: {},\n validationLevel: 'strict',\n validationAction: 'error',\n },\n {\n id: `validator.${collName}.remove`,\n label: `Remove validator on ${collName}`,\n operationClass: 'widening',\n },\n );\n}\n\nfunction planMutableOptionsDiffCall(\n collName: string,\n origin: MongoSchemaCollectionOptions | undefined,\n dest: MongoSchemaCollectionOptions | undefined,\n): OpFactoryCall | undefined {\n const originCSPPI = origin?.changeStreamPreAndPostImages;\n const destCSPPI = dest?.changeStreamPreAndPostImages;\n if (deepEqual(originCSPPI, destCSPPI)) return undefined;\n\n const desiredCSPPI = destCSPPI ?? { enabled: false };\n return new CollModCall(\n collName,\n {\n changeStreamPreAndPostImages: desiredCSPPI,\n },\n {\n id: `options.${collName}.update`,\n label: `Update mutable options on ${collName}`,\n operationClass: desiredCSPPI.enabled ? 'widening' : 'destructive',\n },\n );\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { errorRunnerFailed } from '@prisma-next/errors/execution';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type {\n MigrationOperationPolicy,\n MigrationPlan,\n MigrationPlanOperation,\n MigrationRunnerExecutionChecks,\n MigrationRunnerFailure,\n MigrationRunnerResult,\n OperationContext,\n} from '@prisma-next/framework-components/control';\nimport type { MongoContract } from '@prisma-next/mongo-contract';\nimport type { MongoAdapter, MongoDriver } from '@prisma-next/mongo-lowering';\nimport type {\n AnyMongoMigrationOperation,\n MongoDataTransformCheck,\n MongoDataTransformOperation,\n MongoDdlCommandVisitor,\n MongoInspectionCommandVisitor,\n MongoMigrationCheck,\n MongoMigrationPlanOperation,\n} from '@prisma-next/mongo-query-ast/control';\nimport type { MongoSchemaIR } from '@prisma-next/mongo-schema-ir';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport { FilterEvaluator } from './filter-evaluator';\nimport { deserializeMongoOps } from './mongo-ops-serializer';\nimport { verifyMongoSchema } from './schema-verify/verify-mongo-schema';\n\nconst READ_ONLY_CHECK_COMMAND_KINDS: ReadonlySet<string> = new Set(['aggregate', 'rawAggregate']);\n\nexport interface MarkerOperations {\n readMarker(): Promise<ContractMarkerRecord | null>;\n initMarker(destination: {\n readonly storageHash: string;\n readonly profileHash: string;\n }): Promise<void>;\n updateMarker(\n expectedFrom: string,\n destination: { readonly storageHash: string; readonly profileHash: string },\n ): Promise<boolean>;\n writeLedgerEntry(entry: {\n readonly edgeId: string;\n readonly from: string;\n readonly to: string;\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\nexport interface MongoMigrationRunnerExecuteOptions {\n readonly plan: MigrationPlan;\n readonly destinationContract: MongoContract;\n readonly policy: MigrationOperationPolicy;\n readonly callbacks?: {\n onOperationStart?(op: MigrationPlanOperation): void;\n onOperationComplete?(op: MigrationPlanOperation): void;\n };\n readonly executionChecks?: MigrationRunnerExecutionChecks;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'mongo', 'mongo'>>;\n readonly strictVerification?: boolean;\n readonly context?: OperationContext;\n}\n\nfunction runnerFailure(\n code: string,\n summary: string,\n opts?: { why?: string; meta?: Record<string, unknown> },\n): MigrationRunnerResult {\n return notOk<MigrationRunnerFailure>({\n code,\n summary,\n ...opts,\n });\n}\n\nexport class MongoMigrationRunner {\n constructor(private readonly deps: MongoRunnerDependencies) {}\n\n async execute(options: MongoMigrationRunnerExecuteOptions): Promise<MigrationRunnerResult> {\n const { commandExecutor, inspectionExecutor, adapter, driver, markerOps } = this.deps;\n const operations = deserializeMongoOps(options.plan.operations as readonly unknown[]);\n\n const policyCheck = this.enforcePolicyCompatibility(options.policy, operations);\n if (policyCheck) return policyCheck;\n\n const existingMarker = await markerOps.readMarker();\n\n const markerCheck = this.ensureMarkerCompatibility(existingMarker, options.plan);\n if (markerCheck) return markerCheck;\n\n const checks = options.executionChecks;\n const runPrechecks = checks?.prechecks !== false;\n const runPostchecks = checks?.postchecks !== false;\n const runIdempotency = checks?.idempotencyChecks !== false;\n\n const filterEvaluator = new FilterEvaluator();\n\n let operationsExecuted = 0;\n\n for (const operation of operations) {\n options.callbacks?.onOperationStart?.(operation);\n try {\n if (operation.operationClass === 'data') {\n const result = await this.executeDataTransform(\n operation as MongoDataTransformOperation,\n adapter,\n driver,\n filterEvaluator,\n runIdempotency,\n runPrechecks,\n runPostchecks,\n );\n if (result.failure) return result.failure;\n if (result.executed) operationsExecuted += 1;\n continue;\n }\n\n const ddlOp = operation as MongoMigrationPlanOperation;\n\n if (runPostchecks && runIdempotency) {\n const allSatisfied = await this.allChecksSatisfied(\n ddlOp.postcheck,\n inspectionExecutor,\n filterEvaluator,\n );\n if (allSatisfied) continue;\n }\n\n if (runPrechecks) {\n const precheckResult = await this.evaluateChecks(\n ddlOp.precheck,\n inspectionExecutor,\n filterEvaluator,\n );\n if (!precheckResult) {\n return runnerFailure(\n 'PRECHECK_FAILED',\n `Operation ${operation.id} failed during precheck`,\n { meta: { operationId: operation.id } },\n );\n }\n }\n\n for (const step of ddlOp.execute) {\n await step.command.accept(commandExecutor);\n }\n\n if (runPostchecks) {\n const postcheckResult = await this.evaluateChecks(\n ddlOp.postcheck,\n inspectionExecutor,\n filterEvaluator,\n );\n if (!postcheckResult) {\n return runnerFailure(\n 'POSTCHECK_FAILED',\n `Operation ${operation.id} failed during postcheck`,\n { meta: { operationId: operation.id } },\n );\n }\n }\n\n operationsExecuted += 1;\n } finally {\n options.callbacks?.onOperationComplete?.(operation);\n }\n }\n\n const destination = options.plan.destination;\n const profileHash = options.destinationContract.profileHash ?? destination.storageHash;\n\n if (\n operationsExecuted === 0 &&\n existingMarker?.storageHash === destination.storageHash &&\n existingMarker.profileHash === profileHash\n ) {\n return ok({ operationsPlanned: operations.length, operationsExecuted });\n }\n\n const liveSchema = await this.deps.introspectSchema();\n const verifyResult = verifyMongoSchema({\n contract: options.destinationContract,\n schema: liveSchema,\n strict: options.strictVerification ?? true,\n frameworkComponents: options.frameworkComponents,\n ...(options.context ? { context: options.context } : {}),\n });\n if (!verifyResult.ok) {\n return runnerFailure('SCHEMA_VERIFY_FAILED', verifyResult.summary, {\n why: 'The resulting database schema does not satisfy the destination contract.',\n meta: { issues: verifyResult.schema.issues },\n });\n }\n\n if (existingMarker) {\n const updated = await markerOps.updateMarker(existingMarker.storageHash, {\n storageHash: destination.storageHash,\n profileHash,\n });\n if (!updated) {\n return runnerFailure(\n 'MARKER_CAS_FAILURE',\n 'Marker was modified by another process during migration execution.',\n {\n meta: {\n expectedStorageHash: existingMarker.storageHash,\n destinationStorageHash: destination.storageHash,\n },\n },\n );\n }\n } else {\n await markerOps.initMarker({\n storageHash: destination.storageHash,\n profileHash,\n });\n }\n\n const originHash = existingMarker?.storageHash ?? '';\n await markerOps.writeLedgerEntry({\n edgeId: `${originHash}->${destination.storageHash}`,\n from: originHash,\n to: destination.storageHash,\n });\n\n return ok({ operationsPlanned: operations.length, operationsExecuted });\n }\n\n private async executeDataTransform(\n op: MongoDataTransformOperation,\n adapter: MongoAdapter,\n driver: MongoDriver,\n filterEvaluator: FilterEvaluator,\n runIdempotency: boolean,\n runPrechecks: boolean,\n runPostchecks: boolean,\n ): Promise<{ executed: boolean; failure?: MigrationRunnerResult }> {\n if (runPostchecks && runIdempotency && op.postcheck.length > 0) {\n const allSatisfied = await this.evaluateDataTransformChecks(\n op.postcheck,\n adapter,\n driver,\n filterEvaluator,\n );\n if (allSatisfied) return { executed: false };\n }\n\n if (runPrechecks && op.precheck.length > 0) {\n const passed = await this.evaluateDataTransformChecks(\n op.precheck,\n adapter,\n driver,\n filterEvaluator,\n );\n if (!passed) {\n return {\n executed: false,\n failure: runnerFailure('PRECHECK_FAILED', `Operation ${op.id} failed during precheck`, {\n meta: { operationId: op.id, name: op.name },\n }),\n };\n }\n }\n\n for (const plan of op.run) {\n const wireCommand = await adapter.lower(plan);\n for await (const _ of driver.execute(wireCommand)) {\n /* consume */\n }\n }\n\n if (runPostchecks && op.postcheck.length > 0) {\n const passed = await this.evaluateDataTransformChecks(\n op.postcheck,\n adapter,\n driver,\n filterEvaluator,\n );\n if (!passed) {\n return {\n executed: false,\n failure: runnerFailure('POSTCHECK_FAILED', `Operation ${op.id} failed during postcheck`, {\n meta: { operationId: op.id, name: op.name },\n }),\n };\n }\n }\n\n return { executed: true };\n }\n\n private async evaluateDataTransformChecks(\n checks: readonly MongoDataTransformCheck[],\n adapter: MongoAdapter,\n driver: MongoDriver,\n filterEvaluator: FilterEvaluator,\n ): Promise<boolean> {\n for (const check of checks) {\n const commandKind = check.source.command.kind;\n if (!READ_ONLY_CHECK_COMMAND_KINDS.has(commandKind)) {\n throw errorRunnerFailed(\n `Data-transform check rejected: command kind \"${commandKind}\" is not read-only`,\n {\n why: 'Data-transform checks must use aggregate or rawAggregate commands so the pre/postcheck path cannot mutate the database.',\n fix: 'Author the check.source as an aggregate pipeline (or rawAggregate) rather than a DML write command.',\n meta: {\n checkDescription: check.description,\n commandKind,\n collection: check.source.collection,\n },\n },\n );\n }\n const wireCommand = await adapter.lower(check.source);\n let matchFound = false;\n for await (const row of driver.execute<Record<string, unknown>>(wireCommand)) {\n if (filterEvaluator.evaluate(check.filter, row)) {\n matchFound = true;\n break;\n }\n }\n const passed = check.expect === 'exists' ? matchFound : !matchFound;\n if (!passed) return false;\n }\n return true;\n }\n\n private async evaluateChecks(\n checks: readonly MongoMigrationCheck[],\n inspectionExecutor: MongoInspectionCommandVisitor<Promise<Record<string, unknown>[]>>,\n filterEvaluator: FilterEvaluator,\n ): Promise<boolean> {\n for (const check of checks) {\n const documents = await check.source.accept(inspectionExecutor);\n const matchFound = documents.some((doc) =>\n filterEvaluator.evaluate(check.filter, doc as Record<string, unknown>),\n );\n const passed = check.expect === 'exists' ? matchFound : !matchFound;\n if (!passed) return false;\n }\n return true;\n }\n\n private async allChecksSatisfied(\n checks: readonly MongoMigrationCheck[],\n inspectionExecutor: MongoInspectionCommandVisitor<Promise<Record<string, unknown>[]>>,\n filterEvaluator: FilterEvaluator,\n ): Promise<boolean> {\n if (checks.length === 0) return false;\n return this.evaluateChecks(checks, inspectionExecutor, filterEvaluator);\n }\n\n private enforcePolicyCompatibility(\n policy: MigrationOperationPolicy,\n operations: readonly AnyMongoMigrationOperation[],\n ): MigrationRunnerResult | undefined {\n const allowedClasses = new Set(policy.allowedOperationClasses);\n for (const operation of operations) {\n if (!allowedClasses.has(operation.operationClass)) {\n return runnerFailure(\n 'POLICY_VIOLATION',\n `Operation ${operation.id} has class \"${operation.operationClass}\" which is not allowed by policy.`,\n {\n why: `Policy only allows: ${[...allowedClasses].join(', ')}.`,\n meta: {\n operationId: operation.id,\n operationClass: operation.operationClass,\n },\n },\n );\n }\n }\n return undefined;\n }\n\n private ensureMarkerCompatibility(\n marker: ContractMarkerRecord | null,\n plan: MigrationPlan,\n ): MigrationRunnerResult | undefined {\n const origin = plan.origin ?? null;\n if (!origin) {\n if (marker) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n 'Database already has a contract marker but the plan has no origin. This would silently overwrite the existing marker.',\n { meta: { markerStorageHash: marker.storageHash } },\n );\n }\n return undefined;\n }\n\n if (!marker) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Missing contract marker: expected origin storage hash ${origin.storageHash}.`,\n { meta: { expectedOriginStorageHash: origin.storageHash } },\n );\n }\n\n if (marker.storageHash !== origin.storageHash) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Existing contract marker (${marker.storageHash}) does not match plan origin (${origin.storageHash}).`,\n {\n meta: {\n markerStorageHash: marker.storageHash,\n expectedOriginStorageHash: origin.storageHash,\n },\n },\n );\n }\n\n return undefined;\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/target-mongo",
|
|
3
|
-
"version": "0.5.0-dev.
|
|
3
|
+
"version": "0.5.0-dev.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"description": "MongoDB target pack for Prisma Next",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"arktype": "^2.1.29",
|
|
9
9
|
"mongodb": "^6.16.0",
|
|
10
|
-
"@prisma-next/
|
|
11
|
-
"@prisma-next/
|
|
12
|
-
"@prisma-next/
|
|
13
|
-
"@prisma-next/
|
|
14
|
-
"@prisma-next/
|
|
15
|
-
"@prisma-next/
|
|
16
|
-
"@prisma-next/mongo-
|
|
17
|
-
"@prisma-next/mongo-
|
|
18
|
-
"@prisma-next/mongo-schema-ir": "0.5.0-dev.
|
|
19
|
-
"@prisma-next/utils": "0.5.0-dev.
|
|
20
|
-
"@prisma-next/mongo-
|
|
10
|
+
"@prisma-next/contract": "0.5.0-dev.8",
|
|
11
|
+
"@prisma-next/errors": "0.5.0-dev.8",
|
|
12
|
+
"@prisma-next/framework-components": "0.5.0-dev.8",
|
|
13
|
+
"@prisma-next/migration-tools": "0.5.0-dev.8",
|
|
14
|
+
"@prisma-next/mongo-lowering": "0.5.0-dev.8",
|
|
15
|
+
"@prisma-next/ts-render": "0.5.0-dev.8",
|
|
16
|
+
"@prisma-next/mongo-contract": "0.5.0-dev.8",
|
|
17
|
+
"@prisma-next/mongo-query-ast": "0.5.0-dev.8",
|
|
18
|
+
"@prisma-next/mongo-schema-ir": "0.5.0-dev.8",
|
|
19
|
+
"@prisma-next/utils": "0.5.0-dev.8",
|
|
20
|
+
"@prisma-next/mongo-value": "0.5.0-dev.8"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"mongodb-memory-server": "10.4.3",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"typescript": "5.9.3",
|
|
27
27
|
"vitest": "4.0.17",
|
|
28
28
|
"@prisma-next/test-utils": "0.0.1",
|
|
29
|
-
"@prisma-next/
|
|
30
|
-
"@prisma-next/
|
|
29
|
+
"@prisma-next/tsconfig": "0.0.0",
|
|
30
|
+
"@prisma-next/tsdown": "0.0.0"
|
|
31
31
|
},
|
|
32
32
|
"files": [
|
|
33
33
|
"dist",
|
package/src/core/mongo-runner.ts
CHANGED
|
@@ -271,7 +271,7 @@ export class MongoMigrationRunner {
|
|
|
271
271
|
}
|
|
272
272
|
|
|
273
273
|
for (const plan of op.run) {
|
|
274
|
-
const wireCommand = adapter.lower(plan);
|
|
274
|
+
const wireCommand = await adapter.lower(plan);
|
|
275
275
|
for await (const _ of driver.execute(wireCommand)) {
|
|
276
276
|
/* consume */
|
|
277
277
|
}
|
|
@@ -319,7 +319,7 @@ export class MongoMigrationRunner {
|
|
|
319
319
|
},
|
|
320
320
|
);
|
|
321
321
|
}
|
|
322
|
-
const wireCommand = adapter.lower(check.source);
|
|
322
|
+
const wireCommand = await adapter.lower(check.source);
|
|
323
323
|
let matchFound = false;
|
|
324
324
|
for await (const row of driver.execute<Record<string, unknown>>(wireCommand)) {
|
|
325
325
|
if (filterEvaluator.evaluate(check.filter, row)) {
|