equipped 5.0.14 → 5.0.16

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 (45) hide show
  1. package/CHANGELOG.md +15 -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/cjs/validations/valleyed.cjs +6 -4
  15. package/dist/cjs/validations/valleyed.cjs.map +1 -1
  16. package/dist/cjs/validations/valleyed.min.cjs +1 -1
  17. package/dist/cjs/validations/valleyed.min.cjs.map +1 -1
  18. package/dist/esm/dbs/mongo/api.min.mjs +1 -1
  19. package/dist/esm/dbs/mongo/api.min.mjs.map +1 -1
  20. package/dist/esm/dbs/mongo/api.mjs +4 -6
  21. package/dist/esm/dbs/mongo/api.mjs.map +1 -1
  22. package/dist/esm/dbs/mongo/index.min.mjs +1 -1
  23. package/dist/esm/dbs/mongo/index.min.mjs.map +1 -1
  24. package/dist/esm/dbs/mongo/index.mjs +8 -8
  25. package/dist/esm/dbs/mongo/index.mjs.map +1 -1
  26. package/dist/esm/server/openapi.min.mjs +1 -1
  27. package/dist/esm/server/openapi.min.mjs.map +1 -1
  28. package/dist/esm/server/openapi.mjs +1 -1
  29. package/dist/esm/server/openapi.mjs.map +1 -1
  30. package/dist/esm/validations/valleyed.min.mjs +1 -1
  31. package/dist/esm/validations/valleyed.min.mjs.map +1 -1
  32. package/dist/esm/validations/valleyed.mjs +6 -4
  33. package/dist/esm/validations/valleyed.mjs.map +1 -1
  34. package/dist/types/dbs/index.d.ts +2 -2
  35. package/dist/types/dbs/mongo/api.js +4 -6
  36. package/dist/types/dbs/mongo/index.js +8 -8
  37. package/dist/types/{index-5Qkb5V68.d.ts → index-BS53hVyq.d.ts} +1 -1
  38. package/dist/types/{index-CegB2bgP.d.ts → index-CfuXekZB.d.ts} +2 -1
  39. package/dist/types/index.d.ts +2 -2
  40. package/dist/types/instance/index.d.ts +2 -2
  41. package/dist/types/server/index.d.ts +3 -3
  42. package/dist/types/server/openapi.js +1 -1
  43. package/dist/types/validations/index.d.ts +3 -4
  44. package/dist/types/validations/valleyed.js +6 -4
  45. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
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.16](https://github.com/kevinand11/equipped/compare/v5.0.15...v5.0.16) (2025-07-06)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * withRequest and withResponse ([80c5a7f](https://github.com/kevinand11/equipped/commit/80c5a7fda7c4e4f221ef8ad427a55b12bfd6087d))
11
+
12
+ ### [5.0.15](https://github.com/kevinand11/equipped/compare/v5.0.14...v5.0.15) (2025-07-06)
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * docs is hosted at ./index.html instead of ./ ([98e999c](https://github.com/kevinand11/equipped/commit/98e999c004b03697f87a908f04979a7c0e647e9f))
18
+ * updatedAt for upsert ([b956e7a](https://github.com/kevinand11/equipped/commit/b956e7ae6d37ded65e260376dc2527902a6b0373))
19
+
5
20
  ### [5.0.14](https://github.com/kevinand11/equipped/compare/v5.0.13...v5.0.14) (2025-07-06)
6
21
 
7
22
 
@@ -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"]}
@@ -20,15 +20,17 @@ const incomingFiles = (err) => _valleyed.v.define(_valleyed.v.compile(filePipe(e
20
20
  });
21
21
  const requestLocalStorage = new (0, _nodeasync_hooks.AsyncLocalStorage)();
22
22
  const responseLocalStorage = new (0, _nodeasync_hooks.AsyncLocalStorage)();
23
- const withRequest = (fn) => _valleyed.v.lazy(() => {
23
+ const withRequest = (fn) => _valleyed.v.define((input) => {
24
24
  const req = requestLocalStorage.getStore();
25
25
  if (!req) throw new Error("Request not found in context");
26
- return fn(req);
26
+ const validated = _valleyed.v.validate(fn(req), input);
27
+ return validated.valid ? validated.value : validated.error;
27
28
  });
28
- const withResponse = (fn) => _valleyed.v.lazy(() => {
29
+ const withResponse = (fn) => _valleyed.v.define((input) => {
29
30
  const res = responseLocalStorage.getStore();
30
31
  if (!res) throw new Error("Response not found in context");
31
- return fn(res);
32
+ const validated = _valleyed.v.validate(fn(res), input);
33
+ return validated.valid ? validated.value : validated.error;
32
34
  });
33
35
 
34
36
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/validations/valleyed.ts","/home/runner/work/equipped/equipped/dist/cjs/validations/valleyed.cjs"],"names":["err"],"mappings":"AAAA,goBAAkC;AAElC,oCAAmC;AAEnC,iDAAyB;AAGzB,MAAM,SAAA,EAAW,CAAC,GAAA,EAAA,GACjB,WAAA,CAAE,KAAA;AAAA,EACD,WAAA,CAAE,IAAA,CAAmB,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAA,GAAU;AACzC,IAAA,MAAMA,KAAAA,EAAM,CAAA,gCAAA,kBAAmC,kBAAA,mBAAS,GAAA,mBAAI,CAAA,qBAAE,QAAA,qBAAS,MAAA,6BAAQ,QAAA,qBAAS,uBAAqB,CAAA,EAAA,CAAA;AAC7G,IAAA,MAAM,MAAA,EAAQ,MAAA,EAAQ,CAAC,KAAA,CAAM,YAAA,EAAc,IAAA;AAC3C,IAAA,GAAA,CAAI,KAAA,EAAO,OAAO,KAAA;AAClB,IAAA,MAAM,mBAAA,CAAU,IAAA,CAAKA,IAAAA,EAAK,KAAK,CAAA;AAAA,EAChC,CAAC;AACF,CAAA;AAEM,MAAM,aAAA,EAAe,CAAC,GAAA,EAAA,GAC5B,WAAA,CAAE,MAAA;AAAA,EACD,WAAA,CAAE,OAAA;AAAA,IACD,QAAA,CAAS,GAAG,CAAA,CACV,IAAA,CAAK,WAAA,CAAE,GAAA,CAAI,CAAA,EAAG,kBAAkB,CAAC,CAAA,CACjC,IAAA,CAAK,CAAC,KAAA,EAAA,GAAU,KAAA,CAAM,CAAC,CAAC;AAAA,EAC3B,CAAA;AAAA,EACA,EAAE,MAAA,EAAQ,CAAA,EAAA,GAAA,CAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAA,EAAG;AACxD,CAAA;AAEM,MAAM,cAAA,EAAgB,CAAC,GAAA,EAAA,GAC7B,WAAA,CAAE,MAAA,CAAgC,WAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG;AAAA,EAC3D,MAAA,EAAQ,CAAA,EAAA,GAAA,CAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAA;AACnD,CAAC,CAAA;AAEK,MAAM,oBAAA,EAAsB,IAAI,uCAAA,CAAuD,CAAA;AACvF,MAAM,qBAAA,EAAuB,IAAI,uCAAA,CAAwD,CAAA;AAEzF,MAAM,YAAA,EAAc,CAA2B,EAAA,EAAA,GACrD,WAAA,CAAE,IAAA,CAAK,CAAA,EAAA,GAAM;AACZ,EAAA,MAAM,IAAA,EAAM,mBAAA,CAAoB,QAAA,CAAS,CAAA;AACzC,EAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA;AACxD,EAAA,OAAO,EAAA,CAAG,GAAG,CAAA;AACd,CAAC,CAAA;AAEK,MAAM,aAAA,EAAe,CAA2B,EAAA,EAAA,GACtD,WAAA,CAAE,IAAA,CAAK,CAAA,EAAA,GAAM;AACZ,EAAA,MAAM,IAAA,EAAM,oBAAA,CAAqB,QAAA,CAAS,CAAA;AAC1C,EAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,+BAA+B,CAAA;AACzD,EAAA,OAAO,EAAA,CAAG,GAAG,CAAA;AACd,CAAC,CAAA;ACfF;AACE;AACA;AACA;AACA;AACA;AACA;AACF,2PAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/validations/valleyed.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { Pipe, PipeError, v } from 'valleyed'\n\nimport { Instance } from '../instance'\nimport type { IncomingFile, Response, Request, RouteDef, RouteDefToReqRes } from '../server'\n\nconst filePipe = (err?: string) =>\n\tv.array(\n\t\tv.file<IncomingFile>(err).pipe((input) => {\n\t\t\tconst err = `is larger than allowed limit of ${Instance.get().settings.server?.requests.maxFileUploadSizeInMb}mb`\n\t\t\tconst valid = input ? !input.isTruncated : true\n\t\t\tif (valid) return input\n\t\t\tthrow PipeError.root(err, input)\n\t\t}),\n\t)\n\nexport const incomingFile = (err?: string) =>\n\tv.define<unknown, IncomingFile>(\n\t\tv.compile(\n\t\t\tfilePipe(err)\n\t\t\t\t.pipe(v.min(1, 'no file provided'))\n\t\t\t\t.pipe((files) => files[0]),\n\t\t),\n\t\t{ schema: () => ({ type: 'string', format: 'binary' }) },\n\t)\n\nexport const incomingFiles = (err?: string) =>\n\tv.define<unknown, IncomingFile[]>(v.compile(filePipe(err)), {\n\t\tschema: () => ({ type: 'string', format: 'binary' }),\n\t})\n\nexport const requestLocalStorage = new AsyncLocalStorage<Request<RouteDefToReqRes<RouteDef>>>()\nexport const responseLocalStorage = new AsyncLocalStorage<Response<RouteDefToReqRes<RouteDef>>>()\n\nexport const withRequest = <T extends Pipe<any, any>>(fn: (req: Request<RouteDefToReqRes<RouteDef>>) => T) =>\n\tv.lazy(() => {\n\t\tconst req = requestLocalStorage.getStore()\n\t\tif (!req) throw new Error('Request not found in context')\n\t\treturn fn(req)\n\t})\n\nexport const withResponse = <T extends Pipe<any, any>>(fn: (req: Response<RouteDefToReqRes<RouteDef>>) => T) =>\n\tv.lazy(() => {\n\t\tconst res = responseLocalStorage.getStore()\n\t\tif (!res) throw new Error('Response not found in context')\n\t\treturn fn(res)\n\t})\n",null]}
1
+ {"version":3,"sources":["../../../src/validations/valleyed.ts","/home/runner/work/equipped/equipped/dist/cjs/validations/valleyed.cjs"],"names":["err"],"mappings":"AAAA,goBAAkC;AAElC,oCAA0D;AAE1D,iDAAyB;AAGzB,MAAM,SAAA,EAAW,CAAC,GAAA,EAAA,GACjB,WAAA,CAAE,KAAA;AAAA,EACD,WAAA,CAAE,IAAA,CAAmB,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAA,GAAU;AACzC,IAAA,MAAMA,KAAAA,EAAM,CAAA,gCAAA,kBAAmC,kBAAA,mBAAS,GAAA,mBAAI,CAAA,qBAAE,QAAA,qBAAS,MAAA,6BAAQ,QAAA,qBAAS,uBAAqB,CAAA,EAAA,CAAA;AAC7G,IAAA,MAAM,MAAA,EAAQ,MAAA,EAAQ,CAAC,KAAA,CAAM,YAAA,EAAc,IAAA;AAC3C,IAAA,GAAA,CAAI,KAAA,EAAO,OAAO,KAAA;AAClB,IAAA,MAAM,mBAAA,CAAU,IAAA,CAAKA,IAAAA,EAAK,KAAK,CAAA;AAAA,EAChC,CAAC;AACF,CAAA;AAEM,MAAM,aAAA,EAAe,CAAC,GAAA,EAAA,GAC5B,WAAA,CAAE,MAAA;AAAA,EACD,WAAA,CAAE,OAAA;AAAA,IACD,QAAA,CAAS,GAAG,CAAA,CACV,IAAA,CAAK,WAAA,CAAE,GAAA,CAAI,CAAA,EAAG,kBAAkB,CAAC,CAAA,CACjC,IAAA,CAAK,CAAC,KAAA,EAAA,GAAU,KAAA,CAAM,CAAC,CAAC;AAAA,EAC3B,CAAA;AAAA,EACA,EAAE,MAAA,EAAQ,CAAA,EAAA,GAAA,CAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAA,EAAG;AACxD,CAAA;AAEM,MAAM,cAAA,EAAgB,CAAC,GAAA,EAAA,GAC7B,WAAA,CAAE,MAAA,CAAgC,WAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG;AAAA,EAC3D,MAAA,EAAQ,CAAA,EAAA,GAAA,CAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAA;AACnD,CAAC,CAAA;AAEK,MAAM,oBAAA,EAAsB,IAAI,uCAAA,CAAuD,CAAA;AACvF,MAAM,qBAAA,EAAuB,IAAI,uCAAA,CAAwD,CAAA;AAEzF,MAAM,YAAA,EAAc,CAA2B,EAAA,EAAA,GACrD,WAAA,CAAE,MAAA,CAAoC,CAAC,KAAA,EAAA,GAAU;AAChD,EAAA,MAAM,IAAA,EAAM,mBAAA,CAAoB,QAAA,CAAS,CAAA;AACzC,EAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA;AACxD,EAAA,MAAM,UAAA,EAAY,WAAA,CAAE,QAAA,CAAS,EAAA,CAAG,GAAG,CAAA,EAAG,KAAK,CAAA;AAC3C,EAAA,OAAO,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,KAAA;AACtD,CAAC,CAAA;AAEK,MAAM,aAAA,EAAe,CAA2B,EAAA,EAAA,GACtD,WAAA,CAAE,MAAA,CAAoC,CAAC,KAAA,EAAA,GAAU;AAChD,EAAA,MAAM,IAAA,EAAM,oBAAA,CAAqB,QAAA,CAAS,CAAA;AAC1C,EAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,+BAA+B,CAAA;AACzD,EAAA,MAAM,UAAA,EAAY,WAAA,CAAE,QAAA,CAAS,EAAA,CAAG,GAAG,CAAA,EAAG,KAAK,CAAA;AAC3C,EAAA,OAAO,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,KAAA;AACtD,CAAC,CAAA;ACfF;AACE;AACA;AACA;AACA;AACA;AACA;AACF,2PAAC","file":"/home/runner/work/equipped/equipped/dist/cjs/validations/valleyed.cjs","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport { Pipe, PipeError, PipeInput, PipeOutput, v } from 'valleyed'\n\nimport { Instance } from '../instance'\nimport type { IncomingFile, Response, Request, RouteDef, RouteDefToReqRes } from '../server'\n\nconst filePipe = (err?: string) =>\n\tv.array(\n\t\tv.file<IncomingFile>(err).pipe((input) => {\n\t\t\tconst err = `is larger than allowed limit of ${Instance.get().settings.server?.requests.maxFileUploadSizeInMb}mb`\n\t\t\tconst valid = input ? !input.isTruncated : true\n\t\t\tif (valid) return input\n\t\t\tthrow PipeError.root(err, input)\n\t\t}),\n\t)\n\nexport const incomingFile = (err?: string) =>\n\tv.define<unknown, IncomingFile>(\n\t\tv.compile(\n\t\t\tfilePipe(err)\n\t\t\t\t.pipe(v.min(1, 'no file provided'))\n\t\t\t\t.pipe((files) => files[0]),\n\t\t),\n\t\t{ schema: () => ({ type: 'string', format: 'binary' }) },\n\t)\n\nexport const incomingFiles = (err?: string) =>\n\tv.define<unknown, IncomingFile[]>(v.compile(filePipe(err)), {\n\t\tschema: () => ({ type: 'string', format: 'binary' }),\n\t})\n\nexport const requestLocalStorage = new AsyncLocalStorage<Request<RouteDefToReqRes<RouteDef>>>()\nexport const responseLocalStorage = new AsyncLocalStorage<Response<RouteDefToReqRes<RouteDef>>>()\n\nexport const withRequest = <T extends Pipe<any, any>>(fn: (req: Request<RouteDefToReqRes<RouteDef>>) => T) =>\n\tv.define<PipeInput<T>, PipeOutput<T>>((input) => {\n\t\tconst req = requestLocalStorage.getStore()\n\t\tif (!req) throw new Error('Request not found in context')\n\t\tconst validated = v.validate(fn(req), input)\n\t\treturn validated.valid ? validated.value : validated.error\n\t})\n\nexport const withResponse = <T extends Pipe<any, any>>(fn: (req: Response<RouteDefToReqRes<RouteDef>>) => T) =>\n\tv.define<PipeInput<T>, PipeOutput<T>>((input) => {\n\t\tconst res = responseLocalStorage.getStore()\n\t\tif (!res) throw new Error('Response not found in context')\n\t\tconst validated = v.validate(fn(res), input)\n\t\treturn validated.valid ? validated.value : validated.error\n\t})\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 _nodeasync_hooks = require('node:async_hooks');var _valleyed = require('valleyed');var _indexmincjs = require('../instance/index.min.cjs');const r=o=>_valleyed.v.array(_valleyed.v.file(o).pipe(e=>{const i=`is larger than allowed limit of ${_optionalChain([_indexmincjs.Instance, 'access', _ => _.get, 'call', _2 => _2(), 'access', _3 => _3.settings, 'access', _4 => _4.server, 'optionalAccess', _5 => _5.requests, 'access', _6 => _6.maxFileUploadSizeInMb])}mb`;if(e?!e.isTruncated:!0)return e;throw _valleyed.PipeError.root(i,e)})),g= exports.incomingFile =o=>_valleyed.v.define(_valleyed.v.compile(r(o).pipe(_valleyed.v.min(1,"no file provided")).pipe(e=>e[0])),{schema:()=>({type:"string",format:"binary"})}),q= exports.incomingFiles =o=>_valleyed.v.define(_valleyed.v.compile(r(o)),{schema:()=>({type:"string",format:"binary"})}),R= exports.requestLocalStorage =new _nodeasync_hooks.AsyncLocalStorage,a= exports.responseLocalStorage =new _nodeasync_hooks.AsyncLocalStorage,d= exports.withRequest =o=>_valleyed.v.lazy(()=>{const e=R.getStore();if(!e)throw new Error("Request not found in context");return o(e)}),y= exports.withResponse =o=>_valleyed.v.lazy(()=>{const e=a.getStore();if(!e)throw new Error("Response not found in context");return o(e)});exports.incomingFile = g; exports.incomingFiles = q; exports.requestLocalStorage = R; exports.responseLocalStorage = a; exports.withRequest = d; exports.withResponse = y;
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 _nodeasync_hooks = require('node:async_hooks');var _valleyed = require('valleyed');var _indexmincjs = require('../instance/index.min.cjs');const s=o=>_valleyed.v.array(_valleyed.v.file(o).pipe(t=>{const r=`is larger than allowed limit of ${_optionalChain([_indexmincjs.Instance, 'access', _ => _.get, 'call', _2 => _2(), 'access', _3 => _3.settings, 'access', _4 => _4.server, 'optionalAccess', _5 => _5.requests, 'access', _6 => _6.maxFileUploadSizeInMb])}mb`;if(t?!t.isTruncated:!0)return t;throw _valleyed.PipeError.root(r,t)})),q= exports.incomingFile =o=>_valleyed.v.define(_valleyed.v.compile(s(o).pipe(_valleyed.v.min(1,"no file provided")).pipe(t=>t[0])),{schema:()=>({type:"string",format:"binary"})}),v= exports.incomingFiles =o=>_valleyed.v.define(_valleyed.v.compile(s(o)),{schema:()=>({type:"string",format:"binary"})}),u= exports.requestLocalStorage =new _nodeasync_hooks.AsyncLocalStorage,c= exports.responseLocalStorage =new _nodeasync_hooks.AsyncLocalStorage,T= exports.withRequest =o=>_valleyed.v.define(t=>{const r=u.getStore();if(!r)throw new Error("Request not found in context");const n=_valleyed.v.validate(o(r),t);return n.valid?n.value:n.error}),w= exports.withResponse =o=>_valleyed.v.define(t=>{const r=c.getStore();if(!r)throw new Error("Response not found in context");const n=_valleyed.v.validate(o(r),t);return n.valid?n.value:n.error});exports.incomingFile = q; exports.incomingFiles = v; exports.requestLocalStorage = u; exports.responseLocalStorage = c; exports.withRequest = T; exports.withResponse = w;
2
2
  //# sourceMappingURL=valleyed.min.cjs.map