@visulima/crud 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +46 -16
  3. package/dist/chunk-SH6A4KBC.mjs +28 -0
  4. package/dist/{chunk-UBXIGP5H.mjs.map → chunk-SH6A4KBC.mjs.map} +1 -1
  5. package/dist/chunk-ZY3WOLEP.js +28 -0
  6. package/dist/chunk-ZY3WOLEP.js.map +1 -0
  7. package/dist/index.d.ts +9 -15
  8. package/dist/index.js +57 -37
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +54 -34
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/next/index.js +10 -281
  13. package/dist/next/index.js.map +1 -1
  14. package/dist/next/index.mjs +9 -280
  15. package/dist/next/index.mjs.map +1 -1
  16. package/next/package.json +18 -0
  17. package/package.json +16 -14
  18. package/dist/chunk-FJWRITBO.js +0 -52
  19. package/dist/chunk-FJWRITBO.js.map +0 -1
  20. package/dist/chunk-UBXIGP5H.mjs +0 -52
  21. package/src/adapter/prisma/index.ts +0 -241
  22. package/src/adapter/prisma/types.d.ts +0 -46
  23. package/src/adapter/prisma/utils/models-to-route-names.ts +0 -12
  24. package/src/adapter/prisma/utils/parse-cursor.ts +0 -26
  25. package/src/adapter/prisma/utils/parse-order-by.ts +0 -21
  26. package/src/adapter/prisma/utils/parse-recursive.ts +0 -26
  27. package/src/adapter/prisma/utils/parse-where.ts +0 -197
  28. package/src/base-crud-handler.ts +0 -181
  29. package/src/handler/create.ts +0 -21
  30. package/src/handler/delete.ts +0 -27
  31. package/src/handler/list.ts +0 -62
  32. package/src/handler/read.ts +0 -27
  33. package/src/handler/update.ts +0 -29
  34. package/src/index.ts +0 -27
  35. package/src/next/api/edge/index.ts +0 -23
  36. package/src/next/api/node/index.ts +0 -27
  37. package/src/next/index.ts +0 -2
  38. package/src/query-parser.ts +0 -94
  39. package/src/swagger/adapter/prisma/index.ts +0 -95
  40. package/src/swagger/json-schema-parser.ts +0 -456
  41. package/src/swagger/parameters.ts +0 -83
  42. package/src/swagger/types.d.ts +0 -53
  43. package/src/swagger/utils/format-example-ref.ts +0 -4
  44. package/src/swagger/utils/format-schema-ref.ts +0 -4
  45. package/src/swagger/utils/get-models-accessible-routes.ts +0 -23
  46. package/src/swagger/utils/get-swagger-paths.ts +0 -244
  47. package/src/swagger/utils/get-swagger-tags.ts +0 -13
  48. package/src/types.d.ts +0 -124
  49. package/src/utils/format-resource-id.ts +0 -3
  50. package/src/utils/get-accessible-routes.ts +0 -18
  51. package/src/utils/get-resource-name-from-url.ts +0 -23
  52. package/src/utils/get-route-type.ts +0 -99
  53. package/src/utils/is-primitive.ts +0 -5
  54. package/src/utils/validate-adapter-methods.ts +0 -15
@@ -1,181 +0,0 @@
1
- import type { HttpError } from "http-errors";
2
- import createHttpError from "http-errors";
3
- // eslint-disable-next-line import/no-extraneous-dependencies
4
- import { ApiError } from "next/dist/server/api-utils";
5
- import type { IncomingMessage, ServerResponse } from "node:http";
6
-
7
- import createHandler from "./handler/create";
8
- import deleteHandler from "./handler/delete";
9
- import listHandler from "./handler/list";
10
- import readHandler from "./handler/read";
11
- import updateHandler from "./handler/update";
12
- import parseQuery from "./query-parser";
13
- import type {
14
- Adapter, ExecuteHandler, HandlerOptions, HandlerParameters, ParsedQueryParameters,
15
- } from "./types.d";
16
- import { RouteType } from "./types.d";
17
- import formatResourceId from "./utils/format-resource-id";
18
- import getAccessibleRoutes from "./utils/get-accessible-routes";
19
- import { getResourceNameFromUrl } from "./utils/get-resource-name-from-url";
20
- import getRouteType from "./utils/get-route-type";
21
- import validateAdapterMethods from "./utils/validate-adapter-methods";
22
-
23
- type ResponseConfig = { status: number; data: any };
24
-
25
- async function baseHandler<R extends Request, Context extends unknown, T, Q extends ParsedQueryParameters = any, M extends string = string>(
26
- responseExecutor: (responseOrContext: Context, responseConfig: ResponseConfig) => Promise<Response>,
27
- finalExecutor: (responseOrContext: Context) => Promise<void>,
28
- adapter: Adapter<T, Q>,
29
- options?: HandlerOptions<M>,
30
- ): Promise<ExecuteHandler<R, Context>>;
31
-
32
- async function baseHandler<R extends IncomingMessage, RResponse extends ServerResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(
33
- responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<void>,
34
- finalExecutor: (responseOrContext: RResponse) => Promise<void>,
35
- adapter: Adapter<T, Q>,
36
- options?: HandlerOptions<M>,
37
- ): Promise<ExecuteHandler<R, RResponse>>;
38
-
39
- // eslint-disable-next-line radar/cognitive-complexity,max-len
40
- async function baseHandler<R extends { url: string; method: string }, RResponse, T, Q extends ParsedQueryParameters = any, M extends string = string>(
41
- responseExecutor: (responseOrContext: RResponse, responseConfig: ResponseConfig) => Promise<RResponse>,
42
- finalExecutor: (responseOrContext: RResponse) => Promise<void>,
43
- adapter: Adapter<T, Q>,
44
- options?: HandlerOptions<M>,
45
- ): Promise<ExecuteHandler<R, RResponse>> {
46
- try {
47
- validateAdapterMethods(adapter);
48
- } catch (error_: any) {
49
- const error = error_ as HttpError;
50
-
51
- throw new ApiError(error.statusCode, error.message);
52
- }
53
-
54
- await adapter.init?.();
55
-
56
- const config = {
57
- formatResourceId,
58
- pagination: {
59
- perPage: 20,
60
- },
61
- ...options,
62
- };
63
-
64
- const routeNames = await adapter.mapModelsToRouteNames?.();
65
- const modelRoutes: { [key in M]?: string } = {};
66
-
67
- adapter.getModels().forEach((modelName) => {
68
- modelRoutes[modelName as M] = config?.models?.[modelName as M]?.name || routeNames?.[modelName] || modelName;
69
- });
70
-
71
- return async (request, responseOrContext) => {
72
- const { resourceName, modelName } = getResourceNameFromUrl(request.url as string, modelRoutes);
73
-
74
- if (!resourceName) {
75
- if (process.env.NODE_ENV === "development") {
76
- const mappedModels = await adapter.mapModelsToRouteNames?.();
77
-
78
- if (typeof mappedModels === "object") {
79
- throw createHttpError(404, `Resource not found, possible models: ${Object.values(mappedModels).join(", ")}`);
80
- }
81
- }
82
-
83
- throw createHttpError(404, `Resource not found: ${request.url}`);
84
- }
85
-
86
- const { routeType, resourceId } = getRouteType(request.method as string, request.url as string, resourceName);
87
-
88
- if (routeType === null) {
89
- throw createHttpError(404, `Route not found: ${request.url}`);
90
- }
91
-
92
- const modelConfig = options?.models?.[modelName as M];
93
-
94
- const accessibleRoutes = getAccessibleRoutes(modelConfig?.only, modelConfig?.exclude, options?.exposeStrategy || "all");
95
-
96
- if (!accessibleRoutes.includes(routeType)) {
97
- throw createHttpError(404, `Route not found: ${request.url}`);
98
- }
99
-
100
- try {
101
- const resourceIdFormatted = modelConfig?.formatResourceId?.(resourceId as string) ?? config.formatResourceId(resourceId as string);
102
-
103
- await adapter.connect?.();
104
-
105
- const parsedQuery = parseQuery((request.url as string).split("?")[1]);
106
- const parameters: HandlerParameters<T, Q> = {
107
- adapter,
108
- query: adapter.parseQuery(modelName as M, parsedQuery),
109
- resourceName: modelName as string,
110
- };
111
-
112
- try {
113
- let responseConfig: ResponseConfig;
114
-
115
- switch (routeType) {
116
- case RouteType.READ_ONE: {
117
- responseConfig = await (config?.handlers?.get || readHandler)<T, Q>({
118
- ...parameters,
119
- resourceId: resourceIdFormatted,
120
- });
121
- break;
122
- }
123
- case RouteType.READ_ALL: {
124
- responseConfig = await (config?.handlers?.list || listHandler)<T, Q>({
125
- ...parameters,
126
- query: {
127
- ...parameters.query,
128
- page: parsedQuery.page ? Number(parsedQuery.page) : undefined,
129
- limit: parsedQuery.limit ? Number(parsedQuery.limit) : undefined,
130
- },
131
- pagination: config.pagination,
132
- });
133
- break;
134
- }
135
- case RouteType.CREATE: {
136
- responseConfig = await (config?.handlers?.create || createHandler)<T, Q, R>({
137
- ...parameters,
138
- request: request as R & { body: Record<string, any> },
139
- });
140
- break;
141
- }
142
- case RouteType.UPDATE: {
143
- responseConfig = await (config?.handlers?.update || updateHandler)<T, Q, R>({
144
- ...parameters,
145
- resourceId: resourceIdFormatted,
146
- request: request as R & { body: Partial<T> },
147
- });
148
- break;
149
- }
150
- case RouteType.DELETE: {
151
- responseConfig = await (config?.handlers?.delete || deleteHandler)<T, Q>({
152
- ...parameters,
153
- resourceId: resourceIdFormatted,
154
- });
155
- break;
156
- }
157
- default: {
158
- responseConfig = {
159
- status: 404,
160
- data: "Method not found",
161
- };
162
- }
163
- }
164
-
165
- await responseExecutor(responseOrContext, responseConfig);
166
- } catch (error: any) {
167
- if (adapter.handleError && !(error instanceof ApiError)) {
168
- adapter.handleError(error);
169
- } else {
170
- throw error;
171
- }
172
- }
173
- } finally {
174
- await adapter.disconnect?.();
175
-
176
- await finalExecutor(responseOrContext);
177
- }
178
- };
179
- }
180
-
181
- export default baseHandler;
@@ -1,21 +0,0 @@
1
- import type { HandlerParameters } from "../types.d";
2
-
3
- const createHandler: Handler = async ({
4
- adapter, query, resourceName, request,
5
- }) => {
6
- const resources = await adapter.create(resourceName, request.body, query);
7
-
8
- return {
9
- data: resources,
10
- status: 201,
11
- };
12
- };
13
-
14
- export type Handler = <T, Q, Request>(
15
- parameters: HandlerParameters<T, Q> & { request: Request & { body: Record<string, any> } },
16
- ) => Promise<{
17
- data: any;
18
- status: number;
19
- }>;
20
-
21
- export default createHandler;
@@ -1,27 +0,0 @@
1
- import createHttpError from "http-errors";
2
-
3
- import type { UniqueResourceHandlerParameters } from "../types.d";
4
-
5
- const deleteHandler: Handler = async ({
6
- adapter, query, resourceName, resourceId,
7
- }) => {
8
- const resource = await adapter.getOne(resourceName, resourceId, query);
9
-
10
- if (resource) {
11
- const deletedResource = await adapter.delete(resourceName, resourceId, query);
12
-
13
- return {
14
- data: deletedResource,
15
- status: 200,
16
- };
17
- }
18
- throw createHttpError(404, `${resourceName} ${resourceId} not found`);
19
- };
20
-
21
- export type Handler = <T, Q>(
22
- parameters: UniqueResourceHandlerParameters<T, Q>,
23
- ) => Promise<{
24
- data: any;
25
- status: number;
26
- }>;
27
- export default deleteHandler;
@@ -1,62 +0,0 @@
1
- import { paginate } from "@visulima/pagination";
2
-
3
- import type { HandlerParameters, PaginationConfig, ParsedQueryParameters } from "../types.d";
4
-
5
- type PaginationOptions = {
6
- page: number;
7
- perPage: number;
8
- };
9
-
10
- const listHandler: Handler = async ({
11
- adapter, query, resourceName, pagination,
12
- }) => {
13
- let isPaginated = false;
14
- let paginationOptions: PaginationOptions | undefined;
15
-
16
- if (typeof query?.page !== "undefined") {
17
- if (query?.page <= 0) {
18
- throw new Error("page query must be a strictly positive number");
19
- }
20
-
21
- paginationOptions = {
22
- page: query?.page,
23
- perPage: query?.limit || pagination.perPage,
24
- };
25
- }
26
-
27
- if (paginationOptions) {
28
- isPaginated = true;
29
-
30
- // eslint-disable-next-line no-param-reassign
31
- query.skip = (paginationOptions.page - 1) * paginationOptions.perPage;
32
- // eslint-disable-next-line no-param-reassign
33
- query.limit = paginationOptions.perPage;
34
- }
35
-
36
- const resources = await adapter.getAll(resourceName, query);
37
-
38
- if (isPaginated) {
39
- const { page, total } = await adapter.getPaginationData(resourceName, query);
40
-
41
- const paginator = paginate(page, (paginationOptions as PaginationOptions).perPage as number, total, resources);
42
-
43
- return {
44
- data: paginator.toJSON(),
45
- status: 200,
46
- };
47
- }
48
-
49
- return {
50
- data: resources,
51
- status: 200,
52
- };
53
- };
54
-
55
- export type Handler = <T, Q extends ParsedQueryParameters>(
56
- parameters: HandlerParameters<T, Q> & { pagination: PaginationConfig },
57
- ) => Promise<{
58
- data: any;
59
- status: number;
60
- }>;
61
-
62
- export default listHandler;
@@ -1,27 +0,0 @@
1
- import createHttpError from "http-errors";
2
-
3
- import type { UniqueResourceHandlerParameters } from "../types.d";
4
-
5
- const readHandler: Handler = async ({
6
- adapter, query, resourceName, resourceId,
7
- }) => {
8
- const resource = await adapter.getOne(resourceName, resourceId, query);
9
-
10
- if (!resource) {
11
- throw createHttpError(404, `${resourceName} ${resourceId} not found`);
12
- }
13
-
14
- return {
15
- data: resource,
16
- status: 200,
17
- };
18
- };
19
-
20
- export type Handler = <T, Q>(
21
- parameters: UniqueResourceHandlerParameters<T, Q>,
22
- ) => Promise<{
23
- data: any;
24
- status: number;
25
- }>;
26
-
27
- export default readHandler;
@@ -1,29 +0,0 @@
1
- import createHttpError from "http-errors";
2
-
3
- import type { UniqueResourceHandlerParameters } from "../types.d";
4
-
5
- const updateHandler: Handler = async ({
6
- adapter, query, resourceName, resourceId, request,
7
- }) => {
8
- const resource = await adapter.getOne(resourceName, resourceId, query);
9
-
10
- if (resource) {
11
- const updatedResource = await adapter.update(resourceName, resourceId, request.body, query);
12
-
13
- return {
14
- status: 201,
15
- data: updatedResource,
16
- };
17
- }
18
-
19
- throw createHttpError(404, `${resourceName} ${resourceId} not found`);
20
- };
21
-
22
- export type Handler = <T, Q, Request>(
23
- parameters: UniqueResourceHandlerParameters<T, Q> & { request: Request & { body: Partial<T> } },
24
- ) => Promise<{
25
- data: any;
26
- status: number;
27
- }>;
28
-
29
- export default updateHandler;
package/src/index.ts DELETED
@@ -1,27 +0,0 @@
1
- export { default as PrismaAdapter } from "./adapter/prisma";
2
-
3
- export { RouteType } from "./types.d";
4
- export type {
5
- ParsedQueryParameters,
6
- PaginationConfig,
7
- HandlerParameters,
8
- Adapter,
9
- ModelsOptions,
10
- HandlerOptions as CrudHandlerOptions,
11
- ModelOption,
12
- UniqueResourceHandlerParameters,
13
- Condition,
14
- OrderByField,
15
- OrderByOperator,
16
- RecursiveField,
17
- WhereField,
18
- WhereOperator,
19
- WhereCondition,
20
- SearchCondition,
21
- PaginationData,
22
- } from "./types.d";
23
-
24
- export type { SwaggerModelsConfig } from "./swagger/types.d";
25
-
26
- export type { ModelsToOpenApiParameters } from "./swagger/adapter/prisma";
27
- export { default as modelsToOpenApi } from "./swagger/adapter/prisma";
@@ -1,23 +0,0 @@
1
- import baseHandler from "../../../base-crud-handler";
2
- import type {
3
- Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,
4
- } from "../../../types.d";
5
-
6
- async function handler<T, R extends Request, Context, Q extends ParsedQueryParameters = any, M extends string = string>(
7
- adapter: Adapter<T, Q>,
8
- options?: HandlerOptions<M>,
9
- ): Promise<ExecuteHandler<R, Context>> {
10
- return baseHandler<R, Context, T, Q, M>(
11
- async (_, responseConfig) => new Response(JSON.stringify(responseConfig.data), {
12
- status: responseConfig.status,
13
- headers: {
14
- "content-type": "application/json; charset=utf-8",
15
- },
16
- }),
17
- async () => {},
18
- adapter,
19
- options,
20
- );
21
- }
22
-
23
- export default handler;
@@ -1,27 +0,0 @@
1
- import type { NextApiRequest, NextApiResponse } from "next";
2
-
3
- import baseHandler from "../../../base-crud-handler";
4
- import type {
5
- Adapter, ExecuteHandler, HandlerOptions, ParsedQueryParameters,
6
- } from "../../../types.d";
7
-
8
- async function handler<
9
- T,
10
- Q extends ParsedQueryParameters = any,
11
- R extends NextApiRequest = NextApiRequest,
12
- Response extends NextApiResponse = NextApiResponse,
13
- M extends string = string,
14
- >(adapter: Adapter<T, Q>, options?: HandlerOptions<M>): Promise<ExecuteHandler<R, Response>> {
15
- return baseHandler<R, Response, T, Q, M>(
16
- async (response, responseConfig) => {
17
- response.status(responseConfig.status).send(responseConfig.data);
18
- },
19
- async (response) => {
20
- (response as Response).end();
21
- },
22
- adapter,
23
- options,
24
- );
25
- }
26
-
27
- export default handler;
package/src/next/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export { default as edgeHandler } from "./api/edge";
2
- export { default as nodeHandler } from "./api/node";
@@ -1,94 +0,0 @@
1
- import set from "lodash.set";
2
- import { parse } from "qs";
3
-
4
- import type {
5
- OrderByField, ParsedQueryParameters, RecursiveField, WhereField,
6
- } from "./types.d";
7
-
8
- const parseRecursive = (select: string): RecursiveField => {
9
- if (typeof select === "string") {
10
- const selectFields: RecursiveField = {};
11
-
12
- const fields = select.split(",");
13
-
14
- fields.forEach((field) => {
15
- set(selectFields, field, true);
16
- });
17
-
18
- return selectFields;
19
- }
20
-
21
- throw new Error("select query param must be a string");
22
- };
23
-
24
- const parseWhere = (where: string): WhereField => {
25
- const whereObject = JSON.parse(where);
26
- const parsed: WhereField = {};
27
-
28
- Object.keys(whereObject).forEach((key) => {
29
- set(parsed, key, whereObject[key]);
30
- });
31
-
32
- return parsed;
33
- };
34
-
35
- const parseOrderBy = (orderBy: string): OrderByField => {
36
- const parsed: OrderByField = {};
37
- const orderByObject = JSON.parse(orderBy);
38
-
39
- if (Object.keys(orderByObject).length > 0) {
40
- const key = Object.keys(orderByObject)[0];
41
-
42
- if (orderByObject[key as keyof typeof orderByObject] === "$asc" || orderByObject[key as keyof typeof orderByObject] === "$desc") {
43
- parsed[key as string] = orderByObject[key as keyof typeof orderByObject];
44
- }
45
- }
46
-
47
- if (Object.keys(parsed).length !== 1) {
48
- throw new Error("orderBy needs to be an object with exactly 1 property with either $asc or $desc value");
49
- }
50
-
51
- return parsed;
52
- };
53
-
54
- // eslint-disable-next-line radar/cognitive-complexity
55
- const parseQuery = (queryString?: string): ParsedQueryParameters => {
56
- if (queryString) {
57
- const query = parse(queryString);
58
- const parsedQuery: ParsedQueryParameters = {};
59
-
60
- if (query.select) {
61
- parsedQuery.select = parseRecursive(query.select as string);
62
- }
63
- if (query.include) {
64
- parsedQuery.include = parseRecursive(query.include as string);
65
- }
66
- if (query.where) {
67
- parsedQuery.where = parseWhere(query.where as string);
68
- }
69
- if (query.orderBy) {
70
- parsedQuery.orderBy = parseOrderBy(query.orderBy as string);
71
- }
72
- if (typeof query.limit !== "undefined") {
73
- parsedQuery.limit = Number.isFinite(+query.limit) ? +query.limit : undefined;
74
- }
75
- if (typeof query.skip !== "undefined") {
76
- parsedQuery.skip = Number.isFinite(+query.skip) ? +query.skip : undefined;
77
- }
78
- if (query.distinct) {
79
- parsedQuery.distinct = query.distinct as string;
80
- }
81
- if (query.page) {
82
- parsedQuery.page = Number.isFinite(+query.page) ? +query.page : undefined;
83
- }
84
-
85
- return {
86
- originalQuery: query,
87
- ...parsedQuery,
88
- };
89
- }
90
-
91
- return {};
92
- };
93
-
94
- export default parseQuery;
@@ -1,95 +0,0 @@
1
- // eslint-disable-next-line import/no-extraneous-dependencies
2
- import {
3
- // @ts-ignore
4
- PrismaClient,
5
- } from "@prisma/client";
6
-
7
- import modelsToRouteNames from "../../../adapter/prisma/utils/models-to-route-names";
8
- import type { ModelsOptions } from "../../../types.d";
9
- import PrismaJsonSchemaParser from "../../json-schema-parser";
10
- import type { SwaggerModelsConfig } from "../../types.d";
11
- import getModelsAccessibleRoutes from "../../utils/get-models-accessible-routes";
12
- import getSwaggerPaths from "../../utils/get-swagger-paths";
13
- import getSwaggerTags from "../../utils/get-swagger-tags";
14
-
15
- const modelsToOpenApi = async <M extends string = string>({
16
- prismaClient,
17
- models: ctorModels,
18
- swagger = { models: {}, allowedMediaTypes: { "application/json": true } },
19
- crud = { models: {} },
20
- defaultExposeStrategy = "all",
21
- }: ModelsToOpenApiParameters<M>) => {
22
- let dmmf: any;
23
- let prismaDmmfModels: any;
24
-
25
- // eslint-disable-next-line no-underscore-dangle
26
- if (prismaClient._dmmf) {
27
- // eslint-disable-next-line no-underscore-dangle
28
- dmmf = prismaClient._dmmf;
29
- prismaDmmfModels = dmmf?.mappingsMap;
30
- // eslint-disable-next-line no-underscore-dangle
31
- } else if (prismaClient._getDmmf) {
32
- // eslint-disable-next-line no-underscore-dangle
33
- dmmf = await prismaClient._getDmmf();
34
- prismaDmmfModels = dmmf.mappingsMap;
35
- }
36
-
37
- if (typeof dmmf === undefined) {
38
- throw new TypeError("Couldn't get prisma client models");
39
- }
40
-
41
- const parser = new PrismaJsonSchemaParser(dmmf);
42
-
43
- const definitions = parser.parseModels();
44
- const dModels = Object.keys(definitions);
45
-
46
- const schema = JSON.stringify({
47
- ...definitions,
48
- ...parser.parseInputTypes(dModels),
49
- ...parser.getPaginationDataSchema(),
50
- ...parser.getPaginatedModelsSchemas(dModels),
51
- });
52
-
53
- if (typeof ctorModels !== "undefined") {
54
- ctorModels.forEach((model) => {
55
- if (!Object.keys(prismaDmmfModels).includes(model)) {
56
- throw new Error(`Model name ${model} is invalid.`);
57
- }
58
- });
59
- }
60
-
61
- // @ts-ignore
62
- const models = ctorModels ?? (Object.keys(prismaDmmfModels) as M[]);
63
-
64
- const swaggerRoutes = getModelsAccessibleRoutes(models, crud.models || {}, defaultExposeStrategy);
65
- const swaggerTags = getSwaggerTags(models, swagger?.models || {});
66
- const swaggerPaths = getSwaggerPaths({
67
- routes: swaggerRoutes,
68
- modelsConfig: swagger?.models || {},
69
- models: crud.models || {},
70
- routesMap: modelsToRouteNames(prismaDmmfModels, models),
71
- });
72
- const schemas = JSON.parse(schema.replace(/#\/definitions/g, "#/components/schemas"));
73
-
74
- return {
75
- schemas,
76
- examples: parser.getExampleModelsSchemas(dModels, schemas),
77
- tags: swaggerTags,
78
- paths: swaggerPaths,
79
- };
80
- };
81
-
82
- export interface ModelsToOpenApiParameters<M extends string = string> {
83
- prismaClient: PrismaClient;
84
- defaultExposeStrategy?: "all" | "none";
85
- models?: M[];
86
- swagger?: Partial<{
87
- models: SwaggerModelsConfig<M>;
88
- allowedMediaTypes: { [key: string]: boolean };
89
- }>;
90
- crud?: {
91
- models: ModelsOptions<M>;
92
- };
93
- }
94
-
95
- export default modelsToOpenApi;