equipped 5.2.7 → 5.2.8

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/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [5.2.8](https://github.com/kevinand11/equipped/compare/v5.2.7...v5.2.8) (2026-03-02)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * dont covert undefined to null in mongo ([81b3870](https://github.com/kevinand11/equipped/commit/81b3870e4f84220a0f5022816d8c3954f19751fd))
11
+
5
12
  ### [5.2.7](https://github.com/kevinand11/equipped/compare/v5.2.6...v5.2.7) (2026-03-02)
6
13
 
7
14
  ### [5.2.6](https://github.com/kevinand11/equipped/compare/v5.2.5...v5.2.6) (2026-02-26)
@@ -17,7 +17,7 @@ class MongoDb extends _dbcjs.Db {
17
17
  constructor(mongoConfig, dbConfig) {
18
18
  super(dbConfig);
19
19
  this.mongoConfig = mongoConfig;
20
- this.client = new (0, _mongodb.MongoClient)(mongoConfig.uri);
20
+ this.client = new (0, _mongodb.MongoClient)(mongoConfig.uri, { ignoreUndefined: true });
21
21
  _indexcjs3.Instance.on(
22
22
  "start",
23
23
  async () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/db.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\ttype CollectionInfo,\n\tMongoClient,\n\tObjectId,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri)\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (!bulk.length) return\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/db.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\ttype CollectionInfo,\n\tMongoClient,\n\tObjectId,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true })\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (!bulk.length) return\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _nodeasync_hooks = require('node:async_hooks');var _mongodb = require('mongodb');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');require('../base/core');var _dbmincjs = require('../base/db.min.cjs');var _changesmincjs = require('./changes.min.cjs');var _querymincjs = require('./query.min.cjs');const p="_id",l=new (0, _nodeasync_hooks.AsyncLocalStorage)(void 0);class F extends _dbmincjs.Db{constructor(i,a){super(a);this.mongoConfig=i;this.client=new (0, _mongodb.MongoClient)(i.uri),_indexmincjs3.Instance.on("start",async()=>{await this.client.connect();const m=this.#e.reduce((d,u)=>(d[u.db]||(d[u.db]=[]),d[u.db].push(u.col),d),{}),y={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(m).map(async([d,u])=>{const o=this.client.db(d),e=await o.listCollections().toArray();return u.map(async t=>{const n=e.find(r=>r.name===t);n?_optionalChain([n, 'access', _ => _.options, 'optionalAccess', _2 => _2.changeStreamPreAndPostImages, 'optionalAccess', _3 => _3.enabled])!==y.changeStreamPreAndPostImages.enabled&&await o.command({collMod:t,...y}):await o.createCollection(t,y)})}))},3),_indexmincjs3.Instance.on("close",async()=>this.client.close(),1)}#e=[];async session(i){if(l.getStore())return i();const a=await this.client.startSession();return a.withTransaction(async()=>l.run(a,i))}id(){return new _mongodb.ObjectId}use(i){const a=this.getScopedDb(i.db);return this.#e.push({db:a,col:i.col}),this.#t(i,this.client.db(a).collection(i.col))}#t(i,a){async function m(e){const n=(Array.isArray(e)?e:[e]).map(r=>i.mapper(r));return Array.isArray(e)?n:n[0]}function y(e,t,n,r){const s={[p]:t,..._optionalChain([i, 'access', _4 => _4.options, 'optionalAccess', _5 => _5.skipAudit])?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...e,...s}}function d(e,t,n=!1){return{...e,$set:{...e.$set,...n||Object.keys(e).length>0&&!_optionalChain([i, 'access', _6 => _6.options, 'optionalAccess', _7 => _7.skipAudit])?{updatedAt:t.getTime()}:{}}}}const u=this,o={config:i,extras:{collection:a},query:async e=>{const t=await _querymincjs.parseMongodbQueryParams.call(void 0, a,e);return{...t,results:await m(t.results)}},findMany:async(e,t={})=>{const r=(Array.isArray(t.sort)?t.sort:t.sort?[t.sort]:[]).map(c=>[c.field,c.desc?"desc":"asc"]),s=await a.find(e,{session:l.getStore(),limit:t.limit,sort:r}).toArray();return m(s)},findOne:async e=>await _asyncNullishCoalesce((await o.findMany(e,{limit:1})).at(0), async () => (null)),findById:async e=>await o.findOne({[p]:e}),insertMany:async(e,t={})=>{const n=_nullishCoalesce(_optionalChain([t, 'access', _8 => _8.getTime, 'optionalCall', _9 => _9()]), () => (new Date)),r=e.map((c,f)=>y(c,_nullishCoalesce(_optionalChain([t, 'access', _10 => _10.makeId, 'optionalCall', _11 => _11(f)]), () => (new (0, _mongodb.ObjectId)().toString())),n));return await a.insertMany(r,{session:l.getStore()}),(await Promise.all(r.map(async c=>await o.findById(c[p])))).filter(c=>!!c)},insertOne:async(e,t={})=>(await o.insertMany([e],t))[0],updateMany:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _12 => _12.getTime, 'optionalCall', _13 => _13()]), () => (new Date)),s=l.getStore(),f=(await a.find(e,{session:s,projection:{[p]:1}}).toArray()).map(I=>I[p]),M={[p]:{$in:f}};return await a.updateMany(M,d(t,r),{session:s}),o.findMany(M)},updateOne:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _14 => _14.getTime, 'optionalCall', _15 => _15()]), () => (new Date)),s=await a.findOneAndUpdate(e,d(t,r),{returnDocument:"after",session:l.getStore()});return s?m(s):null},updateById:async(e,t,n={})=>await o.updateOne({[p]:e},t,n),upsertOne:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _16 => _16.getTime, 'optionalCall', _17 => _17()]), () => (new Date)),s=await a.findOneAndUpdate(e,{...d("update"in t?t.update:{},r,!0),$setOnInsert:y(t.insert,_nullishCoalesce(_optionalChain([n, 'access', _18 => _18.makeId, 'optionalCall', _19 => _19()]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)},{returnDocument:"after",session:l.getStore(),upsert:!0});return m(s)},deleteMany:async(e,t={})=>{const n=await o.findMany(e,t);return await a.deleteMany(e,{session:l.getStore()}),n},deleteOne:async e=>{const t=await a.findOneAndDelete(e,{session:l.getStore()});return t?m(t):null},deleteById:async e=>await o.deleteOne({[p]:e}),bulkWrite:async(e,t={})=>{const n=a.initializeUnorderedBulkOp({session:l.getStore()}),r=_nullishCoalesce(_optionalChain([t, 'access', _20 => _20.getTime, 'optionalCall', _21 => _21()]), () => (new Date));e.forEach((s,c)=>{switch(s.op){case"insert":n.insert(y(s.value,_nullishCoalesce(_optionalChain([s, 'access', _22 => _22.makeId, 'optionalCall', _23 => _23(c)]), () => (new (0, _mongodb.ObjectId)().toString())),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(d(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...d("update"in s?s.update:{},r,!0),$setOnInsert:y(s.insert,_nullishCoalesce(_optionalChain([s, 'access', _24 => _24.makeId, 'optionalCall', _25 => _25(c)]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)});break;default:throw new (0, _indexmincjs.EquippedError)("Unknown bulkWrite operation",{operation:s})}}),n.length&&await n.execute({session:l.getStore()})},watch(e){return u.config.changes||_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Db changes are not enabled in the configuration.",{config:i})),new (0, _changesmincjs.MongoDbChange)(u.mongoConfig,u.config.changes,a,e,i.mapper)}};return o}}exports.MongoDb = F;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _nodeasync_hooks = require('node:async_hooks');var _mongodb = require('mongodb');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');require('../base/core');var _dbmincjs = require('../base/db.min.cjs');var _changesmincjs = require('./changes.min.cjs');var _querymincjs = require('./query.min.cjs');const p="_id",l=new (0, _nodeasync_hooks.AsyncLocalStorage)(void 0);class F extends _dbmincjs.Db{constructor(i,a){super(a);this.mongoConfig=i;this.client=new (0, _mongodb.MongoClient)(i.uri,{ignoreUndefined:!0}),_indexmincjs3.Instance.on("start",async()=>{await this.client.connect();const m=this.#e.reduce((d,u)=>(d[u.db]||(d[u.db]=[]),d[u.db].push(u.col),d),{}),y={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(m).map(async([d,u])=>{const o=this.client.db(d),e=await o.listCollections().toArray();return u.map(async t=>{const n=e.find(r=>r.name===t);n?_optionalChain([n, 'access', _ => _.options, 'optionalAccess', _2 => _2.changeStreamPreAndPostImages, 'optionalAccess', _3 => _3.enabled])!==y.changeStreamPreAndPostImages.enabled&&await o.command({collMod:t,...y}):await o.createCollection(t,y)})}))},3),_indexmincjs3.Instance.on("close",async()=>this.client.close(),1)}#e=[];async session(i){if(l.getStore())return i();const a=await this.client.startSession();return a.withTransaction(async()=>l.run(a,i))}id(){return new _mongodb.ObjectId}use(i){const a=this.getScopedDb(i.db);return this.#e.push({db:a,col:i.col}),this.#t(i,this.client.db(a).collection(i.col))}#t(i,a){async function m(e){const n=(Array.isArray(e)?e:[e]).map(r=>i.mapper(r));return Array.isArray(e)?n:n[0]}function y(e,t,n,r){const s={[p]:t,..._optionalChain([i, 'access', _4 => _4.options, 'optionalAccess', _5 => _5.skipAudit])?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...e,...s}}function d(e,t,n=!1){return{...e,$set:{...e.$set,...n||Object.keys(e).length>0&&!_optionalChain([i, 'access', _6 => _6.options, 'optionalAccess', _7 => _7.skipAudit])?{updatedAt:t.getTime()}:{}}}}const u=this,o={config:i,extras:{collection:a},query:async e=>{const t=await _querymincjs.parseMongodbQueryParams.call(void 0, a,e);return{...t,results:await m(t.results)}},findMany:async(e,t={})=>{const r=(Array.isArray(t.sort)?t.sort:t.sort?[t.sort]:[]).map(c=>[c.field,c.desc?"desc":"asc"]),s=await a.find(e,{session:l.getStore(),limit:t.limit,sort:r}).toArray();return m(s)},findOne:async e=>await _asyncNullishCoalesce((await o.findMany(e,{limit:1})).at(0), async () => (null)),findById:async e=>await o.findOne({[p]:e}),insertMany:async(e,t={})=>{const n=_nullishCoalesce(_optionalChain([t, 'access', _8 => _8.getTime, 'optionalCall', _9 => _9()]), () => (new Date)),r=e.map((c,f)=>y(c,_nullishCoalesce(_optionalChain([t, 'access', _10 => _10.makeId, 'optionalCall', _11 => _11(f)]), () => (new (0, _mongodb.ObjectId)().toString())),n));return await a.insertMany(r,{session:l.getStore()}),(await Promise.all(r.map(async c=>await o.findById(c[p])))).filter(c=>!!c)},insertOne:async(e,t={})=>(await o.insertMany([e],t))[0],updateMany:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _12 => _12.getTime, 'optionalCall', _13 => _13()]), () => (new Date)),s=l.getStore(),f=(await a.find(e,{session:s,projection:{[p]:1}}).toArray()).map(I=>I[p]),M={[p]:{$in:f}};return await a.updateMany(M,d(t,r),{session:s}),o.findMany(M)},updateOne:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _14 => _14.getTime, 'optionalCall', _15 => _15()]), () => (new Date)),s=await a.findOneAndUpdate(e,d(t,r),{returnDocument:"after",session:l.getStore()});return s?m(s):null},updateById:async(e,t,n={})=>await o.updateOne({[p]:e},t,n),upsertOne:async(e,t,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _16 => _16.getTime, 'optionalCall', _17 => _17()]), () => (new Date)),s=await a.findOneAndUpdate(e,{...d("update"in t?t.update:{},r,!0),$setOnInsert:y(t.insert,_nullishCoalesce(_optionalChain([n, 'access', _18 => _18.makeId, 'optionalCall', _19 => _19()]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)},{returnDocument:"after",session:l.getStore(),upsert:!0});return m(s)},deleteMany:async(e,t={})=>{const n=await o.findMany(e,t);return await a.deleteMany(e,{session:l.getStore()}),n},deleteOne:async e=>{const t=await a.findOneAndDelete(e,{session:l.getStore()});return t?m(t):null},deleteById:async e=>await o.deleteOne({[p]:e}),bulkWrite:async(e,t={})=>{const n=a.initializeUnorderedBulkOp({session:l.getStore()}),r=_nullishCoalesce(_optionalChain([t, 'access', _20 => _20.getTime, 'optionalCall', _21 => _21()]), () => (new Date));e.forEach((s,c)=>{switch(s.op){case"insert":n.insert(y(s.value,_nullishCoalesce(_optionalChain([s, 'access', _22 => _22.makeId, 'optionalCall', _23 => _23(c)]), () => (new (0, _mongodb.ObjectId)().toString())),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(d(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...d("update"in s?s.update:{},r,!0),$setOnInsert:y(s.insert,_nullishCoalesce(_optionalChain([s, 'access', _24 => _24.makeId, 'optionalCall', _25 => _25(c)]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)});break;default:throw new (0, _indexmincjs.EquippedError)("Unknown bulkWrite operation",{operation:s})}}),n.length&&await n.execute({session:l.getStore()})},watch(e){return u.config.changes||_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Db changes are not enabled in the configuration.",{config:i})),new (0, _changesmincjs.MongoDbChange)(u.mongoConfig,u.config.changes,a,e,i.mapper)}};return o}}exports.MongoDb = F;
2
2
  //# sourceMappingURL=db.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/db.ts"],"names":["dbConfig","Instance","grouped","acc","cur","options","collections","db","colName","existing","#cols","sessionStore","callback","session","config","#getTable","transform","doc","mapped","d","prepInsertValue","value","id","now","base","skipUpdate","prepUpdateValue","upsert","dbThis","results","collection","params","filter","p","docs","sort","table","i","payload","data","idKey","values","ids","filterUpd","operation","bulk","ObjectId","EquippedError","callbacks"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.min.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\ttype CollectionInfo,\n\tMongoClient,\n\tObjectId,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri)\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (!bulk.length) return\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/db.ts"],"names":["dbConfig","grouped","acc","cur","options","collections","db","colName","existing","Instance","#cols","sessionStore","callback","session","config","#getTable","transform","doc","mapped","d","prepInsertValue","value","id","now","base","skipUpdate","prepUpdateValue","upsert","dbThis","results","collection","params","filter","p","docs","sort","table","i","payload","data","idKey","values","ids","filterUpd","operation","bulk","ObjectId","EquippedError","callbacks"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/db.min.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\ttype CollectionInfo,\n\tMongoClient,\n\tObjectId,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true })\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (!bulk.length) return\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n"]}
@@ -1,2 +1,2 @@
1
- import{AsyncLocalStorage as h}from"node:async_hooks";import{MongoClient as S,ObjectId as g}from"mongodb";import{EquippedError as b}from "../../errors/index.min.mjs";import{Instance as w}from "../../instance/index.min.mjs";import"../base/core";import{Db as A}from "../base/db.min.mjs";import{MongoDbChange as D}from "./changes.min.mjs";import{parseMongodbQueryParams as C}from "./query.min.mjs";const p="_id",l=new h(void 0);class F extends A{constructor(i,a){super(a);this.mongoConfig=i;this.client=new S(i.uri),w.on("start",async()=>{await this.client.connect();const m=this.#e.reduce((d,u)=>(d[u.db]||(d[u.db]=[]),d[u.db].push(u.col),d),{}),y={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(m).map(async([d,u])=>{const o=this.client.db(d),e=await o.listCollections().toArray();return u.map(async t=>{const n=e.find(r=>r.name===t);n?n.options?.changeStreamPreAndPostImages?.enabled!==y.changeStreamPreAndPostImages.enabled&&await o.command({collMod:t,...y}):await o.createCollection(t,y)})}))},3),w.on("close",async()=>this.client.close(),1)}client;#e=[];async session(i){if(l.getStore())return i();const a=await this.client.startSession();return a.withTransaction(async()=>l.run(a,i))}id(){return new g}use(i){const a=this.getScopedDb(i.db);return this.#e.push({db:a,col:i.col}),this.#t(i,this.client.db(a).collection(i.col))}#t(i,a){async function m(e){const n=(Array.isArray(e)?e:[e]).map(r=>i.mapper(r));return Array.isArray(e)?n:n[0]}function y(e,t,n,r){const s={[p]:t,...i.options?.skipAudit?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...e,...s}}function d(e,t,n=!1){return{...e,$set:{...e.$set,...n||Object.keys(e).length>0&&!i.options?.skipAudit?{updatedAt:t.getTime()}:{}}}}const u=this,o={config:i,extras:{collection:a},query:async e=>{const t=await C(a,e);return{...t,results:await m(t.results)}},findMany:async(e,t={})=>{const r=(Array.isArray(t.sort)?t.sort:t.sort?[t.sort]:[]).map(c=>[c.field,c.desc?"desc":"asc"]),s=await a.find(e,{session:l.getStore(),limit:t.limit,sort:r}).toArray();return m(s)},findOne:async e=>(await o.findMany(e,{limit:1})).at(0)??null,findById:async e=>await o.findOne({[p]:e}),insertMany:async(e,t={})=>{const n=t.getTime?.()??new Date,r=e.map((c,f)=>y(c,t.makeId?.(f)??new g().toString(),n));return await a.insertMany(r,{session:l.getStore()}),(await Promise.all(r.map(async c=>await o.findById(c[p])))).filter(c=>!!c)},insertOne:async(e,t={})=>(await o.insertMany([e],t))[0],updateMany:async(e,t,n={})=>{const r=n.getTime?.()??new Date,s=l.getStore(),f=(await a.find(e,{session:s,projection:{[p]:1}}).toArray()).map(I=>I[p]),M={[p]:{$in:f}};return await a.updateMany(M,d(t,r),{session:s}),o.findMany(M)},updateOne:async(e,t,n={})=>{const r=n.getTime?.()??new Date,s=await a.findOneAndUpdate(e,d(t,r),{returnDocument:"after",session:l.getStore()});return s?m(s):null},updateById:async(e,t,n={})=>await o.updateOne({[p]:e},t,n),upsertOne:async(e,t,n={})=>{const r=n.getTime?.()??new Date,s=await a.findOneAndUpdate(e,{...d("update"in t?t.update:{},r,!0),$setOnInsert:y(t.insert,n.makeId?.()??new g().toString(),r,!0)},{returnDocument:"after",session:l.getStore(),upsert:!0});return m(s)},deleteMany:async(e,t={})=>{const n=await o.findMany(e,t);return await a.deleteMany(e,{session:l.getStore()}),n},deleteOne:async e=>{const t=await a.findOneAndDelete(e,{session:l.getStore()});return t?m(t):null},deleteById:async e=>await o.deleteOne({[p]:e}),bulkWrite:async(e,t={})=>{const n=a.initializeUnorderedBulkOp({session:l.getStore()}),r=t.getTime?.()??new Date;e.forEach((s,c)=>{switch(s.op){case"insert":n.insert(y(s.value,s.makeId?.(c)??new g().toString(),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(d(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...d("update"in s?s.update:{},r,!0),$setOnInsert:y(s.insert,s.makeId?.(c)??new g().toString(),r,!0)});break;default:throw new b("Unknown bulkWrite operation",{operation:s})}}),n.length&&await n.execute({session:l.getStore()})},watch(e){return u.config.changes||w.crash(new b("Db changes are not enabled in the configuration.",{config:i})),new D(u.mongoConfig,u.config.changes,a,e,i.mapper)}};return o}}export{F as MongoDb};
1
+ import{AsyncLocalStorage as h}from"node:async_hooks";import{MongoClient as S,ObjectId as g}from"mongodb";import{EquippedError as b}from "../../errors/index.min.mjs";import{Instance as w}from "../../instance/index.min.mjs";import"../base/core";import{Db as A}from "../base/db.min.mjs";import{MongoDbChange as D}from "./changes.min.mjs";import{parseMongodbQueryParams as C}from "./query.min.mjs";const p="_id",l=new h(void 0);class F extends A{constructor(i,a){super(a);this.mongoConfig=i;this.client=new S(i.uri,{ignoreUndefined:!0}),w.on("start",async()=>{await this.client.connect();const m=this.#e.reduce((d,u)=>(d[u.db]||(d[u.db]=[]),d[u.db].push(u.col),d),{}),y={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(m).map(async([d,u])=>{const o=this.client.db(d),e=await o.listCollections().toArray();return u.map(async t=>{const n=e.find(r=>r.name===t);n?n.options?.changeStreamPreAndPostImages?.enabled!==y.changeStreamPreAndPostImages.enabled&&await o.command({collMod:t,...y}):await o.createCollection(t,y)})}))},3),w.on("close",async()=>this.client.close(),1)}client;#e=[];async session(i){if(l.getStore())return i();const a=await this.client.startSession();return a.withTransaction(async()=>l.run(a,i))}id(){return new g}use(i){const a=this.getScopedDb(i.db);return this.#e.push({db:a,col:i.col}),this.#t(i,this.client.db(a).collection(i.col))}#t(i,a){async function m(e){const n=(Array.isArray(e)?e:[e]).map(r=>i.mapper(r));return Array.isArray(e)?n:n[0]}function y(e,t,n,r){const s={[p]:t,...i.options?.skipAudit?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...e,...s}}function d(e,t,n=!1){return{...e,$set:{...e.$set,...n||Object.keys(e).length>0&&!i.options?.skipAudit?{updatedAt:t.getTime()}:{}}}}const u=this,o={config:i,extras:{collection:a},query:async e=>{const t=await C(a,e);return{...t,results:await m(t.results)}},findMany:async(e,t={})=>{const r=(Array.isArray(t.sort)?t.sort:t.sort?[t.sort]:[]).map(c=>[c.field,c.desc?"desc":"asc"]),s=await a.find(e,{session:l.getStore(),limit:t.limit,sort:r}).toArray();return m(s)},findOne:async e=>(await o.findMany(e,{limit:1})).at(0)??null,findById:async e=>await o.findOne({[p]:e}),insertMany:async(e,t={})=>{const n=t.getTime?.()??new Date,r=e.map((c,f)=>y(c,t.makeId?.(f)??new g().toString(),n));return await a.insertMany(r,{session:l.getStore()}),(await Promise.all(r.map(async c=>await o.findById(c[p])))).filter(c=>!!c)},insertOne:async(e,t={})=>(await o.insertMany([e],t))[0],updateMany:async(e,t,n={})=>{const r=n.getTime?.()??new Date,s=l.getStore(),f=(await a.find(e,{session:s,projection:{[p]:1}}).toArray()).map(I=>I[p]),M={[p]:{$in:f}};return await a.updateMany(M,d(t,r),{session:s}),o.findMany(M)},updateOne:async(e,t,n={})=>{const r=n.getTime?.()??new Date,s=await a.findOneAndUpdate(e,d(t,r),{returnDocument:"after",session:l.getStore()});return s?m(s):null},updateById:async(e,t,n={})=>await o.updateOne({[p]:e},t,n),upsertOne:async(e,t,n={})=>{const r=n.getTime?.()??new Date,s=await a.findOneAndUpdate(e,{...d("update"in t?t.update:{},r,!0),$setOnInsert:y(t.insert,n.makeId?.()??new g().toString(),r,!0)},{returnDocument:"after",session:l.getStore(),upsert:!0});return m(s)},deleteMany:async(e,t={})=>{const n=await o.findMany(e,t);return await a.deleteMany(e,{session:l.getStore()}),n},deleteOne:async e=>{const t=await a.findOneAndDelete(e,{session:l.getStore()});return t?m(t):null},deleteById:async e=>await o.deleteOne({[p]:e}),bulkWrite:async(e,t={})=>{const n=a.initializeUnorderedBulkOp({session:l.getStore()}),r=t.getTime?.()??new Date;e.forEach((s,c)=>{switch(s.op){case"insert":n.insert(y(s.value,s.makeId?.(c)??new g().toString(),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(d(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...d("update"in s?s.update:{},r,!0),$setOnInsert:y(s.insert,s.makeId?.(c)??new g().toString(),r,!0)});break;default:throw new b("Unknown bulkWrite operation",{operation:s})}}),n.length&&await n.execute({session:l.getStore()})},watch(e){return u.config.changes||w.crash(new b("Db changes are not enabled in the configuration.",{config:i})),new D(u.mongoConfig,u.config.changes,a,e,i.mapper)}};return o}}export{F as MongoDb};
2
2
  //# sourceMappingURL=db.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/db.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\ttype CollectionInfo,\n\tMongoClient,\n\tObjectId,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri)\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (!bulk.length) return\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n"],"mappings":"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","names":["AsyncLocalStorage","MongoClient","ObjectId","EquippedError","Instance","Db","MongoDbChange","parseMongodbQueryParams","idKey","sessionStore","MongoDb","mongoConfig","dbConfig","grouped","#cols","acc","cur","options","dbName","colNames","db","collections","colName","existing","collection","callback","session","config","#getTable","transform","doc","mapped","d","prepInsertValue","value","id","now","skipUpdate","base","prepUpdateValue","upsert","dbThis","table","params","results","filter","sort","p","docs","values","payload","i","data","ids","filterUpd","operations","bulk","operation","callbacks"]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/db.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\ttype CollectionInfo,\n\tMongoClient,\n\tObjectId,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true })\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (!bulk.length) return\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n"],"mappings":"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","names":["AsyncLocalStorage","MongoClient","ObjectId","EquippedError","Instance","Db","MongoDbChange","parseMongodbQueryParams","idKey","sessionStore","MongoDb","mongoConfig","dbConfig","grouped","#cols","acc","cur","options","dbName","colNames","db","collections","colName","existing","collection","callback","session","config","#getTable","transform","doc","mapped","d","prepInsertValue","value","id","now","skipUpdate","base","prepUpdateValue","upsert","dbThis","table","params","results","filter","sort","p","docs","values","payload","i","data","ids","filterUpd","operations","bulk","operation","callbacks"]}
@@ -17,7 +17,7 @@ class MongoDb extends Db {
17
17
  constructor(mongoConfig, dbConfig) {
18
18
  super(dbConfig);
19
19
  this.mongoConfig = mongoConfig;
20
- this.client = new MongoClient(mongoConfig.uri);
20
+ this.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true });
21
21
  Instance.on(
22
22
  "start",
23
23
  async () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/db.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\ttype CollectionInfo,\n\tMongoClient,\n\tObjectId,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri)\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (!bulk.length) return\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/db.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\ttype CollectionInfo,\n\tMongoClient,\n\tObjectId,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true })\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (!bulk.length) return\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -17,7 +17,7 @@ class MongoDb extends Db {
17
17
  constructor(mongoConfig, dbConfig) {
18
18
  super(dbConfig);
19
19
  this.mongoConfig = mongoConfig;
20
- this.client = new MongoClient(mongoConfig.uri);
20
+ this.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true });
21
21
  Instance.on(
22
22
  "start",
23
23
  async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "equipped",
3
- "version": "5.2.7",
3
+ "version": "5.2.8",
4
4
  "private": false,
5
5
  "description": "",
6
6
  "type": "module",