@visulima/crud 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +101 -0
  4. package/dist/chunk-FJWRITBO.js +52 -0
  5. package/dist/chunk-FJWRITBO.js.map +1 -0
  6. package/dist/chunk-UBXIGP5H.mjs +52 -0
  7. package/dist/chunk-UBXIGP5H.mjs.map +1 -0
  8. package/dist/index.d.ts +155 -0
  9. package/dist/index.js +1101 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/index.mjs +1101 -0
  12. package/dist/index.mjs.map +1 -0
  13. package/dist/next/index.d.ts +8 -0
  14. package/dist/next/index.js +729 -0
  15. package/dist/next/index.js.map +1 -0
  16. package/dist/next/index.mjs +729 -0
  17. package/dist/next/index.mjs.map +1 -0
  18. package/dist/types.d-6817d247.d.ts +155 -0
  19. package/package.json +136 -0
  20. package/src/adapter/prisma/index.ts +241 -0
  21. package/src/adapter/prisma/types.d.ts +46 -0
  22. package/src/adapter/prisma/utils/models-to-route-names.ts +12 -0
  23. package/src/adapter/prisma/utils/parse-cursor.ts +26 -0
  24. package/src/adapter/prisma/utils/parse-order-by.ts +21 -0
  25. package/src/adapter/prisma/utils/parse-recursive.ts +26 -0
  26. package/src/adapter/prisma/utils/parse-where.ts +197 -0
  27. package/src/base-crud-handler.ts +181 -0
  28. package/src/handler/create.ts +21 -0
  29. package/src/handler/delete.ts +27 -0
  30. package/src/handler/list.ts +62 -0
  31. package/src/handler/read.ts +27 -0
  32. package/src/handler/update.ts +29 -0
  33. package/src/index.ts +27 -0
  34. package/src/next/api/edge/index.ts +23 -0
  35. package/src/next/api/node/index.ts +27 -0
  36. package/src/next/index.ts +2 -0
  37. package/src/query-parser.ts +94 -0
  38. package/src/swagger/adapter/prisma/index.ts +95 -0
  39. package/src/swagger/json-schema-parser.ts +456 -0
  40. package/src/swagger/parameters.ts +83 -0
  41. package/src/swagger/types.d.ts +53 -0
  42. package/src/swagger/utils/format-example-ref.ts +4 -0
  43. package/src/swagger/utils/format-schema-ref.ts +4 -0
  44. package/src/swagger/utils/get-models-accessible-routes.ts +23 -0
  45. package/src/swagger/utils/get-swagger-paths.ts +244 -0
  46. package/src/swagger/utils/get-swagger-tags.ts +13 -0
  47. package/src/types.d.ts +124 -0
  48. package/src/utils/format-resource-id.ts +3 -0
  49. package/src/utils/get-accessible-routes.ts +18 -0
  50. package/src/utils/get-resource-name-from-url.ts +23 -0
  51. package/src/utils/get-route-type.ts +99 -0
  52. package/src/utils/is-primitive.ts +5 -0
  53. package/src/utils/validate-adapter-methods.ts +15 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ ## @visulima/crud 1.0.0 (2022-11-15)
2
+
3
+
4
+ ### Features
5
+
6
+ * added new packages for faster api creation ([#14](https://github.com/visulima/visulima/issues/14)) ([eb64fcf](https://github.com/visulima/visulima/commit/eb64fcf33f2a75ea48262ad6e71f80e159a93972))
7
+
8
+
9
+
10
+ ### Dependencies
11
+
12
+ * **@visulima/pagination:** upgraded to 1.0.0
13
+ * **@visulima/prisma-dmmf-transformer:** upgraded to 1.0.0
14
+ * **@visulima/connect:** upgraded to 1.2.0
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 visulima
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ <div align="center">
2
+ <h3>Visulima crud</h3>
3
+ <p>
4
+ Visulima crud is built on top of
5
+
6
+ [OpenAPI (Swagger) specification](https://swagger.io/specification/),
7
+ [node-rate-limiter-flexible](https://github.com/animir/node-rate-limiter-flexible),
8
+ [@visulima/connect](https://github.com/visulima/visulima/tree/main/packages/connect)
9
+
10
+ With a more intuitive API for creating HTTP API endpoints.
11
+
12
+ </p>
13
+ </div>
14
+
15
+ <br />
16
+
17
+ <div align="center">
18
+
19
+ [![typescript-image]][typescript-url] [![npm-image]][npm-url] [![license-image]][license-url]
20
+
21
+ </div>
22
+
23
+ ---
24
+
25
+ <div align="center">
26
+ <p>
27
+ <sup>
28
+ Daniel Bannert's open source work is supported by the community on <a href="https://github.com/sponsors/prisis">GitHub Sponsors</a>
29
+ </sup>
30
+ </p>
31
+ </div>
32
+
33
+ ---
34
+
35
+ ## Features
36
+
37
+ ## Installation
38
+
39
+ ```sh
40
+ npm install @visulima/crud
41
+ ```
42
+
43
+ ```sh
44
+ yarn add @visulima/crud
45
+ ```
46
+
47
+ ```sh
48
+ pnpm add @visulima/crud
49
+ ```
50
+
51
+ ## Usage
52
+
53
+ This package has an extended version of the `@visulima/connect` package.
54
+ That means you can use all the features of the `@visulima/connect` package, in addition to the features of this package.
55
+
56
+ ```ts
57
+ // pages/api/hello.js
58
+ import type { NextApiRequest, NextApiResponse } from "next";
59
+ import { createNodeRouter } from "@visulima/crud";
60
+ import cors from "cors";
61
+
62
+ // Default Req and Res are IncomingMessage and ServerResponse
63
+ // You may want to pass in NextApiRequest and NextApiResponse
64
+ const router = createNodeRouter<NextApiRequest, NextApiResponse>();
65
+
66
+ router
67
+ .get((req, res) => {
68
+ res.send("Hello world");
69
+ });
70
+
71
+ export default router.nodeHandler();
72
+ ```
73
+
74
+ ## Supported Node.js Versions
75
+
76
+ Libraries in this ecosystem make the best effort to track
77
+ [Node.js’ release schedule](https://github.com/nodejs/release#release-schedule). Here’s [a
78
+ post on why we think this is important](https://medium.com/the-node-js-collection/maintainers-should-consider-following-node-js-release-schedule-ab08ed4de71a).
79
+
80
+ ## Contributing
81
+
82
+ If you would like to help take a look at the [list of issues](https://github.com/visulima/visulima/issues) and check our [Contributing](.github/CONTRIBUTING.md) guild.
83
+
84
+ > **Note:** please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.
85
+
86
+ ## Credits
87
+
88
+ - [Daniel Bannert](https://github.com/prisis)
89
+ - [All Contributors](https://github.com/visulima/visulima/graphs/contributors)
90
+
91
+ ## License
92
+
93
+ The visulima crud is open-sourced software licensed under the [MIT][license-url]
94
+
95
+ [typescript-image]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript
96
+ [typescript-url]: "typescript"
97
+ [license-image]: https://img.shields.io/npm/l/@visulima/crud?color=blueviolet&style=for-the-badge
98
+ [license-url]: LICENSE.md "license"
99
+ [npm-image]: https://img.shields.io/npm/v/@visulima/crud/alpha.svg?style=for-the-badge&logo=npm
100
+ [npm-url]: https://www.npmjs.com/package/@visulima/crud/v/alpha "npm"
101
+
@@ -0,0 +1,52 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __commonJS = (cb, mod) => function __require() {
8
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
20
+ mod
21
+ ));
22
+
23
+ // src/types.d.ts
24
+ var RouteType = /* @__PURE__ */ ((RouteType2) => {
25
+ RouteType2["CREATE"] = "CREATE";
26
+ RouteType2["READ_ALL"] = "READ_ALL";
27
+ RouteType2["READ_ONE"] = "READ_ONE";
28
+ RouteType2["UPDATE"] = "UPDATE";
29
+ RouteType2["DELETE"] = "DELETE";
30
+ return RouteType2;
31
+ })(RouteType || {});
32
+
33
+ // src/utils/get-accessible-routes.ts
34
+ var getAccessibleRoutes = (only, exclude, defaultExposeStrategy = "all") => {
35
+ let accessibleRoutes = defaultExposeStrategy === "none" ? [] : ["READ_ALL" /* READ_ALL */, "READ_ONE" /* READ_ONE */, "UPDATE" /* UPDATE */, "DELETE" /* DELETE */, "CREATE" /* CREATE */];
36
+ if (Array.isArray(only)) {
37
+ accessibleRoutes = only;
38
+ }
39
+ if (exclude == null ? void 0 : exclude.length) {
40
+ accessibleRoutes = accessibleRoutes.filter((element) => !exclude.includes(element));
41
+ }
42
+ return accessibleRoutes;
43
+ };
44
+ var get_accessible_routes_default = getAccessibleRoutes;
45
+
46
+
47
+
48
+
49
+
50
+
51
+ exports.__commonJS = __commonJS; exports.__toESM = __toESM; exports.RouteType = RouteType; exports.get_accessible_routes_default = get_accessible_routes_default;
52
+ //# sourceMappingURL=chunk-FJWRITBO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.d.ts","../src/utils/get-accessible-routes.ts"],"names":["RouteType"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAK,YAAL,kBAAKA,eAAL;AACH,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,YAAS;AALD,SAAAA;AAAA,GAAA;;;ACJZ,IAAM,sBAAsB,CAAC,MAAoB,SAAuB,wBAAwC,UAAuB;AAEnI,MAAI,mBAAgC,0BAA0B,SAAS,CAAC,IAAI,0HAA6F;AAEzK,MAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,uBAAmB;AAAA,EACvB;AAEA,MAAI,mCAAS,QAAQ;AACjB,uBAAmB,iBAAiB,OAAO,CAAC,YAAY,CAAC,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtF;AAEA,SAAO;AACX;AAEA,IAAO,gCAAQ","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) => string | number\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) => string | number;\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: string | number;\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: string | number, query: Q): Promise<T>;\n create(resourceName: M, data: any, query: Q): Promise<T>;\n update(resourceName: M, resourceId: string | number, data: any, query: Q): Promise<T>;\n delete(resourceName: M, resourceId: string | number, 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]: boolean | TRecursiveField;\n};\n\nexport type WhereOperator = \"$eq\" | \"$neq\" | \"$in\" | \"$notin\" | \"$lt\" | \"$lte\" | \"$gt\" | \"$gte\" | \"$cont\" | \"$starts\" | \"$ends\" | \"$isnull\";\n\nexport type SearchCondition = string | boolean | number | Date | null;\n\nexport type WhereCondition = {\n [key in TWhereOperator]?: TSearchCondition;\n};\n\nexport type Condition = {\n [key: string]: TSearchCondition | TWhereCondition | TCondition;\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 interface ExecuteHandler<Request, Response> {\n (request: Request, response: Response): Promise<void>;\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,52 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __commonJS = (cb, mod) => function __require() {
8
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
20
+ mod
21
+ ));
22
+
23
+ // src/types.d.ts
24
+ var RouteType = /* @__PURE__ */ ((RouteType2) => {
25
+ RouteType2["CREATE"] = "CREATE";
26
+ RouteType2["READ_ALL"] = "READ_ALL";
27
+ RouteType2["READ_ONE"] = "READ_ONE";
28
+ RouteType2["UPDATE"] = "UPDATE";
29
+ RouteType2["DELETE"] = "DELETE";
30
+ return RouteType2;
31
+ })(RouteType || {});
32
+
33
+ // src/utils/get-accessible-routes.ts
34
+ var getAccessibleRoutes = (only, exclude, defaultExposeStrategy = "all") => {
35
+ let accessibleRoutes = defaultExposeStrategy === "none" ? [] : ["READ_ALL" /* READ_ALL */, "READ_ONE" /* READ_ONE */, "UPDATE" /* UPDATE */, "DELETE" /* DELETE */, "CREATE" /* CREATE */];
36
+ if (Array.isArray(only)) {
37
+ accessibleRoutes = only;
38
+ }
39
+ if (exclude == null ? void 0 : exclude.length) {
40
+ accessibleRoutes = accessibleRoutes.filter((element) => !exclude.includes(element));
41
+ }
42
+ return accessibleRoutes;
43
+ };
44
+ var get_accessible_routes_default = getAccessibleRoutes;
45
+
46
+ export {
47
+ __commonJS,
48
+ __toESM,
49
+ RouteType,
50
+ get_accessible_routes_default
51
+ };
52
+ //# sourceMappingURL=chunk-UBXIGP5H.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.d.ts","../src/utils/get-accessible-routes.ts"],"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) => string | number\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) => string | number;\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: string | number;\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: string | number, query: Q): Promise<T>;\n create(resourceName: M, data: any, query: Q): Promise<T>;\n update(resourceName: M, resourceId: string | number, data: any, query: Q): Promise<T>;\n delete(resourceName: M, resourceId: string | number, 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]: boolean | TRecursiveField;\n};\n\nexport type WhereOperator = \"$eq\" | \"$neq\" | \"$in\" | \"$notin\" | \"$lt\" | \"$lte\" | \"$gt\" | \"$gte\" | \"$cont\" | \"$starts\" | \"$ends\" | \"$isnull\";\n\nexport type SearchCondition = string | boolean | number | Date | null;\n\nexport type WhereCondition = {\n [key in TWhereOperator]?: TSearchCondition;\n};\n\nexport type Condition = {\n [key: string]: TSearchCondition | TWhereCondition | TCondition;\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 interface ExecuteHandler<Request, Response> {\n (request: Request, response: Response): Promise<void>;\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAK,YAAL,kBAAKA,eAAL;AACH,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,YAAS;AALD,SAAAA;AAAA,GAAA;;;ACJZ,IAAM,sBAAsB,CAAC,MAAoB,SAAuB,wBAAwC,UAAuB;AAEnI,MAAI,mBAAgC,0BAA0B,SAAS,CAAC,IAAI,0HAA6F;AAEzK,MAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,uBAAmB;AAAA,EACvB;AAEA,MAAI,mCAAS,QAAQ;AACjB,uBAAmB,iBAAiB,OAAO,CAAC,YAAY,CAAC,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtF;AAEA,SAAO;AACX;AAEA,IAAO,gCAAQ;","names":["RouteType"]}
@@ -0,0 +1,155 @@
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';
4
+
5
+ type PrismaRecursiveField = "select" | "include";
6
+
7
+ type PrismaRecursive<T extends PrismaRecursiveField> = Record<string, boolean | { [key in T]: PrismaRecursive<T> }>;
8
+
9
+ type PrismaWhereOperator = "equals" | "not" | "in" | "notIn" | "lt" | "lte" | "gt" | "gte" | "contains" | "startsWith" | "endsWith";
10
+
11
+ type PrismaOrderByOperator = "asc" | "desc";
12
+
13
+ type PrismaFieldFilterOperator = {
14
+ [key in PrismaWhereOperator]?: SearchCondition;
15
+ };
16
+
17
+ type PrismaFieldFilter = {
18
+ [key: string]: SearchCondition | PrismaFieldFilterOperator | PrismaRelationFilter | Condition | undefined;
19
+ };
20
+
21
+ type PrismaWhereField = PrismaFieldFilter & {
22
+ AND?: PrismaFieldFilter;
23
+ OR?: PrismaFieldFilter;
24
+ NOT?: PrismaFieldFilter;
25
+ };
26
+
27
+ type PrismaRelationFilter = {
28
+ some: SearchCondition | PrismaFieldFilter;
29
+ };
30
+
31
+ type PrismaOrderBy = {
32
+ [key: string]: PrismaOrderByOperator;
33
+ };
34
+
35
+ type PrismaCursor = {
36
+ [key: string]: string | number | boolean;
37
+ };
38
+
39
+ interface PrismaParsedQueryParameters {
40
+ select?: PrismaRecursive<"select">;
41
+ include?: PrismaRecursive<"include">;
42
+ where?: PrismaWhereField;
43
+ orderBy?: PrismaOrderBy;
44
+ take?: number;
45
+ skip?: number;
46
+ cursor?: PrismaCursor;
47
+ distinct?: string;
48
+ }
49
+
50
+ interface AdapterCtorArguments<M extends string = string> {
51
+ primaryKey?: string;
52
+ manyRelations?: {
53
+ [key in M]?: string[];
54
+ };
55
+ prismaClient: PrismaClient;
56
+ models?: M[];
57
+ }
58
+ declare class PrismaAdapter<T, M extends string> implements Adapter<T, PrismaParsedQueryParameters, M> {
59
+ private readonly primaryKey;
60
+ private readonly manyRelations;
61
+ private readonly prismaClient;
62
+ models?: M[];
63
+ private readonly ctorModels?;
64
+ private dmmf;
65
+ constructor({ primaryKey, prismaClient, manyRelations, models, }: AdapterCtorArguments<M>);
66
+ private getPrismaClientModels;
67
+ init(): Promise<void>;
68
+ getPaginationData(resourceName: M, query: PrismaParsedQueryParameters): Promise<PaginationData>;
69
+ handleError(error: any): void;
70
+ parseQuery(resourceName: M, query: ParsedQueryParameters): PrismaParsedQueryParameters;
71
+ getAll(resourceName: M, query: PrismaParsedQueryParameters): Promise<T[]>;
72
+ getOne(resourceName: M, resourceId: string | number, query: PrismaParsedQueryParameters): Promise<T>;
73
+ create(resourceName: M, data: any, query: PrismaParsedQueryParameters): Promise<T>;
74
+ update(resourceName: M, resourceId: string | number, data: any, query: PrismaParsedQueryParameters): Promise<T>;
75
+ delete(resourceName: M, resourceId: string | number, query: PrismaParsedQueryParameters): Promise<T>;
76
+ connect(): any;
77
+ disconnect(): any;
78
+ get client(): any;
79
+ getModels(): M[];
80
+ private getPrismaDelegate;
81
+ mapModelsToRouteNames(): Promise<{ [key in M]?: string | undefined; }>;
82
+ }
83
+
84
+ type SwaggerType = {
85
+ name: string;
86
+ isArray?: boolean;
87
+ description?: string;
88
+ required?: boolean;
89
+ };
90
+
91
+ type SwaggerOperation = {
92
+ summary?: string;
93
+ responses?: Record<number, any>;
94
+ body?: SwaggerType;
95
+ response: SwaggerType;
96
+ };
97
+
98
+ type SwaggerTag = {
99
+ name?: string;
100
+ description?: string;
101
+ externalDocs?: {
102
+ description: string;
103
+ url: string;
104
+ };
105
+ };
106
+
107
+ type SwaggerParameter = {
108
+ name: string;
109
+ description?: string;
110
+ schema: {
111
+ type: string;
112
+ } & any;
113
+ };
114
+
115
+ type ModelsConfig = {
116
+ tag: SwaggerTag;
117
+ type?: SwaggerType;
118
+ routeTypes?: {
119
+ [RouteType.READ_ALL]?: SwaggerOperation;
120
+ [RouteType.READ_ONE]?: SwaggerOperation;
121
+ [RouteType.CREATE]?: SwaggerOperation;
122
+ [RouteType.UPDATE]?: SwaggerOperation;
123
+ [RouteType.DELETE]?: SwaggerOperation;
124
+ };
125
+ additionalQueryParams?: SwaggerParameter[];
126
+ };
127
+
128
+ type SwaggerModelsConfig<M extends string> = {
129
+ [key in M]?: ModelsConfig;
130
+ };
131
+
132
+ declare const modelsToOpenApi: <M extends string = string>({ prismaClient, models: ctorModels, swagger, crud, defaultExposeStrategy, }: ModelsToOpenApiParameters<M>) => Promise<{
133
+ schemas: any;
134
+ examples: {};
135
+ tags: SwaggerTag[];
136
+ paths: {
137
+ [key: string]: any;
138
+ };
139
+ }>;
140
+ interface ModelsToOpenApiParameters<M extends string = string> {
141
+ prismaClient: PrismaClient;
142
+ defaultExposeStrategy?: "all" | "none";
143
+ models?: M[];
144
+ swagger?: Partial<{
145
+ models: SwaggerModelsConfig<M>;
146
+ allowedMediaTypes: {
147
+ [key: string]: boolean;
148
+ };
149
+ }>;
150
+ crud?: {
151
+ models: ModelsOptions<M>;
152
+ };
153
+ }
154
+
155
+ export { ModelsToOpenApiParameters, PrismaAdapter, SwaggerModelsConfig, modelsToOpenApi };