equipped 5.0.14 → 5.0.15

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.
Files changed (35) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/dbs/mongo/api.cjs +4 -6
  3. package/dist/cjs/dbs/mongo/api.cjs.map +1 -1
  4. package/dist/cjs/dbs/mongo/api.min.cjs +1 -1
  5. package/dist/cjs/dbs/mongo/api.min.cjs.map +1 -1
  6. package/dist/cjs/dbs/mongo/index.cjs +8 -8
  7. package/dist/cjs/dbs/mongo/index.cjs.map +1 -1
  8. package/dist/cjs/dbs/mongo/index.min.cjs +1 -1
  9. package/dist/cjs/dbs/mongo/index.min.cjs.map +1 -1
  10. package/dist/cjs/server/openapi.cjs +1 -1
  11. package/dist/cjs/server/openapi.cjs.map +1 -1
  12. package/dist/cjs/server/openapi.min.cjs +1 -1
  13. package/dist/cjs/server/openapi.min.cjs.map +1 -1
  14. package/dist/esm/dbs/mongo/api.min.mjs +1 -1
  15. package/dist/esm/dbs/mongo/api.min.mjs.map +1 -1
  16. package/dist/esm/dbs/mongo/api.mjs +4 -6
  17. package/dist/esm/dbs/mongo/api.mjs.map +1 -1
  18. package/dist/esm/dbs/mongo/index.min.mjs +1 -1
  19. package/dist/esm/dbs/mongo/index.min.mjs.map +1 -1
  20. package/dist/esm/dbs/mongo/index.mjs +8 -8
  21. package/dist/esm/dbs/mongo/index.mjs.map +1 -1
  22. package/dist/esm/server/openapi.min.mjs +1 -1
  23. package/dist/esm/server/openapi.min.mjs.map +1 -1
  24. package/dist/esm/server/openapi.mjs +1 -1
  25. package/dist/esm/server/openapi.mjs.map +1 -1
  26. package/dist/types/dbs/index.d.ts +2 -2
  27. package/dist/types/dbs/mongo/api.js +4 -6
  28. package/dist/types/dbs/mongo/index.js +8 -8
  29. package/dist/types/{index-5Qkb5V68.d.ts → index-BS53hVyq.d.ts} +1 -1
  30. package/dist/types/{index-CegB2bgP.d.ts → index-CfuXekZB.d.ts} +2 -1
  31. package/dist/types/index.d.ts +2 -2
  32. package/dist/types/instance/index.d.ts +2 -2
  33. package/dist/types/server/index.d.ts +3 -3
  34. package/dist/types/server/openapi.js +1 -1
  35. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
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.0.15](https://github.com/kevinand11/equipped/compare/v5.0.14...v5.0.15) (2025-07-06)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * docs is hosted at ./index.html instead of ./ ([98e999c](https://github.com/kevinand11/equipped/commit/98e999c004b03697f87a908f04979a7c0e647e9f))
11
+ * updatedAt for upsert ([b956e7a](https://github.com/kevinand11/equipped/commit/b956e7ae6d37ded65e260376dc2527902a6b0373))
12
+
5
13
  ### [5.0.14](https://github.com/kevinand11/equipped/compare/v5.0.13...v5.0.14) (2025-07-06)
6
14
 
7
15
 
@@ -21,14 +21,12 @@ function getTable(config, collection) {
21
21
  ...base
22
22
  };
23
23
  }
24
- function prepUpdateValue(value, now) {
24
+ function prepUpdateValue(value, now, upsert = false) {
25
25
  return {
26
26
  ...value,
27
27
  $set: {
28
28
  ...value.$set,
29
- ...Object.keys(value).length > 0 && !_optionalChain([config, 'access', _3 => _3.options, 'optionalAccess', _4 => _4.skipAudit]) ? {
30
- updatedAt: now.getTime()
31
- } : {}
29
+ ...upsert || Object.keys(value).length > 0 && !_optionalChain([config, 'access', _3 => _3.options, 'optionalAccess', _4 => _4.skipAudit]) ? { updatedAt: now.getTime() } : {}
32
30
  }
33
31
  };
34
32
  }
@@ -93,7 +91,7 @@ function getTable(config, collection) {
93
91
  const doc = await collection.findOneAndUpdate(
94
92
  filter,
95
93
  {
96
- ...prepUpdateValue("update" in values ? values.update : {}, now),
94
+ ...prepUpdateValue("update" in values ? values.update : {}, now, true),
97
95
  // @ts-expect-error fighting ts
98
96
  $setOnInsert: prepInsertValue(values.insert, _nullishCoalesce(_optionalChain([options, 'access', _15 => _15.makeId, 'optionalCall', _16 => _16()]), () => ( new (0, _mongodb.ObjectId)().toString())), now, true)
99
97
  },
@@ -130,7 +128,7 @@ function getTable(config, collection) {
130
128
  break;
131
129
  case "upsert":
132
130
  bulk.find(operation.filter).upsert().update({
133
- ...prepUpdateValue("update" in operation ? operation.update : {}, now),
131
+ ...prepUpdateValue("update" in operation ? operation.update : {}, now, true),
134
132
  $setOnInsert: prepInsertValue(
135
133
  operation.insert,
136
134
  _nullishCoalesce(_optionalChain([operation, 'access', _22 => _22.makeId, 'optionalCall', _23 => _23(i)]), () => ( new (0, _mongodb.ObjectId)().toString())),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/api.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/api.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/api.cjs","sourcesContent":["import { Collection, ObjectId, OptionalUnlessRequiredId, SortDirection, WithId } from 'mongodb'\n\nimport { QueryParams } from '../pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../errors'\nimport * as core from '../base/core'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nexport function getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\tconfig: core.Config<Model, Entity>,\n\tcollection: Collection<Model>,\n) {\n\ttype WI = Model | WithId<Model>\n\tasync function transform(doc: WI): Promise<Entity>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI | WI[]) {\n\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t}\n\n\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\tconst base: core.Model<IdType> = {\n\t\t\t[idKey]: id,\n\t\t\t...(config.options?.skipAudit\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t}),\n\t\t}\n\t\treturn {\n\t\t\t...value,\n\t\t\t...base,\n\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t}\n\n\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date) {\n\t\treturn {\n\t\t\t...value,\n\t\t\t$set: {\n\t\t\t\t...value.$set,\n\t\t\t\t...(Object.keys(value).length > 0 && !config.options?.skipAudit\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tupdatedAt: now.getTime(),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t}\n\t}\n\n\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\tconfig,\n\t\textras: { collection },\n\n\t\tquery: async (params: QueryParams) => {\n\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\treturn {\n\t\t\t\t...results,\n\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t}\n\t\t},\n\n\t\tfindMany: async (filter, options = {}) => {\n\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\tconst docs = await collection\n\t\t\t\t.find(filter, {\n\t\t\t\t\tsession: options.session,\n\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\tsort,\n\t\t\t\t})\n\t\t\t\t.toArray()\n\t\t\treturn transform(docs)\n\t\t},\n\n\t\tfindOne: async (filter, options = {}) => {\n\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 })\n\t\t\treturn result.at(0) ?? null\n\t\t},\n\n\t\tfindById: async (id, options = {}) => {\n\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tinsertMany: async (values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\tawait collection.insertMany(payload, { session: options.session })\n\n\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any, options)))\n\t\t\treturn insertedData.filter((value) => !!value)\n\t\t},\n\n\t\tinsertOne: async (values, options = {}) => {\n\t\t\tconst result = await table.insertMany([values], options)\n\t\t\treturn result[0]\n\t\t},\n\n\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tawait collection.updateMany(filter, prepUpdateValue(values, now), { session: options.session })\n\t\t\treturn table.findMany(filter, options)\n\t\t},\n\n\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\treturnDocument: 'after',\n\t\t\t\tsession: options.session,\n\t\t\t})\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tupdateById: async (id, values, options = {}) => {\n\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\treturn result\n\t\t},\n\n\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\tfilter,\n\t\t\t\t{\n\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now),\n\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t},\n\t\t\t\t{ returnDocument: 'after', session: options.session, upsert: true },\n\t\t\t)\n\n\t\t\treturn transform(doc)\n\t\t},\n\n\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\tawait collection.deleteMany(filter, { session: options.session })\n\t\t\treturn docs\n\t\t},\n\n\t\tdeleteOne: async (filter, options) => {\n\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: options?.session })\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tdeleteById: async (id, options) => {\n\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: options.session })\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\toperations.forEach((operation, i) => {\n\t\t\t\tswitch (operation.op) {\n\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'update':\n\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now),\n\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t}\n\t\t\t})\n\t\t\tawait bulk.execute({ session: options.session })\n\t\t},\n\t}\n\n\treturn table\n}\n",null]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/api.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/api.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/api.cjs","sourcesContent":["import { Collection, ObjectId, OptionalUnlessRequiredId, SortDirection, WithId } from 'mongodb'\n\nimport { QueryParams } from '../pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../errors'\nimport * as core from '../base/core'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nexport function getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\tconfig: core.Config<Model, Entity>,\n\tcollection: Collection<Model>,\n) {\n\ttype WI = Model | WithId<Model>\n\tasync function transform(doc: WI): Promise<Entity>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI | WI[]) {\n\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t}\n\n\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\tconst base: core.Model<IdType> = {\n\t\t\t[idKey]: id,\n\t\t\t...(config.options?.skipAudit\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t}),\n\t\t}\n\t\treturn {\n\t\t\t...value,\n\t\t\t...base,\n\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t}\n\n\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\treturn {\n\t\t\t...value,\n\t\t\t$set: {\n\t\t\t\t...value.$set,\n\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t},\n\t\t}\n\t}\n\n\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\tconfig,\n\t\textras: { collection },\n\n\t\tquery: async (params: QueryParams) => {\n\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\treturn {\n\t\t\t\t...results,\n\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t}\n\t\t},\n\n\t\tfindMany: async (filter, options = {}) => {\n\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\tconst docs = await collection\n\t\t\t\t.find(filter, {\n\t\t\t\t\tsession: options.session,\n\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\tsort,\n\t\t\t\t})\n\t\t\t\t.toArray()\n\t\t\treturn transform(docs)\n\t\t},\n\n\t\tfindOne: async (filter, options = {}) => {\n\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 })\n\t\t\treturn result.at(0) ?? null\n\t\t},\n\n\t\tfindById: async (id, options = {}) => {\n\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tinsertMany: async (values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\tawait collection.insertMany(payload, { session: options.session })\n\n\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any, options)))\n\t\t\treturn insertedData.filter((value) => !!value)\n\t\t},\n\n\t\tinsertOne: async (values, options = {}) => {\n\t\t\tconst result = await table.insertMany([values], options)\n\t\t\treturn result[0]\n\t\t},\n\n\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tawait collection.updateMany(filter, prepUpdateValue(values, now), { session: options.session })\n\t\t\treturn table.findMany(filter, options)\n\t\t},\n\n\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\treturnDocument: 'after',\n\t\t\t\tsession: options.session,\n\t\t\t})\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tupdateById: async (id, values, options = {}) => {\n\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\treturn result\n\t\t},\n\n\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\tfilter,\n\t\t\t\t{\n\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t},\n\t\t\t\t{ returnDocument: 'after', session: options.session, upsert: true },\n\t\t\t)\n\n\t\t\treturn transform(doc)\n\t\t},\n\n\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\tawait collection.deleteMany(filter, { session: options.session })\n\t\t\treturn docs\n\t\t},\n\n\t\tdeleteOne: async (filter, options) => {\n\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: options?.session })\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tdeleteById: async (id, options) => {\n\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: options.session })\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\toperations.forEach((operation, i) => {\n\t\t\t\tswitch (operation.op) {\n\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'update':\n\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t.update({\n\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$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t}\n\t\t\t})\n\t\t\tawait bulk.execute({ session: options.session })\n\t\t},\n\t}\n\n\treturn table\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 _mongodb = require('mongodb');var _querymincjs = require('./query.min.cjs');var _indexmincjs = require('../../errors/index.min.cjs');const c="_id";function W(y,d){async function u(t){const n=(Array.isArray(t)?t:[t]).map(r=>y.mapper(r));return Array.isArray(t)?n:n[0]}function l(t,e,n,r){const s={[c]:e,..._optionalChain([y, 'access', _ => _.options, 'optionalAccess', _2 => _2.skipAudit])?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...t,...s}}function o(t,e){return{...t,$set:{...t.$set,...Object.keys(t).length>0&&!_optionalChain([y, 'access', _3 => _3.options, 'optionalAccess', _4 => _4.skipAudit])?{updatedAt:e.getTime()}:{}}}}const i={config:y,extras:{collection:d},query:async t=>{const e=await _querymincjs.parseMongodbQueryParams.call(void 0, d,t);return{...e,results:await u(e.results)}},findMany:async(t,e={})=>{const r=(Array.isArray(e.sort)?e.sort:e.sort?[e.sort]:[]).map(a=>[a.field,a.desc?"desc":"asc"]),s=await d.find(t,{session:e.session,limit:e.limit,sort:r}).toArray();return u(s)},findOne:async(t,e={})=>await _asyncNullishCoalesce((await i.findMany(t,{...e,limit:1})).at(0), async () => (null)),findById:async(t,e={})=>await i.findOne({[c]:t},e),insertMany:async(t,e={})=>{const n=_nullishCoalesce(_optionalChain([e, 'access', _5 => _5.getTime, 'optionalCall', _6 => _6()]), () => (new Date)),r=t.map((a,w)=>l(a,_nullishCoalesce(_optionalChain([e, 'access', _7 => _7.makeId, 'optionalCall', _8 => _8(w)]), () => (new (0, _mongodb.ObjectId)().toString())),n));return await d.insertMany(r,{session:e.session}),(await Promise.all(r.map(async a=>await i.findById(a[c],e)))).filter(a=>!!a)},insertOne:async(t,e={})=>(await i.insertMany([t],e))[0],updateMany:async(t,e,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _9 => _9.getTime, 'optionalCall', _10 => _10()]), () => (new Date));return await d.updateMany(t,o(e,r),{session:n.session}),i.findMany(t,n)},updateOne:async(t,e,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _11 => _11.getTime, 'optionalCall', _12 => _12()]), () => (new Date)),s=await d.findOneAndUpdate(t,o(e,r),{returnDocument:"after",session:n.session});return s?u(s):null},updateById:async(t,e,n={})=>await i.updateOne({[c]:t},e,n),upsertOne:async(t,e,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _13 => _13.getTime, 'optionalCall', _14 => _14()]), () => (new Date)),s=await d.findOneAndUpdate(t,{...o("update"in e?e.update:{},r),$setOnInsert:l(e.insert,_nullishCoalesce(_optionalChain([n, 'access', _15 => _15.makeId, 'optionalCall', _16 => _16()]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)},{returnDocument:"after",session:n.session,upsert:!0});return u(s)},deleteMany:async(t,e={})=>{const n=await i.findMany(t,e);return await d.deleteMany(t,{session:e.session}),n},deleteOne:async(t,e)=>{const n=await d.findOneAndDelete(t,{session:_optionalChain([e, 'optionalAccess', _17 => _17.session])});return n?u(n):null},deleteById:async(t,e)=>await i.deleteOne({[c]:t},e),bulkWrite:async(t,e={})=>{const n=d.initializeUnorderedBulkOp({session:e.session}),r=_nullishCoalesce(_optionalChain([e, 'access', _18 => _18.getTime, 'optionalCall', _19 => _19()]), () => (new Date));t.forEach((s,a)=>{switch(s.op){case"insert":n.insert(l(s.value,_nullishCoalesce(_optionalChain([s, 'access', _20 => _20.makeId, 'optionalCall', _21 => _21(a)]), () => (new (0, _mongodb.ObjectId)().toString())),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(o(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...o("update"in s?s.update:{},r),$setOnInsert:l(s.insert,_nullishCoalesce(_optionalChain([s, 'access', _22 => _22.makeId, 'optionalCall', _23 => _23(a)]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)});break;default:throw new (0, _indexmincjs.EquippedError)("Unknown bulkWrite operation",{operation:s})}}),await n.execute({session:e.session})}};return i}exports.getTable = W;
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 _mongodb = require('mongodb');var _querymincjs = require('./query.min.cjs');var _indexmincjs = require('../../errors/index.min.cjs');const c="_id";function W(y,d){async function u(t){const n=(Array.isArray(t)?t:[t]).map(r=>y.mapper(r));return Array.isArray(t)?n:n[0]}function l(t,e,n,r){const s={[c]:e,..._optionalChain([y, 'access', _ => _.options, 'optionalAccess', _2 => _2.skipAudit])?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...t,...s}}function o(t,e,n=!1){return{...t,$set:{...t.$set,...n||Object.keys(t).length>0&&!_optionalChain([y, 'access', _3 => _3.options, 'optionalAccess', _4 => _4.skipAudit])?{updatedAt:e.getTime()}:{}}}}const i={config:y,extras:{collection:d},query:async t=>{const e=await _querymincjs.parseMongodbQueryParams.call(void 0, d,t);return{...e,results:await u(e.results)}},findMany:async(t,e={})=>{const r=(Array.isArray(e.sort)?e.sort:e.sort?[e.sort]:[]).map(a=>[a.field,a.desc?"desc":"asc"]),s=await d.find(t,{session:e.session,limit:e.limit,sort:r}).toArray();return u(s)},findOne:async(t,e={})=>await _asyncNullishCoalesce((await i.findMany(t,{...e,limit:1})).at(0), async () => (null)),findById:async(t,e={})=>await i.findOne({[c]:t},e),insertMany:async(t,e={})=>{const n=_nullishCoalesce(_optionalChain([e, 'access', _5 => _5.getTime, 'optionalCall', _6 => _6()]), () => (new Date)),r=t.map((a,w)=>l(a,_nullishCoalesce(_optionalChain([e, 'access', _7 => _7.makeId, 'optionalCall', _8 => _8(w)]), () => (new (0, _mongodb.ObjectId)().toString())),n));return await d.insertMany(r,{session:e.session}),(await Promise.all(r.map(async a=>await i.findById(a[c],e)))).filter(a=>!!a)},insertOne:async(t,e={})=>(await i.insertMany([t],e))[0],updateMany:async(t,e,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _9 => _9.getTime, 'optionalCall', _10 => _10()]), () => (new Date));return await d.updateMany(t,o(e,r),{session:n.session}),i.findMany(t,n)},updateOne:async(t,e,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _11 => _11.getTime, 'optionalCall', _12 => _12()]), () => (new Date)),s=await d.findOneAndUpdate(t,o(e,r),{returnDocument:"after",session:n.session});return s?u(s):null},updateById:async(t,e,n={})=>await i.updateOne({[c]:t},e,n),upsertOne:async(t,e,n={})=>{const r=_nullishCoalesce(_optionalChain([n, 'access', _13 => _13.getTime, 'optionalCall', _14 => _14()]), () => (new Date)),s=await d.findOneAndUpdate(t,{...o("update"in e?e.update:{},r,!0),$setOnInsert:l(e.insert,_nullishCoalesce(_optionalChain([n, 'access', _15 => _15.makeId, 'optionalCall', _16 => _16()]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)},{returnDocument:"after",session:n.session,upsert:!0});return u(s)},deleteMany:async(t,e={})=>{const n=await i.findMany(t,e);return await d.deleteMany(t,{session:e.session}),n},deleteOne:async(t,e)=>{const n=await d.findOneAndDelete(t,{session:_optionalChain([e, 'optionalAccess', _17 => _17.session])});return n?u(n):null},deleteById:async(t,e)=>await i.deleteOne({[c]:t},e),bulkWrite:async(t,e={})=>{const n=d.initializeUnorderedBulkOp({session:e.session}),r=_nullishCoalesce(_optionalChain([e, 'access', _18 => _18.getTime, 'optionalCall', _19 => _19()]), () => (new Date));t.forEach((s,a)=>{switch(s.op){case"insert":n.insert(l(s.value,_nullishCoalesce(_optionalChain([s, 'access', _20 => _20.makeId, 'optionalCall', _21 => _21(a)]), () => (new (0, _mongodb.ObjectId)().toString())),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(o(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...o("update"in s?s.update:{},r,!0),$setOnInsert:l(s.insert,_nullishCoalesce(_optionalChain([s, 'access', _22 => _22.makeId, 'optionalCall', _23 => _23(a)]), () => (new (0, _mongodb.ObjectId)().toString())),r,!0)});break;default:throw new (0, _indexmincjs.EquippedError)("Unknown bulkWrite operation",{operation:s})}}),await n.execute({session:e.session})}};return i}exports.getTable = W;
2
2
  //# sourceMappingURL=api.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/api.ts"],"names":["getTable","doc","d","mapped","id","now","skipUpdate","config","value","table","results","parseMongodbQueryParams","sort","options","p","docs","collection","filter","idKey","values","payload","i","prepInsertValue","ObjectId","data","prepUpdateValue","transform","operations","bulk","operation","EquippedError"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/api.min.cjs","sourcesContent":["import { Collection, ObjectId, OptionalUnlessRequiredId, SortDirection, WithId } from 'mongodb'\n\nimport { QueryParams } from '../pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../errors'\nimport * as core from '../base/core'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nexport function getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\tconfig: core.Config<Model, Entity>,\n\tcollection: Collection<Model>,\n) {\n\ttype WI = Model | WithId<Model>\n\tasync function transform(doc: WI): Promise<Entity>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI | WI[]) {\n\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t}\n\n\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\tconst base: core.Model<IdType> = {\n\t\t\t[idKey]: id,\n\t\t\t...(config.options?.skipAudit\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t}),\n\t\t}\n\t\treturn {\n\t\t\t...value,\n\t\t\t...base,\n\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t}\n\n\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date) {\n\t\treturn {\n\t\t\t...value,\n\t\t\t$set: {\n\t\t\t\t...value.$set,\n\t\t\t\t...(Object.keys(value).length > 0 && !config.options?.skipAudit\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tupdatedAt: now.getTime(),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t}\n\t}\n\n\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\tconfig,\n\t\textras: { collection },\n\n\t\tquery: async (params: QueryParams) => {\n\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\treturn {\n\t\t\t\t...results,\n\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t}\n\t\t},\n\n\t\tfindMany: async (filter, options = {}) => {\n\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\tconst docs = await collection\n\t\t\t\t.find(filter, {\n\t\t\t\t\tsession: options.session,\n\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\tsort,\n\t\t\t\t})\n\t\t\t\t.toArray()\n\t\t\treturn transform(docs)\n\t\t},\n\n\t\tfindOne: async (filter, options = {}) => {\n\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 })\n\t\t\treturn result.at(0) ?? null\n\t\t},\n\n\t\tfindById: async (id, options = {}) => {\n\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tinsertMany: async (values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\tawait collection.insertMany(payload, { session: options.session })\n\n\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any, options)))\n\t\t\treturn insertedData.filter((value) => !!value)\n\t\t},\n\n\t\tinsertOne: async (values, options = {}) => {\n\t\t\tconst result = await table.insertMany([values], options)\n\t\t\treturn result[0]\n\t\t},\n\n\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tawait collection.updateMany(filter, prepUpdateValue(values, now), { session: options.session })\n\t\t\treturn table.findMany(filter, options)\n\t\t},\n\n\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\treturnDocument: 'after',\n\t\t\t\tsession: options.session,\n\t\t\t})\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tupdateById: async (id, values, options = {}) => {\n\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\treturn result\n\t\t},\n\n\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\tfilter,\n\t\t\t\t{\n\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now),\n\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t},\n\t\t\t\t{ returnDocument: 'after', session: options.session, upsert: true },\n\t\t\t)\n\n\t\t\treturn transform(doc)\n\t\t},\n\n\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\tawait collection.deleteMany(filter, { session: options.session })\n\t\t\treturn docs\n\t\t},\n\n\t\tdeleteOne: async (filter, options) => {\n\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: options?.session })\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tdeleteById: async (id, options) => {\n\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: options.session })\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\toperations.forEach((operation, i) => {\n\t\t\t\tswitch (operation.op) {\n\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'update':\n\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now),\n\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t}\n\t\t\t})\n\t\t\tawait bulk.execute({ session: options.session })\n\t\t},\n\t}\n\n\treturn table\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/api.ts"],"names":["getTable","doc","d","mapped","id","now","skipUpdate","config","value","upsert","table","results","parseMongodbQueryParams","sort","options","p","docs","collection","filter","idKey","values","payload","i","prepInsertValue","ObjectId","data","prepUpdateValue","transform","operations","bulk","operation","EquippedError"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/api.min.cjs","sourcesContent":["import { Collection, ObjectId, OptionalUnlessRequiredId, SortDirection, WithId } from 'mongodb'\n\nimport { QueryParams } from '../pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../errors'\nimport * as core from '../base/core'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nexport function getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\tconfig: core.Config<Model, Entity>,\n\tcollection: Collection<Model>,\n) {\n\ttype WI = Model | WithId<Model>\n\tasync function transform(doc: WI): Promise<Entity>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI | WI[]) {\n\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t}\n\n\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\tconst base: core.Model<IdType> = {\n\t\t\t[idKey]: id,\n\t\t\t...(config.options?.skipAudit\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t}),\n\t\t}\n\t\treturn {\n\t\t\t...value,\n\t\t\t...base,\n\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t}\n\n\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\treturn {\n\t\t\t...value,\n\t\t\t$set: {\n\t\t\t\t...value.$set,\n\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t},\n\t\t}\n\t}\n\n\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\tconfig,\n\t\textras: { collection },\n\n\t\tquery: async (params: QueryParams) => {\n\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\treturn {\n\t\t\t\t...results,\n\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t}\n\t\t},\n\n\t\tfindMany: async (filter, options = {}) => {\n\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\tconst docs = await collection\n\t\t\t\t.find(filter, {\n\t\t\t\t\tsession: options.session,\n\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\tsort,\n\t\t\t\t})\n\t\t\t\t.toArray()\n\t\t\treturn transform(docs)\n\t\t},\n\n\t\tfindOne: async (filter, options = {}) => {\n\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 })\n\t\t\treturn result.at(0) ?? null\n\t\t},\n\n\t\tfindById: async (id, options = {}) => {\n\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tinsertMany: async (values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\tawait collection.insertMany(payload, { session: options.session })\n\n\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any, options)))\n\t\t\treturn insertedData.filter((value) => !!value)\n\t\t},\n\n\t\tinsertOne: async (values, options = {}) => {\n\t\t\tconst result = await table.insertMany([values], options)\n\t\t\treturn result[0]\n\t\t},\n\n\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tawait collection.updateMany(filter, prepUpdateValue(values, now), { session: options.session })\n\t\t\treturn table.findMany(filter, options)\n\t\t},\n\n\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\treturnDocument: 'after',\n\t\t\t\tsession: options.session,\n\t\t\t})\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tupdateById: async (id, values, options = {}) => {\n\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\treturn result\n\t\t},\n\n\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\tfilter,\n\t\t\t\t{\n\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t},\n\t\t\t\t{ returnDocument: 'after', session: options.session, upsert: true },\n\t\t\t)\n\n\t\t\treturn transform(doc)\n\t\t},\n\n\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\tawait collection.deleteMany(filter, { session: options.session })\n\t\t\treturn docs\n\t\t},\n\n\t\tdeleteOne: async (filter, options) => {\n\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: options?.session })\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tdeleteById: async (id, options) => {\n\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: options.session })\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\toperations.forEach((operation, i) => {\n\t\t\t\tswitch (operation.op) {\n\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'update':\n\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t.update({\n\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$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t}\n\t\t\t})\n\t\t\tawait bulk.execute({ session: options.session })\n\t\t},\n\t}\n\n\treturn table\n}\n"]}
@@ -8,11 +8,11 @@ class MongoDb extends __instancecjs.Db {
8
8
  constructor(mongoConfig, dbConfig) {
9
9
  super(dbConfig);
10
10
  this.mongoConfig = mongoConfig;
11
- this.#client = new (0, _mongodb.MongoClient)(mongoConfig.uri);
11
+ this.client = new (0, _mongodb.MongoClient)(mongoConfig.uri);
12
12
  _indexcjs3.Instance.on(
13
13
  "start",
14
14
  async () => {
15
- await this.#client.connect();
15
+ await this.client.connect();
16
16
  const grouped = this.#cols.reduce((acc, cur) => {
17
17
  if (!acc[cur.db]) acc[cur.db] = [];
18
18
  acc[cur.db].push(cur.col);
@@ -23,7 +23,7 @@ class MongoDb extends __instancecjs.Db {
23
23
  };
24
24
  await Promise.all(
25
25
  Object.entries(grouped).map(async ([dbName, colNames]) => {
26
- const db = this.#client.db(dbName);
26
+ const db = this.client.db(dbName);
27
27
  const collections = await db.listCollections().toArray();
28
28
  return colNames.map(async (colName) => {
29
29
  const existing = collections.find((collection) => collection.name === colName);
@@ -37,12 +37,12 @@ class MongoDb extends __instancecjs.Db {
37
37
  },
38
38
  3
39
39
  );
40
- _indexcjs3.Instance.on("close", async () => this.#client.close(), 1);
40
+ _indexcjs3.Instance.on("close", async () => this.client.close(), 1);
41
41
  }
42
- #client;
42
+
43
43
  #cols = [];
44
44
  async session(callback) {
45
- return this.#client.withSession(callback);
45
+ return this.client.withSession(callback);
46
46
  }
47
47
  id() {
48
48
  return new (0, _mongodb.ObjectId)();
@@ -53,7 +53,7 @@ class MongoDb extends __instancecjs.Db {
53
53
  new (0, _changescjs.MongoDbChange)(
54
54
  this.mongoConfig,
55
55
  this.config.changes,
56
- this.#client,
56
+ this.client,
57
57
  this.getScopedDb(config.db),
58
58
  config.col,
59
59
  config.change,
@@ -61,7 +61,7 @@ class MongoDb extends __instancecjs.Db {
61
61
  );
62
62
  }
63
63
  this.#cols.push({ db: this.getScopedDb(config.db), col: config.col });
64
- const collection = this.#client.db(this.getScopedDb(config.db)).collection(config.col);
64
+ const collection = this.client.db(this.getScopedDb(config.db)).collection(config.col);
65
65
  return _apicjs.getTable.call(void 0, config, collection);
66
66
  }
67
67
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/index.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/index.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/index.cjs","sourcesContent":["import { ClientSession, CollectionInfo, MongoClient, ObjectId } from 'mongodb'\n\nimport { getTable } from './api'\nimport { MongoDbConfig } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { Db } from '../base/_instance'\nimport * as core from '../base/core'\nimport { DbConfig } from '../base/types'\n\nexport class MongoDb extends Db<{ _id: string }> {\n\t#client: 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: (session: ClientSession) => Promise<T>) {\n\t\treturn this.#client.withSession(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\tif (config.change) {\n\t\t\tif (!this.config.changes) Instance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\tnew MongoDbChange<Model, Entity>(\n\t\t\t\tthis.mongoConfig,\n\t\t\t\tthis.config.changes,\n\t\t\t\tthis.#client,\n\t\t\t\tthis.getScopedDb(config.db),\n\t\t\t\tconfig.col,\n\t\t\t\tconfig.change,\n\t\t\t\tconfig.mapper,\n\t\t\t)\n\t\t}\n\t\tthis.#cols.push({ db: this.getScopedDb(config.db), col: config.col })\n\t\tconst collection = this.#client.db(this.getScopedDb(config.db)).collection<Model>(config.col)\n\t\treturn getTable(config, collection)\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/index.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/index.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/index.cjs","sourcesContent":["import { ClientSession, CollectionInfo, MongoClient, ObjectId } from 'mongodb'\n\nimport { getTable } from './api'\nimport { MongoDbConfig } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { Db } from '../base/_instance'\nimport * as core from '../base/core'\nimport { DbConfig } from '../base/types'\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: (session: ClientSession) => Promise<T>) {\n\t\treturn this.client.withSession(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\tif (config.change) {\n\t\t\tif (!this.config.changes) Instance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\tnew MongoDbChange<Model, Entity>(\n\t\t\t\tthis.mongoConfig,\n\t\t\t\tthis.config.changes,\n\t\t\t\tthis.client,\n\t\t\t\tthis.getScopedDb(config.db),\n\t\t\t\tconfig.col,\n\t\t\t\tconfig.change,\n\t\t\t\tconfig.mapper,\n\t\t\t)\n\t\t}\n\t\tthis.#cols.push({ db: this.getScopedDb(config.db), col: config.col })\n\t\tconst collection = this.client.db(this.getScopedDb(config.db)).collection<Model>(config.col)\n\t\treturn getTable(config, collection)\n\t}\n}\n",null]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 _mongodb = require('mongodb');var _apimincjs = require('./api.min.cjs');var _changesmincjs = require('./changes.min.cjs');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var __instancemincjs = require('../base/_instance.min.cjs');class q extends __instancemincjs.Db{constructor(e,n){super(n);this.mongoConfig=e;this.#e=new (0, _mongodb.MongoClient)(e.uri),_indexmincjs3.Instance.on("start",async()=>{await this.#e.connect();const c=this.#o.reduce((o,t)=>(o[t.db]||(o[t.db]=[]),o[t.db].push(t.col),o),{}),s={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(c).map(async([o,t])=>{const i=this.#e.db(o),d=await i.listCollections().toArray();return t.map(async r=>{const l=d.find(m=>m.name===r);l?_optionalChain([l, 'access', _ => _.options, 'optionalAccess', _2 => _2.changeStreamPreAndPostImages, 'optionalAccess', _3 => _3.enabled])!==s.changeStreamPreAndPostImages.enabled&&await i.command({collMod:r,...s}):await i.createCollection(r,s)})}))},3),_indexmincjs3.Instance.on("close",async()=>this.#e.close(),1)}#e;#o=[];async session(e){return this.#e.withSession(e)}id(){return new _mongodb.ObjectId}use(e){e.change&&(this.config.changes||_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Db changes are not enabled in the configuration.",{config:e})),new (0, _changesmincjs.MongoDbChange)(this.mongoConfig,this.config.changes,this.#e,this.getScopedDb(e.db),e.col,e.change,e.mapper)),this.#o.push({db:this.getScopedDb(e.db),col:e.col});const n=this.#e.db(this.getScopedDb(e.db)).collection(e.col);return _apimincjs.getTable.call(void 0, e,n)}}exports.MongoDb = q;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 _mongodb = require('mongodb');var _apimincjs = require('./api.min.cjs');var _changesmincjs = require('./changes.min.cjs');var _indexmincjs = require('../../errors/index.min.cjs');var _indexmincjs3 = require('../../instance/index.min.cjs');var __instancemincjs = require('../base/_instance.min.cjs');class q extends __instancemincjs.Db{constructor(e,n){super(n);this.mongoConfig=e;this.client=new (0, _mongodb.MongoClient)(e.uri),_indexmincjs3.Instance.on("start",async()=>{await this.client.connect();const a=this.#e.reduce((t,o)=>(t[o.db]||(t[o.db]=[]),t[o.db].push(o.col),t),{}),i={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(a).map(async([t,o])=>{const s=this.client.db(t),d=await s.listCollections().toArray();return o.map(async r=>{const c=d.find(m=>m.name===r);c?_optionalChain([c, 'access', _ => _.options, 'optionalAccess', _2 => _2.changeStreamPreAndPostImages, 'optionalAccess', _3 => _3.enabled])!==i.changeStreamPreAndPostImages.enabled&&await s.command({collMod:r,...i}):await s.createCollection(r,i)})}))},3),_indexmincjs3.Instance.on("close",async()=>this.client.close(),1)}#e=[];async session(e){return this.client.withSession(e)}id(){return new _mongodb.ObjectId}use(e){e.change&&(this.config.changes||_indexmincjs3.Instance.crash(new (0, _indexmincjs.EquippedError)("Db changes are not enabled in the configuration.",{config:e})),new (0, _changesmincjs.MongoDbChange)(this.mongoConfig,this.config.changes,this.client,this.getScopedDb(e.db),e.col,e.change,e.mapper)),this.#e.push({db:this.getScopedDb(e.db),col:e.col});const n=this.client.db(this.getScopedDb(e.db)).collection(e.col);return _apimincjs.getTable.call(void 0, e,n)}}exports.MongoDb = q;
2
2
  //# sourceMappingURL=index.min.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/index.ts"],"names":["MongoDb","MongoClient","#client","#cols","cur","acc","options","dbName","colName","existing","db","Instance","callback","ObjectId","config","EquippedError","getTable","collection"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/index.min.cjs","sourcesContent":["import { ClientSession, CollectionInfo, MongoClient, ObjectId } from 'mongodb'\n\nimport { getTable } from './api'\nimport { MongoDbConfig } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { Db } from '../base/_instance'\nimport * as core from '../base/core'\nimport { DbConfig } from '../base/types'\n\nexport class MongoDb extends Db<{ _id: string }> {\n\t#client: 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: (session: ClientSession) => Promise<T>) {\n\t\treturn this.#client.withSession(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\tif (config.change) {\n\t\t\tif (!this.config.changes) Instance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\tnew MongoDbChange<Model, Entity>(\n\t\t\t\tthis.mongoConfig,\n\t\t\t\tthis.config.changes,\n\t\t\t\tthis.#client,\n\t\t\t\tthis.getScopedDb(config.db),\n\t\t\t\tconfig.col,\n\t\t\t\tconfig.change,\n\t\t\t\tconfig.mapper,\n\t\t\t)\n\t\t}\n\t\tthis.#cols.push({ db: this.getScopedDb(config.db), col: config.col })\n\t\tconst collection = this.#client.db(this.getScopedDb(config.db)).collection<Model>(config.col)\n\t\treturn getTable(config, collection)\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/index.ts"],"names":["MongoDb","Instance","grouped","acc","cur","options","collections","db","colName","existing","#cols","config","EquippedError","collection"],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/index.min.cjs","sourcesContent":["import { ClientSession, CollectionInfo, MongoClient, ObjectId } from 'mongodb'\n\nimport { getTable } from './api'\nimport { MongoDbConfig } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport { Db } from '../base/_instance'\nimport * as core from '../base/core'\nimport { DbConfig } from '../base/types'\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: (session: ClientSession) => Promise<T>) {\n\t\treturn this.client.withSession(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\tif (config.change) {\n\t\t\tif (!this.config.changes) Instance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\tnew MongoDbChange<Model, Entity>(\n\t\t\t\tthis.mongoConfig,\n\t\t\t\tthis.config.changes,\n\t\t\t\tthis.client,\n\t\t\t\tthis.getScopedDb(config.db),\n\t\t\t\tconfig.col,\n\t\t\t\tconfig.change,\n\t\t\t\tconfig.mapper,\n\t\t\t)\n\t\t}\n\t\tthis.#cols.push({ db: this.getScopedDb(config.db), col: config.col })\n\t\tconst collection = this.client.db(this.getScopedDb(config.db)).collection<Model>(config.col)\n\t\treturn getTable(config, collection)\n\t}\n}\n"]}
@@ -112,7 +112,7 @@ class OpenApi {
112
112
  router() {
113
113
  const jsonPath = "/openapi.json";
114
114
  const router = new (0, _routescjs.Router)({ path: _nullishCoalesce(this.config.config.openapi.docsPath, () => ( "/")), hide: true });
115
- router.get("/")((req) => req.res({ body: this.#html(`.${jsonPath}`), contentType: "text/html" }));
115
+ router.get("/index.html")((req) => req.res({ body: this.#html(`.${jsonPath}`), contentType: "text/html" }));
116
116
  router.get(jsonPath)((req) => req.res({ body: this.#baseOpenapiDoc }));
117
117
  return router;
118
118
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/openapi.ts","/home/runner/work/equipped/equipped/dist/cjs/server/openapi.cjs"],"names":["schema"],"mappings":"AAAA,4wBAAwB;AAExB,oCAAuC;AAGvC,yCAAuB;AAmBhB,MAAM,QAAQ;AAAA,EAKpB,WAAA,CAAoB,MAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,OAAA,EAAA,MAAA;AACnB,IAAA,IAAA,CAAK,CAAA,eAAA,EAAkB;AAAA,MACtB,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACL,KAAA,EAAO,CAAA,EAAA;AACP,QAAA;AACD,MAAA;AACS,MAAA;AACD,MAAA;AACR,MAAA;AACC,QAAA;AACA,QAAA;AACC,UAAA;AACC,YAAA;AACA,YAAA;AACI,YAAA;AACL,UAAA;AACA,UAAA;AACC,YAAA;AACA,YAAA;AACI,YAAA;AACL,UAAA;AACA,UAAA;AACC,YAAA;AACA,YAAA;AACI,YAAA;AACL,UAAA;AACD,QAAA;AACD,MAAA;AACO,MAAA;AACP,MAAA;AACD,IAAA;AACD,EAAA;AApCA,EAAA;AACA,EAAA;AACA,EAAA;AAoCU,EAAA;AACL,IAAA;AACC,IAAA;AACD,IAAA;AACG,IAAA;AACR,EAAA;AAEM,EAAA;AACK,IAAA;AAEE,IAAA;AAEN,IAAA;AACA,IAAA;AACK,IAAA;AACV,MAAA;AACS,MAAA;AACT,MAAA;AACM,MAAA;AACI,MAAA;AACV,IAAA;AACF,EAAA;AAEM,EAAA;AACG,IAAA;AACG,MAAA;AACV,MAAA;AACC,QAAA;AACM,QAAA;AACF,QAAA;AACL,MAAA;AACD,IAAA;AAEQ,IAAA;AACG,MAAA;AACV,MAAA;AACC,QAAA;AACA,QAAA;AACM,QAAA;AACF,QAAA;AACL,MAAA;AACD,IAAA;AAEQ,IAAA;AACG,MAAA;AACT,QAAA;AACA,QAAA;AACC,UAAA;AACD,QAAA;AACD,MAAA;AAEK,IAAA;AAEA,IAAA;AACA,MAAA;AACC,MAAA;AACN,MAAA;AACMA,QAAAA;AACL,QAAA;AACC,UAAA;AACC,YAAA;AACI,YAAA;AACJ,YAAA;AACA,YAAA;AACA,UAAA;AACH,MAAA;AACD,IAAA;AAEM,IAAA;AACK,MAAA;AACA,MAAA;AACA,MAAA;AACV,IAAA;AACG,IAAA;AAEE,IAAA;AACI,IAAA;AACA,IAAA;AACC,IAAA;AACZ,EAAA;AAES,EAAA;AACF,IAAA;AACA,IAAA;AACK,IAAA;AACA,IAAA;AACJ,IAAA;AACR,EAAA;AAEA,EAAA;AACS,IAAA;AACG,IAAA;AACH,IAAA;AACT,EAAA;AAEyB,EAAA;AACnB,IAAA;AACM,IAAA;AACF,MAAA;AACF,MAAA;AACG,MAAA;AACH,QAAA;AACE,QAAA;AACD,MAAA;AACR,IAAA;AAEU,IAAA;AACH,IAAA;AACR,EAAA;AAEU,EAAA;AACG,IAAA;AACN,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAKI,IAAA;AACJ,MAAA;AACA,MAAA;AAEC,MAAA;AACA,MAAA;AACI,MAAA;AACH,QAAA;AACD,QAAA;AACA,QAAA;AACN,MAAA;AACK,MAAA;AACN,IAAA;AAEO,IAAA;AACR,EAAA;AAEM,EAAA;AACC,IAAA;AACC,IAAA;AAAA;AAAA;AAAA;AAII,WAAA;AAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA;AAUiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASlD,EAAA;AACD;AC3CgB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/openapi.cjs","sourcesContent":["import { convert } from '@openapi-contrib/json-schema-to-openapi-schema'\nimport { OpenAPIV3_1 } from 'openapi-types'\nimport { capitalize, JsonSchema } from 'valleyed'\n\nimport { ServerConfig } from './pipes'\nimport { Router } from './routes'\nimport { Route } from './types'\n\ndeclare module 'openapi-types' {\n\tnamespace OpenAPIV3 {\n\t\tinterface Document {\n\t\t\t'x-tagGroups': { name: string; tags: string[] }[]\n\t\t}\n\t\tinterface TagObject {\n\t\t\t'x-displayName': string\n\t\t}\n\t}\n}\n\nexport type OpenApiSchemaDef = {\n\trequest: Partial<Record<'body' | 'query' | 'params' | 'headers' | 'response', JsonSchema>>\n\tresponse: Partial<Record<'response' | 'responseHeaders', { status: number; schema: JsonSchema; contentType: string }[]>>\n}\n\nexport class OpenApi {\n\t#registeredTags: Record<string, boolean> = {}\n\t#registeredTagGroups: Record<string, { name: string; tags: string[] }> = {}\n\t#baseOpenapiDoc: OpenAPIV3_1.Document\n\n\tconstructor(private config: ServerConfig) {\n\t\tthis.#baseOpenapiDoc = {\n\t\t\topenapi: '3.0.0',\n\t\t\tinfo: {\n\t\t\t\ttitle: `${config.app.name} ${config.app.id}`,\n\t\t\t\tversion: config.config.openapi.docsVersion ?? '',\n\t\t\t},\n\t\t\tservers: config.config.openapi.docsBaseUrl?.map((url) => ({ url })),\n\t\t\tpaths: {},\n\t\t\tcomponents: {\n\t\t\t\tschemas: {},\n\t\t\t\tsecuritySchemes: {\n\t\t\t\t\tAuthorization: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'authorization',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t\tRefreshToken: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'x-refresh-token',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t\tApiKey: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'x-api-key',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\ttags: [],\n\t\t\t'x-tagGroups': [],\n\t\t}\n\t}\n\n\tcleanPath(path: string) {\n\t\tlet cleaned = path.replace(/(\\/\\s*)+/g, '/')\n\t\tif (!cleaned.startsWith('/')) cleaned = `/${cleaned}`\n\t\tif (cleaned !== '/' && cleaned.endsWith('/')) cleaned = cleaned.slice(0, -1)\n\t\treturn cleaned\n\t}\n\n\tasync register(route: Route<any>, def: OpenApiSchemaDef) {\n\t\tif (route.hide) return\n\n\t\tconst tag = this.#buildTag(route.groups ?? [])\n\n\t\tconst cleanPath = this.cleanPath(route.path)\n\t\tconst operationId = `(${route.method.toUpperCase()}) ${cleanPath}`\n\t\tawait this.#addRouteToOpenApiDoc(cleanPath, route.method.toLowerCase(), def, {\n\t\t\toperationId,\n\t\t\tsummary: route.title ?? cleanPath,\n\t\t\tdescription: route.descriptions?.join('\\n\\n'),\n\t\t\ttags: tag ? [tag] : undefined,\n\t\t\tsecurity: route.security,\n\t\t})\n\t}\n\n\tasync #addRouteToOpenApiDoc(path: string, method: string, def: OpenApiSchemaDef, methodObj: OpenAPIV3_1.OperationObject) {\n\t\tif (def.response.response?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.response) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.content![resp.contentType] = { schema: await convert(this.#visit(resp.schema)) }\n\t\t\t}\n\t\t}\n\n\t\tif (def.response.responseHeaders?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.responseHeaders) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tmethodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.headers = { schema: (await convert(this.#visit(resp.schema))) as any }\n\t\t\t}\n\t\t}\n\n\t\tif (def.request.body)\n\t\t\tmethodObj.requestBody = {\n\t\t\t\trequired: true,\n\t\t\t\tcontent: {\n\t\t\t\t\t'application/json': { schema: await convert(this.#visit(def.request.body)) },\n\t\t\t\t},\n\t\t\t}\n\n\t\tconst parameters: OpenAPIV3_1.ParameterObject[] = []\n\n\t\tconst addParams = async (location: 'query' | 'path' | 'header', schema: JsonSchema | undefined) => {\n\t\t\tif (!schema) return\n\t\t\tconst flat = this.#flattenForParameters(schema)\n\t\t\tfor (const schema of flat) {\n\t\t\t\tif (!schema.properties) continue\n\t\t\t\tfor (const [name, value] of Object.entries(schema.properties))\n\t\t\t\t\tparameters.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tin: location,\n\t\t\t\t\t\tschema: await convert(this.#visit(value)),\n\t\t\t\t\t\trequired: (schema.required || []).includes(name),\n\t\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tawait Promise.all([\n\t\t\taddParams('query', def.request.query),\n\t\t\taddParams('path', def.request.params),\n\t\t\taddParams('header', def.request.headers),\n\t\t])\n\t\tif (parameters.length) methodObj.parameters = parameters\n\n\t\tconst base = this.#baseOpenapiDoc\n\t\tif (!base.paths) base.paths = {}\n\t\tif (!base.paths[path]) base.paths[path] = {}\n\t\tbase.paths[path]![method] = methodObj\n\t}\n\n\trouter() {\n\t\tconst jsonPath = '/openapi.json'\n\t\tconst router = new Router({ path: this.config.config.openapi.docsPath ?? '/', hide: true })\n\t\trouter.get('/')((req) => req.res({ body: this.#html(`.${jsonPath}`), contentType: 'text/html' }))\n\t\trouter.get(jsonPath)((req) => req.res({ body: this.#baseOpenapiDoc }))\n\t\treturn router\n\t}\n\n\t#flattenForParameters(node: JsonSchema): JsonSchema[] {\n\t\tconst { allOf, oneOf, anyOf, ...schema } = node\n\t\tif (allOf) return allOf.flatMap((n) => this.#flattenForParameters(n))\n\t\treturn [schema]\n\t}\n\n\t#visit(node: JsonSchema) {\n\t\tif (!node || typeof node !== 'object') return node\n\t\tif (typeof node.$refId === 'string') {\n\t\t\tconst { $refId: id, ...rest } = node\n\t\t\tconst res = this.#visit(rest)\n\t\t\tif (this.#baseOpenapiDoc.components?.schemas) {\n\t\t\t\tthis.#baseOpenapiDoc.components.schemas[id] = res\n\t\t\t\treturn { $ref: `#/components/schemas/${id}` }\n\t\t\t} else return res\n\t\t}\n\n\t\tif (Array.isArray(node)) return node.map((n) => this.#visit(n)) as any\n\t\treturn Object.fromEntries(Object.entries(node).map(([key, value]) => [key, this.#visit(value as any)]))\n\t}\n\n\t#buildTag(groups: NonNullable<Route<any>['groups']>) {\n\t\tif (!groups.length) return undefined\n\t\tconst parsed = groups.map((g) => (typeof g === 'string' ? { name: g } : g))\n\t\tconst name = parsed.map((g) => g.name).join(' > ')\n\t\tconst displayName = parsed.at(-1)?.name ?? ''\n\t\tconst description = parsed\n\t\t\t.map((g) => g.description?.trim() ?? '')\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n\\n\\n\\n')\n\n\t\tif (!this.#registeredTags[name]) {\n\t\t\tthis.#registeredTags[name] = true\n\t\t\tthis.#baseOpenapiDoc.tags!.push({ name, 'x-displayName': displayName, description })\n\n\t\t\tconst tagGroups = parsed.slice(0, -1)\n\t\t\tconst groupName = tagGroups.map((g) => g.name).join(' > ') || 'default'\n\t\t\tif (!this.#registeredTagGroups[groupName]) {\n\t\t\t\tconst group = { name: groupName, tags: [] }\n\t\t\t\tthis.#baseOpenapiDoc['x-tagGroups'].push(group)\n\t\t\t\tthis.#registeredTagGroups[groupName] = group\n\t\t\t}\n\t\t\tthis.#registeredTagGroups[groupName].tags = [...new Set([...this.#registeredTagGroups[groupName].tags, name])]\n\t\t}\n\n\t\treturn name\n\t}\n\n\t#html(jsonPath: string) {\n\t\tconst title = capitalize(`${this.config.app.name} ${this.config.app.id}`)\n\t\treturn `\n<!doctype html>\n<html>\n <head>\n <title>${title}</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t<style>\n .darklight-reference {\n display: none;\n }\n </style>\n </head>\n <body>\n <script id=\"api-reference\" data-url=\"${jsonPath}\"></script>\n <script>\n const configuration = { theme: 'purple' };\n document.getElementById('api-reference').dataset.configuration = JSON.stringify(configuration);\n </script>\n <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.28.33\"></script>\n </body>\n</html>\n`\n\t}\n}\n",null]}
1
+ {"version":3,"sources":["../../../src/server/openapi.ts","/home/runner/work/equipped/equipped/dist/cjs/server/openapi.cjs"],"names":["schema"],"mappings":"AAAA,4wBAAwB;AAExB,oCAAuC;AAGvC,yCAAuB;AAmBhB,MAAM,QAAQ;AAAA,EAKpB,WAAA,CAAoB,MAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,OAAA,EAAA,MAAA;AACnB,IAAA,IAAA,CAAK,CAAA,eAAA,EAAkB;AAAA,MACtB,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACL,KAAA,EAAO,CAAA,EAAA;AACP,QAAA;AACD,MAAA;AACS,MAAA;AACD,MAAA;AACR,MAAA;AACC,QAAA;AACA,QAAA;AACC,UAAA;AACC,YAAA;AACA,YAAA;AACI,YAAA;AACL,UAAA;AACA,UAAA;AACC,YAAA;AACA,YAAA;AACI,YAAA;AACL,UAAA;AACA,UAAA;AACC,YAAA;AACA,YAAA;AACI,YAAA;AACL,UAAA;AACD,QAAA;AACD,MAAA;AACO,MAAA;AACP,MAAA;AACD,IAAA;AACD,EAAA;AApCA,EAAA;AACA,EAAA;AACA,EAAA;AAoCU,EAAA;AACL,IAAA;AACC,IAAA;AACD,IAAA;AACG,IAAA;AACR,EAAA;AAEM,EAAA;AACK,IAAA;AAEE,IAAA;AAEN,IAAA;AACA,IAAA;AACK,IAAA;AACV,MAAA;AACS,MAAA;AACT,MAAA;AACM,MAAA;AACI,MAAA;AACV,IAAA;AACF,EAAA;AAEM,EAAA;AACG,IAAA;AACG,MAAA;AACV,MAAA;AACC,QAAA;AACM,QAAA;AACF,QAAA;AACL,MAAA;AACD,IAAA;AAEQ,IAAA;AACG,MAAA;AACV,MAAA;AACC,QAAA;AACA,QAAA;AACM,QAAA;AACF,QAAA;AACL,MAAA;AACD,IAAA;AAEQ,IAAA;AACG,MAAA;AACT,QAAA;AACA,QAAA;AACC,UAAA;AACD,QAAA;AACD,MAAA;AAEK,IAAA;AAEA,IAAA;AACA,MAAA;AACC,MAAA;AACN,MAAA;AACMA,QAAAA;AACL,QAAA;AACC,UAAA;AACC,YAAA;AACI,YAAA;AACJ,YAAA;AACA,YAAA;AACA,UAAA;AACH,MAAA;AACD,IAAA;AAEM,IAAA;AACK,MAAA;AACA,MAAA;AACA,MAAA;AACV,IAAA;AACG,IAAA;AAEE,IAAA;AACI,IAAA;AACA,IAAA;AACC,IAAA;AACZ,EAAA;AAES,EAAA;AACF,IAAA;AACA,IAAA;AACK,IAAA;AACA,IAAA;AACJ,IAAA;AACR,EAAA;AAEA,EAAA;AACS,IAAA;AACG,IAAA;AACH,IAAA;AACT,EAAA;AAEyB,EAAA;AACnB,IAAA;AACM,IAAA;AACF,MAAA;AACF,MAAA;AACG,MAAA;AACH,QAAA;AACE,QAAA;AACD,MAAA;AACR,IAAA;AAEU,IAAA;AACH,IAAA;AACR,EAAA;AAEU,EAAA;AACG,IAAA;AACN,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAKI,IAAA;AACJ,MAAA;AACA,MAAA;AAEC,MAAA;AACA,MAAA;AACI,MAAA;AACH,QAAA;AACD,QAAA;AACA,QAAA;AACN,MAAA;AACK,MAAA;AACN,IAAA;AAEO,IAAA;AACR,EAAA;AAEM,EAAA;AACC,IAAA;AACC,IAAA;AAAA;AAAA;AAAA;AAII,WAAA;AAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA;AAUiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASlD,EAAA;AACD;AC3CgB;AACA;AACA","file":"/home/runner/work/equipped/equipped/dist/cjs/server/openapi.cjs","sourcesContent":["import { convert } from '@openapi-contrib/json-schema-to-openapi-schema'\nimport { OpenAPIV3_1 } from 'openapi-types'\nimport { capitalize, JsonSchema } from 'valleyed'\n\nimport { ServerConfig } from './pipes'\nimport { Router } from './routes'\nimport { Route } from './types'\n\ndeclare module 'openapi-types' {\n\tnamespace OpenAPIV3 {\n\t\tinterface Document {\n\t\t\t'x-tagGroups': { name: string; tags: string[] }[]\n\t\t}\n\t\tinterface TagObject {\n\t\t\t'x-displayName': string\n\t\t}\n\t}\n}\n\nexport type OpenApiSchemaDef = {\n\trequest: Partial<Record<'body' | 'query' | 'params' | 'headers' | 'response', JsonSchema>>\n\tresponse: Partial<Record<'response' | 'responseHeaders', { status: number; schema: JsonSchema; contentType: string }[]>>\n}\n\nexport class OpenApi {\n\t#registeredTags: Record<string, boolean> = {}\n\t#registeredTagGroups: Record<string, { name: string; tags: string[] }> = {}\n\t#baseOpenapiDoc: OpenAPIV3_1.Document\n\n\tconstructor(private config: ServerConfig) {\n\t\tthis.#baseOpenapiDoc = {\n\t\t\topenapi: '3.0.0',\n\t\t\tinfo: {\n\t\t\t\ttitle: `${config.app.name} ${config.app.id}`,\n\t\t\t\tversion: config.config.openapi.docsVersion ?? '',\n\t\t\t},\n\t\t\tservers: config.config.openapi.docsBaseUrl?.map((url) => ({ url })),\n\t\t\tpaths: {},\n\t\t\tcomponents: {\n\t\t\t\tschemas: {},\n\t\t\t\tsecuritySchemes: {\n\t\t\t\t\tAuthorization: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'authorization',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t\tRefreshToken: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'x-refresh-token',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t\tApiKey: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'x-api-key',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\ttags: [],\n\t\t\t'x-tagGroups': [],\n\t\t}\n\t}\n\n\tcleanPath(path: string) {\n\t\tlet cleaned = path.replace(/(\\/\\s*)+/g, '/')\n\t\tif (!cleaned.startsWith('/')) cleaned = `/${cleaned}`\n\t\tif (cleaned !== '/' && cleaned.endsWith('/')) cleaned = cleaned.slice(0, -1)\n\t\treturn cleaned\n\t}\n\n\tasync register(route: Route<any>, def: OpenApiSchemaDef) {\n\t\tif (route.hide) return\n\n\t\tconst tag = this.#buildTag(route.groups ?? [])\n\n\t\tconst cleanPath = this.cleanPath(route.path)\n\t\tconst operationId = `(${route.method.toUpperCase()}) ${cleanPath}`\n\t\tawait this.#addRouteToOpenApiDoc(cleanPath, route.method.toLowerCase(), def, {\n\t\t\toperationId,\n\t\t\tsummary: route.title ?? cleanPath,\n\t\t\tdescription: route.descriptions?.join('\\n\\n'),\n\t\t\ttags: tag ? [tag] : undefined,\n\t\t\tsecurity: route.security,\n\t\t})\n\t}\n\n\tasync #addRouteToOpenApiDoc(path: string, method: string, def: OpenApiSchemaDef, methodObj: OpenAPIV3_1.OperationObject) {\n\t\tif (def.response.response?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.response) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.content![resp.contentType] = { schema: await convert(this.#visit(resp.schema)) }\n\t\t\t}\n\t\t}\n\n\t\tif (def.response.responseHeaders?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.responseHeaders) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tmethodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.headers = { schema: (await convert(this.#visit(resp.schema))) as any }\n\t\t\t}\n\t\t}\n\n\t\tif (def.request.body)\n\t\t\tmethodObj.requestBody = {\n\t\t\t\trequired: true,\n\t\t\t\tcontent: {\n\t\t\t\t\t'application/json': { schema: await convert(this.#visit(def.request.body)) },\n\t\t\t\t},\n\t\t\t}\n\n\t\tconst parameters: OpenAPIV3_1.ParameterObject[] = []\n\n\t\tconst addParams = async (location: 'query' | 'path' | 'header', schema: JsonSchema | undefined) => {\n\t\t\tif (!schema) return\n\t\t\tconst flat = this.#flattenForParameters(schema)\n\t\t\tfor (const schema of flat) {\n\t\t\t\tif (!schema.properties) continue\n\t\t\t\tfor (const [name, value] of Object.entries(schema.properties))\n\t\t\t\t\tparameters.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tin: location,\n\t\t\t\t\t\tschema: await convert(this.#visit(value)),\n\t\t\t\t\t\trequired: (schema.required || []).includes(name),\n\t\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tawait Promise.all([\n\t\t\taddParams('query', def.request.query),\n\t\t\taddParams('path', def.request.params),\n\t\t\taddParams('header', def.request.headers),\n\t\t])\n\t\tif (parameters.length) methodObj.parameters = parameters\n\n\t\tconst base = this.#baseOpenapiDoc\n\t\tif (!base.paths) base.paths = {}\n\t\tif (!base.paths[path]) base.paths[path] = {}\n\t\tbase.paths[path]![method] = methodObj\n\t}\n\n\trouter() {\n\t\tconst jsonPath = '/openapi.json'\n\t\tconst router = new Router({ path: this.config.config.openapi.docsPath ?? '/', hide: true })\n\t\trouter.get('/index.html')((req) => req.res({ body: this.#html(`.${jsonPath}`), contentType: 'text/html' }))\n\t\trouter.get(jsonPath)((req) => req.res({ body: this.#baseOpenapiDoc }))\n\t\treturn router\n\t}\n\n\t#flattenForParameters(node: JsonSchema): JsonSchema[] {\n\t\tconst { allOf, oneOf, anyOf, ...schema } = node\n\t\tif (allOf) return allOf.flatMap((n) => this.#flattenForParameters(n))\n\t\treturn [schema]\n\t}\n\n\t#visit(node: JsonSchema) {\n\t\tif (!node || typeof node !== 'object') return node\n\t\tif (typeof node.$refId === 'string') {\n\t\t\tconst { $refId: id, ...rest } = node\n\t\t\tconst res = this.#visit(rest)\n\t\t\tif (this.#baseOpenapiDoc.components?.schemas) {\n\t\t\t\tthis.#baseOpenapiDoc.components.schemas[id] = res\n\t\t\t\treturn { $ref: `#/components/schemas/${id}` }\n\t\t\t} else return res\n\t\t}\n\n\t\tif (Array.isArray(node)) return node.map((n) => this.#visit(n)) as any\n\t\treturn Object.fromEntries(Object.entries(node).map(([key, value]) => [key, this.#visit(value as any)]))\n\t}\n\n\t#buildTag(groups: NonNullable<Route<any>['groups']>) {\n\t\tif (!groups.length) return undefined\n\t\tconst parsed = groups.map((g) => (typeof g === 'string' ? { name: g } : g))\n\t\tconst name = parsed.map((g) => g.name).join(' > ')\n\t\tconst displayName = parsed.at(-1)?.name ?? ''\n\t\tconst description = parsed\n\t\t\t.map((g) => g.description?.trim() ?? '')\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n\\n\\n\\n')\n\n\t\tif (!this.#registeredTags[name]) {\n\t\t\tthis.#registeredTags[name] = true\n\t\t\tthis.#baseOpenapiDoc.tags!.push({ name, 'x-displayName': displayName, description })\n\n\t\t\tconst tagGroups = parsed.slice(0, -1)\n\t\t\tconst groupName = tagGroups.map((g) => g.name).join(' > ') || 'default'\n\t\t\tif (!this.#registeredTagGroups[groupName]) {\n\t\t\t\tconst group = { name: groupName, tags: [] }\n\t\t\t\tthis.#baseOpenapiDoc['x-tagGroups'].push(group)\n\t\t\t\tthis.#registeredTagGroups[groupName] = group\n\t\t\t}\n\t\t\tthis.#registeredTagGroups[groupName].tags = [...new Set([...this.#registeredTagGroups[groupName].tags, name])]\n\t\t}\n\n\t\treturn name\n\t}\n\n\t#html(jsonPath: string) {\n\t\tconst title = capitalize(`${this.config.app.name} ${this.config.app.id}`)\n\t\treturn `\n<!doctype html>\n<html>\n <head>\n <title>${title}</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t<style>\n .darklight-reference {\n display: none;\n }\n </style>\n </head>\n <body>\n <script id=\"api-reference\" data-url=\"${jsonPath}\"></script>\n <script>\n const configuration = { theme: 'purple' };\n document.getElementById('api-reference').dataset.configuration = JSON.stringify(configuration);\n </script>\n <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.28.33\"></script>\n </body>\n</html>\n`\n\t}\n}\n",null]}
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return 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 _jsonschematoopenapischema = require('@openapi-contrib/json-schema-to-openapi-schema');var _valleyed = require('valleyed');var _routesmincjs = require('./routes.min.cjs');class I{constructor(e){this.config=e;this.#e={openapi:"3.0.0",info:{title:`${e.app.name} ${e.app.id}`,version:_nullishCoalesce(e.config.openapi.docsVersion, () => (""))},servers:_optionalChain([e, 'access', _ => _.config, 'access', _2 => _2.openapi, 'access', _3 => _3.docsBaseUrl, 'optionalAccess', _4 => _4.map, 'call', _5 => _5(s=>({url:s}))]),paths:{},components:{schemas:{},securitySchemes:{Authorization:{type:"apiKey",name:"authorization",in:"header"},RefreshToken:{type:"apiKey",name:"x-refresh-token",in:"header"},ApiKey:{type:"apiKey",name:"x-api-key",in:"header"}}},tags:[],"x-tagGroups":[]}}#n={};#t={};#e;cleanPath(e){let s=e.replace(/(\/\s*)+/g,"/");return s.startsWith("/")||(s=`/${s}`),s!=="/"&&s.endsWith("/")&&(s=s.slice(0,-1)),s}async register(e,s){if(e.hide)return;const t=this.#i(_nullishCoalesce(e.groups, () => ([]))),n=this.cleanPath(e.path),o=`(${e.method.toUpperCase()}) ${n}`;await this.#a(n,e.method.toLowerCase(),s,{operationId:o,summary:_nullishCoalesce(e.title, () => (n)),description:_optionalChain([e, 'access', _6 => _6.descriptions, 'optionalAccess', _7 => _7.join, 'call', _8 => _8(`
2
2
 
3
- `)]),tags:t?[t]:void 0,security:e.security})}async#a(e,s,t,n){if(_optionalChain([t, 'access', _9 => _9.response, 'access', _10 => _10.response, 'optionalAccess', _11 => _11.length])){n.responses??={};for(const r of t.response.response){n.responses[r.status]??={description:"",content:{}};const p=n.responses[r.status];p.content[r.contentType]={schema:await _jsonschematoopenapischema.convert.call(void 0, this.#s(r.schema))}}}if(_optionalChain([t, 'access', _12 => _12.response, 'access', _13 => _13.responseHeaders, 'optionalAccess', _14 => _14.length])){n.responses??={};for(const r of t.response.responseHeaders){n.responses[r.status]??={description:"",content:{}},n.responses[r.status];const p=n.responses[r.status];p.headers={schema:await _jsonschematoopenapischema.convert.call(void 0, this.#s(r.schema))}}}t.request.body&&(n.requestBody={required:!0,content:{"application/json":{schema:await _jsonschematoopenapischema.convert.call(void 0, this.#s(t.request.body))}}});const o=[],a=async(r,p)=>{if(!p)return;const u=this.#r(p);for(const h of u)if(h.properties)for(const[m,f]of Object.entries(h.properties))o.push({name:m,in:r,schema:await _jsonschematoopenapischema.convert.call(void 0, this.#s(f)),required:(h.required||[]).includes(m)})};await Promise.all([a("query",t.request.query),a("path",t.request.params),a("header",t.request.headers)]),o.length&&(n.parameters=o);const i=this.#e;i.paths||(i.paths={}),i.paths[e]||(i.paths[e]={}),i.paths[e][s]=n}router(){const e="/openapi.json",s=new (0, _routesmincjs.Router)({path:_nullishCoalesce(this.config.config.openapi.docsPath, () => ("/")),hide:!0});return s.get("/")(t=>t.res({body:this.#o(`.${e}`),contentType:"text/html"})),s.get(e)(t=>t.res({body:this.#e})),s}#r(e){const{allOf:s,oneOf:t,anyOf:n,...o}=e;return s?s.flatMap(a=>this.#r(a)):[o]}#s(e){if(!e||typeof e!="object")return e;if(typeof e.$refId=="string"){const{$refId:s,...t}=e,n=this.#s(t);return _optionalChain([this, 'access', _15 => _15.#e, 'access', _16 => _16.components, 'optionalAccess', _17 => _17.schemas])?(this.#e.components.schemas[s]=n,{$ref:`#/components/schemas/${s}`}):n}return Array.isArray(e)?e.map(s=>this.#s(s)):Object.fromEntries(Object.entries(e).map(([s,t])=>[s,this.#s(t)]))}#i(e){if(!e.length)return;const s=e.map(a=>typeof a=="string"?{name:a}:a),t=s.map(a=>a.name).join(" > "),n=_nullishCoalesce(_optionalChain([s, 'access', _18 => _18.at, 'call', _19 => _19(-1), 'optionalAccess', _20 => _20.name]), () => ("")),o=s.map(a=>_nullishCoalesce(_optionalChain([a, 'access', _21 => _21.description, 'optionalAccess', _22 => _22.trim, 'call', _23 => _23()]), () => (""))).filter(Boolean).join(`
3
+ `)]),tags:t?[t]:void 0,security:e.security})}async#a(e,s,t,n){if(_optionalChain([t, 'access', _9 => _9.response, 'access', _10 => _10.response, 'optionalAccess', _11 => _11.length])){n.responses??={};for(const r of t.response.response){n.responses[r.status]??={description:"",content:{}};const p=n.responses[r.status];p.content[r.contentType]={schema:await _jsonschematoopenapischema.convert.call(void 0, this.#s(r.schema))}}}if(_optionalChain([t, 'access', _12 => _12.response, 'access', _13 => _13.responseHeaders, 'optionalAccess', _14 => _14.length])){n.responses??={};for(const r of t.response.responseHeaders){n.responses[r.status]??={description:"",content:{}},n.responses[r.status];const p=n.responses[r.status];p.headers={schema:await _jsonschematoopenapischema.convert.call(void 0, this.#s(r.schema))}}}t.request.body&&(n.requestBody={required:!0,content:{"application/json":{schema:await _jsonschematoopenapischema.convert.call(void 0, this.#s(t.request.body))}}});const o=[],a=async(r,p)=>{if(!p)return;const u=this.#r(p);for(const h of u)if(h.properties)for(const[m,f]of Object.entries(h.properties))o.push({name:m,in:r,schema:await _jsonschematoopenapischema.convert.call(void 0, this.#s(f)),required:(h.required||[]).includes(m)})};await Promise.all([a("query",t.request.query),a("path",t.request.params),a("header",t.request.headers)]),o.length&&(n.parameters=o);const i=this.#e;i.paths||(i.paths={}),i.paths[e]||(i.paths[e]={}),i.paths[e][s]=n}router(){const e="/openapi.json",s=new (0, _routesmincjs.Router)({path:_nullishCoalesce(this.config.config.openapi.docsPath, () => ("/")),hide:!0});return s.get("/index.html")(t=>t.res({body:this.#o(`.${e}`),contentType:"text/html"})),s.get(e)(t=>t.res({body:this.#e})),s}#r(e){const{allOf:s,oneOf:t,anyOf:n,...o}=e;return s?s.flatMap(a=>this.#r(a)):[o]}#s(e){if(!e||typeof e!="object")return e;if(typeof e.$refId=="string"){const{$refId:s,...t}=e,n=this.#s(t);return _optionalChain([this, 'access', _15 => _15.#e, 'access', _16 => _16.components, 'optionalAccess', _17 => _17.schemas])?(this.#e.components.schemas[s]=n,{$ref:`#/components/schemas/${s}`}):n}return Array.isArray(e)?e.map(s=>this.#s(s)):Object.fromEntries(Object.entries(e).map(([s,t])=>[s,this.#s(t)]))}#i(e){if(!e.length)return;const s=e.map(a=>typeof a=="string"?{name:a}:a),t=s.map(a=>a.name).join(" > "),n=_nullishCoalesce(_optionalChain([s, 'access', _18 => _18.at, 'call', _19 => _19(-1), 'optionalAccess', _20 => _20.name]), () => ("")),o=s.map(a=>_nullishCoalesce(_optionalChain([a, 'access', _21 => _21.description, 'optionalAccess', _22 => _22.trim, 'call', _23 => _23()]), () => (""))).filter(Boolean).join(`
4
4
 
5
5
 
6
6
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/openapi.ts"],"names":["config","#baseOpenapiDoc"],"mappings":"AAAA,4wBAAwB,oCAEe,gDA2BtC,MAAA,CAAA,CAAA,WAAoB,CAAA,CAAA,CAAA,CAAA,IAAAA,CACnB,MAAKC,CAAAA,CAAkB,CACtB,IAAA,CAAA,CAAA,CAAA,CAAS,CAAA,OACT,CAAA,OACC,CAAA,IAAO,CAAA,CAAGD,KAAO,CAAI,CAAA,EAAA;AA+CgB;AAYjC;AAyFC;AAAA;AAAA;AAWL;AAUK;AAAA;AAAA;AAIS,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUiC,yCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUnD","file":"/home/runner/work/equipped/equipped/dist/cjs/server/openapi.min.cjs","sourcesContent":["import { convert } from '@openapi-contrib/json-schema-to-openapi-schema'\nimport { OpenAPIV3_1 } from 'openapi-types'\nimport { capitalize, JsonSchema } from 'valleyed'\n\nimport { ServerConfig } from './pipes'\nimport { Router } from './routes'\nimport { Route } from './types'\n\ndeclare module 'openapi-types' {\n\tnamespace OpenAPIV3 {\n\t\tinterface Document {\n\t\t\t'x-tagGroups': { name: string; tags: string[] }[]\n\t\t}\n\t\tinterface TagObject {\n\t\t\t'x-displayName': string\n\t\t}\n\t}\n}\n\nexport type OpenApiSchemaDef = {\n\trequest: Partial<Record<'body' | 'query' | 'params' | 'headers' | 'response', JsonSchema>>\n\tresponse: Partial<Record<'response' | 'responseHeaders', { status: number; schema: JsonSchema; contentType: string }[]>>\n}\n\nexport class OpenApi {\n\t#registeredTags: Record<string, boolean> = {}\n\t#registeredTagGroups: Record<string, { name: string; tags: string[] }> = {}\n\t#baseOpenapiDoc: OpenAPIV3_1.Document\n\n\tconstructor(private config: ServerConfig) {\n\t\tthis.#baseOpenapiDoc = {\n\t\t\topenapi: '3.0.0',\n\t\t\tinfo: {\n\t\t\t\ttitle: `${config.app.name} ${config.app.id}`,\n\t\t\t\tversion: config.config.openapi.docsVersion ?? '',\n\t\t\t},\n\t\t\tservers: config.config.openapi.docsBaseUrl?.map((url) => ({ url })),\n\t\t\tpaths: {},\n\t\t\tcomponents: {\n\t\t\t\tschemas: {},\n\t\t\t\tsecuritySchemes: {\n\t\t\t\t\tAuthorization: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'authorization',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t\tRefreshToken: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'x-refresh-token',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t\tApiKey: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'x-api-key',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\ttags: [],\n\t\t\t'x-tagGroups': [],\n\t\t}\n\t}\n\n\tcleanPath(path: string) {\n\t\tlet cleaned = path.replace(/(\\/\\s*)+/g, '/')\n\t\tif (!cleaned.startsWith('/')) cleaned = `/${cleaned}`\n\t\tif (cleaned !== '/' && cleaned.endsWith('/')) cleaned = cleaned.slice(0, -1)\n\t\treturn cleaned\n\t}\n\n\tasync register(route: Route<any>, def: OpenApiSchemaDef) {\n\t\tif (route.hide) return\n\n\t\tconst tag = this.#buildTag(route.groups ?? [])\n\n\t\tconst cleanPath = this.cleanPath(route.path)\n\t\tconst operationId = `(${route.method.toUpperCase()}) ${cleanPath}`\n\t\tawait this.#addRouteToOpenApiDoc(cleanPath, route.method.toLowerCase(), def, {\n\t\t\toperationId,\n\t\t\tsummary: route.title ?? cleanPath,\n\t\t\tdescription: route.descriptions?.join('\\n\\n'),\n\t\t\ttags: tag ? [tag] : undefined,\n\t\t\tsecurity: route.security,\n\t\t})\n\t}\n\n\tasync #addRouteToOpenApiDoc(path: string, method: string, def: OpenApiSchemaDef, methodObj: OpenAPIV3_1.OperationObject) {\n\t\tif (def.response.response?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.response) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.content![resp.contentType] = { schema: await convert(this.#visit(resp.schema)) }\n\t\t\t}\n\t\t}\n\n\t\tif (def.response.responseHeaders?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.responseHeaders) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tmethodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.headers = { schema: (await convert(this.#visit(resp.schema))) as any }\n\t\t\t}\n\t\t}\n\n\t\tif (def.request.body)\n\t\t\tmethodObj.requestBody = {\n\t\t\t\trequired: true,\n\t\t\t\tcontent: {\n\t\t\t\t\t'application/json': { schema: await convert(this.#visit(def.request.body)) },\n\t\t\t\t},\n\t\t\t}\n\n\t\tconst parameters: OpenAPIV3_1.ParameterObject[] = []\n\n\t\tconst addParams = async (location: 'query' | 'path' | 'header', schema: JsonSchema | undefined) => {\n\t\t\tif (!schema) return\n\t\t\tconst flat = this.#flattenForParameters(schema)\n\t\t\tfor (const schema of flat) {\n\t\t\t\tif (!schema.properties) continue\n\t\t\t\tfor (const [name, value] of Object.entries(schema.properties))\n\t\t\t\t\tparameters.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tin: location,\n\t\t\t\t\t\tschema: await convert(this.#visit(value)),\n\t\t\t\t\t\trequired: (schema.required || []).includes(name),\n\t\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tawait Promise.all([\n\t\t\taddParams('query', def.request.query),\n\t\t\taddParams('path', def.request.params),\n\t\t\taddParams('header', def.request.headers),\n\t\t])\n\t\tif (parameters.length) methodObj.parameters = parameters\n\n\t\tconst base = this.#baseOpenapiDoc\n\t\tif (!base.paths) base.paths = {}\n\t\tif (!base.paths[path]) base.paths[path] = {}\n\t\tbase.paths[path]![method] = methodObj\n\t}\n\n\trouter() {\n\t\tconst jsonPath = '/openapi.json'\n\t\tconst router = new Router({ path: this.config.config.openapi.docsPath ?? '/', hide: true })\n\t\trouter.get('/')((req) => req.res({ body: this.#html(`.${jsonPath}`), contentType: 'text/html' }))\n\t\trouter.get(jsonPath)((req) => req.res({ body: this.#baseOpenapiDoc }))\n\t\treturn router\n\t}\n\n\t#flattenForParameters(node: JsonSchema): JsonSchema[] {\n\t\tconst { allOf, oneOf, anyOf, ...schema } = node\n\t\tif (allOf) return allOf.flatMap((n) => this.#flattenForParameters(n))\n\t\treturn [schema]\n\t}\n\n\t#visit(node: JsonSchema) {\n\t\tif (!node || typeof node !== 'object') return node\n\t\tif (typeof node.$refId === 'string') {\n\t\t\tconst { $refId: id, ...rest } = node\n\t\t\tconst res = this.#visit(rest)\n\t\t\tif (this.#baseOpenapiDoc.components?.schemas) {\n\t\t\t\tthis.#baseOpenapiDoc.components.schemas[id] = res\n\t\t\t\treturn { $ref: `#/components/schemas/${id}` }\n\t\t\t} else return res\n\t\t}\n\n\t\tif (Array.isArray(node)) return node.map((n) => this.#visit(n)) as any\n\t\treturn Object.fromEntries(Object.entries(node).map(([key, value]) => [key, this.#visit(value as any)]))\n\t}\n\n\t#buildTag(groups: NonNullable<Route<any>['groups']>) {\n\t\tif (!groups.length) return undefined\n\t\tconst parsed = groups.map((g) => (typeof g === 'string' ? { name: g } : g))\n\t\tconst name = parsed.map((g) => g.name).join(' > ')\n\t\tconst displayName = parsed.at(-1)?.name ?? ''\n\t\tconst description = parsed\n\t\t\t.map((g) => g.description?.trim() ?? '')\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n\\n\\n\\n')\n\n\t\tif (!this.#registeredTags[name]) {\n\t\t\tthis.#registeredTags[name] = true\n\t\t\tthis.#baseOpenapiDoc.tags!.push({ name, 'x-displayName': displayName, description })\n\n\t\t\tconst tagGroups = parsed.slice(0, -1)\n\t\t\tconst groupName = tagGroups.map((g) => g.name).join(' > ') || 'default'\n\t\t\tif (!this.#registeredTagGroups[groupName]) {\n\t\t\t\tconst group = { name: groupName, tags: [] }\n\t\t\t\tthis.#baseOpenapiDoc['x-tagGroups'].push(group)\n\t\t\t\tthis.#registeredTagGroups[groupName] = group\n\t\t\t}\n\t\t\tthis.#registeredTagGroups[groupName].tags = [...new Set([...this.#registeredTagGroups[groupName].tags, name])]\n\t\t}\n\n\t\treturn name\n\t}\n\n\t#html(jsonPath: string) {\n\t\tconst title = capitalize(`${this.config.app.name} ${this.config.app.id}`)\n\t\treturn `\n<!doctype html>\n<html>\n <head>\n <title>${title}</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t<style>\n .darklight-reference {\n display: none;\n }\n </style>\n </head>\n <body>\n <script id=\"api-reference\" data-url=\"${jsonPath}\"></script>\n <script>\n const configuration = { theme: 'purple' };\n document.getElementById('api-reference').dataset.configuration = JSON.stringify(configuration);\n </script>\n <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.28.33\"></script>\n </body>\n</html>\n`\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../src/server/openapi.ts"],"names":["config","#baseOpenapiDoc"],"mappings":"AAAA,4wBAAwB,oCAEe,gDA2BtC,MAAA,CAAA,CAAA,WAAoB,CAAA,CAAA,CAAA,CAAA,IAAAA,CACnB,MAAKC,CAAAA,CAAkB,CACtB,IAAA,CAAA,CAAA,CAAA,CAAS,CAAA,OACT,CAAA,OACC,CAAA,IAAO,CAAA,CAAGD,KAAO,CAAI,CAAA,EAAA;AA+CgB;AAYjC;AAyFC;AAAA;AAAA;AAWL;AAUK;AAAA;AAAA;AAIS,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUiC,yCAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUnD","file":"/home/runner/work/equipped/equipped/dist/cjs/server/openapi.min.cjs","sourcesContent":["import { convert } from '@openapi-contrib/json-schema-to-openapi-schema'\nimport { OpenAPIV3_1 } from 'openapi-types'\nimport { capitalize, JsonSchema } from 'valleyed'\n\nimport { ServerConfig } from './pipes'\nimport { Router } from './routes'\nimport { Route } from './types'\n\ndeclare module 'openapi-types' {\n\tnamespace OpenAPIV3 {\n\t\tinterface Document {\n\t\t\t'x-tagGroups': { name: string; tags: string[] }[]\n\t\t}\n\t\tinterface TagObject {\n\t\t\t'x-displayName': string\n\t\t}\n\t}\n}\n\nexport type OpenApiSchemaDef = {\n\trequest: Partial<Record<'body' | 'query' | 'params' | 'headers' | 'response', JsonSchema>>\n\tresponse: Partial<Record<'response' | 'responseHeaders', { status: number; schema: JsonSchema; contentType: string }[]>>\n}\n\nexport class OpenApi {\n\t#registeredTags: Record<string, boolean> = {}\n\t#registeredTagGroups: Record<string, { name: string; tags: string[] }> = {}\n\t#baseOpenapiDoc: OpenAPIV3_1.Document\n\n\tconstructor(private config: ServerConfig) {\n\t\tthis.#baseOpenapiDoc = {\n\t\t\topenapi: '3.0.0',\n\t\t\tinfo: {\n\t\t\t\ttitle: `${config.app.name} ${config.app.id}`,\n\t\t\t\tversion: config.config.openapi.docsVersion ?? '',\n\t\t\t},\n\t\t\tservers: config.config.openapi.docsBaseUrl?.map((url) => ({ url })),\n\t\t\tpaths: {},\n\t\t\tcomponents: {\n\t\t\t\tschemas: {},\n\t\t\t\tsecuritySchemes: {\n\t\t\t\t\tAuthorization: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'authorization',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t\tRefreshToken: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'x-refresh-token',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t\tApiKey: {\n\t\t\t\t\t\ttype: 'apiKey',\n\t\t\t\t\t\tname: 'x-api-key',\n\t\t\t\t\t\tin: 'header',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\ttags: [],\n\t\t\t'x-tagGroups': [],\n\t\t}\n\t}\n\n\tcleanPath(path: string) {\n\t\tlet cleaned = path.replace(/(\\/\\s*)+/g, '/')\n\t\tif (!cleaned.startsWith('/')) cleaned = `/${cleaned}`\n\t\tif (cleaned !== '/' && cleaned.endsWith('/')) cleaned = cleaned.slice(0, -1)\n\t\treturn cleaned\n\t}\n\n\tasync register(route: Route<any>, def: OpenApiSchemaDef) {\n\t\tif (route.hide) return\n\n\t\tconst tag = this.#buildTag(route.groups ?? [])\n\n\t\tconst cleanPath = this.cleanPath(route.path)\n\t\tconst operationId = `(${route.method.toUpperCase()}) ${cleanPath}`\n\t\tawait this.#addRouteToOpenApiDoc(cleanPath, route.method.toLowerCase(), def, {\n\t\t\toperationId,\n\t\t\tsummary: route.title ?? cleanPath,\n\t\t\tdescription: route.descriptions?.join('\\n\\n'),\n\t\t\ttags: tag ? [tag] : undefined,\n\t\t\tsecurity: route.security,\n\t\t})\n\t}\n\n\tasync #addRouteToOpenApiDoc(path: string, method: string, def: OpenApiSchemaDef, methodObj: OpenAPIV3_1.OperationObject) {\n\t\tif (def.response.response?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.response) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.content![resp.contentType] = { schema: await convert(this.#visit(resp.schema)) }\n\t\t\t}\n\t\t}\n\n\t\tif (def.response.responseHeaders?.length) {\n\t\t\tmethodObj.responses ??= {}\n\t\t\tfor (const resp of def.response.responseHeaders) {\n\t\t\t\tmethodObj.responses[resp.status] ??= { description: '', content: {} }\n\t\t\t\tmethodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tconst res = methodObj.responses[resp.status] as OpenAPIV3_1.ResponseObject\n\t\t\t\tres.headers = { schema: (await convert(this.#visit(resp.schema))) as any }\n\t\t\t}\n\t\t}\n\n\t\tif (def.request.body)\n\t\t\tmethodObj.requestBody = {\n\t\t\t\trequired: true,\n\t\t\t\tcontent: {\n\t\t\t\t\t'application/json': { schema: await convert(this.#visit(def.request.body)) },\n\t\t\t\t},\n\t\t\t}\n\n\t\tconst parameters: OpenAPIV3_1.ParameterObject[] = []\n\n\t\tconst addParams = async (location: 'query' | 'path' | 'header', schema: JsonSchema | undefined) => {\n\t\t\tif (!schema) return\n\t\t\tconst flat = this.#flattenForParameters(schema)\n\t\t\tfor (const schema of flat) {\n\t\t\t\tif (!schema.properties) continue\n\t\t\t\tfor (const [name, value] of Object.entries(schema.properties))\n\t\t\t\t\tparameters.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tin: location,\n\t\t\t\t\t\tschema: await convert(this.#visit(value)),\n\t\t\t\t\t\trequired: (schema.required || []).includes(name),\n\t\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tawait Promise.all([\n\t\t\taddParams('query', def.request.query),\n\t\t\taddParams('path', def.request.params),\n\t\t\taddParams('header', def.request.headers),\n\t\t])\n\t\tif (parameters.length) methodObj.parameters = parameters\n\n\t\tconst base = this.#baseOpenapiDoc\n\t\tif (!base.paths) base.paths = {}\n\t\tif (!base.paths[path]) base.paths[path] = {}\n\t\tbase.paths[path]![method] = methodObj\n\t}\n\n\trouter() {\n\t\tconst jsonPath = '/openapi.json'\n\t\tconst router = new Router({ path: this.config.config.openapi.docsPath ?? '/', hide: true })\n\t\trouter.get('/index.html')((req) => req.res({ body: this.#html(`.${jsonPath}`), contentType: 'text/html' }))\n\t\trouter.get(jsonPath)((req) => req.res({ body: this.#baseOpenapiDoc }))\n\t\treturn router\n\t}\n\n\t#flattenForParameters(node: JsonSchema): JsonSchema[] {\n\t\tconst { allOf, oneOf, anyOf, ...schema } = node\n\t\tif (allOf) return allOf.flatMap((n) => this.#flattenForParameters(n))\n\t\treturn [schema]\n\t}\n\n\t#visit(node: JsonSchema) {\n\t\tif (!node || typeof node !== 'object') return node\n\t\tif (typeof node.$refId === 'string') {\n\t\t\tconst { $refId: id, ...rest } = node\n\t\t\tconst res = this.#visit(rest)\n\t\t\tif (this.#baseOpenapiDoc.components?.schemas) {\n\t\t\t\tthis.#baseOpenapiDoc.components.schemas[id] = res\n\t\t\t\treturn { $ref: `#/components/schemas/${id}` }\n\t\t\t} else return res\n\t\t}\n\n\t\tif (Array.isArray(node)) return node.map((n) => this.#visit(n)) as any\n\t\treturn Object.fromEntries(Object.entries(node).map(([key, value]) => [key, this.#visit(value as any)]))\n\t}\n\n\t#buildTag(groups: NonNullable<Route<any>['groups']>) {\n\t\tif (!groups.length) return undefined\n\t\tconst parsed = groups.map((g) => (typeof g === 'string' ? { name: g } : g))\n\t\tconst name = parsed.map((g) => g.name).join(' > ')\n\t\tconst displayName = parsed.at(-1)?.name ?? ''\n\t\tconst description = parsed\n\t\t\t.map((g) => g.description?.trim() ?? '')\n\t\t\t.filter(Boolean)\n\t\t\t.join('\\n\\n\\n\\n')\n\n\t\tif (!this.#registeredTags[name]) {\n\t\t\tthis.#registeredTags[name] = true\n\t\t\tthis.#baseOpenapiDoc.tags!.push({ name, 'x-displayName': displayName, description })\n\n\t\t\tconst tagGroups = parsed.slice(0, -1)\n\t\t\tconst groupName = tagGroups.map((g) => g.name).join(' > ') || 'default'\n\t\t\tif (!this.#registeredTagGroups[groupName]) {\n\t\t\t\tconst group = { name: groupName, tags: [] }\n\t\t\t\tthis.#baseOpenapiDoc['x-tagGroups'].push(group)\n\t\t\t\tthis.#registeredTagGroups[groupName] = group\n\t\t\t}\n\t\t\tthis.#registeredTagGroups[groupName].tags = [...new Set([...this.#registeredTagGroups[groupName].tags, name])]\n\t\t}\n\n\t\treturn name\n\t}\n\n\t#html(jsonPath: string) {\n\t\tconst title = capitalize(`${this.config.app.name} ${this.config.app.id}`)\n\t\treturn `\n<!doctype html>\n<html>\n <head>\n <title>${title}</title>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t<style>\n .darklight-reference {\n display: none;\n }\n </style>\n </head>\n <body>\n <script id=\"api-reference\" data-url=\"${jsonPath}\"></script>\n <script>\n const configuration = { theme: 'purple' };\n document.getElementById('api-reference').dataset.configuration = JSON.stringify(configuration);\n </script>\n <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.28.33\"></script>\n </body>\n</html>\n`\n\t}\n}\n"]}
@@ -1,2 +1,2 @@
1
- import{ObjectId as m}from"mongodb";import{parseMongodbQueryParams as f}from "./query.min.mjs";import{EquippedError as p}from "../../errors/index.min.mjs";const c="_id";function W(y,d){async function u(t){const n=(Array.isArray(t)?t:[t]).map(r=>y.mapper(r));return Array.isArray(t)?n:n[0]}function l(t,e,n,r){const s={[c]:e,...y.options?.skipAudit?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...t,...s}}function o(t,e){return{...t,$set:{...t.$set,...Object.keys(t).length>0&&!y.options?.skipAudit?{updatedAt:e.getTime()}:{}}}}const i={config:y,extras:{collection:d},query:async t=>{const e=await f(d,t);return{...e,results:await u(e.results)}},findMany:async(t,e={})=>{const r=(Array.isArray(e.sort)?e.sort:e.sort?[e.sort]:[]).map(a=>[a.field,a.desc?"desc":"asc"]),s=await d.find(t,{session:e.session,limit:e.limit,sort:r}).toArray();return u(s)},findOne:async(t,e={})=>(await i.findMany(t,{...e,limit:1})).at(0)??null,findById:async(t,e={})=>await i.findOne({[c]:t},e),insertMany:async(t,e={})=>{const n=e.getTime?.()??new Date,r=t.map((a,w)=>l(a,e.makeId?.(w)??new m().toString(),n));return await d.insertMany(r,{session:e.session}),(await Promise.all(r.map(async a=>await i.findById(a[c],e)))).filter(a=>!!a)},insertOne:async(t,e={})=>(await i.insertMany([t],e))[0],updateMany:async(t,e,n={})=>{const r=n.getTime?.()??new Date;return await d.updateMany(t,o(e,r),{session:n.session}),i.findMany(t,n)},updateOne:async(t,e,n={})=>{const r=n.getTime?.()??new Date,s=await d.findOneAndUpdate(t,o(e,r),{returnDocument:"after",session:n.session});return s?u(s):null},updateById:async(t,e,n={})=>await i.updateOne({[c]:t},e,n),upsertOne:async(t,e,n={})=>{const r=n.getTime?.()??new Date,s=await d.findOneAndUpdate(t,{...o("update"in e?e.update:{},r),$setOnInsert:l(e.insert,n.makeId?.()??new m().toString(),r,!0)},{returnDocument:"after",session:n.session,upsert:!0});return u(s)},deleteMany:async(t,e={})=>{const n=await i.findMany(t,e);return await d.deleteMany(t,{session:e.session}),n},deleteOne:async(t,e)=>{const n=await d.findOneAndDelete(t,{session:e?.session});return n?u(n):null},deleteById:async(t,e)=>await i.deleteOne({[c]:t},e),bulkWrite:async(t,e={})=>{const n=d.initializeUnorderedBulkOp({session:e.session}),r=e.getTime?.()??new Date;t.forEach((s,a)=>{switch(s.op){case"insert":n.insert(l(s.value,s.makeId?.(a)??new m().toString(),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(o(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...o("update"in s?s.update:{},r),$setOnInsert:l(s.insert,s.makeId?.(a)??new m().toString(),r,!0)});break;default:throw new p("Unknown bulkWrite operation",{operation:s})}}),await n.execute({session:e.session})}};return i}export{W as getTable};
1
+ import{ObjectId as m}from"mongodb";import{parseMongodbQueryParams as f}from "./query.min.mjs";import{EquippedError as p}from "../../errors/index.min.mjs";const c="_id";function W(y,d){async function u(t){const n=(Array.isArray(t)?t:[t]).map(r=>y.mapper(r));return Array.isArray(t)?n:n[0]}function l(t,e,n,r){const s={[c]:e,...y.options?.skipAudit?{}:{createdAt:n.getTime(),...r?{}:{updatedAt:n.getTime()}}};return{...t,...s}}function o(t,e,n=!1){return{...t,$set:{...t.$set,...n||Object.keys(t).length>0&&!y.options?.skipAudit?{updatedAt:e.getTime()}:{}}}}const i={config:y,extras:{collection:d},query:async t=>{const e=await f(d,t);return{...e,results:await u(e.results)}},findMany:async(t,e={})=>{const r=(Array.isArray(e.sort)?e.sort:e.sort?[e.sort]:[]).map(a=>[a.field,a.desc?"desc":"asc"]),s=await d.find(t,{session:e.session,limit:e.limit,sort:r}).toArray();return u(s)},findOne:async(t,e={})=>(await i.findMany(t,{...e,limit:1})).at(0)??null,findById:async(t,e={})=>await i.findOne({[c]:t},e),insertMany:async(t,e={})=>{const n=e.getTime?.()??new Date,r=t.map((a,w)=>l(a,e.makeId?.(w)??new m().toString(),n));return await d.insertMany(r,{session:e.session}),(await Promise.all(r.map(async a=>await i.findById(a[c],e)))).filter(a=>!!a)},insertOne:async(t,e={})=>(await i.insertMany([t],e))[0],updateMany:async(t,e,n={})=>{const r=n.getTime?.()??new Date;return await d.updateMany(t,o(e,r),{session:n.session}),i.findMany(t,n)},updateOne:async(t,e,n={})=>{const r=n.getTime?.()??new Date,s=await d.findOneAndUpdate(t,o(e,r),{returnDocument:"after",session:n.session});return s?u(s):null},updateById:async(t,e,n={})=>await i.updateOne({[c]:t},e,n),upsertOne:async(t,e,n={})=>{const r=n.getTime?.()??new Date,s=await d.findOneAndUpdate(t,{...o("update"in e?e.update:{},r,!0),$setOnInsert:l(e.insert,n.makeId?.()??new m().toString(),r,!0)},{returnDocument:"after",session:n.session,upsert:!0});return u(s)},deleteMany:async(t,e={})=>{const n=await i.findMany(t,e);return await d.deleteMany(t,{session:e.session}),n},deleteOne:async(t,e)=>{const n=await d.findOneAndDelete(t,{session:e?.session});return n?u(n):null},deleteById:async(t,e)=>await i.deleteOne({[c]:t},e),bulkWrite:async(t,e={})=>{const n=d.initializeUnorderedBulkOp({session:e.session}),r=e.getTime?.()??new Date;t.forEach((s,a)=>{switch(s.op){case"insert":n.insert(l(s.value,s.makeId?.(a)??new m().toString(),r));break;case"delete":n.find(s.filter).delete();break;case"update":n.find(s.filter).update(o(s.value,r));break;case"upsert":n.find(s.filter).upsert().update({...o("update"in s?s.update:{},r,!0),$setOnInsert:l(s.insert,s.makeId?.(a)??new m().toString(),r,!0)});break;default:throw new p("Unknown bulkWrite operation",{operation:s})}}),await n.execute({session:e.session})}};return i}export{W as getTable};
2
2
  //# sourceMappingURL=api.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/dbs/mongo/api.ts"],"sourcesContent":["import { Collection, ObjectId, OptionalUnlessRequiredId, SortDirection, WithId } from 'mongodb'\n\nimport { QueryParams } from '../pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../errors'\nimport * as core from '../base/core'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nexport function getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\tconfig: core.Config<Model, Entity>,\n\tcollection: Collection<Model>,\n) {\n\ttype WI = Model | WithId<Model>\n\tasync function transform(doc: WI): Promise<Entity>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI | WI[]) {\n\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t}\n\n\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\tconst base: core.Model<IdType> = {\n\t\t\t[idKey]: id,\n\t\t\t...(config.options?.skipAudit\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t}),\n\t\t}\n\t\treturn {\n\t\t\t...value,\n\t\t\t...base,\n\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t}\n\n\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date) {\n\t\treturn {\n\t\t\t...value,\n\t\t\t$set: {\n\t\t\t\t...value.$set,\n\t\t\t\t...(Object.keys(value).length > 0 && !config.options?.skipAudit\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tupdatedAt: now.getTime(),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t}\n\t}\n\n\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\tconfig,\n\t\textras: { collection },\n\n\t\tquery: async (params: QueryParams) => {\n\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\treturn {\n\t\t\t\t...results,\n\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t}\n\t\t},\n\n\t\tfindMany: async (filter, options = {}) => {\n\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\tconst docs = await collection\n\t\t\t\t.find(filter, {\n\t\t\t\t\tsession: options.session,\n\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\tsort,\n\t\t\t\t})\n\t\t\t\t.toArray()\n\t\t\treturn transform(docs)\n\t\t},\n\n\t\tfindOne: async (filter, options = {}) => {\n\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 })\n\t\t\treturn result.at(0) ?? null\n\t\t},\n\n\t\tfindById: async (id, options = {}) => {\n\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tinsertMany: async (values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\tawait collection.insertMany(payload, { session: options.session })\n\n\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any, options)))\n\t\t\treturn insertedData.filter((value) => !!value)\n\t\t},\n\n\t\tinsertOne: async (values, options = {}) => {\n\t\t\tconst result = await table.insertMany([values], options)\n\t\t\treturn result[0]\n\t\t},\n\n\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tawait collection.updateMany(filter, prepUpdateValue(values, now), { session: options.session })\n\t\t\treturn table.findMany(filter, options)\n\t\t},\n\n\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\treturnDocument: 'after',\n\t\t\t\tsession: options.session,\n\t\t\t})\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tupdateById: async (id, values, options = {}) => {\n\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\treturn result\n\t\t},\n\n\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\tfilter,\n\t\t\t\t{\n\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now),\n\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t},\n\t\t\t\t{ returnDocument: 'after', session: options.session, upsert: true },\n\t\t\t)\n\n\t\t\treturn transform(doc)\n\t\t},\n\n\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\tawait collection.deleteMany(filter, { session: options.session })\n\t\t\treturn docs\n\t\t},\n\n\t\tdeleteOne: async (filter, options) => {\n\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: options?.session })\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tdeleteById: async (id, options) => {\n\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: options.session })\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\toperations.forEach((operation, i) => {\n\t\t\t\tswitch (operation.op) {\n\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'update':\n\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now),\n\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t}\n\t\t\t})\n\t\t\tawait bulk.execute({ session: options.session })\n\t\t},\n\t}\n\n\treturn table\n}\n"],"mappings":"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","names":["ObjectId","parseMongodbQueryParams","EquippedError","idKey","getTable","config","collection","transform","doc","mapped","d","prepInsertValue","value","id","now","skipUpdate","base","prepUpdateValue","table","params","results","filter","options","sort","p","docs","values","payload","i","data","operations","bulk","operation"]}
1
+ {"version":3,"sources":["../../../../src/dbs/mongo/api.ts"],"sourcesContent":["import { Collection, ObjectId, OptionalUnlessRequiredId, SortDirection, WithId } from 'mongodb'\n\nimport { QueryParams } from '../pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../errors'\nimport * as core from '../base/core'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nexport function getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\tconfig: core.Config<Model, Entity>,\n\tcollection: Collection<Model>,\n) {\n\ttype WI = Model | WithId<Model>\n\tasync function transform(doc: WI): Promise<Entity>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t// eslint-disable-next-line no-redeclare\n\tasync function transform(doc: WI | WI[]) {\n\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t}\n\n\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\tconst base: core.Model<IdType> = {\n\t\t\t[idKey]: id,\n\t\t\t...(config.options?.skipAudit\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t}),\n\t\t}\n\t\treturn {\n\t\t\t...value,\n\t\t\t...base,\n\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t}\n\n\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\treturn {\n\t\t\t...value,\n\t\t\t$set: {\n\t\t\t\t...value.$set,\n\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t},\n\t\t}\n\t}\n\n\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\tconfig,\n\t\textras: { collection },\n\n\t\tquery: async (params: QueryParams) => {\n\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\treturn {\n\t\t\t\t...results,\n\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t}\n\t\t},\n\n\t\tfindMany: async (filter, options = {}) => {\n\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\tconst docs = await collection\n\t\t\t\t.find(filter, {\n\t\t\t\t\tsession: options.session,\n\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\tsort,\n\t\t\t\t})\n\t\t\t\t.toArray()\n\t\t\treturn transform(docs)\n\t\t},\n\n\t\tfindOne: async (filter, options = {}) => {\n\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 })\n\t\t\treturn result.at(0) ?? null\n\t\t},\n\n\t\tfindById: async (id, options = {}) => {\n\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tinsertMany: async (values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\tawait collection.insertMany(payload, { session: options.session })\n\n\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any, options)))\n\t\t\treturn insertedData.filter((value) => !!value)\n\t\t},\n\n\t\tinsertOne: async (values, options = {}) => {\n\t\t\tconst result = await table.insertMany([values], options)\n\t\t\treturn result[0]\n\t\t},\n\n\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tawait collection.updateMany(filter, prepUpdateValue(values, now), { session: options.session })\n\t\t\treturn table.findMany(filter, options)\n\t\t},\n\n\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\treturnDocument: 'after',\n\t\t\t\tsession: options.session,\n\t\t\t})\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tupdateById: async (id, values, options = {}) => {\n\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\treturn result\n\t\t},\n\n\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\tfilter,\n\t\t\t\t{\n\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t},\n\t\t\t\t{ returnDocument: 'after', session: options.session, upsert: true },\n\t\t\t)\n\n\t\t\treturn transform(doc)\n\t\t},\n\n\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\tawait collection.deleteMany(filter, { session: options.session })\n\t\t\treturn docs\n\t\t},\n\n\t\tdeleteOne: async (filter, options) => {\n\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: options?.session })\n\t\t\treturn doc ? transform(doc) : null\n\t\t},\n\n\t\tdeleteById: async (id, options) => {\n\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>, options)\n\t\t\treturn result\n\t\t},\n\n\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: options.session })\n\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\toperations.forEach((operation, i) => {\n\t\t\t\tswitch (operation.op) {\n\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'update':\n\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t.update({\n\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$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t}\n\t\t\t})\n\t\t\tawait bulk.execute({ session: options.session })\n\t\t},\n\t}\n\n\treturn table\n}\n"],"mappings":"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","names":["ObjectId","parseMongodbQueryParams","EquippedError","idKey","getTable","config","collection","transform","doc","mapped","d","prepInsertValue","value","id","now","skipUpdate","base","prepUpdateValue","upsert","table","params","results","filter","options","sort","p","docs","values","payload","i","data","operations","bulk","operation"]}