@visulima/crud 2.0.46 → 3.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/LICENSE.md +22 -1
  3. package/README.md +29 -18
  4. package/dist/adapter/prisma/index.d.cts +39 -0
  5. package/dist/adapter/prisma/index.d.mts +39 -0
  6. package/dist/adapter/prisma/index.d.ts +39 -0
  7. package/dist/adapter/prisma/types.d.cts +31 -0
  8. package/dist/adapter/prisma/types.d.mts +31 -0
  9. package/dist/adapter/prisma/types.d.ts +31 -0
  10. package/dist/adapter/prisma/utils/models-to-route-names.d.cts +5 -0
  11. package/dist/adapter/prisma/utils/models-to-route-names.d.mts +5 -0
  12. package/dist/adapter/prisma/utils/models-to-route-names.d.ts +5 -0
  13. package/dist/adapter/prisma/utils/parse-cursor.d.cts +3 -0
  14. package/dist/adapter/prisma/utils/parse-cursor.d.mts +3 -0
  15. package/dist/adapter/prisma/utils/parse-cursor.d.ts +3 -0
  16. package/dist/adapter/prisma/utils/parse-order-by.d.cts +4 -0
  17. package/dist/adapter/prisma/utils/parse-order-by.d.mts +4 -0
  18. package/dist/adapter/prisma/utils/parse-order-by.d.ts +4 -0
  19. package/dist/adapter/prisma/utils/parse-recursive.d.cts +4 -0
  20. package/dist/adapter/prisma/utils/parse-recursive.d.mts +4 -0
  21. package/dist/adapter/prisma/utils/parse-recursive.d.ts +4 -0
  22. package/dist/adapter/prisma/utils/parse-where.d.cts +4 -0
  23. package/dist/adapter/prisma/utils/parse-where.d.mts +4 -0
  24. package/dist/adapter/prisma/utils/parse-where.d.ts +4 -0
  25. package/dist/base-crud-handler.d.cts +9 -0
  26. package/dist/base-crud-handler.d.mts +9 -0
  27. package/dist/base-crud-handler.d.ts +9 -0
  28. package/dist/handler/create.d.cts +11 -0
  29. package/dist/handler/create.d.mts +11 -0
  30. package/dist/handler/create.d.ts +11 -0
  31. package/dist/handler/delete.d.cts +7 -0
  32. package/dist/handler/delete.d.mts +7 -0
  33. package/dist/handler/delete.d.ts +7 -0
  34. package/dist/handler/list.d.cts +9 -0
  35. package/dist/handler/list.d.mts +9 -0
  36. package/dist/handler/list.d.ts +9 -0
  37. package/dist/handler/read.d.cts +7 -0
  38. package/dist/handler/read.d.mts +7 -0
  39. package/dist/handler/read.d.ts +7 -0
  40. package/dist/handler/update.d.cts +11 -0
  41. package/dist/handler/update.d.mts +11 -0
  42. package/dist/handler/update.d.ts +11 -0
  43. package/dist/index.cjs +13 -0
  44. package/dist/index.d.cts +6 -0
  45. package/dist/index.d.mts +6 -127
  46. package/dist/index.d.ts +6 -127
  47. package/dist/index.mjs +3 -1085
  48. package/dist/next/api/edge/index.d.cts +3 -0
  49. package/dist/next/api/edge/index.d.mts +3 -0
  50. package/dist/next/api/edge/index.d.ts +3 -0
  51. package/dist/next/api/node/index.d.cts +4 -0
  52. package/dist/next/api/node/index.d.mts +4 -0
  53. package/dist/next/api/node/index.d.ts +4 -0
  54. package/dist/next/index.cjs +11 -0
  55. package/dist/next/index.d.cts +2 -0
  56. package/dist/next/index.d.mts +2 -8
  57. package/dist/next/index.d.ts +2 -8
  58. package/dist/next/index.mjs +2 -4832
  59. package/dist/packem_shared/PrismaAdapter-BTCwgMow.cjs +324 -0
  60. package/dist/packem_shared/PrismaAdapter-dVBZvBOv.mjs +318 -0
  61. package/dist/packem_shared/RouteType-Bk3uAK0x.cjs +14 -0
  62. package/dist/packem_shared/RouteType-CB2xrWdf.mjs +10 -0
  63. package/dist/packem_shared/base-crud-handler-B3eCO4up.cjs +572 -0
  64. package/dist/packem_shared/base-crud-handler-DgrOMhoH.mjs +587 -0
  65. package/dist/packem_shared/edgeHandler-B4JJXPUI.mjs +16 -0
  66. package/dist/packem_shared/edgeHandler-CDFgDdrG.cjs +18 -0
  67. package/dist/packem_shared/get-accessible-routes-C6NF9Iry.cjs +16 -0
  68. package/dist/packem_shared/get-accessible-routes-sV5SDdFn.mjs +14 -0
  69. package/dist/packem_shared/models-to-route-names-CdwsK0V1.mjs +9 -0
  70. package/dist/packem_shared/models-to-route-names-Dv94PzhE.cjs +11 -0
  71. package/dist/{index.js → packem_shared/modelsToOpenApi-BuGL_l3R.cjs} +66 -453
  72. package/dist/packem_shared/modelsToOpenApi-Bux3khmh.mjs +706 -0
  73. package/dist/packem_shared/nodeHandler-BUWSKNyo.cjs +16 -0
  74. package/dist/packem_shared/nodeHandler-DSq7vHzv.mjs +14 -0
  75. package/dist/query-parser.d.cts +3 -0
  76. package/dist/query-parser.d.mts +3 -0
  77. package/dist/query-parser.d.ts +3 -0
  78. package/dist/swagger/adapter/prisma/index.d.cts +22 -0
  79. package/dist/swagger/adapter/prisma/index.d.mts +22 -0
  80. package/dist/swagger/adapter/prisma/index.d.ts +22 -0
  81. package/dist/swagger/json-schema-parser.d.cts +18 -0
  82. package/dist/swagger/json-schema-parser.d.mts +18 -0
  83. package/dist/swagger/json-schema-parser.d.ts +18 -0
  84. package/dist/swagger/parameters.d.cts +5 -0
  85. package/dist/swagger/parameters.d.mts +5 -0
  86. package/dist/swagger/parameters.d.ts +5 -0
  87. package/dist/swagger/types.d.cts +39 -0
  88. package/dist/swagger/types.d.mts +39 -0
  89. package/dist/swagger/types.d.ts +39 -0
  90. package/dist/swagger/utils/format-example-ref.d.cts +2 -0
  91. package/dist/swagger/utils/format-example-ref.d.mts +2 -0
  92. package/dist/swagger/utils/format-example-ref.d.ts +2 -0
  93. package/dist/swagger/utils/format-schema-ref.d.cts +2 -0
  94. package/dist/swagger/utils/format-schema-ref.d.mts +2 -0
  95. package/dist/swagger/utils/format-schema-ref.d.ts +2 -0
  96. package/dist/swagger/utils/get-models-accessible-routes.d.cts +4 -0
  97. package/dist/swagger/utils/get-models-accessible-routes.d.mts +4 -0
  98. package/dist/swagger/utils/get-models-accessible-routes.d.ts +4 -0
  99. package/dist/swagger/utils/get-swagger-paths.d.cts +12 -0
  100. package/dist/swagger/utils/get-swagger-paths.d.mts +12 -0
  101. package/dist/swagger/utils/get-swagger-paths.d.ts +12 -0
  102. package/dist/swagger/utils/get-swagger-tags.d.cts +4 -0
  103. package/dist/swagger/utils/get-swagger-tags.d.mts +4 -0
  104. package/dist/swagger/utils/get-swagger-tags.d.ts +4 -0
  105. package/dist/types.d.cts +106 -0
  106. package/dist/types.d.mts +106 -0
  107. package/dist/types.d.ts +106 -0
  108. package/dist/utils/format-resource-id.d.cts +2 -0
  109. package/dist/utils/format-resource-id.d.mts +2 -0
  110. package/dist/utils/format-resource-id.d.ts +2 -0
  111. package/dist/utils/get-accessible-routes.d.cts +3 -0
  112. package/dist/utils/get-accessible-routes.d.mts +3 -0
  113. package/dist/utils/get-accessible-routes.d.ts +3 -0
  114. package/dist/utils/get-resource-name-from-url.d.cts +5 -0
  115. package/dist/utils/get-resource-name-from-url.d.mts +5 -0
  116. package/dist/utils/get-resource-name-from-url.d.ts +5 -0
  117. package/dist/utils/get-route-type.d.cts +7 -0
  118. package/dist/utils/get-route-type.d.mts +7 -0
  119. package/dist/utils/get-route-type.d.ts +7 -0
  120. package/dist/utils/is-primitive.d.cts +2 -0
  121. package/dist/utils/is-primitive.d.mts +2 -0
  122. package/dist/utils/is-primitive.d.ts +2 -0
  123. package/dist/utils/validate-adapter-methods.d.cts +3 -0
  124. package/dist/utils/validate-adapter-methods.d.mts +3 -0
  125. package/dist/utils/validate-adapter-methods.d.ts +3 -0
  126. package/package.json +38 -19
  127. package/dist/chunk-5I2B5KQG.js +0 -77
  128. package/dist/chunk-5I2B5KQG.js.map +0 -1
  129. package/dist/chunk-LBXJKEOF.mjs +0 -73
  130. package/dist/chunk-LBXJKEOF.mjs.map +0 -1
  131. package/dist/index.js.map +0 -1
  132. package/dist/index.mjs.map +0 -1
  133. package/dist/next/index.js +0 -4839
  134. package/dist/next/index.js.map +0 -1
  135. package/dist/next/index.mjs.map +0 -1
  136. package/dist/types-C5c2M01-.d.mts +0 -138
  137. package/dist/types-C5c2M01-.d.ts +0 -138
@@ -0,0 +1,324 @@
1
+ 'use strict';
2
+
3
+ const createHttpError = require('http-errors');
4
+ const modelsToRouteNames = require('./models-to-route-names-Dv94PzhE.cjs');
5
+
6
+ const _interopDefaultCompat = e => e && typeof e === 'object' && 'default' in e ? e.default : e;
7
+
8
+ const createHttpError__default = /*#__PURE__*/_interopDefaultCompat(createHttpError);
9
+
10
+ const primitiveTypes = /* @__PURE__ */ new Set(["boolean", "number", "string"]);
11
+ const isPrimitive = (value) => primitiveTypes.has(typeof value);
12
+
13
+ const parsePrismaCursor = (cursor) => {
14
+ const parsed = {};
15
+ Object.keys(cursor).forEach((key) => {
16
+ const value = cursor[key];
17
+ if (isPrimitive(value)) {
18
+ parsed[key] = value;
19
+ }
20
+ });
21
+ if (Object.keys(parsed).length !== 1) {
22
+ throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");
23
+ }
24
+ return parsed;
25
+ };
26
+
27
+ const operatorsAssociation$1 = {
28
+ $asc: "asc",
29
+ $desc: "desc"
30
+ };
31
+ const parsePrismaOrderBy = (orderBy) => {
32
+ const parsed = {};
33
+ Object.keys(orderBy).forEach((key) => {
34
+ const value = orderBy[key];
35
+ parsed[key] = operatorsAssociation$1[value];
36
+ });
37
+ return parsed;
38
+ };
39
+
40
+ const parsePrismaRecursiveField = (select, fieldName) => {
41
+ const parsed = {};
42
+ Object.keys(select).forEach((field) => {
43
+ parsed[field] = select[field] === true ? true : {
44
+ [fieldName]: parsePrismaRecursiveField(select[field], fieldName)
45
+ };
46
+ });
47
+ return parsed;
48
+ };
49
+
50
+ const isObject = (a) => a instanceof Object;
51
+ const operatorsAssociation = {
52
+ $cont: "contains",
53
+ $ends: "endsWith",
54
+ $eq: "equals",
55
+ $gt: "gt",
56
+ $gte: "gte",
57
+ $in: "in",
58
+ $lt: "lt",
59
+ $lte: "lte",
60
+ $neq: "not",
61
+ $notin: "notIn",
62
+ $starts: "startsWith"
63
+ };
64
+ const 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);
65
+ const getSearchValue = (originalValue) => {
66
+ if (isDateString(originalValue)) {
67
+ return new Date(originalValue);
68
+ }
69
+ if (typeof originalValue === "string" && originalValue === "$isnull") {
70
+ return null;
71
+ }
72
+ return originalValue;
73
+ };
74
+ const isRelation = (key, manyRelations) => {
75
+ const splitKey = key.split(".");
76
+ splitKey.splice(-1, 1);
77
+ return manyRelations.includes(splitKey.join("."));
78
+ };
79
+ const parseSimpleField = (value) => {
80
+ const operator = Object.keys(value)[0];
81
+ const prismaOperator = operatorsAssociation[operator];
82
+ if (prismaOperator) {
83
+ return {
84
+ [prismaOperator]: value[operator]
85
+ };
86
+ }
87
+ return void 0;
88
+ };
89
+ const parseRelation = (value, key, parsed, manyRelations) => {
90
+ const fields = key.split(".").reverse();
91
+ let formatFields = {};
92
+ fields.forEach((field, index) => {
93
+ if (index === 0) {
94
+ basicParse(value, field, formatFields, manyRelations);
95
+ } else {
96
+ formatFields = {
97
+ [field]: {
98
+ some: formatFields
99
+ }
100
+ };
101
+ }
102
+ });
103
+ const initialFieldKey = fields.reverse()[0];
104
+ const oldParsed = parsed[initialFieldKey];
105
+ parsed[initialFieldKey] = {
106
+ some: {
107
+ ...oldParsed?.some,
108
+ ...formatFields[initialFieldKey]?.some
109
+ }
110
+ };
111
+ };
112
+ const parseObjectCombination = (object, manyRelations) => {
113
+ const parsed = {};
114
+ Object.keys(object).forEach((key) => {
115
+ const value = object[key];
116
+ if (isRelation(key, manyRelations)) {
117
+ parseRelation(value, key, parsed, manyRelations);
118
+ } else if (isPrimitive(value)) {
119
+ parsed[key] = value;
120
+ } else if (isObject(value)) {
121
+ const fieldResult = parseSimpleField(value);
122
+ if (fieldResult) {
123
+ parsed[key] = fieldResult;
124
+ }
125
+ }
126
+ });
127
+ return parsed;
128
+ };
129
+ const basicParse = (value, key, parsed, manyRelations) => {
130
+ if (isPrimitive(value)) {
131
+ parsed[key] = getSearchValue(value);
132
+ } else {
133
+ switch (key) {
134
+ case "$and": {
135
+ if (isObject(value)) {
136
+ parsed.AND = parseObjectCombination(value, manyRelations);
137
+ }
138
+ break;
139
+ }
140
+ case "$not": {
141
+ if (isObject(value)) {
142
+ parsed.NOT = parseObjectCombination(value, manyRelations);
143
+ }
144
+ break;
145
+ }
146
+ case "$or": {
147
+ if (isObject(value)) {
148
+ parsed.OR = parseObjectCombination(value, manyRelations);
149
+ }
150
+ break;
151
+ }
152
+ default: {
153
+ parsed[key] = parseSimpleField(value);
154
+ break;
155
+ }
156
+ }
157
+ }
158
+ };
159
+ const parsePrismaWhere = (where, manyRelations) => {
160
+ const parsed = {};
161
+ Object.keys(where).forEach((key) => {
162
+ const value = where[key];
163
+ if (isRelation(key, manyRelations)) {
164
+ parseRelation(value, key, parsed, manyRelations);
165
+ } else {
166
+ basicParse(value, key, parsed, manyRelations);
167
+ }
168
+ });
169
+ return parsed;
170
+ };
171
+
172
+ class PrismaAdapter {
173
+ models;
174
+ ctorModels;
175
+ dmmf;
176
+ manyRelations;
177
+ primaryKey;
178
+ prismaClient;
179
+ constructor({ manyRelations = {}, models, primaryKey = "id", prismaClient }) {
180
+ this.prismaClient = prismaClient;
181
+ this.primaryKey = primaryKey;
182
+ this.manyRelations = manyRelations;
183
+ this.ctorModels = models;
184
+ }
185
+ async connect() {
186
+ this.prismaClient.$connect();
187
+ }
188
+ async create(resourceName, data, query) {
189
+ return await this.getPrismaDelegate(resourceName).create({
190
+ data,
191
+ include: query.include,
192
+ select: query.select
193
+ });
194
+ }
195
+ async delete(resourceName, resourceId, query) {
196
+ return await this.getPrismaDelegate(resourceName).delete({
197
+ include: query.include,
198
+ select: query.select,
199
+ where: {
200
+ [this.primaryKey]: resourceId
201
+ }
202
+ });
203
+ }
204
+ async disconnect() {
205
+ await this.prismaClient.$disconnect();
206
+ }
207
+ async getAll(resourceName, query) {
208
+ return await this.getPrismaDelegate(resourceName).findMany({
209
+ cursor: query.cursor,
210
+ distinct: query.distinct,
211
+ include: query.include,
212
+ orderBy: query.orderBy,
213
+ select: query.select,
214
+ skip: query.skip,
215
+ take: query.take,
216
+ where: query.where
217
+ });
218
+ }
219
+ getModels() {
220
+ return this.models ?? [];
221
+ }
222
+ async getOne(resourceName, resourceId, query) {
223
+ const delegate = this.getPrismaDelegate(resourceName);
224
+ const findFunction = delegate.findUnique ?? delegate.findOne;
225
+ return await findFunction({
226
+ include: query.include,
227
+ select: query.select,
228
+ where: {
229
+ [this.primaryKey]: resourceId
230
+ }
231
+ });
232
+ }
233
+ async getPaginationData(resourceName, query) {
234
+ const total = await this.getPrismaDelegate(resourceName).count({
235
+ distinct: query.distinct,
236
+ where: query.where
237
+ });
238
+ return {
239
+ page: Math.ceil((query.skip ?? 0) / (query.take ?? 0)) + 1,
240
+ pageCount: Math.ceil(total / (query.take ?? 0)),
241
+ total
242
+ };
243
+ }
244
+ // eslint-disable-next-line class-methods-use-this
245
+ handleError(error) {
246
+ console.error(error);
247
+ if (error instanceof Error && error.stack) {
248
+ console.error(error.stack);
249
+ }
250
+ throw error.constructor.name === "PrismaClientKnownRequestError" || error.constructor.name === "PrismaClientValidationError" ? createHttpError__default(400, "invalid request, check your server logs for more info") : createHttpError__default(500, "an unknown error occured, check your server logs for more info");
251
+ }
252
+ async init() {
253
+ const models = this.ctorModels;
254
+ const prismaDmmfModels = await this.getPrismaClientModels();
255
+ if (models !== void 0) {
256
+ models.forEach((model) => {
257
+ if (!Object.keys(prismaDmmfModels).includes(model)) {
258
+ throw new Error(`Model name ${model} is invalid.`);
259
+ }
260
+ });
261
+ }
262
+ this.models = models ?? Object.keys(prismaDmmfModels);
263
+ }
264
+ async mapModelsToRouteNames() {
265
+ return modelsToRouteNames.modelsToRouteNames(await this.getPrismaClientModels(), this.getModels());
266
+ }
267
+ parseQuery(resourceName, query) {
268
+ const parsed = {};
269
+ if (query.select) {
270
+ parsed.select = parsePrismaRecursiveField(query.select, "select");
271
+ }
272
+ if (query.include) {
273
+ parsed.include = parsePrismaRecursiveField(query.include, "include");
274
+ }
275
+ if (query.originalQuery?.where) {
276
+ parsed.where = parsePrismaWhere(JSON.parse(query.originalQuery.where), this.manyRelations[resourceName] ?? []);
277
+ }
278
+ if (query.orderBy) {
279
+ parsed.orderBy = parsePrismaOrderBy(query.orderBy);
280
+ }
281
+ if (query.limit !== void 0) {
282
+ parsed.take = query.limit;
283
+ }
284
+ if (query.skip !== void 0) {
285
+ parsed.skip = query.skip;
286
+ }
287
+ if (query.originalQuery?.cursor) {
288
+ parsed.cursor = parsePrismaCursor(JSON.parse(query.originalQuery.cursor));
289
+ }
290
+ if (query.distinct) {
291
+ parsed.distinct = query.distinct;
292
+ }
293
+ return parsed;
294
+ }
295
+ async update(resourceName, resourceId, data, query) {
296
+ return await this.getPrismaDelegate(resourceName).update({
297
+ data,
298
+ include: query.include,
299
+ select: query.select,
300
+ where: {
301
+ [this.primaryKey]: resourceId
302
+ }
303
+ });
304
+ }
305
+ get client() {
306
+ return this.prismaClient;
307
+ }
308
+ getPrismaClientModels = async () => {
309
+ if (this.prismaClient._dmmf !== void 0) {
310
+ this.dmmf = this.prismaClient._dmmf;
311
+ return this.dmmf?.mappingsMap;
312
+ }
313
+ if (this.prismaClient._getDmmf !== void 0) {
314
+ this.dmmf = await this.prismaClient._getDmmf();
315
+ return this.dmmf.mappingsMap;
316
+ }
317
+ throw new Error("Couldn't get prisma client models");
318
+ };
319
+ getPrismaDelegate(resourceName) {
320
+ return this.prismaClient[`${resourceName.charAt(0).toLowerCase()}${resourceName.slice(1)}`];
321
+ }
322
+ }
323
+
324
+ module.exports = PrismaAdapter;
@@ -0,0 +1,318 @@
1
+ import createHttpError from 'http-errors';
2
+ import { m as modelsToRouteNames } from './models-to-route-names-CdwsK0V1.mjs';
3
+
4
+ const primitiveTypes = /* @__PURE__ */ new Set(["boolean", "number", "string"]);
5
+ const isPrimitive = (value) => primitiveTypes.has(typeof value);
6
+
7
+ const parsePrismaCursor = (cursor) => {
8
+ const parsed = {};
9
+ Object.keys(cursor).forEach((key) => {
10
+ const value = cursor[key];
11
+ if (isPrimitive(value)) {
12
+ parsed[key] = value;
13
+ }
14
+ });
15
+ if (Object.keys(parsed).length !== 1) {
16
+ throw new Error("cursor needs to be an object with exactly 1 property with a primitive value");
17
+ }
18
+ return parsed;
19
+ };
20
+
21
+ const operatorsAssociation$1 = {
22
+ $asc: "asc",
23
+ $desc: "desc"
24
+ };
25
+ const parsePrismaOrderBy = (orderBy) => {
26
+ const parsed = {};
27
+ Object.keys(orderBy).forEach((key) => {
28
+ const value = orderBy[key];
29
+ parsed[key] = operatorsAssociation$1[value];
30
+ });
31
+ return parsed;
32
+ };
33
+
34
+ const parsePrismaRecursiveField = (select, fieldName) => {
35
+ const parsed = {};
36
+ Object.keys(select).forEach((field) => {
37
+ parsed[field] = select[field] === true ? true : {
38
+ [fieldName]: parsePrismaRecursiveField(select[field], fieldName)
39
+ };
40
+ });
41
+ return parsed;
42
+ };
43
+
44
+ const isObject = (a) => a instanceof Object;
45
+ const operatorsAssociation = {
46
+ $cont: "contains",
47
+ $ends: "endsWith",
48
+ $eq: "equals",
49
+ $gt: "gt",
50
+ $gte: "gte",
51
+ $in: "in",
52
+ $lt: "lt",
53
+ $lte: "lte",
54
+ $neq: "not",
55
+ $notin: "notIn",
56
+ $starts: "startsWith"
57
+ };
58
+ const 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);
59
+ const getSearchValue = (originalValue) => {
60
+ if (isDateString(originalValue)) {
61
+ return new Date(originalValue);
62
+ }
63
+ if (typeof originalValue === "string" && originalValue === "$isnull") {
64
+ return null;
65
+ }
66
+ return originalValue;
67
+ };
68
+ const isRelation = (key, manyRelations) => {
69
+ const splitKey = key.split(".");
70
+ splitKey.splice(-1, 1);
71
+ return manyRelations.includes(splitKey.join("."));
72
+ };
73
+ const parseSimpleField = (value) => {
74
+ const operator = Object.keys(value)[0];
75
+ const prismaOperator = operatorsAssociation[operator];
76
+ if (prismaOperator) {
77
+ return {
78
+ [prismaOperator]: value[operator]
79
+ };
80
+ }
81
+ return void 0;
82
+ };
83
+ const parseRelation = (value, key, parsed, manyRelations) => {
84
+ const fields = key.split(".").reverse();
85
+ let formatFields = {};
86
+ fields.forEach((field, index) => {
87
+ if (index === 0) {
88
+ basicParse(value, field, formatFields, manyRelations);
89
+ } else {
90
+ formatFields = {
91
+ [field]: {
92
+ some: formatFields
93
+ }
94
+ };
95
+ }
96
+ });
97
+ const initialFieldKey = fields.reverse()[0];
98
+ const oldParsed = parsed[initialFieldKey];
99
+ parsed[initialFieldKey] = {
100
+ some: {
101
+ ...oldParsed?.some,
102
+ ...formatFields[initialFieldKey]?.some
103
+ }
104
+ };
105
+ };
106
+ const parseObjectCombination = (object, manyRelations) => {
107
+ const parsed = {};
108
+ Object.keys(object).forEach((key) => {
109
+ const value = object[key];
110
+ if (isRelation(key, manyRelations)) {
111
+ parseRelation(value, key, parsed, manyRelations);
112
+ } else if (isPrimitive(value)) {
113
+ parsed[key] = value;
114
+ } else if (isObject(value)) {
115
+ const fieldResult = parseSimpleField(value);
116
+ if (fieldResult) {
117
+ parsed[key] = fieldResult;
118
+ }
119
+ }
120
+ });
121
+ return parsed;
122
+ };
123
+ const basicParse = (value, key, parsed, manyRelations) => {
124
+ if (isPrimitive(value)) {
125
+ parsed[key] = getSearchValue(value);
126
+ } else {
127
+ switch (key) {
128
+ case "$and": {
129
+ if (isObject(value)) {
130
+ parsed.AND = parseObjectCombination(value, manyRelations);
131
+ }
132
+ break;
133
+ }
134
+ case "$not": {
135
+ if (isObject(value)) {
136
+ parsed.NOT = parseObjectCombination(value, manyRelations);
137
+ }
138
+ break;
139
+ }
140
+ case "$or": {
141
+ if (isObject(value)) {
142
+ parsed.OR = parseObjectCombination(value, manyRelations);
143
+ }
144
+ break;
145
+ }
146
+ default: {
147
+ parsed[key] = parseSimpleField(value);
148
+ break;
149
+ }
150
+ }
151
+ }
152
+ };
153
+ const parsePrismaWhere = (where, manyRelations) => {
154
+ const parsed = {};
155
+ Object.keys(where).forEach((key) => {
156
+ const value = where[key];
157
+ if (isRelation(key, manyRelations)) {
158
+ parseRelation(value, key, parsed, manyRelations);
159
+ } else {
160
+ basicParse(value, key, parsed, manyRelations);
161
+ }
162
+ });
163
+ return parsed;
164
+ };
165
+
166
+ class PrismaAdapter {
167
+ models;
168
+ ctorModels;
169
+ dmmf;
170
+ manyRelations;
171
+ primaryKey;
172
+ prismaClient;
173
+ constructor({ manyRelations = {}, models, primaryKey = "id", prismaClient }) {
174
+ this.prismaClient = prismaClient;
175
+ this.primaryKey = primaryKey;
176
+ this.manyRelations = manyRelations;
177
+ this.ctorModels = models;
178
+ }
179
+ async connect() {
180
+ this.prismaClient.$connect();
181
+ }
182
+ async create(resourceName, data, query) {
183
+ return await this.getPrismaDelegate(resourceName).create({
184
+ data,
185
+ include: query.include,
186
+ select: query.select
187
+ });
188
+ }
189
+ async delete(resourceName, resourceId, query) {
190
+ return await this.getPrismaDelegate(resourceName).delete({
191
+ include: query.include,
192
+ select: query.select,
193
+ where: {
194
+ [this.primaryKey]: resourceId
195
+ }
196
+ });
197
+ }
198
+ async disconnect() {
199
+ await this.prismaClient.$disconnect();
200
+ }
201
+ async getAll(resourceName, query) {
202
+ return await this.getPrismaDelegate(resourceName).findMany({
203
+ cursor: query.cursor,
204
+ distinct: query.distinct,
205
+ include: query.include,
206
+ orderBy: query.orderBy,
207
+ select: query.select,
208
+ skip: query.skip,
209
+ take: query.take,
210
+ where: query.where
211
+ });
212
+ }
213
+ getModels() {
214
+ return this.models ?? [];
215
+ }
216
+ async getOne(resourceName, resourceId, query) {
217
+ const delegate = this.getPrismaDelegate(resourceName);
218
+ const findFunction = delegate.findUnique ?? delegate.findOne;
219
+ return await findFunction({
220
+ include: query.include,
221
+ select: query.select,
222
+ where: {
223
+ [this.primaryKey]: resourceId
224
+ }
225
+ });
226
+ }
227
+ async getPaginationData(resourceName, query) {
228
+ const total = await this.getPrismaDelegate(resourceName).count({
229
+ distinct: query.distinct,
230
+ where: query.where
231
+ });
232
+ return {
233
+ page: Math.ceil((query.skip ?? 0) / (query.take ?? 0)) + 1,
234
+ pageCount: Math.ceil(total / (query.take ?? 0)),
235
+ total
236
+ };
237
+ }
238
+ // eslint-disable-next-line class-methods-use-this
239
+ handleError(error) {
240
+ console.error(error);
241
+ if (error instanceof Error && error.stack) {
242
+ console.error(error.stack);
243
+ }
244
+ throw error.constructor.name === "PrismaClientKnownRequestError" || error.constructor.name === "PrismaClientValidationError" ? createHttpError(400, "invalid request, check your server logs for more info") : createHttpError(500, "an unknown error occured, check your server logs for more info");
245
+ }
246
+ async init() {
247
+ const models = this.ctorModels;
248
+ const prismaDmmfModels = await this.getPrismaClientModels();
249
+ if (models !== void 0) {
250
+ models.forEach((model) => {
251
+ if (!Object.keys(prismaDmmfModels).includes(model)) {
252
+ throw new Error(`Model name ${model} is invalid.`);
253
+ }
254
+ });
255
+ }
256
+ this.models = models ?? Object.keys(prismaDmmfModels);
257
+ }
258
+ async mapModelsToRouteNames() {
259
+ return modelsToRouteNames(await this.getPrismaClientModels(), this.getModels());
260
+ }
261
+ parseQuery(resourceName, query) {
262
+ const parsed = {};
263
+ if (query.select) {
264
+ parsed.select = parsePrismaRecursiveField(query.select, "select");
265
+ }
266
+ if (query.include) {
267
+ parsed.include = parsePrismaRecursiveField(query.include, "include");
268
+ }
269
+ if (query.originalQuery?.where) {
270
+ parsed.where = parsePrismaWhere(JSON.parse(query.originalQuery.where), this.manyRelations[resourceName] ?? []);
271
+ }
272
+ if (query.orderBy) {
273
+ parsed.orderBy = parsePrismaOrderBy(query.orderBy);
274
+ }
275
+ if (query.limit !== void 0) {
276
+ parsed.take = query.limit;
277
+ }
278
+ if (query.skip !== void 0) {
279
+ parsed.skip = query.skip;
280
+ }
281
+ if (query.originalQuery?.cursor) {
282
+ parsed.cursor = parsePrismaCursor(JSON.parse(query.originalQuery.cursor));
283
+ }
284
+ if (query.distinct) {
285
+ parsed.distinct = query.distinct;
286
+ }
287
+ return parsed;
288
+ }
289
+ async update(resourceName, resourceId, data, query) {
290
+ return await this.getPrismaDelegate(resourceName).update({
291
+ data,
292
+ include: query.include,
293
+ select: query.select,
294
+ where: {
295
+ [this.primaryKey]: resourceId
296
+ }
297
+ });
298
+ }
299
+ get client() {
300
+ return this.prismaClient;
301
+ }
302
+ getPrismaClientModels = async () => {
303
+ if (this.prismaClient._dmmf !== void 0) {
304
+ this.dmmf = this.prismaClient._dmmf;
305
+ return this.dmmf?.mappingsMap;
306
+ }
307
+ if (this.prismaClient._getDmmf !== void 0) {
308
+ this.dmmf = await this.prismaClient._getDmmf();
309
+ return this.dmmf.mappingsMap;
310
+ }
311
+ throw new Error("Couldn't get prisma client models");
312
+ };
313
+ getPrismaDelegate(resourceName) {
314
+ return this.prismaClient[`${resourceName.charAt(0).toLowerCase()}${resourceName.slice(1)}`];
315
+ }
316
+ }
317
+
318
+ export { PrismaAdapter as default };
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
4
+
5
+ var RouteType = /* @__PURE__ */ ((RouteType2) => {
6
+ RouteType2["CREATE"] = "CREATE";
7
+ RouteType2["DELETE"] = "DELETE";
8
+ RouteType2["READ_ALL"] = "READ_ALL";
9
+ RouteType2["READ_ONE"] = "READ_ONE";
10
+ RouteType2["UPDATE"] = "UPDATE";
11
+ return RouteType2;
12
+ })(RouteType || {});
13
+
14
+ exports.RouteType = RouteType;
@@ -0,0 +1,10 @@
1
+ var RouteType = /* @__PURE__ */ ((RouteType2) => {
2
+ RouteType2["CREATE"] = "CREATE";
3
+ RouteType2["DELETE"] = "DELETE";
4
+ RouteType2["READ_ALL"] = "READ_ALL";
5
+ RouteType2["READ_ONE"] = "READ_ONE";
6
+ RouteType2["UPDATE"] = "UPDATE";
7
+ return RouteType2;
8
+ })(RouteType || {});
9
+
10
+ export { RouteType };