vsrepo 1.2.6 → 1.2.7

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 (55) hide show
  1. package/README.md +296 -437
  2. package/{VSRepository → dist}/VSRepoError.d.ts +1 -1
  3. package/dist/VSRepoError.js +17 -0
  4. package/{VSRepository → dist}/VSRepository.d.ts +937 -907
  5. package/dist/VSRepository.js +204 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +17 -0
  8. package/dist/internal/errors/types/vs-repo-error-type.type.js +2 -0
  9. package/dist/internal/errors/vs-repo.error.js +27 -0
  10. package/dist/internal/resolvers/base-methods.resolve.js +535 -0
  11. package/dist/internal/resolvers/create-update-payloads-with-relations.resolve.js +143 -0
  12. package/dist/internal/resolvers/data-payload-with-relations.resolve.js +60 -0
  13. package/dist/internal/resolvers/dbAndPrismaArgs.resolve.js +46 -0
  14. package/dist/internal/resolvers/dinamic-method-customization.resolve.js +45 -0
  15. package/dist/internal/resolvers/dinamic-method-info.resolve.js +265 -0
  16. package/dist/internal/resolvers/merge-wheres.resolve.js +22 -0
  17. package/dist/internal/resolvers/pretty-wheres.resolve.js +87 -0
  18. package/dist/internal/resolvers/select.resolve.js +7 -0
  19. package/dist/internal/resolvers/specific-where.resolve.js +77 -0
  20. package/dist/internal/resolvers/types/base-method-function.type.js +2 -0
  21. package/dist/internal/resolvers/types/dinamic-method-customization.type.js +2 -0
  22. package/dist/internal/resolvers/types/dinamic-method-info.type.js +2 -0
  23. package/dist/internal/resolvers/types/dinamic-method-where-ops.type.js +2 -0
  24. package/dist/internal/resolvers/types/pretty-where.type.js +2 -0
  25. package/dist/internal/resolvers/types/prisma-args.type.js +2 -0
  26. package/dist/internal/resolvers/types/repository-build-instance.type.js +2 -0
  27. package/dist/internal/resolvers/types/resolve-db-and-prisma-args-data.type.js +2 -0
  28. package/dist/internal/resolvers/types/ugly-where.type.js +2 -0
  29. package/dist/internal/resolvers/ugly-where.resolve.js +178 -0
  30. package/dist/internal/utils/logger.util.js +21 -0
  31. package/dist/internal/utils/schemas.util.js +10 -0
  32. package/dist/internal/utils/uncapitalize.util.js +6 -0
  33. package/dist/internal/validation/build-config.validate.js +84 -0
  34. package/dist/internal/validation/constructor-config.validate.js +68 -0
  35. package/dist/internal/validation/extension.validate.js +15 -0
  36. package/dist/internal/validation/is-object.validate.js +6 -0
  37. package/dist/internal/validation/method-options.validate.js +26 -0
  38. package/dist/internal/validation/obj-with-relations.validate.js +37 -0
  39. package/dist/internal/validation/prisma-client.validate.js +10 -0
  40. package/dist/internal/validation/types/base-methods.type.js +2 -0
  41. package/dist/internal/validation/types/build-config.type.js +2 -0
  42. package/dist/internal/validation/types/constructor-config.type.js +2 -0
  43. package/dist/internal/validation/types/method-options.type.js +2 -0
  44. package/dist/internal/validation/types/method.type.js +2 -0
  45. package/dist/internal/validation/types/pagination.type.js +2 -0
  46. package/dist/internal/validation/types/relation.type.js +2 -0
  47. package/dist/internal/validation/types/see-mode.type.js +2 -0
  48. package/package.json +72 -70
  49. package/scripts/configure-prisma-import.mjs +3 -3
  50. package/scripts/copy-types.mjs +24 -0
  51. package/VSRepository/VSRepoError.js +0 -33
  52. package/VSRepository/VSRepoUtils.js +0 -155
  53. package/VSRepository/VSRepository.js +0 -1445
  54. package/VSRepository/index.d.ts +0 -2
  55. package/VSRepository/index.js +0 -2
@@ -0,0 +1,535 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolveBaseMethods = resolveBaseMethods;
7
+ const vs_repo_error_1 = require("../errors/vs-repo.error");
8
+ const logger_util_1 = require("../utils/logger.util");
9
+ const is_object_validate_1 = require("../validation/is-object.validate");
10
+ const method_options_validate_1 = require("../validation/method-options.validate");
11
+ const obj_with_relations_validate_1 = require("../validation/obj-with-relations.validate");
12
+ const create_update_payloads_with_relations_resolve_1 = require("./create-update-payloads-with-relations.resolve");
13
+ const data_payload_with_relations_resolve_1 = require("./data-payload-with-relations.resolve");
14
+ const dbAndPrismaArgs_resolve_1 = require("./dbAndPrismaArgs.resolve");
15
+ const deepmerge_1 = __importDefault(require("deepmerge"));
16
+ function resolveBaseMethods(instance, config) {
17
+ const { baseMethods, showWorking } = config;
18
+ const { tableName, pkName, relations, softRemovekName } = instance;
19
+ const relationsKeys = relations ? Object.keys(relations) : [];
20
+ // * GET
21
+ if (baseMethods.get.active) {
22
+ instance.get = async (pk, options) => {
23
+ if (pk == undefined)
24
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
25
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
26
+ instance,
27
+ baseConfig: baseMethods.get,
28
+ options,
29
+ wherePkValue: pk,
30
+ });
31
+ const start = showWorking
32
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "get", prismaArgs)
33
+ : undefined;
34
+ const result = await db[tableName].findUnique(prismaArgs);
35
+ if (showWorking)
36
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "get", start);
37
+ return result;
38
+ };
39
+ }
40
+ // * GET OR THROW
41
+ if (baseMethods.getOrThrow.active) {
42
+ instance.getOrThrow = async (pk, options) => {
43
+ if (pk == undefined)
44
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
45
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
46
+ instance,
47
+ baseConfig: baseMethods.getOrThrow,
48
+ options,
49
+ wherePkValue: pk,
50
+ });
51
+ const start = showWorking
52
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "getOrThrow", prismaArgs)
53
+ : undefined;
54
+ const result = await db[tableName].findUnique(prismaArgs);
55
+ if (showWorking)
56
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "getOrThrow", start);
57
+ if (!result) {
58
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) No record was found for the provided primary key.`, "20727");
59
+ }
60
+ return result;
61
+ };
62
+ }
63
+ // * GET LIST
64
+ if (baseMethods.getList.active) {
65
+ instance.getList = async (pks, options) => {
66
+ if (!Array.isArray(pks) || pks.some(pk => pk == undefined))
67
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pks' must an array of primary keys.`);
68
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
69
+ instance,
70
+ baseConfig: baseMethods.getList,
71
+ options,
72
+ wherePkValue: { in: pks },
73
+ });
74
+ const start = showWorking
75
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "getList", prismaArgs)
76
+ : undefined;
77
+ const result = await db[tableName].findMany(prismaArgs);
78
+ if (showWorking)
79
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "getList", start);
80
+ return result;
81
+ };
82
+ }
83
+ // * GET ALL
84
+ if (baseMethods.getAll.active) {
85
+ instance.getAll = async (options) => {
86
+ if (options !== undefined && !(0, is_object_validate_1.isObject)(options))
87
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'options' must be a valid object.`);
88
+ const { pagination, order, ...restOptions } = options ?? {};
89
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
90
+ instance,
91
+ baseConfig: baseMethods.getAll,
92
+ options: restOptions,
93
+ pagination,
94
+ ordenation: order,
95
+ });
96
+ const start = showWorking
97
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "getAll", prismaArgs)
98
+ : undefined;
99
+ const result = await db[tableName].findMany(prismaArgs);
100
+ if (showWorking)
101
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "getAll", start);
102
+ return result;
103
+ };
104
+ }
105
+ // * REMOVE
106
+ if (baseMethods.remove.active) {
107
+ instance.remove = async (pk, options) => {
108
+ if (pk == undefined)
109
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
110
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
111
+ instance,
112
+ baseConfig: baseMethods.remove,
113
+ options,
114
+ wherePkValue: pk,
115
+ });
116
+ const start = showWorking
117
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "remove", prismaArgs)
118
+ : undefined;
119
+ const result = await db[tableName].delete(prismaArgs);
120
+ if (showWorking)
121
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "remove", start);
122
+ return result;
123
+ };
124
+ }
125
+ // * REMOVE LIST
126
+ if (baseMethods.removeList.active) {
127
+ instance.removeList = async (pks, options) => {
128
+ if (!Array.isArray(pks) || pks.some(pk => pk == undefined))
129
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pks' must an array of primary keys.`);
130
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
131
+ instance,
132
+ baseConfig: baseMethods.removeList,
133
+ options,
134
+ wherePkValue: { in: pks },
135
+ withoutSelect: true,
136
+ });
137
+ const start = showWorking
138
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "removeList", prismaArgs)
139
+ : undefined;
140
+ const result = await db[tableName].deleteMany(prismaArgs);
141
+ if (showWorking)
142
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "removeList", start);
143
+ return result;
144
+ };
145
+ }
146
+ // * TOTAL
147
+ if (baseMethods.total.active) {
148
+ instance.total = async (options) => {
149
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
150
+ instance,
151
+ baseConfig: baseMethods.total,
152
+ options,
153
+ withoutSelect: true,
154
+ });
155
+ const start = showWorking
156
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "total", prismaArgs)
157
+ : undefined;
158
+ const result = await db[tableName].count(prismaArgs);
159
+ if (showWorking)
160
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "total", start);
161
+ return result;
162
+ };
163
+ }
164
+ // * HAS
165
+ if (baseMethods.has.active) {
166
+ instance.has = async (pk, options) => {
167
+ if (pk == undefined)
168
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
169
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
170
+ instance,
171
+ baseConfig: baseMethods.has,
172
+ options,
173
+ wherePkValue: pk,
174
+ specificSelect: { [pkName]: true },
175
+ });
176
+ const start = showWorking
177
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "has", prismaArgs)
178
+ : undefined;
179
+ const result = await db[tableName].findUnique(prismaArgs);
180
+ if (showWorking)
181
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "has", start);
182
+ return !!result;
183
+ };
184
+ }
185
+ // * MERGE
186
+ if (baseMethods.merge.active) {
187
+ instance.merge = async (pk, obj, options) => {
188
+ if (pk == undefined)
189
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
190
+ if (!(0, is_object_validate_1.isObject)(obj)) {
191
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'obj' must be a valid object.`);
192
+ }
193
+ (0, obj_with_relations_validate_1.validateObjWithRelations)(instance, obj, relationsKeys);
194
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
195
+ instance,
196
+ baseConfig: baseMethods.merge,
197
+ options,
198
+ wherePkValue: pk,
199
+ });
200
+ const start = showWorking
201
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "merge", prismaArgs)
202
+ : undefined;
203
+ const result = await db[tableName].findUnique(prismaArgs);
204
+ if (!result) {
205
+ if (showWorking)
206
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "merge", start);
207
+ return null;
208
+ }
209
+ if (!relations) {
210
+ if (showWorking)
211
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "merge", start);
212
+ return (0, deepmerge_1.default)(result, obj, {
213
+ arrayMerge: (target, source) => target.concat(source),
214
+ });
215
+ }
216
+ const objKeys = Object.keys(obj);
217
+ const objAny = obj;
218
+ for (let i = 0; i < objKeys.length; i++) {
219
+ const key = objKeys[i];
220
+ if (!relationsKeys.includes(key)) {
221
+ result[key] = objAny[key];
222
+ continue;
223
+ }
224
+ const relation = relations[key];
225
+ if ((relation.mode === "oto" || relation.mode === "mto") && (0, is_object_validate_1.isObject)(result[key])) {
226
+ result[key] = objAny[key] === null ? null : (0, deepmerge_1.default)(result[key], objAny[key]);
227
+ continue;
228
+ }
229
+ else if ((relation.mode === "mtm" || relation.mode === "otm") &&
230
+ Array.isArray(result[key])) {
231
+ const targetArray = result[key];
232
+ const sourceArray = objAny[key];
233
+ const relationPk = relation.pk;
234
+ const targetMap = new Map();
235
+ const targetWithoutPk = [];
236
+ const sourceWithoutPk = [];
237
+ for (let i = 0; i < targetArray.length; i++) {
238
+ const item = targetArray[i];
239
+ if (item[relationPk] !== undefined) {
240
+ targetMap.set(item[relationPk], item);
241
+ }
242
+ else {
243
+ targetWithoutPk.push(item);
244
+ }
245
+ }
246
+ for (let i = 0; i < sourceArray.length; i++) {
247
+ const sourceItem = sourceArray[i];
248
+ if (sourceItem[relationPk] !== undefined) {
249
+ const targetItem = targetMap.get(sourceItem[relationPk]);
250
+ if (targetItem) {
251
+ targetMap.set(sourceItem[relationPk], (0, deepmerge_1.default)(targetItem, sourceItem));
252
+ }
253
+ else {
254
+ targetMap.set(sourceItem[relationPk], sourceItem);
255
+ }
256
+ }
257
+ else {
258
+ sourceWithoutPk.push(sourceItem);
259
+ }
260
+ }
261
+ result[key] = [...targetMap.values(), ...targetWithoutPk, ...sourceWithoutPk];
262
+ continue;
263
+ }
264
+ result[key] = objAny[key];
265
+ }
266
+ if (showWorking)
267
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "merge", start);
268
+ return result;
269
+ };
270
+ }
271
+ // * SOFT REMOVE
272
+ if (baseMethods.softRemove.active && softRemovekName) {
273
+ instance.softRemove = async (pk, options) => {
274
+ if (pk == undefined)
275
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
276
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
277
+ instance,
278
+ baseConfig: baseMethods.softRemove,
279
+ options,
280
+ wherePkValue: pk,
281
+ forceSeeMode: "all",
282
+ dataPayload: { [softRemovekName]: new Date() },
283
+ });
284
+ const start = showWorking
285
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "softRemove", prismaArgs)
286
+ : undefined;
287
+ const result = await db[tableName].update(prismaArgs);
288
+ if (showWorking)
289
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "softRemove", start);
290
+ return result;
291
+ };
292
+ }
293
+ // * SOFT REMOVE LIST
294
+ if (baseMethods.softRemoveList.active && softRemovekName) {
295
+ instance.softRemoveList = async (pks, options) => {
296
+ if (!Array.isArray(pks) || pks.some(pk => pk == undefined))
297
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pks' must an array of primary keys.`);
298
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
299
+ instance,
300
+ baseConfig: baseMethods.softRemoveList,
301
+ options,
302
+ wherePkValue: { in: pks },
303
+ withoutSelect: true,
304
+ forceSeeMode: "all",
305
+ dataPayload: { [softRemovekName]: new Date() },
306
+ });
307
+ const start = showWorking
308
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "softRemoveList", prismaArgs)
309
+ : undefined;
310
+ const result = await db[tableName].updateMany(prismaArgs);
311
+ if (showWorking)
312
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "softRemoveList", start);
313
+ return result;
314
+ };
315
+ }
316
+ // * RESTORE
317
+ if (baseMethods.restore.active && softRemovekName) {
318
+ instance.restore = async (pk, options) => {
319
+ if (pk == undefined)
320
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
321
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
322
+ instance,
323
+ baseConfig: baseMethods.restore,
324
+ options,
325
+ wherePkValue: pk,
326
+ forceSeeMode: "all",
327
+ dataPayload: { [softRemovekName]: null },
328
+ });
329
+ const start = showWorking
330
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "restore", prismaArgs)
331
+ : undefined;
332
+ const result = await db[tableName].update(prismaArgs);
333
+ if (showWorking)
334
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "restore", start);
335
+ return result;
336
+ };
337
+ }
338
+ // * RESTORE LIST
339
+ if (baseMethods.restoreList.active && softRemovekName) {
340
+ instance.restoreList = async (pks, options) => {
341
+ if (!Array.isArray(pks) || pks.some(pk => pk == undefined))
342
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pks' must an array of primary keys.`);
343
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
344
+ instance,
345
+ baseConfig: baseMethods.restoreList,
346
+ options,
347
+ withoutSelect: true,
348
+ wherePkValue: { in: pks },
349
+ forceSeeMode: "all",
350
+ dataPayload: { [softRemovekName]: null },
351
+ });
352
+ const start = showWorking
353
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "restoreList", prismaArgs)
354
+ : undefined;
355
+ const result = await db[tableName].updateMany(prismaArgs);
356
+ if (showWorking)
357
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "restoreList", start);
358
+ return result;
359
+ };
360
+ }
361
+ // * SAVE
362
+ if (baseMethods.save.active) {
363
+ instance.save = async (obj, options) => {
364
+ if (!(0, is_object_validate_1.isObject)(obj)) {
365
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'obj' must be a valid object.`);
366
+ }
367
+ (0, obj_with_relations_validate_1.validateObjWithRelations)(instance, obj, relationsKeys);
368
+ const objAny = obj;
369
+ if (objAny[pkName] === undefined) {
370
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
371
+ instance,
372
+ baseConfig: baseMethods.save,
373
+ options,
374
+ withoutWhere: true,
375
+ dataPayload: (0, data_payload_with_relations_resolve_1.resolveDataPayloadWithRelations)(instance, objAny, relationsKeys),
376
+ });
377
+ const start = showWorking
378
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "save", prismaArgs)
379
+ : undefined;
380
+ const result = await db[tableName].create(prismaArgs);
381
+ if (showWorking)
382
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "save", start);
383
+ return result;
384
+ }
385
+ else {
386
+ const { createPayload, updatePayload } = (0, create_update_payloads_with_relations_resolve_1.resolveCreateUpdatePayloadsWithRelations)(instance, obj, relationsKeys);
387
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
388
+ instance,
389
+ baseConfig: baseMethods.save,
390
+ options,
391
+ wherePkValue: objAny[pkName],
392
+ createPayload,
393
+ updatePayload,
394
+ });
395
+ const start = showWorking
396
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "save", prismaArgs)
397
+ : undefined;
398
+ const result = await db[tableName].upsert(prismaArgs);
399
+ if (showWorking)
400
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "save", start);
401
+ return result;
402
+ }
403
+ };
404
+ }
405
+ // * SAVE LIST
406
+ if (baseMethods.saveList.active) {
407
+ instance.saveList = async (objs, options) => {
408
+ if (!Array.isArray(objs) || objs.some(ob => !(0, is_object_validate_1.isObject)(ob))) {
409
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'objs' must be an array of valid objects.`);
410
+ }
411
+ const validatedOptions = (0, method_options_validate_1.validateMethodOptions)(options, instance);
412
+ const argsList = [];
413
+ const queries = objs.map(obj => {
414
+ (0, obj_with_relations_validate_1.validateObjWithRelations)(instance, obj, relationsKeys);
415
+ const objAny = obj;
416
+ if (objAny[pkName] === undefined) {
417
+ const { prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
418
+ instance,
419
+ baseConfig: baseMethods.saveList,
420
+ options: validatedOptions,
421
+ alreadyValidatedOptions: true,
422
+ withoutWhere: true,
423
+ dataPayload: (0, data_payload_with_relations_resolve_1.resolveDataPayloadWithRelations)(instance, objAny, relationsKeys),
424
+ });
425
+ argsList.push(prismaArgs);
426
+ return (db) => db[tableName].create(prismaArgs);
427
+ }
428
+ else {
429
+ const { createPayload, updatePayload } = (0, create_update_payloads_with_relations_resolve_1.resolveCreateUpdatePayloadsWithRelations)(instance, obj, relationsKeys);
430
+ const { prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
431
+ instance,
432
+ baseConfig: baseMethods.saveList,
433
+ options: validatedOptions,
434
+ alreadyValidatedOptions: true,
435
+ wherePkValue: objAny[pkName],
436
+ createPayload,
437
+ updatePayload,
438
+ });
439
+ argsList.push(prismaArgs);
440
+ return (db) => db[tableName].upsert(prismaArgs);
441
+ }
442
+ });
443
+ const start = showWorking
444
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "saveList", argsList)
445
+ : undefined;
446
+ const results = [];
447
+ if (validatedOptions.db) {
448
+ for (let i = 0; i < queries.length; i++) {
449
+ results.push(await queries[i](validatedOptions.db));
450
+ }
451
+ }
452
+ else {
453
+ await instance.prisma.$transaction(async (tx) => {
454
+ for (let i = 0; i < queries.length; i++) {
455
+ results.push(await queries[i](tx));
456
+ }
457
+ });
458
+ }
459
+ if (showWorking)
460
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "saveList", start);
461
+ return results;
462
+ };
463
+ }
464
+ // * PATCH
465
+ if (baseMethods.patch.active) {
466
+ instance.patch = async (pk, obj, options) => {
467
+ if (pk == undefined)
468
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'pk' must be provided.`);
469
+ if (!(0, is_object_validate_1.isObject)(obj)) {
470
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'obj' must be a valid object.`);
471
+ }
472
+ (0, obj_with_relations_validate_1.validateObjWithRelations)(instance, obj, relationsKeys);
473
+ const { updatePayload } = (0, create_update_payloads_with_relations_resolve_1.resolveCreateUpdatePayloadsWithRelations)(instance, obj, relationsKeys);
474
+ const { db, prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
475
+ instance,
476
+ baseConfig: baseMethods.patch,
477
+ options,
478
+ wherePkValue: pk,
479
+ dataPayload: updatePayload,
480
+ });
481
+ const start = showWorking
482
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "patch", prismaArgs)
483
+ : undefined;
484
+ const result = await db[tableName].update(prismaArgs);
485
+ if (showWorking)
486
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "patch", start);
487
+ return result;
488
+ };
489
+ }
490
+ // * PATCH LIST
491
+ if (baseMethods.patchList.active) {
492
+ instance.patchList = async (tuples, options) => {
493
+ if (!Array.isArray(tuples) ||
494
+ tuples.some(tuple => tuple[0] == undefined || !(0, is_object_validate_1.isObject)(tuple[1]))) {
495
+ throw new vs_repo_error_1.VSRepoRuntimeError(`[VSRepository] (${tableName}: runtime) 'tuples' must be a valid array of tuples [pk, obj].`);
496
+ }
497
+ const validatedOptions = (0, method_options_validate_1.validateMethodOptions)(options, instance);
498
+ const argsList = [];
499
+ const queries = tuples.map(tuple => {
500
+ (0, obj_with_relations_validate_1.validateObjWithRelations)(instance, tuple[1], relationsKeys);
501
+ const objAny = tuple[1];
502
+ const { updatePayload } = (0, create_update_payloads_with_relations_resolve_1.resolveCreateUpdatePayloadsWithRelations)(instance, objAny, relationsKeys);
503
+ const { prismaArgs } = (0, dbAndPrismaArgs_resolve_1.resolveDbAndPrismaArgs)({
504
+ instance,
505
+ baseConfig: baseMethods.patchList,
506
+ options: validatedOptions,
507
+ alreadyValidatedOptions: true,
508
+ wherePkValue: tuple[0],
509
+ dataPayload: updatePayload,
510
+ });
511
+ argsList.push(prismaArgs);
512
+ return (db) => db[tableName].update(prismaArgs);
513
+ });
514
+ const start = showWorking
515
+ ? (0, logger_util_1.performanceLoggerStart)(tableName, "patchList", argsList)
516
+ : undefined;
517
+ const results = [];
518
+ if (validatedOptions.db) {
519
+ for (let i = 0; i < queries.length; i++) {
520
+ results.push(await queries[i](validatedOptions.db));
521
+ }
522
+ }
523
+ else {
524
+ await instance.prisma.$transaction(async (tx) => {
525
+ for (let i = 0; i < queries.length; i++) {
526
+ results.push(await queries[i](tx));
527
+ }
528
+ });
529
+ }
530
+ if (showWorking)
531
+ (0, logger_util_1.performanceLoggerEnd)(tableName, "patchList", start);
532
+ return results;
533
+ };
534
+ }
535
+ }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveCreateUpdatePayloadsWithRelations = resolveCreateUpdatePayloadsWithRelations;
4
+ function resolveCreateUpdatePayloadsWithRelations(instance, obj, relationsKeys) {
5
+ const relations = instance.relations;
6
+ if (!relations) {
7
+ const objUpdate = { ...obj };
8
+ delete objUpdate[instance.pkName];
9
+ return {
10
+ createPayload: obj,
11
+ updatePayload: objUpdate,
12
+ };
13
+ }
14
+ const createPayload = {};
15
+ const updatePayload = {};
16
+ const objKeys = Object.keys(obj);
17
+ for (let i = 0; i < objKeys.length; i++) {
18
+ const key = objKeys[i];
19
+ const field = obj[key];
20
+ if (field === undefined)
21
+ continue;
22
+ if (relationsKeys.includes(key)) {
23
+ const relation = relations[key];
24
+ if (relation.mode === "oto" || relation.mode === "mto") {
25
+ if (field === null) {
26
+ if (relation.mode === "oto" && relation.restriction === "set") {
27
+ updatePayload[key] = { delete: true };
28
+ }
29
+ else if (relation.mode === "mto" && (relation.nullAble || relation.nullable)) {
30
+ updatePayload[key] = { disconnect: true };
31
+ }
32
+ }
33
+ else if (field !== undefined) {
34
+ const relationFieldPk = field[relation.pk];
35
+ if (relationFieldPk != null) {
36
+ const connectOrCreate = {
37
+ where: { [relation.pk]: relationFieldPk },
38
+ create: field,
39
+ };
40
+ createPayload[key] = { connectOrCreate };
41
+ if (relation.restriction === "add") {
42
+ updatePayload[key] = { connectOrCreate };
43
+ }
44
+ else {
45
+ const update = { ...field };
46
+ delete update[relation.pk];
47
+ updatePayload[key] = {
48
+ upsert: {
49
+ where: { [relation.pk]: relationFieldPk },
50
+ create: field,
51
+ update: update,
52
+ },
53
+ };
54
+ }
55
+ }
56
+ else {
57
+ createPayload[key] = { create: field };
58
+ updatePayload[key] =
59
+ relation.restriction === "add"
60
+ ? { create: field }
61
+ : { upsert: { create: field, update: field } };
62
+ }
63
+ }
64
+ }
65
+ else {
66
+ const fieldAnyArray = field;
67
+ const dataWithPk = [];
68
+ const dataWithoutPk = [];
69
+ fieldAnyArray.forEach((data) => {
70
+ if (data[relation.pk] !== undefined) {
71
+ dataWithPk.push(data);
72
+ }
73
+ else {
74
+ dataWithoutPk.push(data);
75
+ }
76
+ });
77
+ const connectOrCreate = dataWithPk.map(data => ({
78
+ where: { [relation.pk]: data[relation.pk] },
79
+ create: data,
80
+ }));
81
+ createPayload[key] = {
82
+ create: dataWithoutPk,
83
+ connectOrCreate,
84
+ };
85
+ if (relation.restriction === "add") {
86
+ if (relation.mode === "mtm") {
87
+ updatePayload[key] = {
88
+ create: dataWithoutPk,
89
+ connectOrCreate,
90
+ };
91
+ }
92
+ else {
93
+ updatePayload[key] = {
94
+ create: dataWithoutPk,
95
+ upsert: dataWithPk.map(data => {
96
+ const update = { ...data };
97
+ delete update[relation.pk];
98
+ return {
99
+ where: { [relation.pk]: data[relation.pk] },
100
+ create: data,
101
+ update,
102
+ };
103
+ }),
104
+ };
105
+ }
106
+ }
107
+ else {
108
+ if (relation.mode === "mtm") {
109
+ updatePayload[key] = {
110
+ set: [],
111
+ create: dataWithoutPk,
112
+ connectOrCreate,
113
+ };
114
+ }
115
+ else {
116
+ updatePayload[key] = {
117
+ deleteMany: {
118
+ [relation.pk]: { notIn: dataWithPk.map(data => data[relation.pk]) },
119
+ },
120
+ create: dataWithoutPk,
121
+ upsert: dataWithPk.map(data => {
122
+ const update = { ...data };
123
+ delete update[relation.pk];
124
+ return {
125
+ where: { [relation.pk]: data[relation.pk] },
126
+ create: data,
127
+ update,
128
+ };
129
+ }),
130
+ };
131
+ }
132
+ }
133
+ }
134
+ }
135
+ else {
136
+ createPayload[key] = field;
137
+ if (key !== instance.pkName) {
138
+ updatePayload[key] = field;
139
+ }
140
+ }
141
+ }
142
+ return { createPayload, updatePayload };
143
+ }