@prisma-next/mongo-orm 0.16.0-dev.24 → 0.16.0-dev.26
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 +4 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +52 -43
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -15
- package/src/collection.ts +180 -84
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
package/dist/index.d.mts.map
CHANGED
|
@@ -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
|
-
|
|
250
|
-
|
|
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
|
|
270
|
-
this.#rejectIncludes("
|
|
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
|
-
|
|
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
|
|
301
|
-
this.#requireFilters("
|
|
302
|
-
this.#rejectWindowing("
|
|
303
|
-
this.#rejectIncludes("
|
|
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
|
-
|
|
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
|
|
332
|
-
this.#requireFilters("
|
|
333
|
-
this.#rejectWindowing("
|
|
334
|
-
this.#rejectIncludes("
|
|
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))
|
|
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 (
|
|
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 (
|
|
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;
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "0.16.0-dev.26",
|
|
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.
|
|
10
|
-
"@prisma-next/framework-components": "0.16.0-dev.
|
|
11
|
-
"@prisma-next/mongo-contract": "0.16.0-dev.
|
|
12
|
-
"@prisma-next/mongo-query-ast": "0.16.0-dev.
|
|
13
|
-
"@prisma-next/mongo-query-builder": "0.16.0-dev.
|
|
14
|
-
"@prisma-next/mongo-value": "0.16.0-dev.
|
|
15
|
-
"@prisma-next/utils": "0.16.0-dev.
|
|
9
|
+
"@prisma-next/contract": "0.16.0-dev.26",
|
|
10
|
+
"@prisma-next/framework-components": "0.16.0-dev.26",
|
|
11
|
+
"@prisma-next/mongo-contract": "0.16.0-dev.26",
|
|
12
|
+
"@prisma-next/mongo-query-ast": "0.16.0-dev.26",
|
|
13
|
+
"@prisma-next/mongo-query-builder": "0.16.0-dev.26",
|
|
14
|
+
"@prisma-next/mongo-value": "0.16.0-dev.26",
|
|
15
|
+
"@prisma-next/utils": "0.16.0-dev.26"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@prisma-next/adapter-mongo": "0.16.0-dev.
|
|
19
|
-
"@prisma-next/driver-mongo": "0.16.0-dev.
|
|
20
|
-
"@prisma-next/mongo-runtime": "0.16.0-dev.
|
|
21
|
-
"@prisma-next/target-mongo": "0.16.0-dev.
|
|
22
|
-
"@prisma-next/test-utils": "0.16.0-dev.
|
|
23
|
-
"@prisma-next/tsconfig": "0.16.0-dev.
|
|
24
|
-
"@prisma-next/tsdown": "0.16.0-dev.
|
|
18
|
+
"@prisma-next/adapter-mongo": "0.16.0-dev.26",
|
|
19
|
+
"@prisma-next/driver-mongo": "0.16.0-dev.26",
|
|
20
|
+
"@prisma-next/mongo-runtime": "0.16.0-dev.26",
|
|
21
|
+
"@prisma-next/target-mongo": "0.16.0-dev.26",
|
|
22
|
+
"@prisma-next/test-utils": "0.16.0-dev.26",
|
|
23
|
+
"@prisma-next/tsconfig": "0.16.0-dev.26",
|
|
24
|
+
"@prisma-next/tsdown": "0.16.0-dev.26",
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
179
|
-
|
|
180
|
-
|
|
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 =
|
|
189
|
-
|
|
|
190
|
-
|
|
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
|
|
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
|
|
206
|
+
const variantEntry = model.variants[variantName];
|
|
198
207
|
if (!variantEntry) {
|
|
199
208
|
// Unknown variant name at runtime — return unchanged. Same cast rationale.
|
|
200
|
-
return
|
|
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(
|
|
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 =
|
|
233
|
-
|
|
234
|
-
|
|
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
|
|
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
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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, ...
|
|
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(
|
|
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 =
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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(
|
|
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 =
|
|
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
|
|
357
|
-
TContract,
|
|
358
|
-
|
|
359
|
-
|
|
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
|
|
397
|
+
async createAndCount(
|
|
367
398
|
data: ReadonlyArray<ResolvedCreateInput<TContract, ModelName, TVariant>>,
|
|
368
399
|
): Promise<number> {
|
|
369
|
-
this.#rejectIncludes('
|
|
400
|
+
this.#rejectIncludes('createAndCount');
|
|
370
401
|
const documents = data.map((d) =>
|
|
371
|
-
this.#toDocument(
|
|
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
|
|
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
|
-
|
|
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
|
|
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('
|
|
425
|
-
this.#rejectWindowing('
|
|
426
|
-
this.#rejectIncludes('
|
|
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
|
|
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
|
-
|
|
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
|
|
462
|
-
this.#requireFilters('
|
|
463
|
-
this.#rejectWindowing('
|
|
464
|
-
this.#rejectIncludes('
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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
|
-
|
|
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 =
|
|
567
|
-
|
|
|
568
|
-
|
|
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 =
|
|
598
|
-
|
|
|
599
|
-
|
|
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(
|
|
629
|
-
|
|
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(
|
|
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(
|
|
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 (
|
|
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
|
|
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 (
|
|
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
|
|
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 =
|
|
830
|
-
|
|
|
831
|
-
|
|
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;
|