@farming-labs/orm-mongoose 0.0.1 → 0.0.2
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 +22 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +22 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -137,6 +137,14 @@ function validateUpsertUpdateData(model, updateData, conflict) {
|
|
|
137
137
|
);
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
|
+
function removeOverlappingInsertFields(insertData, updateData) {
|
|
141
|
+
const output = {};
|
|
142
|
+
for (const [key, value] of Object.entries(insertData)) {
|
|
143
|
+
if (Object.prototype.hasOwnProperty.call(updateData, key)) continue;
|
|
144
|
+
output[key] = value;
|
|
145
|
+
}
|
|
146
|
+
return output;
|
|
147
|
+
}
|
|
140
148
|
function isExecLike(value) {
|
|
141
149
|
return !!value && typeof value === "object" && "exec" in value;
|
|
142
150
|
}
|
|
@@ -315,7 +323,9 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
315
323
|
});
|
|
316
324
|
return rows[0] ?? null;
|
|
317
325
|
}
|
|
318
|
-
const query = getModel(model.name).findOne(
|
|
326
|
+
const query = getModel(model.name).findOne(
|
|
327
|
+
compileWhere(model, args.where)
|
|
328
|
+
);
|
|
319
329
|
if (state.session) query.session(state.session);
|
|
320
330
|
query.lean();
|
|
321
331
|
return query.exec();
|
|
@@ -550,7 +560,10 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
550
560
|
const updated = await getModel(model).findOneAndUpdate(
|
|
551
561
|
compileWhere(manifest.models[model], args.where),
|
|
552
562
|
{
|
|
553
|
-
$set: buildUpdate(
|
|
563
|
+
$set: buildUpdate(
|
|
564
|
+
manifest.models[model],
|
|
565
|
+
args.data
|
|
566
|
+
)
|
|
554
567
|
},
|
|
555
568
|
{
|
|
556
569
|
new: true,
|
|
@@ -568,7 +581,10 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
568
581
|
},
|
|
569
582
|
async updateMany(schema, model, args) {
|
|
570
583
|
const manifest = getManifest(schema);
|
|
571
|
-
const update = buildUpdate(
|
|
584
|
+
const update = buildUpdate(
|
|
585
|
+
manifest.models[model],
|
|
586
|
+
args.data
|
|
587
|
+
);
|
|
572
588
|
if (!Object.keys(update).length) return 0;
|
|
573
589
|
const result = await execute(
|
|
574
590
|
getModel(model).updateMany(
|
|
@@ -599,11 +615,12 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
599
615
|
conflict
|
|
600
616
|
)
|
|
601
617
|
);
|
|
618
|
+
const update = buildUpdate(modelManifest, args.update);
|
|
602
619
|
const updated = await getModel(model).findOneAndUpdate(
|
|
603
620
|
compileWhere(modelManifest, args.where),
|
|
604
621
|
{
|
|
605
|
-
$set:
|
|
606
|
-
$setOnInsert: created
|
|
622
|
+
$set: update,
|
|
623
|
+
$setOnInsert: removeOverlappingInsertFields(created, update)
|
|
607
624
|
},
|
|
608
625
|
{
|
|
609
626
|
upsert: true,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\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 type OrmDriver,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype MongoRow = Record<string, unknown>;\ntype MongoFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype MongoWhere = Where<MongoFilterRecord>;\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,\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\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 isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\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 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 extractEqualityValue(filter: unknown) {\n if (!isFilterObject(filter)) {\n return {\n supported: true,\n value: filter,\n };\n }\n\n const keys = Object.keys(filter);\n if (keys.length === 1 && \"eq\" in filter) {\n return {\n supported: true,\n value: filter.eq,\n };\n }\n\n return {\n supported: false,\n value: undefined,\n };\n}\n\nfunction extractUpsertConflict(model: ManifestModel, where: MongoWhere) {\n const keys = Object.keys(where).filter((key) => key !== \"AND\" && key !== \"OR\" && key !== \"NOT\");\n\n if (\"AND\" in where || \"OR\" in where || \"NOT\" in where || keys.length !== 1) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires a single unique equality filter in \"where\".`,\n );\n }\n\n const fieldName = keys[0]!;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!(field.kind === \"id\" || field.unique)) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to be unique or an id field.`,\n );\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n return {\n field,\n value,\n };\n}\n\nfunction mergeUpsertCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const currentValue = createData[conflict.field.name];\n if (currentValue !== undefined && currentValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires create.${conflict.field.name} to match where.${conflict.field.name}.`,\n );\n }\n\n return {\n ...createData,\n [conflict.field.name]: currentValue ?? conflict.value,\n };\n}\n\nfunction validateUpsertUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const nextValue = updateData[conflict.field.name];\n if (nextValue !== undefined && nextValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" cannot change the conflict field \"${conflict.field.name}\".`,\n );\n }\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> {\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 === \"boolean\") {\n next = Boolean(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 === \"boolean\") {\n return Boolean(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 (!isFilterObject(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(model: ManifestModel, where: MongoWhere | undefined): 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(compileWhere(model, args.where));\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>(run: (driver: OrmDriver<TSchema>) => Promise<TResult>) {\n if (state.session) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const startSession = 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 (\n session.startTransaction &&\n session.commitTransaction &&\n session.abortTransaction\n ) {\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> = {\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 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 created = await normalizeCreated(\n getModel(model).create(\n buildDocument(manifest.models[model], args.data as Partial<Record<string, unknown>>),\n state.session ? { session: state.session } : undefined,\n ),\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(manifest.models[model], args.data as Partial<Record<string, unknown>>),\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(manifest.models[model], args.data as Partial<Record<string, unknown>>);\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 conflict = extractUpsertConflict(modelManifest, args.where as MongoWhere);\n validateUpsertUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n conflict,\n );\n const created = buildDocument(\n modelManifest,\n mergeUpsertCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n conflict,\n ),\n );\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(modelManifest, args.where as MongoWhere),\n {\n $set: buildUpdate(modelManifest, args.update as Partial<Record<string, unknown>>),\n $setOnInsert: created,\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 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 type OrmDriver,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype MongoRow = Record<string, unknown>;\ntype MongoFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype MongoWhere = Where<MongoFilterRecord>;\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,\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\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 isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\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 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 extractEqualityValue(filter: unknown) {\n if (!isFilterObject(filter)) {\n return {\n supported: true,\n value: filter,\n };\n }\n\n const keys = Object.keys(filter);\n if (keys.length === 1 && \"eq\" in filter) {\n return {\n supported: true,\n value: filter.eq,\n };\n }\n\n return {\n supported: false,\n value: undefined,\n };\n}\n\nfunction extractUpsertConflict(model: ManifestModel, where: MongoWhere) {\n const keys = Object.keys(where).filter((key) => key !== \"AND\" && key !== \"OR\" && key !== \"NOT\");\n\n if (\"AND\" in where || \"OR\" in where || \"NOT\" in where || keys.length !== 1) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires a single unique equality filter in \"where\".`,\n );\n }\n\n const fieldName = keys[0]!;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!(field.kind === \"id\" || field.unique)) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to be unique or an id field.`,\n );\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n return {\n field,\n value,\n };\n}\n\nfunction mergeUpsertCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const currentValue = createData[conflict.field.name];\n if (currentValue !== undefined && currentValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires create.${conflict.field.name} to match where.${conflict.field.name}.`,\n );\n }\n\n return {\n ...createData,\n [conflict.field.name]: currentValue ?? conflict.value,\n };\n}\n\nfunction validateUpsertUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const nextValue = updateData[conflict.field.name];\n if (nextValue !== undefined && nextValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" cannot change the conflict field \"${conflict.field.name}\".`,\n );\n }\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> {\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 === \"boolean\") {\n next = Boolean(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 === \"boolean\") {\n return Boolean(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 (!isFilterObject(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>(run: (driver: OrmDriver<TSchema>) => Promise<TResult>) {\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> = {\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 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 created = await normalizeCreated(\n getModel(model).create(\n buildDocument(manifest.models[model], args.data as Partial<Record<string, unknown>>),\n state.session ? { session: state.session } : undefined,\n ),\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 conflict = extractUpsertConflict(modelManifest, args.where as MongoWhere);\n validateUpsertUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n conflict,\n );\n const created = buildDocument(\n modelManifest,\n mergeUpsertCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n conflict,\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"]}
|
package/dist/index.js
CHANGED
|
@@ -115,6 +115,14 @@ function validateUpsertUpdateData(model, updateData, conflict) {
|
|
|
115
115
|
);
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
|
+
function removeOverlappingInsertFields(insertData, updateData) {
|
|
119
|
+
const output = {};
|
|
120
|
+
for (const [key, value] of Object.entries(insertData)) {
|
|
121
|
+
if (Object.prototype.hasOwnProperty.call(updateData, key)) continue;
|
|
122
|
+
output[key] = value;
|
|
123
|
+
}
|
|
124
|
+
return output;
|
|
125
|
+
}
|
|
118
126
|
function isExecLike(value) {
|
|
119
127
|
return !!value && typeof value === "object" && "exec" in value;
|
|
120
128
|
}
|
|
@@ -293,7 +301,9 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
293
301
|
});
|
|
294
302
|
return rows[0] ?? null;
|
|
295
303
|
}
|
|
296
|
-
const query = getModel(model.name).findOne(
|
|
304
|
+
const query = getModel(model.name).findOne(
|
|
305
|
+
compileWhere(model, args.where)
|
|
306
|
+
);
|
|
297
307
|
if (state.session) query.session(state.session);
|
|
298
308
|
query.lean();
|
|
299
309
|
return query.exec();
|
|
@@ -528,7 +538,10 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
528
538
|
const updated = await getModel(model).findOneAndUpdate(
|
|
529
539
|
compileWhere(manifest.models[model], args.where),
|
|
530
540
|
{
|
|
531
|
-
$set: buildUpdate(
|
|
541
|
+
$set: buildUpdate(
|
|
542
|
+
manifest.models[model],
|
|
543
|
+
args.data
|
|
544
|
+
)
|
|
532
545
|
},
|
|
533
546
|
{
|
|
534
547
|
new: true,
|
|
@@ -546,7 +559,10 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
546
559
|
},
|
|
547
560
|
async updateMany(schema, model, args) {
|
|
548
561
|
const manifest = getManifest(schema);
|
|
549
|
-
const update = buildUpdate(
|
|
562
|
+
const update = buildUpdate(
|
|
563
|
+
manifest.models[model],
|
|
564
|
+
args.data
|
|
565
|
+
);
|
|
550
566
|
if (!Object.keys(update).length) return 0;
|
|
551
567
|
const result = await execute(
|
|
552
568
|
getModel(model).updateMany(
|
|
@@ -577,11 +593,12 @@ function createMongooseDriverInternal(config, state = {}) {
|
|
|
577
593
|
conflict
|
|
578
594
|
)
|
|
579
595
|
);
|
|
596
|
+
const update = buildUpdate(modelManifest, args.update);
|
|
580
597
|
const updated = await getModel(model).findOneAndUpdate(
|
|
581
598
|
compileWhere(modelManifest, args.where),
|
|
582
599
|
{
|
|
583
|
-
$set:
|
|
584
|
-
$setOnInsert: created
|
|
600
|
+
$set: update,
|
|
601
|
+
$setOnInsert: removeOverlappingInsertFields(created, update)
|
|
585
602
|
},
|
|
586
603
|
{
|
|
587
604
|
upsert: true,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\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 type OrmDriver,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype MongoRow = Record<string, unknown>;\ntype MongoFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype MongoWhere = Where<MongoFilterRecord>;\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,\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\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 isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\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 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 extractEqualityValue(filter: unknown) {\n if (!isFilterObject(filter)) {\n return {\n supported: true,\n value: filter,\n };\n }\n\n const keys = Object.keys(filter);\n if (keys.length === 1 && \"eq\" in filter) {\n return {\n supported: true,\n value: filter.eq,\n };\n }\n\n return {\n supported: false,\n value: undefined,\n };\n}\n\nfunction extractUpsertConflict(model: ManifestModel, where: MongoWhere) {\n const keys = Object.keys(where).filter((key) => key !== \"AND\" && key !== \"OR\" && key !== \"NOT\");\n\n if (\"AND\" in where || \"OR\" in where || \"NOT\" in where || keys.length !== 1) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires a single unique equality filter in \"where\".`,\n );\n }\n\n const fieldName = keys[0]!;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!(field.kind === \"id\" || field.unique)) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to be unique or an id field.`,\n );\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n return {\n field,\n value,\n };\n}\n\nfunction mergeUpsertCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const currentValue = createData[conflict.field.name];\n if (currentValue !== undefined && currentValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires create.${conflict.field.name} to match where.${conflict.field.name}.`,\n );\n }\n\n return {\n ...createData,\n [conflict.field.name]: currentValue ?? conflict.value,\n };\n}\n\nfunction validateUpsertUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const nextValue = updateData[conflict.field.name];\n if (nextValue !== undefined && nextValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" cannot change the conflict field \"${conflict.field.name}\".`,\n );\n }\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> {\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 === \"boolean\") {\n next = Boolean(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 === \"boolean\") {\n return Boolean(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 (!isFilterObject(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(model: ManifestModel, where: MongoWhere | undefined): 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(compileWhere(model, args.where));\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>(run: (driver: OrmDriver<TSchema>) => Promise<TResult>) {\n if (state.session) {\n return run(createMongooseDriverInternal(config, state));\n }\n\n const startSession = 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 (\n session.startTransaction &&\n session.commitTransaction &&\n session.abortTransaction\n ) {\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> = {\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 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 created = await normalizeCreated(\n getModel(model).create(\n buildDocument(manifest.models[model], args.data as Partial<Record<string, unknown>>),\n state.session ? { session: state.session } : undefined,\n ),\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(manifest.models[model], args.data as Partial<Record<string, unknown>>),\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(manifest.models[model], args.data as Partial<Record<string, unknown>>);\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 conflict = extractUpsertConflict(modelManifest, args.where as MongoWhere);\n validateUpsertUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n conflict,\n );\n const created = buildDocument(\n modelManifest,\n mergeUpsertCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n conflict,\n ),\n );\n const updated = await getModel(model)\n .findOneAndUpdate(\n compileWhere(modelManifest, args.where as MongoWhere),\n {\n $set: buildUpdate(modelManifest, args.update as Partial<Record<string, unknown>>),\n $setOnInsert: created,\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 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 type OrmDriver,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype MongoRow = Record<string, unknown>;\ntype MongoFilterRecord = Record<string, string | number | boolean | Date | null>;\ntype MongoWhere = Where<MongoFilterRecord>;\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,\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\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 isFilterObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !(value instanceof Date) && !Array.isArray(value);\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 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 extractEqualityValue(filter: unknown) {\n if (!isFilterObject(filter)) {\n return {\n supported: true,\n value: filter,\n };\n }\n\n const keys = Object.keys(filter);\n if (keys.length === 1 && \"eq\" in filter) {\n return {\n supported: true,\n value: filter.eq,\n };\n }\n\n return {\n supported: false,\n value: undefined,\n };\n}\n\nfunction extractUpsertConflict(model: ManifestModel, where: MongoWhere) {\n const keys = Object.keys(where).filter((key) => key !== \"AND\" && key !== \"OR\" && key !== \"NOT\");\n\n if (\"AND\" in where || \"OR\" in where || \"NOT\" in where || keys.length !== 1) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires a single unique equality filter in \"where\".`,\n );\n }\n\n const fieldName = keys[0]!;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n\n if (!(field.kind === \"id\" || field.unique)) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to be unique or an id field.`,\n );\n }\n\n const { supported, value } = extractEqualityValue(where[fieldName]);\n if (!supported || value === undefined || value === null) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires the \"where\" field \"${fieldName}\" to use a single non-null equality value.`,\n );\n }\n\n return {\n field,\n value,\n };\n}\n\nfunction mergeUpsertCreateData(\n model: ManifestModel,\n createData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const currentValue = createData[conflict.field.name];\n if (currentValue !== undefined && currentValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" requires create.${conflict.field.name} to match where.${conflict.field.name}.`,\n );\n }\n\n return {\n ...createData,\n [conflict.field.name]: currentValue ?? conflict.value,\n };\n}\n\nfunction validateUpsertUpdateData(\n model: ManifestModel,\n updateData: Partial<Record<string, unknown>>,\n conflict: { field: ManifestField; value: unknown },\n) {\n const nextValue = updateData[conflict.field.name];\n if (nextValue !== undefined && nextValue !== conflict.value) {\n throw new Error(\n `Upsert on model \"${model.name}\" cannot change the conflict field \"${conflict.field.name}\".`,\n );\n }\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> {\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 === \"boolean\") {\n next = Boolean(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 === \"boolean\") {\n return Boolean(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 (!isFilterObject(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>(run: (driver: OrmDriver<TSchema>) => Promise<TResult>) {\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> = {\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 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 created = await normalizeCreated(\n getModel(model).create(\n buildDocument(manifest.models[model], args.data as Partial<Record<string, unknown>>),\n state.session ? { session: state.session } : undefined,\n ),\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 conflict = extractUpsertConflict(modelManifest, args.where as MongoWhere);\n validateUpsertUpdateData(\n modelManifest,\n args.update as Partial<Record<string, unknown>>,\n conflict,\n );\n const created = buildDocument(\n modelManifest,\n mergeUpsertCreateData(\n modelManifest,\n args.create as Partial<Record<string, unknown>>,\n conflict,\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"]}
|
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.2",
|
|
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.2"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"mongoose": "^8.19.2",
|