@visulima/crud 1.0.13 → 1.0.14
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 +14 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## @visulima/crud [1.0.14](https://github.com/visulima/visulima/compare/@visulima/crud@1.0.13...@visulima/crud@1.0.14) (2023-07-28)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* Update eslint rules and dependencies ([01a4bef](https://github.com/visulima/visulima/commit/01a4beff467091ac2d2fc6f342d274d282391842))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Dependencies
|
|
11
|
+
|
|
12
|
+
* **@visulima/pagination:** upgraded to 2.0.6
|
|
13
|
+
* **@visulima/prisma-dmmf-transformer:** upgraded to 1.0.9
|
|
14
|
+
|
|
1
15
|
## @visulima/crud [1.0.13](https://github.com/visulima/visulima/compare/@visulima/crud@1.0.12...@visulima/crud@1.0.13) (2023-07-26)
|
|
2
16
|
|
|
3
17
|
|
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":["createHttpError","modelsToRouteNames","mappingsMap","models","routesMap","model","models_to_route_names_default","primitiveTypes","isPrimitive","value","is_primitive_default","parsePrismaCursor","cursor","parsed","key","parse_cursor_default","operatorsAssociation","parsePrismaOrderBy","orderBy","parse_order_by_default","parsePrismaRecursiveField","select","fieldName","field","parse_recursive_default","isObject","a","isDateString","getSearchValue","originalValue","isRelation","manyRelations","splitKey","parseSimpleField","operator","prismaOperator","parseRelation","fields","formatFields","index","basicParse","initialFieldKey","oldParsed","parseObjectCombination","object","fieldResult","parsePrismaWhere","where","parse_where_default","PrismaAdapter","primaryKey","prismaClient","resourceName","data","query","resourceId","delegate","total","error","prismaDmmfModels","createPaginationMetaSchemaObject","getJSONSchemaProperty","transformDMMF","formatSchemaReference","schemaName","format_schema_ref_default","getJSONSchemaScalar","fieldType","PAGINATION_SCHEMA_NAME","methodsNames","PrismaJsonSchemaParser","dmmf","inputType","reference","type","modelNames","schemas","referenceToSchema","name","values","v","arrayItemsToSchema","objectPropertiesToSchema","objectProperties","items","accumulator","modelName","pagination","meta","definitions","method","dataFields","requiredProperties","properties","propertiesAccumulator","schema","schemaType","typeName","modelsDefinitions","definition","property","fieldData","nullable","anyOf","inputTypeData","json_schema_parser_default","getModelsAccessibleRoutes","defaultExposeStrategy","get_accessible_routes_default","get_models_accessible_routes_default","queryParameters","commonQueryParameters","listQueryParameters","getQueryParameters","routeType","additionalQueryParameters","formatExampleReference","format_example_ref_default","generateContentForSchema","isArray","generateSwaggerResponse","generateRequestBody","schemaStartName","getRouteTypeMethod","generateSwaggerPathObject","hasId","modelsConfig","routeTypes","tag","methods","returnType","response","queryParameter","getSwaggerPaths","routes","path","routeTypesToUse","get_swagger_paths_default","getSwaggerTags","get_swagger_tags_default","overwritePathsExampleWithModel","swaggerPaths","examples","pathSpec","methodSpec","responseSpec","contentSpec","example","modelsToOpenApi","crud","ctorModels","swagger","parser","dModels","swaggerRoutes","swaggerTags","prisma_default"],"mappings":"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","sourcesContent":["import type {\n // @ts-expect-error\n PrismaAction,\n} from \"@prisma/client\";\nimport type { HttpError } from \"http-errors\";\nimport createHttpError from \"http-errors\";\n\nimport type { Adapter, FakePrismaClient, 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, PrismaClient> {\n manyRelations?: {\n [key in M]?: string[];\n };\n models?: M[];\n primaryKey?: string;\n prismaClient: PrismaClient;\n}\n\ntype Delegate<T> = Record<PrismaAction, (...arguments_: any[]) => Promise<T>>;\n\nexport default class PrismaAdapter<T, M extends string, PrismaClient> implements Adapter<T, PrismaParsedQueryParameters, M> {\n private readonly ctorModels?: M[];\n\n private dmmf: any;\n\n private readonly getPrismaClientModels = async (): Promise<Record<string, object>> => {\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._dmmf !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = this.prismaClient._dmmf;\n\n return this.dmmf?.mappingsMap as Record<string, object>;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._getDmmf !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = await this.prismaClient._getDmmf();\n\n return this.dmmf.mappingsMap as Record<string, object>;\n }\n\n throw new Error(\"Couldn't get prisma client models\");\n };\n\n private readonly manyRelations: {\n [key in M]?: string[];\n };\n\n private readonly primaryKey: string;\n\n private readonly prismaClient: FakePrismaClient & PrismaClient;\n\n public models?: M[];\n\n public constructor({ manyRelations = {}, models, primaryKey = \"id\", prismaClient }: AdapterCtorArguments<M, FakePrismaClient & PrismaClient>) {\n this.prismaClient = prismaClient;\n this.primaryKey = primaryKey;\n this.manyRelations = manyRelations;\n this.ctorModels = models;\n }\n\n private getPrismaDelegate(resourceName: M): Delegate<T> {\n return this.prismaClient[`${resourceName.charAt(0).toLowerCase()}${resourceName.slice(1)}`] as Delegate<T>;\n }\n\n public get client(): PrismaClient {\n return this.prismaClient;\n }\n\n public async connect(): Promise<void> {\n this.prismaClient.$connect();\n }\n\n public async create(resourceName: M, data: unknown, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).create({\n data,\n include: query.include,\n select: query.select,\n });\n }\n\n public async delete(resourceName: M, resourceId: number | string, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).delete({\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n\n public async disconnect(): Promise<void> {\n await this.prismaClient.$disconnect();\n }\n\n public async getAll(resourceName: M, query: PrismaParsedQueryParameters): Promise<T[]> {\n // @ts-expect-error\n return (await this.getPrismaDelegate(resourceName).findMany({\n cursor: query.cursor,\n distinct: query.distinct,\n include: query.include,\n orderBy: query.orderBy,\n select: query.select,\n skip: query.skip,\n take: query.take,\n where: query.where,\n })) as T[];\n }\n\n public getModels(): M[] {\n return this.models ?? [];\n }\n\n public async getOne(resourceName: M, resourceId: number | string, 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-expect-error\n return await findFunction({\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n\n public async getPaginationData(resourceName: M, query: PrismaParsedQueryParameters): Promise<PaginationData> {\n // @ts-expect-error\n const total: number = await this.getPrismaDelegate(resourceName).count({\n distinct: query.distinct,\n where: query.where,\n });\n\n return {\n page: Math.ceil((query.skip ?? 0) / (query.take ?? 0)) + 1,\n pageCount: Math.ceil(total / (query.take ?? 0)),\n total,\n };\n }\n\n // eslint-disable-next-line class-methods-use-this\n public handleError(error: Error): HttpError {\n console.error(error);\n\n if (error instanceof Error && error.stack) {\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 public async init(): Promise<void> {\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 this.models = models ?? (Object.keys(prismaDmmfModels) as M[]); // Retrieve model names from dmmf for prisma v2\n }\n\n public async mapModelsToRouteNames(): Promise<{ [key in M]?: string }> {\n return modelsToRouteNames(await this.getPrismaClientModels(), this.getModels());\n }\n\n public parseQuery(resourceName: M, query: ParsedQueryParameters): PrismaParsedQueryParameters {\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 public async update(resourceName: M, resourceId: number | string, data: unknown, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).update({\n data,\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n}\n","type RouteMap<M extends string> = { [key in M]?: string };\n\nconst modelsToRouteNames = <M extends string = string>(mappingsMap: Record<string, object>, models: M[]): RouteMap<M> => {\n const routesMap: RouteMap<M> = {};\n\n models.forEach((model) => {\n // @ts-expect-error\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: unknown): 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 = (cursor: Record<string, boolean | number | string>): 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] = value as boolean | number | string;\n }\n });\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\"cursor needs to be an object with exactly 1 property with a primitive value\");\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>(select: RecursiveField, fieldName: T): PrismaRecursive<T> => {\n const parsed: PrismaRecursive<T> = {};\n\n Object.keys(select).forEach((field) => {\n parsed[field] =\n select[field] === true\n ? true\n : ({\n [fieldName]: parsePrismaRecursiveField(select[field] as RecursiveField, fieldName),\n } as Record<T, PrismaRecursive<T>>);\n });\n\n return parsed;\n};\n\nexport default parsePrismaRecursiveField;\n","import type { Condition, SearchCondition, WhereCondition, WhereField, WhereOperator } from \"../../../types.d\";\nimport isPrimitive from \"../../../utils/is-primitive\";\nimport type { PrismaFieldFilter, PrismaRelationFilter, PrismaWhereField, PrismaWhereOperator } from \"../types.d\";\n\nconst isObject = (a: any) => a instanceof Object;\n\nconst operatorsAssociation: {\n [key in WhereOperator]?: PrismaWhereOperator;\n} = {\n $cont: \"contains\",\n $ends: \"endsWith\",\n $eq: \"equals\",\n $gt: \"gt\",\n $gte: \"gte\",\n $in: \"in\",\n $lt: \"lt\",\n $lte: \"lte\",\n $neq: \"not\",\n $notin: \"notIn\",\n $starts: \"startsWith\",\n};\n\n// eslint-disable-next-line security/detect-unsafe-regex,regexp/no-useless-flag\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 as SearchCondition;\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): Record<string, Condition> | undefined => {\n const operator = Object.keys(value)[0];\n const prismaOperator: PrismaWhereOperator | undefined = 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 // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n value: Condition | Date | WhereCondition | boolean | number | string,\n key: string,\n parsed: PrismaWhereField,\n manyRelations: string[],\n) => {\n // Reverse the keys so that we can format our object by nesting\n // eslint-disable-next-line etc/no-assign-mutated-array\n const fields = key.split(\".\").reverse();\n\n let formatFields: Record<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 // eslint-disable-next-line etc/no-assign-mutated-array\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...(oldParsed?.some as object),\n ...formatFields[initialFieldKey]?.some,\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\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nconst basicParse = (value: Condition | Date | WhereCondition | boolean | number | string, 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 { createPaginationMetaSchemaObject } from \"@visulima/pagination\";\nimport { 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: object | string) => {\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 private readonly schemaInputTypes: Map<string, any> = new Map<string, any>();\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n public constructor(private readonly dmmf: any) {}\n\n // eslint-disable-next-line class-methods-use-this,@typescript-eslint/explicit-module-boundary-types\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 items: {\n $ref: reference,\n },\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n };\n }\n\n return { $ref: reference };\n }\n\n const type = getJSONSchemaScalar(inputType.type);\n\n if (inputType.isList) {\n return {\n items: {\n type,\n },\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n };\n }\n\n return { type };\n }\n\n public getExampleModelsSchemas(\n modelNames: string[],\n schemas: Record<string, OpenAPIV3.SchemaObject>,\n ): Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> {\n const referenceToSchema = (reference: string) => {\n const name = reference.replace(\"#/components/schemas/\", \"\");\n const model = schemas[name] as OpenAPIV3.SchemaObject;\n\n const values: Record<string, object[] | string> = {};\n\n Object.entries((model.properties as OpenAPIV3.SchemaObject | undefined) ?? {}).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: Record<string, OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject>) => {\n const values: Record<string, object[] | object | string> = {};\n\n Object.entries(objectProperties).forEach(([key, value]) => {\n values[key] =\n (value as { $ref?: string }).$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: Record<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 // eslint-disable-next-line unicorn/no-array-reduce\n return modelNames.reduce((accumulator, modelName) => {\n const value: Record<string, object[] | object | string> = {};\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] as OpenAPIV3.SchemaObject;\n const meta: Record<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 [`${modelName}s`]: {\n value: [value],\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginatedModelsSchemas(modelNames: string[]): Record<string, OpenAPIV3.SchemaObject> {\n // eslint-disable-next-line unicorn/no-array-reduce\n return modelNames.reduce((accumulator, modelName) => {\n return {\n ...accumulator,\n [`${modelName}Page`]: {\n properties: {\n data: {\n items: {\n $ref: formatSchemaReference(modelName),\n },\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n },\n meta: {\n $ref: formatSchemaReference(PAGINATION_SCHEMA_NAME),\n },\n },\n type: \"object\",\n xml: {\n name: `${modelName}Page`,\n },\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginationDataSchema(): Record<string, OpenAPIV3.SchemaObject> {\n return createPaginationMetaSchemaObject(PAGINATION_SCHEMA_NAME);\n }\n\n public parseInputTypes(models: string[]): Record<string, JSONSchema7> {\n // eslint-disable-next-line sonarjs/cognitive-complexity,unicorn/no-array-reduce\n const definitions = models.reduce((accumulator: Record<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 const dataFields = this.dmmf.mutationType.fieldMap[method].args[0].inputTypes[0].type.fields;\n const requiredProperties: string[] = [];\n // eslint-disable-next-line unicorn/no-array-reduce\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-expect-error\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 nullable: true,\n type: schemaType.filter((type: string) => type !== \"null\"),\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 // TODO: find the correct type\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return propertiesAccumulator;\n }, {});\n\n accumulator[schemaName] = {\n properties,\n type: \"object\",\n xml: {\n name: schemaName,\n },\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 properties: value,\n type: \"object\",\n xml: {\n name: key,\n },\n };\n });\n\n return definitions;\n }\n\n public parseModels(): Record<string, JSONSchema7> {\n const modelsDefinitions = transformDMMF(this.dmmf).definitions as Record<string, JSONSchema7>;\n\n Object.keys(modelsDefinitions).forEach((definition: number | string) => {\n // @TODO: added the correct type\n // @ts-expect-error\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 sonarjs/cognitive-complexity,@typescript-eslint/explicit-module-boundary-types\n public parseObjectInputType(fieldType: any): { $ref?: string; type?: string } {\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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\nexport default PrismaJsonSchemaParser;\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatSchemaReference = (schemaName: string): 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>(modelNames: M[], models?: ModelsOptions<M>, defaultExposeStrategy: \"all\" | \"none\" = \"all\"): Routes<M> =>\n // eslint-disable-next-line unicorn/no-array-reduce\n 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 distinct: {\n description: \"Fields to distinctively retrieve\",\n name: \"distinct\",\n schema: {\n type: \"string\",\n },\n },\n include: {\n description: \"Include relations, same as select\",\n name: \"include\",\n schema: {\n type: \"string\",\n },\n },\n limit: {\n description: \"Maximum number of elements to retrieve\",\n name: \"limit\",\n schema: {\n minimum: 0,\n type: \"integer\",\n },\n },\n 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 name: \"orderBy\",\n schema: {\n type: \"string\",\n },\n },\n page: {\n description: \"Page number. Use only for pagination.\",\n name: \"page\",\n schema: {\n minimum: 1,\n type: \"integer\",\n },\n },\n select: {\n description: \"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts\",\n name: \"select\",\n schema: {\n type: \"string\",\n },\n },\n skip: {\n description: \"Number of rows to skip\",\n name: \"skip\",\n schema: {\n minimum: 0,\n type: \"integer\",\n },\n },\n where: {\n description: 'Fields to filter. See <a href=\"https://next-crud.js.org/query-params#where\">the docs</a>',\n name: \"where\",\n schema: {\n type: \"string\",\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[] = []): SwaggerParameter[] => {\n if (routeType === RouteType.READ_ALL) {\n return [...listQueryParameters, ...additionalQueryParameters].filter(Boolean) as SwaggerParameter[];\n }\n\n return [...commonQueryParameters, ...additionalQueryParameters].filter(Boolean) as SwaggerParameter[];\n};\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatExampleReference = (schemaName: string): 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 hasId?: boolean;\n modelName: M;\n modelsConfig?: SwaggerModelsConfig<M>;\n routeTypes: RouteType[];\n tag: string;\n}\n\ntype HttpMethod = \"delete\" | \"get\" | \"post\" | \"put\";\n\nconst generateContentForSchema = (schemaName: string, isArray?: boolean) => {\n if (isArray) {\n return {\n items: {\n $ref: formatSchemaReference(schemaName),\n },\n type: \"array\",\n };\n }\n\n return {\n $ref: formatSchemaReference(schemaName),\n };\n};\n\nconst generateSwaggerResponse = (routeType: RouteType, modelName: string): { content: any; statusCode: number } | undefined => {\n if (routeType === RouteType.CREATE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} created`,\n },\n statusCode: 201,\n };\n }\n\n if (routeType === RouteType.DELETE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item deleted`,\n },\n statusCode: 200,\n };\n }\n\n if (routeType === RouteType.READ_ALL) {\n return {\n content: {\n content: {\n \"application/json\": {\n examples: {\n Default: {\n $ref: formatExampleReference(`${modelName}s`),\n },\n Pagination: {\n $ref: formatExampleReference(`${modelName}Page`),\n },\n },\n schema: {\n oneOf: [generateContentForSchema(modelName, true), generateContentForSchema(`${modelName}Page`, false)],\n },\n },\n },\n description: `${modelName} list retrieved`,\n },\n statusCode: 200,\n };\n }\n\n if (routeType === RouteType.READ_ONE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item retrieved`,\n },\n statusCode: 200,\n };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (routeType === RouteType.UPDATE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item updated`,\n },\n statusCode: 200,\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 as string} was not found.`);\n }\n }\n};\n\nconst generateSwaggerPathObject = <M extends string>({\n hasId,\n modelName,\n modelsConfig,\n routeTypes,\n tag,\n}: GenerateSwaggerPathObjectParameters<M>): Record<string, any> => {\n const methods: Record<string, any> = {};\n\n routeTypes.forEach((routeType) => {\n if (routeTypes.includes(routeType)) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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] = {\n parameters: getQueryParameters(routeType).map((queryParameter) => {\n return { ...queryParameter, in: \"query\" };\n }),\n\n responses: {\n [response.statusCode]: response.content,\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...modelsConfig?.[modelName]?.routeTypes?.[routeType]?.responses,\n },\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n summary: modelsConfig?.[modelName]?.routeTypes?.[routeType]?.summary,\n tags: [tag],\n };\n\n if (hasId) {\n methods[method].parameters.push({\n description: `ID of the ${modelName}`,\n in: \"path\",\n name: \"id\",\n required: true,\n schema: {\n type: \"string\",\n },\n });\n }\n\n if (routeType === RouteType.UPDATE) {\n methods[method].requestBody = generateRequestBody(\"Update\", returnType);\n } else if (routeType === RouteType.CREATE) {\n methods[method].requestBody = generateRequestBody(\"Create\", returnType);\n }\n }\n });\n\n return methods;\n};\n\ninterface GetSwaggerPathsParameters<M extends string> {\n models?: ModelsOptions<M>;\n modelsConfig?: SwaggerModelsConfig<M>;\n routes: Routes<M>;\n routesMap?: { [key in M]?: string };\n}\n\nconst getSwaggerPaths = <M extends string>({ models, modelsConfig, routes, routesMap }: GetSwaggerPathsParameters<M>): Record<string, any> =>\n // eslint-disable-next-line unicorn/no-array-reduce\n Object.keys(routes).reduce((accumulator: Record<string, any>, value: M | string) => {\n const routeTypes = routes[value] as RouteType[];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const resourceName = models?.[value]?.name ? (models[value] as ModelOption).name : routesMap?.[value as M] ?? value;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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 modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n tag,\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 hasId: true,\n modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n tag,\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[] =>\n modelNames.map((modelName) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (modelsConfig?.[modelName]?.tag) {\n return (modelsConfig[modelName] as ModelsConfig).tag;\n }\n\n return {\n name: modelName,\n };\n });\n\nexport default getSwaggerTags;\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nimport modelsToRouteNames from \"../../../adapter/prisma/utils/models-to-route-names\";\nimport type { FakePrismaClient, 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: Record<string, OpenAPIV3.ExampleObject>): OpenAPIV3.PathsObject => {\n // eslint-disable-next-line sonarjs/cognitive-complexity\n Object.values(swaggerPaths).forEach((pathSpec) => {\n Object.values(pathSpec as OpenAPIV3.OperationObject & OpenAPIV3.PathsObject).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((responseSpec as OpenAPIV3.ResponseObject).content as Record<string, OpenAPIV3.MediaTypeObject>).forEach(\n (contentSpec) => {\n if (typeof contentSpec.example === \"string\") {\n const example = contentSpec.example.replace(\"#/components/examples/\", \"\");\n\n if (examples[example as keyof typeof examples]?.value !== undefined) {\n // eslint-disable-next-line no-param-reassign\n contentSpec.example = (examples[example as keyof typeof examples] as typeof examples)[\"value\"];\n }\n }\n },\n );\n }\n });\n }\n });\n });\n\n return swaggerPaths;\n};\n\nconst modelsToOpenApi = async <M extends string = string, PrismaClient = FakePrismaClient>({\n crud = { models: {} },\n defaultExposeStrategy = \"all\",\n models: ctorModels,\n prismaClient,\n swagger = { allowedMediaTypes: { \"application/json\": true }, models: {} },\n}: ModelsToOpenApiParameters<M, PrismaClient>): Promise<{\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>;\n paths: OpenAPIV3.PathsObject;\n schemas: Record<string, OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject>;\n tags: OpenAPIV3.TagObject[];\n}> => {\n let dmmf: any;\n let prismaDmmfModels: any;\n\n // eslint-disable-next-line no-underscore-dangle\n if (prismaClient._dmmf !== undefined) {\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 !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n dmmf = await prismaClient._getDmmf();\n prismaDmmfModels = dmmf.mappingsMap;\n }\n\n if (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 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 models: crud.models,\n modelsConfig: swagger.models,\n routes: swaggerRoutes,\n routesMap: modelsToRouteNames(prismaDmmfModels, models),\n });\n const schemas = JSON.parse(schema.replaceAll(\"#/definitions\", \"#/components/schemas\"));\n const examples = parser.getExampleModelsSchemas(dModels, schemas);\n\n return {\n examples,\n paths: overwritePathsExampleWithModel(swaggerPaths, examples as Record<string, OpenAPIV3.ExampleObject>),\n schemas,\n tags: swaggerTags,\n };\n};\n\nexport interface ModelsToOpenApiParameters<M extends string, PrismaClient> {\n crud?: {\n models: ModelsOptions<M>;\n };\n defaultExposeStrategy?: \"all\" | \"none\";\n models?: M[];\n prismaClient: FakePrismaClient & PrismaClient;\n swagger?: Partial<{\n allowedMediaTypes: Record<string, boolean>;\n models: SwaggerModelsConfig<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":["createHttpError","modelsToRouteNames","mappingsMap","models","routesMap","model","models_to_route_names_default","primitiveTypes","isPrimitive","value","is_primitive_default","parsePrismaCursor","cursor","parsed","key","parse_cursor_default","operatorsAssociation","parsePrismaOrderBy","orderBy","parse_order_by_default","parsePrismaRecursiveField","select","fieldName","field","parse_recursive_default","isObject","a","isDateString","getSearchValue","originalValue","isRelation","manyRelations","splitKey","parseSimpleField","operator","prismaOperator","parseRelation","fields","formatFields","index","basicParse","initialFieldKey","oldParsed","parseObjectCombination","object","fieldResult","parsePrismaWhere","where","parse_where_default","PrismaAdapter","primaryKey","prismaClient","resourceName","data","query","resourceId","delegate","total","error","prismaDmmfModels","createPaginationMetaSchemaObject","getJSONSchemaProperty","transformDMMF","formatSchemaReference","schemaName","format_schema_ref_default","getJSONSchemaScalar","fieldType","PAGINATION_SCHEMA_NAME","methodsNames","PrismaJsonSchemaParser","dmmf","inputType","reference","type","modelNames","schemas","referenceToSchema","name","values","v","arrayItemsToSchema","objectPropertiesToSchema","objectProperties","items","accumulator","modelName","pagination","meta","definitions","method","dataFields","requiredProperties","properties","propertiesAccumulator","schema","schemaType","typeName","modelsDefinitions","definition","property","fieldData","nullable","anyOf","inputTypeData","json_schema_parser_default","getModelsAccessibleRoutes","defaultExposeStrategy","get_accessible_routes_default","get_models_accessible_routes_default","queryParameters","commonQueryParameters","listQueryParameters","getQueryParameters","routeType","additionalQueryParameters","formatExampleReference","format_example_ref_default","generateContentForSchema","isArray","generateSwaggerResponse","generateRequestBody","schemaStartName","getRouteTypeMethod","generateSwaggerPathObject","hasId","modelsConfig","routeTypes","tag","methods","returnType","response","queryParameter","getSwaggerPaths","routes","path","routeTypesToUse","get_swagger_paths_default","getSwaggerTags","get_swagger_tags_default","overwritePathsExampleWithModel","swaggerPaths","examples","pathSpec","methodSpec","responseSpec","contentSpec","example","modelsToOpenApi","crud","ctorModels","swagger","parser","dModels","swaggerRoutes","swaggerTags","prisma_default"],"mappings":"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","sourcesContent":["import type {\n // @ts-expect-error\n PrismaAction,\n} from \"@prisma/client\";\nimport type { HttpError } from \"http-errors\";\nimport createHttpError from \"http-errors\";\n\nimport type { Adapter, FakePrismaClient, 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, PrismaClient> {\n manyRelations?: {\n [key in M]?: string[];\n };\n models?: M[];\n primaryKey?: string;\n prismaClient: PrismaClient;\n}\n\ntype Delegate<T> = Record<PrismaAction, (...arguments_: any[]) => Promise<T>>;\n\nexport default class PrismaAdapter<T, M extends string, PrismaClient> implements Adapter<T, PrismaParsedQueryParameters, M> {\n private readonly ctorModels?: M[];\n\n private dmmf: any;\n\n private readonly getPrismaClientModels = async (): Promise<Record<string, object>> => {\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._dmmf !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = this.prismaClient._dmmf;\n\n return this.dmmf?.mappingsMap as Record<string, object>;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._getDmmf !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = await this.prismaClient._getDmmf();\n\n return this.dmmf.mappingsMap as Record<string, object>;\n }\n\n throw new Error(\"Couldn't get prisma client models\");\n };\n\n private readonly manyRelations: {\n [key in M]?: string[];\n };\n\n private readonly primaryKey: string;\n\n private readonly prismaClient: FakePrismaClient & PrismaClient;\n\n public models?: M[];\n\n public constructor({ manyRelations = {}, models, primaryKey = \"id\", prismaClient }: AdapterCtorArguments<M, FakePrismaClient & PrismaClient>) {\n this.prismaClient = prismaClient;\n this.primaryKey = primaryKey;\n this.manyRelations = manyRelations;\n this.ctorModels = models;\n }\n\n private getPrismaDelegate(resourceName: M): Delegate<T> {\n return this.prismaClient[`${resourceName.charAt(0).toLowerCase()}${resourceName.slice(1)}`] as Delegate<T>;\n }\n\n public get client(): PrismaClient {\n return this.prismaClient;\n }\n\n public async connect(): Promise<void> {\n this.prismaClient.$connect();\n }\n\n public async create(resourceName: M, data: unknown, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).create({\n data,\n include: query.include,\n select: query.select,\n });\n }\n\n public async delete(resourceName: M, resourceId: number | string, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).delete({\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n\n public async disconnect(): Promise<void> {\n await this.prismaClient.$disconnect();\n }\n\n public async getAll(resourceName: M, query: PrismaParsedQueryParameters): Promise<T[]> {\n // @ts-expect-error\n return (await this.getPrismaDelegate(resourceName).findMany({\n cursor: query.cursor,\n distinct: query.distinct,\n include: query.include,\n orderBy: query.orderBy,\n select: query.select,\n skip: query.skip,\n take: query.take,\n where: query.where,\n })) as T[];\n }\n\n public getModels(): M[] {\n return this.models ?? [];\n }\n\n public async getOne(resourceName: M, resourceId: number | string, 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-expect-error\n return await findFunction({\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n\n public async getPaginationData(resourceName: M, query: PrismaParsedQueryParameters): Promise<PaginationData> {\n // @ts-expect-error\n const total: number = await this.getPrismaDelegate(resourceName).count({\n distinct: query.distinct,\n where: query.where,\n });\n\n return {\n page: Math.ceil((query.skip ?? 0) / (query.take ?? 0)) + 1,\n pageCount: Math.ceil(total / (query.take ?? 0)),\n total,\n };\n }\n\n // eslint-disable-next-line class-methods-use-this\n public handleError(error: Error): HttpError {\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 public async init(): Promise<void> {\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 this.models = models ?? (Object.keys(prismaDmmfModels) as M[]); // Retrieve model names from dmmf for prisma v2\n }\n\n public async mapModelsToRouteNames(): Promise<{ [key in M]?: string }> {\n return modelsToRouteNames(await this.getPrismaClientModels(), this.getModels());\n }\n\n public parseQuery(resourceName: M, query: ParsedQueryParameters): PrismaParsedQueryParameters {\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 public async update(resourceName: M, resourceId: number | string, data: unknown, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).update({\n data,\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n}\n","type RouteMap<M extends string> = { [key in M]?: string };\n\nconst modelsToRouteNames = <M extends string = string>(mappingsMap: Record<string, object>, models: M[]): RouteMap<M> => {\n const routesMap: RouteMap<M> = {};\n\n models.forEach((model) => {\n // @ts-expect-error\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: unknown): 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 = (cursor: Record<string, boolean | number | string>): 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] = value as boolean | number | string;\n }\n });\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\"cursor needs to be an object with exactly 1 property with a primitive value\");\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>(select: RecursiveField, fieldName: T): PrismaRecursive<T> => {\n const parsed: PrismaRecursive<T> = {};\n\n Object.keys(select).forEach((field) => {\n parsed[field] =\n select[field] === true\n ? true\n : ({\n [fieldName]: parsePrismaRecursiveField(select[field] as RecursiveField, fieldName),\n } as Record<T, PrismaRecursive<T>>);\n });\n\n return parsed;\n};\n\nexport default parsePrismaRecursiveField;\n","import type { Condition, SearchCondition, WhereCondition, WhereField, WhereOperator } from \"../../../types.d\";\nimport isPrimitive from \"../../../utils/is-primitive\";\nimport type { PrismaFieldFilter, PrismaRelationFilter, PrismaWhereField, PrismaWhereOperator } from \"../types.d\";\n\nconst isObject = (a: any) => a instanceof Object;\n\nconst operatorsAssociation: {\n [key in WhereOperator]?: PrismaWhereOperator;\n} = {\n $cont: \"contains\",\n $ends: \"endsWith\",\n $eq: \"equals\",\n $gt: \"gt\",\n $gte: \"gte\",\n $in: \"in\",\n $lt: \"lt\",\n $lte: \"lte\",\n $neq: \"not\",\n $notin: \"notIn\",\n $starts: \"startsWith\",\n};\n\n// eslint-disable-next-line security/detect-unsafe-regex,regexp/no-useless-flag\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 as SearchCondition;\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): Record<string, Condition> | undefined => {\n const operator = Object.keys(value)[0];\n const prismaOperator: PrismaWhereOperator | undefined = 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 // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n value: Condition | Date | WhereCondition | boolean | number | string,\n key: string,\n parsed: PrismaWhereField,\n manyRelations: string[],\n) => {\n // Reverse the keys so that we can format our object by nesting\n // eslint-disable-next-line etc/no-assign-mutated-array\n const fields = key.split(\".\").reverse();\n\n let formatFields: Record<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 // eslint-disable-next-line etc/no-assign-mutated-array\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...(oldParsed?.some as object),\n ...formatFields[initialFieldKey]?.some,\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\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nconst basicParse = (value: Condition | Date | WhereCondition | boolean | number | string, 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 { createPaginationMetaSchemaObject } from \"@visulima/pagination\";\nimport { 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: object | string) => {\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 private readonly schemaInputTypes: Map<string, any> = new Map<string, any>();\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n public constructor(private readonly dmmf: any) {}\n\n // eslint-disable-next-line class-methods-use-this,@typescript-eslint/explicit-module-boundary-types\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 items: {\n $ref: reference,\n },\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n };\n }\n\n return { $ref: reference };\n }\n\n const type = getJSONSchemaScalar(inputType.type);\n\n if (inputType.isList) {\n return {\n items: {\n type,\n },\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n };\n }\n\n return { type };\n }\n\n public getExampleModelsSchemas(\n modelNames: string[],\n schemas: Record<string, OpenAPIV3.SchemaObject>,\n ): Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> {\n const referenceToSchema = (reference: string) => {\n const name = reference.replace(\"#/components/schemas/\", \"\");\n const model = schemas[name] as OpenAPIV3.SchemaObject;\n\n const values: Record<string, object[] | string> = {};\n\n Object.entries((model.properties as OpenAPIV3.SchemaObject | undefined) ?? {}).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: Record<string, OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject>) => {\n const values: Record<string, object[] | object | string> = {};\n\n Object.entries(objectProperties).forEach(([key, value]) => {\n values[key] =\n (value as { $ref?: string }).$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: Record<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 // eslint-disable-next-line unicorn/no-array-reduce\n return modelNames.reduce((accumulator, modelName) => {\n const value: Record<string, object[] | object | string> = {};\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] as OpenAPIV3.SchemaObject;\n const meta: Record<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 [`${modelName}s`]: {\n value: [value],\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginatedModelsSchemas(modelNames: string[]): Record<string, OpenAPIV3.SchemaObject> {\n // eslint-disable-next-line unicorn/no-array-reduce\n return modelNames.reduce((accumulator, modelName) => {\n return {\n ...accumulator,\n [`${modelName}Page`]: {\n properties: {\n data: {\n items: {\n $ref: formatSchemaReference(modelName),\n },\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n },\n meta: {\n $ref: formatSchemaReference(PAGINATION_SCHEMA_NAME),\n },\n },\n type: \"object\",\n xml: {\n name: `${modelName}Page`,\n },\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginationDataSchema(): Record<string, OpenAPIV3.SchemaObject> {\n return createPaginationMetaSchemaObject(PAGINATION_SCHEMA_NAME);\n }\n\n public parseInputTypes(models: string[]): Record<string, JSONSchema7> {\n // eslint-disable-next-line sonarjs/cognitive-complexity,unicorn/no-array-reduce\n const definitions = models.reduce((accumulator: Record<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 const dataFields = this.dmmf.mutationType.fieldMap[method].args[0].inputTypes[0].type.fields;\n const requiredProperties: string[] = [];\n // eslint-disable-next-line unicorn/no-array-reduce\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-expect-error\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 nullable: true,\n type: schemaType.filter((type: string) => type !== \"null\"),\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 // TODO: find the correct type\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return propertiesAccumulator;\n }, {});\n\n accumulator[schemaName] = {\n properties,\n type: \"object\",\n xml: {\n name: schemaName,\n },\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 properties: value,\n type: \"object\",\n xml: {\n name: key,\n },\n };\n });\n\n return definitions;\n }\n\n public parseModels(): Record<string, JSONSchema7> {\n const modelsDefinitions = transformDMMF(this.dmmf).definitions as Record<string, JSONSchema7>;\n\n Object.keys(modelsDefinitions).forEach((definition: number | string) => {\n // @TODO: added the correct type\n // @ts-expect-error\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 sonarjs/cognitive-complexity,@typescript-eslint/explicit-module-boundary-types\n public parseObjectInputType(fieldType: any): { $ref?: string; type?: string } {\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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\nexport default PrismaJsonSchemaParser;\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatSchemaReference = (schemaName: string): 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>(modelNames: M[], models?: ModelsOptions<M>, defaultExposeStrategy: \"all\" | \"none\" = \"all\"): Routes<M> =>\n // eslint-disable-next-line unicorn/no-array-reduce\n 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 distinct: {\n description: \"Fields to distinctively retrieve\",\n name: \"distinct\",\n schema: {\n type: \"string\",\n },\n },\n include: {\n description: \"Include relations, same as select\",\n name: \"include\",\n schema: {\n type: \"string\",\n },\n },\n limit: {\n description: \"Maximum number of elements to retrieve\",\n name: \"limit\",\n schema: {\n minimum: 0,\n type: \"integer\",\n },\n },\n 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 name: \"orderBy\",\n schema: {\n type: \"string\",\n },\n },\n page: {\n description: \"Page number. Use only for pagination.\",\n name: \"page\",\n schema: {\n minimum: 1,\n type: \"integer\",\n },\n },\n select: {\n description: \"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts\",\n name: \"select\",\n schema: {\n type: \"string\",\n },\n },\n skip: {\n description: \"Number of rows to skip\",\n name: \"skip\",\n schema: {\n minimum: 0,\n type: \"integer\",\n },\n },\n where: {\n description: 'Fields to filter. See <a href=\"https://next-crud.js.org/query-params#where\">the docs</a>',\n name: \"where\",\n schema: {\n type: \"string\",\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[] = []): SwaggerParameter[] => {\n if (routeType === RouteType.READ_ALL) {\n return [...listQueryParameters, ...additionalQueryParameters].filter(Boolean) as SwaggerParameter[];\n }\n\n return [...commonQueryParameters, ...additionalQueryParameters].filter(Boolean) as SwaggerParameter[];\n};\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatExampleReference = (schemaName: string): 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 hasId?: boolean;\n modelName: M;\n modelsConfig?: SwaggerModelsConfig<M>;\n routeTypes: RouteType[];\n tag: string;\n}\n\ntype HttpMethod = \"delete\" | \"get\" | \"post\" | \"put\";\n\nconst generateContentForSchema = (schemaName: string, isArray?: boolean) => {\n if (isArray) {\n return {\n items: {\n $ref: formatSchemaReference(schemaName),\n },\n type: \"array\",\n };\n }\n\n return {\n $ref: formatSchemaReference(schemaName),\n };\n};\n\nconst generateSwaggerResponse = (routeType: RouteType, modelName: string): { content: any; statusCode: number } | undefined => {\n if (routeType === RouteType.CREATE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} created`,\n },\n statusCode: 201,\n };\n }\n\n if (routeType === RouteType.DELETE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item deleted`,\n },\n statusCode: 200,\n };\n }\n\n if (routeType === RouteType.READ_ALL) {\n return {\n content: {\n content: {\n \"application/json\": {\n examples: {\n Default: {\n $ref: formatExampleReference(`${modelName}s`),\n },\n Pagination: {\n $ref: formatExampleReference(`${modelName}Page`),\n },\n },\n schema: {\n oneOf: [generateContentForSchema(modelName, true), generateContentForSchema(`${modelName}Page`, false)],\n },\n },\n },\n description: `${modelName} list retrieved`,\n },\n statusCode: 200,\n };\n }\n\n if (routeType === RouteType.READ_ONE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item retrieved`,\n },\n statusCode: 200,\n };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (routeType === RouteType.UPDATE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item updated`,\n },\n statusCode: 200,\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 as string} was not found.`);\n }\n }\n};\n\nconst generateSwaggerPathObject = <M extends string>({\n hasId,\n modelName,\n modelsConfig,\n routeTypes,\n tag,\n}: GenerateSwaggerPathObjectParameters<M>): Record<string, any> => {\n const methods: Record<string, any> = {};\n\n routeTypes.forEach((routeType) => {\n if (routeTypes.includes(routeType)) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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] = {\n parameters: getQueryParameters(routeType).map((queryParameter) => {\n return { ...queryParameter, in: \"query\" };\n }),\n\n responses: {\n [response.statusCode]: response.content,\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...modelsConfig?.[modelName]?.routeTypes?.[routeType]?.responses,\n },\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n summary: modelsConfig?.[modelName]?.routeTypes?.[routeType]?.summary,\n tags: [tag],\n };\n\n if (hasId) {\n methods[method].parameters.push({\n description: `ID of the ${modelName}`,\n in: \"path\",\n name: \"id\",\n required: true,\n schema: {\n type: \"string\",\n },\n });\n }\n\n if (routeType === RouteType.UPDATE) {\n methods[method].requestBody = generateRequestBody(\"Update\", returnType);\n } else if (routeType === RouteType.CREATE) {\n methods[method].requestBody = generateRequestBody(\"Create\", returnType);\n }\n }\n });\n\n return methods;\n};\n\ninterface GetSwaggerPathsParameters<M extends string> {\n models?: ModelsOptions<M>;\n modelsConfig?: SwaggerModelsConfig<M>;\n routes: Routes<M>;\n routesMap?: { [key in M]?: string };\n}\n\nconst getSwaggerPaths = <M extends string>({ models, modelsConfig, routes, routesMap }: GetSwaggerPathsParameters<M>): Record<string, any> =>\n // eslint-disable-next-line unicorn/no-array-reduce\n Object.keys(routes).reduce((accumulator: Record<string, any>, value: M | string) => {\n const routeTypes = routes[value] as RouteType[];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const resourceName = models?.[value]?.name ? (models[value] as ModelOption).name : routesMap?.[value as M] ?? value;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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 modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n tag,\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 hasId: true,\n modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n tag,\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[] =>\n modelNames.map((modelName) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (modelsConfig?.[modelName]?.tag) {\n return (modelsConfig[modelName] as ModelsConfig).tag;\n }\n\n return {\n name: modelName,\n };\n });\n\nexport default getSwaggerTags;\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nimport modelsToRouteNames from \"../../../adapter/prisma/utils/models-to-route-names\";\nimport type { FakePrismaClient, 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: Record<string, OpenAPIV3.ExampleObject>): OpenAPIV3.PathsObject => {\n // eslint-disable-next-line sonarjs/cognitive-complexity\n Object.values(swaggerPaths).forEach((pathSpec) => {\n Object.values(pathSpec as OpenAPIV3.OperationObject & OpenAPIV3.PathsObject).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((responseSpec as OpenAPIV3.ResponseObject).content as Record<string, OpenAPIV3.MediaTypeObject>).forEach(\n (contentSpec) => {\n if (typeof contentSpec.example === \"string\") {\n const example = contentSpec.example.replace(\"#/components/examples/\", \"\");\n\n if (examples[example as keyof typeof examples]?.value !== undefined) {\n // eslint-disable-next-line no-param-reassign\n contentSpec.example = (examples[example as keyof typeof examples] as typeof examples)[\"value\"];\n }\n }\n },\n );\n }\n });\n }\n });\n });\n\n return swaggerPaths;\n};\n\nconst modelsToOpenApi = async <M extends string = string, PrismaClient = FakePrismaClient>({\n crud = { models: {} },\n defaultExposeStrategy = \"all\",\n models: ctorModels,\n prismaClient,\n swagger = { allowedMediaTypes: { \"application/json\": true }, models: {} },\n}: ModelsToOpenApiParameters<M, PrismaClient>): Promise<{\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>;\n paths: OpenAPIV3.PathsObject;\n schemas: Record<string, OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject>;\n tags: OpenAPIV3.TagObject[];\n}> => {\n let dmmf: any;\n let prismaDmmfModels: any;\n\n // eslint-disable-next-line no-underscore-dangle\n if (prismaClient._dmmf !== undefined) {\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 !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n dmmf = await prismaClient._getDmmf();\n prismaDmmfModels = dmmf.mappingsMap;\n }\n\n if (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 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 models: crud.models,\n modelsConfig: swagger.models,\n routes: swaggerRoutes,\n routesMap: modelsToRouteNames(prismaDmmfModels, models),\n });\n const schemas = JSON.parse(schema.replaceAll(\"#/definitions\", \"#/components/schemas\"));\n const examples = parser.getExampleModelsSchemas(dModels, schemas);\n\n return {\n examples,\n paths: overwritePathsExampleWithModel(swaggerPaths, examples as Record<string, OpenAPIV3.ExampleObject>),\n schemas,\n tags: swaggerTags,\n };\n};\n\nexport interface ModelsToOpenApiParameters<M extends string, PrismaClient> {\n crud?: {\n models: ModelsOptions<M>;\n };\n defaultExposeStrategy?: \"all\" | \"none\";\n models?: M[];\n prismaClient: FakePrismaClient & PrismaClient;\n swagger?: Partial<{\n allowedMediaTypes: Record<string, boolean>;\n models: SwaggerModelsConfig<M>;\n }>;\n}\n\nexport default modelsToOpenApi;\n"]}
|
package/dist/index.mjs.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":["createHttpError","modelsToRouteNames","mappingsMap","models","routesMap","model","models_to_route_names_default","primitiveTypes","isPrimitive","value","is_primitive_default","parsePrismaCursor","cursor","parsed","key","parse_cursor_default","operatorsAssociation","parsePrismaOrderBy","orderBy","parse_order_by_default","parsePrismaRecursiveField","select","fieldName","field","parse_recursive_default","isObject","a","isDateString","getSearchValue","originalValue","isRelation","manyRelations","splitKey","parseSimpleField","operator","prismaOperator","parseRelation","fields","formatFields","index","basicParse","initialFieldKey","oldParsed","parseObjectCombination","object","fieldResult","parsePrismaWhere","where","parse_where_default","PrismaAdapter","primaryKey","prismaClient","resourceName","data","query","resourceId","delegate","total","error","prismaDmmfModels","createPaginationMetaSchemaObject","getJSONSchemaProperty","transformDMMF","formatSchemaReference","schemaName","format_schema_ref_default","getJSONSchemaScalar","fieldType","PAGINATION_SCHEMA_NAME","methodsNames","PrismaJsonSchemaParser","dmmf","inputType","reference","type","modelNames","schemas","referenceToSchema","name","values","v","arrayItemsToSchema","objectPropertiesToSchema","objectProperties","items","accumulator","modelName","pagination","meta","definitions","method","dataFields","requiredProperties","properties","propertiesAccumulator","schema","schemaType","typeName","modelsDefinitions","definition","property","fieldData","nullable","anyOf","inputTypeData","json_schema_parser_default","getModelsAccessibleRoutes","defaultExposeStrategy","get_accessible_routes_default","get_models_accessible_routes_default","queryParameters","commonQueryParameters","listQueryParameters","getQueryParameters","routeType","additionalQueryParameters","formatExampleReference","format_example_ref_default","generateContentForSchema","isArray","generateSwaggerResponse","generateRequestBody","schemaStartName","getRouteTypeMethod","generateSwaggerPathObject","hasId","modelsConfig","routeTypes","tag","methods","returnType","response","queryParameter","getSwaggerPaths","routes","path","routeTypesToUse","get_swagger_paths_default","getSwaggerTags","get_swagger_tags_default","overwritePathsExampleWithModel","swaggerPaths","examples","pathSpec","methodSpec","responseSpec","contentSpec","example","modelsToOpenApi","crud","ctorModels","swagger","parser","dModels","swaggerRoutes","swaggerTags","prisma_default"],"mappings":"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","sourcesContent":["import type {\n // @ts-expect-error\n PrismaAction,\n} from \"@prisma/client\";\nimport type { HttpError } from \"http-errors\";\nimport createHttpError from \"http-errors\";\n\nimport type { Adapter, FakePrismaClient, 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, PrismaClient> {\n manyRelations?: {\n [key in M]?: string[];\n };\n models?: M[];\n primaryKey?: string;\n prismaClient: PrismaClient;\n}\n\ntype Delegate<T> = Record<PrismaAction, (...arguments_: any[]) => Promise<T>>;\n\nexport default class PrismaAdapter<T, M extends string, PrismaClient> implements Adapter<T, PrismaParsedQueryParameters, M> {\n private readonly ctorModels?: M[];\n\n private dmmf: any;\n\n private readonly getPrismaClientModels = async (): Promise<Record<string, object>> => {\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._dmmf !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = this.prismaClient._dmmf;\n\n return this.dmmf?.mappingsMap as Record<string, object>;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._getDmmf !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = await this.prismaClient._getDmmf();\n\n return this.dmmf.mappingsMap as Record<string, object>;\n }\n\n throw new Error(\"Couldn't get prisma client models\");\n };\n\n private readonly manyRelations: {\n [key in M]?: string[];\n };\n\n private readonly primaryKey: string;\n\n private readonly prismaClient: FakePrismaClient & PrismaClient;\n\n public models?: M[];\n\n public constructor({ manyRelations = {}, models, primaryKey = \"id\", prismaClient }: AdapterCtorArguments<M, FakePrismaClient & PrismaClient>) {\n this.prismaClient = prismaClient;\n this.primaryKey = primaryKey;\n this.manyRelations = manyRelations;\n this.ctorModels = models;\n }\n\n private getPrismaDelegate(resourceName: M): Delegate<T> {\n return this.prismaClient[`${resourceName.charAt(0).toLowerCase()}${resourceName.slice(1)}`] as Delegate<T>;\n }\n\n public get client(): PrismaClient {\n return this.prismaClient;\n }\n\n public async connect(): Promise<void> {\n this.prismaClient.$connect();\n }\n\n public async create(resourceName: M, data: unknown, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).create({\n data,\n include: query.include,\n select: query.select,\n });\n }\n\n public async delete(resourceName: M, resourceId: number | string, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).delete({\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n\n public async disconnect(): Promise<void> {\n await this.prismaClient.$disconnect();\n }\n\n public async getAll(resourceName: M, query: PrismaParsedQueryParameters): Promise<T[]> {\n // @ts-expect-error\n return (await this.getPrismaDelegate(resourceName).findMany({\n cursor: query.cursor,\n distinct: query.distinct,\n include: query.include,\n orderBy: query.orderBy,\n select: query.select,\n skip: query.skip,\n take: query.take,\n where: query.where,\n })) as T[];\n }\n\n public getModels(): M[] {\n return this.models ?? [];\n }\n\n public async getOne(resourceName: M, resourceId: number | string, 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-expect-error\n return await findFunction({\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n\n public async getPaginationData(resourceName: M, query: PrismaParsedQueryParameters): Promise<PaginationData> {\n // @ts-expect-error\n const total: number = await this.getPrismaDelegate(resourceName).count({\n distinct: query.distinct,\n where: query.where,\n });\n\n return {\n page: Math.ceil((query.skip ?? 0) / (query.take ?? 0)) + 1,\n pageCount: Math.ceil(total / (query.take ?? 0)),\n total,\n };\n }\n\n // eslint-disable-next-line class-methods-use-this\n public handleError(error: Error): HttpError {\n console.error(error);\n\n if (error instanceof Error && error.stack) {\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 public async init(): Promise<void> {\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 this.models = models ?? (Object.keys(prismaDmmfModels) as M[]); // Retrieve model names from dmmf for prisma v2\n }\n\n public async mapModelsToRouteNames(): Promise<{ [key in M]?: string }> {\n return modelsToRouteNames(await this.getPrismaClientModels(), this.getModels());\n }\n\n public parseQuery(resourceName: M, query: ParsedQueryParameters): PrismaParsedQueryParameters {\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 public async update(resourceName: M, resourceId: number | string, data: unknown, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).update({\n data,\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n}\n","type RouteMap<M extends string> = { [key in M]?: string };\n\nconst modelsToRouteNames = <M extends string = string>(mappingsMap: Record<string, object>, models: M[]): RouteMap<M> => {\n const routesMap: RouteMap<M> = {};\n\n models.forEach((model) => {\n // @ts-expect-error\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: unknown): 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 = (cursor: Record<string, boolean | number | string>): 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] = value as boolean | number | string;\n }\n });\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\"cursor needs to be an object with exactly 1 property with a primitive value\");\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>(select: RecursiveField, fieldName: T): PrismaRecursive<T> => {\n const parsed: PrismaRecursive<T> = {};\n\n Object.keys(select).forEach((field) => {\n parsed[field] =\n select[field] === true\n ? true\n : ({\n [fieldName]: parsePrismaRecursiveField(select[field] as RecursiveField, fieldName),\n } as Record<T, PrismaRecursive<T>>);\n });\n\n return parsed;\n};\n\nexport default parsePrismaRecursiveField;\n","import type { Condition, SearchCondition, WhereCondition, WhereField, WhereOperator } from \"../../../types.d\";\nimport isPrimitive from \"../../../utils/is-primitive\";\nimport type { PrismaFieldFilter, PrismaRelationFilter, PrismaWhereField, PrismaWhereOperator } from \"../types.d\";\n\nconst isObject = (a: any) => a instanceof Object;\n\nconst operatorsAssociation: {\n [key in WhereOperator]?: PrismaWhereOperator;\n} = {\n $cont: \"contains\",\n $ends: \"endsWith\",\n $eq: \"equals\",\n $gt: \"gt\",\n $gte: \"gte\",\n $in: \"in\",\n $lt: \"lt\",\n $lte: \"lte\",\n $neq: \"not\",\n $notin: \"notIn\",\n $starts: \"startsWith\",\n};\n\n// eslint-disable-next-line security/detect-unsafe-regex,regexp/no-useless-flag\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 as SearchCondition;\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): Record<string, Condition> | undefined => {\n const operator = Object.keys(value)[0];\n const prismaOperator: PrismaWhereOperator | undefined = 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 // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n value: Condition | Date | WhereCondition | boolean | number | string,\n key: string,\n parsed: PrismaWhereField,\n manyRelations: string[],\n) => {\n // Reverse the keys so that we can format our object by nesting\n // eslint-disable-next-line etc/no-assign-mutated-array\n const fields = key.split(\".\").reverse();\n\n let formatFields: Record<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 // eslint-disable-next-line etc/no-assign-mutated-array\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...(oldParsed?.some as object),\n ...formatFields[initialFieldKey]?.some,\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\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nconst basicParse = (value: Condition | Date | WhereCondition | boolean | number | string, 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 { createPaginationMetaSchemaObject } from \"@visulima/pagination\";\nimport { 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: object | string) => {\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 private readonly schemaInputTypes: Map<string, any> = new Map<string, any>();\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n public constructor(private readonly dmmf: any) {}\n\n // eslint-disable-next-line class-methods-use-this,@typescript-eslint/explicit-module-boundary-types\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 items: {\n $ref: reference,\n },\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n };\n }\n\n return { $ref: reference };\n }\n\n const type = getJSONSchemaScalar(inputType.type);\n\n if (inputType.isList) {\n return {\n items: {\n type,\n },\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n };\n }\n\n return { type };\n }\n\n public getExampleModelsSchemas(\n modelNames: string[],\n schemas: Record<string, OpenAPIV3.SchemaObject>,\n ): Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> {\n const referenceToSchema = (reference: string) => {\n const name = reference.replace(\"#/components/schemas/\", \"\");\n const model = schemas[name] as OpenAPIV3.SchemaObject;\n\n const values: Record<string, object[] | string> = {};\n\n Object.entries((model.properties as OpenAPIV3.SchemaObject | undefined) ?? {}).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: Record<string, OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject>) => {\n const values: Record<string, object[] | object | string> = {};\n\n Object.entries(objectProperties).forEach(([key, value]) => {\n values[key] =\n (value as { $ref?: string }).$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: Record<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 // eslint-disable-next-line unicorn/no-array-reduce\n return modelNames.reduce((accumulator, modelName) => {\n const value: Record<string, object[] | object | string> = {};\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] as OpenAPIV3.SchemaObject;\n const meta: Record<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 [`${modelName}s`]: {\n value: [value],\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginatedModelsSchemas(modelNames: string[]): Record<string, OpenAPIV3.SchemaObject> {\n // eslint-disable-next-line unicorn/no-array-reduce\n return modelNames.reduce((accumulator, modelName) => {\n return {\n ...accumulator,\n [`${modelName}Page`]: {\n properties: {\n data: {\n items: {\n $ref: formatSchemaReference(modelName),\n },\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n },\n meta: {\n $ref: formatSchemaReference(PAGINATION_SCHEMA_NAME),\n },\n },\n type: \"object\",\n xml: {\n name: `${modelName}Page`,\n },\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginationDataSchema(): Record<string, OpenAPIV3.SchemaObject> {\n return createPaginationMetaSchemaObject(PAGINATION_SCHEMA_NAME);\n }\n\n public parseInputTypes(models: string[]): Record<string, JSONSchema7> {\n // eslint-disable-next-line sonarjs/cognitive-complexity,unicorn/no-array-reduce\n const definitions = models.reduce((accumulator: Record<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 const dataFields = this.dmmf.mutationType.fieldMap[method].args[0].inputTypes[0].type.fields;\n const requiredProperties: string[] = [];\n // eslint-disable-next-line unicorn/no-array-reduce\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-expect-error\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 nullable: true,\n type: schemaType.filter((type: string) => type !== \"null\"),\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 // TODO: find the correct type\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return propertiesAccumulator;\n }, {});\n\n accumulator[schemaName] = {\n properties,\n type: \"object\",\n xml: {\n name: schemaName,\n },\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 properties: value,\n type: \"object\",\n xml: {\n name: key,\n },\n };\n });\n\n return definitions;\n }\n\n public parseModels(): Record<string, JSONSchema7> {\n const modelsDefinitions = transformDMMF(this.dmmf).definitions as Record<string, JSONSchema7>;\n\n Object.keys(modelsDefinitions).forEach((definition: number | string) => {\n // @TODO: added the correct type\n // @ts-expect-error\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 sonarjs/cognitive-complexity,@typescript-eslint/explicit-module-boundary-types\n public parseObjectInputType(fieldType: any): { $ref?: string; type?: string } {\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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\nexport default PrismaJsonSchemaParser;\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatSchemaReference = (schemaName: string): 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>(modelNames: M[], models?: ModelsOptions<M>, defaultExposeStrategy: \"all\" | \"none\" = \"all\"): Routes<M> =>\n // eslint-disable-next-line unicorn/no-array-reduce\n 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 distinct: {\n description: \"Fields to distinctively retrieve\",\n name: \"distinct\",\n schema: {\n type: \"string\",\n },\n },\n include: {\n description: \"Include relations, same as select\",\n name: \"include\",\n schema: {\n type: \"string\",\n },\n },\n limit: {\n description: \"Maximum number of elements to retrieve\",\n name: \"limit\",\n schema: {\n minimum: 0,\n type: \"integer\",\n },\n },\n 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 name: \"orderBy\",\n schema: {\n type: \"string\",\n },\n },\n page: {\n description: \"Page number. Use only for pagination.\",\n name: \"page\",\n schema: {\n minimum: 1,\n type: \"integer\",\n },\n },\n select: {\n description: \"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts\",\n name: \"select\",\n schema: {\n type: \"string\",\n },\n },\n skip: {\n description: \"Number of rows to skip\",\n name: \"skip\",\n schema: {\n minimum: 0,\n type: \"integer\",\n },\n },\n where: {\n description: 'Fields to filter. See <a href=\"https://next-crud.js.org/query-params#where\">the docs</a>',\n name: \"where\",\n schema: {\n type: \"string\",\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[] = []): SwaggerParameter[] => {\n if (routeType === RouteType.READ_ALL) {\n return [...listQueryParameters, ...additionalQueryParameters].filter(Boolean) as SwaggerParameter[];\n }\n\n return [...commonQueryParameters, ...additionalQueryParameters].filter(Boolean) as SwaggerParameter[];\n};\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatExampleReference = (schemaName: string): 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 hasId?: boolean;\n modelName: M;\n modelsConfig?: SwaggerModelsConfig<M>;\n routeTypes: RouteType[];\n tag: string;\n}\n\ntype HttpMethod = \"delete\" | \"get\" | \"post\" | \"put\";\n\nconst generateContentForSchema = (schemaName: string, isArray?: boolean) => {\n if (isArray) {\n return {\n items: {\n $ref: formatSchemaReference(schemaName),\n },\n type: \"array\",\n };\n }\n\n return {\n $ref: formatSchemaReference(schemaName),\n };\n};\n\nconst generateSwaggerResponse = (routeType: RouteType, modelName: string): { content: any; statusCode: number } | undefined => {\n if (routeType === RouteType.CREATE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} created`,\n },\n statusCode: 201,\n };\n }\n\n if (routeType === RouteType.DELETE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item deleted`,\n },\n statusCode: 200,\n };\n }\n\n if (routeType === RouteType.READ_ALL) {\n return {\n content: {\n content: {\n \"application/json\": {\n examples: {\n Default: {\n $ref: formatExampleReference(`${modelName}s`),\n },\n Pagination: {\n $ref: formatExampleReference(`${modelName}Page`),\n },\n },\n schema: {\n oneOf: [generateContentForSchema(modelName, true), generateContentForSchema(`${modelName}Page`, false)],\n },\n },\n },\n description: `${modelName} list retrieved`,\n },\n statusCode: 200,\n };\n }\n\n if (routeType === RouteType.READ_ONE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item retrieved`,\n },\n statusCode: 200,\n };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (routeType === RouteType.UPDATE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item updated`,\n },\n statusCode: 200,\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 as string} was not found.`);\n }\n }\n};\n\nconst generateSwaggerPathObject = <M extends string>({\n hasId,\n modelName,\n modelsConfig,\n routeTypes,\n tag,\n}: GenerateSwaggerPathObjectParameters<M>): Record<string, any> => {\n const methods: Record<string, any> = {};\n\n routeTypes.forEach((routeType) => {\n if (routeTypes.includes(routeType)) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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] = {\n parameters: getQueryParameters(routeType).map((queryParameter) => {\n return { ...queryParameter, in: \"query\" };\n }),\n\n responses: {\n [response.statusCode]: response.content,\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...modelsConfig?.[modelName]?.routeTypes?.[routeType]?.responses,\n },\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n summary: modelsConfig?.[modelName]?.routeTypes?.[routeType]?.summary,\n tags: [tag],\n };\n\n if (hasId) {\n methods[method].parameters.push({\n description: `ID of the ${modelName}`,\n in: \"path\",\n name: \"id\",\n required: true,\n schema: {\n type: \"string\",\n },\n });\n }\n\n if (routeType === RouteType.UPDATE) {\n methods[method].requestBody = generateRequestBody(\"Update\", returnType);\n } else if (routeType === RouteType.CREATE) {\n methods[method].requestBody = generateRequestBody(\"Create\", returnType);\n }\n }\n });\n\n return methods;\n};\n\ninterface GetSwaggerPathsParameters<M extends string> {\n models?: ModelsOptions<M>;\n modelsConfig?: SwaggerModelsConfig<M>;\n routes: Routes<M>;\n routesMap?: { [key in M]?: string };\n}\n\nconst getSwaggerPaths = <M extends string>({ models, modelsConfig, routes, routesMap }: GetSwaggerPathsParameters<M>): Record<string, any> =>\n // eslint-disable-next-line unicorn/no-array-reduce\n Object.keys(routes).reduce((accumulator: Record<string, any>, value: M | string) => {\n const routeTypes = routes[value] as RouteType[];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const resourceName = models?.[value]?.name ? (models[value] as ModelOption).name : routesMap?.[value as M] ?? value;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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 modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n tag,\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 hasId: true,\n modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n tag,\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[] =>\n modelNames.map((modelName) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (modelsConfig?.[modelName]?.tag) {\n return (modelsConfig[modelName] as ModelsConfig).tag;\n }\n\n return {\n name: modelName,\n };\n });\n\nexport default getSwaggerTags;\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nimport modelsToRouteNames from \"../../../adapter/prisma/utils/models-to-route-names\";\nimport type { FakePrismaClient, 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: Record<string, OpenAPIV3.ExampleObject>): OpenAPIV3.PathsObject => {\n // eslint-disable-next-line sonarjs/cognitive-complexity\n Object.values(swaggerPaths).forEach((pathSpec) => {\n Object.values(pathSpec as OpenAPIV3.OperationObject & OpenAPIV3.PathsObject).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((responseSpec as OpenAPIV3.ResponseObject).content as Record<string, OpenAPIV3.MediaTypeObject>).forEach(\n (contentSpec) => {\n if (typeof contentSpec.example === \"string\") {\n const example = contentSpec.example.replace(\"#/components/examples/\", \"\");\n\n if (examples[example as keyof typeof examples]?.value !== undefined) {\n // eslint-disable-next-line no-param-reassign\n contentSpec.example = (examples[example as keyof typeof examples] as typeof examples)[\"value\"];\n }\n }\n },\n );\n }\n });\n }\n });\n });\n\n return swaggerPaths;\n};\n\nconst modelsToOpenApi = async <M extends string = string, PrismaClient = FakePrismaClient>({\n crud = { models: {} },\n defaultExposeStrategy = \"all\",\n models: ctorModels,\n prismaClient,\n swagger = { allowedMediaTypes: { \"application/json\": true }, models: {} },\n}: ModelsToOpenApiParameters<M, PrismaClient>): Promise<{\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>;\n paths: OpenAPIV3.PathsObject;\n schemas: Record<string, OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject>;\n tags: OpenAPIV3.TagObject[];\n}> => {\n let dmmf: any;\n let prismaDmmfModels: any;\n\n // eslint-disable-next-line no-underscore-dangle\n if (prismaClient._dmmf !== undefined) {\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 !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n dmmf = await prismaClient._getDmmf();\n prismaDmmfModels = dmmf.mappingsMap;\n }\n\n if (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 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 models: crud.models,\n modelsConfig: swagger.models,\n routes: swaggerRoutes,\n routesMap: modelsToRouteNames(prismaDmmfModels, models),\n });\n const schemas = JSON.parse(schema.replaceAll(\"#/definitions\", \"#/components/schemas\"));\n const examples = parser.getExampleModelsSchemas(dModels, schemas);\n\n return {\n examples,\n paths: overwritePathsExampleWithModel(swaggerPaths, examples as Record<string, OpenAPIV3.ExampleObject>),\n schemas,\n tags: swaggerTags,\n };\n};\n\nexport interface ModelsToOpenApiParameters<M extends string, PrismaClient> {\n crud?: {\n models: ModelsOptions<M>;\n };\n defaultExposeStrategy?: \"all\" | \"none\";\n models?: M[];\n prismaClient: FakePrismaClient & PrismaClient;\n swagger?: Partial<{\n allowedMediaTypes: Record<string, boolean>;\n models: SwaggerModelsConfig<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":["createHttpError","modelsToRouteNames","mappingsMap","models","routesMap","model","models_to_route_names_default","primitiveTypes","isPrimitive","value","is_primitive_default","parsePrismaCursor","cursor","parsed","key","parse_cursor_default","operatorsAssociation","parsePrismaOrderBy","orderBy","parse_order_by_default","parsePrismaRecursiveField","select","fieldName","field","parse_recursive_default","isObject","a","isDateString","getSearchValue","originalValue","isRelation","manyRelations","splitKey","parseSimpleField","operator","prismaOperator","parseRelation","fields","formatFields","index","basicParse","initialFieldKey","oldParsed","parseObjectCombination","object","fieldResult","parsePrismaWhere","where","parse_where_default","PrismaAdapter","primaryKey","prismaClient","resourceName","data","query","resourceId","delegate","total","error","prismaDmmfModels","createPaginationMetaSchemaObject","getJSONSchemaProperty","transformDMMF","formatSchemaReference","schemaName","format_schema_ref_default","getJSONSchemaScalar","fieldType","PAGINATION_SCHEMA_NAME","methodsNames","PrismaJsonSchemaParser","dmmf","inputType","reference","type","modelNames","schemas","referenceToSchema","name","values","v","arrayItemsToSchema","objectPropertiesToSchema","objectProperties","items","accumulator","modelName","pagination","meta","definitions","method","dataFields","requiredProperties","properties","propertiesAccumulator","schema","schemaType","typeName","modelsDefinitions","definition","property","fieldData","nullable","anyOf","inputTypeData","json_schema_parser_default","getModelsAccessibleRoutes","defaultExposeStrategy","get_accessible_routes_default","get_models_accessible_routes_default","queryParameters","commonQueryParameters","listQueryParameters","getQueryParameters","routeType","additionalQueryParameters","formatExampleReference","format_example_ref_default","generateContentForSchema","isArray","generateSwaggerResponse","generateRequestBody","schemaStartName","getRouteTypeMethod","generateSwaggerPathObject","hasId","modelsConfig","routeTypes","tag","methods","returnType","response","queryParameter","getSwaggerPaths","routes","path","routeTypesToUse","get_swagger_paths_default","getSwaggerTags","get_swagger_tags_default","overwritePathsExampleWithModel","swaggerPaths","examples","pathSpec","methodSpec","responseSpec","contentSpec","example","modelsToOpenApi","crud","ctorModels","swagger","parser","dModels","swaggerRoutes","swaggerTags","prisma_default"],"mappings":"gDAKA,OAAOA,MAAqB,cCH5B,IAAMC,EAAqB,CAA4BC,EAAqCC,IAA6B,CACrH,IAAMC,EAAyB,CAAC,EAEhC,OAAAD,EAAO,QAASE,GAAU,CAEtBD,EAAUC,CAAK,EAAIH,EAAYG,CAAK,EAAE,MAC1C,CAAC,EAEMD,CACX,EAEOE,EAAQL,ECbf,IAAMM,EAAiB,IAAI,IAAI,CAAC,SAAU,UAAW,QAAQ,CAAC,EAExDC,EAAeC,GAA4BF,EAAe,IAAI,OAAOE,CAAK,EAEzEC,EAAQF,ECDf,IAAMG,EAAqBC,GAAoE,CAC3F,IAAMC,EAAuB,CAAC,EAU9B,GARA,OAAO,KAAKD,CAAM,EAAE,QAASE,GAAQ,CACjC,IAAML,EAAQG,EAAOE,CAAG,EAEpBJ,EAAYD,CAAK,IACjBI,EAAOC,CAAG,EAAIL,EAEtB,CAAC,EAEG,OAAO,KAAKI,CAAM,EAAE,SAAW,EAC/B,MAAM,IAAI,MAAM,6EAA6E,EAGjG,OAAOA,CACX,EAEOE,EAAQJ,EClBf,IAAMK,GAAuE,CACzE,KAAM,MACN,MAAO,MACX,EAEMC,GAAsBC,GAAyC,CACjE,IAAML,EAAwB,CAAC,EAE/B,cAAO,KAAKK,CAAO,EAAE,QAASJ,GAAQ,CAClC,IAAML,EAAQS,EAAQJ,CAAG,EAEzBD,EAAOC,CAAG,EAAIE,GAAqBP,CAAwB,CAC/D,CAAC,EAEMI,CACX,EAEOM,EAAQF,GCjBf,IAAMG,EAA4B,CAAiCC,EAAwBC,IAAqC,CAC5H,IAAMT,EAA6B,CAAC,EAEpC,cAAO,KAAKQ,CAAM,EAAE,QAASE,GAAU,CACnCV,EAAOU,CAAK,EACRF,EAAOE,CAAK,IAAM,GACZ,GACC,CACG,CAACD,CAAS,EAAGF,EAA0BC,EAAOE,CAAK,EAAqBD,CAAS,CACrF,CACd,CAAC,EAEMT,CACX,EAEOW,EAAQJ,ECdf,IAAMK,EAAYC,GAAWA,aAAa,OAEpCV,GAEF,CACA,MAAO,WACP,MAAO,WACP,IAAK,SACL,IAAK,KACL,KAAM,MACN,IAAK,KACL,IAAK,KACL,KAAM,MACN,KAAM,MACN,OAAQ,QACR,QAAS,YACb,EAGMW,GAAgBlB,GAAkB,gGAAgG,KAAKA,CAAK,EAE5ImB,GAAkBC,GAChBF,GAAaE,CAAa,EACnB,IAAI,KAAKA,CAAa,EAG7B,OAAOA,GAAkB,UAAYA,IAAkB,UAChD,KAGJA,EAGLC,EAAa,CAAChB,EAAaiB,IAAqC,CAElE,IAAMC,EAAWlB,EAAI,MAAM,GAAG,EAC9B,OAAAkB,EAAS,OAAO,GAAI,CAAC,EAEdD,EAAc,SAASC,EAAS,KAAK,GAAG,CAAC,CACpD,EAEMC,EAAoBxB,GAA4D,CAClF,IAAMyB,EAAW,OAAO,KAAKzB,CAAK,EAAE,CAAC,EAC/B0B,EAAkDnB,GAAqBkB,CAA6C,EAE1H,GAAIC,EACA,MAAO,CACH,CAACA,CAAc,EAAG1B,EAAMyB,CAAkB,CAC9C,CAIR,EAEME,EAAgB,CAElB3B,EACAK,EACAD,EACAkB,IACC,CAGD,IAAMM,EAASvB,EAAI,MAAM,GAAG,EAAE,QAAQ,EAElCwB,EAAoC,CAAC,EAEzCD,EAAO,QAAQ,CAACd,EAAOgB,IAAU,CAEzBA,IAAU,EAEVC,EAAW/B,EAAOc,EAAOe,EAAcP,CAAa,EAGpDO,EAAe,CACX,CAACf,CAAK,EAAG,CACL,KAAMe,CACV,CACJ,CAER,CAAC,EAID,IAAMG,EAAkBJ,EAAO,QAAQ,EAAE,CAAC,EAEpCK,EAAY7B,EAAO4B,CAAe,EAIxC5B,EAAO4B,CAAe,EAAI,CACtB,KAAM,CAEF,GAAIC,GAAW,KACf,GAAGJ,EAAaG,CAAe,GAAG,IACtC,CACJ,CACJ,EAEME,EAAyB,CAACC,EAAmBb,IAA+C,CAC9F,IAAMlB,EAA4B,CAAC,EAEnC,cAAO,KAAK+B,CAAM,EAAE,QAAS9B,GAAQ,CACjC,IAAML,EAAQmC,EAAO9B,CAAG,EAExB,GAAIgB,EAAWhB,EAAKiB,CAAa,EAC7BK,EAAc3B,EAAOK,EAAKD,EAAQkB,CAAa,UACxCrB,EAAYD,CAAK,EACxBI,EAAOC,CAAG,EAAIL,UACPgB,EAAShB,CAAK,EAAG,CACxB,IAAMoC,EAAcZ,EAAiBxB,CAAkB,EAEnDoC,IACAhC,EAAOC,CAAG,EAAI+B,EAEtB,CACJ,CAAC,EAEMhC,CACX,EAGM2B,EAAa,CAAC/B,EAAsEK,EAAaD,EAA0BkB,IAA4B,CACzJ,GAAIrB,EAAYD,CAAK,EAEjBI,EAAOC,CAAG,EAAIc,GAAenB,CAAK,MAElC,QAAQK,EAAK,CACT,IAAK,MAAO,CACJW,EAAShB,CAAK,IAEdI,EAAO,GAAK8B,EAAuBlC,EAAoBsB,CAAa,GAExE,KACJ,CACA,IAAK,OAAQ,CACLN,EAAShB,CAAK,IAEdI,EAAO,IAAM8B,EAAuBlC,EAAoBsB,CAAa,GAEzE,KACJ,CACA,IAAK,OAAQ,CACLN,EAAShB,CAAK,IAEdI,EAAO,IAAM8B,EAAuBlC,EAAoBsB,CAAa,GAEzE,KACJ,CACA,QAAS,CAELlB,EAAOC,CAAG,EAAImB,EAAiBxB,CAAkB,EACjD,KACJ,CACJ,CAER,EAEMqC,GAAmB,CAACC,EAAmBhB,IAA8C,CACvF,IAAMlB,EAA2B,CAAC,EAElC,cAAO,KAAKkC,CAAK,EAAE,QAASjC,GAAQ,CAChC,IAAML,EAAQsC,EAAMjC,CAAG,EAsBnBgB,EAAWhB,EAAKiB,CAAa,EAC7BK,EAAc3B,EAAOK,EAAKD,EAAQkB,CAAa,EAE/CS,EAAW/B,EAAOK,EAAKD,EAAQkB,CAAa,CAEpD,CAAC,EAEMlB,CACX,EAEOmC,EAAQF,GN5Kf,IAAqBG,EAArB,KAA4H,CAmCjH,YAAY,CAAE,cAAAlB,EAAgB,CAAC,EAAG,OAAA5B,EAAQ,WAAA+C,EAAa,KAAM,aAAAC,CAAa,EAA6D,CA9B9I,KAAiB,sBAAwB,SAA6C,CAElF,GAAI,KAAK,aAAa,QAAU,OAE5B,YAAK,KAAO,KAAK,aAAa,MAEvB,KAAK,MAAM,YAItB,GAAI,KAAK,aAAa,WAAa,OAE/B,YAAK,KAAO,MAAM,KAAK,aAAa,SAAS,EAEtC,KAAK,KAAK,YAGrB,MAAM,IAAI,MAAM,mCAAmC,CACvD,EAaI,KAAK,aAAeA,EACpB,KAAK,WAAaD,EAClB,KAAK,cAAgBnB,EACrB,KAAK,WAAa5B,CACtB,CAEQ,kBAAkBiD,EAA8B,CACpD,OAAO,KAAK,aAAa,GAAGA,EAAa,OAAO,CAAC,EAAE,YAAY,CAAC,GAAGA,EAAa,MAAM,CAAC,CAAC,EAAE,CAC9F,CAEA,IAAW,QAAuB,CAC9B,OAAO,KAAK,YAChB,CAEA,MAAa,SAAyB,CAClC,KAAK,aAAa,SAAS,CAC/B,CAEA,MAAa,OAAOA,EAAiBC,EAAeC,EAAgD,CAEhG,OAAO,MAAM,KAAK,kBAAkBF,CAAY,EAAE,OAAO,CACrD,KAAAC,EACA,QAASC,EAAM,QACf,OAAQA,EAAM,MAClB,CAAC,CACL,CAEA,MAAa,OAAOF,EAAiBG,EAA6BD,EAAgD,CAE9G,OAAO,MAAM,KAAK,kBAAkBF,CAAY,EAAE,OAAO,CACrD,QAASE,EAAM,QACf,OAAQA,EAAM,OACd,MAAO,CACH,CAAC,KAAK,UAAU,EAAGC,CACvB,CACJ,CAAC,CACL,CAEA,MAAa,YAA4B,CACrC,MAAM,KAAK,aAAa,YAAY,CACxC,CAEA,MAAa,OAAOH,EAAiBE,EAAkD,CAEnF,OAAQ,MAAM,KAAK,kBAAkBF,CAAY,EAAE,SAAS,CACxD,OAAQE,EAAM,OACd,SAAUA,EAAM,SAChB,QAASA,EAAM,QACf,QAASA,EAAM,QACf,OAAQA,EAAM,OACd,KAAMA,EAAM,KACZ,KAAMA,EAAM,KACZ,MAAOA,EAAM,KACjB,CAAC,CACL,CAEO,WAAiB,CACpB,OAAO,KAAK,QAAU,CAAC,CAC3B,CAEA,MAAa,OAAOF,EAAiBG,EAA6BD,EAAgD,CAC9G,IAAME,EAAW,KAAK,kBAAkBJ,CAAY,EAQpD,OAAO,MAHcI,EAAS,YAAiBA,EAAS,SAG9B,CACtB,QAASF,EAAM,QACf,OAAQA,EAAM,OACd,MAAO,CACH,CAAC,KAAK,UAAU,EAAGC,CACvB,CACJ,CAAC,CACL,CAEA,MAAa,kBAAkBH,EAAiBE,EAA6D,CAEzG,IAAMG,EAAgB,MAAM,KAAK,kBAAkBL,CAAY,EAAE,MAAM,CACnE,SAAUE,EAAM,SAChB,MAAOA,EAAM,KACjB,CAAC,EAED,MAAO,CACH,KAAM,KAAK,MAAMA,EAAM,MAAQ,IAAMA,EAAM,MAAQ,EAAE,EAAI,EACzD,UAAW,KAAK,KAAKG,GAASH,EAAM,MAAQ,EAAE,EAC9C,MAAAG,CACJ,CACJ,CAGO,YAAYC,EAAyB,CAExC,cAAQ,MAAMA,CAAK,EAEfA,aAAiB,OAASA,EAAM,OAEhC,QAAQ,MAAMA,EAAM,KAAK,EAGvBA,EAAM,YAAY,OAAS,iCAAmCA,EAAM,YAAY,OAAS,8BACzF1D,EAAgB,IAAK,uDAAuD,EAC5EA,EAAgB,IAAK,gEAAgE,CAC/F,CAEA,MAAa,MAAsB,CAC/B,IAAMG,EAAS,KAAK,WACdwD,EAAmB,MAAM,KAAK,sBAAsB,EAEtDxD,IAAW,QACXA,EAAO,QAASE,GAAU,CACtB,GAAI,CAAC,OAAO,KAAKsD,CAAgB,EAAE,SAAStD,CAAK,EAC7C,MAAM,IAAI,MAAM,cAAcA,CAAK,cAAc,CAEzD,CAAC,EAGL,KAAK,OAASF,GAAW,OAAO,KAAKwD,CAAgB,CACzD,CAEA,MAAa,uBAA0D,CACnE,OAAOrD,EAAmB,MAAM,KAAK,sBAAsB,EAAG,KAAK,UAAU,CAAC,CAClF,CAEO,WAAW8C,EAAiBE,EAA2D,CAC1F,IAAMzC,EAAsC,CAAC,EAE7C,OAAIyC,EAAM,SACNzC,EAAO,OAASW,EAA0B8B,EAAM,OAAQ,QAAQ,GAGhEA,EAAM,UACNzC,EAAO,QAAUW,EAA0B8B,EAAM,QAAS,SAAS,GAGnEA,EAAM,eAAgB,QACtBzC,EAAO,MAAQmC,EAAiB,KAAK,MAAMM,EAAM,cAAc,KAAQ,EAAG,KAAK,cAAcF,CAAY,GAAK,CAAC,CAAC,GAGhHE,EAAM,UACNzC,EAAO,QAAUM,EAAmBmC,EAAM,OAAO,GAGjDA,EAAM,QAAU,SAChBzC,EAAO,KAAOyC,EAAM,OAGpBA,EAAM,OAAS,SACfzC,EAAO,KAAOyC,EAAM,MAGpBA,EAAM,eAAgB,SACtBzC,EAAO,OAASE,EAAkB,KAAK,MAAMuC,EAAM,cAAc,MAAS,CAAC,GAG3EA,EAAM,WACNzC,EAAO,SAAWyC,EAAM,UAGrBzC,CACX,CAEA,MAAa,OAAOuC,EAAiBG,EAA6BF,EAAeC,EAAgD,CAE7H,OAAO,MAAM,KAAK,kBAAkBF,CAAY,EAAE,OAAO,CACrD,KAAAC,EACA,QAASC,EAAM,QACf,OAAQA,EAAM,OACd,MAAO,CACH,CAAC,KAAK,UAAU,EAAGC,CACvB,CACJ,CAAC,CACL,CACJ,EO7OA,OAAS,oCAAAK,OAAwC,uBACjD,OAAS,yBAAAC,GAAuB,iBAAAC,OAAqB,oCCArD,IAAMC,GAAyBC,GAA+B,wBAAwBA,CAAU,GAEzFC,EAAQF,GDIf,IAAMG,EAAuBC,GAA+B,CACxD,OAAQA,EAAW,CACf,IAAK,MACL,IAAK,SACD,MAAO,UAEX,IAAK,WACL,IAAK,QACL,IAAK,SACD,MAAO,SAEX,IAAK,QACL,IAAK,UACD,MAAO,SAEX,IAAK,OACD,MAAO,SAEX,IAAK,UACD,MAAO,UAEX,IAAK,OACD,MAAO,OAEX,QACI,MAAO,EAEf,CACJ,EAEMC,EAAyB,iBAEzBC,GAAe,CACjB,CAAE,YAAa,YAAa,gBAAiB,QAAS,EACtD,CAAE,YAAa,YAAa,gBAAiB,QAAS,CAC1D,EAEMC,EAAN,KAA6B,CAIlB,YAA6BC,EAAW,CAAX,UAAAA,EAHpC,KAAiB,iBAAqC,IAAI,GAGV,CAGzC,oBAAoBC,EAAgB,CACvC,GAAIA,EAAU,OAAS,SAAU,CAC7B,IAAMC,EAAYR,EAAsBO,EAAU,KAAK,IAAI,EAE3D,OAAIA,EAAU,OACH,CACH,MAAO,CACH,KAAMC,CACV,EACA,KAAM,QACN,IAAK,CACD,KAAMD,EAAU,KAAK,KACrB,QAAS,EACb,CACJ,EAGG,CAAE,KAAMC,CAAU,CAC7B,CAEA,IAAMC,EAAOR,EAAoBM,EAAU,IAAI,EAE/C,OAAIA,EAAU,OACH,CACH,MAAO,CACH,KAAAE,CACJ,EACA,KAAM,QACN,IAAK,CACD,KAAMF,EAAU,KAAK,KACrB,QAAS,EACb,CACJ,EAGG,CAAE,KAAAE,CAAK,CAClB,CAEO,wBACHC,EACAC,EACmE,CACnE,IAAMC,EAAqBJ,GAAsB,CAC7C,IAAMK,EAAOL,EAAU,QAAQ,wBAAyB,EAAE,EACpDpE,EAAQuE,EAAQE,CAAI,EAEpBC,EAA4C,CAAC,EAEnD,cAAO,QAAS1E,EAAM,YAAqD,CAAC,CAAC,EAAE,QAAQ,CAAC,CAACS,EAAKkE,CAAC,IAAM,CACjG,IAAMN,EAAQM,EAA6B,KAG3CD,EAAOjE,CAAG,EAAI4D,IAAS,QAAU,CAACO,EAAmBD,EAAE,KAAK,CAAC,EAAIN,CACrE,CAAC,EAEMK,CACX,EAEMG,EAA4BC,GAAyF,CACvH,IAAMJ,EAAqD,CAAC,EAE5D,cAAO,QAAQI,CAAgB,EAAE,QAAQ,CAAC,CAACrE,EAAKL,CAAK,IAAM,CACvDsE,EAAOjE,CAAG,EACLL,EAA4B,OAAS,OAC9BA,EAAiC,KACnCoE,EAAmBpE,EAAoC,IAAI,CACzE,CAAC,EAEMsE,CACX,EAEME,EAAsBG,GAAuC,CAC/D,IAAML,EAA4C,CAAC,EAEnD,cAAO,QAAQK,CAAK,EAAE,QAAQ,CAAC,CAACtE,EAAKL,CAAK,IAAM,CACxCA,EAAM,MAAM,OAAS,OACrBsE,EAAOjE,CAAG,EAAI,CAAC+D,EAAkBpE,EAAM,MAAM,IAAI,CAAC,EAC3CA,EAAM,OAAS,QACtBsE,EAAOjE,CAAG,EAAI,CAACmE,EAAmBxE,EAAM,KAAK,CAAC,EACvCA,EAAM,OAAS,SACtBsE,EAAOjE,CAAG,EAAIoE,EAAyBzE,EAAM,UAAU,EAEvDsE,EAAOjE,CAAG,EAAIL,EAAM,IAE5B,CAAC,EAEMsE,CACX,EAGA,OAAOJ,EAAW,OAAO,CAACU,EAAaC,IAAc,CACjD,IAAM7E,EAAoD,CAAC,EACrDJ,EAAQuE,EAAQU,CAAS,EAE/B,OAAO,QAAQjF,EAAM,UAAoC,EAAE,QAAQ,CAAC,CAACS,EAAKkE,CAAC,IAAM,CAC7E,IAAMN,EAAQM,EAA6B,KAEvCN,IAAS,QACTjE,EAAMK,CAAG,EAAI,CAAC+D,EAAkBG,EAAE,MAAM,IAAI,CAAC,EACtCN,IAAS,SAChBjE,EAAMK,CAAG,EAAIoE,EAAyBF,EAAE,UAAU,EAElDvE,EAAMK,CAAG,EAAI4D,CAErB,CAAC,EAED,IAAMa,EAAa,KAAK,wBAAwB,EAAEnB,CAAsB,EAClEoB,EAA+B,CAAC,EAEtC,cAAO,QAAQD,EAAW,UAAoC,EAAE,QAAQ,CAAC,CAACzE,EAAKkE,CAAC,IAAM,CAClFQ,EAAK1E,CAAG,EAAKkE,EAA6B,IAC9C,CAAC,EAEM,CACH,GAAGK,EACH,CAAC,GAAGC,CAAS,EAAE,EAAG,CACd,MAAA7E,CACJ,EACA,CAAC,GAAG6E,CAAS,MAAM,EAAG,CAClB,MAAO,CACH,KAAM,CAAC7E,CAAK,EACZ,KAAA+E,CACJ,CACJ,EACA,CAAC,GAAGF,CAAS,GAAG,EAAG,CACf,MAAO,CAAC7E,CAAK,CACjB,CACJ,CACJ,EAAG,CAAC,CAAC,CACT,CAGO,0BAA0BkE,EAA8D,CAE3F,OAAOA,EAAW,OAAO,CAACU,EAAaC,KAC5B,CACH,GAAGD,EACH,CAAC,GAAGC,CAAS,MAAM,EAAG,CAClB,WAAY,CACR,KAAM,CACF,MAAO,CACH,KAAMrB,EAAsBqB,CAAS,CACzC,EACA,KAAM,QACN,IAAK,CACD,KAAM,OACN,QAAS,EACb,CACJ,EACA,KAAM,CACF,KAAMrB,EAAsBG,CAAsB,CACtD,CACJ,EACA,KAAM,SACN,IAAK,CACD,KAAM,GAAGkB,CAAS,MACtB,CACJ,CACJ,GACD,CAAC,CAAC,CACT,CAGO,yBAAkE,CACrE,OAAO1B,GAAiCQ,CAAsB,CAClE,CAEO,gBAAgBjE,EAA+C,CAElE,IAAMsF,EAActF,EAAO,OAAO,CAACkF,EAAkCC,KACjDjB,GAAa,IAAKqB,IACvB,CACH,KAAM,GAAGA,EAAO,WAAW,GAAGJ,CAAS,GACvC,WAAY,GAAGI,EAAO,eAAe,GAAGJ,CAAS,EACrD,EACH,EAEO,QAAQ,CAAC,CAAE,KAAMI,EAAQ,WAAA1B,CAAW,IAAM,CAC9C,IAAM2B,EAAa,KAAK,KAAK,aAAa,SAASD,CAAM,EAAE,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,KAAK,OAChFE,EAA+B,CAAC,EAEhCC,EAAaF,EAAW,OAAO,CAACG,EAA4BvE,IAAe,CAC7E,GAAIA,EAAM,WAAW,CAAC,EAAE,OAAS,SAAU,CACvC,IAAMwE,EAASlC,GACX,KAAK,KAAK,UACV,CAAC,CACL,EAAE,CACE,KAAMtC,EAAM,KACZ,GAAGA,EAAM,WAAW,CAAC,CACzB,CAAC,EAIK,CAAE,KAAMyE,CAAW,EAAID,EAAO,CAAC,EAEjCC,GAAc,MAAM,QAAQA,CAAU,EAClCA,EAAW,SAAS,MAAM,IAE1BF,EAAsBvE,EAAM,IAAI,EAAI,CAChC,GAAGyE,EACH,SAAU,GACV,KAAMA,EAAW,OAAQtB,GAAiBA,IAAS,MAAM,CAC7D,EACIoB,EAAsBvE,EAAM,IAAI,EAAE,KAAK,SAAW,IAElDuE,EAAsBvE,EAAM,IAAI,EAAI,CAChC,GAAGuE,EAAsBvE,EAAM,IAAI,EACnC,KAAMuE,EAAsBvE,EAAM,IAAI,EAAE,KAAK,CAAC,CAClD,IAKRuE,EAAsBvE,EAAM,IAAI,EAAIwE,EAAO,CAAC,CAEpD,KAAO,CACH,IAAME,EAAW,KAAK,qBAAqB1E,EAAM,WAAW,CAAC,CAAC,EAG9DuE,EAAsBvE,EAAM,IAAI,EAAI,CAChC,GAAG0E,EACH,SAAU1E,EAAM,UACpB,CACJ,CAEA,OAAIA,EAAM,YACNqE,EAAmB,KAAKrE,EAAM,IAAI,EAK/BuE,CACX,EAAG,CAAC,CAAC,EAELT,EAAYrB,CAAU,EAAI,CACtB,WAAA6B,EACA,KAAM,SACN,IAAK,CACD,KAAM7B,CACV,CACJ,EAEI4B,EAAmB,OAAS,IAC5BP,EAAYrB,CAAU,EAAE,SAAW4B,EAE3C,CAAC,EAEMP,GACR,CAAC,CAAC,EAEL,YAAK,iBAAiB,QAAQ,CAAC5E,EAAOK,IAAQ,CAC1C2E,EAAY3E,CAAG,EAAI,CACf,WAAYL,EACZ,KAAM,SACN,IAAK,CACD,KAAMK,CACV,CACJ,CACJ,CAAC,EAEM2E,CACX,CAEO,aAA2C,CAC9C,IAAMS,EAAoBpC,GAAc,KAAK,IAAI,EAAE,YAEnD,cAAO,KAAKoC,CAAiB,EAAE,QAASC,GAAgC,CAGpE,GAAM,CAAE,WAAAN,CAAW,EAAIK,EAAkBC,CAAU,EAEnD,OAAO,KAAKN,CAAU,EAAE,QAASO,GAAqB,CAC9C,MAAM,QAAQP,EAAWO,CAAQ,EAAE,IAAI,GAAKP,EAAWO,CAAQ,EAAE,KAAK,SAAS,MAAM,IACrFP,EAAWO,CAAQ,EAAE,KAAOP,EAAWO,CAAQ,EAAE,KAAK,OAAQ1B,GAAiBA,IAAS,MAAM,EAE1FmB,EAAWO,CAAQ,EAAE,KAAK,SAAW,IAErCP,EAAWO,CAAQ,EAAE,KAAOP,EAAWO,CAAQ,EAAE,KAAK,CAAC,GAG3DP,EAAWO,CAAQ,EAAE,SAAW,GAExC,CAAC,CACL,CAAC,EAEMF,CACX,CAGO,qBAAqB/B,EAAkD,CAC1E,OAAIA,EAAU,OAAS,UACd,KAAK,iBAAiB,IAAIA,EAAU,KAAK,IAAI,IAC9C,KAAK,iBAAiB,IAAIA,EAAU,KAAK,KAAM,CAAC,CAAC,EAEjDA,EAAU,KAAK,OAAO,QAAS5C,GAAe,CAC1C,IAAI8E,EAAiC,CAAC,EAEtC,GAAI9E,EAAM,WAAW,OAAS,EAAG,CAC7B,IAAI+E,EAAW,GAETC,EAAQhF,EAAM,WACf,IAAKiD,GAAmB,CACrB,IAAMgC,EAAgB,KAAK,oBAAoBhC,CAAS,EAExD,GAAIgC,EAAc,OAAS,OAAQ,CAC/BF,EAAW,GAEX,MACJ,CAGA,OAAOE,CACX,CAAC,EACA,OAAO,OAAO,EAEfD,EAAM,SAAW,EAEjBF,EAAYE,EAAM,CAAC,EAEnBF,EAAU,MAAWE,EAIrBD,IACAD,EAAU,SAAc,GAEhC,KAAO,CACH,IAAM7B,EAAYjD,EAAM,WAAW,CAAC,EAEpC8E,EAAY,KAAK,oBAAoB7B,CAAS,CAClD,CAEA,KAAK,iBAAiB,IAAIL,EAAU,KAAK,KAAM,CAC3C,GAAG,KAAK,iBAAiB,IAAIA,EAAU,KAAK,IAAI,EAChD,CAAC5C,EAAM,IAAI,EAAG8E,CAClB,CAAC,EAED9E,EAAM,WAAW,QAASiD,GAAmB,CACrCA,EAAU,OAAS,UACnB,KAAK,qBAAqBA,CAAS,CAE3C,CAAC,CACL,CAAC,GAGE,CAAE,KAAMP,EAAsBE,EAAU,KAAK,IAAI,CAAE,GAGvD,CAAE,KAAMD,EAAoBC,EAAU,IAAI,CAAE,CACvD,CACJ,EAEOsC,EAAQnC,EE/Yf,IAAMoC,GAA4B,CAAmB/B,EAAiBxE,EAA2BwG,EAAwC,QAErIhC,EAAW,OAAO,CAACU,EAAaC,IACxBnF,IAASmF,CAAS,EACX,CACH,GAAGD,EACH,CAACC,CAAS,EAAGsB,EAAqBzG,EAAOmF,CAAS,EAAkB,KAAOnF,EAAOmF,CAAS,EAAkB,QAASqB,CAAqB,CAC/I,EAGG,CACH,GAAGtB,EACH,CAACC,CAAS,EAAGsB,EAAoB,OAAW,OAAWD,CAAqB,CAChF,EACD,CAAC,CAAC,EAEFE,EAAQH,GCjBf,IAAMI,EAAoD,CACtD,SAAU,CACN,YAAa,mCACb,KAAM,WACN,OAAQ,CACJ,KAAM,QACV,CACJ,EACA,QAAS,CACL,YAAa,oCACb,KAAM,UACN,OAAQ,CACJ,KAAM,QACV,CACJ,EACA,MAAO,CACH,YAAa,yCACb,KAAM,QACN,OAAQ,CACJ,QAAS,EACT,KAAM,SACV,CACJ,EACA,QAAS,CACL,YAAa,mHACb,KAAM,UACN,OAAQ,CACJ,KAAM,QACV,CACJ,EACA,KAAM,CACF,YAAa,wCACb,KAAM,OACN,OAAQ,CACJ,QAAS,EACT,KAAM,SACV,CACJ,EACA,OAAQ,CACJ,YAAa,uFACb,KAAM,SACN,OAAQ,CACJ,KAAM,QACV,CACJ,EACA,KAAM,CACF,YAAa,yBACb,KAAM,OACN,OAAQ,CACJ,QAAS,EACT,KAAM,SACV,CACJ,EACA,MAAO,CACH,YAAa,2FACb,KAAM,QACN,OAAQ,CACJ,KAAM,QACV,CACJ,CACJ,EAEaC,EAAwB,CAACD,EAAgB,OAAWA,EAAgB,OAAU,EAC9EE,GAAsB,CAC/B,GAAGD,EACHD,EAAgB,MAChBA,EAAgB,KAChBA,EAAgB,MAChBA,EAAgB,QAChBA,EAAgB,KAChBA,EAAgB,QACpB,EAEaG,EAAqB,CAACC,EAAsBC,EAAgD,CAAC,IAClGD,eACO,CAAC,GAAGF,GAAqB,GAAGG,CAAyB,EAAE,OAAO,OAAO,EAGzE,CAAC,GAAGJ,EAAuB,GAAGI,CAAyB,EAAE,OAAO,OAAO,EChFlF,IAAMC,GAA0BpD,GAA+B,yBAAyBA,CAAU,GAE3FqD,EAAQD,GCcf,IAAME,EAA2B,CAACtD,EAAoBuD,IAC9CA,EACO,CACH,MAAO,CACH,KAAMtD,EAAsBD,CAAU,CAC1C,EACA,KAAM,OACV,EAGG,CACH,KAAMC,EAAsBD,CAAU,CAC1C,EAGEwD,GAA0B,CAACN,EAAsB5B,IAAwE,CAC3H,GAAI4B,aACA,MAAO,CACH,QAAS,CACL,QAAS,CACL,mBAAoB,CAChB,QAASG,EAAuB/B,CAAS,EACzC,OAAQgC,EAAyBhC,CAAS,CAC9C,CACJ,EACA,YAAa,GAAGA,CAAS,UAC7B,EACA,WAAY,GAChB,EAGJ,GAAI4B,aACA,MAAO,CACH,QAAS,CACL,QAAS,CACL,mBAAoB,CAChB,QAASG,EAAuB/B,CAAS,EACzC,OAAQgC,EAAyBhC,CAAS,CAC9C,CACJ,EACA,YAAa,GAAGA,CAAS,eAC7B,EACA,WAAY,GAChB,EAGJ,GAAI4B,eACA,MAAO,CACH,QAAS,CACL,QAAS,CACL,mBAAoB,CAChB,SAAU,CACN,QAAS,CACL,KAAMG,EAAuB,GAAG/B,CAAS,GAAG,CAChD,EACA,WAAY,CACR,KAAM+B,EAAuB,GAAG/B,CAAS,MAAM,CACnD,CACJ,EACA,OAAQ,CACJ,MAAO,CAACgC,EAAyBhC,EAAW,EAAI,EAAGgC,EAAyB,GAAGhC,CAAS,OAAQ,EAAK,CAAC,CAC1G,CACJ,CACJ,EACA,YAAa,GAAGA,CAAS,iBAC7B,EACA,WAAY,GAChB,EAGJ,GAAI4B,eACA,MAAO,CACH,QAAS,CACL,QAAS,CACL,mBAAoB,CAChB,QAASG,EAAuB/B,CAAS,EACzC,OAAQgC,EAAyBhC,CAAS,CAC9C,CACJ,EACA,YAAa,GAAGA,CAAS,iBAC7B,EACA,WAAY,GAChB,EAIJ,GAAI4B,aACA,MAAO,CACH,QAAS,CACL,QAAS,CACL,mBAAoB,CAChB,QAASG,EAAuB/B,CAAS,EACzC,OAAQgC,EAAyBhC,CAAS,CAC9C,CACJ,EACA,YAAa,GAAGA,CAAS,eAC7B,EACA,WAAY,GAChB,CAIR,EAEMmC,EAAsB,CAACC,EAAyBpC,KAC3C,CACH,QAAS,CACL,mBAAoB,CAChB,OAAQ,CACJ,KAAMrB,EAAsB,GAAGyD,CAAe,GAAGpC,CAAS,EAAE,CAChE,CACJ,CACJ,CACJ,GAGEqC,GAAsBT,GAAqC,CAC7D,OAAQA,EAAW,CACf,aACI,MAAO,OAEX,eACA,eACI,MAAO,MAEX,aACI,MAAO,MAEX,aACI,MAAO,SAEX,QACI,MAAM,IAAI,UAAU,yBAAyBA,CAAmB,iBAAiB,CAEzF,CACJ,EAEMU,EAA4B,CAAmB,CACjD,MAAAC,EACA,UAAAvC,EACA,aAAAwC,EACA,WAAAC,EACA,IAAAC,CACJ,IAAmE,CAC/D,IAAMC,EAA+B,CAAC,EAEtC,OAAAF,EAAW,QAASb,GAAc,CAC9B,GAAIa,EAAW,SAASb,CAAS,EAAG,CAEhC,IAAMgB,EAAaJ,IAAexC,CAAS,GAAG,aAAa4B,CAAS,GAAG,SAAS,MAAQY,IAAexC,CAAS,GAAG,MAAM,MAAQA,EAC3HI,EAAqBiC,GAAmBT,CAAS,EACjDiB,EAAWX,GAAwBN,EAAWgB,CAAU,EAE9D,GAAIC,IAAa,OACb,MAAM,IAAI,UAAU,cAAcjB,CAAS,kCAAkC,EAGjFe,EAAQvC,CAAM,EAAI,CACd,WAAYuB,EAAmBC,CAAS,EAAE,IAAKkB,IACpC,CAAE,GAAGA,EAAgB,GAAI,OAAQ,EAC3C,EAED,UAAW,CACP,CAACD,EAAS,UAAU,EAAGA,EAAS,QAGhC,GAAGL,IAAexC,CAAS,GAAG,aAAa4B,CAAS,GAAG,SAC3D,EAEA,QAASY,IAAexC,CAAS,GAAG,aAAa4B,CAAS,GAAG,QAC7D,KAAM,CAACc,CAAG,CACd,EAEIH,GACAI,EAAQvC,CAAM,EAAE,WAAW,KAAK,CAC5B,YAAa,aAAaJ,CAAS,GACnC,GAAI,OACJ,KAAM,KACN,SAAU,GACV,OAAQ,CACJ,KAAM,QACV,CACJ,CAAC,EAGD4B,aACAe,EAAQvC,CAAM,EAAE,YAAc+B,EAAoB,SAAUS,CAAU,EAC/DhB,eACPe,EAAQvC,CAAM,EAAE,YAAc+B,EAAoB,SAAUS,CAAU,EAE9E,CACJ,CAAC,EAEMD,CACX,EASMI,GAAkB,CAAmB,CAAE,OAAAlI,EAAQ,aAAA2H,EAAc,OAAAQ,EAAQ,UAAAlI,CAAU,IAEjF,OAAO,KAAKkI,CAAM,EAAE,OAAO,CAACjD,EAAkC5E,IAAsB,CAChF,IAAMsH,EAAaO,EAAO7H,CAAK,EAGzB2C,EAAejD,IAASM,CAAK,GAAG,KAAQN,EAAOM,CAAK,EAAkB,KAAOL,IAAYK,CAAU,GAAKA,EAGxGuH,EAAMF,IAAerH,CAAK,GAAG,IAAI,MAAQA,EAE/C,GAAIsH,EAAW,iBAAyB,GAAKA,EAAW,mBAA2B,EAAG,CAClF,IAAMQ,EAAO,IAAInF,CAAY,GACvBoF,EAAkB,oBAAqC,EAAE,OAAQtB,GAAca,EAAW,SAASb,CAAS,CAAC,EAEnH7B,EAAYkD,CAAI,EAAIX,EAA0B,CAC1C,UAAWnH,EACX,aAAAqH,EACA,WAAYU,EACZ,IAAAR,CACJ,CAAC,CACL,CAEA,GAAID,EAAW,mBAA2B,GAAKA,EAAW,iBAAyB,GAAKA,EAAW,iBAAyB,EAAG,CAC3H,IAAMQ,EAAO,IAAInF,CAAY,QACvBoF,EAAkB,6BAAuD,EAAE,OAAQtB,GAAca,EAAW,SAASb,CAAS,CAAC,EAErI7B,EAAYkD,CAAI,EAAIX,EAA0B,CAC1C,MAAO,GACP,UAAWnH,EACX,aAAAqH,EACA,WAAYU,EACZ,IAAAR,CACJ,CAAC,CACL,CAEA,OAAO3C,CACX,EAAG,CAAC,CAAC,EAEFoD,EAAQJ,GC/Pf,IAAMK,GAAiB,CAAmB/D,EAAiBmD,IACvDnD,EAAW,IAAKW,GAERwC,IAAexC,CAAS,GAAG,IACnBwC,EAAaxC,CAAS,EAAmB,IAG9C,CACH,KAAMA,CACV,CACH,EAEEqD,EAAQD,GCNf,IAAME,GAAiC,CAACC,EAAqCC,KAEzE,OAAO,OAAOD,CAAY,EAAE,QAASE,GAAa,CAC9C,OAAO,OAAOA,CAA6D,EAAE,QAASC,GAAe,CAC7F,OAAQA,EAAyC,WAAc,UAC/D,OAAO,OAAQA,EAAyC,SAAS,EAAE,QAASC,GAAiB,CACrF,OAAQA,EAA0C,SAAY,UAC9D,OAAO,OAAQA,EAA0C,OAAoD,EAAE,QAC1GC,GAAgB,CACb,GAAI,OAAOA,EAAY,SAAY,SAAU,CACzC,IAAMC,EAAUD,EAAY,QAAQ,QAAQ,yBAA0B,EAAE,EAEpEJ,EAASK,CAAgC,GAAG,QAAU,SAEtDD,EAAY,QAAWJ,EAASK,CAAgC,EAAsB,MAE9F,CACJ,CACJ,CAER,CAAC,CAET,CAAC,CACL,CAAC,EAEMN,GAGLO,GAAkB,MAAmE,CACvF,KAAAC,EAAO,CAAE,OAAQ,CAAC,CAAE,EACpB,sBAAA1C,EAAwB,MACxB,OAAQ2C,EACR,aAAAnG,EACA,QAAAoG,EAAU,CAAE,kBAAmB,CAAE,mBAAoB,EAAK,EAAG,OAAQ,CAAC,CAAE,CAC5E,IAKM,CACF,IAAIhF,EACAZ,EAcJ,GAXIR,EAAa,QAAU,QAEvBoB,EAAOpB,EAAa,MACpBQ,EAAmBY,GAAM,aAElBpB,EAAa,WAAa,SAEjCoB,EAAO,MAAMpB,EAAa,SAAS,EACnCQ,EAAmBY,EAAK,aAGxBA,IAAS,OACT,MAAM,IAAI,UAAU,mCAAmC,EAG3D,IAAMiF,EAAS,IAAI/C,EAAuBlC,CAAI,EAExCkB,EAAc+D,EAAO,YAAY,EACjCC,EAAU,OAAO,KAAKhE,CAAW,EAEjCM,EAAS,KAAK,UAAU,CAC1B,GAAGN,EACH,GAAG+D,EAAO,gBAAgBC,CAAO,EACjC,GAAGD,EAAO,wBAAwB,EAClC,GAAGA,EAAO,0BAA0BC,CAAO,CAC/C,CAAC,EAEGH,IAAe,QACfA,EAAW,QAASjJ,GAAU,CAC1B,GAAI,CAAC,OAAO,KAAKsD,CAAgB,EAAE,SAAStD,CAAK,EAC7C,MAAM,IAAI,MAAM,cAAcA,CAAK,cAAc,CAEzD,CAAC,EAGL,IAAMF,EAASmJ,GAAe,OAAO,KAAK3F,CAAgB,EAEpD+F,EAAgB7C,EAA0B1G,EAAQkJ,EAAK,OAAQ1C,CAAqB,EACpFgD,EAAchB,EAAexI,EAAQoJ,EAAQ,MAAM,EACnDV,EAAeJ,EAAgB,CACjC,OAAQY,EAAK,OACb,aAAcE,EAAQ,OACtB,OAAQG,EACR,UAAWpJ,EAAmBqD,EAAkBxD,CAAM,CAC1D,CAAC,EACKyE,EAAU,KAAK,MAAMmB,EAAO,WAAW,gBAAiB,sBAAsB,CAAC,EAC/E+C,EAAWU,EAAO,wBAAwBC,EAAS7E,CAAO,EAEhE,MAAO,CACH,SAAAkE,EACA,MAAOF,GAA+BC,EAAcC,CAAmD,EACvG,QAAAlE,EACA,KAAM+E,CACV,CACJ,EAeOC,GAAQR","sourcesContent":["import type {\n // @ts-expect-error\n PrismaAction,\n} from \"@prisma/client\";\nimport type { HttpError } from \"http-errors\";\nimport createHttpError from \"http-errors\";\n\nimport type { Adapter, FakePrismaClient, 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, PrismaClient> {\n manyRelations?: {\n [key in M]?: string[];\n };\n models?: M[];\n primaryKey?: string;\n prismaClient: PrismaClient;\n}\n\ntype Delegate<T> = Record<PrismaAction, (...arguments_: any[]) => Promise<T>>;\n\nexport default class PrismaAdapter<T, M extends string, PrismaClient> implements Adapter<T, PrismaParsedQueryParameters, M> {\n private readonly ctorModels?: M[];\n\n private dmmf: any;\n\n private readonly getPrismaClientModels = async (): Promise<Record<string, object>> => {\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._dmmf !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = this.prismaClient._dmmf;\n\n return this.dmmf?.mappingsMap as Record<string, object>;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n if (this.prismaClient._getDmmf !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n this.dmmf = await this.prismaClient._getDmmf();\n\n return this.dmmf.mappingsMap as Record<string, object>;\n }\n\n throw new Error(\"Couldn't get prisma client models\");\n };\n\n private readonly manyRelations: {\n [key in M]?: string[];\n };\n\n private readonly primaryKey: string;\n\n private readonly prismaClient: FakePrismaClient & PrismaClient;\n\n public models?: M[];\n\n public constructor({ manyRelations = {}, models, primaryKey = \"id\", prismaClient }: AdapterCtorArguments<M, FakePrismaClient & PrismaClient>) {\n this.prismaClient = prismaClient;\n this.primaryKey = primaryKey;\n this.manyRelations = manyRelations;\n this.ctorModels = models;\n }\n\n private getPrismaDelegate(resourceName: M): Delegate<T> {\n return this.prismaClient[`${resourceName.charAt(0).toLowerCase()}${resourceName.slice(1)}`] as Delegate<T>;\n }\n\n public get client(): PrismaClient {\n return this.prismaClient;\n }\n\n public async connect(): Promise<void> {\n this.prismaClient.$connect();\n }\n\n public async create(resourceName: M, data: unknown, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).create({\n data,\n include: query.include,\n select: query.select,\n });\n }\n\n public async delete(resourceName: M, resourceId: number | string, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).delete({\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n\n public async disconnect(): Promise<void> {\n await this.prismaClient.$disconnect();\n }\n\n public async getAll(resourceName: M, query: PrismaParsedQueryParameters): Promise<T[]> {\n // @ts-expect-error\n return (await this.getPrismaDelegate(resourceName).findMany({\n cursor: query.cursor,\n distinct: query.distinct,\n include: query.include,\n orderBy: query.orderBy,\n select: query.select,\n skip: query.skip,\n take: query.take,\n where: query.where,\n })) as T[];\n }\n\n public getModels(): M[] {\n return this.models ?? [];\n }\n\n public async getOne(resourceName: M, resourceId: number | string, 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-expect-error\n return await findFunction({\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n\n public async getPaginationData(resourceName: M, query: PrismaParsedQueryParameters): Promise<PaginationData> {\n // @ts-expect-error\n const total: number = await this.getPrismaDelegate(resourceName).count({\n distinct: query.distinct,\n where: query.where,\n });\n\n return {\n page: Math.ceil((query.skip ?? 0) / (query.take ?? 0)) + 1,\n pageCount: Math.ceil(total / (query.take ?? 0)),\n total,\n };\n }\n\n // eslint-disable-next-line class-methods-use-this\n public handleError(error: Error): HttpError {\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 public async init(): Promise<void> {\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 this.models = models ?? (Object.keys(prismaDmmfModels) as M[]); // Retrieve model names from dmmf for prisma v2\n }\n\n public async mapModelsToRouteNames(): Promise<{ [key in M]?: string }> {\n return modelsToRouteNames(await this.getPrismaClientModels(), this.getModels());\n }\n\n public parseQuery(resourceName: M, query: ParsedQueryParameters): PrismaParsedQueryParameters {\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 public async update(resourceName: M, resourceId: number | string, data: unknown, query: PrismaParsedQueryParameters): Promise<T> {\n // @ts-expect-error\n return await this.getPrismaDelegate(resourceName).update({\n data,\n include: query.include,\n select: query.select,\n where: {\n [this.primaryKey]: resourceId,\n },\n });\n }\n}\n","type RouteMap<M extends string> = { [key in M]?: string };\n\nconst modelsToRouteNames = <M extends string = string>(mappingsMap: Record<string, object>, models: M[]): RouteMap<M> => {\n const routesMap: RouteMap<M> = {};\n\n models.forEach((model) => {\n // @ts-expect-error\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: unknown): 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 = (cursor: Record<string, boolean | number | string>): 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] = value as boolean | number | string;\n }\n });\n\n if (Object.keys(parsed).length !== 1) {\n throw new Error(\"cursor needs to be an object with exactly 1 property with a primitive value\");\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>(select: RecursiveField, fieldName: T): PrismaRecursive<T> => {\n const parsed: PrismaRecursive<T> = {};\n\n Object.keys(select).forEach((field) => {\n parsed[field] =\n select[field] === true\n ? true\n : ({\n [fieldName]: parsePrismaRecursiveField(select[field] as RecursiveField, fieldName),\n } as Record<T, PrismaRecursive<T>>);\n });\n\n return parsed;\n};\n\nexport default parsePrismaRecursiveField;\n","import type { Condition, SearchCondition, WhereCondition, WhereField, WhereOperator } from \"../../../types.d\";\nimport isPrimitive from \"../../../utils/is-primitive\";\nimport type { PrismaFieldFilter, PrismaRelationFilter, PrismaWhereField, PrismaWhereOperator } from \"../types.d\";\n\nconst isObject = (a: any) => a instanceof Object;\n\nconst operatorsAssociation: {\n [key in WhereOperator]?: PrismaWhereOperator;\n} = {\n $cont: \"contains\",\n $ends: \"endsWith\",\n $eq: \"equals\",\n $gt: \"gt\",\n $gte: \"gte\",\n $in: \"in\",\n $lt: \"lt\",\n $lte: \"lte\",\n $neq: \"not\",\n $notin: \"notIn\",\n $starts: \"startsWith\",\n};\n\n// eslint-disable-next-line security/detect-unsafe-regex,regexp/no-useless-flag\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 as SearchCondition;\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): Record<string, Condition> | undefined => {\n const operator = Object.keys(value)[0];\n const prismaOperator: PrismaWhereOperator | undefined = 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 // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n value: Condition | Date | WhereCondition | boolean | number | string,\n key: string,\n parsed: PrismaWhereField,\n manyRelations: string[],\n) => {\n // Reverse the keys so that we can format our object by nesting\n // eslint-disable-next-line etc/no-assign-mutated-array\n const fields = key.split(\".\").reverse();\n\n let formatFields: Record<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 // eslint-disable-next-line etc/no-assign-mutated-array\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...(oldParsed?.some as object),\n ...formatFields[initialFieldKey]?.some,\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\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nconst basicParse = (value: Condition | Date | WhereCondition | boolean | number | string, 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 { createPaginationMetaSchemaObject } from \"@visulima/pagination\";\nimport { 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: object | string) => {\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 private readonly schemaInputTypes: Map<string, any> = new Map<string, any>();\n\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n public constructor(private readonly dmmf: any) {}\n\n // eslint-disable-next-line class-methods-use-this,@typescript-eslint/explicit-module-boundary-types\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 items: {\n $ref: reference,\n },\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n };\n }\n\n return { $ref: reference };\n }\n\n const type = getJSONSchemaScalar(inputType.type);\n\n if (inputType.isList) {\n return {\n items: {\n type,\n },\n type: \"array\",\n xml: {\n name: inputType.type.name,\n wrapped: true,\n },\n };\n }\n\n return { type };\n }\n\n public getExampleModelsSchemas(\n modelNames: string[],\n schemas: Record<string, OpenAPIV3.SchemaObject>,\n ): Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> {\n const referenceToSchema = (reference: string) => {\n const name = reference.replace(\"#/components/schemas/\", \"\");\n const model = schemas[name] as OpenAPIV3.SchemaObject;\n\n const values: Record<string, object[] | string> = {};\n\n Object.entries((model.properties as OpenAPIV3.SchemaObject | undefined) ?? {}).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: Record<string, OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject>) => {\n const values: Record<string, object[] | object | string> = {};\n\n Object.entries(objectProperties).forEach(([key, value]) => {\n values[key] =\n (value as { $ref?: string }).$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: Record<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 // eslint-disable-next-line unicorn/no-array-reduce\n return modelNames.reduce((accumulator, modelName) => {\n const value: Record<string, object[] | object | string> = {};\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] as OpenAPIV3.SchemaObject;\n const meta: Record<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 [`${modelName}s`]: {\n value: [value],\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginatedModelsSchemas(modelNames: string[]): Record<string, OpenAPIV3.SchemaObject> {\n // eslint-disable-next-line unicorn/no-array-reduce\n return modelNames.reduce((accumulator, modelName) => {\n return {\n ...accumulator,\n [`${modelName}Page`]: {\n properties: {\n data: {\n items: {\n $ref: formatSchemaReference(modelName),\n },\n type: \"array\",\n xml: {\n name: \"data\",\n wrapped: true,\n },\n },\n meta: {\n $ref: formatSchemaReference(PAGINATION_SCHEMA_NAME),\n },\n },\n type: \"object\",\n xml: {\n name: `${modelName}Page`,\n },\n },\n };\n }, {});\n }\n\n // eslint-disable-next-line class-methods-use-this\n public getPaginationDataSchema(): Record<string, OpenAPIV3.SchemaObject> {\n return createPaginationMetaSchemaObject(PAGINATION_SCHEMA_NAME);\n }\n\n public parseInputTypes(models: string[]): Record<string, JSONSchema7> {\n // eslint-disable-next-line sonarjs/cognitive-complexity,unicorn/no-array-reduce\n const definitions = models.reduce((accumulator: Record<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 const dataFields = this.dmmf.mutationType.fieldMap[method].args[0].inputTypes[0].type.fields;\n const requiredProperties: string[] = [];\n // eslint-disable-next-line unicorn/no-array-reduce\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-expect-error\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 nullable: true,\n type: schemaType.filter((type: string) => type !== \"null\"),\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 // TODO: find the correct type\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return propertiesAccumulator;\n }, {});\n\n accumulator[schemaName] = {\n properties,\n type: \"object\",\n xml: {\n name: schemaName,\n },\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 properties: value,\n type: \"object\",\n xml: {\n name: key,\n },\n };\n });\n\n return definitions;\n }\n\n public parseModels(): Record<string, JSONSchema7> {\n const modelsDefinitions = transformDMMF(this.dmmf).definitions as Record<string, JSONSchema7>;\n\n Object.keys(modelsDefinitions).forEach((definition: number | string) => {\n // @TODO: added the correct type\n // @ts-expect-error\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 sonarjs/cognitive-complexity,@typescript-eslint/explicit-module-boundary-types\n public parseObjectInputType(fieldType: any): { $ref?: string; type?: string } {\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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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\nexport default PrismaJsonSchemaParser;\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatSchemaReference = (schemaName: string): 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>(modelNames: M[], models?: ModelsOptions<M>, defaultExposeStrategy: \"all\" | \"none\" = \"all\"): Routes<M> =>\n // eslint-disable-next-line unicorn/no-array-reduce\n 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 distinct: {\n description: \"Fields to distinctively retrieve\",\n name: \"distinct\",\n schema: {\n type: \"string\",\n },\n },\n include: {\n description: \"Include relations, same as select\",\n name: \"include\",\n schema: {\n type: \"string\",\n },\n },\n limit: {\n description: \"Maximum number of elements to retrieve\",\n name: \"limit\",\n schema: {\n minimum: 0,\n type: \"integer\",\n },\n },\n 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 name: \"orderBy\",\n schema: {\n type: \"string\",\n },\n },\n page: {\n description: \"Page number. Use only for pagination.\",\n name: \"page\",\n schema: {\n minimum: 1,\n type: \"integer\",\n },\n },\n select: {\n description: \"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts\",\n name: \"select\",\n schema: {\n type: \"string\",\n },\n },\n skip: {\n description: \"Number of rows to skip\",\n name: \"skip\",\n schema: {\n minimum: 0,\n type: \"integer\",\n },\n },\n where: {\n description: 'Fields to filter. See <a href=\"https://next-crud.js.org/query-params#where\">the docs</a>',\n name: \"where\",\n schema: {\n type: \"string\",\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[] = []): SwaggerParameter[] => {\n if (routeType === RouteType.READ_ALL) {\n return [...listQueryParameters, ...additionalQueryParameters].filter(Boolean) as SwaggerParameter[];\n }\n\n return [...commonQueryParameters, ...additionalQueryParameters].filter(Boolean) as SwaggerParameter[];\n};\n","// eslint-disable-next-line unicorn/prevent-abbreviations\nconst formatExampleReference = (schemaName: string): 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 hasId?: boolean;\n modelName: M;\n modelsConfig?: SwaggerModelsConfig<M>;\n routeTypes: RouteType[];\n tag: string;\n}\n\ntype HttpMethod = \"delete\" | \"get\" | \"post\" | \"put\";\n\nconst generateContentForSchema = (schemaName: string, isArray?: boolean) => {\n if (isArray) {\n return {\n items: {\n $ref: formatSchemaReference(schemaName),\n },\n type: \"array\",\n };\n }\n\n return {\n $ref: formatSchemaReference(schemaName),\n };\n};\n\nconst generateSwaggerResponse = (routeType: RouteType, modelName: string): { content: any; statusCode: number } | undefined => {\n if (routeType === RouteType.CREATE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} created`,\n },\n statusCode: 201,\n };\n }\n\n if (routeType === RouteType.DELETE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item deleted`,\n },\n statusCode: 200,\n };\n }\n\n if (routeType === RouteType.READ_ALL) {\n return {\n content: {\n content: {\n \"application/json\": {\n examples: {\n Default: {\n $ref: formatExampleReference(`${modelName}s`),\n },\n Pagination: {\n $ref: formatExampleReference(`${modelName}Page`),\n },\n },\n schema: {\n oneOf: [generateContentForSchema(modelName, true), generateContentForSchema(`${modelName}Page`, false)],\n },\n },\n },\n description: `${modelName} list retrieved`,\n },\n statusCode: 200,\n };\n }\n\n if (routeType === RouteType.READ_ONE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item retrieved`,\n },\n statusCode: 200,\n };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (routeType === RouteType.UPDATE) {\n return {\n content: {\n content: {\n \"application/json\": {\n example: formatExampleReference(modelName),\n schema: generateContentForSchema(modelName),\n },\n },\n description: `${modelName} item updated`,\n },\n statusCode: 200,\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 as string} was not found.`);\n }\n }\n};\n\nconst generateSwaggerPathObject = <M extends string>({\n hasId,\n modelName,\n modelsConfig,\n routeTypes,\n tag,\n}: GenerateSwaggerPathObjectParameters<M>): Record<string, any> => {\n const methods: Record<string, any> = {};\n\n routeTypes.forEach((routeType) => {\n if (routeTypes.includes(routeType)) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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] = {\n parameters: getQueryParameters(routeType).map((queryParameter) => {\n return { ...queryParameter, in: \"query\" };\n }),\n\n responses: {\n [response.statusCode]: response.content,\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...modelsConfig?.[modelName]?.routeTypes?.[routeType]?.responses,\n },\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n summary: modelsConfig?.[modelName]?.routeTypes?.[routeType]?.summary,\n tags: [tag],\n };\n\n if (hasId) {\n methods[method].parameters.push({\n description: `ID of the ${modelName}`,\n in: \"path\",\n name: \"id\",\n required: true,\n schema: {\n type: \"string\",\n },\n });\n }\n\n if (routeType === RouteType.UPDATE) {\n methods[method].requestBody = generateRequestBody(\"Update\", returnType);\n } else if (routeType === RouteType.CREATE) {\n methods[method].requestBody = generateRequestBody(\"Create\", returnType);\n }\n }\n });\n\n return methods;\n};\n\ninterface GetSwaggerPathsParameters<M extends string> {\n models?: ModelsOptions<M>;\n modelsConfig?: SwaggerModelsConfig<M>;\n routes: Routes<M>;\n routesMap?: { [key in M]?: string };\n}\n\nconst getSwaggerPaths = <M extends string>({ models, modelsConfig, routes, routesMap }: GetSwaggerPathsParameters<M>): Record<string, any> =>\n // eslint-disable-next-line unicorn/no-array-reduce\n Object.keys(routes).reduce((accumulator: Record<string, any>, value: M | string) => {\n const routeTypes = routes[value] as RouteType[];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const resourceName = models?.[value]?.name ? (models[value] as ModelOption).name : routesMap?.[value as M] ?? value;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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 modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n tag,\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 hasId: true,\n modelName: value as M,\n modelsConfig,\n routeTypes: routeTypesToUse,\n tag,\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[] =>\n modelNames.map((modelName) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (modelsConfig?.[modelName]?.tag) {\n return (modelsConfig[modelName] as ModelsConfig).tag;\n }\n\n return {\n name: modelName,\n };\n });\n\nexport default getSwaggerTags;\n","import type { OpenAPIV3 } from \"openapi-types\";\n\nimport modelsToRouteNames from \"../../../adapter/prisma/utils/models-to-route-names\";\nimport type { FakePrismaClient, 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: Record<string, OpenAPIV3.ExampleObject>): OpenAPIV3.PathsObject => {\n // eslint-disable-next-line sonarjs/cognitive-complexity\n Object.values(swaggerPaths).forEach((pathSpec) => {\n Object.values(pathSpec as OpenAPIV3.OperationObject & OpenAPIV3.PathsObject).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((responseSpec as OpenAPIV3.ResponseObject).content as Record<string, OpenAPIV3.MediaTypeObject>).forEach(\n (contentSpec) => {\n if (typeof contentSpec.example === \"string\") {\n const example = contentSpec.example.replace(\"#/components/examples/\", \"\");\n\n if (examples[example as keyof typeof examples]?.value !== undefined) {\n // eslint-disable-next-line no-param-reassign\n contentSpec.example = (examples[example as keyof typeof examples] as typeof examples)[\"value\"];\n }\n }\n },\n );\n }\n });\n }\n });\n });\n\n return swaggerPaths;\n};\n\nconst modelsToOpenApi = async <M extends string = string, PrismaClient = FakePrismaClient>({\n crud = { models: {} },\n defaultExposeStrategy = \"all\",\n models: ctorModels,\n prismaClient,\n swagger = { allowedMediaTypes: { \"application/json\": true }, models: {} },\n}: ModelsToOpenApiParameters<M, PrismaClient>): Promise<{\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>;\n paths: OpenAPIV3.PathsObject;\n schemas: Record<string, OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject>;\n tags: OpenAPIV3.TagObject[];\n}> => {\n let dmmf: any;\n let prismaDmmfModels: any;\n\n // eslint-disable-next-line no-underscore-dangle\n if (prismaClient._dmmf !== undefined) {\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 !== undefined) {\n // eslint-disable-next-line no-underscore-dangle\n dmmf = await prismaClient._getDmmf();\n prismaDmmfModels = dmmf.mappingsMap;\n }\n\n if (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 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 models: crud.models,\n modelsConfig: swagger.models,\n routes: swaggerRoutes,\n routesMap: modelsToRouteNames(prismaDmmfModels, models),\n });\n const schemas = JSON.parse(schema.replaceAll(\"#/definitions\", \"#/components/schemas\"));\n const examples = parser.getExampleModelsSchemas(dModels, schemas);\n\n return {\n examples,\n paths: overwritePathsExampleWithModel(swaggerPaths, examples as Record<string, OpenAPIV3.ExampleObject>),\n schemas,\n tags: swaggerTags,\n };\n};\n\nexport interface ModelsToOpenApiParameters<M extends string, PrismaClient> {\n crud?: {\n models: ModelsOptions<M>;\n };\n defaultExposeStrategy?: \"all\" | \"none\";\n models?: M[];\n prismaClient: FakePrismaClient & PrismaClient;\n swagger?: Partial<{\n allowedMediaTypes: Record<string, boolean>;\n models: SwaggerModelsConfig<M>;\n }>;\n}\n\nexport default modelsToOpenApi;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visulima/crud",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
4
4
|
"description": "visulima crud",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"anolilab",
|
|
@@ -70,14 +70,14 @@
|
|
|
70
70
|
"test:watch": "vitest"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@visulima/pagination": "2.0.
|
|
74
|
-
"@visulima/prisma-dmmf-transformer": "1.0.
|
|
73
|
+
"@visulima/pagination": "2.0.6",
|
|
74
|
+
"@visulima/prisma-dmmf-transformer": "1.0.9",
|
|
75
75
|
"http-errors": "^2.0.0",
|
|
76
76
|
"lodash.set": "^4.3.2",
|
|
77
77
|
"path-to-regexp": "^6.2.1"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
|
-
"@anolilab/eslint-config": "^
|
|
80
|
+
"@anolilab/eslint-config": "^11.0.2",
|
|
81
81
|
"@anolilab/prettier-config": "^5.0.1",
|
|
82
82
|
"@anolilab/semantic-release-preset": "^6.0.2",
|
|
83
83
|
"@prisma/client": "4.16.2",
|
|
@@ -90,12 +90,12 @@
|
|
|
90
90
|
"@types/node": "18.16.18",
|
|
91
91
|
"@vitest/coverage-v8": "^0.33.0",
|
|
92
92
|
"cross-env": "^7.0.3",
|
|
93
|
-
"eslint": "^8.
|
|
93
|
+
"eslint": "^8.46.0",
|
|
94
94
|
"eslint-plugin-etc": "^2.0.3",
|
|
95
95
|
"eslint-plugin-jsx-a11y": "^6.7.1",
|
|
96
96
|
"eslint-plugin-mdx": "^2.1.0",
|
|
97
97
|
"eslint-plugin-testing-library": "^5.11.0",
|
|
98
|
-
"eslint-plugin-vitest": "^0.2.
|
|
98
|
+
"eslint-plugin-vitest": "^0.2.8",
|
|
99
99
|
"next": "^12.0.0 || ^13.0.0",
|
|
100
100
|
"next-test-api-route-handler": "^4.0.0-canary.1",
|
|
101
101
|
"node-mocks-http": "^1.12.2",
|
|
@@ -124,7 +124,9 @@
|
|
|
124
124
|
"react": false,
|
|
125
125
|
"react-usememo": false,
|
|
126
126
|
"react-hooks": false,
|
|
127
|
-
"testing-library": false
|
|
127
|
+
"testing-library": false,
|
|
128
|
+
"@testing-library/dom": false,
|
|
129
|
+
"@testing-library/react": false
|
|
128
130
|
},
|
|
129
131
|
"warn_on_unsupported_typescript_version": false,
|
|
130
132
|
"info_on_disabling_jsx_react_rule": false,
|