@farming-labs/orm-mongoose 0.0.21 → 0.0.24
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.cjs +60 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +60 -14
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -33,6 +33,17 @@ function getManifest(schema) {
|
|
|
33
33
|
manifestCache.set(schema, next);
|
|
34
34
|
return next;
|
|
35
35
|
}
|
|
36
|
+
function assertSupportedNumericIdGeneration(schema) {
|
|
37
|
+
const manifest = getManifest(schema);
|
|
38
|
+
for (const model of Object.values(manifest.models)) {
|
|
39
|
+
const idField = model.fields.id;
|
|
40
|
+
if (idField?.kind === "id" && idField.idType === "integer" && idField.generated === "increment") {
|
|
41
|
+
throw new Error(
|
|
42
|
+
`The Mongoose runtime does not support generated integer ids for model "${model.name}". Use manual numeric ids or a string id instead.`
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
36
47
|
function identityField(model) {
|
|
37
48
|
if (model.fields.id) return model.fields.id;
|
|
38
49
|
const uniqueField = Object.values(model.fields).find((field) => field.unique);
|
|
@@ -110,6 +121,10 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
110
121
|
}
|
|
111
122
|
return model;
|
|
112
123
|
}
|
|
124
|
+
function getSupportedManifest(schema) {
|
|
125
|
+
assertSupportedNumericIdGeneration(schema);
|
|
126
|
+
return getManifest(schema);
|
|
127
|
+
}
|
|
113
128
|
function fieldTransform(modelName, fieldName) {
|
|
114
129
|
return config.transforms?.[modelName]?.[fieldName];
|
|
115
130
|
}
|
|
@@ -117,7 +132,9 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
117
132
|
if (value === void 0) return value;
|
|
118
133
|
if (value === null) return null;
|
|
119
134
|
let next = value;
|
|
120
|
-
if (field.kind === "
|
|
135
|
+
if (field.kind === "id" && field.idType === "integer") {
|
|
136
|
+
next = Number(next);
|
|
137
|
+
} else if (field.kind === "enum") {
|
|
121
138
|
next = String(next);
|
|
122
139
|
} else if (field.kind === "boolean") {
|
|
123
140
|
next = Boolean(next);
|
|
@@ -138,6 +155,9 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
138
155
|
if (value === null) return null;
|
|
139
156
|
const transform = fieldTransform(modelName, field.name);
|
|
140
157
|
let next = transform?.decode ? transform.decode(value) : value;
|
|
158
|
+
if (field.kind === "id" && field.idType === "integer") {
|
|
159
|
+
return typeof next === "number" ? next : Number(next);
|
|
160
|
+
}
|
|
141
161
|
if (field.kind === "enum") {
|
|
142
162
|
return typeof next === "string" ? next : String(next);
|
|
143
163
|
}
|
|
@@ -300,7 +320,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
300
320
|
return query.exec();
|
|
301
321
|
}
|
|
302
322
|
async function loadRows(schema, modelName, args) {
|
|
303
|
-
const manifest =
|
|
323
|
+
const manifest = getSupportedManifest(schema);
|
|
304
324
|
const model = manifest.models[modelName];
|
|
305
325
|
const docs = await runFindMany(model, args);
|
|
306
326
|
const rows = docs.map((doc) => decodeRow(model, doc));
|
|
@@ -314,13 +334,13 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
314
334
|
return rows[0] ?? null;
|
|
315
335
|
}
|
|
316
336
|
async function loadRawOneRow(schema, modelName, args) {
|
|
317
|
-
const manifest =
|
|
337
|
+
const manifest = getSupportedManifest(schema);
|
|
318
338
|
const model = manifest.models[modelName];
|
|
319
339
|
const doc = await runFindOne(model, args);
|
|
320
340
|
return doc ? decodeRow(model, doc) : null;
|
|
321
341
|
}
|
|
322
342
|
async function projectRow(schema, modelName, row, select) {
|
|
323
|
-
const manifest =
|
|
343
|
+
const manifest = getSupportedManifest(schema);
|
|
324
344
|
const model = manifest.models[modelName];
|
|
325
345
|
const output = {};
|
|
326
346
|
if (!select) {
|
|
@@ -348,7 +368,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
348
368
|
return output;
|
|
349
369
|
}
|
|
350
370
|
async function resolveRelation(schema, modelName, relationName, row, value) {
|
|
351
|
-
const manifest =
|
|
371
|
+
const manifest = getSupportedManifest(schema);
|
|
352
372
|
const relation = schema.models[modelName].relations[relationName];
|
|
353
373
|
const relationArgs = value === true ? {} : value;
|
|
354
374
|
if (relation.kind === "belongsTo") {
|
|
@@ -487,10 +507,36 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
487
507
|
startSession: config.startSession
|
|
488
508
|
},
|
|
489
509
|
capabilities: {
|
|
510
|
+
numericIds: "manual",
|
|
490
511
|
supportsJSON: true,
|
|
491
512
|
supportsDates: true,
|
|
492
513
|
supportsBooleans: true,
|
|
493
|
-
supportsTransactions: Boolean(config.startSession ?? config.connection?.startSession)
|
|
514
|
+
supportsTransactions: Boolean(config.startSession ?? config.connection?.startSession),
|
|
515
|
+
textComparison: "case-sensitive",
|
|
516
|
+
textMatching: {
|
|
517
|
+
equality: "case-sensitive",
|
|
518
|
+
contains: "case-sensitive",
|
|
519
|
+
ordering: "case-sensitive"
|
|
520
|
+
},
|
|
521
|
+
upsert: "native",
|
|
522
|
+
returning: {
|
|
523
|
+
create: true,
|
|
524
|
+
update: true,
|
|
525
|
+
delete: false
|
|
526
|
+
},
|
|
527
|
+
returningMode: {
|
|
528
|
+
create: "record",
|
|
529
|
+
update: "record",
|
|
530
|
+
delete: "none"
|
|
531
|
+
},
|
|
532
|
+
nativeRelations: {
|
|
533
|
+
singularChains: false,
|
|
534
|
+
hasMany: false,
|
|
535
|
+
manyToMany: false,
|
|
536
|
+
filtered: false,
|
|
537
|
+
ordered: false,
|
|
538
|
+
paginated: false
|
|
539
|
+
}
|
|
494
540
|
}
|
|
495
541
|
}),
|
|
496
542
|
async findMany(schema, model, args) {
|
|
@@ -500,7 +546,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
500
546
|
return loadOneRow(schema, model, args);
|
|
501
547
|
},
|
|
502
548
|
async findUnique(schema, model, args) {
|
|
503
|
-
const manifest =
|
|
549
|
+
const manifest = getSupportedManifest(schema);
|
|
504
550
|
(0, import_orm.requireUniqueLookup)(
|
|
505
551
|
manifest.models[model],
|
|
506
552
|
args.where,
|
|
@@ -509,7 +555,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
509
555
|
return loadOneRow(schema, model, args);
|
|
510
556
|
},
|
|
511
557
|
async count(schema, model, args) {
|
|
512
|
-
const manifest =
|
|
558
|
+
const manifest = getSupportedManifest(schema);
|
|
513
559
|
const result = await execute(
|
|
514
560
|
getModel(model).countDocuments(
|
|
515
561
|
compileWhere(manifest.models[model], args?.where)
|
|
@@ -519,7 +565,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
519
565
|
return Number(result);
|
|
520
566
|
},
|
|
521
567
|
async create(schema, model, args) {
|
|
522
|
-
const manifest =
|
|
568
|
+
const manifest = getSupportedManifest(schema);
|
|
523
569
|
const document = buildDocument(
|
|
524
570
|
manifest.models[model],
|
|
525
571
|
args.data
|
|
@@ -546,7 +592,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
546
592
|
return results;
|
|
547
593
|
},
|
|
548
594
|
async update(schema, model, args) {
|
|
549
|
-
const manifest =
|
|
595
|
+
const manifest = getSupportedManifest(schema);
|
|
550
596
|
const updated = await getModel(model).findOneAndUpdate(
|
|
551
597
|
compileWhere(manifest.models[model], args.where),
|
|
552
598
|
{
|
|
@@ -570,7 +616,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
570
616
|
);
|
|
571
617
|
},
|
|
572
618
|
async updateMany(schema, model, args) {
|
|
573
|
-
const manifest =
|
|
619
|
+
const manifest = getSupportedManifest(schema);
|
|
574
620
|
const update = buildUpdate(
|
|
575
621
|
manifest.models[model],
|
|
576
622
|
args.data
|
|
@@ -589,7 +635,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
589
635
|
return Number(result.modifiedCount ?? result.matchedCount ?? 0);
|
|
590
636
|
},
|
|
591
637
|
async upsert(schema, model, args) {
|
|
592
|
-
const manifest =
|
|
638
|
+
const manifest = getSupportedManifest(schema);
|
|
593
639
|
const modelManifest = manifest.models[model];
|
|
594
640
|
const lookup = (0, import_orm.requireUniqueLookup)(
|
|
595
641
|
modelManifest,
|
|
@@ -636,7 +682,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
636
682
|
);
|
|
637
683
|
},
|
|
638
684
|
async delete(schema, model, args) {
|
|
639
|
-
const manifest =
|
|
685
|
+
const manifest = getSupportedManifest(schema);
|
|
640
686
|
const deleted = await getModel(model).findOneAndDelete(
|
|
641
687
|
compileWhere(manifest.models[model], args.where),
|
|
642
688
|
state.session ? { session: state.session } : void 0
|
|
@@ -644,7 +690,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
644
690
|
return deleted ? 1 : 0;
|
|
645
691
|
},
|
|
646
692
|
async deleteMany(schema, model, args) {
|
|
647
|
-
const manifest =
|
|
693
|
+
const manifest = getSupportedManifest(schema);
|
|
648
694
|
const result = await execute(
|
|
649
695
|
getModel(model).deleteMany(
|
|
650
696
|
compileWhere(manifest.models[model], args.where),
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createDriverHandle,\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindManyArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n type OrmDriverHandle,\n isOperatorFilterObject,\n requireUniqueLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype MongoRow = Record<string, unknown>;\ntype MongoWhere = Where<Record<string, unknown>>;\n\ntype MongooseWriteResult = {\n modifiedCount?: number;\n matchedCount?: number;\n deletedCount?: number;\n};\n\nexport type MongooseSessionLike = {\n withTransaction?<TResult>(run: () => Promise<TResult>): Promise<TResult>;\n startTransaction?(): void;\n commitTransaction?(): Promise<void>;\n abortTransaction?(): Promise<void>;\n endSession?(): Promise<void> | void;\n};\n\nexport type MongooseSessionSourceLike = {\n startSession(): Promise<MongooseSessionLike>;\n};\n\nexport type MongooseQueryLike<TResult> = {\n sort(sort: Record<string, 1 | -1>): MongooseQueryLike<TResult>;\n skip(value: number): MongooseQueryLike<TResult>;\n limit(value: number): MongooseQueryLike<TResult>;\n session(session: MongooseSessionLike): MongooseQueryLike<TResult>;\n lean(): MongooseQueryLike<TResult>;\n exec(): Promise<TResult>;\n};\n\nexport type MongooseExecLike<TResult> = {\n session?(session: MongooseSessionLike): MongooseExecLike<TResult>;\n exec(): Promise<TResult>;\n};\n\nexport type MongooseModelLike = {\n find(filter: Record<string, unknown>): MongooseQueryLike<MongoRow[]>;\n findOne(filter: Record<string, unknown>): MongooseQueryLike<MongoRow | null>;\n countDocuments(filter: Record<string, unknown>): Promise<number> | MongooseExecLike<number>;\n create(\n doc: MongoRow | MongoRow[],\n options?: { session?: MongooseSessionLike },\n ): Promise<MongoRow | MongoRow[]>;\n insertMany?(docs: MongoRow[], options?: { session?: MongooseSessionLike }): Promise<MongoRow[]>;\n updateMany(\n filter: Record<string, unknown>,\n update: { $set: MongoRow },\n options?: { session?: MongooseSessionLike },\n ): Promise<MongooseWriteResult> | MongooseExecLike<MongooseWriteResult>;\n findOneAndUpdate(\n filter: Record<string, unknown>,\n update: { $set?: MongoRow; $setOnInsert?: MongoRow },\n options?: {\n upsert?: boolean;\n new?: boolean;\n returnDocument?: \"after\" | \"before\";\n session?: MongooseSessionLike;\n },\n ): MongooseQueryLike<MongoRow | null>;\n findOneAndDelete(\n filter: Record<string, unknown>,\n options?: { session?: MongooseSessionLike },\n ): MongooseQueryLike<MongoRow | null>;\n deleteMany(\n filter: Record<string, unknown>,\n options?: { session?: MongooseSessionLike },\n ): Promise<MongooseWriteResult> | MongooseExecLike<MongooseWriteResult>;\n};\n\nexport type MongooseFieldTransform = {\n encode?: (value: unknown) => unknown;\n decode?: (value: unknown) => unknown;\n};\n\nexport type MongooseDriverConfig<TSchema extends SchemaDefinition<any>> = {\n models: Record<ModelName<TSchema>, MongooseModelLike>;\n connection?: MongooseSessionSourceLike;\n startSession?: () => Promise<MongooseSessionLike>;\n transforms?: Partial<Record<string, Partial<Record<string, MongooseFieldTransform>>>>;\n};\n\nexport type MongooseDriverClient<TSchema extends SchemaDefinition<any>> = {\n models: Record<ModelName<TSchema>, MongooseModelLike>;\n connection?: MongooseSessionSourceLike;\n startSession?: () => Promise<MongooseSessionLike>;\n};\n\nexport type MongooseDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<\n \"mongoose\",\n MongooseDriverClient<TSchema>\n>;\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the Mongoose runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction escapeRegex(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction mergeWhere(...clauses: Array<MongoWhere | undefined>) {\n const defined = clauses.filter(Boolean) as MongoWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as MongoWhere;\n}\n\nfunction normalizeDecimalString(value: string) {\n const trimmed = value.trim();\n const match = /^(-?\\d+)(?:\\.(\\d+))?$/.exec(trimmed);\n if (!match) {\n return trimmed;\n }\n\n const [, integerPart, fractionalPart] = match;\n if (!fractionalPart) {\n return integerPart;\n }\n\n const normalizedFraction = fractionalPart.replace(/0+$/g, \"\");\n return normalizedFraction.length ? `${integerPart}.${normalizedFraction}` : integerPart;\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction removeOverlappingInsertFields(insertData: MongoRow, updateData: MongoRow) {\n const output: MongoRow = {};\n\n for (const [key, value] of Object.entries(insertData)) {\n if (Object.prototype.hasOwnProperty.call(updateData, key)) continue;\n output[key] = value;\n }\n\n return output;\n}\n\nfunction isExecLike<TResult>(value: unknown): value is MongooseExecLike<TResult> {\n return !!value && typeof value === \"object\" && \"exec\" in value;\n}\n\nasync function execute<TResult>(\n operation: Promise<TResult> | MongooseExecLike<TResult>,\n session?: MongooseSessionLike,\n) {\n if (isExecLike<TResult>(operation)) {\n const query =\n session && typeof operation.session === \"function\" ? operation.session(session) : operation;\n return query.exec();\n }\n return operation;\n}\n\nasync function normalizeCreated(doc: Promise<MongoRow | MongoRow[]>) {\n const result = await doc;\n return Array.isArray(result) ? (result[0] ?? null) : result;\n}\n\nfunction createMongooseDriverInternal<TSchema extends SchemaDefinition<any>>(\n config: MongooseDriverConfig<TSchema>,\n state: {\n session?: MongooseSessionLike;\n } = {},\n): OrmDriver<TSchema, MongooseDriverHandle<TSchema>> {\n function getModel(modelName: ModelName<TSchema>) {\n const model = config.models[modelName];\n if (!model) {\n throw new Error(`No Mongoose model was provided for schema model \"${modelName}\".`);\n }\n return model;\n }\n\n function fieldTransform(modelName: string, fieldName: string) {\n return config.transforms?.[modelName]?.[fieldName];\n }\n\n function encodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n let next = value;\n if (field.kind === \"enum\") {\n next = String(next);\n } else if (field.kind === \"boolean\") {\n next = Boolean(next);\n } else if (field.kind === \"integer\") {\n next = Number(next);\n } else if (field.kind === \"bigint\") {\n next = typeof next === \"bigint\" ? next : BigInt(next as string | number);\n } else if (field.kind === \"decimal\") {\n next = typeof next === \"string\" ? next : String(next);\n } else if (field.kind === \"datetime\") {\n next = next instanceof Date ? next : new Date(String(next));\n }\n\n const transform = fieldTransform(modelName, field.name);\n return transform?.encode ? transform.encode(next) : next;\n }\n\n function decodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n const transform = fieldTransform(modelName, field.name);\n let next = transform?.decode ? transform.decode(value) : value;\n\n if (field.kind === \"enum\") {\n return typeof next === \"string\" ? next : String(next);\n }\n if (field.kind === \"boolean\") {\n return Boolean(next);\n }\n if (field.kind === \"integer\") {\n return typeof next === \"number\" ? next : Number(next);\n }\n if (field.kind === \"bigint\") {\n if (typeof next === \"bigint\") {\n return next;\n }\n if (typeof next === \"number\") {\n return BigInt(Math.trunc(next));\n }\n return BigInt(String(next));\n }\n if (field.kind === \"decimal\") {\n return normalizeDecimalString(typeof next === \"string\" ? next : String(next));\n }\n if (field.kind === \"datetime\") {\n return next instanceof Date ? next : new Date(String(next));\n }\n if (field.kind === \"id\") {\n return typeof next === \"string\" ? next : String(next);\n }\n return next;\n }\n\n function buildDocument(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const doc: MongoRow = {};\n\n for (const field of Object.values(model.fields)) {\n const value = applyDefault(data[field.name], field);\n if (value !== undefined) {\n doc[field.column] = encodeValue(model.name, field, value);\n }\n }\n\n return doc;\n }\n\n function buildUpdate(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const update: MongoRow = {};\n\n for (const [fieldName, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n update[field.column] = encodeValue(model.name, field, value);\n }\n\n return update;\n }\n\n function decodeRow(model: ManifestModel, doc: MongoRow) {\n const output: MongoRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(model.name, field, doc[field.column]);\n }\n\n return output;\n }\n\n function compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n ): Record<string, unknown> {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!isOperatorFilterObject(filter)) {\n return {\n [field.column]: encodeValue(model.name, field, filter),\n };\n }\n\n const operations: Record<string, unknown> = {};\n\n if (\"eq\" in filter) {\n operations.$eq = encodeValue(model.name, field, filter.eq);\n }\n if (\"not\" in filter) {\n operations.$ne = encodeValue(model.name, field, filter.not);\n }\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n operations.$in = values.map((value) => encodeValue(model.name, field, value));\n }\n if (\"contains\" in filter) {\n operations.$regex = new RegExp(escapeRegex(String(filter.contains ?? \"\")));\n }\n if (\"gt\" in filter) {\n operations.$gt = encodeValue(model.name, field, filter.gt);\n }\n if (\"gte\" in filter) {\n operations.$gte = encodeValue(model.name, field, filter.gte);\n }\n if (\"lt\" in filter) {\n operations.$lt = encodeValue(model.name, field, filter.lt);\n }\n if (\"lte\" in filter) {\n operations.$lte = encodeValue(model.name, field, filter.lte);\n }\n\n return {\n [field.column]: operations,\n };\n }\n\n function compileWhere(\n model: ManifestModel,\n where: MongoWhere | undefined,\n ): Record<string, unknown> {\n if (!where) return {};\n\n const clauses: Record<string, unknown>[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const nested = (Array.isArray(value) ? value : [])\n .map((item) => compileWhere(model, item as MongoWhere))\n .filter((item) => Object.keys(item).length > 0);\n if (nested.length) clauses.push({ $and: nested });\n continue;\n }\n\n if (key === \"OR\") {\n const nested = (Array.isArray(value) ? value : [])\n .map((item) => compileWhere(model, item as MongoWhere))\n .filter((item) => Object.keys(item).length > 0);\n if (nested.length) clauses.push({ $or: nested });\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as MongoWhere);\n if (Object.keys(nested).length) clauses.push({ $nor: [nested] });\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value));\n }\n\n if (!clauses.length) return {};\n if (clauses.length === 1) return clauses[0]!;\n return {\n $and: clauses,\n };\n }\n\n function compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n ) {\n if (!orderBy) return undefined;\n\n const output: Record<string, 1 | -1> = {};\n for (const [fieldName, direction] of Object.entries(orderBy)) {\n const field = model.fields[fieldName];\n if (!field) continue;\n output[field.column] = direction === \"desc\" ? -1 : 1;\n }\n\n return Object.keys(output).length ? output : undefined;\n }\n\n async function runFindMany(\n model: ManifestModel,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n ) {\n const query = getModel(model.name as ModelName<TSchema>).find(compileWhere(model, args.where));\n const orderBy = compileOrderBy(model, args.orderBy);\n if (orderBy) query.sort(orderBy);\n if (args.skip !== undefined) query.skip(args.skip);\n if (args.take !== undefined) query.limit(args.take);\n if (state.session) query.session(state.session);\n query.lean();\n return query.exec();\n }\n\n async function runFindOne(\n model: ManifestModel,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const orderBy = compileOrderBy(model, args.orderBy);\n if (orderBy) {\n const rows = await runFindMany(model, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n const query = getModel(model.name as ModelName<TSchema>).findOne(\n compileWhere(model, args.where),\n );\n if (state.session) query.session(state.session);\n query.lean();\n return query.exec();\n }\n\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const docs = await runFindMany(model, args);\n const rows = docs.map((doc) => decodeRow(model, doc));\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const doc = await runFindOne(model, args);\n return doc ? decodeRow(model, doc) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: MongoRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: MongoRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: MongoRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [targetField]: foreignValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as MongoWhere,\n });\n\n const targetIds = throughRows\n .map((item: MongoRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n async function runTransaction<TResult>(\n run: (driver: OrmDriver<TSchema, MongooseDriverHandle<TSchema>>) => Promise<TResult>,\n ) {\n if (state.session) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const startSession =\n config.startSession ?? config.connection?.startSession.bind(config.connection);\n if (!startSession) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const session = await startSession();\n try {\n if (session.withTransaction) {\n return await session.withTransaction(() =>\n run(\n createMongooseDriverInternal(config, {\n session,\n }),\n ),\n );\n }\n\n if (session.startTransaction && session.commitTransaction && session.abortTransaction) {\n session.startTransaction();\n try {\n const result = await run(\n createMongooseDriverInternal(config, {\n session,\n }),\n );\n await session.commitTransaction();\n return result;\n } catch (error) {\n await session.abortTransaction();\n throw error;\n }\n }\n\n return run(\n createMongooseDriverInternal(config, {\n session,\n }),\n );\n } finally {\n await session.endSession?.();\n }\n }\n\n const driver: OrmDriver<TSchema, MongooseDriverHandle<TSchema>> = {\n handle: createDriverHandle({\n kind: \"mongoose\",\n client: {\n models: config.models,\n connection: config.connection,\n startSession: config.startSession,\n },\n capabilities: {\n supportsJSON: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsTransactions: Boolean(config.startSession ?? config.connection?.startSession),\n },\n }),\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const result = await execute(\n getModel(model).countDocuments(\n compileWhere(manifest.models[model], args?.where as MongoWhere | undefined),\n ),\n state.session,\n );\n return Number(result);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const document = buildDocument(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const created = await normalizeCreated(\n state.session\n ? getModel(model).create([document], { session: state.session })\n : getModel(model).create(document),\n );\n if (!created) {\n throw new Error(`Create on model \"${String(model)}\" did not return a document.`);\n }\n const row = decodeRow(manifest.models[model], created);\n return projectRow(schema, model, row, args.select) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n {\n $set: buildUpdate(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n ),\n },\n {\n new: true,\n returnDocument: \"after\",\n session: state.session,\n },\n )\n .lean()\n .exec();\n\n if (!updated) return null;\n\n return projectRow(\n schema,\n model,\n decodeRow(manifest.models[model], updated),\n args.select,\n ) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdate(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n if (!Object.keys(update).length) return 0;\n const result = await execute(\n getModel(model).updateMany(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n {\n $set: update,\n },\n state.session ? { session: state.session } : undefined,\n ),\n state.session,\n );\n return Number(result.modifiedCount ?? result.matchedCount ?? 0);\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const created = buildDocument(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const update = buildUpdate(modelManifest, args.update as Partial<Record<string, unknown>>);\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(modelManifest, args.where as MongoWhere),\n {\n $set: update,\n $setOnInsert: removeOverlappingInsertFields(created, update),\n },\n {\n upsert: true,\n new: true,\n returnDocument: \"after\",\n session: state.session,\n },\n )\n .lean()\n .exec();\n\n if (!updated) {\n throw new Error(`Upsert on model \"${String(model)}\" did not return a document.`);\n }\n\n return projectRow(\n schema,\n model,\n decodeRow(modelManifest, updated),\n args.select,\n ) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const deleted = await getModel(model)\n .findOneAndDelete(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n state.session ? { session: state.session } : undefined,\n )\n .lean()\n .exec();\n return deleted ? 1 : 0;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const result = await execute(\n getModel(model).deleteMany(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n state.session ? { session: state.session } : undefined,\n ),\n state.session,\n );\n return Number(result.deletedCount ?? 0);\n },\n async transaction(_schema, run) {\n return runTransaction(run);\n },\n };\n\n return driver;\n}\n\nexport function createMongooseDriver<TSchema extends SchemaDefinition<any>>(\n config: MongooseDriverConfig<TSchema>,\n) {\n return createMongooseDriverInternal(config);\n}\n"],"mappings":"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","names":["targetField","sourceField","sourceValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createDriverHandle,\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindManyArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n type OrmDriverHandle,\n isOperatorFilterObject,\n requireUniqueLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype MongoRow = Record<string, unknown>;\ntype MongoWhere = Where<Record<string, unknown>>;\n\ntype MongooseWriteResult = {\n modifiedCount?: number;\n matchedCount?: number;\n deletedCount?: number;\n};\n\nexport type MongooseSessionLike = {\n withTransaction?<TResult>(run: () => Promise<TResult>): Promise<TResult>;\n startTransaction?(): void;\n commitTransaction?(): Promise<void>;\n abortTransaction?(): Promise<void>;\n endSession?(): Promise<void> | void;\n};\n\nexport type MongooseSessionSourceLike = {\n startSession(): Promise<MongooseSessionLike>;\n};\n\nexport type MongooseQueryLike<TResult> = {\n sort(sort: Record<string, 1 | -1>): MongooseQueryLike<TResult>;\n skip(value: number): MongooseQueryLike<TResult>;\n limit(value: number): MongooseQueryLike<TResult>;\n session(session: MongooseSessionLike): MongooseQueryLike<TResult>;\n lean(): MongooseQueryLike<TResult>;\n exec(): Promise<TResult>;\n};\n\nexport type MongooseExecLike<TResult> = {\n session?(session: MongooseSessionLike): MongooseExecLike<TResult>;\n exec(): Promise<TResult>;\n};\n\nexport type MongooseModelLike = {\n find(filter: Record<string, unknown>): MongooseQueryLike<MongoRow[]>;\n findOne(filter: Record<string, unknown>): MongooseQueryLike<MongoRow | null>;\n countDocuments(filter: Record<string, unknown>): Promise<number> | MongooseExecLike<number>;\n create(\n doc: MongoRow | MongoRow[],\n options?: { session?: MongooseSessionLike },\n ): Promise<MongoRow | MongoRow[]>;\n insertMany?(docs: MongoRow[], options?: { session?: MongooseSessionLike }): Promise<MongoRow[]>;\n updateMany(\n filter: Record<string, unknown>,\n update: { $set: MongoRow },\n options?: { session?: MongooseSessionLike },\n ): Promise<MongooseWriteResult> | MongooseExecLike<MongooseWriteResult>;\n findOneAndUpdate(\n filter: Record<string, unknown>,\n update: { $set?: MongoRow; $setOnInsert?: MongoRow },\n options?: {\n upsert?: boolean;\n new?: boolean;\n returnDocument?: \"after\" | \"before\";\n session?: MongooseSessionLike;\n },\n ): MongooseQueryLike<MongoRow | null>;\n findOneAndDelete(\n filter: Record<string, unknown>,\n options?: { session?: MongooseSessionLike },\n ): MongooseQueryLike<MongoRow | null>;\n deleteMany(\n filter: Record<string, unknown>,\n options?: { session?: MongooseSessionLike },\n ): Promise<MongooseWriteResult> | MongooseExecLike<MongooseWriteResult>;\n};\n\nexport type MongooseFieldTransform = {\n encode?: (value: unknown) => unknown;\n decode?: (value: unknown) => unknown;\n};\n\nexport type MongooseDriverConfig<TSchema extends SchemaDefinition<any>> = {\n models: Record<ModelName<TSchema>, MongooseModelLike>;\n connection?: MongooseSessionSourceLike;\n startSession?: () => Promise<MongooseSessionLike>;\n transforms?: Partial<Record<string, Partial<Record<string, MongooseFieldTransform>>>>;\n};\n\nexport type MongooseDriverClient<TSchema extends SchemaDefinition<any>> = {\n models: Record<ModelName<TSchema>, MongooseModelLike>;\n connection?: MongooseSessionSourceLike;\n startSession?: () => Promise<MongooseSessionLike>;\n};\n\nexport type MongooseDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<\n \"mongoose\",\n MongooseDriverClient<TSchema>\n>;\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction assertSupportedNumericIdGeneration(schema: SchemaDefinition<any>) {\n const manifest = getManifest(schema);\n\n for (const model of Object.values(manifest.models)) {\n const idField = model.fields.id;\n if (\n idField?.kind === \"id\" &&\n idField.idType === \"integer\" &&\n idField.generated === \"increment\"\n ) {\n throw new Error(\n `The Mongoose runtime does not support generated integer ids for model \"${model.name}\". Use manual numeric ids or a string id instead.`,\n );\n }\n }\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the Mongoose runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction escapeRegex(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction mergeWhere(...clauses: Array<MongoWhere | undefined>) {\n const defined = clauses.filter(Boolean) as MongoWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as MongoWhere;\n}\n\nfunction normalizeDecimalString(value: string) {\n const trimmed = value.trim();\n const match = /^(-?\\d+)(?:\\.(\\d+))?$/.exec(trimmed);\n if (!match) {\n return trimmed;\n }\n\n const [, integerPart, fractionalPart] = match;\n if (!fractionalPart) {\n return integerPart;\n }\n\n const normalizedFraction = fractionalPart.replace(/0+$/g, \"\");\n return normalizedFraction.length ? `${integerPart}.${normalizedFraction}` : integerPart;\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction removeOverlappingInsertFields(insertData: MongoRow, updateData: MongoRow) {\n const output: MongoRow = {};\n\n for (const [key, value] of Object.entries(insertData)) {\n if (Object.prototype.hasOwnProperty.call(updateData, key)) continue;\n output[key] = value;\n }\n\n return output;\n}\n\nfunction isExecLike<TResult>(value: unknown): value is MongooseExecLike<TResult> {\n return !!value && typeof value === \"object\" && \"exec\" in value;\n}\n\nasync function execute<TResult>(\n operation: Promise<TResult> | MongooseExecLike<TResult>,\n session?: MongooseSessionLike,\n) {\n if (isExecLike<TResult>(operation)) {\n const query =\n session && typeof operation.session === \"function\" ? operation.session(session) : operation;\n return query.exec();\n }\n return operation;\n}\n\nasync function normalizeCreated(doc: Promise<MongoRow | MongoRow[]>) {\n const result = await doc;\n return Array.isArray(result) ? (result[0] ?? null) : result;\n}\n\nfunction createMongooseDriverInternal<TSchema extends SchemaDefinition<any>>(\n config: MongooseDriverConfig<TSchema>,\n state: {\n session?: MongooseSessionLike;\n } = {},\n): OrmDriver<TSchema, MongooseDriverHandle<TSchema>> {\n function getModel(modelName: ModelName<TSchema>) {\n const model = config.models[modelName];\n if (!model) {\n throw new Error(`No Mongoose model was provided for schema model \"${modelName}\".`);\n }\n return model;\n }\n\n function getSupportedManifest(schema: TSchema) {\n assertSupportedNumericIdGeneration(schema);\n return getManifest(schema);\n }\n\n function fieldTransform(modelName: string, fieldName: string) {\n return config.transforms?.[modelName]?.[fieldName];\n }\n\n function encodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n let next = value;\n if (field.kind === \"id\" && field.idType === \"integer\") {\n next = Number(next);\n } else if (field.kind === \"enum\") {\n next = String(next);\n } else if (field.kind === \"boolean\") {\n next = Boolean(next);\n } else if (field.kind === \"integer\") {\n next = Number(next);\n } else if (field.kind === \"bigint\") {\n next = typeof next === \"bigint\" ? next : BigInt(next as string | number);\n } else if (field.kind === \"decimal\") {\n next = typeof next === \"string\" ? next : String(next);\n } else if (field.kind === \"datetime\") {\n next = next instanceof Date ? next : new Date(String(next));\n }\n\n const transform = fieldTransform(modelName, field.name);\n return transform?.encode ? transform.encode(next) : next;\n }\n\n function decodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n const transform = fieldTransform(modelName, field.name);\n let next = transform?.decode ? transform.decode(value) : value;\n\n if (field.kind === \"id\" && field.idType === \"integer\") {\n return typeof next === \"number\" ? next : Number(next);\n }\n if (field.kind === \"enum\") {\n return typeof next === \"string\" ? next : String(next);\n }\n if (field.kind === \"boolean\") {\n return Boolean(next);\n }\n if (field.kind === \"integer\") {\n return typeof next === \"number\" ? next : Number(next);\n }\n if (field.kind === \"bigint\") {\n if (typeof next === \"bigint\") {\n return next;\n }\n if (typeof next === \"number\") {\n return BigInt(Math.trunc(next));\n }\n return BigInt(String(next));\n }\n if (field.kind === \"decimal\") {\n return normalizeDecimalString(typeof next === \"string\" ? next : String(next));\n }\n if (field.kind === \"datetime\") {\n return next instanceof Date ? next : new Date(String(next));\n }\n if (field.kind === \"id\") {\n return typeof next === \"string\" ? next : String(next);\n }\n return next;\n }\n\n function buildDocument(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const doc: MongoRow = {};\n\n for (const field of Object.values(model.fields)) {\n const value = applyDefault(data[field.name], field);\n if (value !== undefined) {\n doc[field.column] = encodeValue(model.name, field, value);\n }\n }\n\n return doc;\n }\n\n function buildUpdate(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const update: MongoRow = {};\n\n for (const [fieldName, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n update[field.column] = encodeValue(model.name, field, value);\n }\n\n return update;\n }\n\n function decodeRow(model: ManifestModel, doc: MongoRow) {\n const output: MongoRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(model.name, field, doc[field.column]);\n }\n\n return output;\n }\n\n function compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n ): Record<string, unknown> {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!isOperatorFilterObject(filter)) {\n return {\n [field.column]: encodeValue(model.name, field, filter),\n };\n }\n\n const operations: Record<string, unknown> = {};\n\n if (\"eq\" in filter) {\n operations.$eq = encodeValue(model.name, field, filter.eq);\n }\n if (\"not\" in filter) {\n operations.$ne = encodeValue(model.name, field, filter.not);\n }\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n operations.$in = values.map((value) => encodeValue(model.name, field, value));\n }\n if (\"contains\" in filter) {\n operations.$regex = new RegExp(escapeRegex(String(filter.contains ?? \"\")));\n }\n if (\"gt\" in filter) {\n operations.$gt = encodeValue(model.name, field, filter.gt);\n }\n if (\"gte\" in filter) {\n operations.$gte = encodeValue(model.name, field, filter.gte);\n }\n if (\"lt\" in filter) {\n operations.$lt = encodeValue(model.name, field, filter.lt);\n }\n if (\"lte\" in filter) {\n operations.$lte = encodeValue(model.name, field, filter.lte);\n }\n\n return {\n [field.column]: operations,\n };\n }\n\n function compileWhere(\n model: ManifestModel,\n where: MongoWhere | undefined,\n ): Record<string, unknown> {\n if (!where) return {};\n\n const clauses: Record<string, unknown>[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const nested = (Array.isArray(value) ? value : [])\n .map((item) => compileWhere(model, item as MongoWhere))\n .filter((item) => Object.keys(item).length > 0);\n if (nested.length) clauses.push({ $and: nested });\n continue;\n }\n\n if (key === \"OR\") {\n const nested = (Array.isArray(value) ? value : [])\n .map((item) => compileWhere(model, item as MongoWhere))\n .filter((item) => Object.keys(item).length > 0);\n if (nested.length) clauses.push({ $or: nested });\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as MongoWhere);\n if (Object.keys(nested).length) clauses.push({ $nor: [nested] });\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value));\n }\n\n if (!clauses.length) return {};\n if (clauses.length === 1) return clauses[0]!;\n return {\n $and: clauses,\n };\n }\n\n function compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n ) {\n if (!orderBy) return undefined;\n\n const output: Record<string, 1 | -1> = {};\n for (const [fieldName, direction] of Object.entries(orderBy)) {\n const field = model.fields[fieldName];\n if (!field) continue;\n output[field.column] = direction === \"desc\" ? -1 : 1;\n }\n\n return Object.keys(output).length ? output : undefined;\n }\n\n async function runFindMany(\n model: ManifestModel,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n ) {\n const query = getModel(model.name as ModelName<TSchema>).find(compileWhere(model, args.where));\n const orderBy = compileOrderBy(model, args.orderBy);\n if (orderBy) query.sort(orderBy);\n if (args.skip !== undefined) query.skip(args.skip);\n if (args.take !== undefined) query.limit(args.take);\n if (state.session) query.session(state.session);\n query.lean();\n return query.exec();\n }\n\n async function runFindOne(\n model: ManifestModel,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const orderBy = compileOrderBy(model, args.orderBy);\n if (orderBy) {\n const rows = await runFindMany(model, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n const query = getModel(model.name as ModelName<TSchema>).findOne(\n compileWhere(model, args.where),\n );\n if (state.session) query.session(state.session);\n query.lean();\n return query.exec();\n }\n\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getSupportedManifest(schema);\n const model = manifest.models[modelName];\n const docs = await runFindMany(model, args);\n const rows = docs.map((doc) => decodeRow(model, doc));\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getSupportedManifest(schema);\n const model = manifest.models[modelName];\n const doc = await runFindOne(model, args);\n return doc ? decodeRow(model, doc) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: MongoRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getSupportedManifest(schema);\n const model = manifest.models[modelName];\n const output: MongoRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: MongoRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getSupportedManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [targetField]: foreignValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as MongoWhere,\n });\n\n const targetIds = throughRows\n .map((item: MongoRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n async function runTransaction<TResult>(\n run: (driver: OrmDriver<TSchema, MongooseDriverHandle<TSchema>>) => Promise<TResult>,\n ) {\n if (state.session) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const startSession =\n config.startSession ?? config.connection?.startSession.bind(config.connection);\n if (!startSession) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const session = await startSession();\n try {\n if (session.withTransaction) {\n return await session.withTransaction(() =>\n run(\n createMongooseDriverInternal(config, {\n session,\n }),\n ),\n );\n }\n\n if (session.startTransaction && session.commitTransaction && session.abortTransaction) {\n session.startTransaction();\n try {\n const result = await run(\n createMongooseDriverInternal(config, {\n session,\n }),\n );\n await session.commitTransaction();\n return result;\n } catch (error) {\n await session.abortTransaction();\n throw error;\n }\n }\n\n return run(\n createMongooseDriverInternal(config, {\n session,\n }),\n );\n } finally {\n await session.endSession?.();\n }\n }\n\n const driver: OrmDriver<TSchema, MongooseDriverHandle<TSchema>> = {\n handle: createDriverHandle({\n kind: \"mongoose\",\n client: {\n models: config.models,\n connection: config.connection,\n startSession: config.startSession,\n },\n capabilities: {\n numericIds: \"manual\",\n supportsJSON: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsTransactions: Boolean(config.startSession ?? config.connection?.startSession),\n textComparison: \"case-sensitive\",\n textMatching: {\n equality: \"case-sensitive\",\n contains: \"case-sensitive\",\n ordering: \"case-sensitive\",\n },\n upsert: \"native\",\n returning: {\n create: true,\n update: true,\n delete: false,\n },\n returningMode: {\n create: \"record\",\n update: \"record\",\n delete: \"none\",\n },\n nativeRelations: {\n singularChains: false,\n hasMany: false,\n manyToMany: false,\n filtered: false,\n ordered: false,\n paginated: false,\n },\n },\n }),\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getSupportedManifest(schema);\n const result = await execute(\n getModel(model).countDocuments(\n compileWhere(manifest.models[model], args?.where as MongoWhere | undefined),\n ),\n state.session,\n );\n return Number(result);\n },\n async create(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const document = buildDocument(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const created = await normalizeCreated(\n state.session\n ? getModel(model).create([document], { session: state.session })\n : getModel(model).create(document),\n );\n if (!created) {\n throw new Error(`Create on model \"${String(model)}\" did not return a document.`);\n }\n const row = decodeRow(manifest.models[model], created);\n return projectRow(schema, model, row, args.select) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n {\n $set: buildUpdate(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n ),\n },\n {\n new: true,\n returnDocument: \"after\",\n session: state.session,\n },\n )\n .lean()\n .exec();\n\n if (!updated) return null;\n\n return projectRow(\n schema,\n model,\n decodeRow(manifest.models[model], updated),\n args.select,\n ) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const update = buildUpdate(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n if (!Object.keys(update).length) return 0;\n const result = await execute(\n getModel(model).updateMany(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n {\n $set: update,\n },\n state.session ? { session: state.session } : undefined,\n ),\n state.session,\n );\n return Number(result.modifiedCount ?? result.matchedCount ?? 0);\n },\n async upsert(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const created = buildDocument(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const update = buildUpdate(modelManifest, args.update as Partial<Record<string, unknown>>);\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(modelManifest, args.where as MongoWhere),\n {\n $set: update,\n $setOnInsert: removeOverlappingInsertFields(created, update),\n },\n {\n upsert: true,\n new: true,\n returnDocument: \"after\",\n session: state.session,\n },\n )\n .lean()\n .exec();\n\n if (!updated) {\n throw new Error(`Upsert on model \"${String(model)}\" did not return a document.`);\n }\n\n return projectRow(\n schema,\n model,\n decodeRow(modelManifest, updated),\n args.select,\n ) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const deleted = await getModel(model)\n .findOneAndDelete(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n state.session ? { session: state.session } : undefined,\n )\n .lean()\n .exec();\n return deleted ? 1 : 0;\n },\n async deleteMany(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const result = await execute(\n getModel(model).deleteMany(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n state.session ? { session: state.session } : undefined,\n ),\n state.session,\n );\n return Number(result.deletedCount ?? 0);\n },\n async transaction(_schema, run) {\n return runTransaction(run);\n },\n };\n\n return driver;\n}\n\nexport function createMongooseDriver<TSchema extends SchemaDefinition<any>>(\n config: MongooseDriverConfig<TSchema>,\n) {\n return createMongooseDriverInternal(config);\n}\n"],"mappings":"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","names":["targetField","sourceField","sourceValue"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -82,12 +82,21 @@ declare function createMongooseDriver<TSchema extends SchemaDefinition<any>>(con
|
|
|
82
82
|
dialect?: string | undefined;
|
|
83
83
|
capabilities: Readonly<{
|
|
84
84
|
supportsNumericIds: boolean;
|
|
85
|
+
numericIds: _farming_labs_orm.NumericIdCapability;
|
|
85
86
|
supportsJSON: boolean;
|
|
86
87
|
supportsDates: boolean;
|
|
87
88
|
supportsBooleans: boolean;
|
|
88
89
|
supportsTransactions: boolean;
|
|
90
|
+
supportsSchemaNamespaces: boolean;
|
|
91
|
+
supportsTransactionalDDL: boolean;
|
|
89
92
|
supportsJoin: boolean;
|
|
90
93
|
nativeRelationLoading: _farming_labs_orm.NativeRelationLoading;
|
|
94
|
+
textComparison: _farming_labs_orm.TextComparisonBehavior;
|
|
95
|
+
textMatching: _farming_labs_orm.TextMatchingCapabilities;
|
|
96
|
+
upsert: _farming_labs_orm.UpsertCapability;
|
|
97
|
+
returning: _farming_labs_orm.MutationReturningCapabilities;
|
|
98
|
+
returningMode: _farming_labs_orm.MutationReturningModes;
|
|
99
|
+
nativeRelations: _farming_labs_orm.NativeRelationCapabilities;
|
|
91
100
|
}>;
|
|
92
101
|
}>>;
|
|
93
102
|
|
package/dist/index.d.ts
CHANGED
|
@@ -82,12 +82,21 @@ declare function createMongooseDriver<TSchema extends SchemaDefinition<any>>(con
|
|
|
82
82
|
dialect?: string | undefined;
|
|
83
83
|
capabilities: Readonly<{
|
|
84
84
|
supportsNumericIds: boolean;
|
|
85
|
+
numericIds: _farming_labs_orm.NumericIdCapability;
|
|
85
86
|
supportsJSON: boolean;
|
|
86
87
|
supportsDates: boolean;
|
|
87
88
|
supportsBooleans: boolean;
|
|
88
89
|
supportsTransactions: boolean;
|
|
90
|
+
supportsSchemaNamespaces: boolean;
|
|
91
|
+
supportsTransactionalDDL: boolean;
|
|
89
92
|
supportsJoin: boolean;
|
|
90
93
|
nativeRelationLoading: _farming_labs_orm.NativeRelationLoading;
|
|
94
|
+
textComparison: _farming_labs_orm.TextComparisonBehavior;
|
|
95
|
+
textMatching: _farming_labs_orm.TextMatchingCapabilities;
|
|
96
|
+
upsert: _farming_labs_orm.UpsertCapability;
|
|
97
|
+
returning: _farming_labs_orm.MutationReturningCapabilities;
|
|
98
|
+
returningMode: _farming_labs_orm.MutationReturningModes;
|
|
99
|
+
nativeRelations: _farming_labs_orm.NativeRelationCapabilities;
|
|
91
100
|
}>;
|
|
92
101
|
}>>;
|
|
93
102
|
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,17 @@ function getManifest(schema) {
|
|
|
16
16
|
manifestCache.set(schema, next);
|
|
17
17
|
return next;
|
|
18
18
|
}
|
|
19
|
+
function assertSupportedNumericIdGeneration(schema) {
|
|
20
|
+
const manifest = getManifest(schema);
|
|
21
|
+
for (const model of Object.values(manifest.models)) {
|
|
22
|
+
const idField = model.fields.id;
|
|
23
|
+
if (idField?.kind === "id" && idField.idType === "integer" && idField.generated === "increment") {
|
|
24
|
+
throw new Error(
|
|
25
|
+
`The Mongoose runtime does not support generated integer ids for model "${model.name}". Use manual numeric ids or a string id instead.`
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
19
30
|
function identityField(model) {
|
|
20
31
|
if (model.fields.id) return model.fields.id;
|
|
21
32
|
const uniqueField = Object.values(model.fields).find((field) => field.unique);
|
|
@@ -93,6 +104,10 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
93
104
|
}
|
|
94
105
|
return model;
|
|
95
106
|
}
|
|
107
|
+
function getSupportedManifest(schema) {
|
|
108
|
+
assertSupportedNumericIdGeneration(schema);
|
|
109
|
+
return getManifest(schema);
|
|
110
|
+
}
|
|
96
111
|
function fieldTransform(modelName, fieldName) {
|
|
97
112
|
return config.transforms?.[modelName]?.[fieldName];
|
|
98
113
|
}
|
|
@@ -100,7 +115,9 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
100
115
|
if (value === void 0) return value;
|
|
101
116
|
if (value === null) return null;
|
|
102
117
|
let next = value;
|
|
103
|
-
if (field.kind === "
|
|
118
|
+
if (field.kind === "id" && field.idType === "integer") {
|
|
119
|
+
next = Number(next);
|
|
120
|
+
} else if (field.kind === "enum") {
|
|
104
121
|
next = String(next);
|
|
105
122
|
} else if (field.kind === "boolean") {
|
|
106
123
|
next = Boolean(next);
|
|
@@ -121,6 +138,9 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
121
138
|
if (value === null) return null;
|
|
122
139
|
const transform = fieldTransform(modelName, field.name);
|
|
123
140
|
let next = transform?.decode ? transform.decode(value) : value;
|
|
141
|
+
if (field.kind === "id" && field.idType === "integer") {
|
|
142
|
+
return typeof next === "number" ? next : Number(next);
|
|
143
|
+
}
|
|
124
144
|
if (field.kind === "enum") {
|
|
125
145
|
return typeof next === "string" ? next : String(next);
|
|
126
146
|
}
|
|
@@ -283,7 +303,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
283
303
|
return query.exec();
|
|
284
304
|
}
|
|
285
305
|
async function loadRows(schema, modelName, args) {
|
|
286
|
-
const manifest =
|
|
306
|
+
const manifest = getSupportedManifest(schema);
|
|
287
307
|
const model = manifest.models[modelName];
|
|
288
308
|
const docs = await runFindMany(model, args);
|
|
289
309
|
const rows = docs.map((doc) => decodeRow(model, doc));
|
|
@@ -297,13 +317,13 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
297
317
|
return rows[0] ?? null;
|
|
298
318
|
}
|
|
299
319
|
async function loadRawOneRow(schema, modelName, args) {
|
|
300
|
-
const manifest =
|
|
320
|
+
const manifest = getSupportedManifest(schema);
|
|
301
321
|
const model = manifest.models[modelName];
|
|
302
322
|
const doc = await runFindOne(model, args);
|
|
303
323
|
return doc ? decodeRow(model, doc) : null;
|
|
304
324
|
}
|
|
305
325
|
async function projectRow(schema, modelName, row, select) {
|
|
306
|
-
const manifest =
|
|
326
|
+
const manifest = getSupportedManifest(schema);
|
|
307
327
|
const model = manifest.models[modelName];
|
|
308
328
|
const output = {};
|
|
309
329
|
if (!select) {
|
|
@@ -331,7 +351,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
331
351
|
return output;
|
|
332
352
|
}
|
|
333
353
|
async function resolveRelation(schema, modelName, relationName, row, value) {
|
|
334
|
-
const manifest =
|
|
354
|
+
const manifest = getSupportedManifest(schema);
|
|
335
355
|
const relation = schema.models[modelName].relations[relationName];
|
|
336
356
|
const relationArgs = value === true ? {} : value;
|
|
337
357
|
if (relation.kind === "belongsTo") {
|
|
@@ -470,10 +490,36 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
470
490
|
startSession: config.startSession
|
|
471
491
|
},
|
|
472
492
|
capabilities: {
|
|
493
|
+
numericIds: "manual",
|
|
473
494
|
supportsJSON: true,
|
|
474
495
|
supportsDates: true,
|
|
475
496
|
supportsBooleans: true,
|
|
476
|
-
supportsTransactions: Boolean(config.startSession ?? config.connection?.startSession)
|
|
497
|
+
supportsTransactions: Boolean(config.startSession ?? config.connection?.startSession),
|
|
498
|
+
textComparison: "case-sensitive",
|
|
499
|
+
textMatching: {
|
|
500
|
+
equality: "case-sensitive",
|
|
501
|
+
contains: "case-sensitive",
|
|
502
|
+
ordering: "case-sensitive"
|
|
503
|
+
},
|
|
504
|
+
upsert: "native",
|
|
505
|
+
returning: {
|
|
506
|
+
create: true,
|
|
507
|
+
update: true,
|
|
508
|
+
delete: false
|
|
509
|
+
},
|
|
510
|
+
returningMode: {
|
|
511
|
+
create: "record",
|
|
512
|
+
update: "record",
|
|
513
|
+
delete: "none"
|
|
514
|
+
},
|
|
515
|
+
nativeRelations: {
|
|
516
|
+
singularChains: false,
|
|
517
|
+
hasMany: false,
|
|
518
|
+
manyToMany: false,
|
|
519
|
+
filtered: false,
|
|
520
|
+
ordered: false,
|
|
521
|
+
paginated: false
|
|
522
|
+
}
|
|
477
523
|
}
|
|
478
524
|
}),
|
|
479
525
|
async findMany(schema, model, args) {
|
|
@@ -483,7 +529,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
483
529
|
return loadOneRow(schema, model, args);
|
|
484
530
|
},
|
|
485
531
|
async findUnique(schema, model, args) {
|
|
486
|
-
const manifest =
|
|
532
|
+
const manifest = getSupportedManifest(schema);
|
|
487
533
|
requireUniqueLookup(
|
|
488
534
|
manifest.models[model],
|
|
489
535
|
args.where,
|
|
@@ -492,7 +538,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
492
538
|
return loadOneRow(schema, model, args);
|
|
493
539
|
},
|
|
494
540
|
async count(schema, model, args) {
|
|
495
|
-
const manifest =
|
|
541
|
+
const manifest = getSupportedManifest(schema);
|
|
496
542
|
const result = await execute(
|
|
497
543
|
getModel(model).countDocuments(
|
|
498
544
|
compileWhere(manifest.models[model], args?.where)
|
|
@@ -502,7 +548,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
502
548
|
return Number(result);
|
|
503
549
|
},
|
|
504
550
|
async create(schema, model, args) {
|
|
505
|
-
const manifest =
|
|
551
|
+
const manifest = getSupportedManifest(schema);
|
|
506
552
|
const document = buildDocument(
|
|
507
553
|
manifest.models[model],
|
|
508
554
|
args.data
|
|
@@ -529,7 +575,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
529
575
|
return results;
|
|
530
576
|
},
|
|
531
577
|
async update(schema, model, args) {
|
|
532
|
-
const manifest =
|
|
578
|
+
const manifest = getSupportedManifest(schema);
|
|
533
579
|
const updated = await getModel(model).findOneAndUpdate(
|
|
534
580
|
compileWhere(manifest.models[model], args.where),
|
|
535
581
|
{
|
|
@@ -553,7 +599,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
553
599
|
);
|
|
554
600
|
},
|
|
555
601
|
async updateMany(schema, model, args) {
|
|
556
|
-
const manifest =
|
|
602
|
+
const manifest = getSupportedManifest(schema);
|
|
557
603
|
const update = buildUpdate(
|
|
558
604
|
manifest.models[model],
|
|
559
605
|
args.data
|
|
@@ -572,7 +618,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
572
618
|
return Number(result.modifiedCount ?? result.matchedCount ?? 0);
|
|
573
619
|
},
|
|
574
620
|
async upsert(schema, model, args) {
|
|
575
|
-
const manifest =
|
|
621
|
+
const manifest = getSupportedManifest(schema);
|
|
576
622
|
const modelManifest = manifest.models[model];
|
|
577
623
|
const lookup = requireUniqueLookup(
|
|
578
624
|
modelManifest,
|
|
@@ -619,7 +665,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
619
665
|
);
|
|
620
666
|
},
|
|
621
667
|
async delete(schema, model, args) {
|
|
622
|
-
const manifest =
|
|
668
|
+
const manifest = getSupportedManifest(schema);
|
|
623
669
|
const deleted = await getModel(model).findOneAndDelete(
|
|
624
670
|
compileWhere(manifest.models[model], args.where),
|
|
625
671
|
state.session ? { session: state.session } : void 0
|
|
@@ -627,7 +673,7 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
627
673
|
return deleted ? 1 : 0;
|
|
628
674
|
},
|
|
629
675
|
async deleteMany(schema, model, args) {
|
|
630
|
-
const manifest =
|
|
676
|
+
const manifest = getSupportedManifest(schema);
|
|
631
677
|
const result = await execute(
|
|
632
678
|
getModel(model).deleteMany(
|
|
633
679
|
compileWhere(manifest.models[model], args.where),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createDriverHandle,\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindManyArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n type OrmDriverHandle,\n isOperatorFilterObject,\n requireUniqueLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype MongoRow = Record<string, unknown>;\ntype MongoWhere = Where<Record<string, unknown>>;\n\ntype MongooseWriteResult = {\n modifiedCount?: number;\n matchedCount?: number;\n deletedCount?: number;\n};\n\nexport type MongooseSessionLike = {\n withTransaction?<TResult>(run: () => Promise<TResult>): Promise<TResult>;\n startTransaction?(): void;\n commitTransaction?(): Promise<void>;\n abortTransaction?(): Promise<void>;\n endSession?(): Promise<void> | void;\n};\n\nexport type MongooseSessionSourceLike = {\n startSession(): Promise<MongooseSessionLike>;\n};\n\nexport type MongooseQueryLike<TResult> = {\n sort(sort: Record<string, 1 | -1>): MongooseQueryLike<TResult>;\n skip(value: number): MongooseQueryLike<TResult>;\n limit(value: number): MongooseQueryLike<TResult>;\n session(session: MongooseSessionLike): MongooseQueryLike<TResult>;\n lean(): MongooseQueryLike<TResult>;\n exec(): Promise<TResult>;\n};\n\nexport type MongooseExecLike<TResult> = {\n session?(session: MongooseSessionLike): MongooseExecLike<TResult>;\n exec(): Promise<TResult>;\n};\n\nexport type MongooseModelLike = {\n find(filter: Record<string, unknown>): MongooseQueryLike<MongoRow[]>;\n findOne(filter: Record<string, unknown>): MongooseQueryLike<MongoRow | null>;\n countDocuments(filter: Record<string, unknown>): Promise<number> | MongooseExecLike<number>;\n create(\n doc: MongoRow | MongoRow[],\n options?: { session?: MongooseSessionLike },\n ): Promise<MongoRow | MongoRow[]>;\n insertMany?(docs: MongoRow[], options?: { session?: MongooseSessionLike }): Promise<MongoRow[]>;\n updateMany(\n filter: Record<string, unknown>,\n update: { $set: MongoRow },\n options?: { session?: MongooseSessionLike },\n ): Promise<MongooseWriteResult> | MongooseExecLike<MongooseWriteResult>;\n findOneAndUpdate(\n filter: Record<string, unknown>,\n update: { $set?: MongoRow; $setOnInsert?: MongoRow },\n options?: {\n upsert?: boolean;\n new?: boolean;\n returnDocument?: \"after\" | \"before\";\n session?: MongooseSessionLike;\n },\n ): MongooseQueryLike<MongoRow | null>;\n findOneAndDelete(\n filter: Record<string, unknown>,\n options?: { session?: MongooseSessionLike },\n ): MongooseQueryLike<MongoRow | null>;\n deleteMany(\n filter: Record<string, unknown>,\n options?: { session?: MongooseSessionLike },\n ): Promise<MongooseWriteResult> | MongooseExecLike<MongooseWriteResult>;\n};\n\nexport type MongooseFieldTransform = {\n encode?: (value: unknown) => unknown;\n decode?: (value: unknown) => unknown;\n};\n\nexport type MongooseDriverConfig<TSchema extends SchemaDefinition<any>> = {\n models: Record<ModelName<TSchema>, MongooseModelLike>;\n connection?: MongooseSessionSourceLike;\n startSession?: () => Promise<MongooseSessionLike>;\n transforms?: Partial<Record<string, Partial<Record<string, MongooseFieldTransform>>>>;\n};\n\nexport type MongooseDriverClient<TSchema extends SchemaDefinition<any>> = {\n models: Record<ModelName<TSchema>, MongooseModelLike>;\n connection?: MongooseSessionSourceLike;\n startSession?: () => Promise<MongooseSessionLike>;\n};\n\nexport type MongooseDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<\n \"mongoose\",\n MongooseDriverClient<TSchema>\n>;\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the Mongoose runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction escapeRegex(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction mergeWhere(...clauses: Array<MongoWhere | undefined>) {\n const defined = clauses.filter(Boolean) as MongoWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as MongoWhere;\n}\n\nfunction normalizeDecimalString(value: string) {\n const trimmed = value.trim();\n const match = /^(-?\\d+)(?:\\.(\\d+))?$/.exec(trimmed);\n if (!match) {\n return trimmed;\n }\n\n const [, integerPart, fractionalPart] = match;\n if (!fractionalPart) {\n return integerPart;\n }\n\n const normalizedFraction = fractionalPart.replace(/0+$/g, \"\");\n return normalizedFraction.length ? `${integerPart}.${normalizedFraction}` : integerPart;\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction removeOverlappingInsertFields(insertData: MongoRow, updateData: MongoRow) {\n const output: MongoRow = {};\n\n for (const [key, value] of Object.entries(insertData)) {\n if (Object.prototype.hasOwnProperty.call(updateData, key)) continue;\n output[key] = value;\n }\n\n return output;\n}\n\nfunction isExecLike<TResult>(value: unknown): value is MongooseExecLike<TResult> {\n return !!value && typeof value === \"object\" && \"exec\" in value;\n}\n\nasync function execute<TResult>(\n operation: Promise<TResult> | MongooseExecLike<TResult>,\n session?: MongooseSessionLike,\n) {\n if (isExecLike<TResult>(operation)) {\n const query =\n session && typeof operation.session === \"function\" ? operation.session(session) : operation;\n return query.exec();\n }\n return operation;\n}\n\nasync function normalizeCreated(doc: Promise<MongoRow | MongoRow[]>) {\n const result = await doc;\n return Array.isArray(result) ? (result[0] ?? null) : result;\n}\n\nfunction createMongooseDriverInternal<TSchema extends SchemaDefinition<any>>(\n config: MongooseDriverConfig<TSchema>,\n state: {\n session?: MongooseSessionLike;\n } = {},\n): OrmDriver<TSchema, MongooseDriverHandle<TSchema>> {\n function getModel(modelName: ModelName<TSchema>) {\n const model = config.models[modelName];\n if (!model) {\n throw new Error(`No Mongoose model was provided for schema model \"${modelName}\".`);\n }\n return model;\n }\n\n function fieldTransform(modelName: string, fieldName: string) {\n return config.transforms?.[modelName]?.[fieldName];\n }\n\n function encodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n let next = value;\n if (field.kind === \"enum\") {\n next = String(next);\n } else if (field.kind === \"boolean\") {\n next = Boolean(next);\n } else if (field.kind === \"integer\") {\n next = Number(next);\n } else if (field.kind === \"bigint\") {\n next = typeof next === \"bigint\" ? next : BigInt(next as string | number);\n } else if (field.kind === \"decimal\") {\n next = typeof next === \"string\" ? next : String(next);\n } else if (field.kind === \"datetime\") {\n next = next instanceof Date ? next : new Date(String(next));\n }\n\n const transform = fieldTransform(modelName, field.name);\n return transform?.encode ? transform.encode(next) : next;\n }\n\n function decodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n const transform = fieldTransform(modelName, field.name);\n let next = transform?.decode ? transform.decode(value) : value;\n\n if (field.kind === \"enum\") {\n return typeof next === \"string\" ? next : String(next);\n }\n if (field.kind === \"boolean\") {\n return Boolean(next);\n }\n if (field.kind === \"integer\") {\n return typeof next === \"number\" ? next : Number(next);\n }\n if (field.kind === \"bigint\") {\n if (typeof next === \"bigint\") {\n return next;\n }\n if (typeof next === \"number\") {\n return BigInt(Math.trunc(next));\n }\n return BigInt(String(next));\n }\n if (field.kind === \"decimal\") {\n return normalizeDecimalString(typeof next === \"string\" ? next : String(next));\n }\n if (field.kind === \"datetime\") {\n return next instanceof Date ? next : new Date(String(next));\n }\n if (field.kind === \"id\") {\n return typeof next === \"string\" ? next : String(next);\n }\n return next;\n }\n\n function buildDocument(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const doc: MongoRow = {};\n\n for (const field of Object.values(model.fields)) {\n const value = applyDefault(data[field.name], field);\n if (value !== undefined) {\n doc[field.column] = encodeValue(model.name, field, value);\n }\n }\n\n return doc;\n }\n\n function buildUpdate(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const update: MongoRow = {};\n\n for (const [fieldName, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n update[field.column] = encodeValue(model.name, field, value);\n }\n\n return update;\n }\n\n function decodeRow(model: ManifestModel, doc: MongoRow) {\n const output: MongoRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(model.name, field, doc[field.column]);\n }\n\n return output;\n }\n\n function compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n ): Record<string, unknown> {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!isOperatorFilterObject(filter)) {\n return {\n [field.column]: encodeValue(model.name, field, filter),\n };\n }\n\n const operations: Record<string, unknown> = {};\n\n if (\"eq\" in filter) {\n operations.$eq = encodeValue(model.name, field, filter.eq);\n }\n if (\"not\" in filter) {\n operations.$ne = encodeValue(model.name, field, filter.not);\n }\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n operations.$in = values.map((value) => encodeValue(model.name, field, value));\n }\n if (\"contains\" in filter) {\n operations.$regex = new RegExp(escapeRegex(String(filter.contains ?? \"\")));\n }\n if (\"gt\" in filter) {\n operations.$gt = encodeValue(model.name, field, filter.gt);\n }\n if (\"gte\" in filter) {\n operations.$gte = encodeValue(model.name, field, filter.gte);\n }\n if (\"lt\" in filter) {\n operations.$lt = encodeValue(model.name, field, filter.lt);\n }\n if (\"lte\" in filter) {\n operations.$lte = encodeValue(model.name, field, filter.lte);\n }\n\n return {\n [field.column]: operations,\n };\n }\n\n function compileWhere(\n model: ManifestModel,\n where: MongoWhere | undefined,\n ): Record<string, unknown> {\n if (!where) return {};\n\n const clauses: Record<string, unknown>[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const nested = (Array.isArray(value) ? value : [])\n .map((item) => compileWhere(model, item as MongoWhere))\n .filter((item) => Object.keys(item).length > 0);\n if (nested.length) clauses.push({ $and: nested });\n continue;\n }\n\n if (key === \"OR\") {\n const nested = (Array.isArray(value) ? value : [])\n .map((item) => compileWhere(model, item as MongoWhere))\n .filter((item) => Object.keys(item).length > 0);\n if (nested.length) clauses.push({ $or: nested });\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as MongoWhere);\n if (Object.keys(nested).length) clauses.push({ $nor: [nested] });\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value));\n }\n\n if (!clauses.length) return {};\n if (clauses.length === 1) return clauses[0]!;\n return {\n $and: clauses,\n };\n }\n\n function compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n ) {\n if (!orderBy) return undefined;\n\n const output: Record<string, 1 | -1> = {};\n for (const [fieldName, direction] of Object.entries(orderBy)) {\n const field = model.fields[fieldName];\n if (!field) continue;\n output[field.column] = direction === \"desc\" ? -1 : 1;\n }\n\n return Object.keys(output).length ? output : undefined;\n }\n\n async function runFindMany(\n model: ManifestModel,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n ) {\n const query = getModel(model.name as ModelName<TSchema>).find(compileWhere(model, args.where));\n const orderBy = compileOrderBy(model, args.orderBy);\n if (orderBy) query.sort(orderBy);\n if (args.skip !== undefined) query.skip(args.skip);\n if (args.take !== undefined) query.limit(args.take);\n if (state.session) query.session(state.session);\n query.lean();\n return query.exec();\n }\n\n async function runFindOne(\n model: ManifestModel,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const orderBy = compileOrderBy(model, args.orderBy);\n if (orderBy) {\n const rows = await runFindMany(model, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n const query = getModel(model.name as ModelName<TSchema>).findOne(\n compileWhere(model, args.where),\n );\n if (state.session) query.session(state.session);\n query.lean();\n return query.exec();\n }\n\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const docs = await runFindMany(model, args);\n const rows = docs.map((doc) => decodeRow(model, doc));\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const doc = await runFindOne(model, args);\n return doc ? decodeRow(model, doc) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: MongoRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getManifest(schema);\n const model = manifest.models[modelName];\n const output: MongoRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: MongoRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [targetField]: foreignValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as MongoWhere,\n });\n\n const targetIds = throughRows\n .map((item: MongoRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n async function runTransaction<TResult>(\n run: (driver: OrmDriver<TSchema, MongooseDriverHandle<TSchema>>) => Promise<TResult>,\n ) {\n if (state.session) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const startSession =\n config.startSession ?? config.connection?.startSession.bind(config.connection);\n if (!startSession) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const session = await startSession();\n try {\n if (session.withTransaction) {\n return await session.withTransaction(() =>\n run(\n createMongooseDriverInternal(config, {\n session,\n }),\n ),\n );\n }\n\n if (session.startTransaction && session.commitTransaction && session.abortTransaction) {\n session.startTransaction();\n try {\n const result = await run(\n createMongooseDriverInternal(config, {\n session,\n }),\n );\n await session.commitTransaction();\n return result;\n } catch (error) {\n await session.abortTransaction();\n throw error;\n }\n }\n\n return run(\n createMongooseDriverInternal(config, {\n session,\n }),\n );\n } finally {\n await session.endSession?.();\n }\n }\n\n const driver: OrmDriver<TSchema, MongooseDriverHandle<TSchema>> = {\n handle: createDriverHandle({\n kind: \"mongoose\",\n client: {\n models: config.models,\n connection: config.connection,\n startSession: config.startSession,\n },\n capabilities: {\n supportsJSON: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsTransactions: Boolean(config.startSession ?? config.connection?.startSession),\n },\n }),\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getManifest(schema);\n const result = await execute(\n getModel(model).countDocuments(\n compileWhere(manifest.models[model], args?.where as MongoWhere | undefined),\n ),\n state.session,\n );\n return Number(result);\n },\n async create(schema, model, args) {\n const manifest = getManifest(schema);\n const document = buildDocument(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const created = await normalizeCreated(\n state.session\n ? getModel(model).create([document], { session: state.session })\n : getModel(model).create(document),\n );\n if (!created) {\n throw new Error(`Create on model \"${String(model)}\" did not return a document.`);\n }\n const row = decodeRow(manifest.models[model], created);\n return projectRow(schema, model, row, args.select) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getManifest(schema);\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n {\n $set: buildUpdate(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n ),\n },\n {\n new: true,\n returnDocument: \"after\",\n session: state.session,\n },\n )\n .lean()\n .exec();\n\n if (!updated) return null;\n\n return projectRow(\n schema,\n model,\n decodeRow(manifest.models[model], updated),\n args.select,\n ) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getManifest(schema);\n const update = buildUpdate(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n if (!Object.keys(update).length) return 0;\n const result = await execute(\n getModel(model).updateMany(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n {\n $set: update,\n },\n state.session ? { session: state.session } : undefined,\n ),\n state.session,\n );\n return Number(result.modifiedCount ?? result.matchedCount ?? 0);\n },\n async upsert(schema, model, args) {\n const manifest = getManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const created = buildDocument(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const update = buildUpdate(modelManifest, args.update as Partial<Record<string, unknown>>);\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(modelManifest, args.where as MongoWhere),\n {\n $set: update,\n $setOnInsert: removeOverlappingInsertFields(created, update),\n },\n {\n upsert: true,\n new: true,\n returnDocument: \"after\",\n session: state.session,\n },\n )\n .lean()\n .exec();\n\n if (!updated) {\n throw new Error(`Upsert on model \"${String(model)}\" did not return a document.`);\n }\n\n return projectRow(\n schema,\n model,\n decodeRow(modelManifest, updated),\n args.select,\n ) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getManifest(schema);\n const deleted = await getModel(model)\n .findOneAndDelete(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n state.session ? { session: state.session } : undefined,\n )\n .lean()\n .exec();\n return deleted ? 1 : 0;\n },\n async deleteMany(schema, model, args) {\n const manifest = getManifest(schema);\n const result = await execute(\n getModel(model).deleteMany(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n state.session ? { session: state.session } : undefined,\n ),\n state.session,\n );\n return Number(result.deletedCount ?? 0);\n },\n async transaction(_schema, run) {\n return runTransaction(run);\n },\n };\n\n return driver;\n}\n\nexport function createMongooseDriver<TSchema extends SchemaDefinition<any>>(\n config: MongooseDriverConfig<TSchema>,\n) {\n return createMongooseDriverInternal(config);\n}\n"],"mappings":"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","names":["targetField","sourceField","sourceValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n createDriverHandle,\n createManifest,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindManyArgs,\n type ManifestField,\n type ManifestModel,\n mergeUniqueLookupCreateData,\n type OrmDriver,\n type OrmDriverHandle,\n isOperatorFilterObject,\n requireUniqueLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype MongoRow = Record<string, unknown>;\ntype MongoWhere = Where<Record<string, unknown>>;\n\ntype MongooseWriteResult = {\n modifiedCount?: number;\n matchedCount?: number;\n deletedCount?: number;\n};\n\nexport type MongooseSessionLike = {\n withTransaction?<TResult>(run: () => Promise<TResult>): Promise<TResult>;\n startTransaction?(): void;\n commitTransaction?(): Promise<void>;\n abortTransaction?(): Promise<void>;\n endSession?(): Promise<void> | void;\n};\n\nexport type MongooseSessionSourceLike = {\n startSession(): Promise<MongooseSessionLike>;\n};\n\nexport type MongooseQueryLike<TResult> = {\n sort(sort: Record<string, 1 | -1>): MongooseQueryLike<TResult>;\n skip(value: number): MongooseQueryLike<TResult>;\n limit(value: number): MongooseQueryLike<TResult>;\n session(session: MongooseSessionLike): MongooseQueryLike<TResult>;\n lean(): MongooseQueryLike<TResult>;\n exec(): Promise<TResult>;\n};\n\nexport type MongooseExecLike<TResult> = {\n session?(session: MongooseSessionLike): MongooseExecLike<TResult>;\n exec(): Promise<TResult>;\n};\n\nexport type MongooseModelLike = {\n find(filter: Record<string, unknown>): MongooseQueryLike<MongoRow[]>;\n findOne(filter: Record<string, unknown>): MongooseQueryLike<MongoRow | null>;\n countDocuments(filter: Record<string, unknown>): Promise<number> | MongooseExecLike<number>;\n create(\n doc: MongoRow | MongoRow[],\n options?: { session?: MongooseSessionLike },\n ): Promise<MongoRow | MongoRow[]>;\n insertMany?(docs: MongoRow[], options?: { session?: MongooseSessionLike }): Promise<MongoRow[]>;\n updateMany(\n filter: Record<string, unknown>,\n update: { $set: MongoRow },\n options?: { session?: MongooseSessionLike },\n ): Promise<MongooseWriteResult> | MongooseExecLike<MongooseWriteResult>;\n findOneAndUpdate(\n filter: Record<string, unknown>,\n update: { $set?: MongoRow; $setOnInsert?: MongoRow },\n options?: {\n upsert?: boolean;\n new?: boolean;\n returnDocument?: \"after\" | \"before\";\n session?: MongooseSessionLike;\n },\n ): MongooseQueryLike<MongoRow | null>;\n findOneAndDelete(\n filter: Record<string, unknown>,\n options?: { session?: MongooseSessionLike },\n ): MongooseQueryLike<MongoRow | null>;\n deleteMany(\n filter: Record<string, unknown>,\n options?: { session?: MongooseSessionLike },\n ): Promise<MongooseWriteResult> | MongooseExecLike<MongooseWriteResult>;\n};\n\nexport type MongooseFieldTransform = {\n encode?: (value: unknown) => unknown;\n decode?: (value: unknown) => unknown;\n};\n\nexport type MongooseDriverConfig<TSchema extends SchemaDefinition<any>> = {\n models: Record<ModelName<TSchema>, MongooseModelLike>;\n connection?: MongooseSessionSourceLike;\n startSession?: () => Promise<MongooseSessionLike>;\n transforms?: Partial<Record<string, Partial<Record<string, MongooseFieldTransform>>>>;\n};\n\nexport type MongooseDriverClient<TSchema extends SchemaDefinition<any>> = {\n models: Record<ModelName<TSchema>, MongooseModelLike>;\n connection?: MongooseSessionSourceLike;\n startSession?: () => Promise<MongooseSessionLike>;\n};\n\nexport type MongooseDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<\n \"mongoose\",\n MongooseDriverClient<TSchema>\n>;\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction assertSupportedNumericIdGeneration(schema: SchemaDefinition<any>) {\n const manifest = getManifest(schema);\n\n for (const model of Object.values(manifest.models)) {\n const idField = model.fields.id;\n if (\n idField?.kind === \"id\" &&\n idField.idType === \"integer\" &&\n idField.generated === \"increment\"\n ) {\n throw new Error(\n `The Mongoose runtime does not support generated integer ids for model \"${model.name}\". Use manual numeric ids or a string id instead.`,\n );\n }\n }\n}\n\nfunction identityField(model: ManifestModel) {\n if (model.fields.id) return model.fields.id;\n const uniqueField = Object.values(model.fields).find((field) => field.unique);\n if (uniqueField) return uniqueField;\n throw new Error(\n `Model \"${model.name}\" requires an \"id\" field or a unique field for the Mongoose runtime.`,\n );\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction escapeRegex(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction mergeWhere(...clauses: Array<MongoWhere | undefined>) {\n const defined = clauses.filter(Boolean) as MongoWhere[];\n if (!defined.length) return undefined;\n if (defined.length === 1) return defined[0];\n return {\n AND: defined,\n } as MongoWhere;\n}\n\nfunction normalizeDecimalString(value: string) {\n const trimmed = value.trim();\n const match = /^(-?\\d+)(?:\\.(\\d+))?$/.exec(trimmed);\n if (!match) {\n return trimmed;\n }\n\n const [, integerPart, fractionalPart] = match;\n if (!fractionalPart) {\n return integerPart;\n }\n\n const normalizedFraction = fractionalPart.replace(/0+$/g, \"\");\n return normalizedFraction.length ? `${integerPart}.${normalizedFraction}` : integerPart;\n}\n\nfunction parseReference(reference?: string) {\n if (!reference) return null;\n const [model, field] = reference.split(\".\");\n if (!model || !field) return null;\n return { model, field };\n}\n\nfunction removeOverlappingInsertFields(insertData: MongoRow, updateData: MongoRow) {\n const output: MongoRow = {};\n\n for (const [key, value] of Object.entries(insertData)) {\n if (Object.prototype.hasOwnProperty.call(updateData, key)) continue;\n output[key] = value;\n }\n\n return output;\n}\n\nfunction isExecLike<TResult>(value: unknown): value is MongooseExecLike<TResult> {\n return !!value && typeof value === \"object\" && \"exec\" in value;\n}\n\nasync function execute<TResult>(\n operation: Promise<TResult> | MongooseExecLike<TResult>,\n session?: MongooseSessionLike,\n) {\n if (isExecLike<TResult>(operation)) {\n const query =\n session && typeof operation.session === \"function\" ? operation.session(session) : operation;\n return query.exec();\n }\n return operation;\n}\n\nasync function normalizeCreated(doc: Promise<MongoRow | MongoRow[]>) {\n const result = await doc;\n return Array.isArray(result) ? (result[0] ?? null) : result;\n}\n\nfunction createMongooseDriverInternal<TSchema extends SchemaDefinition<any>>(\n config: MongooseDriverConfig<TSchema>,\n state: {\n session?: MongooseSessionLike;\n } = {},\n): OrmDriver<TSchema, MongooseDriverHandle<TSchema>> {\n function getModel(modelName: ModelName<TSchema>) {\n const model = config.models[modelName];\n if (!model) {\n throw new Error(`No Mongoose model was provided for schema model \"${modelName}\".`);\n }\n return model;\n }\n\n function getSupportedManifest(schema: TSchema) {\n assertSupportedNumericIdGeneration(schema);\n return getManifest(schema);\n }\n\n function fieldTransform(modelName: string, fieldName: string) {\n return config.transforms?.[modelName]?.[fieldName];\n }\n\n function encodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n let next = value;\n if (field.kind === \"id\" && field.idType === \"integer\") {\n next = Number(next);\n } else if (field.kind === \"enum\") {\n next = String(next);\n } else if (field.kind === \"boolean\") {\n next = Boolean(next);\n } else if (field.kind === \"integer\") {\n next = Number(next);\n } else if (field.kind === \"bigint\") {\n next = typeof next === \"bigint\" ? next : BigInt(next as string | number);\n } else if (field.kind === \"decimal\") {\n next = typeof next === \"string\" ? next : String(next);\n } else if (field.kind === \"datetime\") {\n next = next instanceof Date ? next : new Date(String(next));\n }\n\n const transform = fieldTransform(modelName, field.name);\n return transform?.encode ? transform.encode(next) : next;\n }\n\n function decodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n const transform = fieldTransform(modelName, field.name);\n let next = transform?.decode ? transform.decode(value) : value;\n\n if (field.kind === \"id\" && field.idType === \"integer\") {\n return typeof next === \"number\" ? next : Number(next);\n }\n if (field.kind === \"enum\") {\n return typeof next === \"string\" ? next : String(next);\n }\n if (field.kind === \"boolean\") {\n return Boolean(next);\n }\n if (field.kind === \"integer\") {\n return typeof next === \"number\" ? next : Number(next);\n }\n if (field.kind === \"bigint\") {\n if (typeof next === \"bigint\") {\n return next;\n }\n if (typeof next === \"number\") {\n return BigInt(Math.trunc(next));\n }\n return BigInt(String(next));\n }\n if (field.kind === \"decimal\") {\n return normalizeDecimalString(typeof next === \"string\" ? next : String(next));\n }\n if (field.kind === \"datetime\") {\n return next instanceof Date ? next : new Date(String(next));\n }\n if (field.kind === \"id\") {\n return typeof next === \"string\" ? next : String(next);\n }\n return next;\n }\n\n function buildDocument(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const doc: MongoRow = {};\n\n for (const field of Object.values(model.fields)) {\n const value = applyDefault(data[field.name], field);\n if (value !== undefined) {\n doc[field.column] = encodeValue(model.name, field, value);\n }\n }\n\n return doc;\n }\n\n function buildUpdate(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const update: MongoRow = {};\n\n for (const [fieldName, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n update[field.column] = encodeValue(model.name, field, value);\n }\n\n return update;\n }\n\n function decodeRow(model: ManifestModel, doc: MongoRow) {\n const output: MongoRow = {};\n\n for (const field of Object.values(model.fields)) {\n output[field.name] = decodeValue(model.name, field, doc[field.column]);\n }\n\n return output;\n }\n\n function compileFieldFilter(\n model: ManifestModel,\n fieldName: string,\n filter: unknown,\n ): Record<string, unknown> {\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!isOperatorFilterObject(filter)) {\n return {\n [field.column]: encodeValue(model.name, field, filter),\n };\n }\n\n const operations: Record<string, unknown> = {};\n\n if (\"eq\" in filter) {\n operations.$eq = encodeValue(model.name, field, filter.eq);\n }\n if (\"not\" in filter) {\n operations.$ne = encodeValue(model.name, field, filter.not);\n }\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n operations.$in = values.map((value) => encodeValue(model.name, field, value));\n }\n if (\"contains\" in filter) {\n operations.$regex = new RegExp(escapeRegex(String(filter.contains ?? \"\")));\n }\n if (\"gt\" in filter) {\n operations.$gt = encodeValue(model.name, field, filter.gt);\n }\n if (\"gte\" in filter) {\n operations.$gte = encodeValue(model.name, field, filter.gte);\n }\n if (\"lt\" in filter) {\n operations.$lt = encodeValue(model.name, field, filter.lt);\n }\n if (\"lte\" in filter) {\n operations.$lte = encodeValue(model.name, field, filter.lte);\n }\n\n return {\n [field.column]: operations,\n };\n }\n\n function compileWhere(\n model: ManifestModel,\n where: MongoWhere | undefined,\n ): Record<string, unknown> {\n if (!where) return {};\n\n const clauses: Record<string, unknown>[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (key === \"AND\") {\n const nested = (Array.isArray(value) ? value : [])\n .map((item) => compileWhere(model, item as MongoWhere))\n .filter((item) => Object.keys(item).length > 0);\n if (nested.length) clauses.push({ $and: nested });\n continue;\n }\n\n if (key === \"OR\") {\n const nested = (Array.isArray(value) ? value : [])\n .map((item) => compileWhere(model, item as MongoWhere))\n .filter((item) => Object.keys(item).length > 0);\n if (nested.length) clauses.push({ $or: nested });\n continue;\n }\n\n if (key === \"NOT\") {\n const nested = compileWhere(model, value as MongoWhere);\n if (Object.keys(nested).length) clauses.push({ $nor: [nested] });\n continue;\n }\n\n clauses.push(compileFieldFilter(model, key, value));\n }\n\n if (!clauses.length) return {};\n if (clauses.length === 1) return clauses[0]!;\n return {\n $and: clauses,\n };\n }\n\n function compileOrderBy(\n model: ManifestModel,\n orderBy: Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n ) {\n if (!orderBy) return undefined;\n\n const output: Record<string, 1 | -1> = {};\n for (const [fieldName, direction] of Object.entries(orderBy)) {\n const field = model.fields[fieldName];\n if (!field) continue;\n output[field.column] = direction === \"desc\" ? -1 : 1;\n }\n\n return Object.keys(output).length ? output : undefined;\n }\n\n async function runFindMany(\n model: ManifestModel,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n },\n ) {\n const query = getModel(model.name as ModelName<TSchema>).find(compileWhere(model, args.where));\n const orderBy = compileOrderBy(model, args.orderBy);\n if (orderBy) query.sort(orderBy);\n if (args.skip !== undefined) query.skip(args.skip);\n if (args.take !== undefined) query.limit(args.take);\n if (state.session) query.session(state.session);\n query.lean();\n return query.exec();\n }\n\n async function runFindOne(\n model: ManifestModel,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const orderBy = compileOrderBy(model, args.orderBy);\n if (orderBy) {\n const rows = await runFindMany(model, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n const query = getModel(model.name as ModelName<TSchema>).findOne(\n compileWhere(model, args.where),\n );\n if (state.session) query.session(state.session);\n query.lean();\n return query.exec();\n }\n\n async function loadRows<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n take?: number;\n skip?: number;\n select?: TSelect;\n },\n ): Promise<Array<SelectedRecord<TSchema, TModelName, TSelect>>> {\n const manifest = getSupportedManifest(schema);\n const model = manifest.models[modelName];\n const docs = await runFindMany(model, args);\n const rows = docs.map((doc) => decodeRow(model, doc));\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row, args.select)));\n }\n\n async function loadOneRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n select?: TSelect;\n },\n ) {\n const rows = await loadRows(schema, modelName, {\n ...args,\n take: 1,\n });\n return rows[0] ?? null;\n }\n\n async function loadRawOneRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n args: {\n where?: MongoWhere;\n orderBy?: Partial<Record<string, \"asc\" | \"desc\">>;\n },\n ) {\n const manifest = getSupportedManifest(schema);\n const model = manifest.models[modelName];\n const doc = await runFindOne(model, args);\n return doc ? decodeRow(model, doc) : null;\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: MongoRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const manifest = getSupportedManifest(schema);\n const model = manifest.models[modelName];\n const output: MongoRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(model.fields)) {\n output[fieldName] = row[fieldName];\n }\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value === undefined) continue;\n\n if (key in model.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in schema.models[modelName].relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: MongoRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const manifest = getSupportedManifest(schema);\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignField = manifest.models[modelName].fields[relation.foreignKey];\n const targetReference = parseReference(foreignField?.references);\n const targetField =\n targetReference?.field ?? identityField(manifest.models[relation.target]).name;\n const foreignValue = row[relation.foreignKey];\n\n if (foreignValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [targetField]: foreignValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasOne\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return null;\n\n return loadOneRow(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n select: relationArgs.select,\n });\n }\n\n if (relation.kind === \"hasMany\") {\n const targetModel = manifest.models[relation.target];\n const foreignField = targetModel.fields[relation.foreignKey];\n const sourceReference = parseReference(foreignField?.references);\n const sourceField = sourceReference?.field ?? identityField(manifest.models[modelName]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [relation.foreignKey]: sourceValue,\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n const throughModel = manifest.models[relation.through];\n const throughFromReference = parseReference(throughModel.fields[relation.from]?.references);\n const throughToReference = parseReference(throughModel.fields[relation.to]?.references);\n const sourceField =\n throughFromReference?.field ?? identityField(manifest.models[modelName]).name;\n const targetField =\n throughToReference?.field ?? identityField(manifest.models[relation.target]).name;\n const sourceValue = row[sourceField];\n\n if (sourceValue == null) return [];\n\n const throughRows = await loadRows(schema, relation.through as ModelName<TSchema>, {\n where: {\n [relation.from]: sourceValue,\n } as MongoWhere,\n });\n\n const targetIds = throughRows\n .map((item: MongoRow) => item[relation.to])\n .filter((item) => item != null);\n if (!targetIds.length) return [];\n\n return loadRows(schema, relation.target as ModelName<TSchema>, {\n where: mergeWhere(\n relationArgs.where as MongoWhere | undefined,\n {\n [targetField]: {\n in: targetIds,\n },\n } as MongoWhere,\n ),\n orderBy: relationArgs.orderBy as Partial<Record<string, \"asc\" | \"desc\">> | undefined,\n take: relationArgs.take,\n skip: relationArgs.skip,\n select: relationArgs.select,\n });\n }\n\n async function runTransaction<TResult>(\n run: (driver: OrmDriver<TSchema, MongooseDriverHandle<TSchema>>) => Promise<TResult>,\n ) {\n if (state.session) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const startSession =\n config.startSession ?? config.connection?.startSession.bind(config.connection);\n if (!startSession) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const session = await startSession();\n try {\n if (session.withTransaction) {\n return await session.withTransaction(() =>\n run(\n createMongooseDriverInternal(config, {\n session,\n }),\n ),\n );\n }\n\n if (session.startTransaction && session.commitTransaction && session.abortTransaction) {\n session.startTransaction();\n try {\n const result = await run(\n createMongooseDriverInternal(config, {\n session,\n }),\n );\n await session.commitTransaction();\n return result;\n } catch (error) {\n await session.abortTransaction();\n throw error;\n }\n }\n\n return run(\n createMongooseDriverInternal(config, {\n session,\n }),\n );\n } finally {\n await session.endSession?.();\n }\n }\n\n const driver: OrmDriver<TSchema, MongooseDriverHandle<TSchema>> = {\n handle: createDriverHandle({\n kind: \"mongoose\",\n client: {\n models: config.models,\n connection: config.connection,\n startSession: config.startSession,\n },\n capabilities: {\n numericIds: \"manual\",\n supportsJSON: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsTransactions: Boolean(config.startSession ?? config.connection?.startSession),\n textComparison: \"case-sensitive\",\n textMatching: {\n equality: \"case-sensitive\",\n contains: \"case-sensitive\",\n ordering: \"case-sensitive\",\n },\n upsert: \"native\",\n returning: {\n create: true,\n update: true,\n delete: false,\n },\n returningMode: {\n create: \"record\",\n update: \"record\",\n delete: \"none\",\n },\n nativeRelations: {\n singularChains: false,\n hasMany: false,\n manyToMany: false,\n filtered: false,\n ordered: false,\n paginated: false,\n },\n },\n }),\n async findMany(schema, model, args) {\n return loadRows(schema, model, args);\n },\n async findFirst(schema, model, args) {\n return loadOneRow(schema, model, args);\n },\n async findUnique(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n requireUniqueLookup(\n manifest.models[model],\n args.where as Record<string, unknown>,\n \"FindUnique\",\n );\n return loadOneRow(schema, model, args);\n },\n async count(schema, model, args?: CountArgs<TSchema, ModelName<TSchema>>) {\n const manifest = getSupportedManifest(schema);\n const result = await execute(\n getModel(model).countDocuments(\n compileWhere(manifest.models[model], args?.where as MongoWhere | undefined),\n ),\n state.session,\n );\n return Number(result);\n },\n async create(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const document = buildDocument(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n const created = await normalizeCreated(\n state.session\n ? getModel(model).create([document], { session: state.session })\n : getModel(model).create(document),\n );\n if (!created) {\n throw new Error(`Create on model \"${String(model)}\" did not return a document.`);\n }\n const row = decodeRow(manifest.models[model], created);\n return projectRow(schema, model, row, args.select) as Promise<any>;\n },\n async createMany(schema, model, args) {\n const results: unknown[] = [];\n for (const entry of args.data) {\n results.push(\n await driver.create(schema, model, {\n data: entry,\n select: args.select,\n } as CreateArgs<TSchema, ModelName<TSchema>, any>),\n );\n }\n return results as any;\n },\n async update(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n {\n $set: buildUpdate(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n ),\n },\n {\n new: true,\n returnDocument: \"after\",\n session: state.session,\n },\n )\n .lean()\n .exec();\n\n if (!updated) return null;\n\n return projectRow(\n schema,\n model,\n decodeRow(manifest.models[model], updated),\n args.select,\n ) as Promise<any>;\n },\n async updateMany(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const update = buildUpdate(\n manifest.models[model],\n args.data as Partial<Record<string, unknown>>,\n );\n if (!Object.keys(update).length) return 0;\n const result = await execute(\n getModel(model).updateMany(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n {\n $set: update,\n },\n state.session ? { session: state.session } : undefined,\n ),\n state.session,\n );\n return Number(result.modifiedCount ?? result.matchedCount ?? 0);\n },\n async upsert(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const modelManifest = manifest.models[model];\n const lookup = requireUniqueLookup(\n modelManifest,\n args.where as Record<string, unknown>,\n \"Upsert\",\n );\n validateUniqueLookupUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n const created = buildDocument(\n modelManifest,\n mergeUniqueLookupCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const update = buildUpdate(modelManifest, args.update as Partial<Record<string, unknown>>);\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(modelManifest, args.where as MongoWhere),\n {\n $set: update,\n $setOnInsert: removeOverlappingInsertFields(created, update),\n },\n {\n upsert: true,\n new: true,\n returnDocument: \"after\",\n session: state.session,\n },\n )\n .lean()\n .exec();\n\n if (!updated) {\n throw new Error(`Upsert on model \"${String(model)}\" did not return a document.`);\n }\n\n return projectRow(\n schema,\n model,\n decodeRow(modelManifest, updated),\n args.select,\n ) as Promise<any>;\n },\n async delete(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const deleted = await getModel(model)\n .findOneAndDelete(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n state.session ? { session: state.session } : undefined,\n )\n .lean()\n .exec();\n return deleted ? 1 : 0;\n },\n async deleteMany(schema, model, args) {\n const manifest = getSupportedManifest(schema);\n const result = await execute(\n getModel(model).deleteMany(\n compileWhere(manifest.models[model], args.where as MongoWhere),\n state.session ? { session: state.session } : undefined,\n ),\n state.session,\n );\n return Number(result.deletedCount ?? 0);\n },\n async transaction(_schema, run) {\n return runTransaction(run);\n },\n };\n\n return driver;\n}\n\nexport function createMongooseDriver<TSchema extends SchemaDefinition<any>>(\n config: MongooseDriverConfig<TSchema>,\n) {\n return createMongooseDriverInternal(config);\n}\n"],"mappings":"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","names":["targetField","sourceField","sourceValue"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@farming-labs/orm-mongoose",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.24",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist"
|
|
6
6
|
],
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"access": "public"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@farming-labs/orm": "0.0.
|
|
22
|
+
"@farming-labs/orm": "0.0.24"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"mongoose": "^8.19.2",
|