@prisma-next/mongo-orm 0.16.0-dev.24 → 0.16.0-dev.25

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/index.d.mts CHANGED
@@ -214,7 +214,7 @@ interface MongoCollection<TContract extends MongoContractWithTypeMaps<MongoContr
214
214
  /** Returns input rows with server-assigned `_id`s. Does not re-read stored documents. */
215
215
  createAll(data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;
216
216
  /** Inserts multiple documents and returns the number inserted. */
217
- createCount(data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>): Promise<number>;
217
+ createAndCount(data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>): Promise<number>;
218
218
  /** Updates one matching document via `findOneAndUpdate`. Returns the updated document or `null`. Requires `.where()`. */
219
219
  update(data: Partial<DefaultModelRow<TContract, ModelName>>): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;
220
220
  /** Updates one matching document using field operations from a callback. Requires `.where()`. */
@@ -224,15 +224,15 @@ interface MongoCollection<TContract extends MongoContractWithTypeMaps<MongoContr
224
224
  /** Updates all matching documents using field operations from a callback. Requires `.where()`. */
225
225
  updateAll(callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[]): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;
226
226
  /** Updates all matching documents and returns the number modified. Requires `.where()`. */
227
- updateCount(data: Partial<DefaultModelRow<TContract, ModelName>>): Promise<number>;
227
+ updateAndCount(data: Partial<DefaultModelRow<TContract, ModelName>>): Promise<number>;
228
228
  /** Updates all matching documents using field operations and returns the number modified. Requires `.where()`. */
229
- updateCount(callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[]): Promise<number>;
229
+ updateAndCount(callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[]): Promise<number>;
230
230
  /** Deletes one matching document via `findOneAndDelete`. Returns the deleted document or `null`. Requires `.where()`. */
231
231
  delete(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;
232
232
  /** Non-atomic: reads matching docs then deletes them. Concurrent writes may cause stale results. Requires `.where()`. */
233
233
  deleteAll(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;
234
234
  /** Deletes all matching documents and returns the number deleted. Requires `.where()`. */
235
- deleteCount(): Promise<number>;
235
+ deleteAndCount(): Promise<number>;
236
236
  /**
237
237
  * On insert: `update` fields are applied via `$set`, remaining `create` fields via `$setOnInsert`.
238
238
  * This means `update` values take precedence over `create` for overlapping fields on insert.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/executor.ts","../src/field-accessor.ts","../src/types.ts","../src/collection.ts","../src/collection-state.ts","../src/compile.ts","../src/mongo-orm.ts","../src/raw-collection.ts","../src/mongo-raw.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/executor.ts","../src/field-accessor.ts","../src/types.ts","../src/collection.ts","../src/collection-state.ts","../src/compile.ts","../src/mongo-orm.ts","../src/raw-collection.ts","../src/mongo-raw.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -160,6 +160,9 @@ function ormError(code, message, options) {
160
160
  function resolveCollectionName(model, modelName) {
161
161
  return model.storage.collection ?? modelName;
162
162
  }
163
+ function isUnknownRecord(value) {
164
+ return typeof value === "object" && value !== null && !Array.isArray(value);
165
+ }
163
166
  var MongoCollectionImpl = class MongoCollectionImpl {
164
167
  #contract;
165
168
  #modelName;
@@ -171,28 +174,28 @@ var MongoCollectionImpl = class MongoCollectionImpl {
171
174
  this.#contract = contract;
172
175
  this.#modelName = modelName;
173
176
  this.#executor = executor;
174
- const model = domainModelsAtDefaultNamespace(contract.domain)[modelName];
177
+ const model = blindCast(domainModelsAtDefaultNamespace(contract.domain)[modelName]);
175
178
  this.#collectionName = resolveCollectionName(model, modelName);
176
179
  this.#state = emptyCollectionState();
177
180
  }
178
181
  variant(variantName) {
179
- const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName];
180
- if (!model?.discriminator || !model.variants) return this;
182
+ const model = blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
183
+ if (!model?.discriminator || !model.variants) return blindCast(this);
181
184
  const variantEntry = model.variants[variantName];
182
- if (!variantEntry) return this;
185
+ if (!variantEntry) return blindCast(this);
183
186
  const filter = MongoFieldFilter.eq(model.discriminator.field, new MongoParamRef(variantEntry.value));
184
187
  return this.#cloneWithVariant({ filters: [...this.#state.filters, filter] }, variantName);
185
188
  }
186
189
  where(filter) {
187
190
  if (isMongoFilterExpr(filter)) return this.#clone({ filters: [...this.#state.filters, filter] });
188
- const compiled = this.#compileWhereObject(filter);
191
+ const compiled = this.#compileWhereObject(blindCast(filter));
189
192
  return this.#clone({ filters: [...this.#state.filters, ...compiled] });
190
193
  }
191
194
  select(...fields) {
192
195
  return this.#clone({ selectedFields: [...this.#state.selectedFields ?? [], ...fields] });
193
196
  }
194
197
  include(relationName) {
195
- const relation = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName].relations?.[relationName];
198
+ const relation = blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]).relations?.[relationName];
196
199
  if (!relation) throw ormError("ORM.RELATION_UNKNOWN", `Unknown relation "${relationName}" on model "${this.#modelName}"`, { meta: {
197
200
  model: this.#modelName,
198
201
  relation: relationName
@@ -218,7 +221,7 @@ var MongoCollectionImpl = class MongoCollectionImpl {
218
221
  foreignField,
219
222
  cardinality: ref.cardinality
220
223
  };
221
- return this.#clone({ includes: [...this.#state.includes, includeExpr] });
224
+ return blindCast(this.#clone({ includes: [...this.#state.includes, includeExpr] }));
222
225
  }
223
226
  orderBy(spec) {
224
227
  const merged = {
@@ -243,34 +246,35 @@ var MongoCollectionImpl = class MongoCollectionImpl {
243
246
  }
244
247
  async create(data) {
245
248
  this.#rejectIncludes("create");
246
- const normalized = this.#injectDiscriminator(this.#stripUndefined(data));
249
+ const normalized = this.#injectDiscriminator(this.#stripUndefined(blindCast(data)));
247
250
  const document = this.#toDocument(normalized);
248
251
  const command = new InsertOneCommand(this.#collectionName, document);
249
- return {
250
- _id: (await this.#drainPlan(command))[0].insertedId,
252
+ const insertedId = blindCast((await this.#drainPlan(command))[0]).insertedId;
253
+ return blindCast({
254
+ _id: insertedId,
251
255
  ...normalized
252
- };
256
+ });
253
257
  }
254
258
  createAll(data) {
255
259
  this.#rejectIncludes("createAll");
256
260
  const self = this;
257
261
  async function* gen() {
258
- const normalizedRows = data.map((d) => self.#injectDiscriminator(self.#stripUndefined(d)));
262
+ const normalizedRows = data.map((d) => self.#injectDiscriminator(self.#stripUndefined(blindCast(d))));
259
263
  const documents = normalizedRows.map((d) => self.#toDocument(d));
260
264
  const command = new InsertManyCommand(self.#collectionName, documents);
261
- const insertedIds = (await self.#drainPlan(command))[0].insertedIds;
262
- for (let i = 0; i < normalizedRows.length; i++) yield {
265
+ const insertedIds = blindCast((await self.#drainPlan(command))[0]).insertedIds;
266
+ for (let i = 0; i < normalizedRows.length; i++) yield blindCast({
263
267
  _id: insertedIds[i],
264
268
  ...normalizedRows[i]
265
- };
269
+ });
266
270
  }
267
271
  return new AsyncIterableResult(gen());
268
272
  }
269
- async createCount(data) {
270
- this.#rejectIncludes("createCount");
271
- const documents = data.map((d) => this.#toDocument(this.#injectDiscriminator(d)));
273
+ async createAndCount(data) {
274
+ this.#rejectIncludes("createAndCount");
275
+ const documents = data.map((d) => this.#toDocument(this.#injectDiscriminator(blindCast(d))));
272
276
  const command = new InsertManyCommand(this.#collectionName, documents);
273
- return (await this.#drainPlan(command))[0].insertedCount;
277
+ return blindCast((await this.#drainPlan(command))[0]).insertedCount;
274
278
  }
275
279
  async update(dataOrCallback) {
276
280
  this.#requireFilters("update");
@@ -279,7 +283,8 @@ var MongoCollectionImpl = class MongoCollectionImpl {
279
283
  const filter = this.#mergeFilters();
280
284
  const updateDoc = this.#resolveUpdateDoc(dataOrCallback);
281
285
  const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, false);
282
- return (await this.#drainPlan(command))[0] ?? null;
286
+ const result = (await this.#drainPlan(command))[0];
287
+ return result === void 0 ? null : blindCast(result);
283
288
  }
284
289
  updateAll(dataOrCallback) {
285
290
  this.#requireFilters("updateAll");
@@ -297,14 +302,14 @@ var MongoCollectionImpl = class MongoCollectionImpl {
297
302
  }
298
303
  return new AsyncIterableResult(gen());
299
304
  }
300
- async updateCount(dataOrCallback) {
301
- this.#requireFilters("updateCount");
302
- this.#rejectWindowing("updateCount");
303
- this.#rejectIncludes("updateCount");
305
+ async updateAndCount(dataOrCallback) {
306
+ this.#requireFilters("updateAndCount");
307
+ this.#rejectWindowing("updateAndCount");
308
+ this.#rejectIncludes("updateAndCount");
304
309
  const filter = this.#mergeFilters();
305
310
  const updateDoc = this.#resolveUpdateDoc(dataOrCallback);
306
311
  const command = new UpdateManyCommand(this.#collectionName, filter, updateDoc);
307
- return (await this.#drainPlan(command))[0].modifiedCount;
312
+ return blindCast((await this.#drainPlan(command))[0]).modifiedCount;
308
313
  }
309
314
  async delete() {
310
315
  this.#requireFilters("delete");
@@ -312,7 +317,8 @@ var MongoCollectionImpl = class MongoCollectionImpl {
312
317
  this.#rejectIncludes("delete");
313
318
  const filter = this.#mergeFilters();
314
319
  const command = new FindOneAndDeleteCommand(this.#collectionName, filter);
315
- return (await this.#drainPlan(command))[0] ?? null;
320
+ const result = (await this.#drainPlan(command))[0];
321
+ return result === void 0 ? null : blindCast(result);
316
322
  }
317
323
  deleteAll() {
318
324
  this.#requireFilters("deleteAll");
@@ -328,20 +334,20 @@ var MongoCollectionImpl = class MongoCollectionImpl {
328
334
  }
329
335
  return new AsyncIterableResult(gen());
330
336
  }
331
- async deleteCount() {
332
- this.#requireFilters("deleteCount");
333
- this.#rejectWindowing("deleteCount");
334
- this.#rejectIncludes("deleteCount");
337
+ async deleteAndCount() {
338
+ this.#requireFilters("deleteAndCount");
339
+ this.#rejectWindowing("deleteAndCount");
340
+ this.#rejectIncludes("deleteAndCount");
335
341
  const filter = this.#mergeFilters();
336
342
  const command = new DeleteManyCommand(this.#collectionName, filter);
337
- return (await this.#drainPlan(command))[0].deletedCount;
343
+ return blindCast((await this.#drainPlan(command))[0]).deletedCount;
338
344
  }
339
345
  async upsert(input) {
340
346
  this.#requireFilters("upsert");
341
347
  this.#rejectWindowing("upsert");
342
348
  this.#rejectIncludes("upsert");
343
349
  const filter = this.#mergeFilters();
344
- const allCreateFields = this.#toDocument(this.#injectDiscriminator(input.create));
350
+ const allCreateFields = this.#toDocument(this.#injectDiscriminator(blindCast(input.create)));
345
351
  let updateDoc;
346
352
  if (typeof input.update === "function") {
347
353
  const accessor = createFieldAccessor();
@@ -354,7 +360,7 @@ var MongoCollectionImpl = class MongoCollectionImpl {
354
360
  } });
355
361
  updateDoc = compileFieldOperations(ops, (field, value, operator) => this.#wrapFieldOpValue(field, value, operator));
356
362
  } else {
357
- const setFields = this.#toSetFields(input.update);
363
+ const setFields = this.#toSetFields(blindCast(input.update));
358
364
  updateDoc = {};
359
365
  if (Object.keys(setFields).length > 0) updateDoc["$set"] = setFields;
360
366
  }
@@ -364,7 +370,7 @@ var MongoCollectionImpl = class MongoCollectionImpl {
364
370
  for (const [key, value] of Object.entries(allCreateFields)) if (!updatedFields.has(key)) insertOnlyFields[key] = value;
365
371
  if (Object.keys(insertOnlyFields).length > 0) updateDoc["$setOnInsert"] = insertOnlyFields;
366
372
  const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, true);
367
- return (await this.#drainPlan(command))[0];
373
+ return blindCast((await this.#drainPlan(command))[0]);
368
374
  }
369
375
  async #readMatchingIds() {
370
376
  const idQuery = this.#clone({
@@ -376,7 +382,10 @@ var MongoCollectionImpl = class MongoCollectionImpl {
376
382
  });
377
383
  const ids = [];
378
384
  const { resultShape: _rs, ...planWithoutShape } = idQuery.#compile();
379
- for await (const row of this.#executor.execute(planWithoutShape)) ids.push(row["_id"]);
385
+ for await (const row of this.#executor.execute(planWithoutShape)) {
386
+ const storageRow = blindCast(row);
387
+ ids.push(storageRow["_id"]);
388
+ }
380
389
  return ids;
381
390
  }
382
391
  #execute() {
@@ -384,7 +393,7 @@ var MongoCollectionImpl = class MongoCollectionImpl {
384
393
  return this.#executor.execute(plan);
385
394
  }
386
395
  #compile() {
387
- const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName];
396
+ const model = blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
388
397
  if (!model) throw ormError("ORM.MODEL_UNKNOWN", `Unknown model: "${this.#modelName}".`, { meta: { model: this.#modelName } });
389
398
  return compileMongoQuery(this.#collectionName, this.#state, this.#contract.storage.storageHash, model);
390
399
  }
@@ -403,7 +412,7 @@ var MongoCollectionImpl = class MongoCollectionImpl {
403
412
  return rows;
404
413
  }
405
414
  #modelFields() {
406
- return domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]?.fields ?? {};
415
+ return blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName])?.fields ?? {};
407
416
  }
408
417
  #compileWhereObject(data) {
409
418
  const fields = this.#modelFields();
@@ -422,8 +431,8 @@ var MongoCollectionImpl = class MongoCollectionImpl {
422
431
  const voName = field.type.name;
423
432
  const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];
424
433
  if (!voDef || value === null) return new MongoParamRef(value);
425
- if (field.many && Array.isArray(value)) return value.map((item) => this.#wrapValueObject(item, voDef));
426
- return this.#wrapValueObject(value, voDef);
434
+ if (field.many && Array.isArray(value)) return value.map((item) => this.#wrapValueObject(blindCast(item), voDef));
435
+ return this.#wrapValueObject(blindCast(value), voDef);
427
436
  }
428
437
  return new MongoParamRef(value);
429
438
  }
@@ -466,7 +475,7 @@ var MongoCollectionImpl = class MongoCollectionImpl {
466
475
  if (ops.length === 0) return { $set: {} };
467
476
  return compileFieldOperations(ops, (field, value, operator) => this.#wrapFieldOpValue(field, value, operator));
468
477
  }
469
- return this.#toUpdateDocument(dataOrCallback);
478
+ return this.#toUpdateDocument(blindCast(dataOrCallback));
470
479
  }
471
480
  #wrapFieldOpValue(field, value, operator) {
472
481
  if (operator === "$unset") return value;
@@ -477,7 +486,7 @@ var MongoCollectionImpl = class MongoCollectionImpl {
477
486
  if (value instanceof MongoParamRef && contractField.type.kind === "scalar") return new MongoParamRef(value.value, { codecId: contractField.type.codecId });
478
487
  if (contractField.type.kind === "valueObject" && value instanceof MongoParamRef) {
479
488
  const raw = value.value;
480
- if (typeof raw === "object" && raw !== null && !Array.isArray(raw)) {
489
+ if (isUnknownRecord(raw)) {
481
490
  const voName = contractField.type.name;
482
491
  const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];
483
492
  if (voDef) return this.#wrapValueObject(raw, voDef);
@@ -500,7 +509,7 @@ var MongoCollectionImpl = class MongoCollectionImpl {
500
509
  if (currentField?.type.kind === "scalar" && value instanceof MongoParamRef) return new MongoParamRef(value.value, { codecId: currentField.type.codecId });
501
510
  if (currentField?.type.kind === "valueObject" && value instanceof MongoParamRef) {
502
511
  const raw = value.value;
503
- if (typeof raw === "object" && raw !== null && !Array.isArray(raw)) {
512
+ if (isUnknownRecord(raw)) {
504
513
  const voName = currentField.type.name;
505
514
  const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];
506
515
  if (voDef) return this.#wrapValueObject(raw, voDef);
@@ -537,7 +546,7 @@ var MongoCollectionImpl = class MongoCollectionImpl {
537
546
  }
538
547
  #injectDiscriminator(data) {
539
548
  if (!this.#variantName) return data;
540
- const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName];
549
+ const model = blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
541
550
  if (!model?.discriminator || !model.variants) return data;
542
551
  const variantEntry = model.variants[this.#variantName];
543
552
  if (!variantEntry) return data;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["#contract","#modelName","#executor","#collectionName","#state","#cloneWithVariant","#clone","#compileWhereObject","#execute","#rejectIncludes","#injectDiscriminator","#stripUndefined","#toDocument","#drainPlan","#requireFilters","#rejectWindowing","#mergeFilters","#resolveUpdateDoc","#readMatchingIds","#wrapFieldOpValue","#toSetFields","#compile","#planMeta","#wrapCommand","#modelFields","#wrapFieldValue","#wrapValueObject","#toUpdateDocument","#wrapDotPathValue","#variantName"],"sources":["../src/collection-state.ts","../src/compile.ts","../src/field-accessor.ts","../src/orm-errors.ts","../src/collection.ts","../src/mongo-orm.ts","../src/raw-collection.ts","../src/mongo-raw.ts"],"sourcesContent":["import type { MongoFilterExpr } from '@prisma-next/mongo-query-ast/execution';\n\nexport interface MongoIncludeExpr {\n readonly relationName: string;\n readonly from: string;\n readonly localField: string;\n readonly foreignField: string;\n readonly cardinality: '1:1' | 'N:1' | '1:N' | 'N:M';\n}\n\nexport interface MongoCollectionState {\n readonly filters: readonly MongoFilterExpr[];\n readonly includes: readonly MongoIncludeExpr[];\n readonly orderBy: Readonly<Record<string, 1 | -1>> | undefined;\n readonly selectedFields: readonly string[] | undefined;\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n}\n\nexport function emptyCollectionState(): MongoCollectionState {\n return {\n filters: [],\n includes: [],\n orderBy: undefined,\n selectedFields: undefined,\n limit: undefined,\n offset: undefined,\n };\n}\n","import type { PlanMeta } from '@prisma-next/contract/types';\nimport type { MongoModelDefinition } from '@prisma-next/mongo-contract';\nimport type { MongoPipelineStage, MongoQueryPlan } from '@prisma-next/mongo-query-ast/execution';\nimport {\n AggregateCommand,\n MongoAndExpr,\n MongoLimitStage,\n MongoLookupStage,\n MongoMatchStage,\n MongoProjectStage,\n MongoSkipStage,\n MongoSortStage,\n MongoUnwindStage,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { contractModelToMongoResultShape } from '@prisma-next/mongo-query-builder';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { MongoCollectionState, MongoIncludeExpr } from './collection-state';\n\nfunction compileIncludes(includes: readonly MongoIncludeExpr[]): MongoPipelineStage[] {\n const stages: MongoPipelineStage[] = [];\n\n for (const inc of includes) {\n stages.push(\n new MongoLookupStage({\n from: inc.from,\n localField: inc.localField,\n foreignField: inc.foreignField,\n as: inc.relationName,\n }),\n );\n\n if (inc.cardinality === 'N:1' || inc.cardinality === '1:1') {\n stages.push(new MongoUnwindStage(`$${inc.relationName}`, true));\n }\n }\n\n return stages;\n}\n\nexport function compileMongoQuery<Row = unknown>(\n collection: string,\n state: MongoCollectionState,\n storageHash: string,\n model: MongoModelDefinition,\n): MongoQueryPlan<Row> {\n const stages: MongoPipelineStage[] = [];\n\n const singleFilter = state.filters.length === 1 ? state.filters[0] : undefined;\n if (singleFilter) {\n stages.push(new MongoMatchStage(singleFilter));\n } else if (state.filters.length > 1) {\n stages.push(new MongoMatchStage(MongoAndExpr.of([...state.filters])));\n }\n\n if (state.includes.length > 0) {\n stages.push(...compileIncludes(state.includes));\n }\n\n if (state.orderBy) {\n stages.push(new MongoSortStage(state.orderBy));\n }\n\n if (state.offset !== undefined) {\n stages.push(new MongoSkipStage(state.offset));\n }\n\n if (state.limit !== undefined) {\n stages.push(new MongoLimitStage(state.limit));\n }\n\n if (state.selectedFields && state.selectedFields.length > 0) {\n const projection: Record<string, 0 | 1> = {};\n for (const field of state.selectedFields) {\n projection[field] = 1;\n }\n if (!Object.hasOwn(projection, '_id')) {\n projection['_id'] = 0;\n }\n stages.push(new MongoProjectStage(projection));\n }\n\n const meta: PlanMeta = {\n target: 'mongo',\n storageHash,\n lane: 'mongo-orm',\n };\n const command = new AggregateCommand(collection, stages);\n\n const selection =\n state.selectedFields !== undefined && state.selectedFields.length > 0\n ? state.selectedFields\n : undefined;\n const includeRelationNames =\n state.includes.length > 0 ? state.includes.map((inc) => inc.relationName) : undefined;\n const resultShape = contractModelToMongoResultShape(model, {\n ...ifDefined('selection', selection),\n ...ifDefined('includeRelationNames', includeRelationNames),\n });\n\n return { collection, command, meta, resultShape };\n}\n","import type {\n ContractField,\n ContractValueObject,\n ContractValueObjectDefinitions,\n} from '@prisma-next/contract/types';\nimport type {\n AnyMongoTypeMaps,\n ExtractMongoCodecTypes,\n InferModelRow,\n MongoContract,\n MongoContractWithTypeMaps,\n MongoModelsMap,\n} from '@prisma-next/mongo-contract';\nimport type { MongoValue } from '@prisma-next/mongo-value';\nimport { MongoParamRef } from '@prisma-next/mongo-value';\n\n// ── Runtime types ────────────────────────────────────────────────────────────\n\nexport type UpdateOperator =\n | '$set'\n | '$unset'\n | '$inc'\n | '$mul'\n | '$push'\n | '$pull'\n | '$addToSet'\n | '$pop';\n\nexport interface FieldOperation {\n readonly operator: UpdateOperator;\n readonly field: string;\n readonly value: MongoValue;\n}\n\n// ── Compile-time types ───────────────────────────────────────────────────────\n\ntype ScalarFieldKeys<\n TContract extends MongoContract,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = {\n [K in keyof MongoModelsMap<TContract>[ModelName]['fields'] &\n string]: MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: { readonly kind: 'scalar' };\n }\n ? K\n : never;\n}[keyof MongoModelsMap<TContract>[ModelName]['fields'] & string];\n\ntype ValueObjectFieldKeys<\n TContract extends MongoContract,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = {\n [K in keyof MongoModelsMap<TContract>[ModelName]['fields'] &\n string]: MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: string };\n }\n ? K\n : never;\n}[keyof MongoModelsMap<TContract>[ModelName]['fields'] & string];\n\ntype ResolvedModelRow<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = InferModelRow<TContract, ModelName>;\n\ntype ResolveFieldType<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n K extends keyof MongoModelsMap<TContract>[ModelName]['fields'] & string,\n TCodecTypes extends Record<string, { output: unknown }> = ExtractMongoCodecTypes<TContract>,\n> = MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n readonly many: true;\n readonly nullable: true;\n}\n ? readonly TCodecTypes[CId]['output'][] | null\n : MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n readonly many: true;\n }\n ? readonly TCodecTypes[CId]['output'][]\n : MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n readonly nullable: true;\n }\n ? TCodecTypes[CId]['output'] | null\n : MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n }\n ? TCodecTypes[CId]['output']\n : K extends keyof ResolvedModelRow<TContract, ModelName>\n ? ResolvedModelRow<TContract, ModelName>[K]\n : unknown;\n\ntype NumericOps = {\n inc(value: number): FieldOperation;\n mul(value: number): FieldOperation;\n};\n\nexport type FieldExpression<T = unknown> = {\n set(value: T): FieldOperation;\n unset(): FieldOperation;\n push(value: T extends readonly (infer E)[] ? E : unknown): FieldOperation;\n pull(match: T extends readonly (infer E)[] ? E | Partial<E> : unknown): FieldOperation;\n addToSet(value: T extends readonly (infer E)[] ? E : unknown): FieldOperation;\n pop(end: 1 | -1): FieldOperation;\n} & (T extends number ? NumericOps : unknown);\n\ntype HasValueObjects = MongoContract;\n\ntype MergedContractValueObjects<TContract extends HasValueObjects> =\n ContractValueObjectDefinitions<TContract> &\n (TContract extends { readonly valueObjects?: infer VOs }\n ? VOs extends Record<string, ContractValueObject>\n ? VOs\n : Record<string, never>\n : Record<string, never>);\n\ntype VOFields<\n TContract extends HasValueObjects,\n VOName extends string,\n> = VOName extends keyof MergedContractValueObjects<TContract>\n ? MergedContractValueObjects<TContract>[VOName] extends {\n readonly fields: infer F extends Record<string, ContractField>;\n }\n ? F\n : never\n : never;\n\ntype VOScalarFieldKeys<Fields extends Record<string, ContractField>> = {\n [K in keyof Fields & string]: Fields[K] extends { readonly type: { readonly kind: 'scalar' } }\n ? K\n : never;\n}[keyof Fields & string];\n\ntype VOValueObjectFieldKeys<Fields extends Record<string, ContractField>> = {\n [K in keyof Fields & string]: Fields[K] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: string };\n }\n ? K\n : never;\n}[keyof Fields & string];\n\ntype VODotPaths<\n TContract extends HasValueObjects,\n Fields extends Record<string, ContractField>,\n Prefix extends string,\n> =\n | { [K in VOScalarFieldKeys<Fields>]: `${Prefix}${K}` }[VOScalarFieldKeys<Fields>]\n | {\n [K in VOValueObjectFieldKeys<Fields>]: Fields[K] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: infer N extends string };\n }\n ? VODotPaths<TContract, VOFields<TContract, N>, `${Prefix}${K}.`>\n : never;\n }[VOValueObjectFieldKeys<Fields>];\n\nexport type DotPath<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = {\n [K in ValueObjectFieldKeys<\n TContract,\n ModelName\n >]: MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: infer N extends string };\n }\n ? VODotPaths<TContract, VOFields<TContract, N>, `${K}.`>\n : never;\n}[ValueObjectFieldKeys<TContract, ModelName>];\n\ntype ResolveDotPathInFields<\n TContract extends HasValueObjects,\n Fields extends Record<string, ContractField>,\n Path extends string,\n TCodecTypes extends Record<string, { output: unknown }>,\n> = Path extends `${infer Head}.${infer Rest}`\n ? Head extends keyof Fields & string\n ? Fields[Head] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: infer N extends string };\n }\n ? ResolveDotPathInFields<TContract, VOFields<TContract, N>, Rest, TCodecTypes>\n : never\n : never\n : Path extends keyof Fields & string\n ? Fields[Path] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n }\n ? TCodecTypes[CId]['output']\n : unknown\n : never;\n\nexport type ResolveDotPathType<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n Path extends string,\n TCodecTypes extends Record<string, { output: unknown }> = ExtractMongoCodecTypes<TContract>,\n> = Path extends `${infer Head}.${infer Rest}`\n ? Head extends keyof MongoModelsMap<TContract>[ModelName]['fields'] & string\n ? MongoModelsMap<TContract>[ModelName]['fields'][Head] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: infer N extends string };\n }\n ? ResolveDotPathInFields<TContract, VOFields<TContract, N>, Rest, TCodecTypes>\n : never\n : never\n : never;\n\nexport type FieldAccessor<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n TCodecTypes extends Record<string, { output: unknown }> = ExtractMongoCodecTypes<TContract>,\n> = {\n readonly [K in ScalarFieldKeys<TContract, ModelName>]: FieldExpression<\n ResolveFieldType<TContract, ModelName, K, TCodecTypes>\n >;\n} & {\n readonly [K in ValueObjectFieldKeys<TContract, ModelName>]: FieldExpression<\n ResolveFieldType<TContract, ModelName, K, TCodecTypes>\n >;\n} & (<P extends DotPath<TContract, ModelName>>(\n path: P,\n ) => FieldExpression<ResolveDotPathType<TContract, ModelName, P, TCodecTypes>>);\n\n// ── Runtime implementation ───────────────────────────────────────────────────\n\n// Runtime expression has all methods; type-level gating happens via FieldExpression<T>\ninterface RuntimeFieldExpression extends NumericOps {\n set(value: unknown): FieldOperation;\n unset(): FieldOperation;\n push(value: unknown): FieldOperation;\n pull(match: unknown): FieldOperation;\n addToSet(value: unknown): FieldOperation;\n pop(end: 1 | -1): FieldOperation;\n}\n\nfunction createFieldExpression(fieldPath: string): RuntimeFieldExpression {\n return {\n set(value: unknown): FieldOperation {\n return { operator: '$set', field: fieldPath, value: new MongoParamRef(value) };\n },\n unset(): FieldOperation {\n return { operator: '$unset', field: fieldPath, value: new MongoParamRef('') };\n },\n inc(value: number): FieldOperation {\n return { operator: '$inc', field: fieldPath, value: new MongoParamRef(value) };\n },\n mul(value: number): FieldOperation {\n return { operator: '$mul', field: fieldPath, value: new MongoParamRef(value) };\n },\n push(value: unknown): FieldOperation {\n return { operator: '$push', field: fieldPath, value: new MongoParamRef(value) };\n },\n pull(match: unknown): FieldOperation {\n return { operator: '$pull', field: fieldPath, value: new MongoParamRef(match) };\n },\n addToSet(value: unknown): FieldOperation {\n return { operator: '$addToSet', field: fieldPath, value: new MongoParamRef(value) };\n },\n pop(end: 1 | -1): FieldOperation {\n return { operator: '$pop', field: fieldPath, value: new MongoParamRef(end) };\n },\n };\n}\n\nexport function createFieldAccessor<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n TCodecTypes extends Record<string, { output: unknown }> = ExtractMongoCodecTypes<TContract>,\n>(): FieldAccessor<TContract, ModelName, TCodecTypes> {\n return new Proxy((() => {}) as unknown as FieldAccessor<TContract, ModelName, TCodecTypes>, {\n get(_target, prop: string): RuntimeFieldExpression {\n return createFieldExpression(prop);\n },\n apply(_target, _thisArg, args: [string]): RuntimeFieldExpression {\n return createFieldExpression(args[0]);\n },\n });\n}\n\nexport function compileFieldOperations(\n ops: readonly FieldOperation[],\n wrapValue: (field: string, value: MongoValue, operator: UpdateOperator) => MongoValue,\n): Record<string, Record<string, MongoValue>> {\n const grouped: Record<string, Record<string, MongoValue>> = {};\n for (const op of ops) {\n let group = grouped[op.operator];\n if (!group) {\n group = {};\n grouped[op.operator] = group;\n }\n group[op.field] = wrapValue(op.field, op.value, op.operator);\n }\n return grouped;\n}\n","import {\n type StructuredError,\n type StructuredErrorOptions,\n structuredError,\n} from '@prisma-next/utils/structured-error';\n\ntype OrmSubcode =\n | 'MODEL_UNKNOWN'\n | 'RELATION_UNKNOWN'\n | 'WHERE_MISSING'\n | 'OPERATION_UNSUPPORTED'\n | 'INCLUDE_UNSUPPORTED'\n | 'FIELD_IMMUTABLE';\n\nexport type OrmCode = `ORM.${OrmSubcode}`;\n\nexport function ormError(\n code: OrmCode,\n message: string,\n options?: StructuredErrorOptions,\n): StructuredError {\n return structuredError(code, message, options);\n}\n","import {\n type ContractField,\n type ContractReferenceRelation,\n type ContractValueObject,\n domainModelsAtDefaultNamespace,\n domainValueObjectsAtDefaultNamespace,\n type PlanMeta,\n} from '@prisma-next/contract/types';\nimport { AsyncIterableResult } from '@prisma-next/framework-components/runtime';\nimport type {\n AnyMongoTypeMaps,\n MongoContract,\n MongoContractWithTypeMaps,\n MongoModelDefinition,\n MongoModelsMap,\n} from '@prisma-next/mongo-contract';\nimport type {\n AnyMongoCommand,\n MongoFilterExpr,\n MongoQueryPlan,\n} from '@prisma-next/mongo-query-ast/execution';\nimport {\n DeleteManyCommand,\n FindOneAndDeleteCommand,\n FindOneAndUpdateCommand,\n InsertManyCommand,\n InsertOneCommand,\n isMongoFilterExpr,\n MongoAndExpr,\n MongoFieldFilter,\n UpdateManyCommand,\n} from '@prisma-next/mongo-query-ast/execution';\nimport type { MongoValue } from '@prisma-next/mongo-value';\nimport { MongoParamRef } from '@prisma-next/mongo-value';\nimport { castAs } from '@prisma-next/utils/casts';\nimport { InternalError } from '@prisma-next/utils/internal-error';\nimport type { MongoIncludeExpr } from './collection-state';\nimport { emptyCollectionState, type MongoCollectionState } from './collection-state';\nimport { compileMongoQuery } from './compile';\nimport type { MongoQueryExecutor } from './executor';\nimport {\n compileFieldOperations,\n createFieldAccessor,\n type FieldAccessor,\n type FieldOperation,\n} from './field-accessor';\nimport { ormError } from './orm-errors';\nimport type {\n DefaultModelRow,\n IncludedRow,\n MongoIncludeSpec,\n MongoWhereFilter,\n NoIncludes,\n ReferenceRelationKeys,\n ResolvedCreateInput,\n VariantNames,\n} from './types';\n\ntype ModelFieldKeys<\n TContract extends MongoContract,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = keyof MongoModelsMap<TContract>[ModelName]['fields'] & string;\n\nexport interface MongoCollection<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n TIncludes extends MongoIncludeSpec<TContract, ModelName> = NoIncludes,\n TVariant extends string = never,\n> {\n /** Narrows to a specific variant, injecting a discriminator filter. */\n variant<V extends VariantNames<TContract, ModelName>>(\n variantName: V,\n ): MongoCollection<TContract, ModelName, TIncludes, V>;\n /** Appends equality filters from a plain object. Values are encoded through codecs. */\n where(\n filter: MongoWhereFilter<TContract, ModelName>,\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Appends a filter condition from a raw filter expression. */\n where(filter: MongoFilterExpr): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Restricts returned fields to the given subset. Returns a new immutable collection. */\n select(\n ...fields: ModelFieldKeys<TContract, ModelName>[]\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Adds a `$lookup` for a reference relation. Returns a new immutable collection. */\n include<K extends ReferenceRelationKeys<TContract, ModelName> & string>(\n relationName: K,\n ): MongoCollection<TContract, ModelName, TIncludes & Record<K, true>, TVariant>;\n /** Sets sort order. Returns a new immutable collection. */\n orderBy(\n spec: Partial<Record<ModelFieldKeys<TContract, ModelName>, 1 | -1>>,\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Limits the number of results. Returns a new immutable collection. */\n take(n: number): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Skips the first `n` results. Returns a new immutable collection. */\n skip(n: number): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Executes the query and returns all matching rows as an async iterable. */\n all(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Executes the query with limit 1. Returns the first matching row or `null`. */\n first(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;\n /** Returns the input data with the server-assigned `_id`. Does not re-read the stored document. */\n create(\n data: ResolvedCreateInput<TContract, ModelName, TVariant>,\n ): Promise<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Returns input rows with server-assigned `_id`s. Does not re-read stored documents. */\n createAll(\n data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Inserts multiple documents and returns the number inserted. */\n createCount(\n data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,\n ): Promise<number>;\n /** Updates one matching document via `findOneAndUpdate`. Returns the updated document or `null`. Requires `.where()`. */\n update(\n data: Partial<DefaultModelRow<TContract, ModelName>>,\n ): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;\n /** Updates one matching document using field operations from a callback. Requires `.where()`. */\n update(\n callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[],\n ): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;\n /** Non-atomic: captures matching `_id`s, updates, then re-reads by `_id`. Requires `.where()`. */\n updateAll(\n data: Partial<DefaultModelRow<TContract, ModelName>>,\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Updates all matching documents using field operations from a callback. Requires `.where()`. */\n updateAll(\n callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[],\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Updates all matching documents and returns the number modified. Requires `.where()`. */\n updateCount(data: Partial<DefaultModelRow<TContract, ModelName>>): Promise<number>;\n /** Updates all matching documents using field operations and returns the number modified. Requires `.where()`. */\n updateCount(\n callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[],\n ): Promise<number>;\n /** Deletes one matching document via `findOneAndDelete`. Returns the deleted document or `null`. Requires `.where()`. */\n delete(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;\n /** Non-atomic: reads matching docs then deletes them. Concurrent writes may cause stale results. Requires `.where()`. */\n deleteAll(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Deletes all matching documents and returns the number deleted. Requires `.where()`. */\n deleteCount(): Promise<number>;\n /**\n * On insert: `update` fields are applied via `$set`, remaining `create` fields via `$setOnInsert`.\n * This means `update` values take precedence over `create` for overlapping fields on insert.\n * Requires `.where()`.\n */\n upsert(input: {\n create: ResolvedCreateInput<TContract, ModelName, TVariant>;\n update: Partial<DefaultModelRow<TContract, ModelName>>;\n }): Promise<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Upsert using field operations callback for the update part. Requires `.where()`. */\n upsert(input: {\n create: ResolvedCreateInput<TContract, ModelName, TVariant>;\n update: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[];\n }): Promise<IncludedRow<TContract, ModelName, TIncludes>>;\n}\n\nfunction resolveCollectionName(model: MongoModelDefinition, modelName: string): string {\n return model.storage.collection ?? modelName;\n}\n\nclass MongoCollectionImpl<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n TIncludes extends MongoIncludeSpec<TContract, ModelName> = NoIncludes,\n TVariant extends string = never,\n> implements MongoCollection<TContract, ModelName, TIncludes, TVariant>\n{\n readonly #contract: TContract;\n readonly #modelName: ModelName;\n readonly #executor: MongoQueryExecutor;\n #collectionName: string;\n #state: MongoCollectionState;\n #variantName: string | undefined;\n\n constructor(contract: TContract, modelName: ModelName, executor: MongoQueryExecutor) {\n this.#contract = contract;\n this.#modelName = modelName;\n this.#executor = executor;\n const model = domainModelsAtDefaultNamespace(contract.domain)[\n modelName\n ] as MongoModelDefinition;\n this.#collectionName = resolveCollectionName(model, modelName);\n this.#state = emptyCollectionState();\n }\n\n variant<V extends VariantNames<TContract, ModelName>>(\n variantName: V,\n ): MongoCollection<TContract, ModelName, TIncludes, V> {\n const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName] as\n | MongoModelDefinition\n | undefined;\n if (!model?.discriminator || !model.variants) {\n // No polymorphism metadata on this model — return unchanged. Cast required\n // because TS cannot verify TVariant (the current variant) is assignable to V.\n return this as unknown as MongoCollection<TContract, ModelName, TIncludes, V>;\n }\n\n const variantEntry = model.variants[variantName as string];\n if (!variantEntry) {\n // Unknown variant name at runtime — return unchanged. Same cast rationale.\n return this as unknown as MongoCollection<TContract, ModelName, TIncludes, V>;\n }\n\n const filter = MongoFieldFilter.eq(\n model.discriminator.field,\n new MongoParamRef(variantEntry.value),\n );\n return this.#cloneWithVariant<V>(\n { filters: [...this.#state.filters, filter] },\n variantName as string,\n );\n }\n\n where(\n filter: MongoWhereFilter<TContract, ModelName> | MongoFilterExpr,\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n if (isMongoFilterExpr(filter)) {\n return this.#clone({ filters: [...this.#state.filters, filter] });\n }\n const compiled = this.#compileWhereObject(filter as Record<string, unknown>);\n return this.#clone({ filters: [...this.#state.filters, ...compiled] });\n }\n\n select(\n ...fields: ModelFieldKeys<TContract, ModelName>[]\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n return this.#clone({ selectedFields: [...(this.#state.selectedFields ?? []), ...fields] });\n }\n\n include<K extends ReferenceRelationKeys<TContract, ModelName> & string>(\n relationName: K,\n ): MongoCollection<TContract, ModelName, TIncludes & Record<K, true>, TVariant> {\n const model = domainModelsAtDefaultNamespace(this.#contract.domain)[\n this.#modelName\n ] as MongoModelDefinition;\n const relation = model.relations?.[relationName];\n if (!relation) {\n throw ormError(\n 'ORM.RELATION_UNKNOWN',\n `Unknown relation \"${relationName}\" on model \"${this.#modelName}\"`,\n { meta: { model: this.#modelName, relation: relationName } },\n );\n }\n\n if (!('on' in relation)) {\n throw ormError(\n 'ORM.INCLUDE_UNSUPPORTED',\n `Relation \"${relationName}\" is an embed relation — only reference relations can be included`,\n { meta: { model: this.#modelName, relation: relationName } },\n );\n }\n\n const ref = relation as ContractReferenceRelation;\n const localField = ref.on.localFields[0];\n const foreignField = ref.on.targetFields[0];\n if (\n !localField ||\n !foreignField ||\n ref.on.localFields.length !== 1 ||\n ref.on.targetFields.length !== 1\n ) {\n throw ormError(\n 'ORM.INCLUDE_UNSUPPORTED',\n `Compound references are not yet supported: relation \"${relationName}\"`,\n { meta: { model: this.#modelName, relation: relationName } },\n );\n }\n\n const targetModelName = ref.to.model;\n const targetModel = castAs<MongoModelDefinition | undefined>(\n domainModelsAtDefaultNamespace(this.#contract.domain)[targetModelName],\n );\n if (!targetModel) {\n throw new InternalError(\n `Target model \"${targetModelName}\" not found for relation \"${relationName}\"`,\n );\n }\n\n const includeExpr: MongoIncludeExpr = {\n relationName,\n from: resolveCollectionName(targetModel, targetModelName),\n localField,\n foreignField,\n cardinality: ref.cardinality,\n };\n\n return this.#clone({\n includes: [...this.#state.includes, includeExpr],\n }) as unknown as MongoCollectionImpl<\n TContract,\n ModelName,\n TIncludes & Record<K, true>,\n TVariant\n >;\n }\n\n orderBy(\n spec: Partial<Record<ModelFieldKeys<TContract, ModelName>, 1 | -1>>,\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n const merged = { ...this.#state.orderBy, ...(spec as Readonly<Record<string, 1 | -1>>) };\n return this.#clone({ orderBy: merged });\n }\n\n take(n: number): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n return this.#clone({ limit: n });\n }\n\n skip(n: number): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n return this.#clone({ offset: n });\n }\n\n all(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n return this.#execute();\n }\n\n async first(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null> {\n const limited = this.#clone({ limit: 1 });\n const result = limited.#execute();\n for await (const row of result) {\n return row;\n }\n return null;\n }\n\n async create(\n data: ResolvedCreateInput<TContract, ModelName, TVariant>,\n ): Promise<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#rejectIncludes('create');\n const normalized = this.#injectDiscriminator(\n this.#stripUndefined(data as Record<string, unknown>),\n );\n const document = this.#toDocument(normalized);\n const command = new InsertOneCommand(this.#collectionName, document);\n const results = await this.#drainPlan(command);\n const insertedId = (results[0] as { insertedId: unknown }).insertedId;\n return { _id: insertedId, ...normalized } as unknown as IncludedRow<\n TContract,\n ModelName,\n TIncludes\n >;\n }\n\n createAll(\n data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#rejectIncludes('createAll');\n const self = this;\n async function* gen(): AsyncGenerator<IncludedRow<TContract, ModelName, TIncludes>> {\n const normalizedRows = data.map((d) =>\n self.#injectDiscriminator(self.#stripUndefined(d as Record<string, unknown>)),\n );\n const documents = normalizedRows.map((d) => self.#toDocument(d));\n const command = new InsertManyCommand(self.#collectionName, documents);\n const results = await self.#drainPlan(command);\n const insertedIds = (results[0] as { insertedIds: readonly unknown[] }).insertedIds;\n for (let i = 0; i < normalizedRows.length; i++) {\n yield { _id: insertedIds[i], ...normalizedRows[i] } as unknown as IncludedRow<\n TContract,\n ModelName,\n TIncludes\n >;\n }\n }\n return new AsyncIterableResult(gen());\n }\n\n async createCount(\n data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,\n ): Promise<number> {\n this.#rejectIncludes('createCount');\n const documents = data.map((d) =>\n this.#toDocument(this.#injectDiscriminator(d as Record<string, unknown>)),\n );\n const command = new InsertManyCommand(this.#collectionName, documents);\n const results = await this.#drainPlan(command);\n return (results[0] as { insertedCount: number }).insertedCount;\n }\n\n async update(\n dataOrCallback:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]),\n ): Promise<IncludedRow<TContract, ModelName, TIncludes> | null> {\n this.#requireFilters('update');\n this.#rejectWindowing('update');\n this.#rejectIncludes('update');\n const filter = this.#mergeFilters();\n const updateDoc = this.#resolveUpdateDoc(dataOrCallback);\n const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, false);\n const results = await this.#drainPlan(command);\n return (results[0] as IncludedRow<TContract, ModelName, TIncludes>) ?? null;\n }\n\n updateAll(\n dataOrCallback:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]),\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#requireFilters('updateAll');\n this.#rejectWindowing('updateAll');\n const self = this;\n async function* gen(): AsyncGenerator<IncludedRow<TContract, ModelName, TIncludes>> {\n const ids = await self.#readMatchingIds();\n if (ids.length === 0) return;\n\n const filter = self.#mergeFilters();\n const updateDoc = self.#resolveUpdateDoc(dataOrCallback);\n const command = new UpdateManyCommand(self.#collectionName, filter, updateDoc);\n await self.#drainPlan(command);\n\n const idFilter = MongoFieldFilter.in(\n '_id',\n ids.map((id) => new MongoParamRef(id)),\n );\n yield* self.#clone({ filters: [idFilter] }).#execute();\n }\n return new AsyncIterableResult(gen());\n }\n\n async updateCount(\n dataOrCallback:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]),\n ): Promise<number> {\n this.#requireFilters('updateCount');\n this.#rejectWindowing('updateCount');\n this.#rejectIncludes('updateCount');\n const filter = this.#mergeFilters();\n const updateDoc = this.#resolveUpdateDoc(dataOrCallback);\n const command = new UpdateManyCommand(this.#collectionName, filter, updateDoc);\n const results = await this.#drainPlan(command);\n return (results[0] as { modifiedCount: number }).modifiedCount;\n }\n\n async delete(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null> {\n this.#requireFilters('delete');\n this.#rejectWindowing('delete');\n this.#rejectIncludes('delete');\n const filter = this.#mergeFilters();\n const command = new FindOneAndDeleteCommand(this.#collectionName, filter);\n const results = await this.#drainPlan(command);\n return (results[0] as IncludedRow<TContract, ModelName, TIncludes>) ?? null;\n }\n\n deleteAll(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#requireFilters('deleteAll');\n this.#rejectWindowing('deleteAll');\n const self = this;\n async function* gen(): AsyncGenerator<IncludedRow<TContract, ModelName, TIncludes>> {\n const docs: IncludedRow<TContract, ModelName, TIncludes>[] = [];\n for await (const row of self.#execute()) {\n docs.push(row);\n }\n const filter = self.#mergeFilters();\n const command = new DeleteManyCommand(self.#collectionName, filter);\n await self.#drainPlan(command);\n yield* docs;\n }\n return new AsyncIterableResult(gen());\n }\n\n async deleteCount(): Promise<number> {\n this.#requireFilters('deleteCount');\n this.#rejectWindowing('deleteCount');\n this.#rejectIncludes('deleteCount');\n const filter = this.#mergeFilters();\n const command = new DeleteManyCommand(this.#collectionName, filter);\n const results = await this.#drainPlan(command);\n return (results[0] as { deletedCount: number }).deletedCount;\n }\n\n async upsert(input: {\n create: ResolvedCreateInput<TContract, ModelName, TVariant>;\n update:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]);\n }): Promise<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#requireFilters('upsert');\n this.#rejectWindowing('upsert');\n this.#rejectIncludes('upsert');\n const filter = this.#mergeFilters();\n\n const allCreateFields = this.#toDocument(\n this.#injectDiscriminator(input.create as Record<string, unknown>),\n );\n\n let updateDoc: Record<string, Record<string, MongoValue>>;\n if (typeof input.update === 'function') {\n const accessor = createFieldAccessor<TContract, ModelName>();\n const ops = input.update(accessor);\n const idOp = ops.find((op) => op.field === '_id');\n if (idOp) {\n throw ormError('ORM.FIELD_IMMUTABLE', 'Mutation payloads cannot modify `_id`', {\n meta: { field: '_id' },\n });\n }\n const dotPathOp = ops.find((op) => op.field.includes('.'));\n if (dotPathOp) {\n throw ormError(\n 'ORM.OPERATION_UNSUPPORTED',\n `upsert() does not support dot-path field operations (found \"${dotPathOp.field}\"). ` +\n 'Dot-path updates conflict with $setOnInsert on the insert path, producing incomplete documents. ' +\n 'Use top-level field operations instead.',\n { meta: { method: 'upsert', field: dotPathOp.field } },\n );\n }\n updateDoc = compileFieldOperations(ops, (field, value, operator) =>\n this.#wrapFieldOpValue(field, value, operator),\n );\n } else {\n const setFields = this.#toSetFields(input.update as Record<string, unknown>);\n updateDoc = {};\n if (Object.keys(setFields).length > 0) {\n updateDoc['$set'] = setFields;\n }\n }\n\n const updatedFields = new Set<string>();\n for (const operatorGroup of Object.values(updateDoc)) {\n for (const fieldPath of Object.keys(operatorGroup)) {\n updatedFields.add(fieldPath.split('.')[0] ?? fieldPath);\n }\n }\n const insertOnlyFields: Record<string, MongoValue> = {};\n for (const [key, value] of Object.entries(allCreateFields)) {\n if (!updatedFields.has(key)) {\n insertOnlyFields[key] = value;\n }\n }\n if (Object.keys(insertOnlyFields).length > 0) {\n updateDoc['$setOnInsert'] = insertOnlyFields;\n }\n\n const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, true);\n const results = await this.#drainPlan(command);\n return results[0] as IncludedRow<TContract, ModelName, TIncludes>;\n }\n\n async #readMatchingIds(): Promise<unknown[]> {\n const idQuery = this.#clone({\n includes: [],\n selectedFields: ['_id'],\n orderBy: undefined,\n limit: undefined,\n offset: undefined,\n });\n const ids: unknown[] = [];\n // Strip resultShape so the runtime yields wire-level _id values (e.g. ObjectId)\n // rather than decoded hex strings. The follow-up $in filter in updateAll wraps\n // these in bare MongoParamRefs with no codecId; round-tripping a decoded string\n // back through the adapter would require attaching the field's codecId, which\n // we don't do here. Do not \"tidy\" the destructure away — the prefetch+modify+\n // re-read flow depends on it.\n const { resultShape: _rs, ...planWithoutShape } = idQuery.#compile();\n for await (const row of this.#executor.execute(planWithoutShape)) {\n ids.push((row as Record<string, unknown>)['_id']);\n }\n return ids;\n }\n\n #execute(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n const plan = this.#compile();\n return this.#executor.execute(plan);\n }\n\n #compile(): MongoQueryPlan<IncludedRow<TContract, ModelName, TIncludes>> {\n const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName] as\n | MongoModelDefinition\n | undefined;\n if (!model) {\n throw ormError('ORM.MODEL_UNKNOWN', `Unknown model: \"${this.#modelName}\".`, {\n meta: { model: this.#modelName },\n });\n }\n return compileMongoQuery<IncludedRow<TContract, ModelName, TIncludes>>(\n this.#collectionName,\n this.#state,\n this.#contract.storage.storageHash,\n model,\n );\n }\n\n #wrapCommand(command: AnyMongoCommand): MongoQueryPlan {\n return { collection: this.#collectionName, command, meta: this.#planMeta() };\n }\n\n async #drainPlan(command: AnyMongoCommand): Promise<unknown[]> {\n const plan = this.#wrapCommand(command);\n const result = this.#executor.execute(plan);\n const rows: unknown[] = [];\n for await (const row of result) {\n rows.push(row);\n }\n return rows;\n }\n\n #modelFields(): Record<string, ContractField> {\n const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName] as\n | MongoModelDefinition\n | undefined;\n return model?.fields ?? {};\n }\n\n #compileWhereObject(data: Record<string, unknown>): MongoFilterExpr[] {\n const fields = this.#modelFields();\n const filters: MongoFilterExpr[] = [];\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const wrapped = this.#wrapFieldValue(value, fields[key]);\n filters.push(MongoFieldFilter.eq(key, wrapped));\n }\n return filters;\n }\n\n #wrapFieldValue(value: unknown, field: ContractField | undefined): MongoValue {\n if (field === undefined) return new MongoParamRef(value);\n\n if (field.type.kind === 'scalar') {\n return new MongoParamRef(value, { codecId: field.type.codecId });\n }\n\n if (field.type.kind === 'valueObject') {\n const voName = field.type.name;\n const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];\n if (!voDef || value === null) return new MongoParamRef(value);\n\n if (field.many && Array.isArray(value)) {\n return value.map((item) =>\n this.#wrapValueObject(item as Record<string, unknown>, voDef),\n ) as unknown as MongoValue;\n }\n return this.#wrapValueObject(value as Record<string, unknown>, voDef);\n }\n\n return new MongoParamRef(value);\n }\n\n #wrapValueObject(\n data: Record<string, unknown>,\n voDef: ContractValueObject,\n ): Record<string, MongoValue> {\n const doc: Record<string, MongoValue> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const fieldDef = voDef.fields[key];\n doc[key] = this.#wrapFieldValue(value, fieldDef);\n }\n return doc;\n }\n\n #toDocument(data: Record<string, unknown>): Record<string, MongoValue> {\n const fields = this.#modelFields();\n const doc: Record<string, MongoValue> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value !== undefined) {\n doc[key] = this.#wrapFieldValue(value, fields[key]);\n }\n }\n return doc;\n }\n\n #toSetFields(data: Record<string, unknown>): Record<string, MongoValue> {\n const fields = this.#modelFields();\n const result: Record<string, MongoValue> = {};\n for (const [key, value] of Object.entries(data)) {\n if (key === '_id' && value !== undefined) {\n throw ormError('ORM.FIELD_IMMUTABLE', 'Mutation payloads cannot modify `_id`', {\n meta: { field: '_id' },\n });\n }\n if (value !== undefined) {\n result[key] = this.#wrapFieldValue(value, fields[key]);\n }\n }\n return result;\n }\n\n #stripUndefined(data: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n }\n\n #toUpdateDocument(data: Record<string, unknown>): Record<string, Record<string, MongoValue>> {\n return { $set: this.#toSetFields(data) };\n }\n\n #resolveUpdateDoc(\n dataOrCallback:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]),\n ): Record<string, Record<string, MongoValue>> {\n if (typeof dataOrCallback === 'function') {\n const accessor = createFieldAccessor<TContract, ModelName>();\n const ops = dataOrCallback(accessor);\n const idOp = ops.find((op) => op.field === '_id');\n if (idOp) {\n throw ormError('ORM.FIELD_IMMUTABLE', 'Mutation payloads cannot modify `_id`', {\n meta: { field: '_id' },\n });\n }\n if (ops.length === 0) {\n return { $set: {} };\n }\n return compileFieldOperations(ops, (field, value, operator) =>\n this.#wrapFieldOpValue(field, value, operator),\n );\n }\n return this.#toUpdateDocument(dataOrCallback as Record<string, unknown>);\n }\n\n #wrapFieldOpValue(field: string, value: MongoValue, operator?: string): MongoValue {\n if (operator === '$unset') return value;\n\n const topLevelField = field.split('.')[0] ?? field;\n const fields = this.#modelFields();\n const contractField = fields[topLevelField];\n if (!contractField) return value;\n\n if (field.includes('.')) {\n return this.#wrapDotPathValue(field, value);\n }\n\n if (value instanceof MongoParamRef && contractField.type.kind === 'scalar') {\n return new MongoParamRef(value.value, { codecId: contractField.type.codecId });\n }\n\n if (contractField.type.kind === 'valueObject' && value instanceof MongoParamRef) {\n const raw = value.value;\n if (typeof raw === 'object' && raw !== null && !Array.isArray(raw)) {\n const voName = contractField.type.name;\n const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];\n if (voDef) {\n return this.#wrapValueObject(raw as Record<string, unknown>, voDef);\n }\n }\n }\n\n return value;\n }\n\n #wrapDotPathValue(dotPath: string, value: MongoValue): MongoValue {\n const parts = dotPath.split('.');\n const fields = this.#modelFields();\n let currentField: ContractField | undefined = parts[0] ? fields[parts[0]] : undefined;\n\n for (let i = 1; i < parts.length; i++) {\n if (currentField?.type.kind !== 'valueObject') return value;\n const voName = currentField.type.name;\n const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];\n if (!voDef) return value;\n const partKey = parts[i];\n currentField = partKey ? voDef.fields[partKey] : undefined;\n }\n\n if (currentField?.type.kind === 'scalar' && value instanceof MongoParamRef) {\n return new MongoParamRef(value.value, { codecId: currentField.type.codecId });\n }\n\n if (currentField?.type.kind === 'valueObject' && value instanceof MongoParamRef) {\n const raw = value.value;\n if (typeof raw === 'object' && raw !== null && !Array.isArray(raw)) {\n const voName = currentField.type.name;\n const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];\n if (voDef) {\n return this.#wrapValueObject(raw as Record<string, unknown>, voDef);\n }\n }\n }\n\n return value;\n }\n\n #mergeFilters(): MongoFilterExpr {\n const [single] = this.#state.filters;\n if (this.#state.filters.length === 1 && single) {\n return single;\n }\n return MongoAndExpr.of([...this.#state.filters]);\n }\n\n #requireFilters(methodName: string): void {\n if (this.#state.filters.length === 0) {\n throw ormError(\n 'ORM.WHERE_MISSING',\n `${methodName}() requires a .where() filter. Call .where() before .${methodName}()`,\n { meta: { method: methodName } },\n );\n }\n }\n\n #rejectWindowing(methodName: string): void {\n if (\n this.#state.orderBy !== undefined ||\n this.#state.limit !== undefined ||\n this.#state.offset !== undefined\n ) {\n throw ormError(\n 'ORM.OPERATION_UNSUPPORTED',\n `${methodName}() does not support orderBy/skip/take. Remove windowing before calling .${methodName}()`,\n { meta: { method: methodName, reason: 'windowing' } },\n );\n }\n }\n\n #rejectIncludes(methodName: string): void {\n if (this.#state.includes.length > 0) {\n throw ormError(\n 'ORM.OPERATION_UNSUPPORTED',\n `${methodName}() does not support .include(). Remove includes before calling .${methodName}()`,\n { meta: { method: methodName, reason: 'includes' } },\n );\n }\n }\n\n #planMeta(): PlanMeta {\n return {\n target: 'mongo',\n storageHash: this.#contract.storage.storageHash,\n lane: 'mongo-orm',\n };\n }\n\n #injectDiscriminator(data: Record<string, unknown>): Record<string, unknown> {\n if (!this.#variantName) return data;\n const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName] as\n | MongoModelDefinition\n | undefined;\n if (!model?.discriminator || !model.variants) return data;\n const variantEntry = model.variants[this.#variantName];\n if (!variantEntry) return data;\n return { ...data, [model.discriminator.field]: variantEntry.value };\n }\n\n #clone(\n overrides: Partial<MongoCollectionState>,\n ): MongoCollectionImpl<TContract, ModelName, TIncludes, TVariant> {\n const instance = new MongoCollectionImpl<TContract, ModelName, TIncludes, TVariant>(\n this.#contract,\n this.#modelName,\n this.#executor,\n );\n instance.#state = { ...this.#state, ...overrides };\n instance.#collectionName = this.#collectionName;\n instance.#variantName = this.#variantName;\n return instance;\n }\n\n #cloneWithVariant<VNew extends string>(\n overrides: Partial<MongoCollectionState>,\n variantName: string,\n ): MongoCollectionImpl<TContract, ModelName, TIncludes, VNew> {\n const instance = new MongoCollectionImpl<TContract, ModelName, TIncludes, VNew>(\n this.#contract,\n this.#modelName,\n this.#executor,\n );\n instance.#state = { ...this.#state, ...overrides };\n instance.#collectionName = this.#collectionName;\n instance.#variantName = variantName;\n return instance;\n }\n}\n\nexport function createMongoCollection<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n>(\n contract: TContract,\n modelName: ModelName,\n executor: MongoQueryExecutor,\n): MongoCollection<TContract, ModelName> {\n return new MongoCollectionImpl(contract, modelName, executor);\n}\n","import type {\n AnyMongoTypeMaps,\n MongoContract,\n MongoContractWithTypeMaps,\n RootModelName,\n} from '@prisma-next/mongo-contract';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport type { MongoCollection } from './collection';\nimport { createMongoCollection } from './collection';\nimport type { MongoQueryExecutor } from './executor';\n\nexport interface MongoOrmOptions<TContract extends MongoContract> {\n readonly contract: TContract;\n readonly executor: MongoQueryExecutor;\n}\n\nexport type MongoOrmClient<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n> = {\n readonly [K in keyof TContract['roots'] & string]: MongoCollection<\n TContract,\n RootModelName<TContract, K>\n >;\n};\n\nexport function mongoOrm<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n>(options: MongoOrmOptions<TContract>): MongoOrmClient<TContract> {\n const { contract, executor } = options;\n const client: Record<string, unknown> = {};\n\n for (const [rootName, rootRef] of Object.entries(contract.roots)) {\n client[rootName] = createMongoCollection(\n contract,\n blindCast<\n RootModelName<TContract, typeof rootName & keyof TContract['roots'] & string>,\n 'roots entries are CrossReferences; rootRef.model is a valid RootModelName for this contract'\n >(rootRef.model),\n executor,\n );\n }\n\n return client as MongoOrmClient<TContract>;\n}\n","import type { PlanMeta } from '@prisma-next/contract/types';\nimport type { MongoQueryPlan } from '@prisma-next/mongo-query-ast/execution';\nimport {\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 type { Document } from '@prisma-next/mongo-value';\n\ninterface Buildable<Row = unknown> {\n build(): MongoQueryPlan<Row>;\n}\n\nexport interface RawMongoCollection {\n aggregate<Row = Record<string, unknown>>(pipeline: ReadonlyArray<Document>): Buildable<Row>;\n\n insertOne(document: Document): Buildable;\n insertMany(documents: ReadonlyArray<Document>): Buildable;\n\n updateOne(filter: Document, update: Document | ReadonlyArray<Document>): Buildable;\n\n updateMany(filter: Document, update: Document | ReadonlyArray<Document>): Buildable;\n\n deleteOne(filter: Document): Buildable;\n deleteMany(filter: Document): Buildable;\n\n findOneAndUpdate(\n filter: Document,\n update: Document | ReadonlyArray<Document>,\n options?: { upsert?: boolean },\n ): Buildable;\n\n findOneAndDelete(filter: Document): Buildable;\n}\n\nexport function createRawMongoCollection(\n collectionName: string,\n meta: PlanMeta,\n): RawMongoCollection {\n function buildable<Row>(command: MongoQueryPlan['command']): Buildable<Row> {\n return {\n build: () => ({ collection: collectionName, command, meta }),\n };\n }\n\n return {\n aggregate<Row = Record<string, unknown>>(pipeline: ReadonlyArray<Document>) {\n return buildable<Row>(new RawAggregateCommand(collectionName, pipeline));\n },\n\n insertOne(document: Document) {\n return buildable(new RawInsertOneCommand(collectionName, document));\n },\n\n insertMany(documents: ReadonlyArray<Document>) {\n return buildable(new RawInsertManyCommand(collectionName, documents));\n },\n\n updateOne(filter: Document, update: Document | ReadonlyArray<Document>) {\n return buildable(new RawUpdateOneCommand(collectionName, filter, update));\n },\n\n updateMany(filter: Document, update: Document | ReadonlyArray<Document>) {\n return buildable(new RawUpdateManyCommand(collectionName, filter, update));\n },\n\n deleteOne(filter: Document) {\n return buildable(new RawDeleteOneCommand(collectionName, filter));\n },\n\n deleteMany(filter: Document) {\n return buildable(new RawDeleteManyCommand(collectionName, filter));\n },\n\n findOneAndUpdate(\n filter: Document,\n update: Document | ReadonlyArray<Document>,\n options?: { upsert?: boolean },\n ) {\n return buildable(\n new RawFindOneAndUpdateCommand(collectionName, filter, update, options?.upsert ?? false),\n );\n },\n\n findOneAndDelete(filter: Document) {\n return buildable(new RawFindOneAndDeleteCommand(collectionName, filter));\n },\n };\n}\n","import { domainModelsAtDefaultNamespace, type PlanMeta } from '@prisma-next/contract/types';\nimport type { MongoContract, MongoModelDefinition } from '@prisma-next/mongo-contract';\nimport { ormError } from './orm-errors';\nimport { createRawMongoCollection, type RawMongoCollection } from './raw-collection';\n\nexport interface MongoRawClient<TContract extends MongoContract> {\n collection<K extends keyof TContract['roots'] & string>(rootName: K): RawMongoCollection;\n}\n\nexport function mongoRaw<TContract extends MongoContract>(options: {\n contract: TContract;\n}): MongoRawClient<TContract> {\n const { contract } = options;\n\n return {\n collection<K extends keyof TContract['roots'] & string>(rootName: K): RawMongoCollection {\n const modelName = contract.roots[rootName]?.model;\n const models = domainModelsAtDefaultNamespace(contract.domain);\n if (!modelName || !Object.hasOwn(models, modelName)) {\n throw ormError(\n 'ORM.MODEL_UNKNOWN',\n `Unknown model \"${modelName ?? ''}\" for root \"${rootName}\"`,\n { meta: { model: modelName ?? '', root: rootName } },\n );\n }\n const model = models[modelName] as MongoModelDefinition;\n const collectionName = model.storage.collection ?? modelName;\n\n const meta: PlanMeta = {\n target: 'mongo',\n storageHash: contract.storage.storageHash,\n lane: 'mongo-raw',\n };\n\n return createRawMongoCollection(collectionName, meta);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["#contract","#modelName","#executor","#collectionName","#state","#cloneWithVariant","#clone","#compileWhereObject","#execute","#rejectIncludes","#injectDiscriminator","#stripUndefined","#toDocument","#drainPlan","#requireFilters","#rejectWindowing","#mergeFilters","#resolveUpdateDoc","#readMatchingIds","#wrapFieldOpValue","#toSetFields","#compile","#planMeta","#wrapCommand","#modelFields","#wrapFieldValue","#wrapValueObject","#toUpdateDocument","#wrapDotPathValue","#variantName"],"sources":["../src/collection-state.ts","../src/compile.ts","../src/field-accessor.ts","../src/orm-errors.ts","../src/collection.ts","../src/mongo-orm.ts","../src/raw-collection.ts","../src/mongo-raw.ts"],"sourcesContent":["import type { MongoFilterExpr } from '@prisma-next/mongo-query-ast/execution';\n\nexport interface MongoIncludeExpr {\n readonly relationName: string;\n readonly from: string;\n readonly localField: string;\n readonly foreignField: string;\n readonly cardinality: '1:1' | 'N:1' | '1:N' | 'N:M';\n}\n\nexport interface MongoCollectionState {\n readonly filters: readonly MongoFilterExpr[];\n readonly includes: readonly MongoIncludeExpr[];\n readonly orderBy: Readonly<Record<string, 1 | -1>> | undefined;\n readonly selectedFields: readonly string[] | undefined;\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n}\n\nexport function emptyCollectionState(): MongoCollectionState {\n return {\n filters: [],\n includes: [],\n orderBy: undefined,\n selectedFields: undefined,\n limit: undefined,\n offset: undefined,\n };\n}\n","import type { PlanMeta } from '@prisma-next/contract/types';\nimport type { MongoModelDefinition } from '@prisma-next/mongo-contract';\nimport type { MongoPipelineStage, MongoQueryPlan } from '@prisma-next/mongo-query-ast/execution';\nimport {\n AggregateCommand,\n MongoAndExpr,\n MongoLimitStage,\n MongoLookupStage,\n MongoMatchStage,\n MongoProjectStage,\n MongoSkipStage,\n MongoSortStage,\n MongoUnwindStage,\n} from '@prisma-next/mongo-query-ast/execution';\nimport { contractModelToMongoResultShape } from '@prisma-next/mongo-query-builder';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { MongoCollectionState, MongoIncludeExpr } from './collection-state';\n\nfunction compileIncludes(includes: readonly MongoIncludeExpr[]): MongoPipelineStage[] {\n const stages: MongoPipelineStage[] = [];\n\n for (const inc of includes) {\n stages.push(\n new MongoLookupStage({\n from: inc.from,\n localField: inc.localField,\n foreignField: inc.foreignField,\n as: inc.relationName,\n }),\n );\n\n if (inc.cardinality === 'N:1' || inc.cardinality === '1:1') {\n stages.push(new MongoUnwindStage(`$${inc.relationName}`, true));\n }\n }\n\n return stages;\n}\n\nexport function compileMongoQuery<Row = unknown>(\n collection: string,\n state: MongoCollectionState,\n storageHash: string,\n model: MongoModelDefinition,\n): MongoQueryPlan<Row> {\n const stages: MongoPipelineStage[] = [];\n\n const singleFilter = state.filters.length === 1 ? state.filters[0] : undefined;\n if (singleFilter) {\n stages.push(new MongoMatchStage(singleFilter));\n } else if (state.filters.length > 1) {\n stages.push(new MongoMatchStage(MongoAndExpr.of([...state.filters])));\n }\n\n if (state.includes.length > 0) {\n stages.push(...compileIncludes(state.includes));\n }\n\n if (state.orderBy) {\n stages.push(new MongoSortStage(state.orderBy));\n }\n\n if (state.offset !== undefined) {\n stages.push(new MongoSkipStage(state.offset));\n }\n\n if (state.limit !== undefined) {\n stages.push(new MongoLimitStage(state.limit));\n }\n\n if (state.selectedFields && state.selectedFields.length > 0) {\n const projection: Record<string, 0 | 1> = {};\n for (const field of state.selectedFields) {\n projection[field] = 1;\n }\n if (!Object.hasOwn(projection, '_id')) {\n projection['_id'] = 0;\n }\n stages.push(new MongoProjectStage(projection));\n }\n\n const meta: PlanMeta = {\n target: 'mongo',\n storageHash,\n lane: 'mongo-orm',\n };\n const command = new AggregateCommand(collection, stages);\n\n const selection =\n state.selectedFields !== undefined && state.selectedFields.length > 0\n ? state.selectedFields\n : undefined;\n const includeRelationNames =\n state.includes.length > 0 ? state.includes.map((inc) => inc.relationName) : undefined;\n const resultShape = contractModelToMongoResultShape(model, {\n ...ifDefined('selection', selection),\n ...ifDefined('includeRelationNames', includeRelationNames),\n });\n\n return { collection, command, meta, resultShape };\n}\n","import type {\n ContractField,\n ContractValueObject,\n ContractValueObjectDefinitions,\n} from '@prisma-next/contract/types';\nimport type {\n AnyMongoTypeMaps,\n ExtractMongoCodecTypes,\n InferModelRow,\n MongoContract,\n MongoContractWithTypeMaps,\n MongoModelsMap,\n} from '@prisma-next/mongo-contract';\nimport type { MongoValue } from '@prisma-next/mongo-value';\nimport { MongoParamRef } from '@prisma-next/mongo-value';\n\n// ── Runtime types ────────────────────────────────────────────────────────────\n\nexport type UpdateOperator =\n | '$set'\n | '$unset'\n | '$inc'\n | '$mul'\n | '$push'\n | '$pull'\n | '$addToSet'\n | '$pop';\n\nexport interface FieldOperation {\n readonly operator: UpdateOperator;\n readonly field: string;\n readonly value: MongoValue;\n}\n\n// ── Compile-time types ───────────────────────────────────────────────────────\n\ntype ScalarFieldKeys<\n TContract extends MongoContract,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = {\n [K in keyof MongoModelsMap<TContract>[ModelName]['fields'] &\n string]: MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: { readonly kind: 'scalar' };\n }\n ? K\n : never;\n}[keyof MongoModelsMap<TContract>[ModelName]['fields'] & string];\n\ntype ValueObjectFieldKeys<\n TContract extends MongoContract,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = {\n [K in keyof MongoModelsMap<TContract>[ModelName]['fields'] &\n string]: MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: string };\n }\n ? K\n : never;\n}[keyof MongoModelsMap<TContract>[ModelName]['fields'] & string];\n\ntype ResolvedModelRow<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = InferModelRow<TContract, ModelName>;\n\ntype ResolveFieldType<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n K extends keyof MongoModelsMap<TContract>[ModelName]['fields'] & string,\n TCodecTypes extends Record<string, { output: unknown }> = ExtractMongoCodecTypes<TContract>,\n> = MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n readonly many: true;\n readonly nullable: true;\n}\n ? readonly TCodecTypes[CId]['output'][] | null\n : MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n readonly many: true;\n }\n ? readonly TCodecTypes[CId]['output'][]\n : MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n readonly nullable: true;\n }\n ? TCodecTypes[CId]['output'] | null\n : MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n }\n ? TCodecTypes[CId]['output']\n : K extends keyof ResolvedModelRow<TContract, ModelName>\n ? ResolvedModelRow<TContract, ModelName>[K]\n : unknown;\n\ntype NumericOps = {\n inc(value: number): FieldOperation;\n mul(value: number): FieldOperation;\n};\n\nexport type FieldExpression<T = unknown> = {\n set(value: T): FieldOperation;\n unset(): FieldOperation;\n push(value: T extends readonly (infer E)[] ? E : unknown): FieldOperation;\n pull(match: T extends readonly (infer E)[] ? E | Partial<E> : unknown): FieldOperation;\n addToSet(value: T extends readonly (infer E)[] ? E : unknown): FieldOperation;\n pop(end: 1 | -1): FieldOperation;\n} & (T extends number ? NumericOps : unknown);\n\ntype HasValueObjects = MongoContract;\n\ntype MergedContractValueObjects<TContract extends HasValueObjects> =\n ContractValueObjectDefinitions<TContract> &\n (TContract extends { readonly valueObjects?: infer VOs }\n ? VOs extends Record<string, ContractValueObject>\n ? VOs\n : Record<string, never>\n : Record<string, never>);\n\ntype VOFields<\n TContract extends HasValueObjects,\n VOName extends string,\n> = VOName extends keyof MergedContractValueObjects<TContract>\n ? MergedContractValueObjects<TContract>[VOName] extends {\n readonly fields: infer F extends Record<string, ContractField>;\n }\n ? F\n : never\n : never;\n\ntype VOScalarFieldKeys<Fields extends Record<string, ContractField>> = {\n [K in keyof Fields & string]: Fields[K] extends { readonly type: { readonly kind: 'scalar' } }\n ? K\n : never;\n}[keyof Fields & string];\n\ntype VOValueObjectFieldKeys<Fields extends Record<string, ContractField>> = {\n [K in keyof Fields & string]: Fields[K] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: string };\n }\n ? K\n : never;\n}[keyof Fields & string];\n\ntype VODotPaths<\n TContract extends HasValueObjects,\n Fields extends Record<string, ContractField>,\n Prefix extends string,\n> =\n | { [K in VOScalarFieldKeys<Fields>]: `${Prefix}${K}` }[VOScalarFieldKeys<Fields>]\n | {\n [K in VOValueObjectFieldKeys<Fields>]: Fields[K] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: infer N extends string };\n }\n ? VODotPaths<TContract, VOFields<TContract, N>, `${Prefix}${K}.`>\n : never;\n }[VOValueObjectFieldKeys<Fields>];\n\nexport type DotPath<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = {\n [K in ValueObjectFieldKeys<\n TContract,\n ModelName\n >]: MongoModelsMap<TContract>[ModelName]['fields'][K] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: infer N extends string };\n }\n ? VODotPaths<TContract, VOFields<TContract, N>, `${K}.`>\n : never;\n}[ValueObjectFieldKeys<TContract, ModelName>];\n\ntype ResolveDotPathInFields<\n TContract extends HasValueObjects,\n Fields extends Record<string, ContractField>,\n Path extends string,\n TCodecTypes extends Record<string, { output: unknown }>,\n> = Path extends `${infer Head}.${infer Rest}`\n ? Head extends keyof Fields & string\n ? Fields[Head] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: infer N extends string };\n }\n ? ResolveDotPathInFields<TContract, VOFields<TContract, N>, Rest, TCodecTypes>\n : never\n : never\n : Path extends keyof Fields & string\n ? Fields[Path] extends {\n readonly type: {\n readonly kind: 'scalar';\n readonly codecId: infer CId extends string & keyof TCodecTypes;\n };\n }\n ? TCodecTypes[CId]['output']\n : unknown\n : never;\n\nexport type ResolveDotPathType<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n Path extends string,\n TCodecTypes extends Record<string, { output: unknown }> = ExtractMongoCodecTypes<TContract>,\n> = Path extends `${infer Head}.${infer Rest}`\n ? Head extends keyof MongoModelsMap<TContract>[ModelName]['fields'] & string\n ? MongoModelsMap<TContract>[ModelName]['fields'][Head] extends {\n readonly type: { readonly kind: 'valueObject'; readonly name: infer N extends string };\n }\n ? ResolveDotPathInFields<TContract, VOFields<TContract, N>, Rest, TCodecTypes>\n : never\n : never\n : never;\n\nexport type FieldAccessor<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n TCodecTypes extends Record<string, { output: unknown }> = ExtractMongoCodecTypes<TContract>,\n> = {\n readonly [K in ScalarFieldKeys<TContract, ModelName>]: FieldExpression<\n ResolveFieldType<TContract, ModelName, K, TCodecTypes>\n >;\n} & {\n readonly [K in ValueObjectFieldKeys<TContract, ModelName>]: FieldExpression<\n ResolveFieldType<TContract, ModelName, K, TCodecTypes>\n >;\n} & (<P extends DotPath<TContract, ModelName>>(\n path: P,\n ) => FieldExpression<ResolveDotPathType<TContract, ModelName, P, TCodecTypes>>);\n\n// ── Runtime implementation ───────────────────────────────────────────────────\n\n// Runtime expression has all methods; type-level gating happens via FieldExpression<T>\ninterface RuntimeFieldExpression extends NumericOps {\n set(value: unknown): FieldOperation;\n unset(): FieldOperation;\n push(value: unknown): FieldOperation;\n pull(match: unknown): FieldOperation;\n addToSet(value: unknown): FieldOperation;\n pop(end: 1 | -1): FieldOperation;\n}\n\nfunction createFieldExpression(fieldPath: string): RuntimeFieldExpression {\n return {\n set(value: unknown): FieldOperation {\n return { operator: '$set', field: fieldPath, value: new MongoParamRef(value) };\n },\n unset(): FieldOperation {\n return { operator: '$unset', field: fieldPath, value: new MongoParamRef('') };\n },\n inc(value: number): FieldOperation {\n return { operator: '$inc', field: fieldPath, value: new MongoParamRef(value) };\n },\n mul(value: number): FieldOperation {\n return { operator: '$mul', field: fieldPath, value: new MongoParamRef(value) };\n },\n push(value: unknown): FieldOperation {\n return { operator: '$push', field: fieldPath, value: new MongoParamRef(value) };\n },\n pull(match: unknown): FieldOperation {\n return { operator: '$pull', field: fieldPath, value: new MongoParamRef(match) };\n },\n addToSet(value: unknown): FieldOperation {\n return { operator: '$addToSet', field: fieldPath, value: new MongoParamRef(value) };\n },\n pop(end: 1 | -1): FieldOperation {\n return { operator: '$pop', field: fieldPath, value: new MongoParamRef(end) };\n },\n };\n}\n\nexport function createFieldAccessor<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n TCodecTypes extends Record<string, { output: unknown }> = ExtractMongoCodecTypes<TContract>,\n>(): FieldAccessor<TContract, ModelName, TCodecTypes> {\n return new Proxy((() => {}) as unknown as FieldAccessor<TContract, ModelName, TCodecTypes>, {\n get(_target, prop: string): RuntimeFieldExpression {\n return createFieldExpression(prop);\n },\n apply(_target, _thisArg, args: [string]): RuntimeFieldExpression {\n return createFieldExpression(args[0]);\n },\n });\n}\n\nexport function compileFieldOperations(\n ops: readonly FieldOperation[],\n wrapValue: (field: string, value: MongoValue, operator: UpdateOperator) => MongoValue,\n): Record<string, Record<string, MongoValue>> {\n const grouped: Record<string, Record<string, MongoValue>> = {};\n for (const op of ops) {\n let group = grouped[op.operator];\n if (!group) {\n group = {};\n grouped[op.operator] = group;\n }\n group[op.field] = wrapValue(op.field, op.value, op.operator);\n }\n return grouped;\n}\n","import {\n type StructuredError,\n type StructuredErrorOptions,\n structuredError,\n} from '@prisma-next/utils/structured-error';\n\ntype OrmSubcode =\n | 'MODEL_UNKNOWN'\n | 'RELATION_UNKNOWN'\n | 'WHERE_MISSING'\n | 'OPERATION_UNSUPPORTED'\n | 'INCLUDE_UNSUPPORTED'\n | 'FIELD_IMMUTABLE';\n\nexport type OrmCode = `ORM.${OrmSubcode}`;\n\nexport function ormError(\n code: OrmCode,\n message: string,\n options?: StructuredErrorOptions,\n): StructuredError {\n return structuredError(code, message, options);\n}\n","import {\n type ContractField,\n type ContractReferenceRelation,\n type ContractValueObject,\n domainModelsAtDefaultNamespace,\n domainValueObjectsAtDefaultNamespace,\n type PlanMeta,\n} from '@prisma-next/contract/types';\nimport { AsyncIterableResult } from '@prisma-next/framework-components/runtime';\nimport type {\n AnyMongoTypeMaps,\n MongoContract,\n MongoContractWithTypeMaps,\n MongoModelDefinition,\n MongoModelsMap,\n} from '@prisma-next/mongo-contract';\nimport type {\n AnyMongoCommand,\n MongoFilterExpr,\n MongoQueryPlan,\n} from '@prisma-next/mongo-query-ast/execution';\nimport {\n DeleteManyCommand,\n FindOneAndDeleteCommand,\n FindOneAndUpdateCommand,\n InsertManyCommand,\n InsertOneCommand,\n isMongoFilterExpr,\n MongoAndExpr,\n MongoFieldFilter,\n UpdateManyCommand,\n} from '@prisma-next/mongo-query-ast/execution';\nimport type { MongoValue } from '@prisma-next/mongo-value';\nimport { MongoParamRef } from '@prisma-next/mongo-value';\nimport { blindCast, castAs } from '@prisma-next/utils/casts';\nimport { InternalError } from '@prisma-next/utils/internal-error';\nimport type { MongoIncludeExpr } from './collection-state';\nimport { emptyCollectionState, type MongoCollectionState } from './collection-state';\nimport { compileMongoQuery } from './compile';\nimport type { MongoQueryExecutor } from './executor';\nimport {\n compileFieldOperations,\n createFieldAccessor,\n type FieldAccessor,\n type FieldOperation,\n} from './field-accessor';\nimport { ormError } from './orm-errors';\nimport type {\n DefaultModelRow,\n IncludedRow,\n MongoIncludeSpec,\n MongoWhereFilter,\n NoIncludes,\n ReferenceRelationKeys,\n ResolvedCreateInput,\n VariantNames,\n} from './types';\n\ntype ModelFieldKeys<\n TContract extends MongoContract,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n> = keyof MongoModelsMap<TContract>[ModelName]['fields'] & string;\n\nexport interface MongoCollection<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n TIncludes extends MongoIncludeSpec<TContract, ModelName> = NoIncludes,\n TVariant extends string = never,\n> {\n /** Narrows to a specific variant, injecting a discriminator filter. */\n variant<V extends VariantNames<TContract, ModelName>>(\n variantName: V,\n ): MongoCollection<TContract, ModelName, TIncludes, V>;\n /** Appends equality filters from a plain object. Values are encoded through codecs. */\n where(\n filter: MongoWhereFilter<TContract, ModelName>,\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Appends a filter condition from a raw filter expression. */\n where(filter: MongoFilterExpr): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Restricts returned fields to the given subset. Returns a new immutable collection. */\n select(\n ...fields: ModelFieldKeys<TContract, ModelName>[]\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Adds a `$lookup` for a reference relation. Returns a new immutable collection. */\n include<K extends ReferenceRelationKeys<TContract, ModelName> & string>(\n relationName: K,\n ): MongoCollection<TContract, ModelName, TIncludes & Record<K, true>, TVariant>;\n /** Sets sort order. Returns a new immutable collection. */\n orderBy(\n spec: Partial<Record<ModelFieldKeys<TContract, ModelName>, 1 | -1>>,\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Limits the number of results. Returns a new immutable collection. */\n take(n: number): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Skips the first `n` results. Returns a new immutable collection. */\n skip(n: number): MongoCollection<TContract, ModelName, TIncludes, TVariant>;\n /** Executes the query and returns all matching rows as an async iterable. */\n all(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Executes the query with limit 1. Returns the first matching row or `null`. */\n first(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;\n /** Returns the input data with the server-assigned `_id`. Does not re-read the stored document. */\n create(\n data: ResolvedCreateInput<TContract, ModelName, TVariant>,\n ): Promise<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Returns input rows with server-assigned `_id`s. Does not re-read stored documents. */\n createAll(\n data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Inserts multiple documents and returns the number inserted. */\n createAndCount(\n data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,\n ): Promise<number>;\n /** Updates one matching document via `findOneAndUpdate`. Returns the updated document or `null`. Requires `.where()`. */\n update(\n data: Partial<DefaultModelRow<TContract, ModelName>>,\n ): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;\n /** Updates one matching document using field operations from a callback. Requires `.where()`. */\n update(\n callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[],\n ): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;\n /** Non-atomic: captures matching `_id`s, updates, then re-reads by `_id`. Requires `.where()`. */\n updateAll(\n data: Partial<DefaultModelRow<TContract, ModelName>>,\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Updates all matching documents using field operations from a callback. Requires `.where()`. */\n updateAll(\n callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[],\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Updates all matching documents and returns the number modified. Requires `.where()`. */\n updateAndCount(data: Partial<DefaultModelRow<TContract, ModelName>>): Promise<number>;\n /** Updates all matching documents using field operations and returns the number modified. Requires `.where()`. */\n updateAndCount(\n callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[],\n ): Promise<number>;\n /** Deletes one matching document via `findOneAndDelete`. Returns the deleted document or `null`. Requires `.where()`. */\n delete(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null>;\n /** Non-atomic: reads matching docs then deletes them. Concurrent writes may cause stale results. Requires `.where()`. */\n deleteAll(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Deletes all matching documents and returns the number deleted. Requires `.where()`. */\n deleteAndCount(): Promise<number>;\n /**\n * On insert: `update` fields are applied via `$set`, remaining `create` fields via `$setOnInsert`.\n * This means `update` values take precedence over `create` for overlapping fields on insert.\n * Requires `.where()`.\n */\n upsert(input: {\n create: ResolvedCreateInput<TContract, ModelName, TVariant>;\n update: Partial<DefaultModelRow<TContract, ModelName>>;\n }): Promise<IncludedRow<TContract, ModelName, TIncludes>>;\n /** Upsert using field operations callback for the update part. Requires `.where()`. */\n upsert(input: {\n create: ResolvedCreateInput<TContract, ModelName, TVariant>;\n update: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[];\n }): Promise<IncludedRow<TContract, ModelName, TIncludes>>;\n}\n\nfunction resolveCollectionName(model: MongoModelDefinition, modelName: string): string {\n return model.storage.collection ?? modelName;\n}\n\nfunction isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nclass MongoCollectionImpl<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n TIncludes extends MongoIncludeSpec<TContract, ModelName> = NoIncludes,\n TVariant extends string = never,\n> implements MongoCollection<TContract, ModelName, TIncludes, TVariant>\n{\n readonly #contract: TContract;\n readonly #modelName: ModelName;\n readonly #executor: MongoQueryExecutor;\n #collectionName: string;\n #state: MongoCollectionState;\n #variantName: string | undefined;\n\n constructor(contract: TContract, modelName: ModelName, executor: MongoQueryExecutor) {\n this.#contract = contract;\n this.#modelName = modelName;\n this.#executor = executor;\n const model = blindCast<\n MongoModelDefinition,\n 'modelName is constrained to Mongo contract model keys but namespace lookup erases storage type'\n >(domainModelsAtDefaultNamespace(contract.domain)[modelName]);\n this.#collectionName = resolveCollectionName(model, modelName);\n this.#state = emptyCollectionState();\n }\n\n variant<V extends VariantNames<TContract, ModelName>>(\n variantName: V,\n ): MongoCollection<TContract, ModelName, TIncludes, V> {\n const model = blindCast<\n MongoModelDefinition | undefined,\n 'Mongo contract model lookup preserves target storage metadata erased by the namespace helper'\n >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);\n if (!model?.discriminator || !model.variants) {\n // No polymorphism metadata on this model — return unchanged. Cast required\n // because TS cannot verify TVariant (the current variant) is assignable to V.\n return blindCast<\n MongoCollection<TContract, ModelName, TIncludes, V>,\n 'no-op variant refinement preserves runtime state while changing only the type-level variant'\n >(this);\n }\n\n const variantEntry = model.variants[variantName];\n if (!variantEntry) {\n // Unknown variant name at runtime — return unchanged. Same cast rationale.\n return blindCast<\n MongoCollection<TContract, ModelName, TIncludes, V>,\n 'unknown variant fallback preserves runtime state while changing only the type-level variant'\n >(this);\n }\n\n const filter = MongoFieldFilter.eq(\n model.discriminator.field,\n new MongoParamRef(variantEntry.value),\n );\n return this.#cloneWithVariant<V>({ filters: [...this.#state.filters, filter] }, variantName);\n }\n\n where(\n filter: MongoWhereFilter<TContract, ModelName> | MongoFilterExpr,\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n if (isMongoFilterExpr(filter)) {\n return this.#clone({ filters: [...this.#state.filters, filter] });\n }\n const compiled = this.#compileWhereObject(\n blindCast<\n Record<string, unknown>,\n 'typed Mongo where input is a model-field value record after filter-expression narrowing'\n >(filter),\n );\n return this.#clone({ filters: [...this.#state.filters, ...compiled] });\n }\n\n select(\n ...fields: ModelFieldKeys<TContract, ModelName>[]\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n return this.#clone({ selectedFields: [...(this.#state.selectedFields ?? []), ...fields] });\n }\n\n include<K extends ReferenceRelationKeys<TContract, ModelName> & string>(\n relationName: K,\n ): MongoCollection<TContract, ModelName, TIncludes & Record<K, true>, TVariant> {\n const model = blindCast<\n MongoModelDefinition,\n 'modelName is constrained to Mongo contract model keys but namespace lookup erases storage type'\n >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);\n const relation = model.relations?.[relationName];\n if (!relation) {\n throw ormError(\n 'ORM.RELATION_UNKNOWN',\n `Unknown relation \"${relationName}\" on model \"${this.#modelName}\"`,\n { meta: { model: this.#modelName, relation: relationName } },\n );\n }\n\n if (!('on' in relation)) {\n throw ormError(\n 'ORM.INCLUDE_UNSUPPORTED',\n `Relation \"${relationName}\" is an embed relation — only reference relations can be included`,\n { meta: { model: this.#modelName, relation: relationName } },\n );\n }\n\n const ref: ContractReferenceRelation = relation;\n const localField = ref.on.localFields[0];\n const foreignField = ref.on.targetFields[0];\n if (\n !localField ||\n !foreignField ||\n ref.on.localFields.length !== 1 ||\n ref.on.targetFields.length !== 1\n ) {\n throw ormError(\n 'ORM.INCLUDE_UNSUPPORTED',\n `Compound references are not yet supported: relation \"${relationName}\"`,\n { meta: { model: this.#modelName, relation: relationName } },\n );\n }\n\n const targetModelName = ref.to.model;\n const targetModel = castAs<MongoModelDefinition | undefined>(\n domainModelsAtDefaultNamespace(this.#contract.domain)[targetModelName],\n );\n if (!targetModel) {\n throw new InternalError(\n `Target model \"${targetModelName}\" not found for relation \"${relationName}\"`,\n );\n }\n\n const includeExpr: MongoIncludeExpr = {\n relationName,\n from: resolveCollectionName(targetModel, targetModelName),\n localField,\n foreignField,\n cardinality: ref.cardinality,\n };\n\n return blindCast<\n MongoCollection<TContract, ModelName, TIncludes & Record<K, true>, TVariant>,\n 'include clone state contains the appended relation but the generic include refinement is not inferred'\n >(\n this.#clone({\n includes: [...this.#state.includes, includeExpr],\n }),\n );\n }\n\n orderBy(\n spec: Partial<Record<ModelFieldKeys<TContract, ModelName>, 1 | -1>>,\n ): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n const merged: Readonly<Record<string, 1 | -1>> = { ...this.#state.orderBy, ...spec };\n return this.#clone({ orderBy: merged });\n }\n\n take(n: number): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n return this.#clone({ limit: n });\n }\n\n skip(n: number): MongoCollection<TContract, ModelName, TIncludes, TVariant> {\n return this.#clone({ offset: n });\n }\n\n all(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n return this.#execute();\n }\n\n async first(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null> {\n const limited = this.#clone({ limit: 1 });\n const result = limited.#execute();\n for await (const row of result) {\n return row;\n }\n return null;\n }\n\n async create(\n data: ResolvedCreateInput<TContract, ModelName, TVariant>,\n ): Promise<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#rejectIncludes('create');\n const normalized = this.#injectDiscriminator(\n this.#stripUndefined(\n blindCast<\n Record<string, unknown>,\n 'resolved Mongo create input is a model-field value record'\n >(data),\n ),\n );\n const document = this.#toDocument(normalized);\n const command = new InsertOneCommand(this.#collectionName, document);\n const results = await this.#drainPlan(command);\n const insertedId = blindCast<\n { insertedId: unknown },\n 'InsertOneCommand runtime result exposes the server-assigned insertedId'\n >(results[0]).insertedId;\n return blindCast<\n IncludedRow<TContract, ModelName, TIncludes>,\n 'created row combines resolved model input with the server-assigned _id'\n >({ _id: insertedId, ...normalized });\n }\n\n createAll(\n data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#rejectIncludes('createAll');\n const self = this;\n async function* gen(): AsyncGenerator<IncludedRow<TContract, ModelName, TIncludes>> {\n const normalizedRows = data.map((d) =>\n self.#injectDiscriminator(\n self.#stripUndefined(\n blindCast<\n Record<string, unknown>,\n 'resolved Mongo create-all input is a model-field value record'\n >(d),\n ),\n ),\n );\n const documents = normalizedRows.map((d) => self.#toDocument(d));\n const command = new InsertManyCommand(self.#collectionName, documents);\n const results = await self.#drainPlan(command);\n const insertedIds = blindCast<\n { insertedIds: readonly unknown[] },\n 'InsertManyCommand runtime result exposes insertedIds in input order'\n >(results[0]).insertedIds;\n for (let i = 0; i < normalizedRows.length; i++) {\n yield blindCast<\n IncludedRow<TContract, ModelName, TIncludes>,\n 'created row combines resolved model input with its server-assigned _id'\n >({ _id: insertedIds[i], ...normalizedRows[i] });\n }\n }\n return new AsyncIterableResult(gen());\n }\n\n async createAndCount(\n data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,\n ): Promise<number> {\n this.#rejectIncludes('createAndCount');\n const documents = data.map((d) =>\n this.#toDocument(\n this.#injectDiscriminator(\n blindCast<\n Record<string, unknown>,\n 'resolved Mongo create-and-count input is a model-field value record'\n >(d),\n ),\n ),\n );\n const command = new InsertManyCommand(this.#collectionName, documents);\n const results = await this.#drainPlan(command);\n return blindCast<\n { insertedCount: number },\n 'InsertManyCommand runtime result exposes insertedCount'\n >(results[0]).insertedCount;\n }\n\n async update(\n dataOrCallback:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]),\n ): Promise<IncludedRow<TContract, ModelName, TIncludes> | null> {\n this.#requireFilters('update');\n this.#rejectWindowing('update');\n this.#rejectIncludes('update');\n const filter = this.#mergeFilters();\n const updateDoc = this.#resolveUpdateDoc(dataOrCallback);\n const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, false);\n const results = await this.#drainPlan(command);\n const result = results[0];\n return result === undefined\n ? null\n : blindCast<\n IncludedRow<TContract, ModelName, TIncludes>,\n 'FindOneAndUpdateCommand plan has no resultShape; collection update exposes its raw driver document as IncludedRow'\n >(result);\n }\n\n updateAll(\n dataOrCallback:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]),\n ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#requireFilters('updateAll');\n this.#rejectWindowing('updateAll');\n const self = this;\n async function* gen(): AsyncGenerator<IncludedRow<TContract, ModelName, TIncludes>> {\n const ids = await self.#readMatchingIds();\n if (ids.length === 0) return;\n\n const filter = self.#mergeFilters();\n const updateDoc = self.#resolveUpdateDoc(dataOrCallback);\n const command = new UpdateManyCommand(self.#collectionName, filter, updateDoc);\n await self.#drainPlan(command);\n\n const idFilter = MongoFieldFilter.in(\n '_id',\n ids.map((id) => new MongoParamRef(id)),\n );\n yield* self.#clone({ filters: [idFilter] }).#execute();\n }\n return new AsyncIterableResult(gen());\n }\n\n async updateAndCount(\n dataOrCallback:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]),\n ): Promise<number> {\n this.#requireFilters('updateAndCount');\n this.#rejectWindowing('updateAndCount');\n this.#rejectIncludes('updateAndCount');\n const filter = this.#mergeFilters();\n const updateDoc = this.#resolveUpdateDoc(dataOrCallback);\n const command = new UpdateManyCommand(this.#collectionName, filter, updateDoc);\n const results = await this.#drainPlan(command);\n return blindCast<\n { modifiedCount: number },\n 'UpdateManyCommand runtime result exposes modifiedCount'\n >(results[0]).modifiedCount;\n }\n\n async delete(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null> {\n this.#requireFilters('delete');\n this.#rejectWindowing('delete');\n this.#rejectIncludes('delete');\n const filter = this.#mergeFilters();\n const command = new FindOneAndDeleteCommand(this.#collectionName, filter);\n const results = await this.#drainPlan(command);\n const result = results[0];\n return result === undefined\n ? null\n : blindCast<\n IncludedRow<TContract, ModelName, TIncludes>,\n 'FindOneAndDeleteCommand plan has no resultShape; collection delete exposes its raw driver document as IncludedRow'\n >(result);\n }\n\n deleteAll(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#requireFilters('deleteAll');\n this.#rejectWindowing('deleteAll');\n const self = this;\n async function* gen(): AsyncGenerator<IncludedRow<TContract, ModelName, TIncludes>> {\n const docs: IncludedRow<TContract, ModelName, TIncludes>[] = [];\n for await (const row of self.#execute()) {\n docs.push(row);\n }\n const filter = self.#mergeFilters();\n const command = new DeleteManyCommand(self.#collectionName, filter);\n await self.#drainPlan(command);\n yield* docs;\n }\n return new AsyncIterableResult(gen());\n }\n\n async deleteAndCount(): Promise<number> {\n this.#requireFilters('deleteAndCount');\n this.#rejectWindowing('deleteAndCount');\n this.#rejectIncludes('deleteAndCount');\n const filter = this.#mergeFilters();\n const command = new DeleteManyCommand(this.#collectionName, filter);\n const results = await this.#drainPlan(command);\n return blindCast<\n { deletedCount: number },\n 'DeleteManyCommand runtime result exposes deletedCount'\n >(results[0]).deletedCount;\n }\n\n async upsert(input: {\n create: ResolvedCreateInput<TContract, ModelName, TVariant>;\n update:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]);\n }): Promise<IncludedRow<TContract, ModelName, TIncludes>> {\n this.#requireFilters('upsert');\n this.#rejectWindowing('upsert');\n this.#rejectIncludes('upsert');\n const filter = this.#mergeFilters();\n\n const allCreateFields = this.#toDocument(\n this.#injectDiscriminator(\n blindCast<\n Record<string, unknown>,\n 'resolved Mongo upsert create input is a model-field value record'\n >(input.create),\n ),\n );\n\n let updateDoc: Record<string, Record<string, MongoValue>>;\n if (typeof input.update === 'function') {\n const accessor = createFieldAccessor<TContract, ModelName>();\n const ops = input.update(accessor);\n const idOp = ops.find((op) => op.field === '_id');\n if (idOp) {\n throw ormError('ORM.FIELD_IMMUTABLE', 'Mutation payloads cannot modify `_id`', {\n meta: { field: '_id' },\n });\n }\n const dotPathOp = ops.find((op) => op.field.includes('.'));\n if (dotPathOp) {\n throw ormError(\n 'ORM.OPERATION_UNSUPPORTED',\n `upsert() does not support dot-path field operations (found \"${dotPathOp.field}\"). ` +\n 'Dot-path updates conflict with $setOnInsert on the insert path, producing incomplete documents. ' +\n 'Use top-level field operations instead.',\n { meta: { method: 'upsert', field: dotPathOp.field } },\n );\n }\n updateDoc = compileFieldOperations(ops, (field, value, operator) =>\n this.#wrapFieldOpValue(field, value, operator),\n );\n } else {\n const setFields = this.#toSetFields(\n blindCast<\n Record<string, unknown>,\n 'resolved Mongo upsert update input is a partial model-field value record'\n >(input.update),\n );\n updateDoc = {};\n if (Object.keys(setFields).length > 0) {\n updateDoc['$set'] = setFields;\n }\n }\n\n const updatedFields = new Set<string>();\n for (const operatorGroup of Object.values(updateDoc)) {\n for (const fieldPath of Object.keys(operatorGroup)) {\n updatedFields.add(fieldPath.split('.')[0] ?? fieldPath);\n }\n }\n const insertOnlyFields: Record<string, MongoValue> = {};\n for (const [key, value] of Object.entries(allCreateFields)) {\n if (!updatedFields.has(key)) {\n insertOnlyFields[key] = value;\n }\n }\n if (Object.keys(insertOnlyFields).length > 0) {\n updateDoc['$setOnInsert'] = insertOnlyFields;\n }\n\n const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, true);\n const results = await this.#drainPlan(command);\n return blindCast<\n IncludedRow<TContract, ModelName, TIncludes>,\n 'FindOneAndUpdateCommand upsert plan has no resultShape; collection upsert exposes its raw driver document as IncludedRow'\n >(results[0]);\n }\n\n async #readMatchingIds(): Promise<unknown[]> {\n const idQuery = this.#clone({\n includes: [],\n selectedFields: ['_id'],\n orderBy: undefined,\n limit: undefined,\n offset: undefined,\n });\n const ids: unknown[] = [];\n // Strip resultShape so the runtime yields wire-level _id values (e.g. ObjectId)\n // rather than decoded hex strings. The follow-up $in filter in updateAll wraps\n // these in bare MongoParamRefs with no codecId; round-tripping a decoded string\n // back through the adapter would require attaching the field's codecId, which\n // we don't do here. Do not \"tidy\" the destructure away — the prefetch+modify+\n // re-read flow depends on it.\n const { resultShape: _rs, ...planWithoutShape } = idQuery.#compile();\n for await (const row of this.#executor.execute(planWithoutShape)) {\n const storageRow = blindCast<\n Record<string, unknown>,\n 'Mongo id-prefetch plan without resultShape yields a raw storage row containing _id'\n >(row);\n ids.push(storageRow['_id']);\n }\n return ids;\n }\n\n #execute(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {\n const plan = this.#compile();\n return this.#executor.execute(plan);\n }\n\n #compile(): MongoQueryPlan<IncludedRow<TContract, ModelName, TIncludes>> {\n const model = blindCast<\n MongoModelDefinition | undefined,\n 'Mongo contract model lookup preserves target storage metadata erased by the namespace helper'\n >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);\n if (!model) {\n throw ormError('ORM.MODEL_UNKNOWN', `Unknown model: \"${this.#modelName}\".`, {\n meta: { model: this.#modelName },\n });\n }\n return compileMongoQuery<IncludedRow<TContract, ModelName, TIncludes>>(\n this.#collectionName,\n this.#state,\n this.#contract.storage.storageHash,\n model,\n );\n }\n\n #wrapCommand(command: AnyMongoCommand): MongoQueryPlan<unknown> {\n return { collection: this.#collectionName, command, meta: this.#planMeta() };\n }\n\n async #drainPlan(command: AnyMongoCommand): Promise<unknown[]> {\n const plan = this.#wrapCommand(command);\n const result = this.#executor.execute(plan);\n const rows: unknown[] = [];\n for await (const row of result) {\n rows.push(row);\n }\n return rows;\n }\n\n #modelFields(): Record<string, ContractField> {\n const model = blindCast<\n MongoModelDefinition | undefined,\n 'Mongo contract model lookup preserves target storage metadata erased by the namespace helper'\n >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);\n return model?.fields ?? {};\n }\n\n #compileWhereObject(data: Record<string, unknown>): MongoFilterExpr[] {\n const fields = this.#modelFields();\n const filters: MongoFilterExpr[] = [];\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const wrapped = this.#wrapFieldValue(value, fields[key]);\n filters.push(MongoFieldFilter.eq(key, wrapped));\n }\n return filters;\n }\n\n #wrapFieldValue(value: unknown, field: ContractField | undefined): MongoValue {\n if (field === undefined) return new MongoParamRef(value);\n\n if (field.type.kind === 'scalar') {\n return new MongoParamRef(value, { codecId: field.type.codecId });\n }\n\n if (field.type.kind === 'valueObject') {\n const voName = field.type.name;\n const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];\n if (!voDef || value === null) return new MongoParamRef(value);\n\n if (field.many && Array.isArray(value)) {\n return value.map((item) =>\n this.#wrapValueObject(\n blindCast<\n Record<string, unknown>,\n 'contract-typed value-object array elements are field-value records'\n >(item),\n voDef,\n ),\n );\n }\n return this.#wrapValueObject(\n blindCast<\n Record<string, unknown>,\n 'contract-typed value-object input is a field-value record'\n >(value),\n voDef,\n );\n }\n\n return new MongoParamRef(value);\n }\n\n #wrapValueObject(\n data: Record<string, unknown>,\n voDef: ContractValueObject,\n ): Record<string, MongoValue> {\n const doc: Record<string, MongoValue> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const fieldDef = voDef.fields[key];\n doc[key] = this.#wrapFieldValue(value, fieldDef);\n }\n return doc;\n }\n\n #toDocument(data: Record<string, unknown>): Record<string, MongoValue> {\n const fields = this.#modelFields();\n const doc: Record<string, MongoValue> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value !== undefined) {\n doc[key] = this.#wrapFieldValue(value, fields[key]);\n }\n }\n return doc;\n }\n\n #toSetFields(data: Record<string, unknown>): Record<string, MongoValue> {\n const fields = this.#modelFields();\n const result: Record<string, MongoValue> = {};\n for (const [key, value] of Object.entries(data)) {\n if (key === '_id' && value !== undefined) {\n throw ormError('ORM.FIELD_IMMUTABLE', 'Mutation payloads cannot modify `_id`', {\n meta: { field: '_id' },\n });\n }\n if (value !== undefined) {\n result[key] = this.#wrapFieldValue(value, fields[key]);\n }\n }\n return result;\n }\n\n #stripUndefined(data: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n }\n\n #toUpdateDocument(data: Record<string, unknown>): Record<string, Record<string, MongoValue>> {\n return { $set: this.#toSetFields(data) };\n }\n\n #resolveUpdateDoc(\n dataOrCallback:\n | Partial<DefaultModelRow<TContract, ModelName>>\n | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]),\n ): Record<string, Record<string, MongoValue>> {\n if (typeof dataOrCallback === 'function') {\n const accessor = createFieldAccessor<TContract, ModelName>();\n const ops = dataOrCallback(accessor);\n const idOp = ops.find((op) => op.field === '_id');\n if (idOp) {\n throw ormError('ORM.FIELD_IMMUTABLE', 'Mutation payloads cannot modify `_id`', {\n meta: { field: '_id' },\n });\n }\n if (ops.length === 0) {\n return { $set: {} };\n }\n return compileFieldOperations(ops, (field, value, operator) =>\n this.#wrapFieldOpValue(field, value, operator),\n );\n }\n return this.#toUpdateDocument(\n blindCast<\n Record<string, unknown>,\n 'partial Mongo update input is a model-field value record after callback narrowing'\n >(dataOrCallback),\n );\n }\n\n #wrapFieldOpValue(field: string, value: MongoValue, operator?: string): MongoValue {\n if (operator === '$unset') return value;\n\n const topLevelField = field.split('.')[0] ?? field;\n const fields = this.#modelFields();\n const contractField = fields[topLevelField];\n if (!contractField) return value;\n\n if (field.includes('.')) {\n return this.#wrapDotPathValue(field, value);\n }\n\n if (value instanceof MongoParamRef && contractField.type.kind === 'scalar') {\n return new MongoParamRef(value.value, { codecId: contractField.type.codecId });\n }\n\n if (contractField.type.kind === 'valueObject' && value instanceof MongoParamRef) {\n const raw = value.value;\n if (isUnknownRecord(raw)) {\n const voName = contractField.type.name;\n const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];\n if (voDef) {\n return this.#wrapValueObject(raw, voDef);\n }\n }\n }\n\n return value;\n }\n\n #wrapDotPathValue(dotPath: string, value: MongoValue): MongoValue {\n const parts = dotPath.split('.');\n const fields = this.#modelFields();\n let currentField: ContractField | undefined = parts[0] ? fields[parts[0]] : undefined;\n\n for (let i = 1; i < parts.length; i++) {\n if (currentField?.type.kind !== 'valueObject') return value;\n const voName = currentField.type.name;\n const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];\n if (!voDef) return value;\n const partKey = parts[i];\n currentField = partKey ? voDef.fields[partKey] : undefined;\n }\n\n if (currentField?.type.kind === 'scalar' && value instanceof MongoParamRef) {\n return new MongoParamRef(value.value, { codecId: currentField.type.codecId });\n }\n\n if (currentField?.type.kind === 'valueObject' && value instanceof MongoParamRef) {\n const raw = value.value;\n if (isUnknownRecord(raw)) {\n const voName = currentField.type.name;\n const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];\n if (voDef) {\n return this.#wrapValueObject(raw, voDef);\n }\n }\n }\n\n return value;\n }\n\n #mergeFilters(): MongoFilterExpr {\n const [single] = this.#state.filters;\n if (this.#state.filters.length === 1 && single) {\n return single;\n }\n return MongoAndExpr.of([...this.#state.filters]);\n }\n\n #requireFilters(methodName: string): void {\n if (this.#state.filters.length === 0) {\n throw ormError(\n 'ORM.WHERE_MISSING',\n `${methodName}() requires a .where() filter. Call .where() before .${methodName}()`,\n { meta: { method: methodName } },\n );\n }\n }\n\n #rejectWindowing(methodName: string): void {\n if (\n this.#state.orderBy !== undefined ||\n this.#state.limit !== undefined ||\n this.#state.offset !== undefined\n ) {\n throw ormError(\n 'ORM.OPERATION_UNSUPPORTED',\n `${methodName}() does not support orderBy/skip/take. Remove windowing before calling .${methodName}()`,\n { meta: { method: methodName, reason: 'windowing' } },\n );\n }\n }\n\n #rejectIncludes(methodName: string): void {\n if (this.#state.includes.length > 0) {\n throw ormError(\n 'ORM.OPERATION_UNSUPPORTED',\n `${methodName}() does not support .include(). Remove includes before calling .${methodName}()`,\n { meta: { method: methodName, reason: 'includes' } },\n );\n }\n }\n\n #planMeta(): PlanMeta {\n return {\n target: 'mongo',\n storageHash: this.#contract.storage.storageHash,\n lane: 'mongo-orm',\n };\n }\n\n #injectDiscriminator(data: Record<string, unknown>): Record<string, unknown> {\n if (!this.#variantName) return data;\n const model = blindCast<\n MongoModelDefinition | undefined,\n 'Mongo contract model lookup preserves target storage metadata erased by the namespace helper'\n >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);\n if (!model?.discriminator || !model.variants) return data;\n const variantEntry = model.variants[this.#variantName];\n if (!variantEntry) return data;\n return { ...data, [model.discriminator.field]: variantEntry.value };\n }\n\n #clone(\n overrides: Partial<MongoCollectionState>,\n ): MongoCollectionImpl<TContract, ModelName, TIncludes, TVariant> {\n const instance = new MongoCollectionImpl<TContract, ModelName, TIncludes, TVariant>(\n this.#contract,\n this.#modelName,\n this.#executor,\n );\n instance.#state = { ...this.#state, ...overrides };\n instance.#collectionName = this.#collectionName;\n instance.#variantName = this.#variantName;\n return instance;\n }\n\n #cloneWithVariant<VNew extends string>(\n overrides: Partial<MongoCollectionState>,\n variantName: string,\n ): MongoCollectionImpl<TContract, ModelName, TIncludes, VNew> {\n const instance = new MongoCollectionImpl<TContract, ModelName, TIncludes, VNew>(\n this.#contract,\n this.#modelName,\n this.#executor,\n );\n instance.#state = { ...this.#state, ...overrides };\n instance.#collectionName = this.#collectionName;\n instance.#variantName = variantName;\n return instance;\n }\n}\n\nexport function createMongoCollection<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n ModelName extends string & keyof MongoModelsMap<TContract>,\n>(\n contract: TContract,\n modelName: ModelName,\n executor: MongoQueryExecutor,\n): MongoCollection<TContract, ModelName> {\n return new MongoCollectionImpl(contract, modelName, executor);\n}\n","import type {\n AnyMongoTypeMaps,\n MongoContract,\n MongoContractWithTypeMaps,\n RootModelName,\n} from '@prisma-next/mongo-contract';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport type { MongoCollection } from './collection';\nimport { createMongoCollection } from './collection';\nimport type { MongoQueryExecutor } from './executor';\n\nexport interface MongoOrmOptions<TContract extends MongoContract> {\n readonly contract: TContract;\n readonly executor: MongoQueryExecutor;\n}\n\nexport type MongoOrmClient<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n> = {\n readonly [K in keyof TContract['roots'] & string]: MongoCollection<\n TContract,\n RootModelName<TContract, K>\n >;\n};\n\nexport function mongoOrm<\n TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,\n>(options: MongoOrmOptions<TContract>): MongoOrmClient<TContract> {\n const { contract, executor } = options;\n const client: Record<string, unknown> = {};\n\n for (const [rootName, rootRef] of Object.entries(contract.roots)) {\n client[rootName] = createMongoCollection(\n contract,\n blindCast<\n RootModelName<TContract, typeof rootName & keyof TContract['roots'] & string>,\n 'roots entries are CrossReferences; rootRef.model is a valid RootModelName for this contract'\n >(rootRef.model),\n executor,\n );\n }\n\n return client as MongoOrmClient<TContract>;\n}\n","import type { PlanMeta } from '@prisma-next/contract/types';\nimport type { MongoQueryPlan } from '@prisma-next/mongo-query-ast/execution';\nimport {\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 type { Document } from '@prisma-next/mongo-value';\n\ninterface Buildable<Row = unknown> {\n build(): MongoQueryPlan<Row>;\n}\n\nexport interface RawMongoCollection {\n aggregate<Row = Record<string, unknown>>(pipeline: ReadonlyArray<Document>): Buildable<Row>;\n\n insertOne(document: Document): Buildable;\n insertMany(documents: ReadonlyArray<Document>): Buildable;\n\n updateOne(filter: Document, update: Document | ReadonlyArray<Document>): Buildable;\n\n updateMany(filter: Document, update: Document | ReadonlyArray<Document>): Buildable;\n\n deleteOne(filter: Document): Buildable;\n deleteMany(filter: Document): Buildable;\n\n findOneAndUpdate(\n filter: Document,\n update: Document | ReadonlyArray<Document>,\n options?: { upsert?: boolean },\n ): Buildable;\n\n findOneAndDelete(filter: Document): Buildable;\n}\n\nexport function createRawMongoCollection(\n collectionName: string,\n meta: PlanMeta,\n): RawMongoCollection {\n function buildable<Row>(command: MongoQueryPlan['command']): Buildable<Row> {\n return {\n build: () => ({ collection: collectionName, command, meta }),\n };\n }\n\n return {\n aggregate<Row = Record<string, unknown>>(pipeline: ReadonlyArray<Document>) {\n return buildable<Row>(new RawAggregateCommand(collectionName, pipeline));\n },\n\n insertOne(document: Document) {\n return buildable(new RawInsertOneCommand(collectionName, document));\n },\n\n insertMany(documents: ReadonlyArray<Document>) {\n return buildable(new RawInsertManyCommand(collectionName, documents));\n },\n\n updateOne(filter: Document, update: Document | ReadonlyArray<Document>) {\n return buildable(new RawUpdateOneCommand(collectionName, filter, update));\n },\n\n updateMany(filter: Document, update: Document | ReadonlyArray<Document>) {\n return buildable(new RawUpdateManyCommand(collectionName, filter, update));\n },\n\n deleteOne(filter: Document) {\n return buildable(new RawDeleteOneCommand(collectionName, filter));\n },\n\n deleteMany(filter: Document) {\n return buildable(new RawDeleteManyCommand(collectionName, filter));\n },\n\n findOneAndUpdate(\n filter: Document,\n update: Document | ReadonlyArray<Document>,\n options?: { upsert?: boolean },\n ) {\n return buildable(\n new RawFindOneAndUpdateCommand(collectionName, filter, update, options?.upsert ?? false),\n );\n },\n\n findOneAndDelete(filter: Document) {\n return buildable(new RawFindOneAndDeleteCommand(collectionName, filter));\n },\n };\n}\n","import { domainModelsAtDefaultNamespace, type PlanMeta } from '@prisma-next/contract/types';\nimport type { MongoContract, MongoModelDefinition } from '@prisma-next/mongo-contract';\nimport { ormError } from './orm-errors';\nimport { createRawMongoCollection, type RawMongoCollection } from './raw-collection';\n\nexport interface MongoRawClient<TContract extends MongoContract> {\n collection<K extends keyof TContract['roots'] & string>(rootName: K): RawMongoCollection;\n}\n\nexport function mongoRaw<TContract extends MongoContract>(options: {\n contract: TContract;\n}): MongoRawClient<TContract> {\n const { contract } = options;\n\n return {\n collection<K extends keyof TContract['roots'] & string>(rootName: K): RawMongoCollection {\n const modelName = contract.roots[rootName]?.model;\n const models = domainModelsAtDefaultNamespace(contract.domain);\n if (!modelName || !Object.hasOwn(models, modelName)) {\n throw ormError(\n 'ORM.MODEL_UNKNOWN',\n `Unknown model \"${modelName ?? ''}\" for root \"${rootName}\"`,\n { meta: { model: modelName ?? '', root: rootName } },\n );\n }\n const model = models[modelName] as MongoModelDefinition;\n const collectionName = model.storage.collection ?? modelName;\n\n const meta: PlanMeta = {\n target: 'mongo',\n storageHash: contract.storage.storageHash,\n lane: 'mongo-raw',\n };\n\n return createRawMongoCollection(collectionName, meta);\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,27 +1,27 @@
1
1
  {
2
2
  "name": "@prisma-next/mongo-orm",
3
- "version": "0.16.0-dev.24",
3
+ "version": "0.16.0-dev.25",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "description": "MongoDB ORM client for Prisma Next",
8
8
  "dependencies": {
9
- "@prisma-next/contract": "0.16.0-dev.24",
10
- "@prisma-next/framework-components": "0.16.0-dev.24",
11
- "@prisma-next/mongo-contract": "0.16.0-dev.24",
12
- "@prisma-next/mongo-query-ast": "0.16.0-dev.24",
13
- "@prisma-next/mongo-query-builder": "0.16.0-dev.24",
14
- "@prisma-next/mongo-value": "0.16.0-dev.24",
15
- "@prisma-next/utils": "0.16.0-dev.24"
9
+ "@prisma-next/contract": "0.16.0-dev.25",
10
+ "@prisma-next/framework-components": "0.16.0-dev.25",
11
+ "@prisma-next/mongo-contract": "0.16.0-dev.25",
12
+ "@prisma-next/mongo-query-ast": "0.16.0-dev.25",
13
+ "@prisma-next/mongo-query-builder": "0.16.0-dev.25",
14
+ "@prisma-next/mongo-value": "0.16.0-dev.25",
15
+ "@prisma-next/utils": "0.16.0-dev.25"
16
16
  },
17
17
  "devDependencies": {
18
- "@prisma-next/adapter-mongo": "0.16.0-dev.24",
19
- "@prisma-next/driver-mongo": "0.16.0-dev.24",
20
- "@prisma-next/mongo-runtime": "0.16.0-dev.24",
21
- "@prisma-next/target-mongo": "0.16.0-dev.24",
22
- "@prisma-next/test-utils": "0.16.0-dev.24",
23
- "@prisma-next/tsconfig": "0.16.0-dev.24",
24
- "@prisma-next/tsdown": "0.16.0-dev.24",
18
+ "@prisma-next/adapter-mongo": "0.16.0-dev.25",
19
+ "@prisma-next/driver-mongo": "0.16.0-dev.25",
20
+ "@prisma-next/mongo-runtime": "0.16.0-dev.25",
21
+ "@prisma-next/target-mongo": "0.16.0-dev.25",
22
+ "@prisma-next/test-utils": "0.16.0-dev.25",
23
+ "@prisma-next/tsconfig": "0.16.0-dev.25",
24
+ "@prisma-next/tsdown": "0.16.0-dev.25",
25
25
  "mongodb": "^7.4.0",
26
26
  "mongodb-memory-server": "11.2.0",
27
27
  "tsdown": "0.22.8",
package/src/collection.ts CHANGED
@@ -32,7 +32,7 @@ import {
32
32
  } from '@prisma-next/mongo-query-ast/execution';
33
33
  import type { MongoValue } from '@prisma-next/mongo-value';
34
34
  import { MongoParamRef } from '@prisma-next/mongo-value';
35
- import { castAs } from '@prisma-next/utils/casts';
35
+ import { blindCast, castAs } from '@prisma-next/utils/casts';
36
36
  import { InternalError } from '@prisma-next/utils/internal-error';
37
37
  import type { MongoIncludeExpr } from './collection-state';
38
38
  import { emptyCollectionState, type MongoCollectionState } from './collection-state';
@@ -106,7 +106,7 @@ export interface MongoCollection<
106
106
  data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,
107
107
  ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;
108
108
  /** Inserts multiple documents and returns the number inserted. */
109
- createCount(
109
+ createAndCount(
110
110
  data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,
111
111
  ): Promise<number>;
112
112
  /** Updates one matching document via `findOneAndUpdate`. Returns the updated document or `null`. Requires `.where()`. */
@@ -126,9 +126,9 @@ export interface MongoCollection<
126
126
  callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[],
127
127
  ): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;
128
128
  /** Updates all matching documents and returns the number modified. Requires `.where()`. */
129
- updateCount(data: Partial<DefaultModelRow<TContract, ModelName>>): Promise<number>;
129
+ updateAndCount(data: Partial<DefaultModelRow<TContract, ModelName>>): Promise<number>;
130
130
  /** Updates all matching documents using field operations and returns the number modified. Requires `.where()`. */
131
- updateCount(
131
+ updateAndCount(
132
132
  callback: (u: FieldAccessor<TContract, ModelName>) => FieldOperation[],
133
133
  ): Promise<number>;
134
134
  /** Deletes one matching document via `findOneAndDelete`. Returns the deleted document or `null`. Requires `.where()`. */
@@ -136,7 +136,7 @@ export interface MongoCollection<
136
136
  /** Non-atomic: reads matching docs then deletes them. Concurrent writes may cause stale results. Requires `.where()`. */
137
137
  deleteAll(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>>;
138
138
  /** Deletes all matching documents and returns the number deleted. Requires `.where()`. */
139
- deleteCount(): Promise<number>;
139
+ deleteAndCount(): Promise<number>;
140
140
  /**
141
141
  * On insert: `update` fields are applied via `$set`, remaining `create` fields via `$setOnInsert`.
142
142
  * This means `update` values take precedence over `create` for overlapping fields on insert.
@@ -157,6 +157,10 @@ function resolveCollectionName(model: MongoModelDefinition, modelName: string):
157
157
  return model.storage.collection ?? modelName;
158
158
  }
159
159
 
160
+ function isUnknownRecord(value: unknown): value is Record<string, unknown> {
161
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
162
+ }
163
+
160
164
  class MongoCollectionImpl<
161
165
  TContract extends MongoContractWithTypeMaps<MongoContract, AnyMongoTypeMaps>,
162
166
  ModelName extends string & keyof MongoModelsMap<TContract>,
@@ -175,9 +179,10 @@ class MongoCollectionImpl<
175
179
  this.#contract = contract;
176
180
  this.#modelName = modelName;
177
181
  this.#executor = executor;
178
- const model = domainModelsAtDefaultNamespace(contract.domain)[
179
- modelName
180
- ] as MongoModelDefinition;
182
+ const model = blindCast<
183
+ MongoModelDefinition,
184
+ 'modelName is constrained to Mongo contract model keys but namespace lookup erases storage type'
185
+ >(domainModelsAtDefaultNamespace(contract.domain)[modelName]);
181
186
  this.#collectionName = resolveCollectionName(model, modelName);
182
187
  this.#state = emptyCollectionState();
183
188
  }
@@ -185,29 +190,33 @@ class MongoCollectionImpl<
185
190
  variant<V extends VariantNames<TContract, ModelName>>(
186
191
  variantName: V,
187
192
  ): MongoCollection<TContract, ModelName, TIncludes, V> {
188
- const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName] as
189
- | MongoModelDefinition
190
- | undefined;
193
+ const model = blindCast<
194
+ MongoModelDefinition | undefined,
195
+ 'Mongo contract model lookup preserves target storage metadata erased by the namespace helper'
196
+ >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
191
197
  if (!model?.discriminator || !model.variants) {
192
198
  // No polymorphism metadata on this model — return unchanged. Cast required
193
199
  // because TS cannot verify TVariant (the current variant) is assignable to V.
194
- return this as unknown as MongoCollection<TContract, ModelName, TIncludes, V>;
200
+ return blindCast<
201
+ MongoCollection<TContract, ModelName, TIncludes, V>,
202
+ 'no-op variant refinement preserves runtime state while changing only the type-level variant'
203
+ >(this);
195
204
  }
196
205
 
197
- const variantEntry = model.variants[variantName as string];
206
+ const variantEntry = model.variants[variantName];
198
207
  if (!variantEntry) {
199
208
  // Unknown variant name at runtime — return unchanged. Same cast rationale.
200
- return this as unknown as MongoCollection<TContract, ModelName, TIncludes, V>;
209
+ return blindCast<
210
+ MongoCollection<TContract, ModelName, TIncludes, V>,
211
+ 'unknown variant fallback preserves runtime state while changing only the type-level variant'
212
+ >(this);
201
213
  }
202
214
 
203
215
  const filter = MongoFieldFilter.eq(
204
216
  model.discriminator.field,
205
217
  new MongoParamRef(variantEntry.value),
206
218
  );
207
- return this.#cloneWithVariant<V>(
208
- { filters: [...this.#state.filters, filter] },
209
- variantName as string,
210
- );
219
+ return this.#cloneWithVariant<V>({ filters: [...this.#state.filters, filter] }, variantName);
211
220
  }
212
221
 
213
222
  where(
@@ -216,7 +225,12 @@ class MongoCollectionImpl<
216
225
  if (isMongoFilterExpr(filter)) {
217
226
  return this.#clone({ filters: [...this.#state.filters, filter] });
218
227
  }
219
- const compiled = this.#compileWhereObject(filter as Record<string, unknown>);
228
+ const compiled = this.#compileWhereObject(
229
+ blindCast<
230
+ Record<string, unknown>,
231
+ 'typed Mongo where input is a model-field value record after filter-expression narrowing'
232
+ >(filter),
233
+ );
220
234
  return this.#clone({ filters: [...this.#state.filters, ...compiled] });
221
235
  }
222
236
 
@@ -229,9 +243,10 @@ class MongoCollectionImpl<
229
243
  include<K extends ReferenceRelationKeys<TContract, ModelName> & string>(
230
244
  relationName: K,
231
245
  ): MongoCollection<TContract, ModelName, TIncludes & Record<K, true>, TVariant> {
232
- const model = domainModelsAtDefaultNamespace(this.#contract.domain)[
233
- this.#modelName
234
- ] as MongoModelDefinition;
246
+ const model = blindCast<
247
+ MongoModelDefinition,
248
+ 'modelName is constrained to Mongo contract model keys but namespace lookup erases storage type'
249
+ >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
235
250
  const relation = model.relations?.[relationName];
236
251
  if (!relation) {
237
252
  throw ormError(
@@ -249,7 +264,7 @@ class MongoCollectionImpl<
249
264
  );
250
265
  }
251
266
 
252
- const ref = relation as ContractReferenceRelation;
267
+ const ref: ContractReferenceRelation = relation;
253
268
  const localField = ref.on.localFields[0];
254
269
  const foreignField = ref.on.targetFields[0];
255
270
  if (
@@ -283,20 +298,20 @@ class MongoCollectionImpl<
283
298
  cardinality: ref.cardinality,
284
299
  };
285
300
 
286
- return this.#clone({
287
- includes: [...this.#state.includes, includeExpr],
288
- }) as unknown as MongoCollectionImpl<
289
- TContract,
290
- ModelName,
291
- TIncludes & Record<K, true>,
292
- TVariant
293
- >;
301
+ return blindCast<
302
+ MongoCollection<TContract, ModelName, TIncludes & Record<K, true>, TVariant>,
303
+ 'include clone state contains the appended relation but the generic include refinement is not inferred'
304
+ >(
305
+ this.#clone({
306
+ includes: [...this.#state.includes, includeExpr],
307
+ }),
308
+ );
294
309
  }
295
310
 
296
311
  orderBy(
297
312
  spec: Partial<Record<ModelFieldKeys<TContract, ModelName>, 1 | -1>>,
298
313
  ): MongoCollection<TContract, ModelName, TIncludes, TVariant> {
299
- const merged = { ...this.#state.orderBy, ...(spec as Readonly<Record<string, 1 | -1>>) };
314
+ const merged: Readonly<Record<string, 1 | -1>> = { ...this.#state.orderBy, ...spec };
300
315
  return this.#clone({ orderBy: merged });
301
316
  }
302
317
 
@@ -326,17 +341,24 @@ class MongoCollectionImpl<
326
341
  ): Promise<IncludedRow<TContract, ModelName, TIncludes>> {
327
342
  this.#rejectIncludes('create');
328
343
  const normalized = this.#injectDiscriminator(
329
- this.#stripUndefined(data as Record<string, unknown>),
344
+ this.#stripUndefined(
345
+ blindCast<
346
+ Record<string, unknown>,
347
+ 'resolved Mongo create input is a model-field value record'
348
+ >(data),
349
+ ),
330
350
  );
331
351
  const document = this.#toDocument(normalized);
332
352
  const command = new InsertOneCommand(this.#collectionName, document);
333
353
  const results = await this.#drainPlan(command);
334
- const insertedId = (results[0] as { insertedId: unknown }).insertedId;
335
- return { _id: insertedId, ...normalized } as unknown as IncludedRow<
336
- TContract,
337
- ModelName,
338
- TIncludes
339
- >;
354
+ const insertedId = blindCast<
355
+ { insertedId: unknown },
356
+ 'InsertOneCommand runtime result exposes the server-assigned insertedId'
357
+ >(results[0]).insertedId;
358
+ return blindCast<
359
+ IncludedRow<TContract, ModelName, TIncludes>,
360
+ 'created row combines resolved model input with the server-assigned _id'
361
+ >({ _id: insertedId, ...normalized });
340
362
  }
341
363
 
342
364
  createAll(
@@ -346,33 +368,52 @@ class MongoCollectionImpl<
346
368
  const self = this;
347
369
  async function* gen(): AsyncGenerator<IncludedRow<TContract, ModelName, TIncludes>> {
348
370
  const normalizedRows = data.map((d) =>
349
- self.#injectDiscriminator(self.#stripUndefined(d as Record<string, unknown>)),
371
+ self.#injectDiscriminator(
372
+ self.#stripUndefined(
373
+ blindCast<
374
+ Record<string, unknown>,
375
+ 'resolved Mongo create-all input is a model-field value record'
376
+ >(d),
377
+ ),
378
+ ),
350
379
  );
351
380
  const documents = normalizedRows.map((d) => self.#toDocument(d));
352
381
  const command = new InsertManyCommand(self.#collectionName, documents);
353
382
  const results = await self.#drainPlan(command);
354
- const insertedIds = (results[0] as { insertedIds: readonly unknown[] }).insertedIds;
383
+ const insertedIds = blindCast<
384
+ { insertedIds: readonly unknown[] },
385
+ 'InsertManyCommand runtime result exposes insertedIds in input order'
386
+ >(results[0]).insertedIds;
355
387
  for (let i = 0; i < normalizedRows.length; i++) {
356
- yield { _id: insertedIds[i], ...normalizedRows[i] } as unknown as IncludedRow<
357
- TContract,
358
- ModelName,
359
- TIncludes
360
- >;
388
+ yield blindCast<
389
+ IncludedRow<TContract, ModelName, TIncludes>,
390
+ 'created row combines resolved model input with its server-assigned _id'
391
+ >({ _id: insertedIds[i], ...normalizedRows[i] });
361
392
  }
362
393
  }
363
394
  return new AsyncIterableResult(gen());
364
395
  }
365
396
 
366
- async createCount(
397
+ async createAndCount(
367
398
  data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,
368
399
  ): Promise<number> {
369
- this.#rejectIncludes('createCount');
400
+ this.#rejectIncludes('createAndCount');
370
401
  const documents = data.map((d) =>
371
- this.#toDocument(this.#injectDiscriminator(d as Record<string, unknown>)),
402
+ this.#toDocument(
403
+ this.#injectDiscriminator(
404
+ blindCast<
405
+ Record<string, unknown>,
406
+ 'resolved Mongo create-and-count input is a model-field value record'
407
+ >(d),
408
+ ),
409
+ ),
372
410
  );
373
411
  const command = new InsertManyCommand(this.#collectionName, documents);
374
412
  const results = await this.#drainPlan(command);
375
- return (results[0] as { insertedCount: number }).insertedCount;
413
+ return blindCast<
414
+ { insertedCount: number },
415
+ 'InsertManyCommand runtime result exposes insertedCount'
416
+ >(results[0]).insertedCount;
376
417
  }
377
418
 
378
419
  async update(
@@ -387,7 +428,13 @@ class MongoCollectionImpl<
387
428
  const updateDoc = this.#resolveUpdateDoc(dataOrCallback);
388
429
  const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, false);
389
430
  const results = await this.#drainPlan(command);
390
- return (results[0] as IncludedRow<TContract, ModelName, TIncludes>) ?? null;
431
+ const result = results[0];
432
+ return result === undefined
433
+ ? null
434
+ : blindCast<
435
+ IncludedRow<TContract, ModelName, TIncludes>,
436
+ 'FindOneAndUpdateCommand plan has no resultShape; collection update exposes its raw driver document as IncludedRow'
437
+ >(result);
391
438
  }
392
439
 
393
440
  updateAll(
@@ -416,19 +463,22 @@ class MongoCollectionImpl<
416
463
  return new AsyncIterableResult(gen());
417
464
  }
418
465
 
419
- async updateCount(
466
+ async updateAndCount(
420
467
  dataOrCallback:
421
468
  | Partial<DefaultModelRow<TContract, ModelName>>
422
469
  | ((u: FieldAccessor<TContract, ModelName>) => FieldOperation[]),
423
470
  ): Promise<number> {
424
- this.#requireFilters('updateCount');
425
- this.#rejectWindowing('updateCount');
426
- this.#rejectIncludes('updateCount');
471
+ this.#requireFilters('updateAndCount');
472
+ this.#rejectWindowing('updateAndCount');
473
+ this.#rejectIncludes('updateAndCount');
427
474
  const filter = this.#mergeFilters();
428
475
  const updateDoc = this.#resolveUpdateDoc(dataOrCallback);
429
476
  const command = new UpdateManyCommand(this.#collectionName, filter, updateDoc);
430
477
  const results = await this.#drainPlan(command);
431
- return (results[0] as { modifiedCount: number }).modifiedCount;
478
+ return blindCast<
479
+ { modifiedCount: number },
480
+ 'UpdateManyCommand runtime result exposes modifiedCount'
481
+ >(results[0]).modifiedCount;
432
482
  }
433
483
 
434
484
  async delete(): Promise<IncludedRow<TContract, ModelName, TIncludes> | null> {
@@ -438,7 +488,13 @@ class MongoCollectionImpl<
438
488
  const filter = this.#mergeFilters();
439
489
  const command = new FindOneAndDeleteCommand(this.#collectionName, filter);
440
490
  const results = await this.#drainPlan(command);
441
- return (results[0] as IncludedRow<TContract, ModelName, TIncludes>) ?? null;
491
+ const result = results[0];
492
+ return result === undefined
493
+ ? null
494
+ : blindCast<
495
+ IncludedRow<TContract, ModelName, TIncludes>,
496
+ 'FindOneAndDeleteCommand plan has no resultShape; collection delete exposes its raw driver document as IncludedRow'
497
+ >(result);
442
498
  }
443
499
 
444
500
  deleteAll(): AsyncIterableResult<IncludedRow<TContract, ModelName, TIncludes>> {
@@ -458,14 +514,17 @@ class MongoCollectionImpl<
458
514
  return new AsyncIterableResult(gen());
459
515
  }
460
516
 
461
- async deleteCount(): Promise<number> {
462
- this.#requireFilters('deleteCount');
463
- this.#rejectWindowing('deleteCount');
464
- this.#rejectIncludes('deleteCount');
517
+ async deleteAndCount(): Promise<number> {
518
+ this.#requireFilters('deleteAndCount');
519
+ this.#rejectWindowing('deleteAndCount');
520
+ this.#rejectIncludes('deleteAndCount');
465
521
  const filter = this.#mergeFilters();
466
522
  const command = new DeleteManyCommand(this.#collectionName, filter);
467
523
  const results = await this.#drainPlan(command);
468
- return (results[0] as { deletedCount: number }).deletedCount;
524
+ return blindCast<
525
+ { deletedCount: number },
526
+ 'DeleteManyCommand runtime result exposes deletedCount'
527
+ >(results[0]).deletedCount;
469
528
  }
470
529
 
471
530
  async upsert(input: {
@@ -480,7 +539,12 @@ class MongoCollectionImpl<
480
539
  const filter = this.#mergeFilters();
481
540
 
482
541
  const allCreateFields = this.#toDocument(
483
- this.#injectDiscriminator(input.create as Record<string, unknown>),
542
+ this.#injectDiscriminator(
543
+ blindCast<
544
+ Record<string, unknown>,
545
+ 'resolved Mongo upsert create input is a model-field value record'
546
+ >(input.create),
547
+ ),
484
548
  );
485
549
 
486
550
  let updateDoc: Record<string, Record<string, MongoValue>>;
@@ -507,7 +571,12 @@ class MongoCollectionImpl<
507
571
  this.#wrapFieldOpValue(field, value, operator),
508
572
  );
509
573
  } else {
510
- const setFields = this.#toSetFields(input.update as Record<string, unknown>);
574
+ const setFields = this.#toSetFields(
575
+ blindCast<
576
+ Record<string, unknown>,
577
+ 'resolved Mongo upsert update input is a partial model-field value record'
578
+ >(input.update),
579
+ );
511
580
  updateDoc = {};
512
581
  if (Object.keys(setFields).length > 0) {
513
582
  updateDoc['$set'] = setFields;
@@ -532,7 +601,10 @@ class MongoCollectionImpl<
532
601
 
533
602
  const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, true);
534
603
  const results = await this.#drainPlan(command);
535
- return results[0] as IncludedRow<TContract, ModelName, TIncludes>;
604
+ return blindCast<
605
+ IncludedRow<TContract, ModelName, TIncludes>,
606
+ 'FindOneAndUpdateCommand upsert plan has no resultShape; collection upsert exposes its raw driver document as IncludedRow'
607
+ >(results[0]);
536
608
  }
537
609
 
538
610
  async #readMatchingIds(): Promise<unknown[]> {
@@ -552,7 +624,11 @@ class MongoCollectionImpl<
552
624
  // re-read flow depends on it.
553
625
  const { resultShape: _rs, ...planWithoutShape } = idQuery.#compile();
554
626
  for await (const row of this.#executor.execute(planWithoutShape)) {
555
- ids.push((row as Record<string, unknown>)['_id']);
627
+ const storageRow = blindCast<
628
+ Record<string, unknown>,
629
+ 'Mongo id-prefetch plan without resultShape yields a raw storage row containing _id'
630
+ >(row);
631
+ ids.push(storageRow['_id']);
556
632
  }
557
633
  return ids;
558
634
  }
@@ -563,9 +639,10 @@ class MongoCollectionImpl<
563
639
  }
564
640
 
565
641
  #compile(): MongoQueryPlan<IncludedRow<TContract, ModelName, TIncludes>> {
566
- const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName] as
567
- | MongoModelDefinition
568
- | undefined;
642
+ const model = blindCast<
643
+ MongoModelDefinition | undefined,
644
+ 'Mongo contract model lookup preserves target storage metadata erased by the namespace helper'
645
+ >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
569
646
  if (!model) {
570
647
  throw ormError('ORM.MODEL_UNKNOWN', `Unknown model: "${this.#modelName}".`, {
571
648
  meta: { model: this.#modelName },
@@ -579,7 +656,7 @@ class MongoCollectionImpl<
579
656
  );
580
657
  }
581
658
 
582
- #wrapCommand(command: AnyMongoCommand): MongoQueryPlan {
659
+ #wrapCommand(command: AnyMongoCommand): MongoQueryPlan<unknown> {
583
660
  return { collection: this.#collectionName, command, meta: this.#planMeta() };
584
661
  }
585
662
 
@@ -594,9 +671,10 @@ class MongoCollectionImpl<
594
671
  }
595
672
 
596
673
  #modelFields(): Record<string, ContractField> {
597
- const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName] as
598
- | MongoModelDefinition
599
- | undefined;
674
+ const model = blindCast<
675
+ MongoModelDefinition | undefined,
676
+ 'Mongo contract model lookup preserves target storage metadata erased by the namespace helper'
677
+ >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
600
678
  return model?.fields ?? {};
601
679
  }
602
680
 
@@ -625,10 +703,22 @@ class MongoCollectionImpl<
625
703
 
626
704
  if (field.many && Array.isArray(value)) {
627
705
  return value.map((item) =>
628
- this.#wrapValueObject(item as Record<string, unknown>, voDef),
629
- ) as unknown as MongoValue;
706
+ this.#wrapValueObject(
707
+ blindCast<
708
+ Record<string, unknown>,
709
+ 'contract-typed value-object array elements are field-value records'
710
+ >(item),
711
+ voDef,
712
+ ),
713
+ );
630
714
  }
631
- return this.#wrapValueObject(value as Record<string, unknown>, voDef);
715
+ return this.#wrapValueObject(
716
+ blindCast<
717
+ Record<string, unknown>,
718
+ 'contract-typed value-object input is a field-value record'
719
+ >(value),
720
+ voDef,
721
+ );
632
722
  }
633
723
 
634
724
  return new MongoParamRef(value);
@@ -709,7 +799,12 @@ class MongoCollectionImpl<
709
799
  this.#wrapFieldOpValue(field, value, operator),
710
800
  );
711
801
  }
712
- return this.#toUpdateDocument(dataOrCallback as Record<string, unknown>);
802
+ return this.#toUpdateDocument(
803
+ blindCast<
804
+ Record<string, unknown>,
805
+ 'partial Mongo update input is a model-field value record after callback narrowing'
806
+ >(dataOrCallback),
807
+ );
713
808
  }
714
809
 
715
810
  #wrapFieldOpValue(field: string, value: MongoValue, operator?: string): MongoValue {
@@ -730,11 +825,11 @@ class MongoCollectionImpl<
730
825
 
731
826
  if (contractField.type.kind === 'valueObject' && value instanceof MongoParamRef) {
732
827
  const raw = value.value;
733
- if (typeof raw === 'object' && raw !== null && !Array.isArray(raw)) {
828
+ if (isUnknownRecord(raw)) {
734
829
  const voName = contractField.type.name;
735
830
  const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];
736
831
  if (voDef) {
737
- return this.#wrapValueObject(raw as Record<string, unknown>, voDef);
832
+ return this.#wrapValueObject(raw, voDef);
738
833
  }
739
834
  }
740
835
  }
@@ -762,11 +857,11 @@ class MongoCollectionImpl<
762
857
 
763
858
  if (currentField?.type.kind === 'valueObject' && value instanceof MongoParamRef) {
764
859
  const raw = value.value;
765
- if (typeof raw === 'object' && raw !== null && !Array.isArray(raw)) {
860
+ if (isUnknownRecord(raw)) {
766
861
  const voName = currentField.type.name;
767
862
  const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];
768
863
  if (voDef) {
769
- return this.#wrapValueObject(raw as Record<string, unknown>, voDef);
864
+ return this.#wrapValueObject(raw, voDef);
770
865
  }
771
866
  }
772
867
  }
@@ -826,9 +921,10 @@ class MongoCollectionImpl<
826
921
 
827
922
  #injectDiscriminator(data: Record<string, unknown>): Record<string, unknown> {
828
923
  if (!this.#variantName) return data;
829
- const model = domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName] as
830
- | MongoModelDefinition
831
- | undefined;
924
+ const model = blindCast<
925
+ MongoModelDefinition | undefined,
926
+ 'Mongo contract model lookup preserves target storage metadata erased by the namespace helper'
927
+ >(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
832
928
  if (!model?.discriminator || !model.variants) return data;
833
929
  const variantEntry = model.variants[this.#variantName];
834
930
  if (!variantEntry) return data;