@visulima/crud 1.0.9 → 1.0.11

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 CHANGED
@@ -1,3 +1,33 @@
1
+ ## @visulima/crud [1.0.11](https://github.com/visulima/visulima/compare/@visulima/crud@1.0.10...@visulima/crud@1.0.11) (2023-05-25)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * chore updated the deps, changed replace to replaceAll and the engine to allow node v20 ([b21eac9](https://github.com/visulima/visulima/commit/b21eac970db2f10be9033d4e1279373a4a4c1ef7))
7
+ * fixed all calls to radar with sonarjs, removed radar eslint package ([001aecf](https://github.com/visulima/visulima/commit/001aecf78dde134bade44f382698d52eedbd3bbe))
8
+ * updated package deps ([5f605aa](https://github.com/visulima/visulima/commit/5f605aab74a7c1f4cbdfe4502363e36d57716921))
9
+
10
+
11
+
12
+ ### Dependencies
13
+
14
+ * **@visulima/pagination:** upgraded to 2.0.3
15
+ * **@visulima/prisma-dmmf-transformer:** upgraded to 1.0.6
16
+
17
+ ## @visulima/crud [1.0.10](https://github.com/visulima/visulima/compare/@visulima/crud@1.0.9...@visulima/crud@1.0.10) (2023-01-25)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * 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))
23
+
24
+
25
+
26
+ ### Dependencies
27
+
28
+ * **@visulima/pagination:** upgraded to 2.0.2
29
+ * **@visulima/prisma-dmmf-transformer:** upgraded to 1.0.5
30
+
1
31
  ## @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
32
 
3
33
 
@@ -0,0 +1,5 @@
1
+ var a=Object.defineProperty;var s=(r,e,t)=>e in r?a(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var l=(r,e,t)=>(s(r,typeof e!="symbol"?e+"":e,t),t);var d=(n=>(n.CREATE="CREATE",n.READ_ALL="READ_ALL",n.READ_ONE="READ_ONE",n.UPDATE="UPDATE",n.DELETE="DELETE",n))(d||{});var p=(r,e,t="all")=>{let o=t==="none"?[]:["READ_ALL","READ_ONE","UPDATE","DELETE","CREATE"];return Array.isArray(r)&&(o=r),e?.length&&(o=o.filter(i=>!e.includes(i))),o},y=p;
2
+
3
+ export { l as a, d as b, y as c };
4
+ //# sourceMappingURL=out.js.map
5
+ //# sourceMappingURL=chunk-JENMZJBI.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":"wKAMO,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,9 @@
1
+ 'use strict';
2
+
3
+ var a=Object.defineProperty;var s=(r,e,t)=>e in r?a(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var l=(r,e,t)=>(s(r,typeof e!="symbol"?e+"":e,t),t);var d=(n=>(n.CREATE="CREATE",n.READ_ALL="READ_ALL",n.READ_ONE="READ_ONE",n.UPDATE="UPDATE",n.DELETE="DELETE",n))(d||{});var p=(r,e,t="all")=>{let o=t==="none"?[]:["READ_ALL","READ_ONE","UPDATE","DELETE","CREATE"];return Array.isArray(r)&&(o=r),e?.length&&(o=o.filter(i=>!e.includes(i))),o},y=p;
4
+
5
+ exports.a = l;
6
+ exports.b = d;
7
+ exports.c = y;
8
+ //# sourceMappingURL=out.js.map
9
+ //# sourceMappingURL=chunk-KXZJF5XL.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":"wKAMO,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 { PrismaClient } from '@prisma/client';
2
- import { S as SearchCondition, C as Condition, A as Adapter, P as PaginationData, a as ParsedQueryParameters, R as RouteType, M as ModelsOptions } from './types.d-6817d247.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-6817d247.js';
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-ea893907.js';
3
+ export { c as CrudHandlerOptions, H as HandlerParameters, d as ModelOption, O as OrderByField, e as OrderByOperator, b as PaginationConfig, f as RecursiveField, U as UniqueResourceHandlerParameters, h as WhereCondition, W as WhereField, g as WhereOperator } from './types.d-ea893907.js';
4
4
  import { OpenAPIV3 } from 'openapi-types';
5
5
 
6
- type PrismaRecursiveField = "select" | "include";
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 = "equals" | "not" | "in" | "notIn" | "lt" | "lte" | "gt" | "gte" | "contains" | "startsWith" | "endsWith";
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]: SearchCondition | PrismaFieldFilterOperator | PrismaRelationFilter | Condition | undefined;
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: SearchCondition | PrismaFieldFilter;
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]: string | number | boolean;
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 = 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: any): void;
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: string | number, query: PrismaParsedQueryParameters): Promise<T>;
74
- create(resourceName: M, data: any, query: PrismaParsedQueryParameters): Promise<T>;
75
- update(resourceName: M, resourceId: string | number, data: any, query: PrismaParsedQueryParameters): Promise<T>;
76
- delete(resourceName: M, resourceId: string | number, query: PrismaParsedQueryParameters): Promise<T>;
77
- connect(): any;
78
- disconnect(): any;
79
- get client(): any;
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
- } & any;
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.ReferenceObject | OpenAPIV3.ExampleObject;
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 = 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<{
@@ -146,4 +148,4 @@ interface ModelsToOpenApiParameters<M extends string = string> {
146
148
  };
147
149
  }
148
150
 
149
- export { ModelsToOpenApiParameters, PrismaAdapter, SwaggerModelsConfig, modelsToOpenApi };
151
+ export { Adapter, Condition, ModelsOptions, ModelsToOpenApiParameters, PaginationData, ParsedQueryParameters, PrismaAdapter, RouteType, SearchCondition, SwaggerModelsConfig, modelsToOpenApi };
package/dist/index.js CHANGED
@@ -1,2 +1,21 @@
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 chunkKXZJF5XL_js = require('./chunk-KXZJF5XL.js');
4
+ var Q = require('http-errors');
5
+ var pagination = require('@visulima/pagination');
6
+ var prismaDmmfTransformer = require('@visulima/prisma-dmmf-transformer');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var Q__default = /*#__PURE__*/_interopDefault(Q);
11
+
12
+ var Y=(s,e)=>{let t={};return e.forEach(r=>{t[r]=s[r].plural;}),t},j=Y;var N=new Set(["string","boolean","number"]),q=s=>N.has(typeof s),b=q;var ee=s=>{let e={};if(Object.keys(s).forEach(t=>{let r=s[t];b(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},$=ee;var te={$asc:"asc",$desc:"desc"},re=s=>{let e={};return Object.keys(s).forEach(t=>{let r=s[t];e[t]=te[r];}),e},I=re;var D=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{t[r]=s[r]===!0?!0:{[e]:D(s[r],e)};}),t},C=D;var E=s=>s instanceof Object,se={$eq:"equals",$neq:"not",$cont:"contains",$ends:"endsWith",$gt:"gt",$gte:"gte",$in:"in",$lt:"lt",$lte:"lte",$notin:"notIn",$starts:"startsWith"},ne=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),ie=s=>ne(s)?new Date(s):typeof s=="string"&&s==="$isnull"?null:s,F=(s,e)=>{let t=s.split(".");return t.splice(-1,1),e.includes(t.join("."))},V=s=>{let e=Object.keys(s)[0],t=se[e];if(t)return {[t]:s[e]}},v=(s,e,t,r)=>{let n=e.split(".").reverse(),a={};n.forEach((p,c)=>{c===0?B(s,p,a,r):a={[p]:{some:a}};});let i=n.reverse()[0],o=t[i];t[i]={some:{...o?.some,...a[i]?.some}};},S=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{let n=s[r];if(F(r,e))v(n,r,t,e);else if(b(n))t[r]=n;else if(E(n)){let a=V(n);a&&(t[r]=a);}}),t},B=(s,e,t,r)=>{if(b(s))t[e]=ie(s);else switch(e){case"$or":{E(s)&&(t.OR=S(s,r));break}case"$and":{E(s)&&(t.AND=S(s,r));break}case"$not":{E(s)&&(t.NOT=S(s,r));break}default:{t[e]=V(s);break}}},ae=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{let n=s[r];F(r,e)?v(n,r,t,e):B(n,r,t,e);}),t},W=ae;var A=class{constructor({primaryKey:e="id",prismaClient:t,manyRelations:r={},models:n}){chunkKXZJF5XL_js.a(this,"primaryKey");chunkKXZJF5XL_js.a(this,"manyRelations");chunkKXZJF5XL_js.a(this,"prismaClient");chunkKXZJF5XL_js.a(this,"models");chunkKXZJF5XL_js.a(this,"ctorModels");chunkKXZJF5XL_js.a(this,"dmmf");chunkKXZJF5XL_js.a(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"?Q__default.default(400,"invalid request, check your server logs for more info"):Q__default.default(500,"an unknown error occured, check your server logs for more info")}parseQuery(e,t){let r={};return t.select&&(r.select=C(t.select,"select")),t.include&&(r.include=C(t.include,"include")),t.originalQuery?.where&&(r.where=W(JSON.parse(t.originalQuery.where),this.manyRelations[e]??[])),t.orderBy&&(r.orderBy=I(t.orderBy)),t.limit!==void 0&&(r.take=t.limit),t.skip!==void 0&&(r.skip=t.skip),t.originalQuery?.cursor&&(r.cursor=$(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 j(await this.getPrismaClientModels(),this.getModels())}getPrismaDelegate(e){return this.prismaClient[`${e.charAt(0).toLowerCase()}${e.slice(1)}`]}};var oe=s=>`#/components/schemas/${s}`,y=oe;var _=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 ""}},R="PaginationData",de=[{methodStart:"createOne",schemaNameStart:"Create"},{methodStart:"updateOne",schemaNameStart:"Update"}],T=class{constructor(e){this.dmmf=e;chunkKXZJF5XL_js.a(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)=>(de.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(M=>M!=="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=y(e.type.name);return e.isList?{type:"array",xml:{name:e.type.name,wrapped:!0},items:{$ref:r}}:{$ref:r}}let t=_(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:_(e.type)}}getPaginationDataSchema(){return pagination.createPaginationMetaSchemaObject(R)}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()[R],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:y(r)}},meta:{$ref:y(R)}}}}),{})}},L=T;var le=(s,e,t="all")=>s.reduce((r,n)=>e?.[n]?{...r,[n]:chunkKXZJF5XL_js.c(e[n].only,e[n].exclude,t)}:{...r,[n]:chunkKXZJF5XL_js.c(void 0,void 0,t)},{}),U=le;var h={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}}},H=[h.select,h.include],ue=[...H,h.limit,h.skip,h.where,h.orderBy,h.page,h.distinct],J=(s,e=[])=>s==="READ_ALL"?[...ue,...e].filter(Boolean):[...H,...e].filter(Boolean);var ge=s=>`#/components/examples/${s}`,P=ge;var O=(s,e)=>e?{type:"array",items:{$ref:y(s)}}:{$ref:y(s)},fe=(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)}}}}},K=(s,e)=>({content:{"application/json":{schema:{$ref:y(`${s}${e}`)}}}}),ye=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.`)}},G=({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=ye(i),c=fe(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:J(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=K("Update",o):i==="CREATE"&&(a[p].requestBody=K("Create",o));}}),a},he=({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]=G({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]=G({tag:p,modelName:a,modelsConfig:t,routeTypes:l,hasId:!0});}return n},{}),Z=he;var Pe=(s,e)=>s.map(t=>e?.[t].tag?e[t].tag:{name:t}),z=Pe;var Oe=(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),be=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 L(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(k=>{if(!Object.keys(i).includes(k))throw new Error(`Model name ${k} is invalid.`)});let d=e??Object.keys(i),m=U(d,r.models,n),u=z(d,t.models),g=Z({routes:m,modelsConfig:t.models,models:r.models,routesMap:j(i,d)}),M=JSON.parse(l.replaceAll("#/definitions","#/components/schemas")),x=o.getExampleModelsSchemas(c,M);return {schemas:M,examples:x,tags:u,paths:Oe(g,x)}},Me=be;
13
+
14
+ Object.defineProperty(exports, 'RouteType', {
15
+ enumerable: true,
16
+ get: function () { return chunkKXZJF5XL_js.b; }
17
+ });
18
+ exports.PrismaAdapter = A;
19
+ exports.modelsToOpenApi = Me;
20
+ //# sourceMappingURL=out.js.map
2
21
  //# sourceMappingURL=index.js.map