@visulima/crud 2.0.43 → 2.0.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,3 +1,1095 @@
1
- 'use strict';var chunk7CENERWT_js=require('./chunk-7CENERWT.js'),_=require('http-errors'),pagination=require('@visulima/pagination'),prismaDmmfTransformer=require('@visulima/prisma-dmmf-transformer');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ___default=/*#__PURE__*/_interopDefault(_);chunk7CENERWT_js.f();chunk7CENERWT_js.f();chunk7CENERWT_js.f();var N=(s,e)=>{let t={};return e.forEach(r=>{t[r]=s[r].plural;}),t},j=N;chunk7CENERWT_js.f();chunk7CENERWT_js.f();var q=new Set(["boolean","number","string"]),ee=s=>q.has(typeof s),M=ee;var te=s=>{let e={};if(Object.keys(s).forEach(t=>{let r=s[t];M(r)&&(e[t]=r);}),Object.keys(e).length!==1)throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");return e},D=te;chunk7CENERWT_js.f();var re={$asc:"asc",$desc:"desc"},se=s=>{let e={};return Object.keys(s).forEach(t=>{let r=s[t];e[t]=re[r];}),e},F=se;chunk7CENERWT_js.f();var k=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{t[r]=s[r]===true?true:{[e]:k(s[r],e)};}),t},S=k;chunk7CENERWT_js.f();var w=s=>s instanceof Object,ne={$cont:"contains",$ends:"endsWith",$eq:"equals",$gt:"gt",$gte:"gte",$in:"in",$lt:"lt",$lte:"lte",$neq:"not",$notin:"notIn",$starts:"startsWith"},ie=s=>/^\d{4}-[01]\d-[0-3]\d(?:T[0-2](?:\d:[0-5]){2}\d(?:\.\d+)?(?:Z|[+-][0-2]\d(?::?[0-5]\d)?)?)?$/g.test(s),ae=s=>ie(s)?new Date(s):typeof s=="string"&&s==="$isnull"?null:s,V=(s,e)=>{let t=s.split(".");return t.splice(-1,1),e.includes(t.join("."))},v=s=>{let e=Object.keys(s)[0],t=ne[e];if(t)return {[t]:s[e]}},B=(s,e,t,r)=>{let n=e.split(".").reverse(),a={};n.forEach((m,c)=>{c===0?W(s,m,a,r):a={[m]:{some:a}};});let i=n.reverse()[0],o=t[i];t[i]={some:{...o?.some,...a[i]?.some}};},A=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{let n=s[r];if(V(r,e))B(n,r,t,e);else if(M(n))t[r]=n;else if(w(n)){let a=v(n);a&&(t[r]=a);}}),t},W=(s,e,t,r)=>{if(M(s))t[e]=ae(s);else switch(e){case "$and":{w(s)&&(t.AND=A(s,r));break}case "$not":{w(s)&&(t.NOT=A(s,r));break}case "$or":{w(s)&&(t.OR=A(s,r));break}default:{t[e]=v(s);break}}},oe=(s,e)=>{let t={};return Object.keys(s).forEach(r=>{let n=s[r];V(r,e)?B(n,r,t,e):W(n,r,t,e);}),t},Q=oe;var C=class{models;ctorModels;dmmf;manyRelations;primaryKey;prismaClient;constructor({manyRelations:e={},models:t,primaryKey:r="id",prismaClient:n}){this.prismaClient=n,this.primaryKey=r,this.manyRelations=e,this.ctorModels=t;}async connect(){this.prismaClient.$connect();}async create(e,t,r){return await this.getPrismaDelegate(e).create({data:t,include:r.include,select:r.select})}async delete(e,t,r){return await this.getPrismaDelegate(e).delete({include:r.include,select:r.select,where:{[this.primaryKey]:t}})}async disconnect(){await this.prismaClient.$disconnect();}async getAll(e,t){return await this.getPrismaDelegate(e).findMany({cursor:t.cursor,distinct:t.distinct,include:t.include,orderBy:t.orderBy,select:t.select,skip:t.skip,take:t.take,where:t.where})}getModels(){return this.models??[]}async getOne(e,t,r){let n=this.getPrismaDelegate(e);return await(n.findUnique??n.findOne)({include:r.include,select:r.select,where:{[this.primaryKey]:t}})}async getPaginationData(e,t){let r=await this.getPrismaDelegate(e).count({distinct:t.distinct,where:t.where});return {page:Math.ceil((t.skip??0)/(t.take??0))+1,pageCount:Math.ceil(r/(t.take??0)),total:r}}handleError(e){throw console.error(e),e instanceof Error&&e.stack&&console.error(e.stack),e.constructor.name==="PrismaClientKnownRequestError"||e.constructor.name==="PrismaClientValidationError"?___default.default(400,"invalid request, check your server logs for more info"):___default.default(500,"an unknown error occured, check your server logs for more info")}async init(){let e=this.ctorModels,t=await this.getPrismaClientModels();e!==void 0&&e.forEach(r=>{if(!Object.keys(t).includes(r))throw new Error(`Model name ${r} is invalid.`)}),this.models=e??Object.keys(t);}async mapModelsToRouteNames(){return j(await this.getPrismaClientModels(),this.getModels())}parseQuery(e,t){let r={};return t.select&&(r.select=S(t.select,"select")),t.include&&(r.include=S(t.include,"include")),t.originalQuery?.where&&(r.where=Q(JSON.parse(t.originalQuery.where),this.manyRelations[e]??[])),t.orderBy&&(r.orderBy=F(t.orderBy)),t.limit!==void 0&&(r.take=t.limit),t.skip!==void 0&&(r.skip=t.skip),t.originalQuery?.cursor&&(r.cursor=D(JSON.parse(t.originalQuery.cursor))),t.distinct&&(r.distinct=t.distinct),r}async update(e,t,r,n){return await this.getPrismaDelegate(e).update({data:r,include:n.include,select:n.select,where:{[this.primaryKey]:t}})}get client(){return this.prismaClient}getPrismaClientModels=async()=>{if(this.prismaClient._dmmf!==void 0)return this.dmmf=this.prismaClient._dmmf,this.dmmf?.mappingsMap;if(this.prismaClient._getDmmf!==void 0)return this.dmmf=await this.prismaClient._getDmmf(),this.dmmf.mappingsMap;throw new Error("Couldn't get prisma client models")};getPrismaDelegate(e){return this.prismaClient[`${e.charAt(0).toLowerCase()}${e.slice(1)}`]}};chunk7CENERWT_js.f();chunk7CENERWT_js.f();chunk7CENERWT_js.f();var ce=s=>`#/components/schemas/${s}`,y=ce;var L=s=>{switch(s){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 ""}},T="PaginationData",le=[{methodStart:"createOne",schemaNameStart:"Create"},{methodStart:"updateOne",schemaNameStart:"Update"}],x=class{constructor(e){this.dmmf=e;}schemaInputTypes=new Map;formatInputTypeData(e){if(e.kind==="object"){let r=y(e.type.name);return e.isList?{items:{$ref:r},type:"array",xml:{name:e.type.name,wrapped:true}}:{$ref:r}}let t=L(e.type);return e.isList?{items:{type:t},type:"array",xml:{name:e.type.name,wrapped:true}}:{type:t}}getExampleModelsSchemas(e,t){let r=i=>{let o=i.replace("#/components/schemas/",""),m=t[o],c={};return Object.entries(m.properties??{}).forEach(([u,l])=>{let d=l.type;c[u]=d==="array"?[a(l.items)]:d;}),c},n=i=>{let o={};return Object.entries(i).forEach(([m,c])=>{o[m]=c.$ref===void 0?c.type:r(c.$ref);}),o},a=i=>{let o={};return Object.entries(i).forEach(([m,c])=>{c.items.$ref!==void 0?o[m]=[r(c.items.$ref)]:c.type==="array"?o[m]=[a(c.items)]:c.type==="object"?o[m]=n(c.properties):o[m]=c.type;}),o};return e.reduce((i,o)=>{let m={},c=t[o];Object.entries(c.properties).forEach(([d,f])=>{let h=f.type;h==="array"?m[d]=[r(f.items.$ref)]:h==="object"?m[d]=n(f.properties):m[d]=h;});let u=this.getPaginationDataSchema()[T],l={};return Object.entries(u.properties).forEach(([d,f])=>{l[d]=f.type;}),{...i,[`${o}Page`]:{value:{data:[m],meta:l}},[`${o}s`]:{value:[m]},[o]:{value:m}}},{})}getPaginatedModelsSchemas(e){return e.reduce((t,r)=>({...t,[`${r}Page`]:{properties:{data:{items:{$ref:y(r)},type:"array",xml:{name:"data",wrapped:true}},meta:{$ref:y(T)}},type:"object",xml:{name:`${r}Page`}}}),{})}getPaginationDataSchema(){return pagination.createPaginationMetaSchemaObject(T)}parseInputTypes(e){let t=e.reduce((r,n)=>(le.map(i=>({name:`${i.methodStart}${n}`,schemaName:`${i.schemaNameStart}${n}`})).forEach(({name:i,schemaName:o})=>{let m=this.dmmf.mutationType.fieldMap[i].args[0].inputTypes[0].type.fields,c=[],u=m.reduce((l,d)=>{if(d.inputTypes[0].kind==="scalar"){let f=prismaDmmfTransformer.getJSONSchemaProperty(this.dmmf.datamodel,{})({name:d.name,...d.inputTypes[0]}),{type:h}=f[1];h&&Array.isArray(h)?h.includes("null")&&(l[d.name]={...h,nullable:true,type:h.filter(R=>R!=="null")},l[d.name].type.length===1&&(l[d.name]={...l[d.name],type:l[d.name].type[0]})):l[d.name]=f[1];}else {let f=this.parseObjectInputType(d.inputTypes[0]);l[d.name]={...f,nullable:d.isNullable};}return d.isRequired&&c.push(d.name),l},{});r[o]={properties:u,type:"object",xml:{name:o}},c.length>0&&(r[o].required=c);}),r),{});return this.schemaInputTypes.forEach((r,n)=>{t[n]={properties:r,type:"object",xml:{name:n}};}),t}parseModels(){let e=prismaDmmfTransformer.transformDMMF(this.dmmf).definitions;return Object.keys(e).forEach(t=>{let{properties:r}=e[t];Object.keys(r).forEach(n=>{Array.isArray(r[n].type)&&r[n].type.includes("null")&&(r[n].type=r[n].type.filter(a=>a!=="null"),r[n].type.length===1&&(r[n].type=r[n].type[0]),r[n].nullable=true);});}),e}parseObjectInputType(e){return e.kind==="object"?(this.schemaInputTypes.has(e.type.name)||(this.schemaInputTypes.set(e.type.name,{}),e.type.fields.forEach(t=>{let r={};if(t.inputTypes.length>1){let n=false,a=t.inputTypes.map(i=>{let o=this.formatInputTypeData(i);if(o.type==="null"){n=true;return}return o}).filter(Boolean);a.length===1?r=a[0]:r.anyOf=a,n&&(r.nullable=true);}else {let n=t.inputTypes[0];r=this.formatInputTypeData(n);}this.schemaInputTypes.set(e.type.name,{...this.schemaInputTypes.get(e.type.name),[t.name]:r}),t.inputTypes.forEach(n=>{n.kind==="object"&&this.parseObjectInputType(n);});})),{$ref:y(e.type.name)}):{type:L(e.type)}}},U=x;chunk7CENERWT_js.f();var ge=(s,e,t="all")=>s.reduce((r,n)=>e?.[n]?{...r,[n]:chunk7CENERWT_js.h(e[n].only,e[n].exclude,t)}:{...r,[n]:chunk7CENERWT_js.h(void 0,void 0,t)},{}),H=ge;chunk7CENERWT_js.f();chunk7CENERWT_js.f();var P={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"}}},J=[P.select,P.include],ue=[...J,P.limit,P.skip,P.where,P.orderBy,P.page,P.distinct],G=(s,e=[])=>s==="READ_ALL"?[...ue,...e].filter(Boolean):[...J,...e].filter(Boolean);chunk7CENERWT_js.f();var fe=s=>`#/components/examples/${s}`,O=fe;var b=(s,e)=>e?{items:{$ref:y(s)},type:"array"}:{$ref:y(s)},he=(s,e)=>{if(s==="CREATE")return {content:{content:{"application/json":{example:O(e),schema:b(e)}},description:`${e} created`},statusCode:201};if(s==="DELETE")return {content:{content:{"application/json":{example:O(e),schema:b(e)}},description:`${e} item deleted`},statusCode:200};if(s==="READ_ALL")return {content:{content:{"application/json":{examples:{Default:{$ref:O(`${e}s`)},Pagination:{$ref:O(`${e}Page`)}},schema:{oneOf:[b(e,true),b(`${e}Page`,false)]}}},description:`${e} list retrieved`},statusCode:200};if(s==="READ_ONE")return {content:{content:{"application/json":{example:O(e),schema:b(e)}},description:`${e} item retrieved`},statusCode:200};if(s==="UPDATE")return {content:{content:{"application/json":{example:O(e),schema:b(e)}},description:`${e} item updated`},statusCode:200}},K=(s,e)=>({content:{"application/json":{schema:{$ref:y(`${s}${e}`)}}}}),ye=s=>{switch(s){case "CREATE":return "post";case "DELETE":return "delete";case "READ_ALL":case "READ_ONE":return "get";case "UPDATE":return "put";default:throw new TypeError(`Method for route type ${s} was not found.`)}},Z=({hasId:s,modelName:e,modelsConfig:t,routeTypes:r,tag:n})=>{let a={};return r.forEach(i=>{if(r.includes(i)){let o=t?.[e]?.routeTypes?.[i]?.response.name??t?.[e]?.type?.name??e,m=ye(i),c=he(i,o);if(c===void 0)throw new TypeError(`Route type ${i}; response config was not found.`);a[m]={parameters:G(i).map(u=>({...u,in:"query"})),responses:{[c.statusCode]:c.content,...t?.[e]?.routeTypes?.[i]?.responses},summary:t?.[e]?.routeTypes?.[i]?.summary,tags:[n]},s&&a[m].parameters.push({description:`ID of the ${e}`,in:"path",name:"id",required:true,schema:{type:"string"}}),i==="UPDATE"?a[m].requestBody=K("Update",o):i==="CREATE"&&(a[m].requestBody=K("Create",o));}}),a},Pe=({models:s,modelsConfig:e,routes:t,routesMap:r})=>Object.keys(t).reduce((n,a)=>{let i=t[a],o=s?.[a]?.name?s[a].name:r?.[a]??a,m=e?.[a]?.tag.name??a;if(i.includes("CREATE")||i.includes("READ_ALL")){let c=`/${o}`,u=["READ_ALL","CREATE"].filter(l=>i.includes(l));n[c]=Z({modelName:a,modelsConfig:e,routeTypes:u,tag:m});}if(i.includes("READ_ONE")||i.includes("UPDATE")||i.includes("DELETE")){let c=`/${o}/{id}`,u=["READ_ONE","UPDATE","DELETE"].filter(l=>i.includes(l));n[c]=Z({hasId:true,modelName:a,modelsConfig:e,routeTypes:u,tag:m});}return n},{}),z=Pe;chunk7CENERWT_js.f();var Oe=(s,e)=>s.map(t=>e?.[t]?.tag?e[t].tag:{name:t}),X=Oe;var be=(s,e)=>(Object.values(s).forEach(t=>{Object.values(t).forEach(r=>{typeof r.responses=="object"&&Object.values(r.responses).forEach(n=>{typeof n.content=="object"&&Object.values(n.content).forEach(a=>{if(typeof a.example=="string"){let i=a.example.replace("#/components/examples/","");e[i]?.value!==void 0&&(a.example=e[i].value);}});});});}),s),Me=async({crud:s={models:{}},defaultExposeStrategy:e="all",models:t,prismaClient:r,swagger:n={allowedMediaTypes:{"application/json":true},models:{}}})=>{let a,i;if(r._dmmf!==void 0?(a=r._dmmf,i=a?.mappingsMap):r._getDmmf!==void 0&&(a=await r._getDmmf(),i=a.mappingsMap),a===void 0)throw new TypeError("Couldn't get prisma client models");let o=new U(a),m=o.parseModels(),c=Object.keys(m),u=JSON.stringify({...m,...o.parseInputTypes(c),...o.getPaginationDataSchema(),...o.getPaginatedModelsSchemas(c)});t!==void 0&&t.forEach(I=>{if(!Object.keys(i).includes(I))throw new Error(`Model name ${I} is invalid.`)});let l=t??Object.keys(i),d=H(l,s.models,e),f=X(l,n.models),h=z({models:s.models,modelsConfig:n.models,routes:d,routesMap:j(i,l)}),R=JSON.parse(u.replaceAll("#/definitions","#/components/schemas")),$=o.getExampleModelsSchemas(c,R);return {examples:$,paths:be(h,$),schemas:R,tags:f}},Re=Me;
2
- Object.defineProperty(exports,"RouteType",{enumerable:true,get:function(){return chunk7CENERWT_js.g}});exports.PrismaAdapter=C;exports.modelsToOpenApi=Re;//# sourceMappingURL=index.js.map
1
+ 'use strict';
2
+
3
+ var chunk5I2B5KQG_js = require('./chunk-5I2B5KQG.js');
4
+ var createHttpError = require('http-errors');
5
+ var pagination = require('@visulima/pagination');
6
+ var prismaDmmfTransformer = require('@visulima/prisma-dmmf-transformer');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var createHttpError__default = /*#__PURE__*/_interopDefault(createHttpError);
11
+
12
+ // src/index.ts
13
+ chunk5I2B5KQG_js.init_cjs_shims();
14
+
15
+ // src/adapter/prisma/index.ts
16
+ chunk5I2B5KQG_js.init_cjs_shims();
17
+
18
+ // src/adapter/prisma/utils/models-to-route-names.ts
19
+ chunk5I2B5KQG_js.init_cjs_shims();
20
+ var modelsToRouteNames = (mappingsMap, models) => {
21
+ const routesMap = {};
22
+ models.forEach((model) => {
23
+ routesMap[model] = mappingsMap[model].plural;
24
+ });
25
+ return routesMap;
26
+ };
27
+ var models_to_route_names_default = modelsToRouteNames;
28
+
29
+ // src/adapter/prisma/utils/parse-cursor.ts
30
+ chunk5I2B5KQG_js.init_cjs_shims();
31
+
32
+ // src/utils/is-primitive.ts
33
+ chunk5I2B5KQG_js.init_cjs_shims();
34
+ var primitiveTypes = /* @__PURE__ */ new Set(["boolean", "number", "string"]);
35
+ var isPrimitive = (value) => primitiveTypes.has(typeof value);
36
+ var is_primitive_default = isPrimitive;
37
+
38
+ // src/adapter/prisma/utils/parse-cursor.ts
39
+ var parsePrismaCursor = (cursor) => {
40
+ const parsed = {};
41
+ Object.keys(cursor).forEach((key) => {
42
+ const value = cursor[key];
43
+ if (is_primitive_default(value)) {
44
+ parsed[key] = value;
45
+ }
46
+ });
47
+ if (Object.keys(parsed).length !== 1) {
48
+ throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");
49
+ }
50
+ return parsed;
51
+ };
52
+ var parse_cursor_default = parsePrismaCursor;
53
+
54
+ // src/adapter/prisma/utils/parse-order-by.ts
55
+ chunk5I2B5KQG_js.init_cjs_shims();
56
+ var operatorsAssociation = {
57
+ $asc: "asc",
58
+ $desc: "desc"
59
+ };
60
+ var parsePrismaOrderBy = (orderBy) => {
61
+ const parsed = {};
62
+ Object.keys(orderBy).forEach((key) => {
63
+ const value = orderBy[key];
64
+ parsed[key] = operatorsAssociation[value];
65
+ });
66
+ return parsed;
67
+ };
68
+ var parse_order_by_default = parsePrismaOrderBy;
69
+
70
+ // src/adapter/prisma/utils/parse-recursive.ts
71
+ chunk5I2B5KQG_js.init_cjs_shims();
72
+ var parsePrismaRecursiveField = (select, fieldName) => {
73
+ const parsed = {};
74
+ Object.keys(select).forEach((field) => {
75
+ parsed[field] = select[field] === true ? true : {
76
+ [fieldName]: parsePrismaRecursiveField(select[field], fieldName)
77
+ };
78
+ });
79
+ return parsed;
80
+ };
81
+ var parse_recursive_default = parsePrismaRecursiveField;
82
+
83
+ // src/adapter/prisma/utils/parse-where.ts
84
+ chunk5I2B5KQG_js.init_cjs_shims();
85
+ var isObject = (a) => a instanceof Object;
86
+ var operatorsAssociation2 = {
87
+ $cont: "contains",
88
+ $ends: "endsWith",
89
+ $eq: "equals",
90
+ $gt: "gt",
91
+ $gte: "gte",
92
+ $in: "in",
93
+ $lt: "lt",
94
+ $lte: "lte",
95
+ $neq: "not",
96
+ $notin: "notIn",
97
+ $starts: "startsWith"
98
+ };
99
+ var isDateString = (value) => /^\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(value);
100
+ var getSearchValue = (originalValue) => {
101
+ if (isDateString(originalValue)) {
102
+ return new Date(originalValue);
103
+ }
104
+ if (typeof originalValue === "string" && originalValue === "$isnull") {
105
+ return null;
106
+ }
107
+ return originalValue;
108
+ };
109
+ var isRelation = (key, manyRelations) => {
110
+ const splitKey = key.split(".");
111
+ splitKey.splice(-1, 1);
112
+ return manyRelations.includes(splitKey.join("."));
113
+ };
114
+ var parseSimpleField = (value) => {
115
+ const operator = Object.keys(value)[0];
116
+ const prismaOperator = operatorsAssociation2[operator];
117
+ if (prismaOperator) {
118
+ return {
119
+ [prismaOperator]: value[operator]
120
+ };
121
+ }
122
+ return void 0;
123
+ };
124
+ var parseRelation = (value, key, parsed, manyRelations) => {
125
+ const fields = key.split(".").reverse();
126
+ let formatFields = {};
127
+ fields.forEach((field, index) => {
128
+ if (index === 0) {
129
+ basicParse(value, field, formatFields, manyRelations);
130
+ } else {
131
+ formatFields = {
132
+ [field]: {
133
+ some: formatFields
134
+ }
135
+ };
136
+ }
137
+ });
138
+ const initialFieldKey = fields.reverse()[0];
139
+ const oldParsed = parsed[initialFieldKey];
140
+ parsed[initialFieldKey] = {
141
+ some: {
142
+ ...oldParsed?.some,
143
+ ...formatFields[initialFieldKey]?.some
144
+ }
145
+ };
146
+ };
147
+ var parseObjectCombination = (object, manyRelations) => {
148
+ const parsed = {};
149
+ Object.keys(object).forEach((key) => {
150
+ const value = object[key];
151
+ if (isRelation(key, manyRelations)) {
152
+ parseRelation(value, key, parsed, manyRelations);
153
+ } else if (is_primitive_default(value)) {
154
+ parsed[key] = value;
155
+ } else if (isObject(value)) {
156
+ const fieldResult = parseSimpleField(value);
157
+ if (fieldResult) {
158
+ parsed[key] = fieldResult;
159
+ }
160
+ }
161
+ });
162
+ return parsed;
163
+ };
164
+ var basicParse = (value, key, parsed, manyRelations) => {
165
+ if (is_primitive_default(value)) {
166
+ parsed[key] = getSearchValue(value);
167
+ } else {
168
+ switch (key) {
169
+ case "$and": {
170
+ if (isObject(value)) {
171
+ parsed.AND = parseObjectCombination(value, manyRelations);
172
+ }
173
+ break;
174
+ }
175
+ case "$not": {
176
+ if (isObject(value)) {
177
+ parsed.NOT = parseObjectCombination(value, manyRelations);
178
+ }
179
+ break;
180
+ }
181
+ case "$or": {
182
+ if (isObject(value)) {
183
+ parsed.OR = parseObjectCombination(value, manyRelations);
184
+ }
185
+ break;
186
+ }
187
+ default: {
188
+ parsed[key] = parseSimpleField(value);
189
+ break;
190
+ }
191
+ }
192
+ }
193
+ };
194
+ var parsePrismaWhere = (where, manyRelations) => {
195
+ const parsed = {};
196
+ Object.keys(where).forEach((key) => {
197
+ const value = where[key];
198
+ if (isRelation(key, manyRelations)) {
199
+ parseRelation(value, key, parsed, manyRelations);
200
+ } else {
201
+ basicParse(value, key, parsed, manyRelations);
202
+ }
203
+ });
204
+ return parsed;
205
+ };
206
+ var parse_where_default = parsePrismaWhere;
207
+
208
+ // src/adapter/prisma/index.ts
209
+ var PrismaAdapter = class {
210
+ models;
211
+ ctorModels;
212
+ dmmf;
213
+ manyRelations;
214
+ primaryKey;
215
+ prismaClient;
216
+ constructor({ manyRelations = {}, models, primaryKey = "id", prismaClient }) {
217
+ this.prismaClient = prismaClient;
218
+ this.primaryKey = primaryKey;
219
+ this.manyRelations = manyRelations;
220
+ this.ctorModels = models;
221
+ }
222
+ async connect() {
223
+ this.prismaClient.$connect();
224
+ }
225
+ async create(resourceName, data, query) {
226
+ return await this.getPrismaDelegate(resourceName).create({
227
+ data,
228
+ include: query.include,
229
+ select: query.select
230
+ });
231
+ }
232
+ async delete(resourceName, resourceId, query) {
233
+ return await this.getPrismaDelegate(resourceName).delete({
234
+ include: query.include,
235
+ select: query.select,
236
+ where: {
237
+ [this.primaryKey]: resourceId
238
+ }
239
+ });
240
+ }
241
+ async disconnect() {
242
+ await this.prismaClient.$disconnect();
243
+ }
244
+ async getAll(resourceName, query) {
245
+ return await this.getPrismaDelegate(resourceName).findMany({
246
+ cursor: query.cursor,
247
+ distinct: query.distinct,
248
+ include: query.include,
249
+ orderBy: query.orderBy,
250
+ select: query.select,
251
+ skip: query.skip,
252
+ take: query.take,
253
+ where: query.where
254
+ });
255
+ }
256
+ getModels() {
257
+ return this.models ?? [];
258
+ }
259
+ async getOne(resourceName, resourceId, query) {
260
+ const delegate = this.getPrismaDelegate(resourceName);
261
+ const findFunction = delegate.findUnique ?? delegate.findOne;
262
+ return await findFunction({
263
+ include: query.include,
264
+ select: query.select,
265
+ where: {
266
+ [this.primaryKey]: resourceId
267
+ }
268
+ });
269
+ }
270
+ async getPaginationData(resourceName, query) {
271
+ const total = await this.getPrismaDelegate(resourceName).count({
272
+ distinct: query.distinct,
273
+ where: query.where
274
+ });
275
+ return {
276
+ page: Math.ceil((query.skip ?? 0) / (query.take ?? 0)) + 1,
277
+ pageCount: Math.ceil(total / (query.take ?? 0)),
278
+ total
279
+ };
280
+ }
281
+ // eslint-disable-next-line class-methods-use-this
282
+ handleError(error) {
283
+ console.error(error);
284
+ if (error instanceof Error && error.stack) {
285
+ console.error(error.stack);
286
+ }
287
+ throw error.constructor.name === "PrismaClientKnownRequestError" || error.constructor.name === "PrismaClientValidationError" ? createHttpError__default.default(400, "invalid request, check your server logs for more info") : createHttpError__default.default(500, "an unknown error occured, check your server logs for more info");
288
+ }
289
+ async init() {
290
+ const models = this.ctorModels;
291
+ const prismaDmmfModels = await this.getPrismaClientModels();
292
+ if (models !== void 0) {
293
+ models.forEach((model) => {
294
+ if (!Object.keys(prismaDmmfModels).includes(model)) {
295
+ throw new Error(`Model name ${model} is invalid.`);
296
+ }
297
+ });
298
+ }
299
+ this.models = models ?? Object.keys(prismaDmmfModels);
300
+ }
301
+ async mapModelsToRouteNames() {
302
+ return models_to_route_names_default(await this.getPrismaClientModels(), this.getModels());
303
+ }
304
+ parseQuery(resourceName, query) {
305
+ const parsed = {};
306
+ if (query.select) {
307
+ parsed.select = parse_recursive_default(query.select, "select");
308
+ }
309
+ if (query.include) {
310
+ parsed.include = parse_recursive_default(query.include, "include");
311
+ }
312
+ if (query.originalQuery?.where) {
313
+ parsed.where = parse_where_default(JSON.parse(query.originalQuery.where), this.manyRelations[resourceName] ?? []);
314
+ }
315
+ if (query.orderBy) {
316
+ parsed.orderBy = parse_order_by_default(query.orderBy);
317
+ }
318
+ if (query.limit !== void 0) {
319
+ parsed.take = query.limit;
320
+ }
321
+ if (query.skip !== void 0) {
322
+ parsed.skip = query.skip;
323
+ }
324
+ if (query.originalQuery?.cursor) {
325
+ parsed.cursor = parse_cursor_default(JSON.parse(query.originalQuery.cursor));
326
+ }
327
+ if (query.distinct) {
328
+ parsed.distinct = query.distinct;
329
+ }
330
+ return parsed;
331
+ }
332
+ async update(resourceName, resourceId, data, query) {
333
+ return await this.getPrismaDelegate(resourceName).update({
334
+ data,
335
+ include: query.include,
336
+ select: query.select,
337
+ where: {
338
+ [this.primaryKey]: resourceId
339
+ }
340
+ });
341
+ }
342
+ get client() {
343
+ return this.prismaClient;
344
+ }
345
+ getPrismaClientModels = async () => {
346
+ if (this.prismaClient._dmmf !== void 0) {
347
+ this.dmmf = this.prismaClient._dmmf;
348
+ return this.dmmf?.mappingsMap;
349
+ }
350
+ if (this.prismaClient._getDmmf !== void 0) {
351
+ this.dmmf = await this.prismaClient._getDmmf();
352
+ return this.dmmf.mappingsMap;
353
+ }
354
+ throw new Error("Couldn't get prisma client models");
355
+ };
356
+ getPrismaDelegate(resourceName) {
357
+ return this.prismaClient[`${resourceName.charAt(0).toLowerCase()}${resourceName.slice(1)}`];
358
+ }
359
+ };
360
+
361
+ // src/swagger/adapter/prisma/index.ts
362
+ chunk5I2B5KQG_js.init_cjs_shims();
363
+
364
+ // src/swagger/json-schema-parser.ts
365
+ chunk5I2B5KQG_js.init_cjs_shims();
366
+
367
+ // src/swagger/utils/format-schema-ref.ts
368
+ chunk5I2B5KQG_js.init_cjs_shims();
369
+ var formatSchemaReference = (schemaName) => `#/components/schemas/${schemaName}`;
370
+ var format_schema_ref_default = formatSchemaReference;
371
+
372
+ // src/swagger/json-schema-parser.ts
373
+ var getJSONSchemaScalar = (fieldType) => {
374
+ switch (fieldType) {
375
+ case "BigInt":
376
+ case "Int": {
377
+ return "integer";
378
+ }
379
+ case "Boolean": {
380
+ return "boolean";
381
+ }
382
+ case "Bytes":
383
+ case "DateTime":
384
+ case "String": {
385
+ return "string";
386
+ }
387
+ case "Decimal":
388
+ case "Float": {
389
+ return "number";
390
+ }
391
+ case "Json": {
392
+ return "object";
393
+ }
394
+ case "Null": {
395
+ return "null";
396
+ }
397
+ default: {
398
+ return "";
399
+ }
400
+ }
401
+ };
402
+ var PAGINATION_SCHEMA_NAME = "PaginationData";
403
+ var methodsNames = [
404
+ { methodStart: "createOne", schemaNameStart: "Create" },
405
+ { methodStart: "updateOne", schemaNameStart: "Update" }
406
+ ];
407
+ var PrismaJsonSchemaParser = class {
408
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
409
+ constructor(dmmf) {
410
+ this.dmmf = dmmf;
411
+ }
412
+ schemaInputTypes = /* @__PURE__ */ new Map();
413
+ // eslint-disable-next-line class-methods-use-this,@typescript-eslint/explicit-module-boundary-types
414
+ formatInputTypeData(inputType) {
415
+ if (inputType.kind === "object") {
416
+ const reference = format_schema_ref_default(inputType.type.name);
417
+ if (inputType.isList) {
418
+ return {
419
+ items: {
420
+ $ref: reference
421
+ },
422
+ type: "array",
423
+ xml: {
424
+ name: inputType.type.name,
425
+ wrapped: true
426
+ }
427
+ };
428
+ }
429
+ return { $ref: reference };
430
+ }
431
+ const type = getJSONSchemaScalar(inputType.type);
432
+ if (inputType.isList) {
433
+ return {
434
+ items: {
435
+ type
436
+ },
437
+ type: "array",
438
+ xml: {
439
+ name: inputType.type.name,
440
+ wrapped: true
441
+ }
442
+ };
443
+ }
444
+ return { type };
445
+ }
446
+ getExampleModelsSchemas(modelNames, schemas) {
447
+ const referenceToSchema = (reference) => {
448
+ const name = reference.replace("#/components/schemas/", "");
449
+ const model = schemas[name];
450
+ const values = {};
451
+ Object.entries(model.properties ?? {}).forEach(([key, v]) => {
452
+ const type = v.type;
453
+ values[key] = type === "array" ? [arrayItemsToSchema(v.items)] : type;
454
+ });
455
+ return values;
456
+ };
457
+ const objectPropertiesToSchema = (objectProperties) => {
458
+ const values = {};
459
+ Object.entries(objectProperties).forEach(([key, value]) => {
460
+ values[key] = value.$ref === void 0 ? value.type : referenceToSchema(value.$ref);
461
+ });
462
+ return values;
463
+ };
464
+ const arrayItemsToSchema = (items) => {
465
+ const values = {};
466
+ Object.entries(items).forEach(([key, value]) => {
467
+ if (value.items.$ref !== void 0) {
468
+ values[key] = [referenceToSchema(value.items.$ref)];
469
+ } else if (value.type === "array") {
470
+ values[key] = [arrayItemsToSchema(value.items)];
471
+ } else if (value.type === "object") {
472
+ values[key] = objectPropertiesToSchema(value.properties);
473
+ } else {
474
+ values[key] = value.type;
475
+ }
476
+ });
477
+ return values;
478
+ };
479
+ return modelNames.reduce((accumulator, modelName) => {
480
+ const value = {};
481
+ const model = schemas[modelName];
482
+ Object.entries(model.properties).forEach(([key, v]) => {
483
+ const type = v.type;
484
+ if (type === "array") {
485
+ value[key] = [referenceToSchema(v.items.$ref)];
486
+ } else if (type === "object") {
487
+ value[key] = objectPropertiesToSchema(v.properties);
488
+ } else {
489
+ value[key] = type;
490
+ }
491
+ });
492
+ const pagination = this.getPaginationDataSchema()[PAGINATION_SCHEMA_NAME];
493
+ const meta = {};
494
+ Object.entries(pagination.properties).forEach(([key, v]) => {
495
+ meta[key] = v.type;
496
+ });
497
+ return {
498
+ ...accumulator,
499
+ [`${modelName}Page`]: {
500
+ value: {
501
+ data: [value],
502
+ meta
503
+ }
504
+ },
505
+ [`${modelName}s`]: {
506
+ value: [value]
507
+ },
508
+ [modelName]: {
509
+ value
510
+ }
511
+ };
512
+ }, {});
513
+ }
514
+ // eslint-disable-next-line class-methods-use-this
515
+ getPaginatedModelsSchemas(modelNames) {
516
+ return modelNames.reduce((accumulator, modelName) => {
517
+ return {
518
+ ...accumulator,
519
+ [`${modelName}Page`]: {
520
+ properties: {
521
+ data: {
522
+ items: {
523
+ $ref: format_schema_ref_default(modelName)
524
+ },
525
+ type: "array",
526
+ xml: {
527
+ name: "data",
528
+ wrapped: true
529
+ }
530
+ },
531
+ meta: {
532
+ $ref: format_schema_ref_default(PAGINATION_SCHEMA_NAME)
533
+ }
534
+ },
535
+ type: "object",
536
+ xml: {
537
+ name: `${modelName}Page`
538
+ }
539
+ }
540
+ };
541
+ }, {});
542
+ }
543
+ // eslint-disable-next-line class-methods-use-this
544
+ getPaginationDataSchema() {
545
+ return pagination.createPaginationMetaSchemaObject(PAGINATION_SCHEMA_NAME);
546
+ }
547
+ parseInputTypes(models) {
548
+ const definitions = models.reduce((accumulator, modelName) => {
549
+ const methods = methodsNames.map((method) => {
550
+ return {
551
+ name: `${method.methodStart}${modelName}`,
552
+ schemaName: `${method.schemaNameStart}${modelName}`
553
+ };
554
+ });
555
+ methods.forEach(({ name: method, schemaName }) => {
556
+ const dataFields = this.dmmf.mutationType.fieldMap[method].args[0].inputTypes[0].type.fields;
557
+ const requiredProperties = [];
558
+ const properties = dataFields.reduce((propertiesAccumulator, field) => {
559
+ if (field.inputTypes[0].kind === "scalar") {
560
+ const schema = prismaDmmfTransformer.getJSONSchemaProperty(
561
+ this.dmmf.datamodel,
562
+ {}
563
+ )({
564
+ name: field.name,
565
+ ...field.inputTypes[0]
566
+ });
567
+ const { type: schemaType } = schema[1];
568
+ if (schemaType && Array.isArray(schemaType)) {
569
+ if (schemaType.includes("null")) {
570
+ propertiesAccumulator[field.name] = {
571
+ ...schemaType,
572
+ nullable: true,
573
+ type: schemaType.filter((type) => type !== "null")
574
+ };
575
+ if (propertiesAccumulator[field.name].type.length === 1) {
576
+ propertiesAccumulator[field.name] = {
577
+ ...propertiesAccumulator[field.name],
578
+ type: propertiesAccumulator[field.name].type[0]
579
+ };
580
+ }
581
+ }
582
+ } else {
583
+ propertiesAccumulator[field.name] = schema[1];
584
+ }
585
+ } else {
586
+ const typeName = this.parseObjectInputType(field.inputTypes[0]);
587
+ propertiesAccumulator[field.name] = {
588
+ ...typeName,
589
+ nullable: field.isNullable
590
+ };
591
+ }
592
+ if (field.isRequired) {
593
+ requiredProperties.push(field.name);
594
+ }
595
+ return propertiesAccumulator;
596
+ }, {});
597
+ accumulator[schemaName] = {
598
+ properties,
599
+ type: "object",
600
+ xml: {
601
+ name: schemaName
602
+ }
603
+ };
604
+ if (requiredProperties.length > 0) {
605
+ accumulator[schemaName].required = requiredProperties;
606
+ }
607
+ });
608
+ return accumulator;
609
+ }, {});
610
+ this.schemaInputTypes.forEach((value, key) => {
611
+ definitions[key] = {
612
+ properties: value,
613
+ type: "object",
614
+ xml: {
615
+ name: key
616
+ }
617
+ };
618
+ });
619
+ return definitions;
620
+ }
621
+ parseModels() {
622
+ const modelsDefinitions = prismaDmmfTransformer.transformDMMF(this.dmmf).definitions;
623
+ Object.keys(modelsDefinitions).forEach((definition) => {
624
+ const { properties } = modelsDefinitions[definition];
625
+ Object.keys(properties).forEach((property) => {
626
+ if (Array.isArray(properties[property].type) && properties[property].type.includes("null")) {
627
+ properties[property].type = properties[property].type.filter((type) => type !== "null");
628
+ if (properties[property].type.length === 1) {
629
+ properties[property].type = properties[property].type[0];
630
+ }
631
+ properties[property].nullable = true;
632
+ }
633
+ });
634
+ });
635
+ return modelsDefinitions;
636
+ }
637
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
638
+ parseObjectInputType(fieldType) {
639
+ if (fieldType.kind === "object") {
640
+ if (!this.schemaInputTypes.has(fieldType.type.name)) {
641
+ this.schemaInputTypes.set(fieldType.type.name, {});
642
+ fieldType.type.fields.forEach((field) => {
643
+ let fieldData = {};
644
+ if (field.inputTypes.length > 1) {
645
+ let nullable = false;
646
+ const anyOf = field.inputTypes.map((inputType) => {
647
+ const inputTypeData = this.formatInputTypeData(inputType);
648
+ if (inputTypeData.type === "null") {
649
+ nullable = true;
650
+ return;
651
+ }
652
+ return inputTypeData;
653
+ }).filter(Boolean);
654
+ if (anyOf.length === 1) {
655
+ fieldData = anyOf[0];
656
+ } else {
657
+ fieldData.anyOf = anyOf;
658
+ }
659
+ if (nullable) {
660
+ fieldData.nullable = true;
661
+ }
662
+ } else {
663
+ const inputType = field.inputTypes[0];
664
+ fieldData = this.formatInputTypeData(inputType);
665
+ }
666
+ this.schemaInputTypes.set(fieldType.type.name, {
667
+ ...this.schemaInputTypes.get(fieldType.type.name),
668
+ [field.name]: fieldData
669
+ });
670
+ field.inputTypes.forEach((inputType) => {
671
+ if (inputType.kind === "object") {
672
+ this.parseObjectInputType(inputType);
673
+ }
674
+ });
675
+ });
676
+ }
677
+ return { $ref: format_schema_ref_default(fieldType.type.name) };
678
+ }
679
+ return { type: getJSONSchemaScalar(fieldType.type) };
680
+ }
681
+ };
682
+ var json_schema_parser_default = PrismaJsonSchemaParser;
683
+
684
+ // src/swagger/utils/get-models-accessible-routes.ts
685
+ chunk5I2B5KQG_js.init_cjs_shims();
686
+ var getModelsAccessibleRoutes = (modelNames, models, defaultExposeStrategy = "all") => (
687
+ // eslint-disable-next-line unicorn/no-array-reduce
688
+ modelNames.reduce((accumulator, modelName) => {
689
+ if (models?.[modelName]) {
690
+ return {
691
+ ...accumulator,
692
+ [modelName]: chunk5I2B5KQG_js.get_accessible_routes_default(models[modelName].only, models[modelName].exclude, defaultExposeStrategy)
693
+ };
694
+ }
695
+ return {
696
+ ...accumulator,
697
+ [modelName]: chunk5I2B5KQG_js.get_accessible_routes_default(void 0, void 0, defaultExposeStrategy)
698
+ };
699
+ }, {})
700
+ );
701
+ var get_models_accessible_routes_default = getModelsAccessibleRoutes;
702
+
703
+ // src/swagger/utils/get-swagger-paths.ts
704
+ chunk5I2B5KQG_js.init_cjs_shims();
705
+
706
+ // src/swagger/parameters.ts
707
+ chunk5I2B5KQG_js.init_cjs_shims();
708
+ var queryParameters = {
709
+ distinct: {
710
+ description: "Fields to distinctively retrieve",
711
+ name: "distinct",
712
+ schema: {
713
+ type: "string"
714
+ }
715
+ },
716
+ include: {
717
+ description: "Include relations, same as select",
718
+ name: "include",
719
+ schema: {
720
+ type: "string"
721
+ }
722
+ },
723
+ limit: {
724
+ description: "Maximum number of elements to retrieve",
725
+ name: "limit",
726
+ schema: {
727
+ minimum: 0,
728
+ type: "integer"
729
+ }
730
+ },
731
+ orderBy: {
732
+ description: 'Field on which to order by a direction. See <a href="https://next-crud.js.org/query-params#orderBy">the docs</a>',
733
+ name: "orderBy",
734
+ schema: {
735
+ type: "string"
736
+ }
737
+ },
738
+ page: {
739
+ description: "Page number. Use only for pagination.",
740
+ name: "page",
741
+ schema: {
742
+ minimum: 1,
743
+ type: "integer"
744
+ }
745
+ },
746
+ select: {
747
+ description: "Fields to select. For nested fields, chain them separated with a dot, eg: user.posts",
748
+ name: "select",
749
+ schema: {
750
+ type: "string"
751
+ }
752
+ },
753
+ skip: {
754
+ description: "Number of rows to skip",
755
+ name: "skip",
756
+ schema: {
757
+ minimum: 0,
758
+ type: "integer"
759
+ }
760
+ },
761
+ where: {
762
+ description: 'Fields to filter. See <a href="https://next-crud.js.org/query-params#where">the docs</a>',
763
+ name: "where",
764
+ schema: {
765
+ type: "string"
766
+ }
767
+ }
768
+ };
769
+ var commonQueryParameters = [queryParameters.select, queryParameters.include];
770
+ var listQueryParameters = [
771
+ ...commonQueryParameters,
772
+ queryParameters.limit,
773
+ queryParameters.skip,
774
+ queryParameters.where,
775
+ queryParameters.orderBy,
776
+ queryParameters.page,
777
+ queryParameters.distinct
778
+ ];
779
+ var getQueryParameters = (routeType, additionalQueryParameters = []) => {
780
+ if (routeType === "READ_ALL" /* READ_ALL */) {
781
+ return [...listQueryParameters, ...additionalQueryParameters].filter(Boolean);
782
+ }
783
+ return [...commonQueryParameters, ...additionalQueryParameters].filter(Boolean);
784
+ };
785
+
786
+ // src/swagger/utils/format-example-ref.ts
787
+ chunk5I2B5KQG_js.init_cjs_shims();
788
+ var formatExampleReference = (schemaName) => `#/components/examples/${schemaName}`;
789
+ var format_example_ref_default = formatExampleReference;
790
+
791
+ // src/swagger/utils/get-swagger-paths.ts
792
+ var generateContentForSchema = (schemaName, isArray) => {
793
+ if (isArray) {
794
+ return {
795
+ items: {
796
+ $ref: format_schema_ref_default(schemaName)
797
+ },
798
+ type: "array"
799
+ };
800
+ }
801
+ return {
802
+ $ref: format_schema_ref_default(schemaName)
803
+ };
804
+ };
805
+ var generateSwaggerResponse = (routeType, modelName) => {
806
+ if (routeType === "CREATE" /* CREATE */) {
807
+ return {
808
+ content: {
809
+ content: {
810
+ "application/json": {
811
+ example: format_example_ref_default(modelName),
812
+ schema: generateContentForSchema(modelName)
813
+ }
814
+ },
815
+ description: `${modelName} created`
816
+ },
817
+ statusCode: 201
818
+ };
819
+ }
820
+ if (routeType === "DELETE" /* DELETE */) {
821
+ return {
822
+ content: {
823
+ content: {
824
+ "application/json": {
825
+ example: format_example_ref_default(modelName),
826
+ schema: generateContentForSchema(modelName)
827
+ }
828
+ },
829
+ description: `${modelName} item deleted`
830
+ },
831
+ statusCode: 200
832
+ };
833
+ }
834
+ if (routeType === "READ_ALL" /* READ_ALL */) {
835
+ return {
836
+ content: {
837
+ content: {
838
+ "application/json": {
839
+ examples: {
840
+ Default: {
841
+ $ref: format_example_ref_default(`${modelName}s`)
842
+ },
843
+ Pagination: {
844
+ $ref: format_example_ref_default(`${modelName}Page`)
845
+ }
846
+ },
847
+ schema: {
848
+ oneOf: [generateContentForSchema(modelName, true), generateContentForSchema(`${modelName}Page`, false)]
849
+ }
850
+ }
851
+ },
852
+ description: `${modelName} list retrieved`
853
+ },
854
+ statusCode: 200
855
+ };
856
+ }
857
+ if (routeType === "READ_ONE" /* READ_ONE */) {
858
+ return {
859
+ content: {
860
+ content: {
861
+ "application/json": {
862
+ example: format_example_ref_default(modelName),
863
+ schema: generateContentForSchema(modelName)
864
+ }
865
+ },
866
+ description: `${modelName} item retrieved`
867
+ },
868
+ statusCode: 200
869
+ };
870
+ }
871
+ if (routeType === "UPDATE" /* UPDATE */) {
872
+ return {
873
+ content: {
874
+ content: {
875
+ "application/json": {
876
+ example: format_example_ref_default(modelName),
877
+ schema: generateContentForSchema(modelName)
878
+ }
879
+ },
880
+ description: `${modelName} item updated`
881
+ },
882
+ statusCode: 200
883
+ };
884
+ }
885
+ return void 0;
886
+ };
887
+ var generateRequestBody = (schemaStartName, modelName) => {
888
+ return {
889
+ content: {
890
+ "application/json": {
891
+ schema: {
892
+ $ref: format_schema_ref_default(`${schemaStartName}${modelName}`)
893
+ }
894
+ }
895
+ }
896
+ };
897
+ };
898
+ var getRouteTypeMethod = (routeType) => {
899
+ switch (routeType) {
900
+ case "CREATE" /* CREATE */: {
901
+ return "post";
902
+ }
903
+ case "DELETE" /* DELETE */: {
904
+ return "delete";
905
+ }
906
+ case "READ_ALL" /* READ_ALL */:
907
+ case "READ_ONE" /* READ_ONE */: {
908
+ return "get";
909
+ }
910
+ case "UPDATE" /* UPDATE */: {
911
+ return "put";
912
+ }
913
+ default: {
914
+ throw new TypeError(`Method for route type ${routeType} was not found.`);
915
+ }
916
+ }
917
+ };
918
+ var generateSwaggerPathObject = ({
919
+ hasId,
920
+ modelName,
921
+ modelsConfig,
922
+ routeTypes,
923
+ tag
924
+ }) => {
925
+ const methods = {};
926
+ routeTypes.forEach((routeType) => {
927
+ if (routeTypes.includes(routeType)) {
928
+ const returnType = modelsConfig?.[modelName]?.routeTypes?.[routeType]?.response.name ?? modelsConfig?.[modelName]?.type?.name ?? modelName;
929
+ const method = getRouteTypeMethod(routeType);
930
+ const response = generateSwaggerResponse(routeType, returnType);
931
+ if (response === void 0) {
932
+ throw new TypeError(`Route type ${routeType}; response config was not found.`);
933
+ }
934
+ methods[method] = {
935
+ parameters: getQueryParameters(routeType).map((queryParameter) => {
936
+ return { ...queryParameter, in: "query" };
937
+ }),
938
+ responses: {
939
+ [response.statusCode]: response.content,
940
+ ...modelsConfig?.[modelName]?.routeTypes?.[routeType]?.responses
941
+ },
942
+ summary: modelsConfig?.[modelName]?.routeTypes?.[routeType]?.summary,
943
+ tags: [tag]
944
+ };
945
+ if (hasId) {
946
+ methods[method].parameters.push({
947
+ description: `ID of the ${modelName}`,
948
+ in: "path",
949
+ name: "id",
950
+ required: true,
951
+ schema: {
952
+ type: "string"
953
+ }
954
+ });
955
+ }
956
+ if (routeType === "UPDATE" /* UPDATE */) {
957
+ methods[method].requestBody = generateRequestBody("Update", returnType);
958
+ } else if (routeType === "CREATE" /* CREATE */) {
959
+ methods[method].requestBody = generateRequestBody("Create", returnType);
960
+ }
961
+ }
962
+ });
963
+ return methods;
964
+ };
965
+ var getSwaggerPaths = ({ models, modelsConfig, routes, routesMap }) => (
966
+ // eslint-disable-next-line unicorn/no-array-reduce
967
+ Object.keys(routes).reduce((accumulator, value) => {
968
+ const routeTypes = routes[value];
969
+ const resourceName = models?.[value]?.name ? models[value].name : routesMap?.[value] ?? value;
970
+ const tag = modelsConfig?.[value]?.tag.name ?? value;
971
+ if (routeTypes.includes("CREATE" /* CREATE */) || routeTypes.includes("READ_ALL" /* READ_ALL */)) {
972
+ const path = `/${resourceName}`;
973
+ const routeTypesToUse = ["READ_ALL" /* READ_ALL */, "CREATE" /* CREATE */].filter((routeType) => routeTypes.includes(routeType));
974
+ accumulator[path] = generateSwaggerPathObject({
975
+ modelName: value,
976
+ modelsConfig,
977
+ routeTypes: routeTypesToUse,
978
+ tag
979
+ });
980
+ }
981
+ if (routeTypes.includes("READ_ONE" /* READ_ONE */) || routeTypes.includes("UPDATE" /* UPDATE */) || routeTypes.includes("DELETE" /* DELETE */)) {
982
+ const path = `/${resourceName}/{id}`;
983
+ const routeTypesToUse = ["READ_ONE" /* READ_ONE */, "UPDATE" /* UPDATE */, "DELETE" /* DELETE */].filter((routeType) => routeTypes.includes(routeType));
984
+ accumulator[path] = generateSwaggerPathObject({
985
+ hasId: true,
986
+ modelName: value,
987
+ modelsConfig,
988
+ routeTypes: routeTypesToUse,
989
+ tag
990
+ });
991
+ }
992
+ return accumulator;
993
+ }, {})
994
+ );
995
+ var get_swagger_paths_default = getSwaggerPaths;
996
+
997
+ // src/swagger/utils/get-swagger-tags.ts
998
+ chunk5I2B5KQG_js.init_cjs_shims();
999
+ var getSwaggerTags = (modelNames, modelsConfig) => modelNames.map((modelName) => {
1000
+ if (modelsConfig?.[modelName]?.tag) {
1001
+ return modelsConfig[modelName].tag;
1002
+ }
1003
+ return {
1004
+ name: modelName
1005
+ };
1006
+ });
1007
+ var get_swagger_tags_default = getSwaggerTags;
1008
+
1009
+ // src/swagger/adapter/prisma/index.ts
1010
+ var overwritePathsExampleWithModel = (swaggerPaths, examples) => {
1011
+ Object.values(swaggerPaths).forEach((pathSpec) => {
1012
+ Object.values(pathSpec).forEach((methodSpec) => {
1013
+ if (typeof methodSpec.responses === "object") {
1014
+ Object.values(methodSpec.responses).forEach((responseSpec) => {
1015
+ if (typeof responseSpec.content === "object") {
1016
+ Object.values(responseSpec.content).forEach(
1017
+ (contentSpec) => {
1018
+ if (typeof contentSpec.example === "string") {
1019
+ const example = contentSpec.example.replace("#/components/examples/", "");
1020
+ if (examples[example]?.value !== void 0) {
1021
+ contentSpec.example = examples[example].value;
1022
+ }
1023
+ }
1024
+ }
1025
+ );
1026
+ }
1027
+ });
1028
+ }
1029
+ });
1030
+ });
1031
+ return swaggerPaths;
1032
+ };
1033
+ var modelsToOpenApi = async ({
1034
+ crud = { models: {} },
1035
+ defaultExposeStrategy = "all",
1036
+ models: ctorModels,
1037
+ prismaClient,
1038
+ swagger = { allowedMediaTypes: { "application/json": true }, models: {} }
1039
+ }) => {
1040
+ let dmmf;
1041
+ let prismaDmmfModels;
1042
+ if (prismaClient._dmmf !== void 0) {
1043
+ dmmf = prismaClient._dmmf;
1044
+ prismaDmmfModels = dmmf?.mappingsMap;
1045
+ } else if (prismaClient._getDmmf !== void 0) {
1046
+ dmmf = await prismaClient._getDmmf();
1047
+ prismaDmmfModels = dmmf.mappingsMap;
1048
+ }
1049
+ if (dmmf === void 0) {
1050
+ throw new TypeError("Couldn't get prisma client models");
1051
+ }
1052
+ const parser = new json_schema_parser_default(dmmf);
1053
+ const definitions = parser.parseModels();
1054
+ const dModels = Object.keys(definitions);
1055
+ const schema = JSON.stringify({
1056
+ ...definitions,
1057
+ ...parser.parseInputTypes(dModels),
1058
+ ...parser.getPaginationDataSchema(),
1059
+ ...parser.getPaginatedModelsSchemas(dModels)
1060
+ });
1061
+ if (ctorModels !== void 0) {
1062
+ ctorModels.forEach((model) => {
1063
+ if (!Object.keys(prismaDmmfModels).includes(model)) {
1064
+ throw new Error(`Model name ${model} is invalid.`);
1065
+ }
1066
+ });
1067
+ }
1068
+ const models = ctorModels ?? Object.keys(prismaDmmfModels);
1069
+ const swaggerRoutes = get_models_accessible_routes_default(models, crud.models, defaultExposeStrategy);
1070
+ const swaggerTags = get_swagger_tags_default(models, swagger.models);
1071
+ const swaggerPaths = get_swagger_paths_default({
1072
+ models: crud.models,
1073
+ modelsConfig: swagger.models,
1074
+ routes: swaggerRoutes,
1075
+ routesMap: models_to_route_names_default(prismaDmmfModels, models)
1076
+ });
1077
+ const schemas = JSON.parse(schema.replaceAll("#/definitions", "#/components/schemas"));
1078
+ const examples = parser.getExampleModelsSchemas(dModels, schemas);
1079
+ return {
1080
+ examples,
1081
+ paths: overwritePathsExampleWithModel(swaggerPaths, examples),
1082
+ schemas,
1083
+ tags: swaggerTags
1084
+ };
1085
+ };
1086
+ var prisma_default = modelsToOpenApi;
1087
+
1088
+ Object.defineProperty(exports, "RouteType", {
1089
+ enumerable: true,
1090
+ get: function () { return chunk5I2B5KQG_js.RouteType; }
1091
+ });
1092
+ exports.PrismaAdapter = PrismaAdapter;
1093
+ exports.modelsToOpenApi = prisma_default;
1094
+ //# sourceMappingURL=index.js.map
3
1095
  //# sourceMappingURL=index.js.map