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.
- package/CHANGELOG.md +15 -0
- package/dist/cjs/dbs/mongo/api.cjs +4 -6
- package/dist/cjs/dbs/mongo/api.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/api.min.cjs +1 -1
- package/dist/cjs/dbs/mongo/api.min.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/index.cjs +8 -8
- package/dist/cjs/dbs/mongo/index.cjs.map +1 -1
- package/dist/cjs/dbs/mongo/index.min.cjs +1 -1
- package/dist/cjs/dbs/mongo/index.min.cjs.map +1 -1
- package/dist/cjs/server/openapi.cjs +1 -1
- package/dist/cjs/server/openapi.cjs.map +1 -1
- package/dist/cjs/server/openapi.min.cjs +1 -1
- package/dist/cjs/server/openapi.min.cjs.map +1 -1
- package/dist/cjs/validations/valleyed.cjs +6 -4
- package/dist/cjs/validations/valleyed.cjs.map +1 -1
- package/dist/cjs/validations/valleyed.min.cjs +1 -1
- package/dist/cjs/validations/valleyed.min.cjs.map +1 -1
- package/dist/esm/dbs/mongo/api.min.mjs +1 -1
- package/dist/esm/dbs/mongo/api.min.mjs.map +1 -1
- package/dist/esm/dbs/mongo/api.mjs +4 -6
- package/dist/esm/dbs/mongo/api.mjs.map +1 -1
- package/dist/esm/dbs/mongo/index.min.mjs +1 -1
- package/dist/esm/dbs/mongo/index.min.mjs.map +1 -1
- package/dist/esm/dbs/mongo/index.mjs +8 -8
- package/dist/esm/dbs/mongo/index.mjs.map +1 -1
- package/dist/esm/server/openapi.min.mjs +1 -1
- package/dist/esm/server/openapi.min.mjs.map +1 -1
- package/dist/esm/server/openapi.mjs +1 -1
- package/dist/esm/server/openapi.mjs.map +1 -1
- package/dist/esm/validations/valleyed.min.mjs +1 -1
- package/dist/esm/validations/valleyed.min.mjs.map +1 -1
- package/dist/esm/validations/valleyed.mjs +6 -4
- package/dist/esm/validations/valleyed.mjs.map +1 -1
- package/dist/types/dbs/index.d.ts +2 -2
- package/dist/types/dbs/mongo/api.js +4 -6
- package/dist/types/dbs/mongo/index.js +8 -8
- package/dist/types/{index-5Qkb5V68.d.ts → index-BS53hVyq.d.ts} +1 -1
- package/dist/types/{index-CegB2bgP.d.ts → index-CfuXekZB.d.ts} +2 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/instance/index.d.ts +2 -2
- package/dist/types/server/index.d.ts +3 -3
- package/dist/types/server/openapi.js +1 -1
- package/dist/types/validations/index.d.ts +3 -4
- package/dist/types/validations/valleyed.js +6 -4
- 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
|
|
11
|
+
this.client = new (0, _mongodb.MongoClient)(mongoConfig.uri);
|
|
12
12
|
_indexcjs3.Instance.on(
|
|
13
13
|
"start",
|
|
14
14
|
async () => {
|
|
15
|
-
await this
|
|
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
|
|
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
|
|
40
|
+
_indexcjs3.Instance.on("close", async () => this.client.close(), 1);
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
#cols = [];
|
|
44
44
|
async session(callback) {
|
|
45
|
-
return this
|
|
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
|
|
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
|
|
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":"AAAA,+mBAAqE;AAErE,mCAAyB;AAEzB,2CAA8B;AAC9B,kDAA8B;AAC9B,qDAAyB;AACzB,qDAAmB;AAIZ,MAAM,QAAA,QAAgB,iBAAoB;AAAA,EAIhD,WAAA,CACS,WAAA,EACR,QAAA,EACC;AACD,IAAA,KAAA,CAAM,QAAQ,CAAA;AAHN,IAAA,IAAA,CAAA,YAAA,EAAA,WAAA;AAIR,IAAA,IAAA,CAAK,
|
|
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
|
|
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","
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|