@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.
- package/CHANGELOG.md +162 -0
- package/LICENSE.md +22 -1
- package/README.md +29 -18
- package/dist/adapter/prisma/index.d.cts +39 -0
- package/dist/adapter/prisma/index.d.mts +39 -0
- package/dist/adapter/prisma/index.d.ts +39 -0
- package/dist/adapter/prisma/types.d.cts +31 -0
- package/dist/adapter/prisma/types.d.mts +31 -0
- package/dist/adapter/prisma/types.d.ts +31 -0
- package/dist/adapter/prisma/utils/models-to-route-names.d.cts +5 -0
- package/dist/adapter/prisma/utils/models-to-route-names.d.mts +5 -0
- package/dist/adapter/prisma/utils/models-to-route-names.d.ts +5 -0
- package/dist/adapter/prisma/utils/parse-cursor.d.cts +3 -0
- package/dist/adapter/prisma/utils/parse-cursor.d.mts +3 -0
- package/dist/adapter/prisma/utils/parse-cursor.d.ts +3 -0
- package/dist/adapter/prisma/utils/parse-order-by.d.cts +4 -0
- package/dist/adapter/prisma/utils/parse-order-by.d.mts +4 -0
- package/dist/adapter/prisma/utils/parse-order-by.d.ts +4 -0
- package/dist/adapter/prisma/utils/parse-recursive.d.cts +4 -0
- package/dist/adapter/prisma/utils/parse-recursive.d.mts +4 -0
- package/dist/adapter/prisma/utils/parse-recursive.d.ts +4 -0
- package/dist/adapter/prisma/utils/parse-where.d.cts +4 -0
- package/dist/adapter/prisma/utils/parse-where.d.mts +4 -0
- package/dist/adapter/prisma/utils/parse-where.d.ts +4 -0
- package/dist/base-crud-handler.d.cts +9 -0
- package/dist/base-crud-handler.d.mts +9 -0
- package/dist/base-crud-handler.d.ts +9 -0
- package/dist/handler/create.d.cts +11 -0
- package/dist/handler/create.d.mts +11 -0
- package/dist/handler/create.d.ts +11 -0
- package/dist/handler/delete.d.cts +7 -0
- package/dist/handler/delete.d.mts +7 -0
- package/dist/handler/delete.d.ts +7 -0
- package/dist/handler/list.d.cts +9 -0
- package/dist/handler/list.d.mts +9 -0
- package/dist/handler/list.d.ts +9 -0
- package/dist/handler/read.d.cts +7 -0
- package/dist/handler/read.d.mts +7 -0
- package/dist/handler/read.d.ts +7 -0
- package/dist/handler/update.d.cts +11 -0
- package/dist/handler/update.d.mts +11 -0
- package/dist/handler/update.d.ts +11 -0
- package/dist/index.cjs +13 -0
- package/dist/index.d.cts +6 -0
- package/dist/index.d.mts +6 -127
- package/dist/index.d.ts +6 -127
- package/dist/index.mjs +3 -1085
- package/dist/next/api/edge/index.d.cts +3 -0
- package/dist/next/api/edge/index.d.mts +3 -0
- package/dist/next/api/edge/index.d.ts +3 -0
- package/dist/next/api/node/index.d.cts +4 -0
- package/dist/next/api/node/index.d.mts +4 -0
- package/dist/next/api/node/index.d.ts +4 -0
- package/dist/next/index.cjs +11 -0
- package/dist/next/index.d.cts +2 -0
- package/dist/next/index.d.mts +2 -8
- package/dist/next/index.d.ts +2 -8
- package/dist/next/index.mjs +2 -4832
- package/dist/packem_shared/PrismaAdapter-BTCwgMow.cjs +324 -0
- package/dist/packem_shared/PrismaAdapter-dVBZvBOv.mjs +318 -0
- package/dist/packem_shared/RouteType-Bk3uAK0x.cjs +14 -0
- package/dist/packem_shared/RouteType-CB2xrWdf.mjs +10 -0
- package/dist/packem_shared/base-crud-handler-B3eCO4up.cjs +572 -0
- package/dist/packem_shared/base-crud-handler-DgrOMhoH.mjs +587 -0
- package/dist/packem_shared/edgeHandler-B4JJXPUI.mjs +16 -0
- package/dist/packem_shared/edgeHandler-CDFgDdrG.cjs +18 -0
- package/dist/packem_shared/get-accessible-routes-C6NF9Iry.cjs +16 -0
- package/dist/packem_shared/get-accessible-routes-sV5SDdFn.mjs +14 -0
- package/dist/packem_shared/models-to-route-names-CdwsK0V1.mjs +9 -0
- package/dist/packem_shared/models-to-route-names-Dv94PzhE.cjs +11 -0
- package/dist/{index.js → packem_shared/modelsToOpenApi-BuGL_l3R.cjs} +66 -453
- package/dist/packem_shared/modelsToOpenApi-Bux3khmh.mjs +706 -0
- package/dist/packem_shared/nodeHandler-BUWSKNyo.cjs +16 -0
- package/dist/packem_shared/nodeHandler-DSq7vHzv.mjs +14 -0
- package/dist/query-parser.d.cts +3 -0
- package/dist/query-parser.d.mts +3 -0
- package/dist/query-parser.d.ts +3 -0
- package/dist/swagger/adapter/prisma/index.d.cts +22 -0
- package/dist/swagger/adapter/prisma/index.d.mts +22 -0
- package/dist/swagger/adapter/prisma/index.d.ts +22 -0
- package/dist/swagger/json-schema-parser.d.cts +18 -0
- package/dist/swagger/json-schema-parser.d.mts +18 -0
- package/dist/swagger/json-schema-parser.d.ts +18 -0
- package/dist/swagger/parameters.d.cts +5 -0
- package/dist/swagger/parameters.d.mts +5 -0
- package/dist/swagger/parameters.d.ts +5 -0
- package/dist/swagger/types.d.cts +39 -0
- package/dist/swagger/types.d.mts +39 -0
- package/dist/swagger/types.d.ts +39 -0
- package/dist/swagger/utils/format-example-ref.d.cts +2 -0
- package/dist/swagger/utils/format-example-ref.d.mts +2 -0
- package/dist/swagger/utils/format-example-ref.d.ts +2 -0
- package/dist/swagger/utils/format-schema-ref.d.cts +2 -0
- package/dist/swagger/utils/format-schema-ref.d.mts +2 -0
- package/dist/swagger/utils/format-schema-ref.d.ts +2 -0
- package/dist/swagger/utils/get-models-accessible-routes.d.cts +4 -0
- package/dist/swagger/utils/get-models-accessible-routes.d.mts +4 -0
- package/dist/swagger/utils/get-models-accessible-routes.d.ts +4 -0
- package/dist/swagger/utils/get-swagger-paths.d.cts +12 -0
- package/dist/swagger/utils/get-swagger-paths.d.mts +12 -0
- package/dist/swagger/utils/get-swagger-paths.d.ts +12 -0
- package/dist/swagger/utils/get-swagger-tags.d.cts +4 -0
- package/dist/swagger/utils/get-swagger-tags.d.mts +4 -0
- package/dist/swagger/utils/get-swagger-tags.d.ts +4 -0
- package/dist/types.d.cts +106 -0
- package/dist/types.d.mts +106 -0
- package/dist/types.d.ts +106 -0
- package/dist/utils/format-resource-id.d.cts +2 -0
- package/dist/utils/format-resource-id.d.mts +2 -0
- package/dist/utils/format-resource-id.d.ts +2 -0
- package/dist/utils/get-accessible-routes.d.cts +3 -0
- package/dist/utils/get-accessible-routes.d.mts +3 -0
- package/dist/utils/get-accessible-routes.d.ts +3 -0
- package/dist/utils/get-resource-name-from-url.d.cts +5 -0
- package/dist/utils/get-resource-name-from-url.d.mts +5 -0
- package/dist/utils/get-resource-name-from-url.d.ts +5 -0
- package/dist/utils/get-route-type.d.cts +7 -0
- package/dist/utils/get-route-type.d.mts +7 -0
- package/dist/utils/get-route-type.d.ts +7 -0
- package/dist/utils/is-primitive.d.cts +2 -0
- package/dist/utils/is-primitive.d.mts +2 -0
- package/dist/utils/is-primitive.d.ts +2 -0
- package/dist/utils/validate-adapter-methods.d.cts +3 -0
- package/dist/utils/validate-adapter-methods.d.mts +3 -0
- package/dist/utils/validate-adapter-methods.d.ts +3 -0
- package/package.json +38 -19
- package/dist/chunk-5I2B5KQG.js +0 -77
- package/dist/chunk-5I2B5KQG.js.map +0 -1
- package/dist/chunk-LBXJKEOF.mjs +0 -73
- package/dist/chunk-LBXJKEOF.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/next/index.js +0 -4839
- package/dist/next/index.js.map +0 -1
- package/dist/next/index.mjs.map +0 -1
- package/dist/types-C5c2M01-.d.mts +0 -138
- 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 };
|