@visulima/crud 1.0.9 → 1.0.10
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/chunk-AZH4QNGV.js +8 -0
- package/dist/chunk-AZH4QNGV.js.map +1 -0
- package/dist/chunk-RWIFPCB5.mjs +5 -0
- package/dist/chunk-RWIFPCB5.mjs.map +1 -0
- package/dist/index.d.ts +28 -26
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -1
- package/dist/index.mjs.map +1 -1
- package/dist/next/index.d.ts +1 -1
- package/dist/next/index.js +15 -1
- package/dist/next/index.js.map +1 -1
- package/dist/next/index.mjs +12 -1
- package/dist/next/index.mjs.map +1 -1
- package/dist/{types.d-6817d247.d.ts → types.d-54381237.d.ts} +31 -24
- package/package.json +32 -29
- package/dist/chunk-JSOEPRPZ.mjs +0 -2
- package/dist/chunk-JSOEPRPZ.mjs.map +0 -1
- package/dist/chunk-U35WXGEF.js +0 -2
- package/dist/chunk-U35WXGEF.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## @visulima/crud [1.0.10](https://github.com/visulima/visulima/compare/@visulima/crud@1.0.9...@visulima/crud@1.0.10) (2023-01-25)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* updated tsconfig to use module esnext and target es2021 ([#107](https://github.com/visulima/visulima/issues/107)) ([e888fe8](https://github.com/visulima/visulima/commit/e888fe8d15c99453a3c04f2cf9d2f6c69c158648))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Dependencies
|
|
11
|
+
|
|
12
|
+
* **@visulima/pagination:** upgraded to 2.0.2
|
|
13
|
+
* **@visulima/prisma-dmmf-transformer:** upgraded to 1.0.5
|
|
14
|
+
|
|
1
15
|
## @visulima/crud [1.0.9](https://github.com/visulima/visulima/compare/@visulima/crud@1.0.8...@visulima/crud@1.0.9) (2023-01-08)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var a=(e=>(e.CREATE="CREATE",e.READ_ALL="READ_ALL",e.READ_ONE="READ_ONE",e.UPDATE="UPDATE",e.DELETE="DELETE",e))(a||{});var s=(t,n,o="all")=>{let r=o==="none"?[]:["READ_ALL","READ_ONE","UPDATE","DELETE","CREATE"];return Array.isArray(t)&&(r=t),n?.length&&(r=r.filter(i=>!n.includes(i))),r},p=s;
|
|
4
|
+
|
|
5
|
+
exports.a = a;
|
|
6
|
+
exports.b = p;
|
|
7
|
+
//# sourceMappingURL=out.js.map
|
|
8
|
+
//# sourceMappingURL=chunk-AZH4QNGV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.d.ts","../src/utils/get-accessible-routes.ts"],"names":["RouteType","getAccessibleRoutes","only","exclude","defaultExposeStrategy","accessibleRoutes","element","get_accessible_routes_default"],"mappings":"AAMO,IAAKA,OACRA,EAAA,OAAS,SACTA,EAAA,SAAW,WACXA,EAAA,SAAW,WACXA,EAAA,OAAS,SACTA,EAAA,OAAS,SALDA,OAAA,ICJZ,IAAMC,EAAsB,CAACC,EAAoBC,EAAuBC,EAAwC,QAAuB,CAEnI,IAAIC,EAAgCD,IAA0B,OAAS,CAAC,EAAI,iDAA6F,EAEzK,OAAI,MAAM,QAAQF,CAAI,IAClBG,EAAmBH,GAGnBC,GAAS,SACTE,EAAmBA,EAAiB,OAAQC,GAAY,CAACH,EAAQ,SAASG,CAAO,CAAC,GAG/ED,CACX,EAEOE,EAAQN","sourcesContent":["import type { Handler as CreateHandler } from \"./handler/create\";\nimport type { Handler as DeleteHandler } from \"./handler/delete\";\nimport type { Handler as ListHandler } from \"./handler/list\";\nimport type { Handler as GetHandler } from \"./handler/read\";\nimport type { Handler as UpdateHandler } from \"./handler/update\";\n\nexport enum RouteType {\n CREATE = \"CREATE\",\n READ_ALL = \"READ_ALL\",\n READ_ONE = \"READ_ONE\",\n UPDATE = \"UPDATE\",\n DELETE = \"DELETE\",\n}\n\nexport type ModelOption = {\n name?: string\n only?: RouteType[]\n exclude?: RouteType[]\n formatResourceId?: (resourceId: string) => number | string\n};\n\nexport type ModelsOptions<M extends string = string> = {\n [key in M]?: ModelOption\n};\n\nexport type HandlerOptions<M extends string = string> = {\n formatResourceId?: (resourceId: string) => number | string;\n models?: ModelsOptions<M>;\n exposeStrategy?: \"all\" | \"none\";\n pagination?: PaginationConfig,\n handlers?: {\n create?: CreateHandler;\n delete?: DeleteHandler;\n get?: GetHandler;\n list?: ListHandler;\n update?: UpdateHandler;\n },\n};\n\nexport type PaginationConfig = {\n perPage: number\n};\n\nexport interface HandlerParameters<T, Q> {\n adapter: Adapter<T, Q>;\n query: Q;\n resourceName: string;\n}\n\nexport interface UniqueResourceHandlerParameters<T, Q> {\n adapter: Adapter<T, Q>;\n query: Q;\n resourceName: string;\n resourceId: number | string;\n}\n\nexport interface Adapter<T, Q, M extends string = string> {\n models?: M[];\n init?: () => Promise<void>;\n parseQuery: (resourceName: M, query: ParsedQueryParameters) => Q;\n getAll: (resourceName: M, query: Q) => Promise<T[]>;\n getOne: (resourceName: M, resourceId: number | string, query: Q) => Promise<T>;\n create: (resourceName: M, data: any, query: Q) => Promise<T>;\n update: (resourceName: M, resourceId: number | string, data: any, query: Q) => Promise<T>;\n delete: (resourceName: M, resourceId: number | string, query: Q) => Promise<T>;\n getPaginationData: (resourceName: M, query: Q) => Promise<PaginationData>;\n getModels: () => M[];\n connect?: () => Promise<void>;\n disconnect?: () => Promise<void>;\n handleError?: (error: Error) => void;\n mapModelsToRouteNames?: () => Promise<{ [key in M]?: string }>;\n}\n\nexport type PaginationData = {\n total: number\n pageCount: number\n page: number\n};\n\nexport type RecursiveField = {\n [key: string]: TRecursiveField | boolean;\n};\n\nexport type WhereOperator = \"$cont\" | \"$ends\" | \"$eq\" | \"$gt\" | \"$gte\" | \"$in\" | \"$isnull\" | \"$lt\" | \"$lte\" | \"$neq\" | \"$notin\" | \"$starts\";\n\nexport type SearchCondition = Date | boolean | number | string | null;\n\nexport type WhereCondition = {\n [key in TWhereOperator]?: TSearchCondition;\n};\n\nexport type Condition = {\n [key: string]: TCondition | TSearchCondition | TWhereCondition;\n};\n\nexport type WhereField = Condition & {\n $and?: TCondition | TCondition[];\n $or?: TCondition | TCondition[];\n $not?: TCondition | TCondition[];\n};\n\nexport type OrderByOperator = \"$asc\" | \"$desc\";\n\nexport type OrderByField = {\n [key: string]: TOrderByOperator;\n};\n\nexport interface ParsedQueryParameters {\n select?: RecursiveField;\n include?: RecursiveField;\n where?: WhereField;\n orderBy?: OrderByField;\n limit?: number;\n skip?: number;\n distinct?: string;\n page?: number;\n originalQuery?: {\n [key: string]: any;\n };\n}\n\nexport type ExecuteHandler<Request, Response> = (request: Request, response: Response) => Promise<void>;\n\nexport type FakePrismaClient = {\n _dmmf?: any;\n _getDmmf?: () => any;\n $connect: () => void;\n $disconnect: () => Promise<void>;\n\n [key: string]: any\n};\n","import { RouteType } from \"../types.d\";\n\nconst getAccessibleRoutes = (only?: RouteType[], exclude?: RouteType[], defaultExposeStrategy: \"all\" | \"none\" = \"all\"): RouteType[] => {\n // eslint-disable-next-line max-len\n let accessibleRoutes: RouteType[] = defaultExposeStrategy === \"none\" ? [] : [RouteType.READ_ALL, RouteType.READ_ONE, RouteType.UPDATE, RouteType.DELETE, RouteType.CREATE];\n\n if (Array.isArray(only)) {\n accessibleRoutes = only;\n }\n\n if (exclude?.length) {\n accessibleRoutes = accessibleRoutes.filter((element) => !exclude.includes(element));\n }\n\n return accessibleRoutes;\n};\n\nexport default getAccessibleRoutes;\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var a=(e=>(e.CREATE="CREATE",e.READ_ALL="READ_ALL",e.READ_ONE="READ_ONE",e.UPDATE="UPDATE",e.DELETE="DELETE",e))(a||{});var s=(t,n,o="all")=>{let r=o==="none"?[]:["READ_ALL","READ_ONE","UPDATE","DELETE","CREATE"];return Array.isArray(t)&&(r=t),n?.length&&(r=r.filter(i=>!n.includes(i))),r},p=s;
|
|
2
|
+
|
|
3
|
+
export { a, p as b };
|
|
4
|
+
//# sourceMappingURL=out.js.map
|
|
5
|
+
//# sourceMappingURL=chunk-RWIFPCB5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.d.ts","../src/utils/get-accessible-routes.ts"],"names":["RouteType","getAccessibleRoutes","only","exclude","defaultExposeStrategy","accessibleRoutes","element","get_accessible_routes_default"],"mappings":"AAMO,IAAKA,OACRA,EAAA,OAAS,SACTA,EAAA,SAAW,WACXA,EAAA,SAAW,WACXA,EAAA,OAAS,SACTA,EAAA,OAAS,SALDA,OAAA,ICJZ,IAAMC,EAAsB,CAACC,EAAoBC,EAAuBC,EAAwC,QAAuB,CAEnI,IAAIC,EAAgCD,IAA0B,OAAS,CAAC,EAAI,iDAA6F,EAEzK,OAAI,MAAM,QAAQF,CAAI,IAClBG,EAAmBH,GAGnBC,GAAS,SACTE,EAAmBA,EAAiB,OAAQC,GAAY,CAACH,EAAQ,SAASG,CAAO,CAAC,GAG/ED,CACX,EAEOE,EAAQN","sourcesContent":["import type { Handler as CreateHandler } from \"./handler/create\";\nimport type { Handler as DeleteHandler } from \"./handler/delete\";\nimport type { Handler as ListHandler } from \"./handler/list\";\nimport type { Handler as GetHandler } from \"./handler/read\";\nimport type { Handler as UpdateHandler } from \"./handler/update\";\n\nexport enum RouteType {\n CREATE = \"CREATE\",\n READ_ALL = \"READ_ALL\",\n READ_ONE = \"READ_ONE\",\n UPDATE = \"UPDATE\",\n DELETE = \"DELETE\",\n}\n\nexport type ModelOption = {\n name?: string\n only?: RouteType[]\n exclude?: RouteType[]\n formatResourceId?: (resourceId: string) => number | string\n};\n\nexport type ModelsOptions<M extends string = string> = {\n [key in M]?: ModelOption\n};\n\nexport type HandlerOptions<M extends string = string> = {\n formatResourceId?: (resourceId: string) => number | string;\n models?: ModelsOptions<M>;\n exposeStrategy?: \"all\" | \"none\";\n pagination?: PaginationConfig,\n handlers?: {\n create?: CreateHandler;\n delete?: DeleteHandler;\n get?: GetHandler;\n list?: ListHandler;\n update?: UpdateHandler;\n },\n};\n\nexport type PaginationConfig = {\n perPage: number\n};\n\nexport interface HandlerParameters<T, Q> {\n adapter: Adapter<T, Q>;\n query: Q;\n resourceName: string;\n}\n\nexport interface UniqueResourceHandlerParameters<T, Q> {\n adapter: Adapter<T, Q>;\n query: Q;\n resourceName: string;\n resourceId: number | string;\n}\n\nexport interface Adapter<T, Q, M extends string = string> {\n models?: M[];\n init?: () => Promise<void>;\n parseQuery: (resourceName: M, query: ParsedQueryParameters) => Q;\n getAll: (resourceName: M, query: Q) => Promise<T[]>;\n getOne: (resourceName: M, resourceId: number | string, query: Q) => Promise<T>;\n create: (resourceName: M, data: any, query: Q) => Promise<T>;\n update: (resourceName: M, resourceId: number | string, data: any, query: Q) => Promise<T>;\n delete: (resourceName: M, resourceId: number | string, query: Q) => Promise<T>;\n getPaginationData: (resourceName: M, query: Q) => Promise<PaginationData>;\n getModels: () => M[];\n connect?: () => Promise<void>;\n disconnect?: () => Promise<void>;\n handleError?: (error: Error) => void;\n mapModelsToRouteNames?: () => Promise<{ [key in M]?: string }>;\n}\n\nexport type PaginationData = {\n total: number\n pageCount: number\n page: number\n};\n\nexport type RecursiveField = {\n [key: string]: TRecursiveField | boolean;\n};\n\nexport type WhereOperator = \"$cont\" | \"$ends\" | \"$eq\" | \"$gt\" | \"$gte\" | \"$in\" | \"$isnull\" | \"$lt\" | \"$lte\" | \"$neq\" | \"$notin\" | \"$starts\";\n\nexport type SearchCondition = Date | boolean | number | string | null;\n\nexport type WhereCondition = {\n [key in TWhereOperator]?: TSearchCondition;\n};\n\nexport type Condition = {\n [key: string]: TCondition | TSearchCondition | TWhereCondition;\n};\n\nexport type WhereField = Condition & {\n $and?: TCondition | TCondition[];\n $or?: TCondition | TCondition[];\n $not?: TCondition | TCondition[];\n};\n\nexport type OrderByOperator = \"$asc\" | \"$desc\";\n\nexport type OrderByField = {\n [key: string]: TOrderByOperator;\n};\n\nexport interface ParsedQueryParameters {\n select?: RecursiveField;\n include?: RecursiveField;\n where?: WhereField;\n orderBy?: OrderByField;\n limit?: number;\n skip?: number;\n distinct?: string;\n page?: number;\n originalQuery?: {\n [key: string]: any;\n };\n}\n\nexport type ExecuteHandler<Request, Response> = (request: Request, response: Response) => Promise<void>;\n\nexport type FakePrismaClient = {\n _dmmf?: any;\n _getDmmf?: () => any;\n $connect: () => void;\n $disconnect: () => Promise<void>;\n\n [key: string]: any\n};\n","import { RouteType } from \"../types.d\";\n\nconst getAccessibleRoutes = (only?: RouteType[], exclude?: RouteType[], defaultExposeStrategy: \"all\" | \"none\" = \"all\"): RouteType[] => {\n // eslint-disable-next-line max-len\n let accessibleRoutes: RouteType[] = defaultExposeStrategy === \"none\" ? [] : [RouteType.READ_ALL, RouteType.READ_ONE, RouteType.UPDATE, RouteType.DELETE, RouteType.CREATE];\n\n if (Array.isArray(only)) {\n accessibleRoutes = only;\n }\n\n if (exclude?.length) {\n accessibleRoutes = accessibleRoutes.filter((element) => !exclude.includes(element));\n }\n\n return accessibleRoutes;\n};\n\nexport default getAccessibleRoutes;\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
export { A as Adapter, C as Condition, c as CrudHandlerOptions, H as HandlerParameters, d as ModelOption, M as ModelsOptions, O as OrderByField, e as OrderByOperator, b as PaginationConfig, P as PaginationData, a as ParsedQueryParameters, f as RecursiveField, R as RouteType, S as SearchCondition, U as UniqueResourceHandlerParameters, h as WhereCondition, W as WhereField, g as WhereOperator } from './types.d-
|
|
1
|
+
import { HttpError } from 'http-errors';
|
|
2
|
+
import { C as Condition, S as SearchCondition, A as Adapter, F as FakePrismaClient, P as PaginationData, a as ParsedQueryParameters, R as RouteType, M as ModelsOptions } from './types.d-54381237.js';
|
|
3
|
+
export { A as Adapter, C as Condition, c as CrudHandlerOptions, H as HandlerParameters, d as ModelOption, M as ModelsOptions, O as OrderByField, e as OrderByOperator, b as PaginationConfig, P as PaginationData, a as ParsedQueryParameters, f as RecursiveField, R as RouteType, S as SearchCondition, U as UniqueResourceHandlerParameters, h as WhereCondition, W as WhereField, g as WhereOperator } from './types.d-54381237.js';
|
|
4
4
|
import { OpenAPIV3 } from 'openapi-types';
|
|
5
5
|
|
|
6
|
-
type PrismaRecursiveField = "
|
|
6
|
+
type PrismaRecursiveField = "include" | "select";
|
|
7
7
|
|
|
8
8
|
type PrismaRecursive<T extends PrismaRecursiveField> = Record<string, boolean | { [key in T]: PrismaRecursive<T> }>;
|
|
9
9
|
|
|
10
|
-
type PrismaWhereOperator = "
|
|
10
|
+
type PrismaWhereOperator = "contains" | "endsWith" | "equals" | "gt" | "gte" | "in" | "lt" | "lte" | "not" | "notIn" | "startsWith";
|
|
11
11
|
|
|
12
12
|
type PrismaOrderByOperator = "asc" | "desc";
|
|
13
13
|
|
|
@@ -16,7 +16,7 @@ type PrismaFieldFilterOperator = {
|
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
type PrismaFieldFilter = {
|
|
19
|
-
[key: string]:
|
|
19
|
+
[key: string]: Condition | PrismaFieldFilterOperator | PrismaRelationFilter | SearchCondition | undefined;
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
type PrismaWhereField = PrismaFieldFilter & {
|
|
@@ -26,7 +26,7 @@ type PrismaWhereField = PrismaFieldFilter & {
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
type PrismaRelationFilter = {
|
|
29
|
-
some
|
|
29
|
+
some?: PrismaFieldFilter | SearchCondition;
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
type PrismaOrderBy = {
|
|
@@ -34,7 +34,7 @@ type PrismaOrderBy = {
|
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
type PrismaCursor = {
|
|
37
|
-
[key: string]:
|
|
37
|
+
[key: string]: boolean | number | string;
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
interface PrismaParsedQueryParameters {
|
|
@@ -48,7 +48,7 @@ interface PrismaParsedQueryParameters {
|
|
|
48
48
|
distinct?: string;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
interface AdapterCtorArguments<M extends string
|
|
51
|
+
interface AdapterCtorArguments<M extends string, PrismaClient> {
|
|
52
52
|
primaryKey?: string;
|
|
53
53
|
manyRelations?: {
|
|
54
54
|
[key in M]?: string[];
|
|
@@ -56,30 +56,32 @@ interface AdapterCtorArguments<M extends string = string> {
|
|
|
56
56
|
prismaClient: PrismaClient;
|
|
57
57
|
models?: M[];
|
|
58
58
|
}
|
|
59
|
-
declare class PrismaAdapter<T, M extends string> implements Adapter<T, PrismaParsedQueryParameters, M> {
|
|
59
|
+
declare class PrismaAdapter<T, M extends string, PrismaClient> implements Adapter<T, PrismaParsedQueryParameters, M> {
|
|
60
60
|
private readonly primaryKey;
|
|
61
61
|
private readonly manyRelations;
|
|
62
62
|
private readonly prismaClient;
|
|
63
63
|
models?: M[];
|
|
64
64
|
private readonly ctorModels?;
|
|
65
65
|
private dmmf;
|
|
66
|
-
constructor({ primaryKey, prismaClient, manyRelations, models, }: AdapterCtorArguments<M>);
|
|
66
|
+
constructor({ primaryKey, prismaClient, manyRelations, models, }: AdapterCtorArguments<M, FakePrismaClient & PrismaClient>);
|
|
67
67
|
private getPrismaClientModels;
|
|
68
68
|
init(): Promise<void>;
|
|
69
69
|
getPaginationData(resourceName: M, query: PrismaParsedQueryParameters): Promise<PaginationData>;
|
|
70
|
-
handleError(error:
|
|
70
|
+
handleError(error: Error): HttpError;
|
|
71
71
|
parseQuery(resourceName: M, query: ParsedQueryParameters): PrismaParsedQueryParameters;
|
|
72
72
|
getAll(resourceName: M, query: PrismaParsedQueryParameters): Promise<T[]>;
|
|
73
|
-
getOne(resourceName: M, resourceId:
|
|
74
|
-
create(resourceName: M, data:
|
|
75
|
-
update(resourceName: M, resourceId:
|
|
76
|
-
delete(resourceName: M, resourceId:
|
|
77
|
-
connect():
|
|
78
|
-
disconnect():
|
|
79
|
-
get client():
|
|
73
|
+
getOne(resourceName: M, resourceId: number | string, query: PrismaParsedQueryParameters): Promise<T>;
|
|
74
|
+
create(resourceName: M, data: unknown, query: PrismaParsedQueryParameters): Promise<T>;
|
|
75
|
+
update(resourceName: M, resourceId: number | string, data: unknown, query: PrismaParsedQueryParameters): Promise<T>;
|
|
76
|
+
delete(resourceName: M, resourceId: number | string, query: PrismaParsedQueryParameters): Promise<T>;
|
|
77
|
+
connect(): Promise<void>;
|
|
78
|
+
disconnect(): Promise<void>;
|
|
79
|
+
get client(): PrismaClient;
|
|
80
80
|
getModels(): M[];
|
|
81
|
+
mapModelsToRouteNames(): Promise<{
|
|
82
|
+
[key in M]?: string;
|
|
83
|
+
}>;
|
|
81
84
|
private getPrismaDelegate;
|
|
82
|
-
mapModelsToRouteNames(): Promise<{ [key in M]?: string | undefined; }>;
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
type SwaggerType = {
|
|
@@ -99,9 +101,9 @@ type SwaggerOperation = {
|
|
|
99
101
|
type SwaggerParameter = {
|
|
100
102
|
name: string;
|
|
101
103
|
description?: string;
|
|
102
|
-
schema: {
|
|
104
|
+
schema: any & {
|
|
103
105
|
type: string;
|
|
104
|
-
}
|
|
106
|
+
};
|
|
105
107
|
};
|
|
106
108
|
|
|
107
109
|
type ModelsConfig = {
|
|
@@ -121,18 +123,18 @@ type SwaggerModelsConfig<M extends string> = {
|
|
|
121
123
|
[key in M]?: ModelsConfig;
|
|
122
124
|
};
|
|
123
125
|
|
|
124
|
-
declare const modelsToOpenApi: <M extends string = string>({ prismaClient, models: ctorModels, swagger, crud, defaultExposeStrategy, }: ModelsToOpenApiParameters<M>) => Promise<{
|
|
126
|
+
declare const modelsToOpenApi: <M extends string = string, PrismaClient = FakePrismaClient>({ prismaClient, models: ctorModels, swagger, crud, defaultExposeStrategy, }: ModelsToOpenApiParameters<M, PrismaClient>) => Promise<{
|
|
125
127
|
schemas: {
|
|
126
128
|
[key: string]: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject;
|
|
127
129
|
};
|
|
128
130
|
examples: {
|
|
129
|
-
[key: string]: OpenAPIV3.
|
|
131
|
+
[key: string]: OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject;
|
|
130
132
|
};
|
|
131
133
|
tags: OpenAPIV3.TagObject[];
|
|
132
134
|
paths: OpenAPIV3.PathsObject;
|
|
133
135
|
}>;
|
|
134
|
-
interface ModelsToOpenApiParameters<M extends string
|
|
135
|
-
prismaClient: PrismaClient;
|
|
136
|
+
interface ModelsToOpenApiParameters<M extends string, PrismaClient> {
|
|
137
|
+
prismaClient: FakePrismaClient & PrismaClient;
|
|
136
138
|
defaultExposeStrategy?: "all" | "none";
|
|
137
139
|
models?: M[];
|
|
138
140
|
swagger?: Partial<{
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,17 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkU35WXGEFjs = require('./chunk-U35WXGEF.js');var _httperrors = require('http-errors'); var _httperrors2 = _interopRequireDefault(_httperrors);var te=(s,e)=>{let t={};return e==null||e.forEach(r=>{t[r]=s[r].plural}),t},E=te;var re=new Set(["string","boolean","number"]),se=s=>re.has(typeof s),j=se;var ne=s=>{let e={};if(Object.keys(s).forEach(t=>{let r=s[t];j(r)&&(e[t]=r)}),Object.keys(e).length!==1)throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");return e},F=ne;var ae={$asc:"asc",$desc:"desc"},ie=s=>{let e={};return Object.keys(s).forEach(t=>{let r=s[t];e[t]=ae[r]}),e},V=ie;var B=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{t[r]=s[r]===!0?!0:{[e]:B(s[r],e)}}),t},$=B;var S=s=>s instanceof Object,oe={$eq:"equals",$neq:"not",$cont:"contains",$ends:"endsWith",$gt:"gt",$gte:"gte",$in:"in",$lt:"lt",$lte:"lte",$notin:"notIn",$starts:"startsWith"},ce=s=>/^\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(s),pe=s=>ce(s)?new Date(s):typeof s=="string"&&s==="$isnull"?null:s,v=(s,e)=>{let t=s.split(".");return t.splice(-1,1),e.includes(t.join("."))},W=s=>{let e=Object.keys(s)[0],t=oe[e];if(t)return{[t]:s[e]}},Q=(s,e,t,r)=>{var m;let n=e.split(".").reverse(),a={};n.forEach((c,f)=>{f===0?_(s,c,a,r):a={[c]:{some:a}}});let i=n.reverse()[0],o=t[i];t[i]={some:{...o==null?void 0:o.some,...(m=a[i])==null?void 0:m.some}}},I=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{let n=s[r];if(v(r,e))Q(n,r,t,e);else if(j(n))t[r]=n;else if(S(n)){let a=W(n);a&&(t[r]=a)}}),t},_=(s,e,t,r)=>{if(j(s))t[e]=pe(s);else switch(e){case"$or":{S(s)&&(t.OR=I(s,r));break}case"$and":{S(s)&&(t.AND=I(s,r));break}case"$not":{S(s)&&(t.NOT=I(s,r));break}default:{t[e]=W(s);break}}},me=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{let n=s[r];v(r,e)?Q(n,r,t,e):_(n,r,t,e)}),t},L=me;var T=class{constructor({primaryKey:e="id",prismaClient:t,manyRelations:r={},models:n}){this.getPrismaClientModels=async()=>{var e;if(this.prismaClient._dmmf)return this.dmmf=this.prismaClient._dmmf,(e=this.dmmf)==null?void 0:e.mappingsMap;if(this.prismaClient._getDmmf)return this.dmmf=await this.prismaClient._getDmmf(),this.dmmf.mappingsMap;throw new Error("Couldn't get prisma client models")};this.prismaClient=t,this.primaryKey=e,this.manyRelations=r,this.ctorModels=n}async init(){let e=this.ctorModels,t=await this.getPrismaClientModels();e!==void 0&&e.forEach(r=>{if(!Object.keys(t).includes(r))throw new Error(`Model name ${r} is invalid.`)}),this.models=_nullishCoalesce(e, () => (Object.keys(t)))}async getPaginationData(e,t){let r=await this.getPrismaDelegate(e).count({where:t.where,distinct:t.distinct});return{total:r,pageCount:Math.ceil(r/t.take),page:Math.ceil(t.skip/t.take)+1}}handleError(e){throw console.error(e),e instanceof Error&&e.stack&&console.error(e.stack),e.constructor.name==="PrismaClientKnownRequestError"||e.constructor.name==="PrismaClientValidationError"?_httperrors2.default.call(void 0, 400,"invalid request, check your server logs for more info"):_httperrors2.default.call(void 0, 500,"an unknown error occured, check your server logs for more info")}parseQuery(e,t){var n,a;let r={};return t.select&&(r.select=$(t.select,"select")),t.include&&(r.include=$(t.include,"include")),(n=t.originalQuery)!=null&&n.where&&(r.where=L(JSON.parse(t.originalQuery.where),_nullishCoalesce(this.manyRelations[e], () => ([])))),t.orderBy&&(r.orderBy=V(t.orderBy)),t.limit!==void 0&&(r.take=t.limit),t.skip!==void 0&&(r.skip=t.skip),(a=t.originalQuery)!=null&&a.cursor&&(r.cursor=F(JSON.parse(t.originalQuery.cursor))),t.distinct&&(r.distinct=t.distinct),r}async getAll(e,t){return await this.getPrismaDelegate(e).findMany({select:t.select,include:t.include,where:t.where,orderBy:t.orderBy,cursor:t.cursor,take:t.take,skip:t.skip,distinct:t.distinct})}async getOne(e,t,r){let n=this.getPrismaDelegate(e);return(n.findUnique||n.findOne)({where:{[this.primaryKey]:t},select:r.select,include:r.include})}async create(e,t,r){return this.getPrismaDelegate(e).create({data:t,select:r.select,include:r.include})}async update(e,t,r,n){return this.getPrismaDelegate(e).update({where:{[this.primaryKey]:t},data:r,select:n.select,include:n.include})}async delete(e,t,r){return this.getPrismaDelegate(e).delete({where:{[this.primaryKey]:t},select:r.select,include:r.include})}connect(){return this.prismaClient.$connect()}disconnect(){return this.prismaClient.$disconnect()}get client(){return this.prismaClient}getModels(){return this.models||[]}getPrismaDelegate(e){return this.prismaClient[`${e.charAt(0).toLowerCase()}${e.slice(1)}`]}async mapModelsToRouteNames(){return E(await this.getPrismaClientModels(),this.getModels())}};var _pagination = require('@visulima/pagination');var _prismadmmftransformer = require('@visulima/prisma-dmmf-transformer');var de=s=>`#/components/schemas/${s}`,y=de;var U=s=>{switch(s){case"Int":case"BigInt":return"integer";case"DateTime":case"Bytes":case"String":return"string";case"Float":case"Decimal":return"number";case"Json":return"object";case"Boolean":return"boolean";case"Null":return"null";default:return""}},D="PaginationData",ye=[{methodStart:"createOne",schemaNameStart:"Create"},{methodStart:"updateOne",schemaNameStart:"Update"}],k=class{constructor(e){this.dmmf=e;this.schemaInputTypes=new Map}parseModels(){var t;let e=_prismadmmftransformer.transformDMMF.call(void 0, this.dmmf).definitions;return(t=Object.keys(e||{}))==null||t.forEach(r=>{let{properties:n}=e[r];Object.keys(n).forEach(a=>{Array.isArray(n[a].type)&&n[a].type.includes("null")&&(n[a].type=n[a].type.filter(i=>i!=="null"),n[a].type.length===1&&(n[a].type=n[a].type[0]),n[a].nullable=!0)})}),e}parseInputTypes(e){let t=e.reduce((r,n)=>(ye.map(i=>({name:`${i.methodStart}${n}`,schemaName:`${i.schemaNameStart}${n}`})).forEach(({name:i,schemaName:o})=>{let m=this.dmmf.mutationType.fieldMap[i].args[0].inputTypes[0].type.fields,c=[],f=m.reduce((d,p)=>{if(p.inputTypes[0].kind==="scalar"){let l=_prismadmmftransformer.getJSONSchemaProperty.call(void 0, this.dmmf.datamodel,{})({name:p.name,...p.inputTypes[0]}),{type:u}=l[1];u&&Array.isArray(u)?u.includes("null")&&(d[p.name]={...u,type:u.filter(h=>h!=="null"),nullable:!0},d[p.name].type.length===1&&(d[p.name]={...d[p.name],type:d[p.name].type[0]})):d[p.name]=l[1]}else{let l=this.parseObjectInputType(p.inputTypes[0]);d[p.name]={...l,nullable:p.isNullable}}return p.isRequired&&c.push(p.name),d},{});r[o]={type:"object",xml:{name:o},properties:f},c.length>0&&(r[o].required=c)}),r),{});return this.schemaInputTypes.forEach((r,n)=>{t[n]={type:"object",xml:{name:n},properties:r}}),t}formatInputTypeData(e){if(e.kind==="object"){let r=y(e.type.name);return e.isList?{type:"array",xml:{name:e.type.name,wrapped:!0},items:{$ref:r}}:{$ref:r}}let t=U(e.type);return e.isList?{type:"array",xml:{name:e.type.name,wrapped:!0},items:{type:t}}:{type:t}}parseObjectInputType(e){return e.kind==="object"?(this.schemaInputTypes.has(e.type.name)||(this.schemaInputTypes.set(e.type.name,{}),e.type.fields.forEach(t=>{let r={};if(t.inputTypes.length>1){let n=!1,a=t.inputTypes.map(i=>{let o=this.formatInputTypeData(i);if(o.type==="null"){n=!0;return}return o}).filter(Boolean);a.length===1?r=a[0]:r.anyOf=a,n&&(r.nullable=!0)}else{let n=t.inputTypes[0];r=this.formatInputTypeData(n)}this.schemaInputTypes.set(e.type.name,{...this.schemaInputTypes.get(e.type.name),[t.name]:r}),t.inputTypes.forEach(n=>{n.kind==="object"&&this.parseObjectInputType(n)})})),{$ref:y(e.type.name)}):{type:U(e.type)}}getPaginationDataSchema(){return _pagination.createPaginationMetaSchemaObject.call(void 0, D)}getExampleModelsSchemas(e,t){let r=i=>{let o=i.replace("#/components/schemas/",""),m=t[o],c={};return Object.entries((m==null?void 0:m.properties)||{}).forEach(([f,d])=>{let p=d.type;c[f]=p==="array"?[a(d.items)]:p}),c},n=i=>{let o={};return Object.entries(i).forEach(([m,c])=>{o[m]=c.$ref===void 0?c.type:r(c.$ref)}),o},a=i=>{let o={};return Object.entries(i).forEach(([m,c])=>{c.items.$ref!==void 0?o[m]=[r(c.items.$ref)]:c.type==="array"?o[m]=[a(c.items)]:c.type==="object"?o[m]=n(c.properties):o[m]=c.type}),o};return e.reduce((i,o)=>{let m={},c=t[o];Object.entries(c.properties).forEach(([p,l])=>{let u=l.type;u==="array"?m[p]=[r(l.items.$ref)]:u==="object"?m[p]=n(l.properties):m[p]=u});let f=this.getPaginationDataSchema()[D],d={};return Object.entries(f.properties).forEach(([p,l])=>{d[p]=l.type}),{...i,[`${o}`]:{value:m},[`${o}s`]:{value:[m]},[`${o}Page`]:{value:{data:[m],meta:d}}}},{})}getPaginatedModelsSchemas(e){return e.reduce((t,r)=>({...t,[`${r}Page`]:{type:"object",xml:{name:`${r}Page`},properties:{data:{type:"array",xml:{name:"data",wrapped:!0},items:{$ref:y(r)}},meta:{$ref:y(D)}}}}),{})}},J=k;var ge=(s,e,t="all")=>s.reduce((r,n)=>e!=null&&e[n]?{...r,[n]:_chunkU35WXGEFjs.b.call(void 0, e[n].only,e[n].exclude,t)}:{...r,[n]:_chunkU35WXGEFjs.b.call(void 0, void 0,void 0,t)},{}),K=ge;var g={select:{name:"select",description:"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts",schema:{type:"string"}},include:{name:"include",description:"Include relations, same as select",schema:{type:"string"}},where:{name:"where",description:'Fields to filter. See <a href="https://next-crud.js.org/query-params#where">the docs</a>',schema:{type:"string"}},orderBy:{name:"orderBy",description:'Field on which to order by a direction. See <a href="https://next-crud.js.org/query-params#orderBy">the docs</a>',schema:{type:"string"}},limit:{name:"limit",description:"Maximum number of elements to retrieve",schema:{type:"integer",minimum:0}},skip:{name:"skip",description:"Number of rows to skip",schema:{type:"integer",minimum:0}},distinct:{name:"distinct",description:"Fields to distinctively retrieve",schema:{type:"string"}},page:{name:"page",description:"Page number. Use only for pagination.",schema:{type:"integer",minimum:1}}},G=[g.select,g.include],he=[...G,g.limit,g.skip,g.where,g.orderBy,g.page,g.distinct],Z=(s,e=[])=>s==="READ_ALL"?[...he,...e]:[...G,...e];var Pe=s=>`#/components/examples/${s}`,P=Pe;var O=(s,e)=>e?{type:"array",items:{$ref:y(s)}}:{$ref:y(s)},Oe=(s,e)=>{if(s==="CREATE")return{statusCode:201,content:{description:`${e} created`,content:{"application/json":{schema:O(e),example:P(e)}}}};if(s==="DELETE")return{statusCode:200,content:{description:`${e} item deleted`,content:{"application/json":{schema:O(e),example:P(e)}}}};if(s==="READ_ALL")return{statusCode:200,content:{description:`${e} list retrieved`,content:{"application/json":{schema:{oneOf:[O(e,!0),O(`${e}Page`,!1)]},examples:{Default:{$ref:P(`${e}s`)},Pagination:{$ref:P(`${e}Page`)}}}}}};if(s==="READ_ONE")return{statusCode:200,content:{description:`${e} item retrieved`,content:{"application/json":{schema:O(e),example:P(e)}}}};if(s==="UPDATE")return{statusCode:200,content:{description:`${e} item updated`,content:{"application/json":{schema:O(e),example:P(e)}}}}},z=(s,e)=>({content:{"application/json":{schema:{$ref:y(`${s}${e}`)}}}}),be=s=>{switch(s){case"CREATE":return"post";case"READ_ALL":case"READ_ONE":return"get";case"UPDATE":return"put";case"DELETE":return"delete";default:throw new TypeError(`Method for route type ${s} was not found.`)}},X=({tag:s,routeTypes:e,modelName:t,modelsConfig:r,hasId:n})=>{let a={};return e.forEach(i=>{var o,m,c,f,d,p,l,u,h,b,M,C;if(e.includes(i)){let R=_nullishCoalesce(_nullishCoalesce(((f=(c=(m=(o=r==null?void 0:r[t])==null?void 0:o.routeTypes)==null?void 0:m[i])==null?void 0:c.response)==null?void 0:f.name), () => (((p=(d=r==null?void 0:r[t])==null?void 0:d.type)==null?void 0:p.name))), () => (t)),A=be(i),w=Oe(i,R);if(w===void 0)throw new TypeError(`Route type ${i}; response config was not found.`);a[A]={tags:[s],summary:(h=(u=(l=r==null?void 0:r[t])==null?void 0:l.routeTypes)==null?void 0:u[i])==null?void 0:h.summary,parameters:Z(i).map(q=>({...q,in:"query"})),responses:{[w.statusCode]:w.content,...(C=(M=(b=r==null?void 0:r[t])==null?void 0:b.routeTypes)==null?void 0:M[i])==null?void 0:C.responses}},n&&a[A].parameters.push({in:"path",name:"id",description:`ID of the ${t}`,required:!0,schema:{type:"string"}}),(i==="UPDATE"||i==="CREATE")&&(i==="UPDATE"?a[A].requestBody=z("Update",R):i==="CREATE"&&(a[A].requestBody=z("Create",R)))}}),a},Me=({routes:s,models:e,modelsConfig:t,routesMap:r})=>Object.keys(s).reduce((n,a)=>{var c,f,d;let i=s[a],o=(c=e==null?void 0:e[a])!=null&&c.name?e[a].name:(r==null?void 0:r[a])||a,m=((d=(f=t==null?void 0:t[a])==null?void 0:f.tag)==null?void 0:d.name)||a;if(i.includes("CREATE")||i.includes("READ_ALL")){let p=`/${o}`,l=["READ_ALL","CREATE"].filter(u=>i.includes(u));n[p]=X({tag:m,modelName:a,modelsConfig:t,routeTypes:l})}if(i.includes("READ_ONE")||i.includes("UPDATE")||i.includes("DELETE")){let p=`/${o}/{id}`,l=["READ_ONE","UPDATE","DELETE"].filter(u=>i.includes(u));n[p]=X({tag:m,modelName:a,modelsConfig:t,routeTypes:l,hasId:!0})}return n},{}),Y=Me;var je=(s,e)=>s.map(t=>{var r;return(r=e==null?void 0:e[t])!=null&&r.tag?e[t].tag:{name:t}}),N=je;var Ae=(s,e)=>(Object.values(s).forEach(t=>{Object.values(t).forEach(r=>{typeof r.responses=="object"&&Object.values(r.responses).forEach(n=>{typeof n.content=="object"&&Object.values(n.content).forEach(a=>{var i;if(typeof a.example=="string"){let o=a.example.replace("#/components/examples/","");typeof e[o]!==void 0&&typeof((i=e[o])==null?void 0:i.value)!==void 0&&(a.example=e[o].value)}})})})}),s),Ee=async({prismaClient:s,models:e,swagger:t={models:{},allowedMediaTypes:{"application/json":!0}},crud:r={models:{}},defaultExposeStrategy:n="all"})=>{let a,i;if(s._dmmf?(a=s._dmmf,i=a==null?void 0:a.mappingsMap):s._getDmmf&&(a=await s._getDmmf(),i=a.mappingsMap),typeof a===void 0)throw new TypeError("Couldn't get prisma client models");let o=new J(a),m=o.parseModels(),c=Object.keys(m),f=JSON.stringify({...m,...o.parseInputTypes(c),...o.getPaginationDataSchema(),...o.getPaginatedModelsSchemas(c)});e!==void 0&&e.forEach(M=>{if(!Object.keys(i).includes(M))throw new Error(`Model name ${M} is invalid.`)});let d=_nullishCoalesce(e, () => (Object.keys(i))),p=K(d,r.models||{},n),l=N(d,(t==null?void 0:t.models)||{}),u=Y({routes:p,modelsConfig:(t==null?void 0:t.models)||{},models:r.models||{},routesMap:E(i,d)}),h=JSON.parse(f.replace(/#\/definitions/g,"#/components/schemas")),b=o.getExampleModelsSchemas(c,h);return{schemas:h,examples:b,tags:l,paths:Ae(u,b)}},Se= exports.modelsToOpenApi =Ee;exports.PrismaAdapter = T; exports.RouteType = _chunkU35WXGEFjs.a; exports.modelsToOpenApi = Se;
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkAZH4QNGV_js = require('./chunk-AZH4QNGV.js');
|
|
4
|
+
var W = require('http-errors');
|
|
5
|
+
var pagination = require('@visulima/pagination');
|
|
6
|
+
var prismaDmmfTransformer = require('@visulima/prisma-dmmf-transformer');
|
|
7
|
+
|
|
8
|
+
var X=(s,e)=>{let t={};return e.forEach(r=>{t[r]=s[r].plural;}),t},M=X;var Y=new Set(["string","boolean","number"]),N=s=>Y.has(typeof s),O=N;var q=s=>{let e={};if(Object.keys(s).forEach(t=>{let r=s[t];O(r)&&(e[t]=r);}),Object.keys(e).length!==1)throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");return e},k=q;var ee={$asc:"asc",$desc:"desc"},te=s=>{let e={};return Object.keys(s).forEach(t=>{let r=s[t];e[t]=ee[r];}),e},$=te;var I=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{t[r]=s[r]===!0?!0:{[e]:I(s[r],e)};}),t},w=I;var j=s=>s instanceof Object,re={$eq:"equals",$neq:"not",$cont:"contains",$ends:"endsWith",$gt:"gt",$gte:"gte",$in:"in",$lt:"lt",$lte:"lte",$notin:"notIn",$starts:"startsWith"},se=s=>/^\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(s),ne=s=>se(s)?new Date(s):typeof s=="string"&&s==="$isnull"?null:s,D=(s,e)=>{let t=s.split(".");return t.splice(-1,1),e.includes(t.join("."))},F=s=>{let e=Object.keys(s)[0],t=re[e];if(t)return {[t]:s[e]}},V=(s,e,t,r)=>{let n=e.split(".").reverse(),a={};n.forEach((p,c)=>{c===0?v(s,p,a,r):a={[p]:{some:a}};});let i=n.reverse()[0],o=t[i];t[i]={some:{...o?.some,...a[i]?.some}};},C=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{let n=s[r];if(D(r,e))V(n,r,t,e);else if(O(n))t[r]=n;else if(j(n)){let a=F(n);a&&(t[r]=a);}}),t},v=(s,e,t,r)=>{if(O(s))t[e]=ne(s);else switch(e){case"$or":{j(s)&&(t.OR=C(s,r));break}case"$and":{j(s)&&(t.AND=C(s,r));break}case"$not":{j(s)&&(t.NOT=C(s,r));break}default:{t[e]=F(s);break}}},ie=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{let n=s[r];D(r,e)?V(n,r,t,e):v(n,r,t,e);}),t},B=ie;var E=class{constructor({primaryKey:e="id",prismaClient:t,manyRelations:r={},models:n}){this.getPrismaClientModels=async()=>{if(this.prismaClient._dmmf!==void 0)return this.dmmf=this.prismaClient._dmmf,this.dmmf?.mappingsMap;if(this.prismaClient._getDmmf!==void 0)return this.dmmf=await this.prismaClient._getDmmf(),this.dmmf.mappingsMap;throw new Error("Couldn't get prisma client models")};this.prismaClient=t,this.primaryKey=e,this.manyRelations=r,this.ctorModels=n;}async init(){let e=this.ctorModels,t=await this.getPrismaClientModels();e!==void 0&&e.forEach(r=>{if(!Object.keys(t).includes(r))throw new Error(`Model name ${r} is invalid.`)}),this.models=e??Object.keys(t);}async getPaginationData(e,t){let r=await this.getPrismaDelegate(e).count({where:t.where,distinct:t.distinct});return {total:r,pageCount:Math.ceil(r/(t.take??0)),page:Math.ceil((t.skip??0)/(t.take??0))+1}}handleError(e){throw console.error(e),e instanceof Error&&e.stack&&console.error(e.stack),e.constructor.name==="PrismaClientKnownRequestError"||e.constructor.name==="PrismaClientValidationError"?W(400,"invalid request, check your server logs for more info"):W(500,"an unknown error occured, check your server logs for more info")}parseQuery(e,t){let r={};return t.select&&(r.select=w(t.select,"select")),t.include&&(r.include=w(t.include,"include")),t.originalQuery?.where&&(r.where=B(JSON.parse(t.originalQuery.where),this.manyRelations[e]??[])),t.orderBy&&(r.orderBy=$(t.orderBy)),t.limit!==void 0&&(r.take=t.limit),t.skip!==void 0&&(r.skip=t.skip),t.originalQuery?.cursor&&(r.cursor=k(JSON.parse(t.originalQuery.cursor))),t.distinct&&(r.distinct=t.distinct),r}async getAll(e,t){return await this.getPrismaDelegate(e).findMany({select:t.select,include:t.include,where:t.where,orderBy:t.orderBy,cursor:t.cursor,take:t.take,skip:t.skip,distinct:t.distinct})}async getOne(e,t,r){let n=this.getPrismaDelegate(e);return (n.findUnique??n.findOne)({where:{[this.primaryKey]:t},select:r.select,include:r.include})}async create(e,t,r){return this.getPrismaDelegate(e).create({data:t,select:r.select,include:r.include})}async update(e,t,r,n){return this.getPrismaDelegate(e).update({where:{[this.primaryKey]:t},data:r,select:n.select,include:n.include})}async delete(e,t,r){return this.getPrismaDelegate(e).delete({where:{[this.primaryKey]:t},select:r.select,include:r.include})}async connect(){this.prismaClient.$connect();}async disconnect(){this.prismaClient.$disconnect();}get client(){return this.prismaClient}getModels(){return this.models??[]}async mapModelsToRouteNames(){return M(await this.getPrismaClientModels(),this.getModels())}getPrismaDelegate(e){return this.prismaClient[`${e.charAt(0).toLowerCase()}${e.slice(1)}`]}};var ae=s=>`#/components/schemas/${s}`,f=ae;var Q=s=>{switch(s){case"Int":case"BigInt":return "integer";case"DateTime":case"Bytes":case"String":return "string";case"Float":case"Decimal":return "number";case"Json":return "object";case"Boolean":return "boolean";case"Null":return "null";default:return ""}},S="PaginationData",me=[{methodStart:"createOne",schemaNameStart:"Create"},{methodStart:"updateOne",schemaNameStart:"Update"}],R=class{constructor(e){this.dmmf=e;this.schemaInputTypes=new Map;}parseModels(){let e=prismaDmmfTransformer.transformDMMF(this.dmmf).definitions;return Object.keys(e).forEach(t=>{let{properties:r}=e[t];Object.keys(r).forEach(n=>{Array.isArray(r[n].type)&&r[n].type.includes("null")&&(r[n].type=r[n].type.filter(a=>a!=="null"),r[n].type.length===1&&(r[n].type=r[n].type[0]),r[n].nullable=!0);});}),e}parseInputTypes(e){let t=e.reduce((r,n)=>(me.map(i=>({name:`${i.methodStart}${n}`,schemaName:`${i.schemaNameStart}${n}`})).forEach(({name:i,schemaName:o})=>{let p=this.dmmf.mutationType.fieldMap[i].args[0].inputTypes[0].type.fields,c=[],l=p.reduce((d,m)=>{if(m.inputTypes[0].kind==="scalar"){let u=prismaDmmfTransformer.getJSONSchemaProperty(this.dmmf.datamodel,{})({name:m.name,...m.inputTypes[0]}),{type:g}=u[1];g&&Array.isArray(g)?g.includes("null")&&(d[m.name]={...g,type:g.filter(b=>b!=="null"),nullable:!0},d[m.name].type.length===1&&(d[m.name]={...d[m.name],type:d[m.name].type[0]})):d[m.name]=u[1];}else {let u=this.parseObjectInputType(m.inputTypes[0]);d[m.name]={...u,nullable:m.isNullable};}return m.isRequired&&c.push(m.name),d},{});r[o]={type:"object",xml:{name:o},properties:l},c.length>0&&(r[o].required=c);}),r),{});return this.schemaInputTypes.forEach((r,n)=>{t[n]={type:"object",xml:{name:n},properties:r};}),t}formatInputTypeData(e){if(e.kind==="object"){let r=f(e.type.name);return e.isList?{type:"array",xml:{name:e.type.name,wrapped:!0},items:{$ref:r}}:{$ref:r}}let t=Q(e.type);return e.isList?{type:"array",xml:{name:e.type.name,wrapped:!0},items:{type:t}}:{type:t}}parseObjectInputType(e){return e.kind==="object"?(this.schemaInputTypes.has(e.type.name)||(this.schemaInputTypes.set(e.type.name,{}),e.type.fields.forEach(t=>{let r={};if(t.inputTypes.length>1){let n=!1,a=t.inputTypes.map(i=>{let o=this.formatInputTypeData(i);if(o.type==="null"){n=!0;return}return o}).filter(Boolean);a.length===1?r=a[0]:r.anyOf=a,n&&(r.nullable=!0);}else {let n=t.inputTypes[0];r=this.formatInputTypeData(n);}this.schemaInputTypes.set(e.type.name,{...this.schemaInputTypes.get(e.type.name),[t.name]:r}),t.inputTypes.forEach(n=>{n.kind==="object"&&this.parseObjectInputType(n);});})),{$ref:f(e.type.name)}):{type:Q(e.type)}}getPaginationDataSchema(){return pagination.createPaginationMetaSchemaObject(S)}getExampleModelsSchemas(e,t){let r=i=>{let o=i.replace("#/components/schemas/",""),p=t[o],c={};return Object.entries(p.properties??{}).forEach(([l,d])=>{let m=d.type;c[l]=m==="array"?[a(d.items)]:m;}),c},n=i=>{let o={};return Object.entries(i).forEach(([p,c])=>{o[p]=c.$ref===void 0?c.type:r(c.$ref);}),o},a=i=>{let o={};return Object.entries(i).forEach(([p,c])=>{c.items.$ref!==void 0?o[p]=[r(c.items.$ref)]:c.type==="array"?o[p]=[a(c.items)]:c.type==="object"?o[p]=n(c.properties):o[p]=c.type;}),o};return e.reduce((i,o)=>{let p={},c=t[o];Object.entries(c.properties).forEach(([m,u])=>{let g=u.type;g==="array"?p[m]=[r(u.items.$ref)]:g==="object"?p[m]=n(u.properties):p[m]=g;});let l=this.getPaginationDataSchema()[S],d={};return Object.entries(l.properties).forEach(([m,u])=>{d[m]=u.type;}),{...i,[`${o}`]:{value:p},[`${o}s`]:{value:[p]},[`${o}Page`]:{value:{data:[p],meta:d}}}},{})}getPaginatedModelsSchemas(e){return e.reduce((t,r)=>({...t,[`${r}Page`]:{type:"object",xml:{name:`${r}Page`},properties:{data:{type:"array",xml:{name:"data",wrapped:!0},items:{$ref:f(r)}},meta:{$ref:f(S)}}}}),{})}},_=R;var de=(s,e,t="all")=>s.reduce((r,n)=>e?.[n]?{...r,[n]:chunkAZH4QNGV_js.b(e[n].only,e[n].exclude,t)}:{...r,[n]:chunkAZH4QNGV_js.b(void 0,void 0,t)},{}),L=de;var y={select:{name:"select",description:"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts",schema:{type:"string"}},include:{name:"include",description:"Include relations, same as select",schema:{type:"string"}},where:{name:"where",description:'Fields to filter. See <a href="https://next-crud.js.org/query-params#where">the docs</a>',schema:{type:"string"}},orderBy:{name:"orderBy",description:'Field on which to order by a direction. See <a href="https://next-crud.js.org/query-params#orderBy">the docs</a>',schema:{type:"string"}},limit:{name:"limit",description:"Maximum number of elements to retrieve",schema:{type:"integer",minimum:0}},skip:{name:"skip",description:"Number of rows to skip",schema:{type:"integer",minimum:0}},distinct:{name:"distinct",description:"Fields to distinctively retrieve",schema:{type:"string"}},page:{name:"page",description:"Page number. Use only for pagination.",schema:{type:"integer",minimum:1}}},U=[y.select,y.include],le=[...U,y.limit,y.skip,y.where,y.orderBy,y.page,y.distinct],H=(s,e=[])=>s==="READ_ALL"?[...le,...e].filter(Boolean):[...U,...e].filter(Boolean);var ue=s=>`#/components/examples/${s}`,h=ue;var P=(s,e)=>e?{type:"array",items:{$ref:f(s)}}:{$ref:f(s)},ge=(s,e)=>{if(s==="CREATE")return {statusCode:201,content:{description:`${e} created`,content:{"application/json":{schema:P(e),example:h(e)}}}};if(s==="DELETE")return {statusCode:200,content:{description:`${e} item deleted`,content:{"application/json":{schema:P(e),example:h(e)}}}};if(s==="READ_ALL")return {statusCode:200,content:{description:`${e} list retrieved`,content:{"application/json":{schema:{oneOf:[P(e,!0),P(`${e}Page`,!1)]},examples:{Default:{$ref:h(`${e}s`)},Pagination:{$ref:h(`${e}Page`)}}}}}};if(s==="READ_ONE")return {statusCode:200,content:{description:`${e} item retrieved`,content:{"application/json":{schema:P(e),example:h(e)}}}};if(s==="UPDATE")return {statusCode:200,content:{description:`${e} item updated`,content:{"application/json":{schema:P(e),example:h(e)}}}}},J=(s,e)=>({content:{"application/json":{schema:{$ref:f(`${s}${e}`)}}}}),fe=s=>{switch(s){case"CREATE":return "post";case"READ_ALL":case"READ_ONE":return "get";case"UPDATE":return "put";case"DELETE":return "delete";default:throw new TypeError(`Method for route type ${s} was not found.`)}},K=({tag:s,routeTypes:e,modelName:t,modelsConfig:r,hasId:n})=>{let a={};return e.forEach(i=>{if(e.includes(i)){let o=r?.[t]?.routeTypes?.[i]?.response.name??r?.[t]?.type?.name??t,p=fe(i),c=ge(i,o);if(c===void 0)throw new TypeError(`Route type ${i}; response config was not found.`);a[p]={tags:[s],summary:r?.[t]?.routeTypes?.[i]?.summary,parameters:H(i).map(l=>({...l,in:"query"})),responses:{[c.statusCode]:c.content,...r?.[t]?.routeTypes?.[i]?.responses}},n&&a[p].parameters.push({in:"path",name:"id",description:`ID of the ${t}`,required:!0,schema:{type:"string"}}),i==="UPDATE"?a[p].requestBody=J("Update",o):i==="CREATE"&&(a[p].requestBody=J("Create",o));}}),a},ye=({routes:s,models:e,modelsConfig:t,routesMap:r})=>Object.keys(s).reduce((n,a)=>{let i=s[a],o=e?.[a]?.name?e[a].name:r?.[a]??a,p=t?.[a]?.tag.name??a;if(i.includes("CREATE")||i.includes("READ_ALL")){let c=`/${o}`,l=["READ_ALL","CREATE"].filter(d=>i.includes(d));n[c]=K({tag:p,modelName:a,modelsConfig:t,routeTypes:l});}if(i.includes("READ_ONE")||i.includes("UPDATE")||i.includes("DELETE")){let c=`/${o}/{id}`,l=["READ_ONE","UPDATE","DELETE"].filter(d=>i.includes(d));n[c]=K({tag:p,modelName:a,modelsConfig:t,routeTypes:l,hasId:!0});}return n},{}),G=ye;var he=(s,e)=>s.map(t=>e?.[t].tag?e[t].tag:{name:t}),Z=he;var Pe=(s,e)=>(Object.values(s).forEach(t=>{Object.values(t).forEach(r=>{typeof r.responses=="object"&&Object.values(r.responses).forEach(n=>{typeof n.content=="object"&&Object.values(n.content).forEach(a=>{if(typeof a.example=="string"){let i=a.example.replace("#/components/examples/","");e[i]?.value!==void 0&&(a.example=e[i].value);}});});});}),s),Oe=async({prismaClient:s,models:e,swagger:t={models:{},allowedMediaTypes:{"application/json":!0}},crud:r={models:{}},defaultExposeStrategy:n="all"})=>{let a,i;if(s._dmmf!==void 0?(a=s._dmmf,i=a?.mappingsMap):s._getDmmf!==void 0&&(a=await s._getDmmf(),i=a.mappingsMap),a===void 0)throw new TypeError("Couldn't get prisma client models");let o=new _(a),p=o.parseModels(),c=Object.keys(p),l=JSON.stringify({...p,...o.parseInputTypes(c),...o.getPaginationDataSchema(),...o.getPaginatedModelsSchemas(c)});e!==void 0&&e.forEach(x=>{if(!Object.keys(i).includes(x))throw new Error(`Model name ${x} is invalid.`)});let d=e??Object.keys(i),m=L(d,r.models,n),u=Z(d,t.models),g=G({routes:m,modelsConfig:t.models,models:r.models,routesMap:M(i,d)}),b=JSON.parse(l.replace(/#\/definitions/g,"#/components/schemas")),T=o.getExampleModelsSchemas(c,b);return {schemas:b,examples:T,tags:u,paths:Pe(g,T)}},be=Oe;
|
|
9
|
+
|
|
10
|
+
Object.defineProperty(exports, 'RouteType', {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () { return chunkAZH4QNGV_js.a; }
|
|
13
|
+
});
|
|
14
|
+
exports.PrismaAdapter = E;
|
|
15
|
+
exports.modelsToOpenApi = be;
|
|
16
|
+
//# sourceMappingURL=out.js.map
|
|
2
17
|
//# sourceMappingURL=index.js.map
|