@visulima/crud 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +46 -16
  3. package/dist/chunk-SH6A4KBC.mjs +28 -0
  4. package/dist/{chunk-UBXIGP5H.mjs.map → chunk-SH6A4KBC.mjs.map} +1 -1
  5. package/dist/chunk-ZY3WOLEP.js +28 -0
  6. package/dist/chunk-ZY3WOLEP.js.map +1 -0
  7. package/dist/index.d.ts +9 -15
  8. package/dist/index.js +57 -37
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +54 -34
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/next/index.js +10 -281
  13. package/dist/next/index.js.map +1 -1
  14. package/dist/next/index.mjs +9 -280
  15. package/dist/next/index.mjs.map +1 -1
  16. package/next/package.json +18 -0
  17. package/package.json +16 -14
  18. package/dist/chunk-FJWRITBO.js +0 -52
  19. package/dist/chunk-FJWRITBO.js.map +0 -1
  20. package/dist/chunk-UBXIGP5H.mjs +0 -52
  21. package/src/adapter/prisma/index.ts +0 -241
  22. package/src/adapter/prisma/types.d.ts +0 -46
  23. package/src/adapter/prisma/utils/models-to-route-names.ts +0 -12
  24. package/src/adapter/prisma/utils/parse-cursor.ts +0 -26
  25. package/src/adapter/prisma/utils/parse-order-by.ts +0 -21
  26. package/src/adapter/prisma/utils/parse-recursive.ts +0 -26
  27. package/src/adapter/prisma/utils/parse-where.ts +0 -197
  28. package/src/base-crud-handler.ts +0 -181
  29. package/src/handler/create.ts +0 -21
  30. package/src/handler/delete.ts +0 -27
  31. package/src/handler/list.ts +0 -62
  32. package/src/handler/read.ts +0 -27
  33. package/src/handler/update.ts +0 -29
  34. package/src/index.ts +0 -27
  35. package/src/next/api/edge/index.ts +0 -23
  36. package/src/next/api/node/index.ts +0 -27
  37. package/src/next/index.ts +0 -2
  38. package/src/query-parser.ts +0 -94
  39. package/src/swagger/adapter/prisma/index.ts +0 -95
  40. package/src/swagger/json-schema-parser.ts +0 -456
  41. package/src/swagger/parameters.ts +0 -83
  42. package/src/swagger/types.d.ts +0 -53
  43. package/src/swagger/utils/format-example-ref.ts +0 -4
  44. package/src/swagger/utils/format-schema-ref.ts +0 -4
  45. package/src/swagger/utils/get-models-accessible-routes.ts +0 -23
  46. package/src/swagger/utils/get-swagger-paths.ts +0 -244
  47. package/src/swagger/utils/get-swagger-tags.ts +0 -13
  48. package/src/types.d.ts +0 -124
  49. package/src/utils/format-resource-id.ts +0 -3
  50. package/src/utils/get-accessible-routes.ts +0 -18
  51. package/src/utils/get-resource-name-from-url.ts +0 -23
  52. package/src/utils/get-route-type.ts +0 -99
  53. package/src/utils/is-primitive.ts +0 -5
  54. package/src/utils/validate-adapter-methods.ts +0 -15
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter/prisma/index.ts","../src/adapter/prisma/utils/models-to-route-names.ts","../src/utils/is-primitive.ts","../src/adapter/prisma/utils/parse-cursor.ts","../src/adapter/prisma/utils/parse-order-by.ts","../src/adapter/prisma/utils/parse-recursive.ts","../src/adapter/prisma/utils/parse-where.ts","../src/swagger/json-schema-parser.ts","../src/swagger/utils/format-schema-ref.ts","../src/swagger/utils/get-models-accessible-routes.ts","../src/swagger/parameters.ts","../src/swagger/utils/format-example-ref.ts","../src/swagger/utils/get-swagger-paths.ts","../src/swagger/utils/get-swagger-tags.ts","../src/swagger/adapter/prisma/index.ts"],"names":["operatorsAssociation"],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n // @ts-ignore\n PrismaAction,\n // @ts-ignore\n PrismaClient,\n} from \"@prisma/client\";\nimport createHttpError from \"http-errors\";\n\nimport type { Adapter, PaginationData, ParsedQueryParameters } from \"../../types.d\";\nimport type { PrismaParsedQueryParameters } from \"./types.d\";\nimport modelsToRouteNames from \"./utils/models-to-route-names\";\nimport parsePrismaCursor from \"./utils/parse-cursor\";\nimport parsePrismaOrderBy from \"./utils/parse-order-by\";\nimport parsePrismaRecursiveField from \"./utils/parse-recursive\";\nimport parsePrismaWhere from \"./utils/parse-where\";\n\ninterface AdapterCtorArguments<M extends string = string> {\n primaryKey?: string;\n manyRelations?: {\n [key in M]?: string[];\n };\n prismaClient: PrismaClient;\n models?: M[];\n}\n\nexport default class PrismaAdapter<T, M extends string> implements Adapter<T, PrismaParsedQueryParameters, M> {\n private readonly primaryKey: string;\n\n private readonly manyRelations: {\n [key in M]?: string[];\n };\n\n private readonly prismaClient: PrismaClient;\n\n models?: M[];\n\n private readonly ctorModels?: M[];\n\n private dmmf: any;\n\n constructor({\n primaryKey = \"id\", prismaClient, manyRelations = {}, models,\n }: AdapterCtorArguments<M>) {\n this.prismaClient = prismaClient;\n this.primaryKey = primaryKey;\n this.manyRelations = manyRelations;\n this.ctorModels = models;\n }\n\n private getPrismaClientModels = async () => {\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._dmmf) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = this.prismaClient._dmmf;\n\n return this.dmmf?.mappingsMap;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._getDmmf) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = await this.prismaClient._getDmmf();\n\n return this.dmmf.mappingsMap;\n }\n\n throw new Error(\"Couldn't get prisma client models\");\n };\n\n async init() {\n const models = this.ctorModels;\n const prismaDmmfModels = await this.getPrismaClientModels();\n\n if (typeof models !== \"undefined\") {\n models.forEach((model) => {\n if (!Object.keys(prismaDmmfModels).includes(model)) {\n throw new Error(`Model name ${model} is invalid.`);\n }\n });\n }\n\n // @ts-ignore\n this.models = models ?? (Object.keys(prismaDmmfModels) as M[]); // Retrieve model names from dmmf for prisma v2\n }\n\n async getPaginationData(resourceName: M, query: PrismaParsedQueryParameters): Promise<PaginationData> {\n // @ts-ignore\n const total: number = await this.getPrismaDelegate(resourceName).count({\n where: query.where,\n distinct: query.distinct,\n });\n\n return {\n total,\n pageCount: Math.ceil(total / (query.take as number)),\n page: Math.ceil((query.skip as number) / (query.take as number)) + 1,\n };\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleError(error: any) {\n // eslint-disable-next-line no-console\n console.error(error);\n\n if (error instanceof Error && error.stack) {\n // eslint-disable-next-line no-console\n console.error(error.stack);\n }\n\n throw error.constructor.name === \"PrismaClientKnownRequestError\" || error.constructor.name === \"PrismaClientValidationError\"\n ? createHttpError(400, \"invalid request, check your server logs for more info\")\n : createHttpError(500, \"an unknown error occured, check your server logs for more info\");\n }\n\n parseQuery(resourceName: M, query: ParsedQueryParameters) {\n const parsed: PrismaParsedQueryParameters = {};\n\n if (query.select) {\n parsed.select = parsePrismaRecursiveField(query.select, \"select\");\n }\n\n if (query.include) {\n parsed.include = parsePrismaRecursiveField(query.include, \"include\");\n }\n\n if (query.originalQuery?.where) {\n parsed.where = parsePrismaWhere(JSON.parse(query.originalQuery.where), this.manyRelations[resourceName] ?? []);\n }\n\n if (query.orderBy) {\n parsed.orderBy = parsePrismaOrderBy(query.orderBy);\n }\n\n if (typeof query.limit !== \"undefined\") {\n parsed.take = query.limit;\n }\n\n if (typeof query.skip !== \"undefined\") {\n parsed.skip = query.skip;\n }\n\n if (query.originalQuery?.cursor) {\n parsed.cursor = parsePrismaCursor(JSON.parse(query.originalQuery.cursor));\n }\n\n if (query.distinct) {\n parsed.distinct = query.distinct;\n }\n\n return parsed;\n }\n\n async getAll(resourceName: M, query: PrismaParsedQueryParameters): Promise<T[]> {\n // @ts-ignore\n return (await this.getPrismaDelegate(resourceName).findMany({\n select: query.select,\n include: query.include,\n where: query.where,\n orderBy: query.orderBy,\n cursor: query.cursor,\n take: query.take,\n skip: query.skip,\n distinct: query.distinct,\n })) as T[];\n }\n\n async getOne(resourceName: M, resourceId: string | number, query: PrismaParsedQueryParameters): Promise<T> {\n const delegate = this.getPrismaDelegate(resourceName);\n /**\n * On prisma v2.12, findOne has been deprecated in favor of findUnique\n * We use findUnique in priority only if it's available\n */\n const findFunction = delegate.findUnique || delegate.findOne;\n\n // @ts-ignore\n return findFunction({\n where: {\n [this.primaryKey]: resourceId,\n },\n select: query.select,\n include: query.include,\n });\n }\n\n async create(resourceName: M, data: any, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-ignore\n return this.getPrismaDelegate(resourceName).create({\n data,\n select: query.select,\n include: query.include,\n });\n }\n\n async update(resourceName: M, resourceId: string | number, data: any, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-ignore\n return this.getPrismaDelegate(resourceName).update({\n where: {\n [this.primaryKey]: resourceId,\n },\n data,\n select: query.select,\n include: query.include,\n });\n }\n\n async delete(resourceName: M, resourceId: string | number, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-ignore\n return this.getPrismaDelegate(resourceName).delete({\n where: {\n [this.primaryKey]: resourceId,\n },\n select: query.select,\n include: query.include,\n });\n }\n\n connect() {\n return this.prismaClient.$connect();\n }\n\n disconnect() {\n return this.prismaClient.$disconnect();\n }\n\n get client() {\n return this.prismaClient;\n }\n\n getModels() {\n return this.models || [];\n }\n\n private getPrismaDelegate(resourceName: M): Record<PrismaAction, (...arguments_: any[]) => Promise<T>> {\n return this.prismaClient[`${resourceName.charAt(0).toLowerCase()}${resourceName.slice(1)}`];\n }\n\n public async mapModelsToRouteNames() {\n return modelsToRouteNames(await this.getPrismaClientModels(), this.getModels());\n }\n}\n","const modelsToRouteNames = <M extends string = string>(mappingsMap: { [key: string]: object }, models: M[]) => {\n const routesMap: { [key in M]?: string } = {};\n\n models?.forEach((model) => {\n // @ts-ignore\n routesMap[model] = mappingsMap[model].plural;\n });\n\n return routesMap;\n};\n\nexport default modelsToRouteNames;\n","const primitiveTypes = new Set([\"string\", \"boolean\", \"number\"]);\n\nconst isPrimitive = (value: any): boolean => primitiveTypes.has(typeof value);\n\nexport default isPrimitive;\n","import isPrimitive from \"../../../utils/is-primitive\";\nimport type { PrismaCursor } from \"../types.d\";\n\nconst parsePrismaCursor = (\n cursor: Record<string, string | number | boolean>,\n): PrismaCursor => {\n const parsed: PrismaCursor = {};\n\n Object.keys(cursor).forEach((key) => {\n const value = cursor[key];\n\n if (isPrimitive(value)) {\n parsed[key as keyof typeof cursor] = value as string | number | boolean;\n }\n });\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\n \"cursor needs to be an object with exactly 1 property with a primitive value\",\n );\n }\n\n return parsed;\n};\n\nexport default parsePrismaCursor;\n","import type { OrderByField, OrderByOperator } from \"../../../types.d\";\nimport type { PrismaOrderBy, PrismaOrderByOperator } from \"../types.d\";\n\nconst operatorsAssociation: Record<OrderByOperator, PrismaOrderByOperator> = {\n $asc: \"asc\",\n $desc: \"desc\",\n};\n\nconst parsePrismaOrderBy = (orderBy: OrderByField): PrismaOrderBy => {\n const parsed: PrismaOrderBy = {};\n\n Object.keys(orderBy).forEach((key) => {\n const value = orderBy[key];\n\n parsed[key] = operatorsAssociation[value as OrderByOperator];\n });\n\n return parsed;\n};\n\nexport default parsePrismaOrderBy;\n","import type { RecursiveField } from \"../../../types.d\";\nimport type { PrismaRecursive, PrismaRecursiveField } from \"../types.d\";\n\nconst parsePrismaRecursiveField = <T extends PrismaRecursiveField>(\n select: RecursiveField,\n fieldName: T,\n): PrismaRecursive<T> => {\n const parsed: PrismaRecursive<T> = {};\n\n Object.keys(select).forEach((field) => {\n if (select[field] !== true) {\n parsed[field] = {\n [fieldName]: parsePrismaRecursiveField(\n select[field] as RecursiveField,\n fieldName,\n ),\n } as Record<T, PrismaRecursive<T>>;\n } else {\n parsed[field] = true;\n }\n });\n\n return parsed;\n};\n\nexport default parsePrismaRecursiveField;\n","import type {\n Condition, SearchCondition, WhereCondition, WhereField, WhereOperator,\n} from \"../../../types.d\";\nimport isPrimitive from \"../../../utils/is-primitive\";\nimport type {\n PrismaFieldFilter, PrismaRelationFilter, PrismaWhereField, PrismaWhereOperator,\n} from \"../types.d\";\n\nconst isObject = (a: any) => a instanceof Object;\n\nconst operatorsAssociation: {\n [key in WhereOperator]?: PrismaWhereOperator;\n} = {\n $eq: \"equals\",\n $neq: \"not\",\n $cont: \"contains\",\n $ends: \"endsWith\",\n $gt: \"gt\",\n $gte: \"gte\",\n $in: \"in\",\n $lt: \"lt\",\n $lte: \"lte\",\n $notin: \"notIn\",\n $starts: \"startsWith\",\n};\n\nconst isDateString = (value: string) => /^\\d{4}-[01]\\d-[0-3]\\d(?:T[0-2](?:\\d:[0-5]){2}\\d(?:\\.\\d+)?(?:Z|[+-][0-2]\\d(?::?[0-5]\\d)?)?)?$/g.test(value);\n\nconst getSearchValue = (originalValue: any): SearchCondition => {\n if (isDateString(originalValue)) {\n return new Date(originalValue);\n }\n\n if (typeof originalValue === \"string\" && originalValue === \"$isnull\") {\n return null;\n }\n\n return originalValue;\n};\n\nconst isRelation = (key: string, manyRelations: string[]): boolean => {\n // Get the key containing . and remove the property name\n const splitKey = key.split(\".\");\n splitKey.splice(-1, 1);\n\n return manyRelations.includes(splitKey.join(\".\"));\n};\n\nconst parseSimpleField = (value: Condition): undefined | { [key: string]: Condition } => {\n const operator = Object.keys(value)[0];\n const prismaOperator: undefined | PrismaWhereOperator = operatorsAssociation[operator as keyof typeof operatorsAssociation];\n\n if (prismaOperator) {\n return {\n [prismaOperator]: value[operator as string],\n };\n }\n\n return undefined;\n};\n\nconst parseRelation = (\n value: string | number | boolean | Date | Condition | WhereCondition,\n key: string,\n parsed: PrismaWhereField,\n manyRelations: string[],\n) => {\n // Reverse the keys so that we can format our object by nesting\n const fields = key.split(\".\").reverse();\n\n let formatFields: { [key: string]: any } = {};\n\n fields.forEach((field, index) => {\n // If we iterate over the property name, which is index 0, we parse it like a normal field\n if (index === 0) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n basicParse(value, field, formatFields, manyRelations);\n // Else we format the relation filter in the prisma way\n } else {\n formatFields = {\n [field]: {\n some: formatFields,\n },\n };\n }\n });\n\n // Retrieve the main relation field\n const initialFieldKey = fields.reverse()[0] as string;\n // Retrieve the old parsed version\n const oldParsed = parsed[initialFieldKey] as PrismaRelationFilter;\n\n // Format correctly in the prisma way\n // eslint-disable-next-line no-param-reassign\n parsed[initialFieldKey] = {\n some: {\n ...(oldParsed?.some as object),\n ...(formatFields[initialFieldKey as string]?.some as object),\n },\n };\n};\n\nconst parseObjectCombination = (object: Condition, manyRelations: string[]): PrismaFieldFilter => {\n const parsed: PrismaFieldFilter = {};\n\n Object.keys(object).forEach((key) => {\n const value = object[key];\n\n if (isRelation(key, manyRelations)) {\n parseRelation(value, key, parsed, manyRelations);\n } else if (isPrimitive(value)) {\n parsed[key] = value as SearchCondition;\n } else if (isObject(value)) {\n const fieldResult = parseSimpleField(value as Condition);\n\n if (fieldResult) {\n parsed[key] = fieldResult;\n }\n }\n });\n\n return parsed;\n};\n\nconst basicParse = (value: string | number | boolean | Condition | Date | WhereCondition, key: string, parsed: PrismaWhereField, manyRelations: string[]) => {\n if (isPrimitive(value)) {\n // eslint-disable-next-line no-param-reassign\n parsed[key] = getSearchValue(value);\n } else {\n switch (key) {\n case \"$or\": {\n if (isObject(value)) {\n // eslint-disable-next-line no-param-reassign\n parsed.OR = parseObjectCombination(value as Condition, manyRelations);\n }\n break;\n }\n case \"$and\": {\n if (isObject(value)) {\n // eslint-disable-next-line no-param-reassign\n parsed.AND = parseObjectCombination(value as Condition, manyRelations);\n }\n break;\n }\n case \"$not\": {\n if (isObject(value)) {\n // eslint-disable-next-line no-param-reassign\n parsed.NOT = parseObjectCombination(value as Condition, manyRelations);\n }\n break;\n }\n default: {\n // eslint-disable-next-line no-param-reassign\n parsed[key] = parseSimpleField(value as Condition);\n break;\n }\n }\n }\n};\n\nconst parsePrismaWhere = (where: WhereField, manyRelations: string[]): PrismaWhereField => {\n const parsed: PrismaWhereField = {};\n\n Object.keys(where).forEach((key) => {\n const value = where[key];\n /**\n * If the key without property name is a relation\n *\n * We want the following example input:\n *\n * posts.author.id: 1\n *\n * to output\n *\n * {\n * posts: {\n * some: {\n * author: {\n * some: {\n * id: 1\n * }\n * }\n * }\n * }\n * }\n */\n if (isRelation(key, manyRelations)) {\n parseRelation(value, key, parsed, manyRelations);\n } else {\n basicParse(value, key, parsed, manyRelations);\n }\n });\n\n return parsed;\n};\n\nexport default parsePrismaWhere;\n","import { getJSONSchemaProperty, transformDMMF } from \"@visulima/prisma-dmmf-transformer\";\nimport type { JSONSchema7 } from \"json-schema\";\nimport type { OpenAPIV3 } from \"openapi-types\";\n\nimport formatSchemaReference from \"./utils/format-schema-ref\";\n\nconst getJSONSchemaScalar = (fieldType: string | object) => {\n switch (fieldType) {\n case \"Int\":\n case \"BigInt\": {\n return \"integer\";\n }\n case \"DateTime\":\n case \"Bytes\":\n case \"String\": {\n return \"string\";\n }\n case \"Float\":\n case \"Decimal\": {\n return \"number\";\n }\n case \"Json\": {\n return \"object\";\n }\n case \"Boolean\": {\n return \"boolean\";\n }\n case \"Null\": {\n return \"null\";\n }\n default: {\n return \"\";\n }\n }\n};\n\nconst PAGINATION_SCHEMA_NAME = \"PaginationData\";\n\nconst methodsNames = [\n { methodStart: \"createOne\", schemaNameStart: \"Create\" },\n { methodStart: \"updateOne\", schemaNameStart: \"Update\" },\n];\n\nclass PrismaJsonSchemaParser {\n schemaInputTypes: Map<string, any> = new Map<string, any>();\n\n constructor(private dmmf: any) {}\n\n public parseModels(): {\n [key: string]: JSONSchema7;\n } {\n const modelsDefinitions = transformDMMF(this.dmmf).definitions as {\n [key: string]: JSONSchema7;\n };\n\n Object.keys(modelsDefinitions || {})?.forEach((definition: string | number) => {\n // @TODO: added the correct type\n // @ts-ignore\n const { properties } = modelsDefinitions[definition];\n\n Object.keys(properties).forEach((property: string) => {\n if (Array.isArray(properties[property].type) && properties[property].type.includes(\"null\")) {\n properties[property].type = properties[property].type.filter((type: string) => type !== \"null\");\n\n if (properties[property].type.length === 1) {\n // eslint-disable-next-line prefer-destructuring\n properties[property].type = properties[property].type[0];\n }\n\n properties[property].nullable = true;\n }\n });\n });\n\n return modelsDefinitions;\n }\n\n // eslint-disable-next-line radar/cognitive-complexity\n public parseInputTypes(models: string[]) {\n // eslint-disable-next-line radar/cognitive-complexity\n const definitions = models.reduce((accumulator: { [key: string]: any }, modelName) => {\n const methods = methodsNames.map((method) => {\n return {\n name: `${method.methodStart}${modelName}`,\n schemaName: `${method.schemaNameStart}${modelName}`,\n };\n });\n\n methods.forEach(({ name: method, schemaName }) => {\n // @ts-ignore\n const dataFields = this.dmmf.mutationType.fieldMap[method].args[0].inputTypes[0].type.fields;\n const requiredProperties: string[] = [];\n const properties = dataFields.reduce((propertiesAccumulator: any, field: any) => {\n if (field.inputTypes[0].kind === \"scalar\") {\n const schema = getJSONSchemaProperty(\n this.dmmf.datamodel,\n {},\n )({\n name: field.name,\n ...field.inputTypes[0],\n });\n\n // @TODO: added the correct type\n // @ts-ignore\n const { type: schemaType } = schema[1];\n\n if (schemaType && Array.isArray(schemaType)) {\n if (schemaType.includes(\"null\")) {\n // eslint-disable-next-line no-param-reassign\n propertiesAccumulator[field.name] = {\n ...schemaType,\n type: schemaType.filter((type: string) => type !== \"null\"),\n nullable: true,\n };\n if (propertiesAccumulator[field.name].type.length === 1) {\n // eslint-disable-next-line no-param-reassign\n propertiesAccumulator[field.name] = {\n ...propertiesAccumulator[field.name],\n type: propertiesAccumulator[field.name].type[0],\n };\n }\n }\n } else {\n // eslint-disable-next-line no-param-reassign,prefer-destructuring\n propertiesAccumulator[field.name] = schema[1];\n }\n } else {\n const typeName = this.parseObjectInputType(field.inputTypes[0]);\n\n // eslint-disable-next-line no-param-reassign\n propertiesAccumulator[field.name] = {\n ...typeName,\n nullable: field.isNullable,\n };\n }\n\n if (field.isRequired) {\n requiredProperties.push(field.name);\n }\n\n return propertiesAccumulator;\n }, {});\n\n accumulator[schemaName] = {\n type: \"object\",\n xml: {\n name: schemaName,\n },\n properties,\n };\n\n if (requiredProperties.length > 0) {\n accumulator[schemaName].required = requiredProperties;\n }\n });\n\n return accumulator;\n }, {});\n\n this.schemaInputTypes.forEach((value, key) => {\n definitions[key] = {\n type: \"object\",\n xml: {\n name: key,\n },\n properties: value,\n };\n });\n\n return definitions;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public formatInputTypeData(inputType: any) {\n if (inputType.kind === \"object\") {\n const reference = formatSchemaReference(inputType.type.name);\n\n if (inputType.isList) {\n return {\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n items: {\n $ref: reference,\n },\n };\n }\n\n return { $ref: reference };\n }\n\n const type = getJSONSchemaScalar(inputType.type);\n\n if (inputType.isList) {\n return {\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n items: {\n type,\n },\n };\n }\n\n return { type };\n }\n\n // eslint-disable-next-line radar/cognitive-complexity\n public parseObjectInputType(fieldType: any) {\n if (fieldType.kind === \"object\") {\n if (!this.schemaInputTypes.has(fieldType.type.name)) {\n this.schemaInputTypes.set(fieldType.type.name, {});\n\n fieldType.type.fields.forEach((field: any) => {\n let fieldData: Record<string, any> = {};\n\n if (field.inputTypes.length > 1) {\n let nullable = false;\n\n const anyOf = field.inputTypes\n .map((inputType: any) => {\n const inputTypeData = this.formatInputTypeData(inputType);\n\n if (inputTypeData.type === \"null\") {\n nullable = true;\n\n return;\n }\n\n // eslint-disable-next-line consistent-return\n return inputTypeData;\n })\n .filter(Boolean);\n\n if (anyOf.length === 1) {\n // eslint-disable-next-line prefer-destructuring\n fieldData = anyOf[0];\n } else {\n fieldData.anyOf = anyOf;\n }\n\n if (nullable) {\n fieldData.nullable = true;\n }\n } else {\n const inputType = field.inputTypes[0];\n\n fieldData = this.formatInputTypeData(inputType);\n }\n\n this.schemaInputTypes.set(fieldType.type.name, {\n ...this.schemaInputTypes.get(fieldType.type.name),\n [field.name]: fieldData,\n });\n\n field.inputTypes.forEach((inputType: any) => {\n if (inputType.kind === \"object\") {\n this.parseObjectInputType(inputType);\n }\n });\n });\n }\n\n return { $ref: formatSchemaReference(fieldType.type.name) };\n }\n\n return { type: getJSONSchemaScalar(fieldType.type) };\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginationDataSchema() {\n return {\n [PAGINATION_SCHEMA_NAME]: {\n type: \"object\",\n xml: {\n name: PAGINATION_SCHEMA_NAME,\n },\n properties: {\n total: {\n type: \"integer\",\n minimum: 0,\n description: \"Holds the value for the total number of rows in the database\",\n },\n perPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the limit passed to the paginate method\",\n },\n page: {\n type: \"integer\",\n minimum: 1,\n description: \"Current page number\",\n },\n lastPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the last page by taking the total of rows into account\",\n },\n firstPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the number for the first page. It is always 1\",\n },\n firstPageUrl: {\n type: \"string\",\n description: \"The URL for the first page\",\n },\n lastPageUrl: {\n type: \"string\",\n description: \"The URL for the last page\",\n },\n nextPageUrl: {\n type: \"string\",\n description: \"The URL for the next page\",\n },\n previousPageUrl: {\n type: \"string\",\n description: \"The URL for the previous page\",\n },\n },\n },\n };\n }\n\n public getExampleModelsSchemas(\n modelNames: string[],\n schemas: {\n [key: string]: OpenAPIV3.SchemaObject;\n },\n ) {\n const referenceToSchema = (reference: string) => {\n const name = reference.replace(\"#/components/schemas/\", \"\");\n const model = schemas[name] as OpenAPIV3.SchemaObject;\n\n const values: { [key: string]: string | object[] } = {};\n\n Object.entries((model?.properties as OpenAPIV3.SchemaObject) || {}).forEach(([key, v]) => {\n const type = (v as OpenAPIV3.SchemaObject).type as string;\n\n if (type === \"array\") {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n values[key] = [arrayItemsToSchema(v.items)];\n } else {\n values[key] = type;\n }\n });\n\n return values;\n };\n\n const objectPropertiesToSchema = (objectProperties: { [name: string]: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject }) => {\n const values: { [key: string]: string | object | object[] } = {};\n\n Object.entries(objectProperties).forEach(([key, value]) => {\n if (typeof (value as OpenAPIV3.ReferenceObject).$ref !== \"undefined\") {\n values[key] = referenceToSchema((value as OpenAPIV3.ReferenceObject).$ref);\n } else {\n values[key] = (value as OpenAPIV3.SchemaObject).type as string;\n }\n });\n\n return values;\n };\n\n const arrayItemsToSchema = (items: OpenAPIV3.ArraySchemaObject) => {\n const values: { [key: string]: object | object[] } = {};\n\n Object.entries(items).forEach(([key, value]) => {\n if (typeof value.items.$ref !== \"undefined\") {\n values[key] = [referenceToSchema(value.items.$ref)];\n } else if (value.type === \"array\") {\n values[key] = [arrayItemsToSchema(value.items)];\n } else if (value.type === \"object\") {\n values[key] = objectPropertiesToSchema(value.properties);\n } else {\n values[key] = value.type;\n }\n });\n\n return values;\n };\n\n return modelNames.reduce((accumulator, modelName) => {\n const value: { [key: string]: string | object | object[] } = {};\n const model = schemas[modelName] as OpenAPIV3.SchemaObject;\n\n Object.entries(model.properties as OpenAPIV3.SchemaObject).forEach(([key, v]) => {\n const type = (v as OpenAPIV3.SchemaObject).type as string;\n\n if (type === \"array\") {\n value[key] = [referenceToSchema(v.items.$ref)];\n } else if (type === \"object\") {\n value[key] = objectPropertiesToSchema(v.properties);\n } else {\n value[key] = type;\n }\n });\n\n const pagination = this.getPaginationDataSchema()[PAGINATION_SCHEMA_NAME];\n const meta: { [key: string]: string } = {};\n\n Object.entries(pagination.properties as OpenAPIV3.SchemaObject).forEach(([key, v]) => {\n meta[key] = (v as OpenAPIV3.SchemaObject).type as string;\n });\n\n return {\n ...accumulator,\n [`${modelName}`]: {\n value,\n },\n [`${modelName}Page`]: {\n value: {\n data: [value],\n meta,\n },\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginatedModelsSchemas(modelNames: string[]) {\n return modelNames.reduce((accumulator, modelName) => {\n return {\n ...accumulator,\n [`${modelName}Page`]: {\n type: \"object\",\n xml: {\n name: `${modelName}Page`,\n },\n properties: {\n data: {\n type: \"array\",\n xml: {\n name: \"Data\",\n wrapped: true,\n },\n items: {\n $ref: formatSchemaReference(modelName),\n },\n },\n meta: {\n $ref: formatSchemaReference(PAGINATION_SCHEMA_NAME),\n },\n },\n },\n };\n }, {});\n }\n}\n\nexport default PrismaJsonSchemaParser;\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatSchemaReference = (schemaName: string) => `#/components/schemas/${schemaName}`;\n\nexport default formatSchemaReference;\n","import type { ModelOption, ModelsOptions } from \"../../types.d\";\nimport getAccessibleRoutes from \"../../utils/get-accessible-routes\";\nimport type { Routes } from \"../types.d\";\n\nconst getModelsAccessibleRoutes = <M extends string>(\n modelNames: M[],\n models?: ModelsOptions<M>,\n defaultExposeStrategy: \"all\" | \"none\" = \"all\",\n): Routes<M> => modelNames.reduce((accumulator, modelName) => {\n if (models?.[modelName]) {\n return {\n ...accumulator,\n [modelName]: getAccessibleRoutes((models[modelName] as ModelOption).only, (models[modelName] as ModelOption).exclude, defaultExposeStrategy),\n };\n }\n\n return {\n ...accumulator,\n [modelName]: getAccessibleRoutes(undefined, undefined, defaultExposeStrategy),\n };\n }, {});\n\nexport default getModelsAccessibleRoutes;\n","import { RouteType } from \"../types.d\";\nimport type { SwaggerParameter } from \"./types.d\";\n\nconst queryParameters: Record<string, SwaggerParameter> = {\n select: {\n name: \"select\",\n description: \"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts\",\n schema: {\n type: \"string\",\n },\n },\n include: {\n name: \"include\",\n description: \"Include relations, same as select\",\n schema: {\n type: \"string\",\n },\n },\n where: {\n name: \"where\",\n description: 'Fields to filter. See <a href=\"https://next-crud.js.org/query-params#where\">the docs</a>',\n schema: {\n type: \"string\",\n },\n },\n orderBy: {\n name: \"orderBy\",\n description: 'Field on which to order by a direction. See <a href=\"https://next-crud.js.org/query-params#orderBy\">the docs</a>',\n schema: {\n type: \"string\",\n },\n },\n limit: {\n name: \"limit\",\n description: \"Maximum number of elements to retrieve\",\n schema: {\n type: \"integer\",\n minimum: 0,\n },\n },\n skip: {\n name: \"skip\",\n description: \"Number of rows to skip\",\n schema: {\n type: \"integer\",\n minimum: 0,\n },\n },\n distinct: {\n name: \"distinct\",\n description: \"Fields to distinctively retrieve\",\n schema: {\n type: \"string\",\n },\n },\n page: {\n name: \"page\",\n description: \"Page number. Use only for pagination.\",\n schema: {\n type: \"integer\",\n minimum: 1,\n },\n },\n};\n\nexport const commonQueryParameters = [queryParameters.select, queryParameters.include];\nexport const listQueryParameters = [\n ...commonQueryParameters,\n queryParameters.limit,\n queryParameters.skip,\n queryParameters.where,\n queryParameters.orderBy,\n queryParameters.page,\n queryParameters.distinct,\n];\n\nexport const getQueryParameters = (routeType: RouteType, additionalQueryParameters: SwaggerParameter[] = []) => {\n if (routeType === RouteType.READ_ALL) {\n return [...listQueryParameters, ...additionalQueryParameters];\n }\n\n return [...commonQueryParameters, ...additionalQueryParameters];\n};\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatExampleReference = (schemaName: string) => `#/components/examples/${schemaName}`;\n\nexport default formatExampleReference;\n","import type { ModelOption, ModelsOptions } from \"../../types.d\";\nimport { RouteType } from \"../../types.d\";\nimport { getQueryParameters } from \"../parameters\";\nimport type { Routes, SwaggerModelsConfig } from \"../types.d\";\nimport formatExampleReference from \"./format-example-ref\";\nimport formatSchemaReference from \"./format-schema-ref\";\n\ninterface GenerateSwaggerPathObjectParameters<M extends string> {\n tag: string;\n routeTypes: RouteType[];\n modelsConfig?: SwaggerModelsConfig<M>;\n modelName: M;\n hasId?: boolean;\n}\n\ntype HttpMethod = \"get\" | \"post\" | \"put\" | \"delete\";\n\nconst generateContentForSchema = (schemaName: string, isArray?: boolean) => {\n if (isArray) {\n return {\n type: \"array\",\n items: {\n $ref: formatSchemaReference(schemaName),\n },\n };\n }\n\n return {\n $ref: formatSchemaReference(schemaName),\n };\n};\n\nconst generateSwaggerResponse = (routeType: RouteType, modelName: string): { statusCode: number; content: any } | undefined => {\n if (routeType === RouteType.CREATE) {\n return {\n statusCode: 201,\n content: {\n description: `${modelName} created`,\n content: {\n \"application/json\": {\n schema: generateContentForSchema(modelName),\n },\n },\n },\n };\n }\n\n if (routeType === RouteType.DELETE) {\n return {\n statusCode: 200,\n content: {\n description: `${modelName} item deleted`,\n content: {\n \"application/json\": {\n schema: generateContentForSchema(modelName),\n },\n },\n },\n };\n }\n\n if (routeType === RouteType.READ_ALL) {\n return {\n statusCode: 200,\n content: {\n description: `${modelName} list retrieved`,\n content: {\n \"application/json\": {\n schema: {\n oneOf: [generateContentForSchema(modelName, true), generateContentForSchema(`${modelName}Page`, false)],\n },\n examples: {\n Default: {\n $ref: formatExampleReference(`${modelName}`),\n },\n Pagination: {\n $ref: formatExampleReference(`${modelName}Page`),\n },\n },\n },\n },\n },\n };\n }\n\n if (routeType === RouteType.READ_ONE) {\n return {\n statusCode: 200,\n content: {\n description: `${modelName} item retrieved`,\n content: {\n \"application/json\": {\n schema: generateContentForSchema(modelName),\n },\n },\n },\n };\n }\n\n if (routeType === RouteType.UPDATE) {\n return {\n statusCode: 200,\n content: {\n description: `${modelName} item updated`,\n content: {\n \"application/json\": {\n schema: generateContentForSchema(modelName),\n },\n },\n },\n };\n }\n\n return undefined;\n};\n\nconst generateRequestBody = (schemaStartName: string, modelName: string) => {\n return {\n content: {\n \"application/json\": {\n schema: {\n $ref: formatSchemaReference(`${schemaStartName}${modelName}`),\n },\n },\n },\n };\n};\n\nconst getRouteTypeMethod = (routeType: RouteType): HttpMethod => {\n switch (routeType) {\n case RouteType.CREATE: {\n return \"post\";\n }\n case RouteType.READ_ALL:\n case RouteType.READ_ONE: {\n return \"get\";\n }\n case RouteType.UPDATE: {\n return \"put\";\n }\n case RouteType.DELETE: {\n return \"delete\";\n }\n default: {\n throw new TypeError(`Method for route type ${routeType} was not found.`);\n }\n }\n};\n\nconst generateSwaggerPathObject = <M extends string>({\n tag, routeTypes, modelName, modelsConfig, hasId,\n}: GenerateSwaggerPathObjectParameters<M>) => {\n const methods: { [key: string]: any } = {};\n\n routeTypes.forEach((routeType) => {\n if (routeTypes.includes(routeType)) {\n const returnType = modelsConfig?.[modelName]?.routeTypes?.[routeType]?.response?.name ?? modelsConfig?.[modelName]?.type?.name ?? modelName;\n const method: HttpMethod = getRouteTypeMethod(routeType);\n const response = generateSwaggerResponse(routeType, returnType);\n\n if (typeof response === \"undefined\") {\n throw new TypeError(`Route type ${routeType}; response config was not found.`);\n }\n\n methods[method as HttpMethod] = {\n tags: [tag],\n summary: modelsConfig?.[modelName]?.routeTypes?.[routeType]?.summary,\n parameters: getQueryParameters(routeType).map((queryParameter) => {\n return { ...queryParameter, in: \"query\" };\n }),\n responses: {\n [response.statusCode]: response.content,\n ...modelsConfig?.[modelName]?.routeTypes?.[routeType]?.responses,\n },\n };\n\n if (hasId) {\n methods[method as HttpMethod].parameters.push({\n in: \"path\",\n name: \"id\",\n description: `ID of the ${modelName}`,\n required: true,\n schema: {\n type: \"string\",\n },\n });\n }\n\n if (routeType === RouteType.UPDATE || routeType === RouteType.CREATE) {\n if (routeType === RouteType.UPDATE) {\n methods[method as HttpMethod].requestBody = generateRequestBody(\"Update\", returnType);\n } else if (routeType === RouteType.CREATE) {\n methods[method as HttpMethod].requestBody = generateRequestBody(\"Create\", returnType);\n }\n }\n }\n });\n\n return methods;\n};\n\ninterface GetSwaggerPathsParameters<M extends string> {\n routes: Routes<M>;\n modelsConfig?: SwaggerModelsConfig<M>;\n models?: ModelsOptions<M>;\n routesMap?: { [key in M]?: string };\n}\n\nconst getSwaggerPaths = <M extends string>({\n routes, models, modelsConfig, routesMap,\n}: GetSwaggerPathsParameters<M>) => Object.keys(routes).reduce((accumulator: { [key: string]: any }, value: string | M) => {\n const routeTypes = routes[value] as RouteType[];\n const resourceName = models?.[value]?.name ? (models[value] as ModelOption).name : routesMap?.[value as M] || value;\n const tag = modelsConfig?.[value]?.tag?.name || value;\n\n if (routeTypes.includes(RouteType.CREATE) || routeTypes.includes(RouteType.READ_ALL)) {\n const path = `/${resourceName}`;\n const routeTypesToUse = [RouteType.READ_ALL, RouteType.CREATE].filter((routeType) => routeTypes.includes(routeType));\n\n accumulator[path] = generateSwaggerPathObject({\n tag,\n modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n });\n }\n\n if (routeTypes.includes(RouteType.READ_ONE) || routeTypes.includes(RouteType.UPDATE) || routeTypes.includes(RouteType.DELETE)) {\n const path = `/${resourceName}/{id}`;\n const routeTypesToUse = [RouteType.READ_ONE, RouteType.UPDATE, RouteType.DELETE].filter((routeType) => routeTypes.includes(routeType));\n\n accumulator[path] = generateSwaggerPathObject({\n tag,\n modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n hasId: true,\n });\n }\n\n return accumulator;\n }, {});\n\nexport default getSwaggerPaths;\n","import type { ModelsConfig, SwaggerModelsConfig, SwaggerTag } from \"../types.d\";\n\nconst getSwaggerTags = <M extends string>(modelNames: M[], modelsConfig?: SwaggerModelsConfig<M>): SwaggerTag[] => modelNames.map((modelName) => {\n if (modelsConfig?.[modelName]?.tag) {\n return (modelsConfig[modelName as M] as ModelsConfig).tag;\n }\n\n return {\n name: modelName,\n };\n});\n\nexport default getSwaggerTags;\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n // @ts-ignore\n PrismaClient,\n} from \"@prisma/client\";\n\nimport modelsToRouteNames from \"../../../adapter/prisma/utils/models-to-route-names\";\nimport type { ModelsOptions } from \"../../../types.d\";\nimport PrismaJsonSchemaParser from \"../../json-schema-parser\";\nimport type { SwaggerModelsConfig } from \"../../types.d\";\nimport getModelsAccessibleRoutes from \"../../utils/get-models-accessible-routes\";\nimport getSwaggerPaths from \"../../utils/get-swagger-paths\";\nimport getSwaggerTags from \"../../utils/get-swagger-tags\";\n\nconst modelsToOpenApi = async <M extends string = string>({\n prismaClient,\n models: ctorModels,\n swagger = { models: {}, allowedMediaTypes: { \"application/json\": true } },\n crud = { models: {} },\n defaultExposeStrategy = \"all\",\n}: ModelsToOpenApiParameters<M>) => {\n let dmmf: any;\n let prismaDmmfModels: any;\n\n // eslint-disable-next-line no-underscore-dangle\n if (prismaClient._dmmf) {\n // eslint-disable-next-line no-underscore-dangle\n dmmf = prismaClient._dmmf;\n prismaDmmfModels = dmmf?.mappingsMap;\n // eslint-disable-next-line no-underscore-dangle\n } else if (prismaClient._getDmmf) {\n // eslint-disable-next-line no-underscore-dangle\n dmmf = await prismaClient._getDmmf();\n prismaDmmfModels = dmmf.mappingsMap;\n }\n\n if (typeof dmmf === undefined) {\n throw new TypeError(\"Couldn't get prisma client models\");\n }\n\n const parser = new PrismaJsonSchemaParser(dmmf);\n\n const definitions = parser.parseModels();\n const dModels = Object.keys(definitions);\n\n const schema = JSON.stringify({\n ...definitions,\n ...parser.parseInputTypes(dModels),\n ...parser.getPaginationDataSchema(),\n ...parser.getPaginatedModelsSchemas(dModels),\n });\n\n if (typeof ctorModels !== \"undefined\") {\n ctorModels.forEach((model) => {\n if (!Object.keys(prismaDmmfModels).includes(model)) {\n throw new Error(`Model name ${model} is invalid.`);\n }\n });\n }\n\n // @ts-ignore\n const models = ctorModels ?? (Object.keys(prismaDmmfModels) as M[]);\n\n const swaggerRoutes = getModelsAccessibleRoutes(models, crud.models || {}, defaultExposeStrategy);\n const swaggerTags = getSwaggerTags(models, swagger?.models || {});\n const swaggerPaths = getSwaggerPaths({\n routes: swaggerRoutes,\n modelsConfig: swagger?.models || {},\n models: crud.models || {},\n routesMap: modelsToRouteNames(prismaDmmfModels, models),\n });\n const schemas = JSON.parse(schema.replace(/#\\/definitions/g, \"#/components/schemas\"));\n\n return {\n schemas,\n examples: parser.getExampleModelsSchemas(dModels, schemas),\n tags: swaggerTags,\n paths: swaggerPaths,\n };\n};\n\nexport interface ModelsToOpenApiParameters<M extends string = string> {\n prismaClient: PrismaClient;\n defaultExposeStrategy?: \"all\" | \"none\";\n models?: M[];\n swagger?: Partial<{\n models: SwaggerModelsConfig<M>;\n allowedMediaTypes: { [key: string]: boolean };\n }>;\n crud?: {\n models: ModelsOptions<M>;\n };\n}\n\nexport default modelsToOpenApi;\n"]}
1
+ {"version":3,"sources":["../src/adapter/prisma/index.ts","../src/adapter/prisma/utils/models-to-route-names.ts","../src/utils/is-primitive.ts","../src/adapter/prisma/utils/parse-cursor.ts","../src/adapter/prisma/utils/parse-order-by.ts","../src/adapter/prisma/utils/parse-recursive.ts","../src/adapter/prisma/utils/parse-where.ts","../src/swagger/json-schema-parser.ts","../src/swagger/utils/format-schema-ref.ts","../src/swagger/utils/get-models-accessible-routes.ts","../src/swagger/parameters.ts","../src/swagger/utils/format-example-ref.ts","../src/swagger/utils/get-swagger-paths.ts","../src/swagger/utils/get-swagger-tags.ts","../src/swagger/adapter/prisma/index.ts"],"names":["operatorsAssociation"],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n // @ts-ignore\n PrismaAction,\n // @ts-ignore\n PrismaClient,\n} from \"@prisma/client\";\nimport createHttpError from \"http-errors\";\n\nimport type { Adapter, PaginationData, ParsedQueryParameters } from \"../../types.d\";\nimport type { PrismaParsedQueryParameters } from \"./types.d\";\nimport modelsToRouteNames from \"./utils/models-to-route-names\";\nimport parsePrismaCursor from \"./utils/parse-cursor\";\nimport parsePrismaOrderBy from \"./utils/parse-order-by\";\nimport parsePrismaRecursiveField from \"./utils/parse-recursive\";\nimport parsePrismaWhere from \"./utils/parse-where\";\n\ninterface AdapterCtorArguments<M extends string = string> {\n primaryKey?: string;\n manyRelations?: {\n [key in M]?: string[];\n };\n prismaClient: PrismaClient;\n models?: M[];\n}\n\nexport default class PrismaAdapter<T, M extends string> implements Adapter<T, PrismaParsedQueryParameters, M> {\n private readonly primaryKey: string;\n\n private readonly manyRelations: {\n [key in M]?: string[];\n };\n\n private readonly prismaClient: PrismaClient;\n\n models?: M[];\n\n private readonly ctorModels?: M[];\n\n private dmmf: any;\n\n constructor({\n primaryKey = \"id\", prismaClient, manyRelations = {}, models,\n }: AdapterCtorArguments<M>) {\n this.prismaClient = prismaClient;\n this.primaryKey = primaryKey;\n this.manyRelations = manyRelations;\n this.ctorModels = models;\n }\n\n private getPrismaClientModels = async () => {\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._dmmf) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = this.prismaClient._dmmf;\n\n return this.dmmf?.mappingsMap;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._getDmmf) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = await this.prismaClient._getDmmf();\n\n return this.dmmf.mappingsMap;\n }\n\n throw new Error(\"Couldn't get prisma client models\");\n };\n\n async init() {\n const models = this.ctorModels;\n const prismaDmmfModels = await this.getPrismaClientModels();\n\n if (models !== undefined) {\n models.forEach((model) => {\n if (!Object.keys(prismaDmmfModels).includes(model)) {\n throw new Error(`Model name ${model} is invalid.`);\n }\n });\n }\n\n // @ts-ignore\n this.models = models ?? (Object.keys(prismaDmmfModels) as M[]); // Retrieve model names from dmmf for prisma v2\n }\n\n async getPaginationData(resourceName: M, query: PrismaParsedQueryParameters): Promise<PaginationData> {\n // @ts-ignore\n const total: number = await this.getPrismaDelegate(resourceName).count({\n where: query.where,\n distinct: query.distinct,\n });\n\n return {\n total,\n pageCount: Math.ceil(total / (query.take as number)),\n page: Math.ceil((query.skip as number) / (query.take as number)) + 1,\n };\n }\n\n // eslint-disable-next-line class-methods-use-this\n handleError(error: any) {\n // eslint-disable-next-line no-console\n console.error(error);\n\n if (error instanceof Error && error.stack) {\n // eslint-disable-next-line no-console\n console.error(error.stack);\n }\n\n throw error.constructor.name === \"PrismaClientKnownRequestError\" || error.constructor.name === \"PrismaClientValidationError\"\n ? createHttpError(400, \"invalid request, check your server logs for more info\")\n : createHttpError(500, \"an unknown error occured, check your server logs for more info\");\n }\n\n parseQuery(resourceName: M, query: ParsedQueryParameters) {\n const parsed: PrismaParsedQueryParameters = {};\n\n if (query.select) {\n parsed.select = parsePrismaRecursiveField(query.select, \"select\");\n }\n\n if (query.include) {\n parsed.include = parsePrismaRecursiveField(query.include, \"include\");\n }\n\n if (query.originalQuery?.where) {\n parsed.where = parsePrismaWhere(JSON.parse(query.originalQuery.where), this.manyRelations[resourceName] ?? []);\n }\n\n if (query.orderBy) {\n parsed.orderBy = parsePrismaOrderBy(query.orderBy);\n }\n\n if (query.limit !== undefined) {\n parsed.take = query.limit;\n }\n\n if (query.skip !== undefined) {\n parsed.skip = query.skip;\n }\n\n if (query.originalQuery?.cursor) {\n parsed.cursor = parsePrismaCursor(JSON.parse(query.originalQuery.cursor));\n }\n\n if (query.distinct) {\n parsed.distinct = query.distinct;\n }\n\n return parsed;\n }\n\n async getAll(resourceName: M, query: PrismaParsedQueryParameters): Promise<T[]> {\n // @ts-ignore\n return (await this.getPrismaDelegate(resourceName).findMany({\n select: query.select,\n include: query.include,\n where: query.where,\n orderBy: query.orderBy,\n cursor: query.cursor,\n take: query.take,\n skip: query.skip,\n distinct: query.distinct,\n })) as T[];\n }\n\n async getOne(resourceName: M, resourceId: string | number, query: PrismaParsedQueryParameters): Promise<T> {\n const delegate = this.getPrismaDelegate(resourceName);\n /**\n * On prisma v2.12, findOne has been deprecated in favor of findUnique\n * We use findUnique in priority only if it's available\n */\n const findFunction = delegate.findUnique || delegate.findOne;\n\n // @ts-ignore\n return findFunction({\n where: {\n [this.primaryKey]: resourceId,\n },\n select: query.select,\n include: query.include,\n });\n }\n\n async create(resourceName: M, data: any, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-ignore\n return this.getPrismaDelegate(resourceName).create({\n data,\n select: query.select,\n include: query.include,\n });\n }\n\n async update(resourceName: M, resourceId: string | number, data: any, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-ignore\n return this.getPrismaDelegate(resourceName).update({\n where: {\n [this.primaryKey]: resourceId,\n },\n data,\n select: query.select,\n include: query.include,\n });\n }\n\n async delete(resourceName: M, resourceId: string | number, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-ignore\n return this.getPrismaDelegate(resourceName).delete({\n where: {\n [this.primaryKey]: resourceId,\n },\n select: query.select,\n include: query.include,\n });\n }\n\n connect() {\n return this.prismaClient.$connect();\n }\n\n disconnect() {\n return this.prismaClient.$disconnect();\n }\n\n get client() {\n return this.prismaClient;\n }\n\n getModels() {\n return this.models || [];\n }\n\n private getPrismaDelegate(resourceName: M): Record<PrismaAction, (...arguments_: any[]) => Promise<T>> {\n return this.prismaClient[`${resourceName.charAt(0).toLowerCase()}${resourceName.slice(1)}`];\n }\n\n public async mapModelsToRouteNames() {\n return modelsToRouteNames(await this.getPrismaClientModels(), this.getModels());\n }\n}\n","const modelsToRouteNames = <M extends string = string>(mappingsMap: { [key: string]: object }, models: M[]) => {\n const routesMap: { [key in M]?: string } = {};\n\n models?.forEach((model) => {\n // @ts-ignore\n routesMap[model] = mappingsMap[model].plural;\n });\n\n return routesMap;\n};\n\nexport default modelsToRouteNames;\n","const primitiveTypes = new Set([\"string\", \"boolean\", \"number\"]);\n\nconst isPrimitive = (value: any): boolean => primitiveTypes.has(typeof value);\n\nexport default isPrimitive;\n","import isPrimitive from \"../../../utils/is-primitive\";\nimport type { PrismaCursor } from \"../types.d\";\n\nconst parsePrismaCursor = (\n cursor: Record<string, string | number | boolean>,\n): PrismaCursor => {\n const parsed: PrismaCursor = {};\n\n Object.keys(cursor).forEach((key) => {\n const value = cursor[key];\n\n if (isPrimitive(value)) {\n parsed[key as keyof typeof cursor] = value as string | number | boolean;\n }\n });\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\n \"cursor needs to be an object with exactly 1 property with a primitive value\",\n );\n }\n\n return parsed;\n};\n\nexport default parsePrismaCursor;\n","import type { OrderByField, OrderByOperator } from \"../../../types.d\";\nimport type { PrismaOrderBy, PrismaOrderByOperator } from \"../types.d\";\n\nconst operatorsAssociation: Record<OrderByOperator, PrismaOrderByOperator> = {\n $asc: \"asc\",\n $desc: \"desc\",\n};\n\nconst parsePrismaOrderBy = (orderBy: OrderByField): PrismaOrderBy => {\n const parsed: PrismaOrderBy = {};\n\n Object.keys(orderBy).forEach((key) => {\n const value = orderBy[key];\n\n parsed[key] = operatorsAssociation[value as OrderByOperator];\n });\n\n return parsed;\n};\n\nexport default parsePrismaOrderBy;\n","import type { RecursiveField } from \"../../../types.d\";\nimport type { PrismaRecursive, PrismaRecursiveField } from \"../types.d\";\n\nconst parsePrismaRecursiveField = <T extends PrismaRecursiveField>(\n select: RecursiveField,\n fieldName: T,\n): PrismaRecursive<T> => {\n const parsed: PrismaRecursive<T> = {};\n\n Object.keys(select).forEach((field) => {\n parsed[field] = select[field] === true ? true : {\n [fieldName]: parsePrismaRecursiveField(\n select[field] as RecursiveField,\n fieldName,\n ),\n } as Record<T, PrismaRecursive<T>>;\n });\n\n return parsed;\n};\n\nexport default parsePrismaRecursiveField;\n","import type {\n Condition, SearchCondition, WhereCondition, WhereField, WhereOperator,\n} from \"../../../types.d\";\nimport isPrimitive from \"../../../utils/is-primitive\";\nimport type {\n PrismaFieldFilter, PrismaRelationFilter, PrismaWhereField, PrismaWhereOperator,\n} from \"../types.d\";\n\nconst isObject = (a: any) => a instanceof Object;\n\nconst operatorsAssociation: {\n [key in WhereOperator]?: PrismaWhereOperator;\n} = {\n $eq: \"equals\",\n $neq: \"not\",\n $cont: \"contains\",\n $ends: \"endsWith\",\n $gt: \"gt\",\n $gte: \"gte\",\n $in: \"in\",\n $lt: \"lt\",\n $lte: \"lte\",\n $notin: \"notIn\",\n $starts: \"startsWith\",\n};\n\nconst isDateString = (value: string) => /^\\d{4}-[01]\\d-[0-3]\\d(?:T[0-2](?:\\d:[0-5]){2}\\d(?:\\.\\d+)?(?:Z|[+-][0-2]\\d(?::?[0-5]\\d)?)?)?$/g.test(value);\n\nconst getSearchValue = (originalValue: any): SearchCondition => {\n if (isDateString(originalValue)) {\n return new Date(originalValue);\n }\n\n if (typeof originalValue === \"string\" && originalValue === \"$isnull\") {\n return null;\n }\n\n return originalValue;\n};\n\nconst isRelation = (key: string, manyRelations: string[]): boolean => {\n // Get the key containing . and remove the property name\n const splitKey = key.split(\".\");\n splitKey.splice(-1, 1);\n\n return manyRelations.includes(splitKey.join(\".\"));\n};\n\nconst parseSimpleField = (value: Condition): undefined | { [key: string]: Condition } => {\n const operator = Object.keys(value)[0];\n const prismaOperator: undefined | PrismaWhereOperator = operatorsAssociation[operator as keyof typeof operatorsAssociation];\n\n if (prismaOperator) {\n return {\n [prismaOperator]: value[operator as string],\n };\n }\n\n return undefined;\n};\n\nconst parseRelation = (\n value: string | number | boolean | Date | Condition | WhereCondition,\n key: string,\n parsed: PrismaWhereField,\n manyRelations: string[],\n) => {\n // Reverse the keys so that we can format our object by nesting\n const fields = key.split(\".\").reverse();\n\n let formatFields: { [key: string]: any } = {};\n\n fields.forEach((field, index) => {\n // If we iterate over the property name, which is index 0, we parse it like a normal field\n if (index === 0) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n basicParse(value, field, formatFields, manyRelations);\n // Else we format the relation filter in the prisma way\n } else {\n formatFields = {\n [field]: {\n some: formatFields,\n },\n };\n }\n });\n\n // Retrieve the main relation field\n const initialFieldKey = fields.reverse()[0] as string;\n // Retrieve the old parsed version\n const oldParsed = parsed[initialFieldKey] as PrismaRelationFilter;\n\n // Format correctly in the prisma way\n // eslint-disable-next-line no-param-reassign\n parsed[initialFieldKey] = {\n some: {\n ...(oldParsed?.some as object),\n ...(formatFields[initialFieldKey as string]?.some as object),\n },\n };\n};\n\nconst parseObjectCombination = (object: Condition, manyRelations: string[]): PrismaFieldFilter => {\n const parsed: PrismaFieldFilter = {};\n\n Object.keys(object).forEach((key) => {\n const value = object[key];\n\n if (isRelation(key, manyRelations)) {\n parseRelation(value, key, parsed, manyRelations);\n } else if (isPrimitive(value)) {\n parsed[key] = value as SearchCondition;\n } else if (isObject(value)) {\n const fieldResult = parseSimpleField(value as Condition);\n\n if (fieldResult) {\n parsed[key] = fieldResult;\n }\n }\n });\n\n return parsed;\n};\n\nconst basicParse = (value: string | number | boolean | Condition | Date | WhereCondition, key: string, parsed: PrismaWhereField, manyRelations: string[]) => {\n if (isPrimitive(value)) {\n // eslint-disable-next-line no-param-reassign\n parsed[key] = getSearchValue(value);\n } else {\n switch (key) {\n case \"$or\": {\n if (isObject(value)) {\n // eslint-disable-next-line no-param-reassign\n parsed.OR = parseObjectCombination(value as Condition, manyRelations);\n }\n break;\n }\n case \"$and\": {\n if (isObject(value)) {\n // eslint-disable-next-line no-param-reassign\n parsed.AND = parseObjectCombination(value as Condition, manyRelations);\n }\n break;\n }\n case \"$not\": {\n if (isObject(value)) {\n // eslint-disable-next-line no-param-reassign\n parsed.NOT = parseObjectCombination(value as Condition, manyRelations);\n }\n break;\n }\n default: {\n // eslint-disable-next-line no-param-reassign\n parsed[key] = parseSimpleField(value as Condition);\n break;\n }\n }\n }\n};\n\nconst parsePrismaWhere = (where: WhereField, manyRelations: string[]): PrismaWhereField => {\n const parsed: PrismaWhereField = {};\n\n Object.keys(where).forEach((key) => {\n const value = where[key];\n /**\n * If the key without property name is a relation\n *\n * We want the following example input:\n *\n * posts.author.id: 1\n *\n * to output\n *\n * {\n * posts: {\n * some: {\n * author: {\n * some: {\n * id: 1\n * }\n * }\n * }\n * }\n * }\n */\n if (isRelation(key, manyRelations)) {\n parseRelation(value, key, parsed, manyRelations);\n } else {\n basicParse(value, key, parsed, manyRelations);\n }\n });\n\n return parsed;\n};\n\nexport default parsePrismaWhere;\n","import { getJSONSchemaProperty, transformDMMF } from \"@visulima/prisma-dmmf-transformer\";\nimport type { JSONSchema7 } from \"json-schema\";\nimport type { OpenAPIV3 } from \"openapi-types\";\n\nimport formatSchemaReference from \"./utils/format-schema-ref\";\n\nconst getJSONSchemaScalar = (fieldType: string | object) => {\n switch (fieldType) {\n case \"Int\":\n case \"BigInt\": {\n return \"integer\";\n }\n case \"DateTime\":\n case \"Bytes\":\n case \"String\": {\n return \"string\";\n }\n case \"Float\":\n case \"Decimal\": {\n return \"number\";\n }\n case \"Json\": {\n return \"object\";\n }\n case \"Boolean\": {\n return \"boolean\";\n }\n case \"Null\": {\n return \"null\";\n }\n default: {\n return \"\";\n }\n }\n};\n\nconst PAGINATION_SCHEMA_NAME = \"PaginationData\";\n\nconst methodsNames = [\n { methodStart: \"createOne\", schemaNameStart: \"Create\" },\n { methodStart: \"updateOne\", schemaNameStart: \"Update\" },\n];\n\nclass PrismaJsonSchemaParser {\n schemaInputTypes: Map<string, any> = new Map<string, any>();\n\n constructor(private dmmf: any) {}\n\n public parseModels(): {\n [key: string]: JSONSchema7;\n } {\n const modelsDefinitions = transformDMMF(this.dmmf).definitions as {\n [key: string]: JSONSchema7;\n };\n\n Object.keys(modelsDefinitions || {})?.forEach((definition: string | number) => {\n // @TODO: added the correct type\n // @ts-ignore\n const { properties } = modelsDefinitions[definition];\n\n Object.keys(properties).forEach((property: string) => {\n if (Array.isArray(properties[property].type) && properties[property].type.includes(\"null\")) {\n properties[property].type = properties[property].type.filter((type: string) => type !== \"null\");\n\n if (properties[property].type.length === 1) {\n // eslint-disable-next-line prefer-destructuring\n properties[property].type = properties[property].type[0];\n }\n\n properties[property].nullable = true;\n }\n });\n });\n\n return modelsDefinitions;\n }\n\n // eslint-disable-next-line radar/cognitive-complexity\n public parseInputTypes(models: string[]) {\n // eslint-disable-next-line radar/cognitive-complexity\n const definitions = models.reduce((accumulator: { [key: string]: any }, modelName) => {\n const methods = methodsNames.map((method) => {\n return {\n name: `${method.methodStart}${modelName}`,\n schemaName: `${method.schemaNameStart}${modelName}`,\n };\n });\n\n methods.forEach(({ name: method, schemaName }) => {\n // @ts-ignore\n const dataFields = this.dmmf.mutationType.fieldMap[method].args[0].inputTypes[0].type.fields;\n const requiredProperties: string[] = [];\n const properties = dataFields.reduce((propertiesAccumulator: any, field: any) => {\n if (field.inputTypes[0].kind === \"scalar\") {\n const schema = getJSONSchemaProperty(\n this.dmmf.datamodel,\n {},\n )({\n name: field.name,\n ...field.inputTypes[0],\n });\n\n // @TODO: added the correct type\n // @ts-ignore\n const { type: schemaType } = schema[1];\n\n if (schemaType && Array.isArray(schemaType)) {\n if (schemaType.includes(\"null\")) {\n // eslint-disable-next-line no-param-reassign\n propertiesAccumulator[field.name] = {\n ...schemaType,\n type: schemaType.filter((type: string) => type !== \"null\"),\n nullable: true,\n };\n if (propertiesAccumulator[field.name].type.length === 1) {\n // eslint-disable-next-line no-param-reassign\n propertiesAccumulator[field.name] = {\n ...propertiesAccumulator[field.name],\n type: propertiesAccumulator[field.name].type[0],\n };\n }\n }\n } else {\n // eslint-disable-next-line no-param-reassign,prefer-destructuring\n propertiesAccumulator[field.name] = schema[1];\n }\n } else {\n const typeName = this.parseObjectInputType(field.inputTypes[0]);\n\n // eslint-disable-next-line no-param-reassign\n propertiesAccumulator[field.name] = {\n ...typeName,\n nullable: field.isNullable,\n };\n }\n\n if (field.isRequired) {\n requiredProperties.push(field.name);\n }\n\n return propertiesAccumulator;\n }, {});\n\n accumulator[schemaName] = {\n type: \"object\",\n xml: {\n name: schemaName,\n },\n properties,\n };\n\n if (requiredProperties.length > 0) {\n accumulator[schemaName].required = requiredProperties;\n }\n });\n\n return accumulator;\n }, {});\n\n this.schemaInputTypes.forEach((value, key) => {\n definitions[key] = {\n type: \"object\",\n xml: {\n name: key,\n },\n properties: value,\n };\n });\n\n return definitions;\n }\n\n // eslint-disable-next-line class-methods-use-this\n public formatInputTypeData(inputType: any) {\n if (inputType.kind === \"object\") {\n const reference = formatSchemaReference(inputType.type.name);\n\n if (inputType.isList) {\n return {\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n items: {\n $ref: reference,\n },\n };\n }\n\n return { $ref: reference };\n }\n\n const type = getJSONSchemaScalar(inputType.type);\n\n if (inputType.isList) {\n return {\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n items: {\n type,\n },\n };\n }\n\n return { type };\n }\n\n // eslint-disable-next-line radar/cognitive-complexity\n public parseObjectInputType(fieldType: any) {\n if (fieldType.kind === \"object\") {\n if (!this.schemaInputTypes.has(fieldType.type.name)) {\n this.schemaInputTypes.set(fieldType.type.name, {});\n\n fieldType.type.fields.forEach((field: any) => {\n let fieldData: Record<string, any> = {};\n\n if (field.inputTypes.length > 1) {\n let nullable = false;\n\n const anyOf = field.inputTypes\n .map((inputType: any) => {\n const inputTypeData = this.formatInputTypeData(inputType);\n\n if (inputTypeData.type === \"null\") {\n nullable = true;\n\n return;\n }\n\n // eslint-disable-next-line consistent-return\n return inputTypeData;\n })\n .filter(Boolean);\n\n if (anyOf.length === 1) {\n // eslint-disable-next-line prefer-destructuring\n fieldData = anyOf[0];\n } else {\n fieldData.anyOf = anyOf;\n }\n\n if (nullable) {\n fieldData.nullable = true;\n }\n } else {\n const inputType = field.inputTypes[0];\n\n fieldData = this.formatInputTypeData(inputType);\n }\n\n this.schemaInputTypes.set(fieldType.type.name, {\n ...this.schemaInputTypes.get(fieldType.type.name),\n [field.name]: fieldData,\n });\n\n field.inputTypes.forEach((inputType: any) => {\n if (inputType.kind === \"object\") {\n this.parseObjectInputType(inputType);\n }\n });\n });\n }\n\n return { $ref: formatSchemaReference(fieldType.type.name) };\n }\n\n return { type: getJSONSchemaScalar(fieldType.type) };\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginationDataSchema() {\n return {\n [PAGINATION_SCHEMA_NAME]: {\n type: \"object\",\n xml: {\n name: PAGINATION_SCHEMA_NAME,\n },\n properties: {\n total: {\n type: \"integer\",\n minimum: 0,\n description: \"Holds the value for the total number of rows in the database\",\n },\n perPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the limit passed to the paginate method\",\n },\n page: {\n type: \"integer\",\n minimum: 1,\n description: \"Current page number\",\n },\n lastPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the value for the last page by taking the total of rows into account\",\n },\n firstPage: {\n type: \"integer\",\n minimum: 0,\n description: \"Returns the number for the first page. It is always 1\",\n },\n firstPageUrl: {\n type: \"string\",\n description: \"The URL for the first page\",\n },\n lastPageUrl: {\n type: \"string\",\n description: \"The URL for the last page\",\n },\n nextPageUrl: {\n type: \"string\",\n description: \"The URL for the next page\",\n },\n previousPageUrl: {\n type: \"string\",\n description: \"The URL for the previous page\",\n },\n },\n },\n };\n }\n\n public getExampleModelsSchemas(\n modelNames: string[],\n schemas: {\n [key: string]: OpenAPIV3.SchemaObject;\n },\n ) {\n const referenceToSchema = (reference: string) => {\n const name = reference.replace(\"#/components/schemas/\", \"\");\n const model = schemas[name] as OpenAPIV3.SchemaObject;\n\n const values: { [key: string]: string | object[] } = {};\n\n Object.entries((model?.properties as OpenAPIV3.SchemaObject) || {}).forEach(([key, v]) => {\n const type = (v as OpenAPIV3.SchemaObject).type as string;\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n values[key] = type === \"array\" ? [arrayItemsToSchema(v.items)] : type;\n });\n\n return values;\n };\n\n const objectPropertiesToSchema = (objectProperties: { [name: string]: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject }) => {\n const values: { [key: string]: string | object | object[] } = {};\n\n Object.entries(objectProperties).forEach(([key, value]) => {\n // eslint-disable-next-line max-len\n values[key] = (value as OpenAPIV3.ReferenceObject).$ref === undefined\n ? ((value as OpenAPIV3.SchemaObject).type as string)\n : referenceToSchema((value as OpenAPIV3.ReferenceObject).$ref);\n });\n\n return values;\n };\n\n const arrayItemsToSchema = (items: OpenAPIV3.ArraySchemaObject) => {\n const values: { [key: string]: object | object[] } = {};\n\n Object.entries(items).forEach(([key, value]) => {\n if (value.items.$ref !== undefined) {\n values[key] = [referenceToSchema(value.items.$ref)];\n } else if (value.type === \"array\") {\n values[key] = [arrayItemsToSchema(value.items)];\n } else if (value.type === \"object\") {\n values[key] = objectPropertiesToSchema(value.properties);\n } else {\n values[key] = value.type;\n }\n });\n\n return values;\n };\n\n return modelNames.reduce((accumulator, modelName) => {\n const value: { [key: string]: string | object | object[] } = {};\n const model = schemas[modelName] as OpenAPIV3.SchemaObject;\n\n Object.entries(model.properties as OpenAPIV3.SchemaObject).forEach(([key, v]) => {\n const type = (v as OpenAPIV3.SchemaObject).type as string;\n\n if (type === \"array\") {\n value[key] = [referenceToSchema(v.items.$ref)];\n } else if (type === \"object\") {\n value[key] = objectPropertiesToSchema(v.properties);\n } else {\n value[key] = type;\n }\n });\n\n const pagination = this.getPaginationDataSchema()[PAGINATION_SCHEMA_NAME];\n const meta: { [key: string]: string } = {};\n\n Object.entries(pagination.properties as OpenAPIV3.SchemaObject).forEach(([key, v]) => {\n meta[key] = (v as OpenAPIV3.SchemaObject).type as string;\n });\n\n return {\n ...accumulator,\n [`${modelName}`]: {\n value,\n },\n [`${modelName}s`]: {\n value: [value],\n },\n [`${modelName}Page`]: {\n value: {\n data: [value],\n meta,\n },\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginatedModelsSchemas(modelNames: string[]) {\n return modelNames.reduce((accumulator, modelName) => {\n return {\n ...accumulator,\n [`${modelName}Page`]: {\n type: \"object\",\n xml: {\n name: `${modelName}Page`,\n },\n properties: {\n data: {\n type: \"array\",\n xml: {\n name: \"Data\",\n wrapped: true,\n },\n items: {\n $ref: formatSchemaReference(modelName),\n },\n },\n meta: {\n $ref: formatSchemaReference(PAGINATION_SCHEMA_NAME),\n },\n },\n },\n };\n }, {});\n }\n}\n\nexport default PrismaJsonSchemaParser;\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatSchemaReference = (schemaName: string) => `#/components/schemas/${schemaName}`;\n\nexport default formatSchemaReference;\n","import type { ModelOption, ModelsOptions } from \"../../types.d\";\nimport getAccessibleRoutes from \"../../utils/get-accessible-routes\";\nimport type { Routes } from \"../types.d\";\n\nconst getModelsAccessibleRoutes = <M extends string>(\n modelNames: M[],\n models?: ModelsOptions<M>,\n defaultExposeStrategy: \"all\" | \"none\" = \"all\",\n): Routes<M> => modelNames.reduce((accumulator, modelName) => {\n if (models?.[modelName]) {\n return {\n ...accumulator,\n [modelName]: getAccessibleRoutes((models[modelName] as ModelOption).only, (models[modelName] as ModelOption).exclude, defaultExposeStrategy),\n };\n }\n\n return {\n ...accumulator,\n [modelName]: getAccessibleRoutes(undefined, undefined, defaultExposeStrategy),\n };\n }, {});\n\nexport default getModelsAccessibleRoutes;\n","import { RouteType } from \"../types.d\";\nimport type { SwaggerParameter } from \"./types.d\";\n\nconst queryParameters: Record<string, SwaggerParameter> = {\n select: {\n name: \"select\",\n description: \"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts\",\n schema: {\n type: \"string\",\n },\n },\n include: {\n name: \"include\",\n description: \"Include relations, same as select\",\n schema: {\n type: \"string\",\n },\n },\n where: {\n name: \"where\",\n description: 'Fields to filter. See <a href=\"https://next-crud.js.org/query-params#where\">the docs</a>',\n schema: {\n type: \"string\",\n },\n },\n orderBy: {\n name: \"orderBy\",\n description: 'Field on which to order by a direction. See <a href=\"https://next-crud.js.org/query-params#orderBy\">the docs</a>',\n schema: {\n type: \"string\",\n },\n },\n limit: {\n name: \"limit\",\n description: \"Maximum number of elements to retrieve\",\n schema: {\n type: \"integer\",\n minimum: 0,\n },\n },\n skip: {\n name: \"skip\",\n description: \"Number of rows to skip\",\n schema: {\n type: \"integer\",\n minimum: 0,\n },\n },\n distinct: {\n name: \"distinct\",\n description: \"Fields to distinctively retrieve\",\n schema: {\n type: \"string\",\n },\n },\n page: {\n name: \"page\",\n description: \"Page number. Use only for pagination.\",\n schema: {\n type: \"integer\",\n minimum: 1,\n },\n },\n};\n\nexport const commonQueryParameters = [queryParameters.select, queryParameters.include];\nexport const listQueryParameters = [\n ...commonQueryParameters,\n queryParameters.limit,\n queryParameters.skip,\n queryParameters.where,\n queryParameters.orderBy,\n queryParameters.page,\n queryParameters.distinct,\n];\n\nexport const getQueryParameters = (routeType: RouteType, additionalQueryParameters: SwaggerParameter[] = []) => {\n if (routeType === RouteType.READ_ALL) {\n return [...listQueryParameters, ...additionalQueryParameters];\n }\n\n return [...commonQueryParameters, ...additionalQueryParameters];\n};\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatExampleReference = (schemaName: string) => `#/components/examples/${schemaName}`;\n\nexport default formatExampleReference;\n","import type { ModelOption, ModelsOptions } from \"../../types.d\";\nimport { RouteType } from \"../../types.d\";\nimport { getQueryParameters } from \"../parameters\";\nimport type { Routes, SwaggerModelsConfig } from \"../types.d\";\nimport formatExampleReference from \"./format-example-ref\";\nimport formatSchemaReference from \"./format-schema-ref\";\n\ninterface GenerateSwaggerPathObjectParameters<M extends string> {\n tag: string;\n routeTypes: RouteType[];\n modelsConfig?: SwaggerModelsConfig<M>;\n modelName: M;\n hasId?: boolean;\n}\n\ntype HttpMethod = \"get\" | \"post\" | \"put\" | \"delete\";\n\nconst generateContentForSchema = (schemaName: string, isArray?: boolean) => {\n if (isArray) {\n return {\n type: \"array\",\n items: {\n $ref: formatSchemaReference(schemaName),\n },\n };\n }\n\n return {\n $ref: formatSchemaReference(schemaName),\n };\n};\n\nconst generateSwaggerResponse = (routeType: RouteType, modelName: string): { statusCode: number; content: any } | undefined => {\n if (routeType === RouteType.CREATE) {\n return {\n statusCode: 201,\n content: {\n description: `${modelName} created`,\n content: {\n \"application/json\": {\n schema: generateContentForSchema(modelName),\n example: formatExampleReference(modelName),\n },\n },\n },\n };\n }\n\n if (routeType === RouteType.DELETE) {\n return {\n statusCode: 200,\n content: {\n description: `${modelName} item deleted`,\n content: {\n \"application/json\": {\n schema: generateContentForSchema(modelName),\n example: formatExampleReference(modelName),\n },\n },\n },\n };\n }\n\n if (routeType === RouteType.READ_ALL) {\n return {\n statusCode: 200,\n content: {\n description: `${modelName} list retrieved`,\n content: {\n \"application/json\": {\n schema: {\n oneOf: [generateContentForSchema(modelName, true), generateContentForSchema(`${modelName}Page`, false)],\n },\n examples: {\n Default: {\n $ref: formatExampleReference(`${modelName}s`),\n },\n Pagination: {\n $ref: formatExampleReference(`${modelName}Page`),\n },\n },\n },\n },\n },\n };\n }\n\n if (routeType === RouteType.READ_ONE) {\n return {\n statusCode: 200,\n content: {\n description: `${modelName} item retrieved`,\n content: {\n \"application/json\": {\n schema: generateContentForSchema(modelName),\n example: formatExampleReference(modelName),\n },\n },\n },\n };\n }\n\n if (routeType === RouteType.UPDATE) {\n return {\n statusCode: 200,\n content: {\n description: `${modelName} item updated`,\n content: {\n \"application/json\": {\n schema: generateContentForSchema(modelName),\n example: formatExampleReference(modelName),\n },\n },\n },\n };\n }\n\n return undefined;\n};\n\nconst generateRequestBody = (schemaStartName: string, modelName: string) => {\n return {\n content: {\n \"application/json\": {\n schema: {\n $ref: formatSchemaReference(`${schemaStartName}${modelName}`),\n },\n },\n },\n };\n};\n\nconst getRouteTypeMethod = (routeType: RouteType): HttpMethod => {\n switch (routeType) {\n case RouteType.CREATE: {\n return \"post\";\n }\n case RouteType.READ_ALL:\n case RouteType.READ_ONE: {\n return \"get\";\n }\n case RouteType.UPDATE: {\n return \"put\";\n }\n case RouteType.DELETE: {\n return \"delete\";\n }\n default: {\n throw new TypeError(`Method for route type ${routeType} was not found.`);\n }\n }\n};\n\nconst generateSwaggerPathObject = <M extends string>({\n tag, routeTypes, modelName, modelsConfig, hasId,\n}: GenerateSwaggerPathObjectParameters<M>) => {\n const methods: { [key: string]: any } = {};\n\n routeTypes.forEach((routeType) => {\n if (routeTypes.includes(routeType)) {\n const returnType = modelsConfig?.[modelName]?.routeTypes?.[routeType]?.response?.name ?? modelsConfig?.[modelName]?.type?.name ?? modelName;\n const method: HttpMethod = getRouteTypeMethod(routeType);\n const response = generateSwaggerResponse(routeType, returnType);\n\n if (response === undefined) {\n throw new TypeError(`Route type ${routeType}; response config was not found.`);\n }\n\n methods[method as HttpMethod] = {\n tags: [tag],\n summary: modelsConfig?.[modelName]?.routeTypes?.[routeType]?.summary,\n parameters: getQueryParameters(routeType).map((queryParameter) => {\n return { ...queryParameter, in: \"query\" };\n }),\n responses: {\n [response.statusCode]: response.content,\n ...modelsConfig?.[modelName]?.routeTypes?.[routeType]?.responses,\n },\n };\n\n if (hasId) {\n methods[method as HttpMethod].parameters.push({\n in: \"path\",\n name: \"id\",\n description: `ID of the ${modelName}`,\n required: true,\n schema: {\n type: \"string\",\n },\n });\n }\n\n if (routeType === RouteType.UPDATE || routeType === RouteType.CREATE) {\n if (routeType === RouteType.UPDATE) {\n methods[method as HttpMethod].requestBody = generateRequestBody(\"Update\", returnType);\n } else if (routeType === RouteType.CREATE) {\n methods[method as HttpMethod].requestBody = generateRequestBody(\"Create\", returnType);\n }\n }\n }\n });\n\n return methods;\n};\n\ninterface GetSwaggerPathsParameters<M extends string> {\n routes: Routes<M>;\n modelsConfig?: SwaggerModelsConfig<M>;\n models?: ModelsOptions<M>;\n routesMap?: { [key in M]?: string };\n}\n\nconst getSwaggerPaths = <M extends string>({\n routes, models, modelsConfig, routesMap,\n}: GetSwaggerPathsParameters<M>) => Object.keys(routes).reduce((accumulator: { [key: string]: any }, value: string | M) => {\n const routeTypes = routes[value] as RouteType[];\n const resourceName = models?.[value]?.name ? (models[value] as ModelOption).name : routesMap?.[value as M] || value;\n const tag = modelsConfig?.[value]?.tag?.name || value;\n\n if (routeTypes.includes(RouteType.CREATE) || routeTypes.includes(RouteType.READ_ALL)) {\n const path = `/${resourceName}`;\n const routeTypesToUse = [RouteType.READ_ALL, RouteType.CREATE].filter((routeType) => routeTypes.includes(routeType));\n\n accumulator[path] = generateSwaggerPathObject({\n tag,\n modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n });\n }\n\n if (routeTypes.includes(RouteType.READ_ONE) || routeTypes.includes(RouteType.UPDATE) || routeTypes.includes(RouteType.DELETE)) {\n const path = `/${resourceName}/{id}`;\n const routeTypesToUse = [RouteType.READ_ONE, RouteType.UPDATE, RouteType.DELETE].filter((routeType) => routeTypes.includes(routeType));\n\n accumulator[path] = generateSwaggerPathObject({\n tag,\n modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n hasId: true,\n });\n }\n\n return accumulator;\n }, {});\n\nexport default getSwaggerPaths;\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nimport type { ModelsConfig, SwaggerModelsConfig } from \"../types.d\";\n\nconst getSwaggerTags = <M extends string>(modelNames: M[], modelsConfig?: SwaggerModelsConfig<M>): OpenAPIV3.TagObject[] => modelNames.map((modelName) => {\n if (modelsConfig?.[modelName]?.tag) {\n return (modelsConfig[modelName as M] as ModelsConfig).tag;\n }\n\n return {\n name: modelName,\n };\n}) as OpenAPIV3.TagObject[];\n\nexport default getSwaggerTags;\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n // @ts-ignore\n PrismaClient,\n} from \"@prisma/client\";\nimport type { OpenAPIV3 } from \"openapi-types\";\n\nimport modelsToRouteNames from \"../../../adapter/prisma/utils/models-to-route-names\";\nimport type { ModelsOptions } from \"../../../types.d\";\nimport PrismaJsonSchemaParser from \"../../json-schema-parser\";\nimport type { SwaggerModelsConfig } from \"../../types.d\";\nimport getModelsAccessibleRoutes from \"../../utils/get-models-accessible-routes\";\nimport getSwaggerPaths from \"../../utils/get-swagger-paths\";\nimport getSwaggerTags from \"../../utils/get-swagger-tags\";\n\nconst overwritePathsExampleWithModel = (swaggerPaths: OpenAPIV3.PathsObject, examples: { [key: string]: { value: any } }): OpenAPIV3.PathsObject => {\n // eslint-disable-next-line radar/cognitive-complexity\n Object.values(swaggerPaths).forEach((pathSpec) => {\n Object.values(pathSpec as OpenAPIV3.PathsObject & OpenAPIV3.OperationObject).forEach((methodSpec) => {\n if (typeof (methodSpec as OpenAPIV3.OperationObject).responses === \"object\") {\n Object.values((methodSpec as OpenAPIV3.OperationObject).responses).forEach((responseSpec) => {\n if (typeof (responseSpec as OpenAPIV3.ResponseObject).content === \"object\") {\n Object.values(\n (responseSpec as OpenAPIV3.ResponseObject).content as {\n [media: string]: OpenAPIV3.MediaTypeObject;\n },\n ).forEach((contentSpec) => {\n if (typeof (contentSpec as OpenAPIV3.MediaTypeObject).example === \"string\") {\n const example = ((contentSpec as OpenAPIV3.MediaTypeObject).example as string).replace(\"#/components/examples/\", \"\");\n\n if (\n typeof examples[example as keyof typeof examples] !== undefined\n && typeof examples[example as keyof typeof examples]?.value !== undefined\n ) {\n // eslint-disable-next-line no-param-reassign\n (contentSpec as OpenAPIV3.MediaTypeObject).example = (examples[example as keyof typeof examples] as typeof examples).value;\n }\n }\n });\n }\n });\n }\n });\n });\n\n return swaggerPaths;\n};\n\nconst modelsToOpenApi = async <M extends string = string>({\n prismaClient,\n models: ctorModels,\n swagger = { models: {}, allowedMediaTypes: { \"application/json\": true } },\n crud = { models: {} },\n defaultExposeStrategy = \"all\",\n}: ModelsToOpenApiParameters<M>): Promise<{\n schemas: {\n [key: string]: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject;\n };\n examples: {\n [key: string]: OpenAPIV3.ReferenceObject | OpenAPIV3.ExampleObject;\n };\n tags: OpenAPIV3.TagObject[];\n paths: OpenAPIV3.PathsObject;\n}> => {\n let dmmf: any;\n let prismaDmmfModels: any;\n\n // eslint-disable-next-line no-underscore-dangle\n if (prismaClient._dmmf) {\n // eslint-disable-next-line no-underscore-dangle\n dmmf = prismaClient._dmmf;\n prismaDmmfModels = dmmf?.mappingsMap;\n // eslint-disable-next-line no-underscore-dangle\n } else if (prismaClient._getDmmf) {\n // eslint-disable-next-line no-underscore-dangle\n dmmf = await prismaClient._getDmmf();\n prismaDmmfModels = dmmf.mappingsMap;\n }\n\n if (typeof dmmf === undefined) {\n throw new TypeError(\"Couldn't get prisma client models\");\n }\n\n const parser = new PrismaJsonSchemaParser(dmmf);\n\n const definitions = parser.parseModels();\n const dModels = Object.keys(definitions);\n\n const schema = JSON.stringify({\n ...definitions,\n ...parser.parseInputTypes(dModels),\n ...parser.getPaginationDataSchema(),\n ...parser.getPaginatedModelsSchemas(dModels),\n });\n\n if (ctorModels !== undefined) {\n ctorModels.forEach((model) => {\n if (!Object.keys(prismaDmmfModels).includes(model)) {\n throw new Error(`Model name ${model} is invalid.`);\n }\n });\n }\n\n // @ts-ignore\n const models = ctorModels ?? (Object.keys(prismaDmmfModels) as M[]);\n\n const swaggerRoutes = getModelsAccessibleRoutes(models, crud.models || {}, defaultExposeStrategy);\n const swaggerTags = getSwaggerTags(models, swagger?.models || {});\n const swaggerPaths = getSwaggerPaths({\n routes: swaggerRoutes,\n modelsConfig: swagger?.models || {},\n models: crud.models || {},\n routesMap: modelsToRouteNames(prismaDmmfModels, models),\n });\n const schemas = JSON.parse(schema.replace(/#\\/definitions/g, \"#/components/schemas\"));\n const examples = parser.getExampleModelsSchemas(dModels, schemas);\n\n return {\n schemas,\n examples,\n tags: swaggerTags,\n paths: overwritePathsExampleWithModel(swaggerPaths, examples),\n };\n};\n\nexport interface ModelsToOpenApiParameters<M extends string = string> {\n prismaClient: PrismaClient;\n defaultExposeStrategy?: \"all\" | \"none\";\n models?: M[];\n swagger?: Partial<{\n models: SwaggerModelsConfig<M>;\n allowedMediaTypes: { [key: string]: boolean };\n }>;\n crud?: {\n models: ModelsOptions<M>;\n };\n}\n\nexport default modelsToOpenApi;\n"]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  RouteType,
3
3
  get_accessible_routes_default
4
- } from "./chunk-UBXIGP5H.mjs";
4
+ } from "./chunk-SH6A4KBC.mjs";
5
5
 
6
6
  // src/adapter/prisma/index.ts
7
7
  import createHttpError from "http-errors";
@@ -58,16 +58,12 @@ var parse_order_by_default = parsePrismaOrderBy;
58
58
  var parsePrismaRecursiveField = (select, fieldName) => {
59
59
  const parsed = {};
60
60
  Object.keys(select).forEach((field) => {
61
- if (select[field] !== true) {
62
- parsed[field] = {
63
- [fieldName]: parsePrismaRecursiveField(
64
- select[field],
65
- fieldName
66
- )
67
- };
68
- } else {
69
- parsed[field] = true;
70
- }
61
+ parsed[field] = select[field] === true ? true : {
62
+ [fieldName]: parsePrismaRecursiveField(
63
+ select[field],
64
+ fieldName
65
+ )
66
+ };
71
67
  });
72
68
  return parsed;
73
69
  };
@@ -226,7 +222,7 @@ var PrismaAdapter = class {
226
222
  async init() {
227
223
  const models = this.ctorModels;
228
224
  const prismaDmmfModels = await this.getPrismaClientModels();
229
- if (typeof models !== "undefined") {
225
+ if (models !== void 0) {
230
226
  models.forEach((model) => {
231
227
  if (!Object.keys(prismaDmmfModels).includes(model)) {
232
228
  throw new Error(`Model name ${model} is invalid.`);
@@ -268,10 +264,10 @@ var PrismaAdapter = class {
268
264
  if (query.orderBy) {
269
265
  parsed.orderBy = parse_order_by_default(query.orderBy);
270
266
  }
271
- if (typeof query.limit !== "undefined") {
267
+ if (query.limit !== void 0) {
272
268
  parsed.take = query.limit;
273
269
  }
274
- if (typeof query.skip !== "undefined") {
270
+ if (query.skip !== void 0) {
275
271
  parsed.skip = query.skip;
276
272
  }
277
273
  if ((_b = query.originalQuery) == null ? void 0 : _b.cursor) {
@@ -624,29 +620,21 @@ var PrismaJsonSchemaParser = class {
624
620
  const values = {};
625
621
  Object.entries((model == null ? void 0 : model.properties) || {}).forEach(([key, v]) => {
626
622
  const type = v.type;
627
- if (type === "array") {
628
- values[key] = [arrayItemsToSchema(v.items)];
629
- } else {
630
- values[key] = type;
631
- }
623
+ values[key] = type === "array" ? [arrayItemsToSchema(v.items)] : type;
632
624
  });
633
625
  return values;
634
626
  };
635
627
  const objectPropertiesToSchema = (objectProperties) => {
636
628
  const values = {};
637
629
  Object.entries(objectProperties).forEach(([key, value]) => {
638
- if (typeof value.$ref !== "undefined") {
639
- values[key] = referenceToSchema(value.$ref);
640
- } else {
641
- values[key] = value.type;
642
- }
630
+ values[key] = value.$ref === void 0 ? value.type : referenceToSchema(value.$ref);
643
631
  });
644
632
  return values;
645
633
  };
646
634
  const arrayItemsToSchema = (items) => {
647
635
  const values = {};
648
636
  Object.entries(items).forEach(([key, value]) => {
649
- if (typeof value.items.$ref !== "undefined") {
637
+ if (value.items.$ref !== void 0) {
650
638
  values[key] = [referenceToSchema(value.items.$ref)];
651
639
  } else if (value.type === "array") {
652
640
  values[key] = [arrayItemsToSchema(value.items)];
@@ -681,6 +669,9 @@ var PrismaJsonSchemaParser = class {
681
669
  [`${modelName}`]: {
682
670
  value
683
671
  },
672
+ [`${modelName}s`]: {
673
+ value: [value]
674
+ },
684
675
  [`${modelName}Page`]: {
685
676
  value: {
686
677
  data: [value],
@@ -841,7 +832,8 @@ var generateSwaggerResponse = (routeType, modelName) => {
841
832
  description: `${modelName} created`,
842
833
  content: {
843
834
  "application/json": {
844
- schema: generateContentForSchema(modelName)
835
+ schema: generateContentForSchema(modelName),
836
+ example: format_example_ref_default(modelName)
845
837
  }
846
838
  }
847
839
  }
@@ -854,7 +846,8 @@ var generateSwaggerResponse = (routeType, modelName) => {
854
846
  description: `${modelName} item deleted`,
855
847
  content: {
856
848
  "application/json": {
857
- schema: generateContentForSchema(modelName)
849
+ schema: generateContentForSchema(modelName),
850
+ example: format_example_ref_default(modelName)
858
851
  }
859
852
  }
860
853
  }
@@ -872,7 +865,7 @@ var generateSwaggerResponse = (routeType, modelName) => {
872
865
  },
873
866
  examples: {
874
867
  Default: {
875
- $ref: format_example_ref_default(`${modelName}`)
868
+ $ref: format_example_ref_default(`${modelName}s`)
876
869
  },
877
870
  Pagination: {
878
871
  $ref: format_example_ref_default(`${modelName}Page`)
@@ -890,7 +883,8 @@ var generateSwaggerResponse = (routeType, modelName) => {
890
883
  description: `${modelName} item retrieved`,
891
884
  content: {
892
885
  "application/json": {
893
- schema: generateContentForSchema(modelName)
886
+ schema: generateContentForSchema(modelName),
887
+ example: format_example_ref_default(modelName)
894
888
  }
895
889
  }
896
890
  }
@@ -903,7 +897,8 @@ var generateSwaggerResponse = (routeType, modelName) => {
903
897
  description: `${modelName} item updated`,
904
898
  content: {
905
899
  "application/json": {
906
- schema: generateContentForSchema(modelName)
900
+ schema: generateContentForSchema(modelName),
901
+ example: format_example_ref_default(modelName)
907
902
  }
908
903
  }
909
904
  }
@@ -956,7 +951,7 @@ var generateSwaggerPathObject = ({
956
951
  const returnType = ((_d = (_c = (_b = (_a = modelsConfig == null ? void 0 : modelsConfig[modelName]) == null ? void 0 : _a.routeTypes) == null ? void 0 : _b[routeType]) == null ? void 0 : _c.response) == null ? void 0 : _d.name) ?? ((_f = (_e = modelsConfig == null ? void 0 : modelsConfig[modelName]) == null ? void 0 : _e.type) == null ? void 0 : _f.name) ?? modelName;
957
952
  const method = getRouteTypeMethod(routeType);
958
953
  const response = generateSwaggerResponse(routeType, returnType);
959
- if (typeof response === "undefined") {
954
+ if (response === void 0) {
960
955
  throw new TypeError(`Route type ${routeType}; response config was not found.`);
961
956
  }
962
957
  methods[method] = {
@@ -1040,6 +1035,30 @@ var getSwaggerTags = (modelNames, modelsConfig) => modelNames.map((modelName) =>
1040
1035
  var get_swagger_tags_default = getSwaggerTags;
1041
1036
 
1042
1037
  // src/swagger/adapter/prisma/index.ts
1038
+ var overwritePathsExampleWithModel = (swaggerPaths, examples) => {
1039
+ Object.values(swaggerPaths).forEach((pathSpec) => {
1040
+ Object.values(pathSpec).forEach((methodSpec) => {
1041
+ if (typeof methodSpec.responses === "object") {
1042
+ Object.values(methodSpec.responses).forEach((responseSpec) => {
1043
+ if (typeof responseSpec.content === "object") {
1044
+ Object.values(
1045
+ responseSpec.content
1046
+ ).forEach((contentSpec) => {
1047
+ var _a;
1048
+ if (typeof contentSpec.example === "string") {
1049
+ const example = contentSpec.example.replace("#/components/examples/", "");
1050
+ if (typeof examples[example] !== void 0 && typeof ((_a = examples[example]) == null ? void 0 : _a.value) !== void 0) {
1051
+ contentSpec.example = examples[example].value;
1052
+ }
1053
+ }
1054
+ });
1055
+ }
1056
+ });
1057
+ }
1058
+ });
1059
+ });
1060
+ return swaggerPaths;
1061
+ };
1043
1062
  var modelsToOpenApi = async ({
1044
1063
  prismaClient,
1045
1064
  models: ctorModels,
@@ -1068,7 +1087,7 @@ var modelsToOpenApi = async ({
1068
1087
  ...parser.getPaginationDataSchema(),
1069
1088
  ...parser.getPaginatedModelsSchemas(dModels)
1070
1089
  });
1071
- if (typeof ctorModels !== "undefined") {
1090
+ if (ctorModels !== void 0) {
1072
1091
  ctorModels.forEach((model) => {
1073
1092
  if (!Object.keys(prismaDmmfModels).includes(model)) {
1074
1093
  throw new Error(`Model name ${model} is invalid.`);
@@ -1085,11 +1104,12 @@ var modelsToOpenApi = async ({
1085
1104
  routesMap: models_to_route_names_default(prismaDmmfModels, models)
1086
1105
  });
1087
1106
  const schemas = JSON.parse(schema.replace(/#\/definitions/g, "#/components/schemas"));
1107
+ const examples = parser.getExampleModelsSchemas(dModels, schemas);
1088
1108
  return {
1089
1109
  schemas,
1090
- examples: parser.getExampleModelsSchemas(dModels, schemas),
1110
+ examples,
1091
1111
  tags: swaggerTags,
1092
- paths: swaggerPaths
1112
+ paths: overwritePathsExampleWithModel(swaggerPaths, examples)
1093
1113
  };
1094
1114
  };
1095
1115
  var prisma_default = modelsToOpenApi;