@prisma/orm-family-mongo 0.16.0-dev.36
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/LICENSE +201 -0
- package/README.md +27 -0
- package/dist/authoring-entity-types-BGtkMyoN-D32kzx28.mjs +176 -0
- package/dist/authoring-entity-types-BGtkMyoN-D32kzx28.mjs.map +1 -0
- package/dist/canonicalization-hooks-DF3Z6sjO.mjs +22 -0
- package/dist/canonicalization-hooks-DF3Z6sjO.mjs.map +1 -0
- package/dist/codec.d.mts +2 -0
- package/dist/codec.mjs +2 -0
- package/dist/config-types-CFDf9ivE.mjs +37 -0
- package/dist/config-types-CFDf9ivE.mjs.map +1 -0
- package/dist/config-types-CQOf5N7R.d.mts +12 -0
- package/dist/config-types-CQOf5N7R.d.mts.map +1 -0
- package/dist/contract-builder-BFq0gOMV.mjs +634 -0
- package/dist/contract-builder-BFq0gOMV.mjs.map +1 -0
- package/dist/contract-builder-DB8nguDE.d.mts +445 -0
- package/dist/contract-builder-DB8nguDE.d.mts.map +1 -0
- package/dist/contract-errors-BCN6RVI5-kMurtAbI.mjs +9 -0
- package/dist/contract-errors-BCN6RVI5-kMurtAbI.mjs.map +1 -0
- package/dist/contract-psl.d.mts +45 -0
- package/dist/contract-psl.d.mts.map +1 -0
- package/dist/contract-psl.mjs +2 -0
- package/dist/contract-psl__provider.d.mts +15 -0
- package/dist/contract-psl__provider.d.mts.map +1 -0
- package/dist/contract-psl__provider.mjs +82 -0
- package/dist/contract-psl__provider.mjs.map +1 -0
- package/dist/contract-ts.d.mts +3 -0
- package/dist/contract-ts.mjs +3 -0
- package/dist/contract-ts__config-types.d.mts +2 -0
- package/dist/contract-ts__config-types.mjs +2 -0
- package/dist/contract-ts__contract-builder.d.mts +2 -0
- package/dist/contract-ts__contract-builder.mjs +2 -0
- package/dist/contract.d.mts +3 -0
- package/dist/contract.mjs +3 -0
- package/dist/contract__canonicalization-hooks.d.mts +9 -0
- package/dist/contract__canonicalization-hooks.d.mts.map +1 -0
- package/dist/contract__canonicalization-hooks.mjs +2 -0
- package/dist/contract__entity-kinds.d.mts +17 -0
- package/dist/contract__entity-kinds.d.mts.map +1 -0
- package/dist/contract__entity-kinds.mjs +2 -0
- package/dist/control-C7-kthr1.d.mts +193 -0
- package/dist/control-C7-kthr1.d.mts.map +1 -0
- package/dist/control-CClR5JMr.mjs +127 -0
- package/dist/control-CClR5JMr.mjs.map +1 -0
- package/dist/control-CFr3tYsg.mjs +398 -0
- package/dist/control-CFr3tYsg.mjs.map +1 -0
- package/dist/control-Cj81sPbj.d.mts +101 -0
- package/dist/control-Cj81sPbj.d.mts.map +1 -0
- package/dist/control-adapter-Db5pT77b.d.mts +83 -0
- package/dist/control-adapter-Db5pT77b.d.mts.map +1 -0
- package/dist/dist-C7Ykq48Q.mjs +19 -0
- package/dist/dist-C7Ykq48Q.mjs.map +1 -0
- package/dist/dist-Czwqx_i3.mjs +58 -0
- package/dist/dist-Czwqx_i3.mjs.map +1 -0
- package/dist/dist-DHrEJnhK.mjs +236 -0
- package/dist/dist-DHrEJnhK.mjs.map +1 -0
- package/dist/dist-Dyp05u64.mjs +1546 -0
- package/dist/dist-Dyp05u64.mjs.map +1 -0
- package/dist/emitter.d.mts +22 -0
- package/dist/emitter.d.mts.map +1 -0
- package/dist/emitter.mjs +2 -0
- package/dist/entity-kinds-B4KNTF8z-DPIuUuuB.mjs +603 -0
- package/dist/entity-kinds-B4KNTF8z-DPIuUuuB.mjs.map +1 -0
- package/dist/execution-CKnUiOfm.d.mts +48 -0
- package/dist/execution-CKnUiOfm.d.mts.map +1 -0
- package/dist/execution-D5XyZ5XS.mjs +1269 -0
- package/dist/execution-D5XyZ5XS.mjs.map +1 -0
- package/dist/exports-Bx-hlnZ3.mjs +209 -0
- package/dist/exports-Bx-hlnZ3.mjs.map +1 -0
- package/dist/exports-CJMh0VTU.mjs +156 -0
- package/dist/exports-CJMh0VTU.mjs.map +1 -0
- package/dist/family.d.mts +10 -0
- package/dist/family.mjs +9 -0
- package/dist/family__control-adapter.d.mts +2 -0
- package/dist/family__control-adapter.mjs +1 -0
- package/dist/family__control.d.mts +2 -0
- package/dist/family__control.mjs +3 -0
- package/dist/family__ir.d.mts +3 -0
- package/dist/family__ir.mjs +4 -0
- package/dist/family__migration.d.mts +2 -0
- package/dist/family__migration.mjs +2 -0
- package/dist/family__pack.d.mts +2 -0
- package/dist/family__pack.mjs +16 -0
- package/dist/family__pack.mjs.map +1 -0
- package/dist/family__runtime.d.mts +3 -0
- package/dist/family__runtime.mjs +2 -0
- package/dist/family__schema-verify.d.mts +2 -0
- package/dist/family__schema-verify.mjs +2 -0
- package/dist/field-accessor-0oUt6RZC-B_Z30uAA.mjs +234 -0
- package/dist/field-accessor-0oUt6RZC-B_Z30uAA.mjs.map +1 -0
- package/dist/field-accessor-DHsAPiW3-BdYCspQC.d.mts +588 -0
- package/dist/field-accessor-DHsAPiW3-BdYCspQC.d.mts.map +1 -0
- package/dist/filter-expressions-Uo8ZdzwB-53qnqceS.mjs +181 -0
- package/dist/filter-expressions-Uo8ZdzwB-53qnqceS.mjs.map +1 -0
- package/dist/index-BR0ue13b.d.mts +136 -0
- package/dist/index-BR0ue13b.d.mts.map +1 -0
- package/dist/index-Cd2zLiU6.d.mts +128 -0
- package/dist/index-Cd2zLiU6.d.mts.map +1 -0
- package/dist/index-DAOkcTCK.d.mts +151 -0
- package/dist/index-DAOkcTCK.d.mts.map +1 -0
- package/dist/index-Dv2PNMiG.d.mts +53 -0
- package/dist/index-Dv2PNMiG.d.mts.map +1 -0
- package/dist/index-DxoO-ywI.d.mts +178 -0
- package/dist/index-DxoO-ywI.d.mts.map +1 -0
- package/dist/index-wKMm41HC.d.mts +30 -0
- package/dist/index-wKMm41HC.d.mts.map +1 -0
- package/dist/interpreter-BxbUTQ3k-ClR98Ned.mjs +1091 -0
- package/dist/interpreter-BxbUTQ3k-ClR98Ned.mjs.map +1 -0
- package/dist/ir-CQrenTYt.d.mts +147 -0
- package/dist/ir-CQrenTYt.d.mts.map +1 -0
- package/dist/ir-Ch2aPr7a.mjs +62 -0
- package/dist/ir-Ch2aPr7a.mjs.map +1 -0
- package/dist/lowering.d.mts +2 -0
- package/dist/lowering.mjs +1 -0
- package/dist/migration-CNDQv5yB.d.mts +50 -0
- package/dist/migration-CNDQv5yB.d.mts.map +1 -0
- package/dist/migration-dcM7u4HG.mjs +52 -0
- package/dist/migration-dcM7u4HG.mjs.map +1 -0
- package/dist/mongo-contract-serializer-Cx7Fae8e-C8ZYPXpc.mjs +119 -0
- package/dist/mongo-contract-serializer-Cx7Fae8e-C8ZYPXpc.mjs.map +1 -0
- package/dist/mongo-contract-view-AnejqfrQ-BaCFT0xm.d.mts +27 -0
- package/dist/mongo-contract-view-AnejqfrQ-BaCFT0xm.d.mts.map +1 -0
- package/dist/mongo-contract-view-rcWzby6f-wRBCUnBt.mjs +17 -0
- package/dist/mongo-contract-view-rcWzby6f-wRBCUnBt.mjs.map +1 -0
- package/dist/mongo-value-set-tNn9-pun-dJYx_rVD.d.mts +536 -0
- package/dist/mongo-value-set-tNn9-pun-dJYx_rVD.d.mts.map +1 -0
- package/dist/mongodb-types-B4HmhF1S.d.mts +2 -0
- package/dist/orm.d.mts +311 -0
- package/dist/orm.d.mts.map +1 -0
- package/dist/orm.mjs +664 -0
- package/dist/orm.mjs.map +1 -0
- package/dist/pack-D9aLY50F.d.mts +44 -0
- package/dist/pack-D9aLY50F.d.mts.map +1 -0
- package/dist/query-ast.d.mts +5 -0
- package/dist/query-ast.mjs +4 -0
- package/dist/query-ast__control.d.mts +4 -0
- package/dist/query-ast__control.mjs +3 -0
- package/dist/query-ast__execution.d.mts +3 -0
- package/dist/query-ast__execution.mjs +3 -0
- package/dist/query-builder.d.mts +836 -0
- package/dist/query-builder.d.mts.map +1 -0
- package/dist/query-builder.mjs +3 -0
- package/dist/query-builder__contract-free.d.mts +83 -0
- package/dist/query-builder__contract-free.d.mts.map +1 -0
- package/dist/query-builder__contract-free.mjs +107 -0
- package/dist/query-builder__contract-free.mjs.map +1 -0
- package/dist/query-plan-C0-Yu8hf-DdilEdW6.d.mts +822 -0
- package/dist/query-plan-C0-Yu8hf-DdilEdW6.d.mts.map +1 -0
- package/dist/runtime-DPkRW4iu.d.mts +1 -0
- package/dist/runtime.d.mts +286 -0
- package/dist/runtime.d.mts.map +1 -0
- package/dist/runtime.mjs +532 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/schema-ir.d.mts +2 -0
- package/dist/schema-ir.mjs +2 -0
- package/dist/schema-verify-DJGr28XW.d.mts +23 -0
- package/dist/schema-verify-DJGr28XW.d.mts.map +1 -0
- package/dist/value.d.mts +2 -0
- package/dist/value.mjs +2 -0
- package/dist/value__mongodb-types.d.mts +2 -0
- package/dist/value__mongodb-types.mjs +1 -0
- package/dist/verify-mongo-schema-De0FG2Rm-CCzwnNPY.mjs +447 -0
- package/dist/verify-mongo-schema-De0FG2Rm-CCzwnNPY.mjs.map +1 -0
- package/dist/wire.d.mts +3 -0
- package/dist/wire.mjs +190 -0
- package/dist/wire.mjs.map +1 -0
- package/package.json +89 -0
package/dist/orm.mjs
ADDED
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
import { t as MongoParamRef } from "./dist-C7Ykq48Q.mjs";
|
|
2
|
+
import { a as MongoFieldFilter, c as isMongoFilterExpr, t as MongoAndExpr } from "./filter-expressions-Uo8ZdzwB-53qnqceS.mjs";
|
|
3
|
+
import { $ as RawInsertOneCommand, A as MongoLookupStage, G as MongoUnwindStage, J as RawDeleteManyCommand, P as MongoProjectStage, Q as RawInsertManyCommand, U as MongoSortStage, V as MongoSkipStage, X as RawFindOneAndDeleteCommand, Y as RawDeleteOneCommand, Z as RawFindOneAndUpdateCommand, a as FindOneAndUpdateCommand, at as freezeMongoResultShape, et as RawUpdateManyCommand, i as FindOneAndDeleteCommand, j as MongoMatchStage, k as MongoLimitStage, n as DeleteManyCommand, nt as UpdateManyCommand, o as InsertManyCommand, q as RawAggregateCommand, s as InsertOneCommand, t as AggregateCommand, tt as RawUpdateOneCommand } from "./execution-D5XyZ5XS.mjs";
|
|
4
|
+
import { a as contractFieldToMongoFieldShape, o as contractModelToMongoResultShape } from "./dist-Dyp05u64.mjs";
|
|
5
|
+
import { structuredError } from "@prisma/orm-framework/utils/structured-error";
|
|
6
|
+
import { domainModelsAtDefaultNamespace, domainValueObjectsAtDefaultNamespace } from "@prisma/orm-framework/contract/types";
|
|
7
|
+
import { blindCast, castAs } from "@prisma/orm-framework/utils/casts";
|
|
8
|
+
import { ifDefined } from "@prisma/orm-framework/utils/defined";
|
|
9
|
+
import { InternalError } from "@prisma/orm-framework/utils/internal-error";
|
|
10
|
+
import { AsyncIterableResult } from "@prisma/orm-framework/components/runtime";
|
|
11
|
+
//#region ../../../2-mongo-family/5-query-builders/orm/dist/index.mjs
|
|
12
|
+
function emptyCollectionState() {
|
|
13
|
+
return {
|
|
14
|
+
filters: [],
|
|
15
|
+
includes: [],
|
|
16
|
+
orderBy: void 0,
|
|
17
|
+
selectedFields: void 0,
|
|
18
|
+
limit: void 0,
|
|
19
|
+
offset: void 0
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function compileIncludes(includes) {
|
|
23
|
+
const stages = [];
|
|
24
|
+
for (const inc of includes) {
|
|
25
|
+
stages.push(new MongoLookupStage({
|
|
26
|
+
from: inc.from,
|
|
27
|
+
localField: inc.localField,
|
|
28
|
+
foreignField: inc.foreignField,
|
|
29
|
+
as: inc.relationName
|
|
30
|
+
}));
|
|
31
|
+
if (inc.cardinality === "N:1" || inc.cardinality === "1:1") stages.push(new MongoUnwindStage(`$${inc.relationName}`, true));
|
|
32
|
+
}
|
|
33
|
+
return stages;
|
|
34
|
+
}
|
|
35
|
+
function compileMongoQuery(collection, state, storageHash, model) {
|
|
36
|
+
const stages = [];
|
|
37
|
+
const singleFilter = state.filters.length === 1 ? state.filters[0] : void 0;
|
|
38
|
+
if (singleFilter) stages.push(new MongoMatchStage(singleFilter));
|
|
39
|
+
else if (state.filters.length > 1) stages.push(new MongoMatchStage(MongoAndExpr.of([...state.filters])));
|
|
40
|
+
if (state.includes.length > 0) stages.push(...compileIncludes(state.includes));
|
|
41
|
+
if (state.orderBy) stages.push(new MongoSortStage(state.orderBy));
|
|
42
|
+
if (state.offset !== void 0) stages.push(new MongoSkipStage(state.offset));
|
|
43
|
+
if (state.limit !== void 0) stages.push(new MongoLimitStage(state.limit));
|
|
44
|
+
if (state.selectedFields && state.selectedFields.length > 0) {
|
|
45
|
+
const projection = {};
|
|
46
|
+
for (const field of state.selectedFields) projection[field] = 1;
|
|
47
|
+
if (!Object.hasOwn(projection, "_id")) projection["_id"] = 0;
|
|
48
|
+
stages.push(new MongoProjectStage(projection));
|
|
49
|
+
}
|
|
50
|
+
const meta = {
|
|
51
|
+
target: "mongo",
|
|
52
|
+
storageHash,
|
|
53
|
+
lane: "mongo-orm"
|
|
54
|
+
};
|
|
55
|
+
const command = new AggregateCommand(collection, stages);
|
|
56
|
+
const selection = state.selectedFields !== void 0 && state.selectedFields.length > 0 ? state.selectedFields : void 0;
|
|
57
|
+
const includeRelationNames = state.includes.length > 0 ? state.includes.map((inc) => inc.relationName) : void 0;
|
|
58
|
+
return {
|
|
59
|
+
collection,
|
|
60
|
+
command,
|
|
61
|
+
meta,
|
|
62
|
+
resultShape: contractModelToMongoResultShape(model, {
|
|
63
|
+
...ifDefined("selection", selection),
|
|
64
|
+
...ifDefined("includeRelationNames", includeRelationNames)
|
|
65
|
+
})
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function createFieldExpression(fieldPath) {
|
|
69
|
+
return {
|
|
70
|
+
set(value) {
|
|
71
|
+
return {
|
|
72
|
+
operator: "$set",
|
|
73
|
+
field: fieldPath,
|
|
74
|
+
value: new MongoParamRef(value)
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
unset() {
|
|
78
|
+
return {
|
|
79
|
+
operator: "$unset",
|
|
80
|
+
field: fieldPath,
|
|
81
|
+
value: new MongoParamRef("")
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
inc(value) {
|
|
85
|
+
return {
|
|
86
|
+
operator: "$inc",
|
|
87
|
+
field: fieldPath,
|
|
88
|
+
value: new MongoParamRef(value)
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
mul(value) {
|
|
92
|
+
return {
|
|
93
|
+
operator: "$mul",
|
|
94
|
+
field: fieldPath,
|
|
95
|
+
value: new MongoParamRef(value)
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
push(value) {
|
|
99
|
+
return {
|
|
100
|
+
operator: "$push",
|
|
101
|
+
field: fieldPath,
|
|
102
|
+
value: new MongoParamRef(value)
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
pull(match) {
|
|
106
|
+
return {
|
|
107
|
+
operator: "$pull",
|
|
108
|
+
field: fieldPath,
|
|
109
|
+
value: new MongoParamRef(match)
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
addToSet(value) {
|
|
113
|
+
return {
|
|
114
|
+
operator: "$addToSet",
|
|
115
|
+
field: fieldPath,
|
|
116
|
+
value: new MongoParamRef(value)
|
|
117
|
+
};
|
|
118
|
+
},
|
|
119
|
+
pop(end) {
|
|
120
|
+
return {
|
|
121
|
+
operator: "$pop",
|
|
122
|
+
field: fieldPath,
|
|
123
|
+
value: new MongoParamRef(end)
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function createFieldAccessor() {
|
|
129
|
+
return new Proxy((() => {}), {
|
|
130
|
+
get(_target, prop) {
|
|
131
|
+
return createFieldExpression(prop);
|
|
132
|
+
},
|
|
133
|
+
apply(_target, _thisArg, args) {
|
|
134
|
+
return createFieldExpression(args[0]);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
function compileFieldOperations(ops, wrapValue) {
|
|
139
|
+
const grouped = {};
|
|
140
|
+
for (const op of ops) {
|
|
141
|
+
let group = grouped[op.operator];
|
|
142
|
+
if (!group) {
|
|
143
|
+
group = {};
|
|
144
|
+
grouped[op.operator] = group;
|
|
145
|
+
}
|
|
146
|
+
group[op.field] = wrapValue(op.field, op.value, op.operator);
|
|
147
|
+
}
|
|
148
|
+
return grouped;
|
|
149
|
+
}
|
|
150
|
+
function ormError(code, message, options) {
|
|
151
|
+
return structuredError(code, message, options);
|
|
152
|
+
}
|
|
153
|
+
function resolveCollectionName(model, modelName) {
|
|
154
|
+
return model.storage.collection ?? modelName;
|
|
155
|
+
}
|
|
156
|
+
function isUnknownRecord(value) {
|
|
157
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
158
|
+
}
|
|
159
|
+
var MongoCollectionImpl = class MongoCollectionImpl {
|
|
160
|
+
#contract;
|
|
161
|
+
#modelName;
|
|
162
|
+
#executor;
|
|
163
|
+
#collectionName;
|
|
164
|
+
#state;
|
|
165
|
+
#variantName;
|
|
166
|
+
constructor(contract, modelName, executor) {
|
|
167
|
+
this.#contract = contract;
|
|
168
|
+
this.#modelName = modelName;
|
|
169
|
+
this.#executor = executor;
|
|
170
|
+
const model = blindCast(domainModelsAtDefaultNamespace(contract.domain)[modelName]);
|
|
171
|
+
this.#collectionName = resolveCollectionName(model, modelName);
|
|
172
|
+
this.#state = emptyCollectionState();
|
|
173
|
+
}
|
|
174
|
+
variant(variantName) {
|
|
175
|
+
const model = blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
|
|
176
|
+
if (!model?.discriminator || !model.variants) return blindCast(this);
|
|
177
|
+
const variantEntry = model.variants[variantName];
|
|
178
|
+
if (!variantEntry) return blindCast(this);
|
|
179
|
+
const filter = MongoFieldFilter.eq(model.discriminator.field, new MongoParamRef(variantEntry.value));
|
|
180
|
+
return this.#cloneWithVariant({ filters: [...this.#state.filters, filter] }, variantName);
|
|
181
|
+
}
|
|
182
|
+
where(filter) {
|
|
183
|
+
if (isMongoFilterExpr(filter)) return this.#clone({ filters: [...this.#state.filters, filter] });
|
|
184
|
+
const compiled = this.#compileWhereObject(blindCast(filter));
|
|
185
|
+
return this.#clone({ filters: [...this.#state.filters, ...compiled] });
|
|
186
|
+
}
|
|
187
|
+
select(...fields) {
|
|
188
|
+
return this.#clone({ selectedFields: [...this.#state.selectedFields ?? [], ...fields] });
|
|
189
|
+
}
|
|
190
|
+
include(relationName) {
|
|
191
|
+
const relation = blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]).relations?.[relationName];
|
|
192
|
+
if (!relation) throw ormError("ORM.RELATION_UNKNOWN", `Unknown relation "${relationName}" on model "${this.#modelName}"`, { meta: {
|
|
193
|
+
model: this.#modelName,
|
|
194
|
+
relation: relationName
|
|
195
|
+
} });
|
|
196
|
+
if (!("on" in relation)) throw ormError("ORM.INCLUDE_UNSUPPORTED", `Relation "${relationName}" is an embed relation — only reference relations can be included`, { meta: {
|
|
197
|
+
model: this.#modelName,
|
|
198
|
+
relation: relationName
|
|
199
|
+
} });
|
|
200
|
+
const ref = relation;
|
|
201
|
+
const localField = ref.on.localFields[0];
|
|
202
|
+
const foreignField = ref.on.targetFields[0];
|
|
203
|
+
if (!localField || !foreignField || ref.on.localFields.length !== 1 || ref.on.targetFields.length !== 1) throw ormError("ORM.INCLUDE_UNSUPPORTED", `Compound references are not yet supported: relation "${relationName}"`, { meta: {
|
|
204
|
+
model: this.#modelName,
|
|
205
|
+
relation: relationName
|
|
206
|
+
} });
|
|
207
|
+
const targetModelName = ref.to.model;
|
|
208
|
+
const targetModel = castAs(domainModelsAtDefaultNamespace(this.#contract.domain)[targetModelName]);
|
|
209
|
+
if (!targetModel) throw new InternalError(`Target model "${targetModelName}" not found for relation "${relationName}"`);
|
|
210
|
+
const includeExpr = {
|
|
211
|
+
relationName,
|
|
212
|
+
from: resolveCollectionName(targetModel, targetModelName),
|
|
213
|
+
localField,
|
|
214
|
+
foreignField,
|
|
215
|
+
cardinality: ref.cardinality
|
|
216
|
+
};
|
|
217
|
+
return blindCast(this.#clone({ includes: [...this.#state.includes, includeExpr] }));
|
|
218
|
+
}
|
|
219
|
+
orderBy(spec) {
|
|
220
|
+
const merged = {
|
|
221
|
+
...this.#state.orderBy,
|
|
222
|
+
...spec
|
|
223
|
+
};
|
|
224
|
+
return this.#clone({ orderBy: merged });
|
|
225
|
+
}
|
|
226
|
+
take(n) {
|
|
227
|
+
return this.#clone({ limit: n });
|
|
228
|
+
}
|
|
229
|
+
skip(n) {
|
|
230
|
+
return this.#clone({ offset: n });
|
|
231
|
+
}
|
|
232
|
+
all() {
|
|
233
|
+
return this.#execute();
|
|
234
|
+
}
|
|
235
|
+
async first() {
|
|
236
|
+
const result = this.#clone({ limit: 1 }).#execute();
|
|
237
|
+
for await (const row of result) return row;
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
async create(data) {
|
|
241
|
+
this.#rejectIncludes("create");
|
|
242
|
+
const normalized = this.#injectDiscriminator(this.#stripUndefined(blindCast(data)));
|
|
243
|
+
const document = this.#toDocument(normalized);
|
|
244
|
+
const command = new InsertOneCommand(this.#collectionName, document);
|
|
245
|
+
const insertedId = blindCast((await this.#drainPlan(command, this.#insertOneResultShape()))[0]).insertedId;
|
|
246
|
+
return blindCast({
|
|
247
|
+
_id: insertedId,
|
|
248
|
+
...normalized
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
createAll(data) {
|
|
252
|
+
this.#rejectIncludes("createAll");
|
|
253
|
+
const self = this;
|
|
254
|
+
async function* gen() {
|
|
255
|
+
const normalizedRows = data.map((d) => self.#injectDiscriminator(self.#stripUndefined(blindCast(d))));
|
|
256
|
+
const documents = normalizedRows.map((d) => self.#toDocument(d));
|
|
257
|
+
const command = new InsertManyCommand(self.#collectionName, documents);
|
|
258
|
+
const insertedIds = blindCast((await self.#drainPlan(command, self.#insertManyResultShape()))[0]).insertedIds;
|
|
259
|
+
for (let i = 0; i < normalizedRows.length; i++) yield blindCast({
|
|
260
|
+
_id: insertedIds[i],
|
|
261
|
+
...normalizedRows[i]
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return new AsyncIterableResult(gen());
|
|
265
|
+
}
|
|
266
|
+
async createAndCount(data) {
|
|
267
|
+
this.#rejectIncludes("createAndCount");
|
|
268
|
+
const documents = data.map((d) => this.#toDocument(this.#injectDiscriminator(blindCast(d))));
|
|
269
|
+
const command = new InsertManyCommand(this.#collectionName, documents);
|
|
270
|
+
return blindCast((await this.#drainPlan(command))[0]).insertedCount;
|
|
271
|
+
}
|
|
272
|
+
async update(dataOrCallback) {
|
|
273
|
+
this.#requireFilters("update");
|
|
274
|
+
this.#rejectWindowing("update");
|
|
275
|
+
this.#rejectIncludes("update");
|
|
276
|
+
const filter = this.#mergeFilters();
|
|
277
|
+
const updateDoc = this.#resolveUpdateDoc(dataOrCallback);
|
|
278
|
+
const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, false);
|
|
279
|
+
const result = (await this.#drainPlan(command, this.#modelResultShape()))[0];
|
|
280
|
+
return result === void 0 ? null : blindCast(result);
|
|
281
|
+
}
|
|
282
|
+
updateAll(dataOrCallback) {
|
|
283
|
+
this.#requireFilters("updateAll");
|
|
284
|
+
this.#rejectWindowing("updateAll");
|
|
285
|
+
const self = this;
|
|
286
|
+
async function* gen() {
|
|
287
|
+
const ids = await self.#readMatchingIds();
|
|
288
|
+
if (ids.length === 0) return;
|
|
289
|
+
const filter = self.#mergeFilters();
|
|
290
|
+
const updateDoc = self.#resolveUpdateDoc(dataOrCallback);
|
|
291
|
+
const command = new UpdateManyCommand(self.#collectionName, filter, updateDoc);
|
|
292
|
+
await self.#drainPlan(command);
|
|
293
|
+
const idFilter = MongoFieldFilter.in("_id", ids.map((id) => new MongoParamRef(id)));
|
|
294
|
+
yield* self.#clone({ filters: [idFilter] }).#execute();
|
|
295
|
+
}
|
|
296
|
+
return new AsyncIterableResult(gen());
|
|
297
|
+
}
|
|
298
|
+
async updateAndCount(dataOrCallback) {
|
|
299
|
+
this.#requireFilters("updateAndCount");
|
|
300
|
+
this.#rejectWindowing("updateAndCount");
|
|
301
|
+
this.#rejectIncludes("updateAndCount");
|
|
302
|
+
const filter = this.#mergeFilters();
|
|
303
|
+
const updateDoc = this.#resolveUpdateDoc(dataOrCallback);
|
|
304
|
+
const command = new UpdateManyCommand(this.#collectionName, filter, updateDoc);
|
|
305
|
+
return blindCast((await this.#drainPlan(command))[0]).modifiedCount;
|
|
306
|
+
}
|
|
307
|
+
async delete() {
|
|
308
|
+
this.#requireFilters("delete");
|
|
309
|
+
this.#rejectWindowing("delete");
|
|
310
|
+
this.#rejectIncludes("delete");
|
|
311
|
+
const filter = this.#mergeFilters();
|
|
312
|
+
const command = new FindOneAndDeleteCommand(this.#collectionName, filter);
|
|
313
|
+
const result = (await this.#drainPlan(command, this.#modelResultShape()))[0];
|
|
314
|
+
return result === void 0 ? null : blindCast(result);
|
|
315
|
+
}
|
|
316
|
+
deleteAll() {
|
|
317
|
+
this.#requireFilters("deleteAll");
|
|
318
|
+
this.#rejectWindowing("deleteAll");
|
|
319
|
+
const self = this;
|
|
320
|
+
async function* gen() {
|
|
321
|
+
const docs = [];
|
|
322
|
+
for await (const row of self.#execute()) docs.push(row);
|
|
323
|
+
const filter = self.#mergeFilters();
|
|
324
|
+
const command = new DeleteManyCommand(self.#collectionName, filter);
|
|
325
|
+
await self.#drainPlan(command);
|
|
326
|
+
yield* docs;
|
|
327
|
+
}
|
|
328
|
+
return new AsyncIterableResult(gen());
|
|
329
|
+
}
|
|
330
|
+
async deleteAndCount() {
|
|
331
|
+
this.#requireFilters("deleteAndCount");
|
|
332
|
+
this.#rejectWindowing("deleteAndCount");
|
|
333
|
+
this.#rejectIncludes("deleteAndCount");
|
|
334
|
+
const filter = this.#mergeFilters();
|
|
335
|
+
const command = new DeleteManyCommand(this.#collectionName, filter);
|
|
336
|
+
return blindCast((await this.#drainPlan(command))[0]).deletedCount;
|
|
337
|
+
}
|
|
338
|
+
async upsert(input) {
|
|
339
|
+
this.#requireFilters("upsert");
|
|
340
|
+
this.#rejectWindowing("upsert");
|
|
341
|
+
this.#rejectIncludes("upsert");
|
|
342
|
+
const filter = this.#mergeFilters();
|
|
343
|
+
const allCreateFields = this.#toDocument(this.#injectDiscriminator(blindCast(input.create)));
|
|
344
|
+
let updateDoc;
|
|
345
|
+
if (typeof input.update === "function") {
|
|
346
|
+
const accessor = createFieldAccessor();
|
|
347
|
+
const ops = input.update(accessor);
|
|
348
|
+
if (ops.find((op) => op.field === "_id")) throw ormError("ORM.FIELD_IMMUTABLE", "Mutation payloads cannot modify `_id`", { meta: { field: "_id" } });
|
|
349
|
+
const dotPathOp = ops.find((op) => op.field.includes("."));
|
|
350
|
+
if (dotPathOp) throw ormError("ORM.OPERATION_UNSUPPORTED", `upsert() does not support dot-path field operations (found "${dotPathOp.field}"). Dot-path updates conflict with \$setOnInsert on the insert path, producing incomplete documents. Use top-level field operations instead.`, { meta: {
|
|
351
|
+
method: "upsert",
|
|
352
|
+
field: dotPathOp.field
|
|
353
|
+
} });
|
|
354
|
+
updateDoc = compileFieldOperations(ops, (field, value, operator) => this.#wrapFieldOpValue(field, value, operator));
|
|
355
|
+
} else {
|
|
356
|
+
const setFields = this.#toSetFields(blindCast(input.update));
|
|
357
|
+
updateDoc = {};
|
|
358
|
+
if (Object.keys(setFields).length > 0) updateDoc["$set"] = setFields;
|
|
359
|
+
}
|
|
360
|
+
const updatedFields = /* @__PURE__ */ new Set();
|
|
361
|
+
for (const operatorGroup of Object.values(updateDoc)) for (const fieldPath of Object.keys(operatorGroup)) updatedFields.add(fieldPath.split(".")[0] ?? fieldPath);
|
|
362
|
+
const insertOnlyFields = {};
|
|
363
|
+
for (const [key, value] of Object.entries(allCreateFields)) if (!updatedFields.has(key)) insertOnlyFields[key] = value;
|
|
364
|
+
if (Object.keys(insertOnlyFields).length > 0) updateDoc["$setOnInsert"] = insertOnlyFields;
|
|
365
|
+
const command = new FindOneAndUpdateCommand(this.#collectionName, filter, updateDoc, true);
|
|
366
|
+
return blindCast((await this.#drainPlan(command, this.#modelResultShape()))[0]);
|
|
367
|
+
}
|
|
368
|
+
async #readMatchingIds() {
|
|
369
|
+
const idQuery = this.#clone({
|
|
370
|
+
includes: [],
|
|
371
|
+
selectedFields: ["_id"],
|
|
372
|
+
orderBy: void 0,
|
|
373
|
+
limit: void 0,
|
|
374
|
+
offset: void 0
|
|
375
|
+
});
|
|
376
|
+
const ids = [];
|
|
377
|
+
const { resultShape: _rs, ...planWithoutShape } = idQuery.#compile();
|
|
378
|
+
for await (const row of this.#executor.execute(planWithoutShape)) {
|
|
379
|
+
const storageRow = blindCast(row);
|
|
380
|
+
ids.push(storageRow["_id"]);
|
|
381
|
+
}
|
|
382
|
+
return ids;
|
|
383
|
+
}
|
|
384
|
+
#execute() {
|
|
385
|
+
const plan = this.#compile();
|
|
386
|
+
return this.#executor.execute(plan);
|
|
387
|
+
}
|
|
388
|
+
#compile() {
|
|
389
|
+
const model = blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
|
|
390
|
+
if (!model) throw ormError("ORM.MODEL_UNKNOWN", `Unknown model: "${this.#modelName}".`, { meta: { model: this.#modelName } });
|
|
391
|
+
return compileMongoQuery(this.#collectionName, this.#state, this.#contract.storage.storageHash, model);
|
|
392
|
+
}
|
|
393
|
+
#wrapCommand(command, resultShape) {
|
|
394
|
+
return {
|
|
395
|
+
collection: this.#collectionName,
|
|
396
|
+
command,
|
|
397
|
+
meta: this.#planMeta(),
|
|
398
|
+
...ifDefined("resultShape", resultShape)
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
async #drainPlan(command, resultShape) {
|
|
402
|
+
const plan = this.#wrapCommand(command, resultShape);
|
|
403
|
+
const result = this.#executor.execute(plan);
|
|
404
|
+
const rows = [];
|
|
405
|
+
for await (const row of result) rows.push(row);
|
|
406
|
+
return rows;
|
|
407
|
+
}
|
|
408
|
+
#modelFields() {
|
|
409
|
+
return blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName])?.fields ?? {};
|
|
410
|
+
}
|
|
411
|
+
#idFieldShape() {
|
|
412
|
+
const idField = this.#modelFields()["_id"];
|
|
413
|
+
return idField ? contractFieldToMongoFieldShape(idField) : Object.freeze({ kind: "unknown" });
|
|
414
|
+
}
|
|
415
|
+
#insertOneResultShape() {
|
|
416
|
+
return freezeMongoResultShape({
|
|
417
|
+
kind: "document",
|
|
418
|
+
fields: { insertedId: this.#idFieldShape() }
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
#insertManyResultShape() {
|
|
422
|
+
return freezeMongoResultShape({
|
|
423
|
+
kind: "document",
|
|
424
|
+
fields: { insertedIds: {
|
|
425
|
+
kind: "array",
|
|
426
|
+
nullable: false,
|
|
427
|
+
element: this.#idFieldShape()
|
|
428
|
+
} }
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
#modelResultShape() {
|
|
432
|
+
const model = blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
|
|
433
|
+
if (!model) return Object.freeze({ kind: "unknown" });
|
|
434
|
+
return contractModelToMongoResultShape(model);
|
|
435
|
+
}
|
|
436
|
+
#compileWhereObject(data) {
|
|
437
|
+
const fields = this.#modelFields();
|
|
438
|
+
const filters = [];
|
|
439
|
+
for (const [key, value] of Object.entries(data)) {
|
|
440
|
+
if (value === void 0) continue;
|
|
441
|
+
const wrapped = this.#wrapFieldValue(value, fields[key]);
|
|
442
|
+
filters.push(MongoFieldFilter.eq(key, wrapped));
|
|
443
|
+
}
|
|
444
|
+
return filters;
|
|
445
|
+
}
|
|
446
|
+
#wrapFieldValue(value, field) {
|
|
447
|
+
if (field === void 0) return new MongoParamRef(value);
|
|
448
|
+
if (field.type.kind === "scalar") return new MongoParamRef(value, { codecId: field.type.codecId });
|
|
449
|
+
if (field.type.kind === "valueObject") {
|
|
450
|
+
const voName = field.type.name;
|
|
451
|
+
const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];
|
|
452
|
+
if (!voDef || value === null) return new MongoParamRef(value);
|
|
453
|
+
if (field.many && Array.isArray(value)) return value.map((item) => this.#wrapValueObject(blindCast(item), voDef));
|
|
454
|
+
return this.#wrapValueObject(blindCast(value), voDef);
|
|
455
|
+
}
|
|
456
|
+
return new MongoParamRef(value);
|
|
457
|
+
}
|
|
458
|
+
#wrapValueObject(data, voDef) {
|
|
459
|
+
const doc = {};
|
|
460
|
+
for (const [key, value] of Object.entries(data)) {
|
|
461
|
+
if (value === void 0) continue;
|
|
462
|
+
const fieldDef = voDef.fields[key];
|
|
463
|
+
doc[key] = this.#wrapFieldValue(value, fieldDef);
|
|
464
|
+
}
|
|
465
|
+
return doc;
|
|
466
|
+
}
|
|
467
|
+
#toDocument(data) {
|
|
468
|
+
const fields = this.#modelFields();
|
|
469
|
+
const doc = {};
|
|
470
|
+
for (const [key, value] of Object.entries(data)) if (value !== void 0) doc[key] = this.#wrapFieldValue(value, fields[key]);
|
|
471
|
+
return doc;
|
|
472
|
+
}
|
|
473
|
+
#toSetFields(data) {
|
|
474
|
+
const fields = this.#modelFields();
|
|
475
|
+
const result = {};
|
|
476
|
+
for (const [key, value] of Object.entries(data)) {
|
|
477
|
+
if (key === "_id" && value !== void 0) throw ormError("ORM.FIELD_IMMUTABLE", "Mutation payloads cannot modify `_id`", { meta: { field: "_id" } });
|
|
478
|
+
if (value !== void 0) result[key] = this.#wrapFieldValue(value, fields[key]);
|
|
479
|
+
}
|
|
480
|
+
return result;
|
|
481
|
+
}
|
|
482
|
+
#stripUndefined(data) {
|
|
483
|
+
const result = {};
|
|
484
|
+
for (const [key, value] of Object.entries(data)) if (value !== void 0) result[key] = value;
|
|
485
|
+
return result;
|
|
486
|
+
}
|
|
487
|
+
#toUpdateDocument(data) {
|
|
488
|
+
return { $set: this.#toSetFields(data) };
|
|
489
|
+
}
|
|
490
|
+
#resolveUpdateDoc(dataOrCallback) {
|
|
491
|
+
if (typeof dataOrCallback === "function") {
|
|
492
|
+
const ops = dataOrCallback(createFieldAccessor());
|
|
493
|
+
if (ops.find((op) => op.field === "_id")) throw ormError("ORM.FIELD_IMMUTABLE", "Mutation payloads cannot modify `_id`", { meta: { field: "_id" } });
|
|
494
|
+
if (ops.length === 0) return { $set: {} };
|
|
495
|
+
return compileFieldOperations(ops, (field, value, operator) => this.#wrapFieldOpValue(field, value, operator));
|
|
496
|
+
}
|
|
497
|
+
return this.#toUpdateDocument(blindCast(dataOrCallback));
|
|
498
|
+
}
|
|
499
|
+
#wrapFieldOpValue(field, value, operator) {
|
|
500
|
+
if (operator === "$unset") return value;
|
|
501
|
+
const topLevelField = field.split(".")[0] ?? field;
|
|
502
|
+
const contractField = this.#modelFields()[topLevelField];
|
|
503
|
+
if (!contractField) return value;
|
|
504
|
+
if (field.includes(".")) return this.#wrapDotPathValue(field, value);
|
|
505
|
+
if (value instanceof MongoParamRef && contractField.type.kind === "scalar") return new MongoParamRef(value.value, { codecId: contractField.type.codecId });
|
|
506
|
+
if (contractField.type.kind === "valueObject" && value instanceof MongoParamRef) {
|
|
507
|
+
const raw = value.value;
|
|
508
|
+
if (isUnknownRecord(raw)) {
|
|
509
|
+
const voName = contractField.type.name;
|
|
510
|
+
const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];
|
|
511
|
+
if (voDef) return this.#wrapValueObject(raw, voDef);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
return value;
|
|
515
|
+
}
|
|
516
|
+
#wrapDotPathValue(dotPath, value) {
|
|
517
|
+
const parts = dotPath.split(".");
|
|
518
|
+
const fields = this.#modelFields();
|
|
519
|
+
let currentField = parts[0] ? fields[parts[0]] : void 0;
|
|
520
|
+
for (let i = 1; i < parts.length; i++) {
|
|
521
|
+
if (currentField?.type.kind !== "valueObject") return value;
|
|
522
|
+
const voName = currentField.type.name;
|
|
523
|
+
const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];
|
|
524
|
+
if (!voDef) return value;
|
|
525
|
+
const partKey = parts[i];
|
|
526
|
+
currentField = partKey ? voDef.fields[partKey] : void 0;
|
|
527
|
+
}
|
|
528
|
+
if (currentField?.type.kind === "scalar" && value instanceof MongoParamRef) return new MongoParamRef(value.value, { codecId: currentField.type.codecId });
|
|
529
|
+
if (currentField?.type.kind === "valueObject" && value instanceof MongoParamRef) {
|
|
530
|
+
const raw = value.value;
|
|
531
|
+
if (isUnknownRecord(raw)) {
|
|
532
|
+
const voName = currentField.type.name;
|
|
533
|
+
const voDef = domainValueObjectsAtDefaultNamespace(this.#contract.domain)?.[voName];
|
|
534
|
+
if (voDef) return this.#wrapValueObject(raw, voDef);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
return value;
|
|
538
|
+
}
|
|
539
|
+
#mergeFilters() {
|
|
540
|
+
const [single] = this.#state.filters;
|
|
541
|
+
if (this.#state.filters.length === 1 && single) return single;
|
|
542
|
+
return MongoAndExpr.of([...this.#state.filters]);
|
|
543
|
+
}
|
|
544
|
+
#requireFilters(methodName) {
|
|
545
|
+
if (this.#state.filters.length === 0) throw ormError("ORM.WHERE_MISSING", `${methodName}() requires a .where() filter. Call .where() before .${methodName}()`, { meta: { method: methodName } });
|
|
546
|
+
}
|
|
547
|
+
#rejectWindowing(methodName) {
|
|
548
|
+
if (this.#state.orderBy !== void 0 || this.#state.limit !== void 0 || this.#state.offset !== void 0) throw ormError("ORM.OPERATION_UNSUPPORTED", `${methodName}() does not support orderBy/skip/take. Remove windowing before calling .${methodName}()`, { meta: {
|
|
549
|
+
method: methodName,
|
|
550
|
+
reason: "windowing"
|
|
551
|
+
} });
|
|
552
|
+
}
|
|
553
|
+
#rejectIncludes(methodName) {
|
|
554
|
+
if (this.#state.includes.length > 0) throw ormError("ORM.OPERATION_UNSUPPORTED", `${methodName}() does not support .include(). Remove includes before calling .${methodName}()`, { meta: {
|
|
555
|
+
method: methodName,
|
|
556
|
+
reason: "includes"
|
|
557
|
+
} });
|
|
558
|
+
}
|
|
559
|
+
#planMeta() {
|
|
560
|
+
return {
|
|
561
|
+
target: "mongo",
|
|
562
|
+
storageHash: this.#contract.storage.storageHash,
|
|
563
|
+
lane: "mongo-orm"
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
#injectDiscriminator(data) {
|
|
567
|
+
if (!this.#variantName) return data;
|
|
568
|
+
const model = blindCast(domainModelsAtDefaultNamespace(this.#contract.domain)[this.#modelName]);
|
|
569
|
+
if (!model?.discriminator || !model.variants) return data;
|
|
570
|
+
const variantEntry = model.variants[this.#variantName];
|
|
571
|
+
if (!variantEntry) return data;
|
|
572
|
+
return {
|
|
573
|
+
...data,
|
|
574
|
+
[model.discriminator.field]: variantEntry.value
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
#clone(overrides) {
|
|
578
|
+
const instance = new MongoCollectionImpl(this.#contract, this.#modelName, this.#executor);
|
|
579
|
+
instance.#state = {
|
|
580
|
+
...this.#state,
|
|
581
|
+
...overrides
|
|
582
|
+
};
|
|
583
|
+
instance.#collectionName = this.#collectionName;
|
|
584
|
+
instance.#variantName = this.#variantName;
|
|
585
|
+
return instance;
|
|
586
|
+
}
|
|
587
|
+
#cloneWithVariant(overrides, variantName) {
|
|
588
|
+
const instance = new MongoCollectionImpl(this.#contract, this.#modelName, this.#executor);
|
|
589
|
+
instance.#state = {
|
|
590
|
+
...this.#state,
|
|
591
|
+
...overrides
|
|
592
|
+
};
|
|
593
|
+
instance.#collectionName = this.#collectionName;
|
|
594
|
+
instance.#variantName = variantName;
|
|
595
|
+
return instance;
|
|
596
|
+
}
|
|
597
|
+
};
|
|
598
|
+
function createMongoCollection(contract, modelName, executor) {
|
|
599
|
+
return new MongoCollectionImpl(contract, modelName, executor);
|
|
600
|
+
}
|
|
601
|
+
function mongoOrm(options) {
|
|
602
|
+
const { contract, executor } = options;
|
|
603
|
+
const client = {};
|
|
604
|
+
for (const [rootName, rootRef] of Object.entries(contract.roots)) client[rootName] = createMongoCollection(contract, blindCast(rootRef.model), executor);
|
|
605
|
+
return client;
|
|
606
|
+
}
|
|
607
|
+
function createRawMongoCollection(collectionName, meta) {
|
|
608
|
+
function buildable(command) {
|
|
609
|
+
return { build: () => ({
|
|
610
|
+
collection: collectionName,
|
|
611
|
+
command,
|
|
612
|
+
meta
|
|
613
|
+
}) };
|
|
614
|
+
}
|
|
615
|
+
return {
|
|
616
|
+
aggregate(pipeline) {
|
|
617
|
+
return buildable(new RawAggregateCommand(collectionName, pipeline));
|
|
618
|
+
},
|
|
619
|
+
insertOne(document) {
|
|
620
|
+
return buildable(new RawInsertOneCommand(collectionName, document));
|
|
621
|
+
},
|
|
622
|
+
insertMany(documents) {
|
|
623
|
+
return buildable(new RawInsertManyCommand(collectionName, documents));
|
|
624
|
+
},
|
|
625
|
+
updateOne(filter, update) {
|
|
626
|
+
return buildable(new RawUpdateOneCommand(collectionName, filter, update));
|
|
627
|
+
},
|
|
628
|
+
updateMany(filter, update) {
|
|
629
|
+
return buildable(new RawUpdateManyCommand(collectionName, filter, update));
|
|
630
|
+
},
|
|
631
|
+
deleteOne(filter) {
|
|
632
|
+
return buildable(new RawDeleteOneCommand(collectionName, filter));
|
|
633
|
+
},
|
|
634
|
+
deleteMany(filter) {
|
|
635
|
+
return buildable(new RawDeleteManyCommand(collectionName, filter));
|
|
636
|
+
},
|
|
637
|
+
findOneAndUpdate(filter, update, options) {
|
|
638
|
+
return buildable(new RawFindOneAndUpdateCommand(collectionName, filter, update, options?.upsert ?? false));
|
|
639
|
+
},
|
|
640
|
+
findOneAndDelete(filter) {
|
|
641
|
+
return buildable(new RawFindOneAndDeleteCommand(collectionName, filter));
|
|
642
|
+
}
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
function mongoRaw(options) {
|
|
646
|
+
const { contract } = options;
|
|
647
|
+
return { collection(rootName) {
|
|
648
|
+
const modelName = contract.roots[rootName]?.model;
|
|
649
|
+
const models = domainModelsAtDefaultNamespace(contract.domain);
|
|
650
|
+
if (!modelName || !Object.hasOwn(models, modelName)) throw ormError("ORM.MODEL_UNKNOWN", `Unknown model "${modelName ?? ""}" for root "${rootName}"`, { meta: {
|
|
651
|
+
model: modelName ?? "",
|
|
652
|
+
root: rootName
|
|
653
|
+
} });
|
|
654
|
+
return createRawMongoCollection(models[modelName].storage.collection ?? modelName, {
|
|
655
|
+
target: "mongo",
|
|
656
|
+
storageHash: contract.storage.storageHash,
|
|
657
|
+
lane: "mongo-raw"
|
|
658
|
+
});
|
|
659
|
+
} };
|
|
660
|
+
}
|
|
661
|
+
//#endregion
|
|
662
|
+
export { compileMongoQuery, createFieldAccessor, createMongoCollection, mongoOrm, mongoRaw };
|
|
663
|
+
|
|
664
|
+
//# sourceMappingURL=orm.mjs.map
|