@visulima/crud 3.0.0-alpha.17 → 3.0.0-alpha.18

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 (46) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +127 -5
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.d.cts +64 -3
  5. package/dist/index.d.mts +64 -3
  6. package/dist/index.d.ts +64 -3
  7. package/dist/index.mjs +1 -1
  8. package/dist/next/index.cjs +1 -1
  9. package/dist/next/index.d.cts +21 -13
  10. package/dist/next/index.d.mts +21 -13
  11. package/dist/next/index.d.ts +21 -13
  12. package/dist/next/index.mjs +1 -1
  13. package/dist/packem_shared/CrudApiError-BH1byAwV.mjs +1 -0
  14. package/dist/packem_shared/CrudApiError-DkRqkpib.cjs +1 -0
  15. package/dist/packem_shared/PrismaAdapter-Bhocjq94.mjs +1 -0
  16. package/dist/packem_shared/PrismaAdapter-DDoEjhQy.cjs +1 -0
  17. package/dist/packem_shared/baseHandler-BGTzX4YA.mjs +1 -0
  18. package/dist/packem_shared/baseHandler-DnuGeT2-.cjs +1 -0
  19. package/dist/packem_shared/edgeHandler-CjCFAdvT.mjs +1 -0
  20. package/dist/packem_shared/edgeHandler-DQ2KLGlC.cjs +1 -0
  21. package/dist/packem_shared/get-accessible-routes-BCUs20dV.cjs +1 -0
  22. package/dist/packem_shared/get-accessible-routes-CGvT_kuy.mjs +1 -0
  23. package/dist/packem_shared/models-to-route-names-BFpwjyxy.mjs +1 -0
  24. package/dist/packem_shared/models-to-route-names-CWnxPVCQ.cjs +1 -0
  25. package/dist/packem_shared/modelsToOpenApi-QqR_HHsz.cjs +1 -0
  26. package/dist/packem_shared/modelsToOpenApi-pOMrwJIY.mjs +1 -0
  27. package/dist/packem_shared/nodeHandler-atOpJB2d.mjs +1 -0
  28. package/dist/packem_shared/nodeHandler-tp623oY3.cjs +1 -0
  29. package/dist/packem_shared/{types.d-BDmE9rKc.d.cts → types.d-CQwyFrf3.d.cts} +84 -3
  30. package/dist/packem_shared/{types.d-BDmE9rKc.d.mts → types.d-CQwyFrf3.d.mts} +84 -3
  31. package/dist/packem_shared/{types.d-BDmE9rKc.d.ts → types.d-CQwyFrf3.d.ts} +84 -3
  32. package/package.json +4 -4
  33. package/dist/packem_shared/PrismaAdapter-BVs7BWSG.mjs +0 -1
  34. package/dist/packem_shared/PrismaAdapter-Buz6dEMm.cjs +0 -1
  35. package/dist/packem_shared/base-crud-handler-BJJ5vmOh.mjs +0 -1
  36. package/dist/packem_shared/base-crud-handler-Cm23eHkD.cjs +0 -1
  37. package/dist/packem_shared/edgeHandler-CHig8R94.cjs +0 -1
  38. package/dist/packem_shared/edgeHandler-DfRlSUUt.mjs +0 -1
  39. package/dist/packem_shared/get-accessible-routes-DLLL11KB.cjs +0 -1
  40. package/dist/packem_shared/get-accessible-routes-xHYBQ_6q.mjs +0 -1
  41. package/dist/packem_shared/models-to-route-names-Dh2b_kIL.cjs +0 -1
  42. package/dist/packem_shared/models-to-route-names-UU1lZmbK.mjs +0 -1
  43. package/dist/packem_shared/modelsToOpenApi-CsQL5VTy.cjs +0 -1
  44. package/dist/packem_shared/modelsToOpenApi-ocNrUF5p.mjs +0 -1
  45. package/dist/packem_shared/nodeHandler-BdR0fuw-.mjs +0 -1
  46. package/dist/packem_shared/nodeHandler-Di5MpzCj.cjs +0 -1
@@ -5,9 +5,71 @@ declare enum RouteType {
5
5
  READ_ONE = "READ_ONE",
6
6
  UPDATE = "UPDATE",
7
7
  }
8
- interface ModelOption {
8
+ /**
9
+ * A minimal validation schema. It is intentionally structural so that any
10
+ * validator exposing a synchronous/asynchronous `parse`/`safeParse` (e.g. zod)
11
+ * can be plugged in without pulling a hard dependency on the validator.
12
+ *
13
+ * The returned (possibly transformed) value replaces `request.body` before it
14
+ * reaches the adapter.
15
+ */
16
+ interface BodySchema<T = unknown> {
17
+ parse: (data: unknown) => Promise<T> | T;
18
+ }
19
+ /**
20
+ * Per-model access policy. Every field is optional and additive on top of the
21
+ * route-level `only`/`exclude` knobs.
22
+ */
23
+ interface ModelAccessPolicy {
24
+ /**
25
+ * Validation/transform schema applied to the body of `CREATE` requests
26
+ * before it is forwarded to the adapter. Throwing rejects the request
27
+ * with the thrown error (use an `http-errors` 4xx for a clean status).
28
+ */
29
+ createSchema?: BodySchema;
30
+ /**
31
+ * Allowlist of field names a client may filter on (via `where`) or order by.
32
+ * When set, any other field referenced in `where`/`orderBy` is rejected with
33
+ * a 400. Prevents blind-exfiltration oracles on secret columns.
34
+ */
35
+ filterableFields?: string[];
36
+ /**
37
+ * Allowlist of relation names a client may `include`. When set, requesting
38
+ * any other relation is rejected with a 400.
39
+ */
40
+ includableRelations?: string[];
41
+ /**
42
+ * Field names that must never be returned to a client. They are stripped
43
+ * from `select` (if a client tried to select them) and forced into Prisma's
44
+ * `omit`-style exclusion is left to the adapter; here we simply drop them
45
+ * from an explicit `select`. Pair with `selectableFields` for a strict
46
+ * allowlist.
47
+ */
48
+ readableFields?: string[];
49
+ /**
50
+ * Allowlist of field names a client may request via `select`. When set, any
51
+ * other selected field is dropped. Prevents `?select=passwordHash`.
52
+ */
53
+ selectableFields?: string[];
54
+ /**
55
+ * Validation/transform schema applied to the body of `UPDATE` requests.
56
+ */
57
+ updateSchema?: BodySchema;
58
+ /**
59
+ * Allowlist of field names a client may write (CREATE/UPDATE body). When set,
60
+ * any other key in the body is stripped before reaching the adapter,
61
+ * preventing mass-assignment of columns like `role`/`isAdmin`.
62
+ */
63
+ writableFields?: string[];
64
+ }
65
+ interface ModelOption extends ModelAccessPolicy {
9
66
  exclude?: RouteType[];
10
67
  formatResourceId?: (resourceId: string) => number | string;
68
+ /**
69
+ * Hard cap on the number of rows a list request may return, regardless of
70
+ * the client-supplied `limit`. Overrides the handler-level `maxPerPage`.
71
+ */
72
+ maxPerPage?: number;
11
73
  name?: string;
12
74
  only?: RouteType[];
13
75
  }
@@ -52,7 +114,26 @@ interface HandlerOptions<M extends string = string> {
52
114
  list?: ListHandler;
53
115
  update?: UpdateHandler;
54
116
  };
117
+ /**
118
+ * Default hard cap on the number of rows a list request may return for any
119
+ * model, regardless of the client-supplied `limit`. Defaults to no cap.
120
+ * Per-model `maxPerPage` overrides this.
121
+ */
122
+ maxPerPage?: number;
55
123
  models?: ModelsOptions<M>;
124
+ /**
125
+ * Called once per request after the route type is resolved and before the
126
+ * adapter is invoked. Throw (ideally an `http-errors` error) to reject the
127
+ * request — a row/field access guard hook. Receives the resolved model name,
128
+ * route type and resource id (for single-resource routes).
129
+ */
130
+ onRequest?: (context: {
131
+ method: string;
132
+ resourceId?: number | string;
133
+ resourceName: string;
134
+ routeType: RouteType;
135
+ url: string;
136
+ }) => Promise<void> | void;
56
137
  pagination?: PaginationConfig;
57
138
  }
58
139
  interface PaginationConfig {
@@ -115,7 +196,7 @@ interface ParsedQueryParameters {
115
196
  skip?: number;
116
197
  where?: WhereField;
117
198
  }
118
- type ExecuteHandler<Request, Response> = (request: Request, response: Response) => Promise<void>;
199
+ type ExecuteHandler<Request, Response, Result = void> = (request: Request, response: Response) => Promise<Result>;
119
200
  interface FakePrismaClient {
120
201
  $connect: () => Promise<void> | void;
121
202
  $disconnect: () => Promise<void>;
@@ -123,4 +204,4 @@ interface FakePrismaClient {
123
204
  _dmmf?: unknown;
124
205
  _getDmmf?: () => unknown;
125
206
  }
126
- export { Adapter as A, Condition as C, ExecuteHandler as E, FakePrismaClient as F, HandlerOptions as H, ModelsOptions as M, OrderByField as O, PaginationData as P, RouteType as R, SearchCondition as S, UniqueResourceHandlerParameters as U, WhereCondition as W, ParsedQueryParameters as a, HandlerParameters as b, ModelOption as c, OrderByOperator as d, PaginationConfig as e, RecursiveField as f, WhereField as g, WhereOperator as h };
207
+ export { Adapter as A, BodySchema as B, Condition as C, DeleteHandler as D, ExecuteHandler as E, FakePrismaClient as F, GetHandler as G, HandlerOptions as H, ListHandler as L, ModelsOptions as M, OrderByField as O, PaginationData as P, RouteType as R, SearchCondition as S, UniqueResourceHandlerParameters as U, WhereCondition as W, ParsedQueryParameters as a, CreateHandler as b, HandlerParameters as c, ModelAccessPolicy as d, ModelOption as e, OrderByOperator as f, PaginationConfig as g, RecursiveField as h, UpdateHandler as i, WhereField as j, WhereOperator as k };
@@ -5,9 +5,71 @@ declare enum RouteType {
5
5
  READ_ONE = "READ_ONE",
6
6
  UPDATE = "UPDATE",
7
7
  }
8
- interface ModelOption {
8
+ /**
9
+ * A minimal validation schema. It is intentionally structural so that any
10
+ * validator exposing a synchronous/asynchronous `parse`/`safeParse` (e.g. zod)
11
+ * can be plugged in without pulling a hard dependency on the validator.
12
+ *
13
+ * The returned (possibly transformed) value replaces `request.body` before it
14
+ * reaches the adapter.
15
+ */
16
+ interface BodySchema<T = unknown> {
17
+ parse: (data: unknown) => Promise<T> | T;
18
+ }
19
+ /**
20
+ * Per-model access policy. Every field is optional and additive on top of the
21
+ * route-level `only`/`exclude` knobs.
22
+ */
23
+ interface ModelAccessPolicy {
24
+ /**
25
+ * Validation/transform schema applied to the body of `CREATE` requests
26
+ * before it is forwarded to the adapter. Throwing rejects the request
27
+ * with the thrown error (use an `http-errors` 4xx for a clean status).
28
+ */
29
+ createSchema?: BodySchema;
30
+ /**
31
+ * Allowlist of field names a client may filter on (via `where`) or order by.
32
+ * When set, any other field referenced in `where`/`orderBy` is rejected with
33
+ * a 400. Prevents blind-exfiltration oracles on secret columns.
34
+ */
35
+ filterableFields?: string[];
36
+ /**
37
+ * Allowlist of relation names a client may `include`. When set, requesting
38
+ * any other relation is rejected with a 400.
39
+ */
40
+ includableRelations?: string[];
41
+ /**
42
+ * Field names that must never be returned to a client. They are stripped
43
+ * from `select` (if a client tried to select them) and forced into Prisma's
44
+ * `omit`-style exclusion is left to the adapter; here we simply drop them
45
+ * from an explicit `select`. Pair with `selectableFields` for a strict
46
+ * allowlist.
47
+ */
48
+ readableFields?: string[];
49
+ /**
50
+ * Allowlist of field names a client may request via `select`. When set, any
51
+ * other selected field is dropped. Prevents `?select=passwordHash`.
52
+ */
53
+ selectableFields?: string[];
54
+ /**
55
+ * Validation/transform schema applied to the body of `UPDATE` requests.
56
+ */
57
+ updateSchema?: BodySchema;
58
+ /**
59
+ * Allowlist of field names a client may write (CREATE/UPDATE body). When set,
60
+ * any other key in the body is stripped before reaching the adapter,
61
+ * preventing mass-assignment of columns like `role`/`isAdmin`.
62
+ */
63
+ writableFields?: string[];
64
+ }
65
+ interface ModelOption extends ModelAccessPolicy {
9
66
  exclude?: RouteType[];
10
67
  formatResourceId?: (resourceId: string) => number | string;
68
+ /**
69
+ * Hard cap on the number of rows a list request may return, regardless of
70
+ * the client-supplied `limit`. Overrides the handler-level `maxPerPage`.
71
+ */
72
+ maxPerPage?: number;
11
73
  name?: string;
12
74
  only?: RouteType[];
13
75
  }
@@ -52,7 +114,26 @@ interface HandlerOptions<M extends string = string> {
52
114
  list?: ListHandler;
53
115
  update?: UpdateHandler;
54
116
  };
117
+ /**
118
+ * Default hard cap on the number of rows a list request may return for any
119
+ * model, regardless of the client-supplied `limit`. Defaults to no cap.
120
+ * Per-model `maxPerPage` overrides this.
121
+ */
122
+ maxPerPage?: number;
55
123
  models?: ModelsOptions<M>;
124
+ /**
125
+ * Called once per request after the route type is resolved and before the
126
+ * adapter is invoked. Throw (ideally an `http-errors` error) to reject the
127
+ * request — a row/field access guard hook. Receives the resolved model name,
128
+ * route type and resource id (for single-resource routes).
129
+ */
130
+ onRequest?: (context: {
131
+ method: string;
132
+ resourceId?: number | string;
133
+ resourceName: string;
134
+ routeType: RouteType;
135
+ url: string;
136
+ }) => Promise<void> | void;
56
137
  pagination?: PaginationConfig;
57
138
  }
58
139
  interface PaginationConfig {
@@ -115,7 +196,7 @@ interface ParsedQueryParameters {
115
196
  skip?: number;
116
197
  where?: WhereField;
117
198
  }
118
- type ExecuteHandler<Request, Response> = (request: Request, response: Response) => Promise<void>;
199
+ type ExecuteHandler<Request, Response, Result = void> = (request: Request, response: Response) => Promise<Result>;
119
200
  interface FakePrismaClient {
120
201
  $connect: () => Promise<void> | void;
121
202
  $disconnect: () => Promise<void>;
@@ -123,4 +204,4 @@ interface FakePrismaClient {
123
204
  _dmmf?: unknown;
124
205
  _getDmmf?: () => unknown;
125
206
  }
126
- export { Adapter as A, Condition as C, ExecuteHandler as E, FakePrismaClient as F, HandlerOptions as H, ModelsOptions as M, OrderByField as O, PaginationData as P, RouteType as R, SearchCondition as S, UniqueResourceHandlerParameters as U, WhereCondition as W, ParsedQueryParameters as a, HandlerParameters as b, ModelOption as c, OrderByOperator as d, PaginationConfig as e, RecursiveField as f, WhereField as g, WhereOperator as h };
207
+ export { Adapter as A, BodySchema as B, Condition as C, DeleteHandler as D, ExecuteHandler as E, FakePrismaClient as F, GetHandler as G, HandlerOptions as H, ListHandler as L, ModelsOptions as M, OrderByField as O, PaginationData as P, RouteType as R, SearchCondition as S, UniqueResourceHandlerParameters as U, WhereCondition as W, ParsedQueryParameters as a, CreateHandler as b, HandlerParameters as c, ModelAccessPolicy as d, ModelOption as e, OrderByOperator as f, PaginationConfig as g, RecursiveField as h, UpdateHandler as i, WhereField as j, WhereOperator as k };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/crud",
3
- "version": "3.0.0-alpha.17",
3
+ "version": "3.0.0-alpha.18",
4
4
  "description": "A comprehensive CRUD library for building RESTful APIs with Prisma, providing automatic CRUD operations, filtering, sorting, and pagination.",
5
5
  "keywords": [
6
6
  "anolilab",
@@ -75,13 +75,13 @@
75
75
  "LICENSE.md"
76
76
  ],
77
77
  "dependencies": {
78
- "@visulima/pagination": "5.0.0-alpha.13",
79
- "@visulima/prisma-dmmf-transformer": "3.0.0-alpha.15",
78
+ "@visulima/pagination": "5.0.0-alpha.14",
79
+ "@visulima/prisma-dmmf-transformer": "3.0.0-alpha.16",
80
80
  "http-errors": "^2.0.1",
81
81
  "path-to-regexp": "8.4.2"
82
82
  },
83
83
  "peerDependencies": {
84
- "@prisma/client": "^3.0.0 || ^4.0.0",
84
+ "@prisma/client": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0",
85
85
  "next": ">=12.0 || >=13.0 || >=14.0 || >=15.0"
86
86
  },
87
87
  "peerDependenciesMeta": {
@@ -1 +0,0 @@
1
- var P=Object.defineProperty;var n=(r,t)=>P(r,"name",{value:t,configurable:!0});import p from"http-errors";import{a as k}from"./models-to-route-names-UU1lZmbK.mjs";var O=Object.defineProperty,C=n((r,t)=>O(r,"name",{value:t,configurable:!0}),"n$1");const j=new Set(["boolean","number","string"]),u=C(r=>j.has(typeof r),"isPrimitive");var M=Object.defineProperty,E=n((r,t)=>M(r,"name",{value:t,configurable:!0}),"s$1");const D=E(r=>{const t={};if(Object.keys(r).forEach(e=>{const s=r[e];u(s)&&(t[e]=s)}),Object.keys(t).length!==1)throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");return t},"parsePrismaCursor");var R=Object.defineProperty,K=n((r,t)=>R(r,"name",{value:t,configurable:!0}),"a");const q={$asc:"asc",$desc:"desc"},B=K(r=>{const t={};return Object.keys(r).forEach(e=>{const s=r[e];t[e]=q[s]}),t},"parsePrismaOrderBy");var S=Object.defineProperty,A=n((r,t)=>S(r,"name",{value:t,configurable:!0}),"u$1");const m=A((r,t)=>{const e={};return Object.keys(r).forEach(s=>{e[s]=r[s]===!0?!0:{[t]:m(r[s],t)}}),e},"parsePrismaRecursiveField");var N=Object.defineProperty,a=n((r,t)=>N(r,"name",{value:t,configurable:!0}),"r");const c=a(r=>r instanceof Object,"isObject"),_={$cont:"contains",$ends:"endsWith",$eq:"equals",$gt:"gt",$gte:"gte",$in:"in",$lt:"lt",$lte:"lte",$neq:"not",$notin:"notIn",$starts:"startsWith"},F=a(r=>/^\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(r),"isDateString"),Q=a(r=>F(r)?new Date(r):typeof r=="string"&&r==="$isnull"?null:r,"getSearchValue"),f=a((r,t)=>{const e=r.split(".");return e.splice(-1,1),t.includes(e.join("."))},"isRelation"),g=a(r=>{const t=Object.keys(r)[0],e=_[t];if(e)return{[e]:r[t]}},"parseSimpleField"),w=a((r,t,e,s)=>{const i=t.split(".").toReversed();let o={};i.forEach((h,v)=>{v===0?b(r,h,o,s):o={[h]:{some:o}}});const l=i.toReversed()[0],$=e[l];e[l]={some:{...$?.some,...o[l]?.some}}},"parseRelation"),d=a((r,t)=>{const e={};return Object.keys(r).forEach(s=>{const i=r[s];if(f(s,t))w(i,s,e,t);else if(u(i))e[s]=i;else if(c(i)){const o=g(i);o&&(e[s]=o)}}),e},"parseObjectCombination"),b=a((r,t,e,s)=>{if(u(r))e[t]=Q(r);else switch(t){case"$and":{c(r)&&(e.AND=d(r,s));break}case"$not":{c(r)&&(e.NOT=d(r,s));break}case"$or":{c(r)&&(e.OR=d(r,s));break}default:{e[t]=g(r);break}}},"basicParse"),T=a((r,t)=>{const e={};return Object.keys(r).forEach(s=>{const i=r[s];f(s,t)?w(i,s,e,t):b(i,s,e,t)}),e},"parsePrismaWhere");var W=Object.defineProperty,y=n((r,t)=>W(r,"name",{value:t,configurable:!0}),"s");class J{static{n(this,"P")}static{y(this,"PrismaAdapter")}models;ctorModels;dmmf;manyRelations;primaryKey;prismaClient;constructor({manyRelations:t={},models:e,primaryKey:s="id",prismaClient:i}){this.prismaClient=i,this.primaryKey=s,this.manyRelations=t,this.ctorModels=e}async connect(){return await this.prismaClient.$connect()}async create(t,e,s){return await this.getPrismaDelegate(t).create({data:e,include:s.include,select:s.select})}async delete(t,e,s){return await this.getPrismaDelegate(t).delete({include:s.include,select:s.select,where:{[this.primaryKey]:e}})}async disconnect(){await this.prismaClient.$disconnect()}async getAll(t,e){return await this.getPrismaDelegate(t).findMany({cursor:e.cursor,distinct:e.distinct,include:e.include,orderBy:e.orderBy,select:e.select,skip:e.skip,take:e.take,where:e.where})}getModels(){return this.models??[]}async getOne(t,e,s){const i=this.getPrismaDelegate(t);return await(i.findUnique??i.findOne)({include:s.include,select:s.select,where:{[this.primaryKey]:e}})}async getPaginationData(t,e){const s=await this.getPrismaDelegate(t).count({distinct:e.distinct,where:e.where}),i=e.take??0;return{page:i>0?Math.ceil((e.skip??0)/i)+1:1,pageCount:i>0?Math.ceil(s/i):0,total:s}}handleError(t){throw console.error(t),t instanceof Error&&t.stack&&console.error(t.stack),t.constructor.name==="PrismaClientKnownRequestError"||t.constructor.name==="PrismaClientValidationError"?p(400,"invalid request, check your server logs for more info"):p(500,"an unknown error occured, check your server logs for more info")}async init(){const t=this.ctorModels,e=await this.getPrismaClientModels();t!==void 0&&t.forEach(s=>{if(!Object.keys(e).includes(s))throw new Error(`Model name ${s} is invalid.`)}),this.models=t??Object.keys(e)}async mapModelsToRouteNames(){return k(await this.getPrismaClientModels(),this.getModels())}parseQuery(t,e){const s={};return e.select&&(s.select=m(e.select,"select")),e.include&&(s.include=m(e.include,"include")),e.where&&(s.where=T(e.where,this.manyRelations[t]??[])),e.orderBy&&(s.orderBy=B(e.orderBy)),e.limit!==void 0&&(s.take=e.limit),e.skip!==void 0&&(s.skip=e.skip),e.originalQuery?.cursor&&(s.cursor=D(JSON.parse(e.originalQuery.cursor))),e.distinct&&(s.distinct=e.distinct),s}async update(t,e,s,i){return await this.getPrismaDelegate(t).update({data:s,include:i.include,select:i.select,where:{[this.primaryKey]:e}})}get client(){return this.prismaClient}getPrismaClientModels=y(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")},"getPrismaClientModels");getPrismaDelegate(t){return this.prismaClient[`${t.charAt(0).toLowerCase()}${t.slice(1)}`]}}export{J as default};
@@ -1 +0,0 @@
1
- "use strict";var P=Object.defineProperty;var a=(r,t)=>P(r,"name",{value:t,configurable:!0});const k=require("http-errors"),O=require("./models-to-route-names-Dh2b_kIL.cjs"),C=a(r=>r&&typeof r=="object"&&"default"in r?r.default:r,"_interopDefaultCompat"),p=C(k);var j=Object.defineProperty,M=a((r,t)=>j(r,"name",{value:t,configurable:!0}),"n$1");const D=new Set(["boolean","number","string"]),m=M(r=>D.has(typeof r),"isPrimitive");var E=Object.defineProperty,R=a((r,t)=>E(r,"name",{value:t,configurable:!0}),"s$1");const q=R(r=>{const t={};if(Object.keys(r).forEach(e=>{const s=r[e];m(s)&&(t[e]=s)}),Object.keys(t).length!==1)throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");return t},"parsePrismaCursor");var K=Object.defineProperty,_=a((r,t)=>K(r,"name",{value:t,configurable:!0}),"a");const B={$asc:"asc",$desc:"desc"},N=_(r=>{const t={};return Object.keys(r).forEach(e=>{const s=r[e];t[e]=B[s]}),t},"parsePrismaOrderBy");var S=Object.defineProperty,A=a((r,t)=>S(r,"name",{value:t,configurable:!0}),"u$1");const u=A((r,t)=>{const e={};return Object.keys(r).forEach(s=>{e[s]=r[s]===!0?!0:{[t]:u(r[s],t)}}),e},"parsePrismaRecursiveField");var T=Object.defineProperty,n=a((r,t)=>T(r,"name",{value:t,configurable:!0}),"r");const c=n(r=>r instanceof Object,"isObject"),F={$cont:"contains",$ends:"endsWith",$eq:"equals",$gt:"gt",$gte:"gte",$in:"in",$lt:"lt",$lte:"lte",$neq:"not",$notin:"notIn",$starts:"startsWith"},Q=n(r=>/^\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(r),"isDateString"),W=n(r=>Q(r)?new Date(r):typeof r=="string"&&r==="$isnull"?null:r,"getSearchValue"),f=n((r,t)=>{const e=r.split(".");return e.splice(-1,1),t.includes(e.join("."))},"isRelation"),g=n(r=>{const t=Object.keys(r)[0],e=F[t];if(e)return{[e]:r[t]}},"parseSimpleField"),b=n((r,t,e,s)=>{const i=t.split(".").toReversed();let o={};i.forEach((h,v)=>{v===0?w(r,h,o,s):o={[h]:{some:o}}});const l=i.toReversed()[0],$=e[l];e[l]={some:{...$?.some,...o[l]?.some}}},"parseRelation"),d=n((r,t)=>{const e={};return Object.keys(r).forEach(s=>{const i=r[s];if(f(s,t))b(i,s,e,t);else if(m(i))e[s]=i;else if(c(i)){const o=g(i);o&&(e[s]=o)}}),e},"parseObjectCombination"),w=n((r,t,e,s)=>{if(m(r))e[t]=W(r);else switch(t){case"$and":{c(r)&&(e.AND=d(r,s));break}case"$not":{c(r)&&(e.NOT=d(r,s));break}case"$or":{c(r)&&(e.OR=d(r,s));break}default:{e[t]=g(r);break}}},"basicParse"),x=n((r,t)=>{const e={};return Object.keys(r).forEach(s=>{const i=r[s];f(s,t)?b(i,s,e,t):w(i,s,e,t)}),e},"parsePrismaWhere");var V=Object.defineProperty,y=a((r,t)=>V(r,"name",{value:t,configurable:!0}),"s");class I{static{a(this,"P")}static{y(this,"PrismaAdapter")}models;ctorModels;dmmf;manyRelations;primaryKey;prismaClient;constructor({manyRelations:t={},models:e,primaryKey:s="id",prismaClient:i}){this.prismaClient=i,this.primaryKey=s,this.manyRelations=t,this.ctorModels=e}async connect(){return await this.prismaClient.$connect()}async create(t,e,s){return await this.getPrismaDelegate(t).create({data:e,include:s.include,select:s.select})}async delete(t,e,s){return await this.getPrismaDelegate(t).delete({include:s.include,select:s.select,where:{[this.primaryKey]:e}})}async disconnect(){await this.prismaClient.$disconnect()}async getAll(t,e){return await this.getPrismaDelegate(t).findMany({cursor:e.cursor,distinct:e.distinct,include:e.include,orderBy:e.orderBy,select:e.select,skip:e.skip,take:e.take,where:e.where})}getModels(){return this.models??[]}async getOne(t,e,s){const i=this.getPrismaDelegate(t);return await(i.findUnique??i.findOne)({include:s.include,select:s.select,where:{[this.primaryKey]:e}})}async getPaginationData(t,e){const s=await this.getPrismaDelegate(t).count({distinct:e.distinct,where:e.where}),i=e.take??0;return{page:i>0?Math.ceil((e.skip??0)/i)+1:1,pageCount:i>0?Math.ceil(s/i):0,total:s}}handleError(t){throw console.error(t),t instanceof Error&&t.stack&&console.error(t.stack),t.constructor.name==="PrismaClientKnownRequestError"||t.constructor.name==="PrismaClientValidationError"?p(400,"invalid request, check your server logs for more info"):p(500,"an unknown error occured, check your server logs for more info")}async init(){const t=this.ctorModels,e=await this.getPrismaClientModels();t!==void 0&&t.forEach(s=>{if(!Object.keys(e).includes(s))throw new Error(`Model name ${s} is invalid.`)}),this.models=t??Object.keys(e)}async mapModelsToRouteNames(){return O.a(await this.getPrismaClientModels(),this.getModels())}parseQuery(t,e){const s={};return e.select&&(s.select=u(e.select,"select")),e.include&&(s.include=u(e.include,"include")),e.where&&(s.where=x(e.where,this.manyRelations[t]??[])),e.orderBy&&(s.orderBy=N(e.orderBy)),e.limit!==void 0&&(s.take=e.limit),e.skip!==void 0&&(s.skip=e.skip),e.originalQuery?.cursor&&(s.cursor=q(JSON.parse(e.originalQuery.cursor))),e.distinct&&(s.distinct=e.distinct),s}async update(t,e,s,i){return await this.getPrismaDelegate(t).update({data:s,include:i.include,select:i.select,where:{[this.primaryKey]:e}})}get client(){return this.prismaClient}getPrismaClientModels=y(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")},"getPrismaClientModels");getPrismaDelegate(t){return this.prismaClient[`${t.charAt(0).toLowerCase()}${t.slice(1)}`]}}module.exports=I;
@@ -1 +0,0 @@
1
- var M=Object.defineProperty;var u=(e,r)=>M(e,"name",{value:r,configurable:!0});import{createRequire as B}from"node:module";import y from"http-errors";import{ApiError as R}from"next/dist/server/api-utils/index.js";import{paginate as Q}from"@visulima/pagination";import{RouteType as f}from"./RouteType-BQ2RxFPE.mjs";import{E as J}from"./get-accessible-routes-xHYBQ_6q.mjs";import{match as _}from"path-to-regexp";const U=B(import.meta.url),h=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,H=u(e=>{if(typeof h<"u"&&h.versions&&h.versions.node){const[r,t]=h.versions.node.split(".").map(Number);if(r>22||r===22&&t>=3||r===20&&t>=16)return h.getBuiltinModule(e)}return U(e)},"__cjs_getBuiltinModule"),{URL:G}=H("node:url");var K=Object.defineProperty,z=u((e,r)=>K(e,"name",{value:r,configurable:!0}),"t");const X=z(async({adapter:e,query:r,request:t,resourceName:n})=>({data:await e.create(n,t.body,r),status:201}),"createHandler");var W=Object.defineProperty,V=u((e,r)=>W(e,"name",{value:r,configurable:!0}),"r$3");const Y=V(async({adapter:e,query:r,resourceId:t,resourceName:n})=>{if(await e.getOne(n,t,r))return{data:await e.delete(n,t,r),status:200};throw y(404,`${n} ${String(t)} not found`)},"deleteHandler");var Z=Object.defineProperty,ee=u((e,r)=>Z(e,"name",{value:r,configurable:!0}),"g$2");const re=ee(async({adapter:e,pagination:r,query:t,resourceName:n})=>{let a=!1,i;if(t.page!==void 0){if(t.page<=0)throw new Error("page query must be a strictly positive number");i={page:t.page,perPage:t.limit??r.perPage}}i&&(a=!0,t.skip=(i.page-1)*i.perPage,t.take=i.perPage);const o=await e.getAll(n,t);if(a){const{page:s,total:l}=await e.getPaginationData(n,t);return{data:Q(s,i.perPage,l,o).toJSON(),status:200}}return{data:o,status:200}},"listHandler");var te=Object.defineProperty,ne=u((e,r)=>te(e,"name",{value:r,configurable:!0}),"o$1");const ae=ne(async({adapter:e,query:r,resourceId:t,resourceName:n})=>{const a=await e.getOne(n,t,r);if(!a)throw y(404,`${n} ${String(t)} not found`);return{data:a,status:200}},"readHandler");var oe=Object.defineProperty,ie=u((e,r)=>oe(e,"name",{value:r,configurable:!0}),"d$3");const se=ie(async({adapter:e,query:r,request:t,resourceId:n,resourceName:a})=>{if(await e.getOne(a,n,r))return{data:await e.update(a,n,t.body,r),status:201};throw y(404,`${a} ${String(n)} not found`)},"updateHandler");var ue=Object.defineProperty,c=u((e,r)=>ue(e,"name",{value:r,configurable:!0}),"f");const d=c(e=>{const r=typeof e;return e!==null&&(r==="object"||r==="function")},"isObject"),ce=c(e=>{if(!d(e))return!1;for(const r in e)if(Object.hasOwn(e,r))return!1;return!0},"isEmptyObject"),S=new Set(["__proto__","prototype","constructor"]),q=1e6,pe=c(e=>e>="0"&&e<="9","isDigit");function m(e){if(e==="0")return!0;if(/^[1-9]\d*$/.test(e)){const r=Number.parseInt(e,10);return r<=Number.MAX_SAFE_INTEGER&&r<=q}return!1}u(m,"p$1");c(m,"shouldCoerceToNumber");function w(e,r){return S.has(e)?!1:(e&&m(e)?r.push(Number.parseInt(e,10)):r.push(e),!0)}u(w,"y");c(w,"processSegment");function C(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);const r=[];let t="",n="start",a=!1,i=0;for(const o of e){if(i++,a){t+=o,a=!1;continue}if(o==="\\"){if(n==="index")throw new Error(`Invalid character '${o}' in an index at position ${i}`);if(n==="indexEnd")throw new Error(`Invalid character '${o}' after an index at position ${i}`);a=!0,n=n==="start"?"property":n;continue}switch(o){case".":{if(n==="index")throw new Error(`Invalid character '${o}' in an index at position ${i}`);if(n==="indexEnd"){n="property";break}if(!w(t,r))return[];t="",n="property";break}case"[":{if(n==="index")throw new Error(`Invalid character '${o}' in an index at position ${i}`);if(n==="indexEnd"){n="index";break}if(n==="property"||n==="start"){if((t||n==="property")&&!w(t,r))return[];t=""}n="index";break}case"]":{if(n==="index"){if(t==="")t=(r.pop()||"")+"[]",n="property";else{const s=Number.parseInt(t,10);!Number.isNaN(s)&&Number.isFinite(s)&&s>=0&&s<=Number.MAX_SAFE_INTEGER&&s<=q&&t===String(s)?r.push(s):r.push(t),t="",n="indexEnd"}break}if(n==="indexEnd")throw new Error(`Invalid character '${o}' after an index at position ${i}`);t+=o;break}default:{if(n==="index"&&!pe(o))throw new Error(`Invalid character '${o}' in an index at position ${i}`);if(n==="indexEnd")throw new Error(`Invalid character '${o}' after an index at position ${i}`);n==="start"&&(n="property"),t+=o}}}switch(a&&(t+="\\"),n){case"property":{if(!w(t,r))return[];break}case"index":throw new Error("Index was not closed");case"start":{r.push("");break}}return r}u(C,"parsePath");c(C,"parsePath");function b(e){if(typeof e=="string")return C(e);if(Array.isArray(e)){const r=[];for(const[t,n]of e.entries()){if(typeof n!="string"&&typeof n!="number")throw new TypeError(`Expected a string or number for path segment at index ${t}, got ${typeof n}`);if(typeof n=="number"&&!Number.isFinite(n))throw new TypeError(`Path segment at index ${t} must be a finite number, got ${n}`);if(S.has(n))return[];typeof n=="string"&&m(n)?r.push(Number.parseInt(n,10)):r.push(n)}return r}return[]}u(b,"d$2");c(b,"normalizePath");function fe(e,r,t){if(!d(e)||typeof r!="string"&&!Array.isArray(r))return t===void 0?e:t;const n=b(r);if(n.length===0)return t;for(let a=0;a<n.length;a++){const i=n[a];if(e=e[i],e==null){if(a!==n.length-1)return t;break}}return e===void 0?t:e}u(fe,"getProperty");c(fe,"getProperty");function $(e,r,t){if(!d(e)||typeof r!="string"&&!Array.isArray(r))return e;const n=e,a=b(r);if(a.length===0)return e;for(let i=0;i<a.length;i++){const o=a[i];if(i===a.length-1)e[o]=t;else if(!d(e[o])){const s=typeof a[i+1]=="number";e[o]=s?[]:{}}e=e[o]}return n}u($,"setProperty");c($,"setProperty");function de(e,r){if(!d(e)||typeof r!="string"&&!Array.isArray(r))return!1;const t=b(r);if(t.length===0)return!1;for(let n=0;n<t.length;n++){const a=t[n];if(n===t.length-1)return Object.hasOwn(e,a)?(delete e[a],!0):!1;if(e=e[a],!d(e))return!1}}u(de,"deleteProperty");c(de,"deleteProperty");function le(e,r){if(!d(e)||typeof r!="string"&&!Array.isArray(r))return!1;const t=b(r);if(t.length===0)return!1;for(const n of t){if(!d(e)||!(n in e))return!1;e=e[n]}return!0}u(le,"hasProperty");c(le,"hasProperty");function A(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return e.replaceAll(/[\\.[]/g,String.raw`\$&`)}u(A,"escapePath");c(A,"escapePath");function D(e){const r=Object.entries(e);return Array.isArray(e)?r.map(([t,n])=>[m(t)?Number.parseInt(t,10):t,n]):r}u(D,"m");c(D,"normalizeEntries");function F(e,r={}){if(!Array.isArray(e))throw new TypeError(`Expected an array, got ${typeof e}`);const{preferDotForIndices:t=!1}=r,n=[];for(const[a,i]of e.entries()){if(typeof i!="string"&&typeof i!="number")throw new TypeError(`Expected a string or number for path segment at index ${a}, got ${typeof i}`);if(typeof i=="number")if(!Number.isInteger(i)||i<0){const o=A(String(i));n.push(a===0?o:`.${o}`)}else t&&a>0?n.push(`.${i}`):n.push(`[${i}]`);else if(typeof i=="string")if(i==="")a===0||n.push(".");else if(m(i)){const o=Number.parseInt(i,10);t&&a>0?n.push(`.${o}`):n.push(`[${o}]`)}else{const o=A(i);n.push(a===0?o:`.${o}`)}}return n.join("")}u(F,"stringifyPath");c(F,"stringifyPath");function*I(e,r=[],t=new Set){if(!d(e)||ce(e)){r.length>0&&(yield F(r));return}if(!t.has(e)){t.add(e);for(const[n,a]of D(e))r.push(n),yield*I(a,r,t),r.pop();t.delete(e)}}u(I,"x");c(I,"deepKeysIterator");function ye(e){return[...I(e)]}u(ye,"deepKeys");c(ye,"deepKeys");function ge(e){const r={};if(!d(e))return r;for(const[t,n]of Object.entries(e))$(r,t,n);return r}u(ge,"unflatten");c(ge,"unflatten");var he=Object.defineProperty,E=u((e,r)=>he(e,"name",{value:r,configurable:!0}),"i$1");const k=E(e=>{const r={};return e.split(",").forEach(t=>{$(r,t,!0)}),r},"parseRecursive"),me=E(e=>{const r=JSON.parse(e),t={};return Object.keys(r).forEach(n=>{$(t,n,r[n])}),t},"parseWhere"),be=E(e=>{const r=JSON.parse(e),t=Object.keys(r),n=t[0];if(t.length!==1||n===void 0||r[n]!=="$asc"&&r[n]!=="$desc")throw new Error("orderBy needs to be an object with exactly 1 property with either $asc or $desc value");return{[n]:r[n]}},"parseOrderBy"),we=E(e=>{if(e){const{searchParams:r}=new G(e),t={};return r.get("select")&&(t.select=k(r.get("select"))),r.get("include")&&(t.include=k(r.get("include"))),r.get("where")&&(t.where=me(r.get("where"))),r.get("orderBy")&&(t.orderBy=be(r.get("orderBy"))),r.has("limit")&&(t.limit=Number.isFinite(+r.get("limit"))?+r.get("limit"):void 0),r.has("skip")&&(t.skip=Number.isFinite(+r.get("skip"))?+r.get("skip"):void 0),r.get("distinct")&&(t.distinct=r.get("distinct")),r.get("page")&&(t.page=Number.isFinite(+r.get("page"))?+r.get("page"):void 0),{originalQuery:Object.fromEntries(r.entries()),...t}}return{}},"parseQuery");var $e=Object.defineProperty,Ee=u((e,r)=>$e(e,"name",{value:r,configurable:!0}),"e");const ve=Ee(e=>Number.isSafeInteger(+e)?+e:e,"formatResourceId");var Pe=Object.defineProperty,L=u((e,r)=>Pe(e,"name",{value:r,configurable:!0}),"s");const Ne=L(e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,"ensureCamelCase"),Te=L((e,r)=>{const t=e.split("?")[0];if(t===void 0)throw new TypeError("Path is undefined");const n=t.split("/").filter(Boolean),a=Object.keys(r).find(i=>{const o=r[i];return o===""?!0:n.includes(o)||n.includes(Ne(o))});if(a===void 0)throw new Error(`Couldn't find model name for url ${e}`);return{modelName:a,resourceName:r[a]}},"getResourceNameFromUrl");var xe=Object.defineProperty,Ae=u((e,r)=>xe(e,"name",{value:r,configurable:!0}),"u");const Ie=Ae((e,r,t)=>{const n=r.split("?")[0];if(n===void 0)throw new TypeError("Path is undefined");if(!n.includes(`/${t}`))throw new Error(`invalid resource name '${t}' for route '${n}'`);const a=_(`/*placeholder/${t}{/:id}`,{decode:decodeURIComponent}),i=_(`/*placeholder/${t}`,{decode:decodeURIComponent});switch(e){case"DELETE":{const o=a(n);return typeof o=="object"&&o.params.id?{resourceId:o.params.id,routeType:f.DELETE}:{routeType:null}}case"GET":{const o=a(n);return typeof o=="object"&&o.params.id?{resourceId:o.params.id,routeType:f.READ_ONE}:{routeType:f.READ_ALL}}case"PATCH":case"PUT":{const o=a(n);return typeof o=="object"&&o.params.id?{resourceId:o.params.id,routeType:f.UPDATE}:{routeType:null}}case"POST":return i(n)?{routeType:f.CREATE}:{routeType:null};default:return{routeType:null}}},"getRouteType");var Oe=Object.defineProperty,je=u((e,r)=>Oe(e,"name",{value:r,configurable:!0}),"a");const Re=["create","delete","getAll","getOne","parseQuery","update","getPaginationData","getModels"],_e=je(e=>{Re.forEach(r=>{if(!e[r])throw y(500,`Adapter must implement the "${r}" method.`)})},"validateAdapterMethods");var ke=Object.defineProperty,Se=u((e,r)=>ke(e,"name",{value:r,configurable:!0}),"h");const qe=/\/$/u;async function Ce(e,r,t,n){try{_e(t)}catch(s){const l=s;throw new R(l.statusCode,l.message)}await t.init?.();const a={formatResourceId:ve,pagination:{perPage:20},...n},i=await t.mapModelsToRouteNames?.(),o={};return t.getModels().forEach(s=>{o[s]=a.models?.[s]?.name??i?.[s]??s}),async(s,l)=>{const{modelName:v,resourceName:O}=Te(s.url,o);if(!O)throw y(404,`Resource not found: ${s.url}`);const{resourceId:j,routeType:P}=Ie(s.method,s.url,O);if(P===null)throw y(404,`Route not found: ${s.url}`);const N=n?.models?.[v];if(!J(N?.only,N?.exclude,n?.exposeStrategy??"all").includes(P))throw y(404,`Route not found: ${s.url}`);try{const T=N?.formatResourceId?.(j)??a.formatResourceId(j);await t.connect?.();const x=we(`https://${s.headers.host?.replace(qe,"")??""}/${s.url}`),g={adapter:t,query:t.parseQuery(v,x),resourceName:v};try{let p;switch(P){case f.CREATE:{p=await(a.handlers?.create??X)({...g,request:s});break}case f.DELETE:{p=await(a.handlers?.delete??Y)({...g,resourceId:T});break}case f.READ_ALL:{p=await(a.handlers?.list??re)({...g,pagination:a.pagination,query:{...g.query,limit:x.limit??void 0,page:x.page??void 0}});break}case f.READ_ONE:{p=await(a.handlers?.get??ae)({...g,resourceId:T});break}case f.UPDATE:{p=await(a.handlers?.update??se)({...g,request:s,resourceId:T});break}default:p={data:"Method not found",status:404}}await e(l,p)}catch(p){if(t.handleError&&!(p instanceof R))t.handleError(p);else throw p}}finally{await t.disconnect?.(),await r(l)}}}u(Ce,"N");Se(Ce,"baseHandler");export{Ce as N};
@@ -1 +0,0 @@
1
- "use strict";var U=Object.defineProperty;var u=(e,t)=>U(e,"name",{value:t,configurable:!0});const H=require("http-errors"),O=require("next/dist/server/api-utils/index.js"),M=require("@visulima/pagination"),B=require("node:url"),d=require("./RouteType-DLV_OhhD.cjs"),Q=require("./get-accessible-routes-DLLL11KB.cjs"),j=require("path-to-regexp"),G=u(e=>e&&typeof e=="object"&&"default"in e?e.default:e,"_interopDefaultCompat"),y=G(H);var J=Object.defineProperty,K=u((e,t)=>J(e,"name",{value:t,configurable:!0}),"t");const z=K(async({adapter:e,query:t,request:n,resourceName:r})=>({data:await e.create(r,n.body,t),status:201}),"createHandler");var X=Object.defineProperty,W=u((e,t)=>X(e,"name",{value:t,configurable:!0}),"r$3");const V=W(async({adapter:e,query:t,resourceId:n,resourceName:r})=>{if(await e.getOne(r,n,t))return{data:await e.delete(r,n,t),status:200};throw y(404,`${r} ${String(n)} not found`)},"deleteHandler");var Y=Object.defineProperty,Z=u((e,t)=>Y(e,"name",{value:t,configurable:!0}),"g$2");const ee=Z(async({adapter:e,pagination:t,query:n,resourceName:r})=>{let a=!1,i;if(n.page!==void 0){if(n.page<=0)throw new Error("page query must be a strictly positive number");i={page:n.page,perPage:n.limit??t.perPage}}i&&(a=!0,n.skip=(i.page-1)*i.perPage,n.take=i.perPage);const o=await e.getAll(r,n);if(a){const{page:s,total:l}=await e.getPaginationData(r,n);return{data:M.paginate(s,i.perPage,l,o).toJSON(),status:200}}return{data:o,status:200}},"listHandler");var te=Object.defineProperty,re=u((e,t)=>te(e,"name",{value:t,configurable:!0}),"o$1");const ne=re(async({adapter:e,query:t,resourceId:n,resourceName:r})=>{const a=await e.getOne(r,n,t);if(!a)throw y(404,`${r} ${String(n)} not found`);return{data:a,status:200}},"readHandler");var ae=Object.defineProperty,oe=u((e,t)=>ae(e,"name",{value:t,configurable:!0}),"d$3");const ie=oe(async({adapter:e,query:t,request:n,resourceId:r,resourceName:a})=>{if(await e.getOne(a,r,t))return{data:await e.update(a,r,n.body,t),status:201};throw y(404,`${a} ${String(r)} not found`)},"updateHandler");var se=Object.defineProperty,c=u((e,t)=>se(e,"name",{value:t,configurable:!0}),"f");const f=c(e=>{const t=typeof e;return e!==null&&(t==="object"||t==="function")},"isObject"),ue=c(e=>{if(!f(e))return!1;for(const t in e)if(Object.hasOwn(e,t))return!1;return!0},"isEmptyObject"),q=new Set(["__proto__","prototype","constructor"]),S=1e6,ce=c(e=>e>="0"&&e<="9","isDigit");function h(e){if(e==="0")return!0;if(/^[1-9]\d*$/.test(e)){const t=Number.parseInt(e,10);return t<=Number.MAX_SAFE_INTEGER&&t<=S}return!1}u(h,"p$1");c(h,"shouldCoerceToNumber");function w(e,t){return q.has(e)?!1:(e&&h(e)?t.push(Number.parseInt(e,10)):t.push(e),!0)}u(w,"y");c(w,"processSegment");function _(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);const t=[];let n="",r="start",a=!1,i=0;for(const o of e){if(i++,a){n+=o,a=!1;continue}if(o==="\\"){if(r==="index")throw new Error(`Invalid character '${o}' in an index at position ${i}`);if(r==="indexEnd")throw new Error(`Invalid character '${o}' after an index at position ${i}`);a=!0,r=r==="start"?"property":r;continue}switch(o){case".":{if(r==="index")throw new Error(`Invalid character '${o}' in an index at position ${i}`);if(r==="indexEnd"){r="property";break}if(!w(n,t))return[];n="",r="property";break}case"[":{if(r==="index")throw new Error(`Invalid character '${o}' in an index at position ${i}`);if(r==="indexEnd"){r="index";break}if(r==="property"||r==="start"){if((n||r==="property")&&!w(n,t))return[];n=""}r="index";break}case"]":{if(r==="index"){if(n==="")n=(t.pop()||"")+"[]",r="property";else{const s=Number.parseInt(n,10);!Number.isNaN(s)&&Number.isFinite(s)&&s>=0&&s<=Number.MAX_SAFE_INTEGER&&s<=S&&n===String(s)?t.push(s):t.push(n),n="",r="indexEnd"}break}if(r==="indexEnd")throw new Error(`Invalid character '${o}' after an index at position ${i}`);n+=o;break}default:{if(r==="index"&&!ce(o))throw new Error(`Invalid character '${o}' in an index at position ${i}`);if(r==="indexEnd")throw new Error(`Invalid character '${o}' after an index at position ${i}`);r==="start"&&(r="property"),n+=o}}}switch(a&&(n+="\\"),r){case"property":{if(!w(n,t))return[];break}case"index":throw new Error("Index was not closed");case"start":{t.push("");break}}return t}u(_,"parsePath");c(_,"parsePath");function m(e){if(typeof e=="string")return _(e);if(Array.isArray(e)){const t=[];for(const[n,r]of e.entries()){if(typeof r!="string"&&typeof r!="number")throw new TypeError(`Expected a string or number for path segment at index ${n}, got ${typeof r}`);if(typeof r=="number"&&!Number.isFinite(r))throw new TypeError(`Path segment at index ${n} must be a finite number, got ${r}`);if(q.has(r))return[];typeof r=="string"&&h(r)?t.push(Number.parseInt(r,10)):t.push(r)}return t}return[]}u(m,"d$2");c(m,"normalizePath");function pe(e,t,n){if(!f(e)||typeof t!="string"&&!Array.isArray(t))return n===void 0?e:n;const r=m(t);if(r.length===0)return n;for(let a=0;a<r.length;a++){const i=r[a];if(e=e[i],e==null){if(a!==r.length-1)return n;break}}return e===void 0?n:e}u(pe,"getProperty");c(pe,"getProperty");function b(e,t,n){if(!f(e)||typeof t!="string"&&!Array.isArray(t))return e;const r=e,a=m(t);if(a.length===0)return e;for(let i=0;i<a.length;i++){const o=a[i];if(i===a.length-1)e[o]=n;else if(!f(e[o])){const s=typeof a[i+1]=="number";e[o]=s?[]:{}}e=e[o]}return r}u(b,"setProperty");c(b,"setProperty");function de(e,t){if(!f(e)||typeof t!="string"&&!Array.isArray(t))return!1;const n=m(t);if(n.length===0)return!1;for(let r=0;r<n.length;r++){const a=n[r];if(r===n.length-1)return Object.hasOwn(e,a)?(delete e[a],!0):!1;if(e=e[a],!f(e))return!1}}u(de,"deleteProperty");c(de,"deleteProperty");function fe(e,t){if(!f(e)||typeof t!="string"&&!Array.isArray(t))return!1;const n=m(t);if(n.length===0)return!1;for(const r of n){if(!f(e)||!(r in e))return!1;e=e[r]}return!0}u(fe,"hasProperty");c(fe,"hasProperty");function A(e){if(typeof e!="string")throw new TypeError(`Expected a string, got ${typeof e}`);return e.replaceAll(/[\\.[]/g,String.raw`\$&`)}u(A,"escapePath");c(A,"escapePath");function C(e){const t=Object.entries(e);return Array.isArray(e)?t.map(([n,r])=>[h(n)?Number.parseInt(n,10):n,r]):t}u(C,"m");c(C,"normalizeEntries");function D(e,t={}){if(!Array.isArray(e))throw new TypeError(`Expected an array, got ${typeof e}`);const{preferDotForIndices:n=!1}=t,r=[];for(const[a,i]of e.entries()){if(typeof i!="string"&&typeof i!="number")throw new TypeError(`Expected a string or number for path segment at index ${a}, got ${typeof i}`);if(typeof i=="number")if(!Number.isInteger(i)||i<0){const o=A(String(i));r.push(a===0?o:`.${o}`)}else n&&a>0?r.push(`.${i}`):r.push(`[${i}]`);else if(typeof i=="string")if(i==="")a===0||r.push(".");else if(h(i)){const o=Number.parseInt(i,10);n&&a>0?r.push(`.${o}`):r.push(`[${o}]`)}else{const o=A(i);r.push(a===0?o:`.${o}`)}}return r.join("")}u(D,"stringifyPath");c(D,"stringifyPath");function*x(e,t=[],n=new Set){if(!f(e)||ue(e)){t.length>0&&(yield D(t));return}if(!n.has(e)){n.add(e);for(const[r,a]of C(e))t.push(r),yield*x(a,t,n),t.pop();n.delete(e)}}u(x,"x");c(x,"deepKeysIterator");function le(e){return[...x(e)]}u(le,"deepKeys");c(le,"deepKeys");function ye(e){const t={};if(!f(e))return t;for(const[n,r]of Object.entries(e))b(t,n,r);return t}u(ye,"unflatten");c(ye,"unflatten");var ge=Object.defineProperty,$=u((e,t)=>ge(e,"name",{value:t,configurable:!0}),"i$1");const k=$(e=>{const t={};return e.split(",").forEach(n=>{b(t,n,!0)}),t},"parseRecursive"),he=$(e=>{const t=JSON.parse(e),n={};return Object.keys(t).forEach(r=>{b(n,r,t[r])}),n},"parseWhere"),me=$(e=>{const t=JSON.parse(e),n=Object.keys(t),r=n[0];if(n.length!==1||r===void 0||t[r]!=="$asc"&&t[r]!=="$desc")throw new Error("orderBy needs to be an object with exactly 1 property with either $asc or $desc value");return{[r]:t[r]}},"parseOrderBy"),we=$(e=>{if(e){const{searchParams:t}=new B.URL(e),n={};return t.get("select")&&(n.select=k(t.get("select"))),t.get("include")&&(n.include=k(t.get("include"))),t.get("where")&&(n.where=he(t.get("where"))),t.get("orderBy")&&(n.orderBy=me(t.get("orderBy"))),t.has("limit")&&(n.limit=Number.isFinite(+t.get("limit"))?+t.get("limit"):void 0),t.has("skip")&&(n.skip=Number.isFinite(+t.get("skip"))?+t.get("skip"):void 0),t.get("distinct")&&(n.distinct=t.get("distinct")),t.get("page")&&(n.page=Number.isFinite(+t.get("page"))?+t.get("page"):void 0),{originalQuery:Object.fromEntries(t.entries()),...n}}return{}},"parseQuery");var be=Object.defineProperty,$e=u((e,t)=>be(e,"name",{value:t,configurable:!0}),"e");const Ee=$e(e=>Number.isSafeInteger(+e)?+e:e,"formatResourceId");var ve=Object.defineProperty,F=u((e,t)=>ve(e,"name",{value:t,configurable:!0}),"s");const Pe=F(e=>`${e.charAt(0).toLowerCase()}${e.slice(1)}`,"ensureCamelCase"),Te=F((e,t)=>{const n=e.split("?")[0];if(n===void 0)throw new TypeError("Path is undefined");const r=n.split("/").filter(Boolean),a=Object.keys(t).find(i=>{const o=t[i];return o===""?!0:r.includes(o)||r.includes(Pe(o))});if(a===void 0)throw new Error(`Couldn't find model name for url ${e}`);return{modelName:a,resourceName:t[a]}},"getResourceNameFromUrl");var Ne=Object.defineProperty,Ae=u((e,t)=>Ne(e,"name",{value:t,configurable:!0}),"u");const xe=Ae((e,t,n)=>{const r=t.split("?")[0];if(r===void 0)throw new TypeError("Path is undefined");if(!r.includes(`/${n}`))throw new Error(`invalid resource name '${n}' for route '${r}'`);const a=j.match(`/*placeholder/${n}{/:id}`,{decode:decodeURIComponent}),i=j.match(`/*placeholder/${n}`,{decode:decodeURIComponent});switch(e){case"DELETE":{const o=a(r);return typeof o=="object"&&o.params.id?{resourceId:o.params.id,routeType:d.RouteType.DELETE}:{routeType:null}}case"GET":{const o=a(r);return typeof o=="object"&&o.params.id?{resourceId:o.params.id,routeType:d.RouteType.READ_ONE}:{routeType:d.RouteType.READ_ALL}}case"PATCH":case"PUT":{const o=a(r);return typeof o=="object"&&o.params.id?{resourceId:o.params.id,routeType:d.RouteType.UPDATE}:{routeType:null}}case"POST":return i(r)?{routeType:d.RouteType.CREATE}:{routeType:null};default:return{routeType:null}}},"getRouteType");var Re=Object.defineProperty,Ie=u((e,t)=>Re(e,"name",{value:t,configurable:!0}),"a");const Oe=["create","delete","getAll","getOne","parseQuery","update","getPaginationData","getModels"],je=Ie(e=>{Oe.forEach(t=>{if(!e[t])throw y(500,`Adapter must implement the "${t}" method.`)})},"validateAdapterMethods");var ke=Object.defineProperty,qe=u((e,t)=>ke(e,"name",{value:t,configurable:!0}),"h");const Se=/\/$/u;async function L(e,t,n,r){try{je(n)}catch(s){const l=s;throw new O.ApiError(l.statusCode,l.message)}await n.init?.();const a={formatResourceId:Ee,pagination:{perPage:20},...r},i=await n.mapModelsToRouteNames?.(),o={};return n.getModels().forEach(s=>{o[s]=a.models?.[s]?.name??i?.[s]??s}),async(s,l)=>{const{modelName:E,resourceName:R}=Te(s.url,o);if(!R)throw y(404,`Resource not found: ${s.url}`);const{resourceId:I,routeType:v}=xe(s.method,s.url,R);if(v===null)throw y(404,`Route not found: ${s.url}`);const P=r?.models?.[E];if(!Q.E(P?.only,P?.exclude,r?.exposeStrategy??"all").includes(v))throw y(404,`Route not found: ${s.url}`);try{const T=P?.formatResourceId?.(I)??a.formatResourceId(I);await n.connect?.();const N=we(`https://${s.headers.host?.replace(Se,"")??""}/${s.url}`),g={adapter:n,query:n.parseQuery(E,N),resourceName:E};try{let p;switch(v){case d.RouteType.CREATE:{p=await(a.handlers?.create??z)({...g,request:s});break}case d.RouteType.DELETE:{p=await(a.handlers?.delete??V)({...g,resourceId:T});break}case d.RouteType.READ_ALL:{p=await(a.handlers?.list??ee)({...g,pagination:a.pagination,query:{...g.query,limit:N.limit??void 0,page:N.page??void 0}});break}case d.RouteType.READ_ONE:{p=await(a.handlers?.get??ne)({...g,resourceId:T});break}case d.RouteType.UPDATE:{p=await(a.handlers?.update??ie)({...g,request:s,resourceId:T});break}default:p={data:"Method not found",status:404}}await e(l,p)}catch(p){if(n.handleError&&!(p instanceof O.ApiError))n.handleError(p);else throw p}}finally{await n.disconnect?.(),await t(l)}}}u(L,"N");qe(L,"baseHandler");exports.N=L;
@@ -1 +0,0 @@
1
- "use strict";var n=Object.defineProperty;var t=(e,a)=>n(e,"name",{value:a,configurable:!0});const r=require("./base-crud-handler-Cm23eHkD.cjs");var c=Object.defineProperty,o=t((e,a)=>c(e,"name",{value:a,configurable:!0}),"r");const u=o(async(e,a)=>await r.N(async(d,s)=>Response.json(s.data,{headers:{"content-type":"application/json; charset=utf-8"},status:s.status}),async()=>{},e,a),"handler");module.exports=u;
@@ -1 +0,0 @@
1
- var n=Object.defineProperty;var s=(a,t)=>n(a,"name",{value:t,configurable:!0});import{N as r}from"./base-crud-handler-BJJ5vmOh.mjs";var o=Object.defineProperty,c=s((a,t)=>o(a,"name",{value:t,configurable:!0}),"r");const i=c(async(a,t)=>await r(async(p,e)=>Response.json(e.data,{headers:{"content-type":"application/json; charset=utf-8"},status:e.status}),async()=>{},a,t),"handler");export{i as default};
@@ -1 +0,0 @@
1
- "use strict";var n=Object.defineProperty;var o=(e,t)=>n(e,"name",{value:t,configurable:!0});const r=require("./RouteType-DLV_OhhD.cjs");var l=Object.defineProperty,s=o((e,t)=>l(e,"name",{value:t,configurable:!0}),"R");const y=s((e,t,E="all")=>{let u=E==="none"?[]:[r.RouteType.READ_ALL,r.RouteType.READ_ONE,r.RouteType.UPDATE,r.RouteType.DELETE,r.RouteType.CREATE];return Array.isArray(e)&&(u=e),t?.length&&(u=u.filter(R=>!t.includes(R))),u},"getAccessibleRoutes");exports.E=y;
@@ -1 +0,0 @@
1
- var o=Object.defineProperty;var l=(e,r)=>o(e,"name",{value:r,configurable:!0});import{RouteType as t}from"./RouteType-BQ2RxFPE.mjs";var u=Object.defineProperty,A=l((e,r)=>u(e,"name",{value:r,configurable:!0}),"R");const s=A((e,r,n="all")=>{let E=n==="none"?[]:[t.READ_ALL,t.READ_ONE,t.UPDATE,t.DELETE,t.CREATE];return Array.isArray(e)&&(E=e),r?.length&&(E=E.filter(a=>!r.includes(a))),E},"getAccessibleRoutes");export{s as E};
@@ -1 +0,0 @@
1
- "use strict";var n=Object.defineProperty;var t=(e,r)=>n(e,"name",{value:r,configurable:!0});var u=Object.defineProperty,c=t((e,r)=>u(e,"name",{value:r,configurable:!0}),"n");const l=c((e,r)=>{const a={};return r.forEach(o=>{a[o]=e[o].plural}),a},"modelsToRouteNames");exports.a=l;
@@ -1 +0,0 @@
1
- var n=Object.defineProperty;var t=(e,r)=>n(e,"name",{value:r,configurable:!0});var u=Object.defineProperty,c=t((e,r)=>u(e,"name",{value:r,configurable:!0}),"n");const f=c((e,r)=>{const o={};return r.forEach(a=>{o[a]=e[a].plural}),o},"modelsToRouteNames");export{f as a};
@@ -1 +0,0 @@
1
- "use strict";var I=Object.defineProperty;var h=(t,e)=>I(t,"name",{value:e,configurable:!0});const N=require("./models-to-route-names-Dh2b_kIL.cjs"),L=require("@visulima/pagination"),D=require("@visulima/prisma-dmmf-transformer"),A=require("./get-accessible-routes-DLLL11KB.cjs"),u=require("./RouteType-DLV_OhhD.cjs");var B=Object.defineProperty,k=h((t,e)=>B(t,"name",{value:e,configurable:!0}),"t$1");const T=k(t=>`#/components/schemas/${t}`,"formatSchemaReference");var q=Object.defineProperty,v=h((t,e)=>q(t,"name",{value:e,configurable:!0}),"u$3");const w=v(t=>{switch(t){case"BigInt":case"Int":return"integer";case"Boolean":return"boolean";case"Bytes":case"DateTime":case"String":return"string";case"Decimal":case"Float":return"number";case"Json":return"object";case"Null":return"null";default:return""}},"getJSONSchemaScalar"),R="PaginationData",_=[{methodStart:"createOne",schemaNameStart:"Create"},{methodStart:"updateOne",schemaNameStart:"Update"}];let F=class{static{h(this,"R")}constructor(e){this.dmmf=e}dmmf;static{v(this,"PrismaJsonSchemaParser")}schemaInputTypes=new Map;formatInputTypeData(e){if(e.kind==="object"){const a=T(e.type.name);return e.isList?{items:{$ref:a},type:"array",xml:{name:e.type.name,wrapped:!0}}:{$ref:a}}const s=w(e.type);return e.isList?{items:{type:s},type:"array",xml:{name:e.type.name,wrapped:!0}}:{type:s}}getExampleModelsSchemas(e,s){const a=v(o=>{const i=o.replace("#/components/schemas/",""),p=s[i],c={};return Object.entries(p.properties??{}).forEach(([l,m])=>{const d=m.type;c[l]=d==="array"?[n(m.items)]:d}),c},"referenceToSchema"),r=v(o=>{const i={};return Object.entries(o).forEach(([p,c])=>{i[p]=c.$ref===void 0?c.type:a(c.$ref)}),i},"objectPropertiesToSchema"),n=v(o=>{const i={};return Object.entries(o).forEach(([p,c])=>{c.items.$ref!==void 0?i[p]=[a(c.items.$ref)]:c.type==="array"?i[p]=[n(c.items)]:c.type==="object"?i[p]=r(c.properties):i[p]=c.type}),i},"arrayItemsToSchema");return e.reduce((o,i)=>{const p={},c=s[i];Object.entries(c.properties).forEach(([d,y])=>{const g=y.type;g==="array"?p[d]=[a(y.items.$ref)]:g==="object"?p[d]=r(y.properties):p[d]=g});const l=this.getPaginationDataSchema()[R],m={};return Object.entries(l.properties).forEach(([d,y])=>{m[d]=y.type}),{...o,[`${i}Page`]:{value:{data:[p],meta:m}},[`${i}s`]:{value:[p]},[i]:{value:p}}},{})}getPaginatedModelsSchemas(e){return e.reduce((s,a)=>({...s,[`${a}Page`]:{properties:{data:{items:{$ref:T(a)},type:"array",xml:{name:"data",wrapped:!0}},meta:{$ref:T(R)}},type:"object",xml:{name:`${a}Page`}}}),{})}getPaginationDataSchema(){return L.createPaginationMetaSchemaObject(R)}parseInputTypes(e){const s=e.reduce((a,r)=>(_.map(n=>({name:`${n.methodStart}${r}`,schemaName:`${n.schemaNameStart}${r}`})).forEach(({name:n,schemaName:o})=>{const i=this.dmmf.mutationType.fieldMap[n].args[0].inputTypes[0].type.fields,p=[],c=i.reduce((l,m)=>{if(m.inputTypes[0].kind==="scalar"){const d=D.getJSONSchemaProperty(this.dmmf.datamodel,{})({name:m.name,...m.inputTypes[0]}),{type:y}=d[1];y&&Array.isArray(y)?y.includes("null")&&(l[m.name]={...y,nullable:!0,type:y.filter(g=>g!=="null")},l[m.name].type.length===1&&(l[m.name]={...l[m.name],type:l[m.name].type[0]})):l[m.name]=d[1]}else{const d=this.parseObjectInputType(m.inputTypes[0]);l[m.name]={...d,nullable:m.isNullable}}return m.isRequired&&p.push(m.name),l},{});a[o]={properties:c,type:"object",xml:{name:o}},p.length>0&&(a[o].required=p)}),a),{});return this.schemaInputTypes.forEach((a,r)=>{s[r]={properties:a,type:"object",xml:{name:r}}}),s}parseModels(){const e=D.transformDMMF(this.dmmf).definitions;return Object.keys(e).forEach(s=>{const{properties:a}=e[s];Object.keys(a).forEach(r=>{Array.isArray(a[r].type)&&a[r].type.includes("null")&&(a[r].type=a[r].type.filter(n=>n!=="null"),a[r].type.length===1&&(a[r].type=a[r].type[0]),a[r].nullable=!0)})}),e}parseObjectInputType(e){return e.kind==="object"?(this.schemaInputTypes.has(e.type.name)||(this.schemaInputTypes.set(e.type.name,{}),e.type.fields.forEach(s=>{let a={};if(s.inputTypes.length>1){let r=!1;const n=s.inputTypes.map(o=>{const i=this.formatInputTypeData(o);if(i.type==="null"){r=!0;return}return i}).filter(Boolean);n.length===1?a=n[0]:a.anyOf=n,r&&(a.nullable=!0)}else{const r=s.inputTypes[0];a=this.formatInputTypeData(r)}this.schemaInputTypes.set(e.type.name,{...this.schemaInputTypes.get(e.type.name),[s.name]:a}),s.inputTypes.forEach(r=>{r.kind==="object"&&this.parseObjectInputType(r)})})),{$ref:T(e.type.name)}):{type:w(e.type)}}};var U=Object.defineProperty,J=h((t,e)=>U(t,"name",{value:e,configurable:!0}),"o$1");const Q=J((t,e,s="all")=>t.reduce((a,r)=>e?.[r]?{...a,[r]:A.E(e[r].only,e[r].exclude,s)}:{...a,[r]:A.E(void 0,void 0,s)},{}),"getModelsAccessibleRoutes");var V=Object.defineProperty,W=h((t,e)=>V(t,"name",{value:e,configurable:!0}),"i$2");const f={distinct:{description:"Fields to distinctively retrieve",name:"distinct",schema:{type:"string"}},include:{description:"Include relations, same as select",name:"include",schema:{type:"string"}},limit:{description:"Maximum number of elements to retrieve",name:"limit",schema:{minimum:0,type:"integer"}},orderBy:{description:'Field on which to order by a direction. See <a href="https://next-crud.js.org/query-params#orderBy">the docs</a>',name:"orderBy",schema:{type:"string"}},page:{description:"Page number. Use only for pagination.",name:"page",schema:{minimum:1,type:"integer"}},select:{description:"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts",name:"select",schema:{type:"string"}},skip:{description:"Number of rows to skip",name:"skip",schema:{minimum:0,type:"integer"}},where:{description:'Fields to filter. See <a href="https://next-crud.js.org/query-params#where">the docs</a>',name:"where",schema:{type:"string"}}},C=[f.select,f.include].filter(Boolean),z=[...C,f.limit,f.skip,f.where,f.orderBy,f.page,f.distinct].filter(Boolean),G=W((t,e=[])=>t===u.RouteType.READ_ALL?[...z,...e].filter(Boolean):[...C,...e].filter(Boolean),"getQueryParameters");var H=Object.defineProperty,K=h((t,e)=>H(t,"name",{value:e,configurable:!0}),"t");const E=K(t=>`#/components/examples/${t}`,"formatExampleReference");var X=Object.defineProperty,j=h((t,e)=>X(t,"name",{value:e,configurable:!0}),"i$1");const b=j((t,e)=>e?{items:{$ref:T(t)},type:"array"}:{$ref:T(t)},"generateContentForSchema"),Y=j((t,e)=>t===u.RouteType.CREATE?{content:{content:{"application/json":{example:E(e),schema:b(e)}},description:`${e} created`},statusCode:201}:t===u.RouteType.DELETE?{content:{content:{"application/json":{example:E(e),schema:b(e)}},description:`${e} item deleted`},statusCode:200}:t===u.RouteType.READ_ALL?{content:{content:{"application/json":{examples:{Default:{$ref:E(`${e}s`)},Pagination:{$ref:E(`${e}Page`)}},schema:{oneOf:[b(e,!0),b(`${e}Page`,!1)]}}},description:`${e} list retrieved`},statusCode:200}:t===u.RouteType.READ_ONE?{content:{content:{"application/json":{example:E(e),schema:b(e)}},description:`${e} item retrieved`},statusCode:200}:{content:{content:{"application/json":{example:E(e),schema:b(e)}},description:`${e} item updated`},statusCode:200},"generateSwaggerResponse"),x=j((t,e)=>({content:{"application/json":{schema:{$ref:T(`${t}${e}`)}}}}),"generateRequestBody"),Z=j(t=>{switch(t){case u.RouteType.CREATE:return"post";case u.RouteType.DELETE:return"delete";case u.RouteType.READ_ALL:case u.RouteType.READ_ONE:return"get";case u.RouteType.UPDATE:return"put";default:throw new TypeError(`Method for route type ${t} was not found.`)}},"getRouteTypeMethod"),M=j(({hasId:t,modelName:e,modelsConfig:s,routeTypes:a,tag:r})=>{const n={};return a.forEach(o=>{const i=s?.[e]?.routeTypes?.[o]?.response.name??s?.[e]?.type?.name??e,p=Z(o),c=Y(o,i);n[p]={parameters:G(o).map(l=>({...l,in:"query"})),responses:{[c.statusCode]:c.content,...s?.[e]?.routeTypes?.[o]?.responses},summary:s?.[e]?.routeTypes?.[o]?.summary,tags:[r]},t&&n[p].parameters.push({description:`ID of the ${e}`,in:"path",name:"id",required:!0,schema:{type:"string"}}),o===u.RouteType.UPDATE?n[p].requestBody=x("Update",i):o===u.RouteType.CREATE&&(n[p].requestBody=x("Create",i))}),n},"generateSwaggerPathObject"),ee=j(({models:t,modelsConfig:e,routes:s,routesMap:a})=>Object.keys(s).reduce((r,n)=>{const o=s[n],i=t?.[n]?.name??a?.[n]??n,p=e?.[n]?.tag.name??n;if(o.includes(u.RouteType.CREATE)||o.includes(u.RouteType.READ_ALL)){const c=`/${i}`,l=[u.RouteType.READ_ALL,u.RouteType.CREATE].filter(m=>o.includes(m));r[c]=M({modelName:n,modelsConfig:e,routeTypes:l,tag:p})}if(o.includes(u.RouteType.READ_ONE)||o.includes(u.RouteType.UPDATE)||o.includes(u.RouteType.DELETE)){const c=`/${i}/{id}`,l=[u.RouteType.READ_ONE,u.RouteType.UPDATE,u.RouteType.DELETE].filter(m=>o.includes(m));r[c]=M({hasId:!0,modelName:n,modelsConfig:e,routeTypes:l,tag:p})}return r},{}),"getSwaggerPaths");var te=Object.defineProperty,ae=h((t,e)=>te(t,"name",{value:e,configurable:!0}),"r");const re=ae((t,e)=>t.map(s=>e?.[s]?.tag?e[s].tag:{name:s}),"getSwaggerTags");var se=Object.defineProperty,$=h((t,e)=>se(t,"name",{value:e,configurable:!0}),"i");const ne=$((t,e)=>{if(typeof t.example=="string"){const s=t.example.replace("#/components/examples/","");e[s]?.value!==void 0&&(t.example=e[s].value)}},"applyExampleToContent"),oe=$((t,e)=>(Object.values(t).forEach(s=>{Object.values(s).forEach(a=>{typeof a.responses=="object"&&Object.values(a.responses).forEach(r=>{typeof r.content=="object"&&Object.values(r.content).forEach(n=>{ne(n,e)})})})}),t),"overwritePathsExampleWithModel"),ie=$(async({crud:t={models:{}},defaultExposeStrategy:e="all",models:s,prismaClient:a,swagger:r={allowedMediaTypes:{"application/json":!0},models:{}}})=>{let n,o;if(a._dmmf!==void 0?(n=a._dmmf,o=n.mappingsMap):a._getDmmf!==void 0&&(n=await a._getDmmf(),o=n.mappingsMap),n===void 0||o===void 0)throw new TypeError("Couldn't get prisma client models");const i=new F(n),p=i.parseModels(),c=Object.keys(p),l=JSON.stringify({...p,...i.parseInputTypes(c),...i.getPaginationDataSchema(),...i.getPaginatedModelsSchemas(c)});s!==void 0&&s.forEach(S=>{if(!Object.keys(o).includes(S))throw new Error(`Model name ${S} is invalid.`)});const m=s??Object.keys(o),d=Q(m,t.models,e),y=re(m,r.models),g=ee({models:t.models,modelsConfig:r.models,routes:d,routesMap:N.a(o,m)}),O=JSON.parse(l.replaceAll("#/definitions","#/components/schemas")),P=i.getExampleModelsSchemas(c,O);return{examples:P,paths:oe(g,P),schemas:O,tags:y}},"modelsToOpenApi");module.exports=ie;
@@ -1 +0,0 @@
1
- var C=Object.defineProperty;var f=(t,e)=>C(t,"name",{value:e,configurable:!0});import{a as I}from"./models-to-route-names-UU1lZmbK.mjs";import{createPaginationMetaSchemaObject as N}from"@visulima/pagination";import{getJSONSchemaProperty as L,transformDMMF as B}from"@visulima/prisma-dmmf-transformer";import{E as A}from"./get-accessible-routes-xHYBQ_6q.mjs";import{RouteType as l}from"./RouteType-BQ2RxFPE.mjs";var k=Object.defineProperty,_=f((t,e)=>k(t,"name",{value:e,configurable:!0}),"t$1");const E=_(t=>`#/components/schemas/${t}`,"formatSchemaReference");var q=Object.defineProperty,v=f((t,e)=>q(t,"name",{value:e,configurable:!0}),"u$3");const w=v(t=>{switch(t){case"BigInt":case"Int":return"integer";case"Boolean":return"boolean";case"Bytes":case"DateTime":case"String":return"string";case"Decimal":case"Float":return"number";case"Json":return"object";case"Null":return"null";default:return""}},"getJSONSchemaScalar"),$="PaginationData",F=[{methodStart:"createOne",schemaNameStart:"Create"},{methodStart:"updateOne",schemaNameStart:"Update"}];let U=class{static{f(this,"R")}constructor(e){this.dmmf=e}dmmf;static{v(this,"PrismaJsonSchemaParser")}schemaInputTypes=new Map;formatInputTypeData(e){if(e.kind==="object"){const a=E(e.type.name);return e.isList?{items:{$ref:a},type:"array",xml:{name:e.type.name,wrapped:!0}}:{$ref:a}}const s=w(e.type);return e.isList?{items:{type:s},type:"array",xml:{name:e.type.name,wrapped:!0}}:{type:s}}getExampleModelsSchemas(e,s){const a=v(o=>{const i=o.replace("#/components/schemas/",""),p=s[i],c={};return Object.entries(p.properties??{}).forEach(([u,m])=>{const d=m.type;c[u]=d==="array"?[n(m.items)]:d}),c},"referenceToSchema"),r=v(o=>{const i={};return Object.entries(o).forEach(([p,c])=>{i[p]=c.$ref===void 0?c.type:a(c.$ref)}),i},"objectPropertiesToSchema"),n=v(o=>{const i={};return Object.entries(o).forEach(([p,c])=>{c.items.$ref!==void 0?i[p]=[a(c.items.$ref)]:c.type==="array"?i[p]=[n(c.items)]:c.type==="object"?i[p]=r(c.properties):i[p]=c.type}),i},"arrayItemsToSchema");return e.reduce((o,i)=>{const p={},c=s[i];Object.entries(c.properties).forEach(([d,y])=>{const g=y.type;g==="array"?p[d]=[a(y.items.$ref)]:g==="object"?p[d]=r(y.properties):p[d]=g});const u=this.getPaginationDataSchema()[$],m={};return Object.entries(u.properties).forEach(([d,y])=>{m[d]=y.type}),{...o,[`${i}Page`]:{value:{data:[p],meta:m}},[`${i}s`]:{value:[p]},[i]:{value:p}}},{})}getPaginatedModelsSchemas(e){return e.reduce((s,a)=>({...s,[`${a}Page`]:{properties:{data:{items:{$ref:E(a)},type:"array",xml:{name:"data",wrapped:!0}},meta:{$ref:E($)}},type:"object",xml:{name:`${a}Page`}}}),{})}getPaginationDataSchema(){return N($)}parseInputTypes(e){const s=e.reduce((a,r)=>(F.map(n=>({name:`${n.methodStart}${r}`,schemaName:`${n.schemaNameStart}${r}`})).forEach(({name:n,schemaName:o})=>{const i=this.dmmf.mutationType.fieldMap[n].args[0].inputTypes[0].type.fields,p=[],c=i.reduce((u,m)=>{if(m.inputTypes[0].kind==="scalar"){const d=L(this.dmmf.datamodel,{})({name:m.name,...m.inputTypes[0]}),{type:y}=d[1];y&&Array.isArray(y)?y.includes("null")&&(u[m.name]={...y,nullable:!0,type:y.filter(g=>g!=="null")},u[m.name].type.length===1&&(u[m.name]={...u[m.name],type:u[m.name].type[0]})):u[m.name]=d[1]}else{const d=this.parseObjectInputType(m.inputTypes[0]);u[m.name]={...d,nullable:m.isNullable}}return m.isRequired&&p.push(m.name),u},{});a[o]={properties:c,type:"object",xml:{name:o}},p.length>0&&(a[o].required=p)}),a),{});return this.schemaInputTypes.forEach((a,r)=>{s[r]={properties:a,type:"object",xml:{name:r}}}),s}parseModels(){const e=B(this.dmmf).definitions;return Object.keys(e).forEach(s=>{const{properties:a}=e[s];Object.keys(a).forEach(r=>{Array.isArray(a[r].type)&&a[r].type.includes("null")&&(a[r].type=a[r].type.filter(n=>n!=="null"),a[r].type.length===1&&(a[r].type=a[r].type[0]),a[r].nullable=!0)})}),e}parseObjectInputType(e){return e.kind==="object"?(this.schemaInputTypes.has(e.type.name)||(this.schemaInputTypes.set(e.type.name,{}),e.type.fields.forEach(s=>{let a={};if(s.inputTypes.length>1){let r=!1;const n=s.inputTypes.map(o=>{const i=this.formatInputTypeData(o);if(i.type==="null"){r=!0;return}return i}).filter(Boolean);n.length===1?a=n[0]:a.anyOf=n,r&&(a.nullable=!0)}else{const r=s.inputTypes[0];a=this.formatInputTypeData(r)}this.schemaInputTypes.set(e.type.name,{...this.schemaInputTypes.get(e.type.name),[s.name]:a}),s.inputTypes.forEach(r=>{r.kind==="object"&&this.parseObjectInputType(r)})})),{$ref:E(e.type.name)}):{type:w(e.type)}}};var J=Object.defineProperty,Q=f((t,e)=>J(t,"name",{value:e,configurable:!0}),"o$1");const V=Q((t,e,s="all")=>t.reduce((a,r)=>e?.[r]?{...a,[r]:A(e[r].only,e[r].exclude,s)}:{...a,[r]:A(void 0,void 0,s)},{}),"getModelsAccessibleRoutes");var W=Object.defineProperty,z=f((t,e)=>W(t,"name",{value:e,configurable:!0}),"i$2");const h={distinct:{description:"Fields to distinctively retrieve",name:"distinct",schema:{type:"string"}},include:{description:"Include relations, same as select",name:"include",schema:{type:"string"}},limit:{description:"Maximum number of elements to retrieve",name:"limit",schema:{minimum:0,type:"integer"}},orderBy:{description:'Field on which to order by a direction. See <a href="https://next-crud.js.org/query-params#orderBy">the docs</a>',name:"orderBy",schema:{type:"string"}},page:{description:"Page number. Use only for pagination.",name:"page",schema:{minimum:1,type:"integer"}},select:{description:"Fields to select. For nested fields, chain them separated with a dot, eg: user.posts",name:"select",schema:{type:"string"}},skip:{description:"Number of rows to skip",name:"skip",schema:{minimum:0,type:"integer"}},where:{description:'Fields to filter. See <a href="https://next-crud.js.org/query-params#where">the docs</a>',name:"where",schema:{type:"string"}}},M=[h.select,h.include].filter(Boolean),G=[...M,h.limit,h.skip,h.where,h.orderBy,h.page,h.distinct].filter(Boolean),H=z((t,e=[])=>t===l.READ_ALL?[...G,...e].filter(Boolean):[...M,...e].filter(Boolean),"getQueryParameters");var K=Object.defineProperty,X=f((t,e)=>K(t,"name",{value:e,configurable:!0}),"t");const b=X(t=>`#/components/examples/${t}`,"formatExampleReference");var Y=Object.defineProperty,j=f((t,e)=>Y(t,"name",{value:e,configurable:!0}),"i$1");const T=j((t,e)=>e?{items:{$ref:E(t)},type:"array"}:{$ref:E(t)},"generateContentForSchema"),Z=j((t,e)=>t===l.CREATE?{content:{content:{"application/json":{example:b(e),schema:T(e)}},description:`${e} created`},statusCode:201}:t===l.DELETE?{content:{content:{"application/json":{example:b(e),schema:T(e)}},description:`${e} item deleted`},statusCode:200}:t===l.READ_ALL?{content:{content:{"application/json":{examples:{Default:{$ref:b(`${e}s`)},Pagination:{$ref:b(`${e}Page`)}},schema:{oneOf:[T(e,!0),T(`${e}Page`,!1)]}}},description:`${e} list retrieved`},statusCode:200}:t===l.READ_ONE?{content:{content:{"application/json":{example:b(e),schema:T(e)}},description:`${e} item retrieved`},statusCode:200}:{content:{content:{"application/json":{example:b(e),schema:T(e)}},description:`${e} item updated`},statusCode:200},"generateSwaggerResponse"),x=j((t,e)=>({content:{"application/json":{schema:{$ref:E(`${t}${e}`)}}}}),"generateRequestBody"),ee=j(t=>{switch(t){case l.CREATE:return"post";case l.DELETE:return"delete";case l.READ_ALL:case l.READ_ONE:return"get";case l.UPDATE:return"put";default:throw new TypeError(`Method for route type ${t} was not found.`)}},"getRouteTypeMethod"),R=j(({hasId:t,modelName:e,modelsConfig:s,routeTypes:a,tag:r})=>{const n={};return a.forEach(o=>{const i=s?.[e]?.routeTypes?.[o]?.response.name??s?.[e]?.type?.name??e,p=ee(o),c=Z(o,i);n[p]={parameters:H(o).map(u=>({...u,in:"query"})),responses:{[c.statusCode]:c.content,...s?.[e]?.routeTypes?.[o]?.responses},summary:s?.[e]?.routeTypes?.[o]?.summary,tags:[r]},t&&n[p].parameters.push({description:`ID of the ${e}`,in:"path",name:"id",required:!0,schema:{type:"string"}}),o===l.UPDATE?n[p].requestBody=x("Update",i):o===l.CREATE&&(n[p].requestBody=x("Create",i))}),n},"generateSwaggerPathObject"),te=j(({models:t,modelsConfig:e,routes:s,routesMap:a})=>Object.keys(s).reduce((r,n)=>{const o=s[n],i=t?.[n]?.name??a?.[n]??n,p=e?.[n]?.tag.name??n;if(o.includes(l.CREATE)||o.includes(l.READ_ALL)){const c=`/${i}`,u=[l.READ_ALL,l.CREATE].filter(m=>o.includes(m));r[c]=R({modelName:n,modelsConfig:e,routeTypes:u,tag:p})}if(o.includes(l.READ_ONE)||o.includes(l.UPDATE)||o.includes(l.DELETE)){const c=`/${i}/{id}`,u=[l.READ_ONE,l.UPDATE,l.DELETE].filter(m=>o.includes(m));r[c]=R({hasId:!0,modelName:n,modelsConfig:e,routeTypes:u,tag:p})}return r},{}),"getSwaggerPaths");var ae=Object.defineProperty,re=f((t,e)=>ae(t,"name",{value:e,configurable:!0}),"r");const se=re((t,e)=>t.map(s=>e?.[s]?.tag?e[s].tag:{name:s}),"getSwaggerTags");var ne=Object.defineProperty,O=f((t,e)=>ne(t,"name",{value:e,configurable:!0}),"i");const oe=O((t,e)=>{if(typeof t.example=="string"){const s=t.example.replace("#/components/examples/","");e[s]?.value!==void 0&&(t.example=e[s].value)}},"applyExampleToContent"),ie=O((t,e)=>(Object.values(t).forEach(s=>{Object.values(s).forEach(a=>{typeof a.responses=="object"&&Object.values(a.responses).forEach(r=>{typeof r.content=="object"&&Object.values(r.content).forEach(n=>{oe(n,e)})})})}),t),"overwritePathsExampleWithModel"),fe=O(async({crud:t={models:{}},defaultExposeStrategy:e="all",models:s,prismaClient:a,swagger:r={allowedMediaTypes:{"application/json":!0},models:{}}})=>{let n,o;if(a._dmmf!==void 0?(n=a._dmmf,o=n.mappingsMap):a._getDmmf!==void 0&&(n=await a._getDmmf(),o=n.mappingsMap),n===void 0||o===void 0)throw new TypeError("Couldn't get prisma client models");const i=new U(n),p=i.parseModels(),c=Object.keys(p),u=JSON.stringify({...p,...i.parseInputTypes(c),...i.getPaginationDataSchema(),...i.getPaginatedModelsSchemas(c)});s!==void 0&&s.forEach(D=>{if(!Object.keys(o).includes(D))throw new Error(`Model name ${D} is invalid.`)});const m=s??Object.keys(o),d=V(m,t.models,e),y=se(m,r.models),g=te({models:t.models,modelsConfig:r.models,routes:d,routesMap:I(o,m)}),P=JSON.parse(u.replaceAll("#/definitions","#/components/schemas")),S=i.getExampleModelsSchemas(c,P);return{examples:S,paths:ie(g,S),schemas:P,tags:y}},"modelsToOpenApi");export{fe as default};
@@ -1 +0,0 @@
1
- var r=Object.defineProperty;var s=(a,e)=>r(a,"name",{value:e,configurable:!0});import{N as d}from"./base-crud-handler-BJJ5vmOh.mjs";var c=Object.defineProperty,o=s((a,e)=>c(a,"name",{value:e,configurable:!0}),"a");const i=o(async(a,e)=>await d(async(t,n)=>{t.status(n.status).send(n.data)},async t=>{t.end()},a,e),"handler");export{i as default};
@@ -1 +0,0 @@
1
- "use strict";var r=Object.defineProperty;var n=(a,e)=>r(a,"name",{value:e,configurable:!0});const c=require("./base-crud-handler-Cm23eHkD.cjs");var d=Object.defineProperty,u=n((a,e)=>d(a,"name",{value:e,configurable:!0}),"a");const i=u(async(a,e)=>await c.N(async(s,t)=>{s.status(t.status).send(t.data)},async s=>{s.end()},a,e),"handler");module.exports=i;