@zenstackhq/runtime 1.3.2 → 1.4.1
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/constants.js +2 -2
- package/constants.js.map +1 -1
- package/cross/index.d.mts +6 -2
- package/cross/index.d.ts +6 -2
- package/cross/index.js +54 -55
- package/cross/index.js.map +1 -1
- package/cross/index.mjs +53 -55
- package/cross/index.mjs.map +1 -1
- package/enhancements/enhance.js.map +1 -1
- package/enhancements/omit.js.map +1 -1
- package/enhancements/password.js.map +1 -1
- package/enhancements/policy/handler.js +56 -12
- package/enhancements/policy/handler.js.map +1 -1
- package/enhancements/policy/index.js.map +1 -1
- package/enhancements/policy/logger.js.map +1 -1
- package/enhancements/policy/policy-utils.js +32 -11
- package/enhancements/policy/policy-utils.js.map +1 -1
- package/enhancements/policy/promise.js.map +1 -1
- package/enhancements/proxy.js.map +1 -1
- package/enhancements/utils.js.map +1 -1
- package/enhancements/where-visitor.js.map +1 -1
- package/error.js.map +1 -1
- package/loader.js.map +1 -1
- package/package.json +2 -1
- package/validation.js.map +1 -1
- package/version.js +11 -11
- package/version.js.map +1 -1
package/constants.js
CHANGED
|
@@ -26,7 +26,7 @@ var CrudFailureReason;
|
|
|
26
26
|
* CRUD failed because of a data validation rule violation.
|
|
27
27
|
*/
|
|
28
28
|
CrudFailureReason["DATA_VALIDATION_VIOLATION"] = "DATA_VALIDATION_VIOLATION";
|
|
29
|
-
})(CrudFailureReason
|
|
29
|
+
})(CrudFailureReason || (exports.CrudFailureReason = CrudFailureReason = {}));
|
|
30
30
|
/**
|
|
31
31
|
* Prisma error codes used
|
|
32
32
|
*/
|
|
@@ -48,7 +48,7 @@ var PrismaErrorCode;
|
|
|
48
48
|
* An operation failed because it depends on one or more records that were required but not found
|
|
49
49
|
*/
|
|
50
50
|
PrismaErrorCode["DEPEND_ON_RECORD_NOT_FOUND"] = "P2025";
|
|
51
|
-
})(PrismaErrorCode
|
|
51
|
+
})(PrismaErrorCode || (exports.PrismaErrorCode = PrismaErrorCode = {}));
|
|
52
52
|
/**
|
|
53
53
|
* Field name for storing in-transaction flag
|
|
54
54
|
*/
|
package/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,yBAAyB,GAAG,WAAW,CAAC;AAErD;;GAEG;AACU,QAAA,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;GAEG;AACH,IAAY,iBAeX;AAfD,WAAY,iBAAiB;IACzB;;OAEG;IACH,wEAAmD,CAAA;IAEnD;;OAEG;IACH,gEAA2C,CAAA;IAE3C;;OAEG;IACH,4EAAuD,CAAA;AAC3D,CAAC,EAfW,iBAAiB,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,yBAAyB,GAAG,WAAW,CAAC;AAErD;;GAEG;AACU,QAAA,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;GAEG;AACH,IAAY,iBAeX;AAfD,WAAY,iBAAiB;IACzB;;OAEG;IACH,wEAAmD,CAAA;IAEnD;;OAEG;IACH,gEAA2C,CAAA;IAE3C;;OAEG;IACH,4EAAuD,CAAA;AAC3D,CAAC,EAfW,iBAAiB,iCAAjB,iBAAiB,QAe5B;AAED;;GAEG;AACH,IAAY,eAoBX;AApBD,WAAY,eAAe;IACvB;;OAEG;IACH,qDAAkC,CAAA;IAElC;;OAEG;IACH,+CAA4B,CAAA;IAE5B;;OAEG;IACH,gEAA6C,CAAA;IAE7C;;OAEG;IACH,uDAAoC,CAAA;AACxC,CAAC,EApBW,eAAe,+BAAf,eAAe,QAoB1B;AAED;;GAEG;AACU,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAE/C;;GAEG;AACU,QAAA,qBAAqB,GAAG,sBAAsB,CAAC;AAE5D;;GAEG;AACU,QAAA,sBAAsB,GAAG,OAAO,CAAC;AAE9C;;GAEG;AACU,QAAA,yBAAyB,GAAG,gBAAgB,CAAC;AAE1D;;GAEG;AACU,QAAA,+BAA+B,GAAG,iBAAiB,CAAC;AAEjE;;GAEG;AACU,QAAA,iCAAiC,GAAG,iBAAiB,CAAC;AAEnE;;GAEG;AACU,QAAA,+BAA+B,GAAG,mBAAmB,CAAC;AAEnE;;GAEG;AACU,QAAA,2BAA2B,GAAG,qBAAqB,CAAC"}
|
package/cross/index.d.mts
CHANGED
|
@@ -105,7 +105,11 @@ type ModelMeta = {
|
|
|
105
105
|
/**
|
|
106
106
|
* Resolves a model field to its metadata. Returns undefined if not found.
|
|
107
107
|
*/
|
|
108
|
-
declare function resolveField(modelMeta: ModelMeta, model: string, field: string): FieldInfo
|
|
108
|
+
declare function resolveField(modelMeta: ModelMeta, model: string, field: string): FieldInfo;
|
|
109
|
+
/**
|
|
110
|
+
* Resolves a model field to its metadata. Throws an error if not found.
|
|
111
|
+
*/
|
|
112
|
+
declare function requireField(modelMeta: ModelMeta, model: string, field: string): FieldInfo;
|
|
109
113
|
/**
|
|
110
114
|
* Gets all fields of a model.
|
|
111
115
|
*/
|
|
@@ -258,4 +262,4 @@ declare function enumerate<T>(x: Enumerable<T>): T[];
|
|
|
258
262
|
declare function zip<T1, T2>(x: Enumerable<T1>, y: Enumerable<T2>): Array<[T1, T2]>;
|
|
259
263
|
declare function getIdFields(modelMeta: ModelMeta, model: string, throwIfNotFound?: boolean): FieldInfo[];
|
|
260
264
|
|
|
261
|
-
export { Enumerable, FieldInfo, MaybePromise, ModelDataVisitor, ModelDataVisitorCallback, ModelMeta, NestedReadVisitor, NestedReadVisitorCallback, NestedWriteVisitor, NestedWriteVisitorContext, NestedWriterVisitorCallback, PrismaWriteActionType, PrismaWriteActions, RuntimeAttribute, UniqueConstraint, applyMutation, enumerate, getFields, getIdFields, getModelFields, getMutatedModels, getReadModels, resolveField, zip };
|
|
265
|
+
export { type Enumerable, type FieldInfo, type MaybePromise, ModelDataVisitor, type ModelDataVisitorCallback, type ModelMeta, NestedReadVisitor, type NestedReadVisitorCallback, NestedWriteVisitor, type NestedWriteVisitorContext, type NestedWriterVisitorCallback, type PrismaWriteActionType, PrismaWriteActions, type RuntimeAttribute, type UniqueConstraint, applyMutation, enumerate, getFields, getIdFields, getModelFields, getMutatedModels, getReadModels, requireField, resolveField, zip };
|
package/cross/index.d.ts
CHANGED
|
@@ -105,7 +105,11 @@ type ModelMeta = {
|
|
|
105
105
|
/**
|
|
106
106
|
* Resolves a model field to its metadata. Returns undefined if not found.
|
|
107
107
|
*/
|
|
108
|
-
declare function resolveField(modelMeta: ModelMeta, model: string, field: string): FieldInfo
|
|
108
|
+
declare function resolveField(modelMeta: ModelMeta, model: string, field: string): FieldInfo;
|
|
109
|
+
/**
|
|
110
|
+
* Resolves a model field to its metadata. Throws an error if not found.
|
|
111
|
+
*/
|
|
112
|
+
declare function requireField(modelMeta: ModelMeta, model: string, field: string): FieldInfo;
|
|
109
113
|
/**
|
|
110
114
|
* Gets all fields of a model.
|
|
111
115
|
*/
|
|
@@ -258,4 +262,4 @@ declare function enumerate<T>(x: Enumerable<T>): T[];
|
|
|
258
262
|
declare function zip<T1, T2>(x: Enumerable<T1>, y: Enumerable<T2>): Array<[T1, T2]>;
|
|
259
263
|
declare function getIdFields(modelMeta: ModelMeta, model: string, throwIfNotFound?: boolean): FieldInfo[];
|
|
260
264
|
|
|
261
|
-
export { Enumerable, FieldInfo, MaybePromise, ModelDataVisitor, ModelDataVisitorCallback, ModelMeta, NestedReadVisitor, NestedReadVisitorCallback, NestedWriteVisitor, NestedWriteVisitorContext, NestedWriterVisitorCallback, PrismaWriteActionType, PrismaWriteActions, RuntimeAttribute, UniqueConstraint, applyMutation, enumerate, getFields, getIdFields, getModelFields, getMutatedModels, getReadModels, resolveField, zip };
|
|
265
|
+
export { type Enumerable, type FieldInfo, type MaybePromise, ModelDataVisitor, type ModelDataVisitorCallback, type ModelMeta, NestedReadVisitor, type NestedReadVisitorCallback, NestedWriteVisitor, type NestedWriteVisitorContext, type NestedWriterVisitorCallback, type PrismaWriteActionType, PrismaWriteActions, type RuntimeAttribute, type UniqueConstraint, applyMutation, enumerate, getFields, getIdFields, getModelFields, getMutatedModels, getReadModels, requireField, resolveField, zip };
|
package/cross/index.js
CHANGED
|
@@ -78,6 +78,7 @@ __export(cross_exports, {
|
|
|
78
78
|
getModelFields: () => getModelFields,
|
|
79
79
|
getMutatedModels: () => getMutatedModels,
|
|
80
80
|
getReadModels: () => getReadModels,
|
|
81
|
+
requireField: () => requireField,
|
|
81
82
|
resolveField: () => resolveField,
|
|
82
83
|
zip: () => zip
|
|
83
84
|
});
|
|
@@ -120,6 +121,13 @@ function resolveField(modelMeta, model, field) {
|
|
|
120
121
|
var _a;
|
|
121
122
|
return (_a = modelMeta.fields[(0, import_lower_case_first.lowerCaseFirst)(model)]) == null ? void 0 : _a[field];
|
|
122
123
|
}
|
|
124
|
+
function requireField(modelMeta, model, field) {
|
|
125
|
+
const f = resolveField(modelMeta, model, field);
|
|
126
|
+
if (!f) {
|
|
127
|
+
throw new Error(`Field ${model}.${field} cannot be resolved`);
|
|
128
|
+
}
|
|
129
|
+
return f;
|
|
130
|
+
}
|
|
123
131
|
function getFields(modelMeta, model) {
|
|
124
132
|
return modelMeta.fields[(0, import_lower_case_first.lowerCaseFirst)(model)];
|
|
125
133
|
}
|
|
@@ -156,17 +164,21 @@ function applyMutation(queryModel, queryOp, queryData, mutationModel, mutationOp
|
|
|
156
164
|
}
|
|
157
165
|
},
|
|
158
166
|
update: (model, args) => {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
167
|
+
if (model === queryModel) {
|
|
168
|
+
const r = updateMutate(queryModel, resultData, model, args, modelMeta, logging);
|
|
169
|
+
if (r) {
|
|
170
|
+
resultData = r;
|
|
171
|
+
updated = true;
|
|
172
|
+
}
|
|
163
173
|
}
|
|
164
174
|
},
|
|
165
175
|
delete: (model, args) => {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
176
|
+
if (model === queryModel) {
|
|
177
|
+
const r = deleteMutate(queryModel, resultData, model, args, modelMeta, logging);
|
|
178
|
+
if (r) {
|
|
179
|
+
resultData = r;
|
|
180
|
+
updated = true;
|
|
181
|
+
}
|
|
170
182
|
}
|
|
171
183
|
}
|
|
172
184
|
});
|
|
@@ -209,12 +221,12 @@ function createMutate(queryModel, queryOp, currentData, newData, modelMeta, logg
|
|
|
209
221
|
idFields.forEach((f) => {
|
|
210
222
|
if (insert[f.name] === void 0) {
|
|
211
223
|
if (f.type === "Int" || f.type === "BigInt") {
|
|
212
|
-
const currMax = Math.max(
|
|
224
|
+
const currMax = Array.isArray(currentData) ? Math.max(
|
|
213
225
|
...[...currentData].map((item) => {
|
|
214
226
|
const idv = parseInt(item[f.name]);
|
|
215
227
|
return isNaN(idv) ? 0 : idv;
|
|
216
228
|
})
|
|
217
|
-
);
|
|
229
|
+
) : 0;
|
|
218
230
|
insert[f.name] = currMax + 1;
|
|
219
231
|
} else {
|
|
220
232
|
insert[f.name] = (0, import_uuid.v4)();
|
|
@@ -225,7 +237,7 @@ function createMutate(queryModel, queryOp, currentData, newData, modelMeta, logg
|
|
|
225
237
|
if (logging) {
|
|
226
238
|
console.log(`Optimistic create for ${queryModel}:`, insert);
|
|
227
239
|
}
|
|
228
|
-
return [insert, ...currentData];
|
|
240
|
+
return [insert, ...Array.isArray(currentData) ? currentData : []];
|
|
229
241
|
}
|
|
230
242
|
function updateMutate(queryModel, currentData, mutateModel, mutateArgs, modelMeta, logging) {
|
|
231
243
|
if (!currentData) {
|
|
@@ -436,54 +448,55 @@ var NestedWriteVisitor = class {
|
|
|
436
448
|
if (!data) {
|
|
437
449
|
return;
|
|
438
450
|
}
|
|
439
|
-
const context = { parent, field, nestingPath: [...nestingPath] };
|
|
440
451
|
const toplevel = field == void 0;
|
|
452
|
+
const context = { parent, field, nestingPath: [...nestingPath] };
|
|
453
|
+
const pushNewContext = (field2, model2, where, unique = false) => {
|
|
454
|
+
return __spreadProps(__spreadValues({}, context), { nestingPath: [...context.nestingPath, { field: field2, model: model2, where, unique }] });
|
|
455
|
+
};
|
|
441
456
|
switch (action) {
|
|
442
457
|
case "create":
|
|
443
|
-
context.nestingPath.push({ field, model, where: {}, unique: false });
|
|
444
458
|
for (const item of enumerate(data)) {
|
|
459
|
+
const newContext = pushNewContext(field, model, {});
|
|
445
460
|
let callbackResult;
|
|
446
461
|
if (this.callback.create) {
|
|
447
|
-
callbackResult = yield this.callback.create(model, item,
|
|
462
|
+
callbackResult = yield this.callback.create(model, item, newContext);
|
|
448
463
|
}
|
|
449
464
|
if (callbackResult !== false) {
|
|
450
465
|
const subPayload = typeof callbackResult === "object" ? callbackResult : item;
|
|
451
|
-
yield this.visitSubPayload(model, action, subPayload,
|
|
466
|
+
yield this.visitSubPayload(model, action, subPayload, newContext.nestingPath);
|
|
452
467
|
}
|
|
453
468
|
}
|
|
454
469
|
break;
|
|
455
470
|
case "createMany":
|
|
456
471
|
if (data) {
|
|
457
|
-
|
|
472
|
+
const newContext = pushNewContext(field, model, {});
|
|
458
473
|
let callbackResult;
|
|
459
474
|
if (this.callback.createMany) {
|
|
460
|
-
callbackResult = yield this.callback.createMany(model, data,
|
|
475
|
+
callbackResult = yield this.callback.createMany(model, data, newContext);
|
|
461
476
|
}
|
|
462
477
|
if (callbackResult !== false) {
|
|
463
478
|
const subPayload = typeof callbackResult === "object" ? callbackResult : data.data;
|
|
464
|
-
yield this.visitSubPayload(model, action, subPayload,
|
|
479
|
+
yield this.visitSubPayload(model, action, subPayload, newContext.nestingPath);
|
|
465
480
|
}
|
|
466
481
|
}
|
|
467
482
|
break;
|
|
468
483
|
case "connectOrCreate":
|
|
469
|
-
context.nestingPath.push({ field, model, where: data.where, unique: false });
|
|
470
484
|
for (const item of enumerate(data)) {
|
|
485
|
+
const newContext = pushNewContext(field, model, item.where);
|
|
471
486
|
let callbackResult;
|
|
472
487
|
if (this.callback.connectOrCreate) {
|
|
473
|
-
callbackResult = yield this.callback.connectOrCreate(model, item,
|
|
488
|
+
callbackResult = yield this.callback.connectOrCreate(model, item, newContext);
|
|
474
489
|
}
|
|
475
490
|
if (callbackResult !== false) {
|
|
476
491
|
const subPayload = typeof callbackResult === "object" ? callbackResult : item.create;
|
|
477
|
-
yield this.visitSubPayload(model, action, subPayload,
|
|
492
|
+
yield this.visitSubPayload(model, action, subPayload, newContext.nestingPath);
|
|
478
493
|
}
|
|
479
494
|
}
|
|
480
495
|
break;
|
|
481
496
|
case "connect":
|
|
482
497
|
if (this.callback.connect) {
|
|
483
498
|
for (const item of enumerate(data)) {
|
|
484
|
-
const newContext =
|
|
485
|
-
nestingPath: [...context.nestingPath, { field, model, where: item, unique: true }]
|
|
486
|
-
});
|
|
499
|
+
const newContext = pushNewContext(field, model, item, true);
|
|
487
500
|
yield this.callback.connect(model, item, newContext);
|
|
488
501
|
}
|
|
489
502
|
}
|
|
@@ -491,61 +504,56 @@ var NestedWriteVisitor = class {
|
|
|
491
504
|
case "disconnect":
|
|
492
505
|
if (this.callback.disconnect) {
|
|
493
506
|
for (const item of enumerate(data)) {
|
|
494
|
-
const newContext =
|
|
495
|
-
nestingPath: [
|
|
496
|
-
...context.nestingPath,
|
|
497
|
-
{ field, model, where: item, unique: typeof item === "object" }
|
|
498
|
-
]
|
|
499
|
-
});
|
|
507
|
+
const newContext = pushNewContext(field, model, item, typeof item === "object");
|
|
500
508
|
yield this.callback.disconnect(model, item, newContext);
|
|
501
509
|
}
|
|
502
510
|
}
|
|
503
511
|
break;
|
|
504
512
|
case "set":
|
|
505
513
|
if (this.callback.set) {
|
|
506
|
-
|
|
507
|
-
yield this.callback.set(model, data,
|
|
514
|
+
const newContext = pushNewContext(field, model, {});
|
|
515
|
+
yield this.callback.set(model, data, newContext);
|
|
508
516
|
}
|
|
509
517
|
break;
|
|
510
518
|
case "update":
|
|
511
|
-
context.nestingPath.push({ field, model, where: data.where, unique: false });
|
|
512
519
|
for (const item of enumerate(data)) {
|
|
520
|
+
const newContext = pushNewContext(field, model, item.where);
|
|
513
521
|
let callbackResult;
|
|
514
522
|
if (this.callback.update) {
|
|
515
|
-
callbackResult = yield this.callback.update(model, item,
|
|
523
|
+
callbackResult = yield this.callback.update(model, item, newContext);
|
|
516
524
|
}
|
|
517
525
|
if (callbackResult !== false) {
|
|
518
526
|
const subPayload = typeof callbackResult === "object" ? callbackResult : typeof item.data === "object" ? item.data : item;
|
|
519
|
-
yield this.visitSubPayload(model, action, subPayload,
|
|
527
|
+
yield this.visitSubPayload(model, action, subPayload, newContext.nestingPath);
|
|
520
528
|
}
|
|
521
529
|
}
|
|
522
530
|
break;
|
|
523
531
|
case "updateMany":
|
|
524
|
-
context.nestingPath.push({ field, model, where: data.where, unique: false });
|
|
525
532
|
for (const item of enumerate(data)) {
|
|
533
|
+
const newContext = pushNewContext(field, model, item.where);
|
|
526
534
|
let callbackResult;
|
|
527
535
|
if (this.callback.updateMany) {
|
|
528
|
-
callbackResult = yield this.callback.updateMany(model, item,
|
|
536
|
+
callbackResult = yield this.callback.updateMany(model, item, newContext);
|
|
529
537
|
}
|
|
530
538
|
if (callbackResult !== false) {
|
|
531
539
|
const subPayload = typeof callbackResult === "object" ? callbackResult : item;
|
|
532
|
-
yield this.visitSubPayload(model, action, subPayload,
|
|
540
|
+
yield this.visitSubPayload(model, action, subPayload, newContext.nestingPath);
|
|
533
541
|
}
|
|
534
542
|
}
|
|
535
543
|
break;
|
|
536
544
|
case "upsert": {
|
|
537
|
-
context.nestingPath.push({ field, model, where: data.where, unique: false });
|
|
538
545
|
for (const item of enumerate(data)) {
|
|
546
|
+
const newContext = pushNewContext(field, model, item.where);
|
|
539
547
|
let callbackResult;
|
|
540
548
|
if (this.callback.upsert) {
|
|
541
|
-
callbackResult = yield this.callback.upsert(model, item,
|
|
549
|
+
callbackResult = yield this.callback.upsert(model, item, newContext);
|
|
542
550
|
}
|
|
543
551
|
if (callbackResult !== false) {
|
|
544
552
|
if (typeof callbackResult === "object") {
|
|
545
|
-
yield this.visitSubPayload(model, action, callbackResult,
|
|
553
|
+
yield this.visitSubPayload(model, action, callbackResult, newContext.nestingPath);
|
|
546
554
|
} else {
|
|
547
|
-
yield this.visitSubPayload(model, action, item.create,
|
|
548
|
-
yield this.visitSubPayload(model, action, item.update,
|
|
555
|
+
yield this.visitSubPayload(model, action, item.create, newContext.nestingPath);
|
|
556
|
+
yield this.visitSubPayload(model, action, item.update, newContext.nestingPath);
|
|
549
557
|
}
|
|
550
558
|
}
|
|
551
559
|
}
|
|
@@ -554,12 +562,7 @@ var NestedWriteVisitor = class {
|
|
|
554
562
|
case "delete": {
|
|
555
563
|
if (this.callback.delete) {
|
|
556
564
|
for (const item of enumerate(data)) {
|
|
557
|
-
const newContext =
|
|
558
|
-
nestingPath: [
|
|
559
|
-
...context.nestingPath,
|
|
560
|
-
{ field, model, where: toplevel ? item.where : item, unique: false }
|
|
561
|
-
]
|
|
562
|
-
});
|
|
565
|
+
const newContext = pushNewContext(field, model, toplevel ? item.where : item);
|
|
563
566
|
yield this.callback.delete(model, item, newContext);
|
|
564
567
|
}
|
|
565
568
|
}
|
|
@@ -568,12 +571,7 @@ var NestedWriteVisitor = class {
|
|
|
568
571
|
case "deleteMany":
|
|
569
572
|
if (this.callback.deleteMany) {
|
|
570
573
|
for (const item of enumerate(data)) {
|
|
571
|
-
const newContext =
|
|
572
|
-
nestingPath: [
|
|
573
|
-
...context.nestingPath,
|
|
574
|
-
{ field, model, where: toplevel ? item.where : item, unique: false }
|
|
575
|
-
]
|
|
576
|
-
});
|
|
574
|
+
const newContext = pushNewContext(field, model, toplevel ? item.where : item);
|
|
577
575
|
yield this.callback.deleteMany(model, item, newContext);
|
|
578
576
|
}
|
|
579
577
|
}
|
|
@@ -692,6 +690,7 @@ function collectDeleteCascades(model, modelMeta, result, visited) {
|
|
|
692
690
|
getModelFields,
|
|
693
691
|
getMutatedModels,
|
|
694
692
|
getReadModels,
|
|
693
|
+
requireField,
|
|
695
694
|
resolveField,
|
|
696
695
|
zip
|
|
697
696
|
});
|
package/cross/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cross/index.ts","../../src/cross/model-data-visitor.ts","../../src/cross/model-meta.ts","../../src/cross/mutator.ts","../../src/cross/nested-read-visitor.ts","../../src/cross/types.ts","../../src/cross/utils.ts","../../src/cross/nested-write-visitor.ts","../../src/cross/query-analyzer.ts"],"sourcesContent":["export * from './model-data-visitor';\nexport * from './model-meta';\nexport * from './mutator';\nexport * from './nested-read-visitor';\nexport * from './nested-write-visitor';\nexport * from './query-analyzer';\nexport * from './types';\nexport * from './utils';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { resolveField, type ModelMeta } from '.';\n\n/**\n * Callback for @see ModelDataVisitor.\n */\nexport type ModelDataVisitorCallback = (model: string, data: any, scalarData: any) => void;\n\n/**\n * Visitor that traverses data returned by a Prisma query.\n */\nexport class ModelDataVisitor {\n constructor(private modelMeta: ModelMeta) {}\n\n /**\n * Visits the given model data.\n */\n visit(model: string, data: any, callback: ModelDataVisitorCallback) {\n if (!data || typeof data !== 'object') {\n return;\n }\n\n const scalarData: Record<string, unknown> = {};\n const subTasks: Array<{ model: string; data: any }> = [];\n\n for (const [k, v] of Object.entries(data)) {\n const field = resolveField(this.modelMeta, model, k);\n if (field && field.isDataModel) {\n if (field.isArray && Array.isArray(v)) {\n subTasks.push(...v.map((item) => ({ model: field.type, data: item })));\n } else {\n subTasks.push({ model: field.type, data: v });\n }\n } else {\n scalarData[k] = v;\n }\n }\n\n callback(model, data, scalarData);\n subTasks.forEach(({ model, data }) => this.visit(model, data, callback));\n }\n}\n","import { lowerCaseFirst } from 'lower-case-first';\n\n/**\n * Runtime information of a data model or field attribute\n */\nexport type RuntimeAttribute = {\n name: string;\n args: Array<{ name?: string; value: unknown }>;\n};\n\n/**\n * Runtime information of a data model field\n */\nexport type FieldInfo = {\n /**\n * Field name\n */\n name: string;\n\n /**\n * Field type name\n */\n type: string;\n\n /**\n * If the field is an ID field or part of a multi-field ID\n */\n isId?: boolean;\n\n /**\n * If the field type is a data model (or an optional/array of data model)\n */\n isDataModel?: boolean;\n\n /**\n * If the field is an array\n */\n isArray?: boolean;\n\n /**\n * If the field is optional\n */\n isOptional?: boolean;\n\n /**\n * Attributes on the field\n */\n attributes?: RuntimeAttribute[];\n\n /**\n * If the field is a relation field, the field name of the reverse side of the relation\n */\n backLink?: string;\n\n /**\n * If the field is the owner side of a relation\n */\n isRelationOwner?: boolean;\n\n /**\n * If the field is a foreign key field\n */\n isForeignKey?: boolean;\n\n /**\n * Mapping from foreign key field names to relation field names\n */\n foreignKeyMapping?: Record<string, string>;\n};\n\n/**\n * Metadata for a model-level unique constraint\n * e.g.: @@unique([a, b])\n */\nexport type UniqueConstraint = { name: string; fields: string[] };\n\n/**\n * ZModel data model metadata\n */\nexport type ModelMeta = {\n /**\n * Model fields\n */\n fields: Record<string, Record<string, FieldInfo>>;\n\n /**\n * Model unique constraints\n */\n uniqueConstraints: Record<string, Record<string, UniqueConstraint>>;\n\n /**\n * Information for cascading delete\n */\n deleteCascade: Record<string, string[]>;\n\n /**\n * Name of model that backs the `auth()` function\n */\n authModel?: string;\n};\n\n/**\n * Resolves a model field to its metadata. Returns undefined if not found.\n */\nexport function resolveField(modelMeta: ModelMeta, model: string, field: string): FieldInfo | undefined {\n return modelMeta.fields[lowerCaseFirst(model)]?.[field];\n}\n\n/**\n * Gets all fields of a model.\n */\nexport function getFields(modelMeta: ModelMeta, model: string) {\n return modelMeta.fields[lowerCaseFirst(model)];\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { v4 as uuid } from 'uuid';\nimport deepcopy from 'deepcopy';\nimport {\n ModelDataVisitor,\n NestedWriteVisitor,\n enumerate,\n getFields,\n getIdFields,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '.';\n\n/**\n * Tries to apply a mutation to a query result.\n *\n * @param queryModel the model of the query\n * @param queryOp the operation of the query\n * @param queryData the result data of the query\n * @param mutationModel the model of the mutation\n * @param mutationOp the operation of the mutation\n * @param mutationArgs the arguments of the mutation\n * @param modelMeta the model metadata\n * @param logging whether to log the mutation application\n * @returns the updated query data if the mutation is applicable, otherwise undefined\n */\nexport async function applyMutation(\n queryModel: string,\n queryOp: string,\n queryData: any,\n mutationModel: string,\n mutationOp: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n if (['count', 'aggregate', 'groupBy'].includes(queryOp)) {\n // only findXXX results are applicable\n return undefined;\n }\n\n let resultData = queryData;\n let updated = false;\n\n const visitor = new NestedWriteVisitor(modelMeta, {\n create: (model, args) => {\n if (model === queryModel) {\n const r = createMutate(queryModel, queryOp, resultData, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n createMany: (model, args) => {\n if (model === queryModel && args?.data) {\n for (const oneArg of enumerate(args.data)) {\n const r = createMutate(queryModel, queryOp, resultData, oneArg, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n }\n },\n\n update: (model, args) => {\n const r = updateMutate(queryModel, resultData, model, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n },\n\n delete: (model, args) => {\n const r = deleteMutate(queryModel, resultData, model, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n },\n });\n\n await visitor.visit(mutationModel, mutationOp, mutationArgs);\n\n return updated ? resultData : undefined;\n}\n\nfunction createMutate(\n queryModel: string,\n queryOp: string,\n currentData: any,\n newData: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n if (!newData) {\n return undefined;\n }\n\n if (queryOp !== 'findMany') {\n return undefined;\n }\n\n const modelFields = getFields(modelMeta, queryModel);\n if (!modelFields) {\n return undefined;\n }\n\n const insert: any = {};\n const newDataFields = Object.keys(newData);\n\n Object.entries(modelFields).forEach(([name, field]) => {\n if (field.isDataModel) {\n // only include scalar fields\n return;\n }\n if (newDataFields.includes(name)) {\n insert[name] = newData[name];\n } else {\n const defaultAttr = field.attributes?.find((attr) => attr.name === '@default');\n if (field.type === 'DateTime') {\n // default value for DateTime field\n if (defaultAttr || field.attributes?.some((attr) => attr.name === '@updatedAt')) {\n insert[name] = new Date();\n }\n } else if (defaultAttr?.args?.[0]?.value !== undefined) {\n // other default value\n insert[name] = defaultAttr.args[0].value;\n }\n }\n });\n\n // add temp id value\n const idFields = getIdFields(modelMeta, queryModel, false);\n idFields.forEach((f) => {\n if (insert[f.name] === undefined) {\n if (f.type === 'Int' || f.type === 'BigInt') {\n const currMax = Math.max(\n ...[...currentData].map((item) => {\n const idv = parseInt(item[f.name]);\n return isNaN(idv) ? 0 : idv;\n })\n );\n insert[f.name] = currMax + 1;\n } else {\n insert[f.name] = uuid();\n }\n }\n });\n\n insert.$optimistic = true;\n\n if (logging) {\n console.log(`Optimistic create for ${queryModel}:`, insert);\n }\n return [insert, ...currentData];\n}\n\nfunction updateMutate(\n queryModel: string,\n currentData: any,\n mutateModel: string,\n mutateArgs: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n if (!currentData) {\n return undefined;\n }\n\n if (!mutateArgs?.where || !mutateArgs?.data) {\n return undefined;\n }\n\n let updated = false;\n\n for (const item of enumerate(currentData)) {\n const visitor = new ModelDataVisitor(modelMeta);\n visitor.visit(queryModel, item, (model, _data, scalarData) => {\n if (model === mutateModel && idFieldsMatch(model, scalarData, mutateArgs.where, modelMeta)) {\n Object.keys(item).forEach((k) => {\n if (mutateArgs.data[k] !== undefined) {\n item[k] = mutateArgs.data[k];\n }\n });\n item.$optimistic = true;\n updated = true;\n if (logging) {\n console.log(`Optimistic update for ${queryModel}:`, item);\n }\n }\n });\n }\n\n return updated ? deepcopy(currentData) /* ensures new object identity */ : undefined;\n}\n\nfunction deleteMutate(\n queryModel: string,\n currentData: any,\n mutateModel: string,\n mutateArgs: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n // TODO: handle mutation of nested reads?\n\n if (!currentData || !mutateArgs) {\n return undefined;\n }\n\n if (queryModel !== mutateModel) {\n return undefined;\n }\n\n let updated = false;\n let result = currentData;\n\n if (Array.isArray(currentData)) {\n for (const item of currentData) {\n if (idFieldsMatch(mutateModel, item, mutateArgs, modelMeta)) {\n result = (result as unknown[]).filter((x) => x !== item);\n updated = true;\n if (logging) {\n console.log(`Optimistic delete for ${queryModel}:`, item);\n }\n }\n }\n } else {\n if (idFieldsMatch(mutateModel, currentData, mutateArgs, modelMeta)) {\n result = null;\n updated = true;\n if (logging) {\n console.log(`Optimistic delete for ${queryModel}:`, currentData);\n }\n }\n }\n\n return updated ? result : undefined;\n}\n\nfunction idFieldsMatch(model: string, x: any, y: any, modelMeta: ModelMeta) {\n if (!x || !y || typeof x !== 'object' || typeof y !== 'object') {\n return false;\n }\n const idFields = getIdFields(modelMeta, model, false);\n if (idFields.length === 0) {\n return false;\n }\n return idFields.every((f) => x[f.name] === y[f.name]);\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { resolveField, type FieldInfo, type ModelMeta } from './model-meta';\n\nexport type NestedReadVisitorCallback = {\n field?: (\n model: string,\n field: FieldInfo | undefined,\n kind: 'include' | 'select' | undefined,\n args: unknown\n ) => void | boolean;\n};\n\n/**\n * Visitor for nested read payload.\n */\nexport class NestedReadVisitor {\n constructor(private readonly modelMeta: ModelMeta, private readonly callback: NestedReadVisitorCallback) {}\n\n doVisit(model: string, field: FieldInfo | undefined, kind: 'include' | 'select' | undefined, args: unknown) {\n if (this.callback.field) {\n const r = this.callback.field(model, field, kind, args);\n if (r === false) {\n return;\n }\n }\n\n if (!args || typeof args !== 'object') {\n return;\n }\n\n let selectInclude: any;\n let nextKind: 'select' | 'include' | undefined;\n if ((args as any).select) {\n selectInclude = (args as any).select;\n nextKind = 'select';\n } else if ((args as any).include) {\n selectInclude = (args as any).include;\n nextKind = 'include';\n }\n\n if (selectInclude && typeof selectInclude === 'object') {\n for (const [k, v] of Object.entries(selectInclude)) {\n if (k === '_count' && typeof v === 'object' && v) {\n // recurse into { _count: { ... } }\n this.doVisit(model, field, kind, v);\n } else {\n const field = resolveField(this.modelMeta, model, k);\n if (field) {\n this.doVisit(field.type, field, nextKind, v);\n }\n }\n }\n }\n }\n\n visit(model: string, args: unknown) {\n this.doVisit(model, undefined, undefined, args);\n }\n}\n","/**\n * Prisma write operation kinds\n */\nexport const PrismaWriteActions = [\n 'create',\n 'createMany',\n 'connectOrCreate',\n 'update',\n 'updateMany',\n 'upsert',\n 'connect',\n 'disconnect',\n 'set',\n 'delete',\n 'deleteMany',\n] as const;\n\n/**\n * Prisma write operation kinds\n */\nexport type PrismaWriteActionType = (typeof PrismaWriteActions)[number];\n\n/**\n * Maybe promise\n */\nexport type MaybePromise<T> = T | Promise<T> | PromiseLike<T>;\n","import { lowerCaseFirst } from 'lower-case-first';\nimport { ModelMeta } from '.';\n\n/**\n * Gets field names in a data model entity, filtering out internal fields.\n */\nexport function getModelFields(data: object) {\n return data ? Object.keys(data) : [];\n}\n\n/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n\n/**\n * Zip two arrays or scalars.\n */\nexport function zip<T1, T2>(x: Enumerable<T1>, y: Enumerable<T2>): Array<[T1, T2]> {\n if (Array.isArray(x)) {\n if (!Array.isArray(y)) {\n throw new Error('x and y should be both array or both scalar');\n }\n if (x.length !== y.length) {\n throw new Error('x and y should have the same length');\n }\n return x.map((_, i) => [x[i], y[i]] as [T1, T2]);\n } else {\n if (Array.isArray(y)) {\n throw new Error('x and y should be both array or both scalar');\n }\n return [[x, y]];\n }\n}\n\nexport function getIdFields(modelMeta: ModelMeta, model: string, throwIfNotFound = false) {\n let fields = modelMeta.fields[lowerCaseFirst(model)];\n if (!fields) {\n if (throwIfNotFound) {\n throw new Error(`Unable to load fields for ${model}`);\n } else {\n fields = {};\n }\n }\n const result = Object.values(fields).filter((f) => f.isId);\n if (result.length === 0 && throwIfNotFound) {\n throw new Error(`model ${model} does not have an id field`);\n }\n return result;\n}\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { FieldInfo, ModelMeta } from './model-meta';\nimport { resolveField } from './model-meta';\nimport { MaybePromise, PrismaWriteActionType, PrismaWriteActions } from './types';\nimport { enumerate, getModelFields } from './utils';\n\ntype NestingPathItem = { field?: FieldInfo; model: string; where: any; unique: boolean };\n\n/**\n * Context for visiting\n */\nexport type NestedWriteVisitorContext = {\n /**\n * Parent data, can be used to replace fields\n */\n parent: any;\n\n /**\n * Current field, undefined if toplevel\n */\n field?: FieldInfo;\n\n /**\n * A top-down path of all nested update conditions and corresponding field till now\n */\n nestingPath: NestingPathItem[];\n};\n\n/**\n * NestedWriteVisitor's callback actions. A call back function should return true or void to indicate\n * that the visitor should continue traversing its children, or false to stop. It can also return an object\n * to let the visitor traverse it instead of its original children.\n */\nexport type NestedWriterVisitorCallback = {\n create?: (model: string, args: any[], context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n createMany?: (\n model: string,\n args: { data: any; skipDuplicates?: boolean },\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n connectOrCreate?: (\n model: string,\n args: { where: object; create: any },\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n connect?: (\n model: string,\n args: object,\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n disconnect?: (\n model: string,\n args: object,\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n set?: (model: string, args: object, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n update?: (model: string, args: object, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n updateMany?: (\n model: string,\n args: { where?: object; data: any },\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n upsert?: (\n model: string,\n args: { where: object; create: any; update: any },\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n delete?: (\n model: string,\n args: object | boolean,\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n deleteMany?: (\n model: string,\n args: any | object,\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n field?: (\n field: FieldInfo,\n action: PrismaWriteActionType,\n data: any,\n context: NestedWriteVisitorContext\n ) => MaybePromise<void>;\n};\n\n/**\n * Recursive visitor for nested write (create/update) payload.\n */\nexport class NestedWriteVisitor {\n constructor(private readonly modelMeta: ModelMeta, private readonly callback: NestedWriterVisitorCallback) {}\n\n private isPrismaWriteAction(value: string): value is PrismaWriteActionType {\n return PrismaWriteActions.includes(value as PrismaWriteActionType);\n }\n\n /**\n * Start visiting\n *\n * @see NestedWriterVisitorCallback\n */\n async visit(model: string, action: PrismaWriteActionType, args: any): Promise<void> {\n if (!args) {\n return;\n }\n\n let topData = args;\n\n switch (action) {\n // create has its data wrapped in 'data' field\n case 'create':\n topData = topData.data;\n break;\n\n case 'delete':\n case 'deleteMany':\n topData = topData.where;\n break;\n }\n\n await this.doVisit(model, action, topData, undefined, undefined, []);\n }\n\n private async doVisit(\n model: string,\n action: PrismaWriteActionType,\n data: any,\n parent: any,\n field: FieldInfo | undefined,\n nestingPath: NestingPathItem[]\n ): Promise<void> {\n if (!data) {\n return;\n }\n\n const context = { parent, field, nestingPath: [...nestingPath] };\n const toplevel = field == undefined;\n\n // visit payload\n switch (action) {\n case 'create':\n context.nestingPath.push({ field, model, where: {}, unique: false });\n for (const item of enumerate(data)) {\n let callbackResult: any;\n if (this.callback.create) {\n callbackResult = await this.callback.create(model, item, context);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item;\n await this.visitSubPayload(model, action, subPayload, context.nestingPath);\n }\n }\n break;\n\n case 'createMany':\n if (data) {\n context.nestingPath.push({ field, model, where: {}, unique: false });\n let callbackResult: any;\n if (this.callback.createMany) {\n callbackResult = await this.callback.createMany(model, data, context);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : data.data;\n await this.visitSubPayload(model, action, subPayload, context.nestingPath);\n }\n }\n break;\n\n case 'connectOrCreate':\n context.nestingPath.push({ field, model, where: data.where, unique: false });\n for (const item of enumerate(data)) {\n let callbackResult: any;\n if (this.callback.connectOrCreate) {\n callbackResult = await this.callback.connectOrCreate(model, item, context);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item.create;\n await this.visitSubPayload(model, action, subPayload, context.nestingPath);\n }\n }\n break;\n\n case 'connect':\n if (this.callback.connect) {\n for (const item of enumerate(data)) {\n const newContext = {\n ...context,\n nestingPath: [...context.nestingPath, { field, model, where: item, unique: true }],\n };\n await this.callback.connect(model, item, newContext);\n }\n }\n break;\n\n case 'disconnect':\n // disconnect has two forms:\n // if relation is to-many, the payload is a unique filter object\n // if relation is to-one, the payload can only be boolean `true`\n if (this.callback.disconnect) {\n for (const item of enumerate(data)) {\n const newContext = {\n ...context,\n nestingPath: [\n ...context.nestingPath,\n { field, model, where: item, unique: typeof item === 'object' },\n ],\n };\n await this.callback.disconnect(model, item, newContext);\n }\n }\n break;\n\n case 'set':\n if (this.callback.set) {\n context.nestingPath.push({ field, model, where: {}, unique: false });\n await this.callback.set(model, data, context);\n }\n break;\n\n case 'update':\n context.nestingPath.push({ field, model, where: data.where, unique: false });\n for (const item of enumerate(data)) {\n let callbackResult: any;\n if (this.callback.update) {\n callbackResult = await this.callback.update(model, item, context);\n }\n if (callbackResult !== false) {\n const subPayload =\n typeof callbackResult === 'object'\n ? callbackResult\n : typeof item.data === 'object'\n ? item.data\n : item;\n await this.visitSubPayload(model, action, subPayload, context.nestingPath);\n }\n }\n break;\n\n case 'updateMany':\n context.nestingPath.push({ field, model, where: data.where, unique: false });\n for (const item of enumerate(data)) {\n let callbackResult: any;\n if (this.callback.updateMany) {\n callbackResult = await this.callback.updateMany(model, item, context);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item;\n await this.visitSubPayload(model, action, subPayload, context.nestingPath);\n }\n }\n break;\n\n case 'upsert': {\n context.nestingPath.push({ field, model, where: data.where, unique: false });\n for (const item of enumerate(data)) {\n let callbackResult: any;\n if (this.callback.upsert) {\n callbackResult = await this.callback.upsert(model, item, context);\n }\n if (callbackResult !== false) {\n if (typeof callbackResult === 'object') {\n await this.visitSubPayload(model, action, callbackResult, context.nestingPath);\n } else {\n await this.visitSubPayload(model, action, item.create, context.nestingPath);\n await this.visitSubPayload(model, action, item.update, context.nestingPath);\n }\n }\n }\n break;\n }\n\n case 'delete': {\n if (this.callback.delete) {\n for (const item of enumerate(data)) {\n const newContext = {\n ...context,\n nestingPath: [\n ...context.nestingPath,\n { field, model, where: toplevel ? item.where : item, unique: false },\n ],\n };\n await this.callback.delete(model, item, newContext);\n }\n }\n break;\n }\n\n case 'deleteMany':\n if (this.callback.deleteMany) {\n for (const item of enumerate(data)) {\n const newContext = {\n ...context,\n nestingPath: [\n ...context.nestingPath,\n { field, model, where: toplevel ? item.where : item, unique: false },\n ],\n };\n await this.callback.deleteMany(model, item, newContext);\n }\n }\n break;\n\n default: {\n throw new Error(`unhandled action type ${action}`);\n }\n }\n }\n\n private async visitSubPayload(\n model: string,\n action: PrismaWriteActionType,\n payload: any,\n nestingPath: NestingPathItem[]\n ) {\n for (const field of getModelFields(payload)) {\n const fieldInfo = resolveField(this.modelMeta, model, field);\n if (!fieldInfo) {\n continue;\n }\n\n if (fieldInfo.isDataModel) {\n if (payload[field]) {\n // recurse into nested payloads\n for (const [subAction, subData] of Object.entries<any>(payload[field])) {\n if (this.isPrismaWriteAction(subAction) && subData) {\n await this.doVisit(fieldInfo.type, subAction, subData, payload[field], fieldInfo, [\n ...nestingPath,\n ]);\n }\n }\n }\n } else {\n // visit plain field\n if (this.callback.field) {\n await this.callback.field(fieldInfo, action, payload[field], {\n parent: payload,\n nestingPath,\n field: fieldInfo,\n });\n }\n }\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { lowerCaseFirst } from 'lower-case-first';\nimport type { ModelMeta } from './model-meta';\nimport { NestedReadVisitor } from './nested-read-visitor';\nimport { NestedWriteVisitor } from './nested-write-visitor';\nimport type { PrismaWriteActionType } from './types';\n\n/**\n * Gets models read (including nested ones) given a query args.\n * @param model\n * @param targetModels\n * @param modelMeta\n * @param args\n * @returns\n */\nexport function getReadModels(model: string, modelMeta: ModelMeta, args: any) {\n const result = new Set<string>();\n result.add(model);\n const visitor = new NestedReadVisitor(modelMeta, {\n field: (model) => {\n result.add(model);\n return true;\n },\n });\n visitor.visit(model, args);\n return [...result];\n}\n\n/**\n * Gets mutated models (including nested ones) given a mutation args.\n */\nexport async function getMutatedModels(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta\n) {\n const result = new Set<string>();\n result.add(model);\n\n if (mutationArgs) {\n const addModel = (model: string) => void result.add(model);\n\n // add models that are cascaded deleted recursively\n const addCascades = (model: string) => {\n const cascades = new Set<string>();\n const visited = new Set<string>();\n collectDeleteCascades(model, modelMeta, cascades, visited);\n cascades.forEach((m) => addModel(m));\n };\n\n const visitor = new NestedWriteVisitor(modelMeta, {\n create: addModel,\n createMany: addModel,\n connectOrCreate: addModel,\n connect: addModel,\n disconnect: addModel,\n set: addModel,\n update: addModel,\n updateMany: addModel,\n upsert: addModel,\n delete: (model) => {\n addModel(model);\n addCascades(model);\n },\n deleteMany: (model) => {\n addModel(model);\n addCascades(model);\n },\n });\n await visitor.visit(model, operation, mutationArgs);\n }\n\n return [...result];\n}\n\nfunction collectDeleteCascades(model: string, modelMeta: ModelMeta, result: Set<string>, visited: Set<string>) {\n if (visited.has(model)) {\n // break circle\n return;\n }\n visited.add(model);\n\n const cascades = modelMeta.deleteCascade[lowerCaseFirst(model)];\n\n if (!cascades) {\n return;\n }\n\n cascades.forEach((m) => {\n result.add(m);\n collectDeleteCascades(m, modelMeta, result, visited);\n });\n}\n"],"mappings":"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","names":["model","data","uuid","deepcopy","field","import_lower_case_first","import_lower_case_first","model"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cross/index.ts","../../src/cross/model-data-visitor.ts","../../src/cross/model-meta.ts","../../src/cross/mutator.ts","../../src/cross/nested-read-visitor.ts","../../src/cross/types.ts","../../src/cross/utils.ts","../../src/cross/nested-write-visitor.ts","../../src/cross/query-analyzer.ts"],"sourcesContent":["export * from './model-data-visitor';\nexport * from './model-meta';\nexport * from './mutator';\nexport * from './nested-read-visitor';\nexport * from './nested-write-visitor';\nexport * from './query-analyzer';\nexport * from './types';\nexport * from './utils';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { resolveField, type ModelMeta } from '.';\n\n/**\n * Callback for @see ModelDataVisitor.\n */\nexport type ModelDataVisitorCallback = (model: string, data: any, scalarData: any) => void;\n\n/**\n * Visitor that traverses data returned by a Prisma query.\n */\nexport class ModelDataVisitor {\n constructor(private modelMeta: ModelMeta) {}\n\n /**\n * Visits the given model data.\n */\n visit(model: string, data: any, callback: ModelDataVisitorCallback) {\n if (!data || typeof data !== 'object') {\n return;\n }\n\n const scalarData: Record<string, unknown> = {};\n const subTasks: Array<{ model: string; data: any }> = [];\n\n for (const [k, v] of Object.entries(data)) {\n const field = resolveField(this.modelMeta, model, k);\n if (field && field.isDataModel) {\n if (field.isArray && Array.isArray(v)) {\n subTasks.push(...v.map((item) => ({ model: field.type, data: item })));\n } else {\n subTasks.push({ model: field.type, data: v });\n }\n } else {\n scalarData[k] = v;\n }\n }\n\n callback(model, data, scalarData);\n subTasks.forEach(({ model, data }) => this.visit(model, data, callback));\n }\n}\n","import { lowerCaseFirst } from 'lower-case-first';\n\n/**\n * Runtime information of a data model or field attribute\n */\nexport type RuntimeAttribute = {\n name: string;\n args: Array<{ name?: string; value: unknown }>;\n};\n\n/**\n * Runtime information of a data model field\n */\nexport type FieldInfo = {\n /**\n * Field name\n */\n name: string;\n\n /**\n * Field type name\n */\n type: string;\n\n /**\n * If the field is an ID field or part of a multi-field ID\n */\n isId?: boolean;\n\n /**\n * If the field type is a data model (or an optional/array of data model)\n */\n isDataModel?: boolean;\n\n /**\n * If the field is an array\n */\n isArray?: boolean;\n\n /**\n * If the field is optional\n */\n isOptional?: boolean;\n\n /**\n * Attributes on the field\n */\n attributes?: RuntimeAttribute[];\n\n /**\n * If the field is a relation field, the field name of the reverse side of the relation\n */\n backLink?: string;\n\n /**\n * If the field is the owner side of a relation\n */\n isRelationOwner?: boolean;\n\n /**\n * If the field is a foreign key field\n */\n isForeignKey?: boolean;\n\n /**\n * Mapping from foreign key field names to relation field names\n */\n foreignKeyMapping?: Record<string, string>;\n};\n\n/**\n * Metadata for a model-level unique constraint\n * e.g.: @@unique([a, b])\n */\nexport type UniqueConstraint = { name: string; fields: string[] };\n\n/**\n * ZModel data model metadata\n */\nexport type ModelMeta = {\n /**\n * Model fields\n */\n fields: Record<string, Record<string, FieldInfo>>;\n\n /**\n * Model unique constraints\n */\n uniqueConstraints: Record<string, Record<string, UniqueConstraint>>;\n\n /**\n * Information for cascading delete\n */\n deleteCascade: Record<string, string[]>;\n\n /**\n * Name of model that backs the `auth()` function\n */\n authModel?: string;\n};\n\n/**\n * Resolves a model field to its metadata. Returns undefined if not found.\n */\nexport function resolveField(modelMeta: ModelMeta, model: string, field: string) {\n return modelMeta.fields[lowerCaseFirst(model)]?.[field];\n}\n\n/**\n * Resolves a model field to its metadata. Throws an error if not found.\n */\nexport function requireField(modelMeta: ModelMeta, model: string, field: string) {\n const f = resolveField(modelMeta, model, field);\n if (!f) {\n throw new Error(`Field ${model}.${field} cannot be resolved`);\n }\n return f;\n}\n\n/**\n * Gets all fields of a model.\n */\nexport function getFields(modelMeta: ModelMeta, model: string) {\n return modelMeta.fields[lowerCaseFirst(model)];\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { v4 as uuid } from 'uuid';\nimport deepcopy from 'deepcopy';\nimport {\n ModelDataVisitor,\n NestedWriteVisitor,\n enumerate,\n getFields,\n getIdFields,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '.';\n\n/**\n * Tries to apply a mutation to a query result.\n *\n * @param queryModel the model of the query\n * @param queryOp the operation of the query\n * @param queryData the result data of the query\n * @param mutationModel the model of the mutation\n * @param mutationOp the operation of the mutation\n * @param mutationArgs the arguments of the mutation\n * @param modelMeta the model metadata\n * @param logging whether to log the mutation application\n * @returns the updated query data if the mutation is applicable, otherwise undefined\n */\nexport async function applyMutation(\n queryModel: string,\n queryOp: string,\n queryData: any,\n mutationModel: string,\n mutationOp: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n if (['count', 'aggregate', 'groupBy'].includes(queryOp)) {\n // only findXXX results are applicable\n return undefined;\n }\n\n let resultData = queryData;\n let updated = false;\n\n const visitor = new NestedWriteVisitor(modelMeta, {\n create: (model, args) => {\n if (model === queryModel) {\n const r = createMutate(queryModel, queryOp, resultData, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n createMany: (model, args) => {\n if (model === queryModel && args?.data) {\n for (const oneArg of enumerate(args.data)) {\n const r = createMutate(queryModel, queryOp, resultData, oneArg, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n }\n },\n\n update: (model, args) => {\n if (model === queryModel) {\n const r = updateMutate(queryModel, resultData, model, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n delete: (model, args) => {\n if (model === queryModel) {\n const r = deleteMutate(queryModel, resultData, model, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n });\n\n await visitor.visit(mutationModel, mutationOp, mutationArgs);\n\n return updated ? resultData : undefined;\n}\n\nfunction createMutate(\n queryModel: string,\n queryOp: string,\n currentData: any,\n newData: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n if (!newData) {\n return undefined;\n }\n\n if (queryOp !== 'findMany') {\n return undefined;\n }\n\n const modelFields = getFields(modelMeta, queryModel);\n if (!modelFields) {\n return undefined;\n }\n\n const insert: any = {};\n const newDataFields = Object.keys(newData);\n\n Object.entries(modelFields).forEach(([name, field]) => {\n if (field.isDataModel) {\n // only include scalar fields\n return;\n }\n if (newDataFields.includes(name)) {\n insert[name] = newData[name];\n } else {\n const defaultAttr = field.attributes?.find((attr) => attr.name === '@default');\n if (field.type === 'DateTime') {\n // default value for DateTime field\n if (defaultAttr || field.attributes?.some((attr) => attr.name === '@updatedAt')) {\n insert[name] = new Date();\n }\n } else if (defaultAttr?.args?.[0]?.value !== undefined) {\n // other default value\n insert[name] = defaultAttr.args[0].value;\n }\n }\n });\n\n // add temp id value\n const idFields = getIdFields(modelMeta, queryModel, false);\n idFields.forEach((f) => {\n if (insert[f.name] === undefined) {\n if (f.type === 'Int' || f.type === 'BigInt') {\n const currMax = Array.isArray(currentData)\n ? Math.max(\n ...[...currentData].map((item) => {\n const idv = parseInt(item[f.name]);\n return isNaN(idv) ? 0 : idv;\n })\n )\n : 0;\n insert[f.name] = currMax + 1;\n } else {\n insert[f.name] = uuid();\n }\n }\n });\n\n insert.$optimistic = true;\n\n if (logging) {\n console.log(`Optimistic create for ${queryModel}:`, insert);\n }\n return [insert, ...(Array.isArray(currentData) ? currentData : [])];\n}\n\nfunction updateMutate(\n queryModel: string,\n currentData: any,\n mutateModel: string,\n mutateArgs: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n if (!currentData) {\n return undefined;\n }\n\n if (!mutateArgs?.where || !mutateArgs?.data) {\n return undefined;\n }\n\n let updated = false;\n\n for (const item of enumerate(currentData)) {\n const visitor = new ModelDataVisitor(modelMeta);\n visitor.visit(queryModel, item, (model, _data, scalarData) => {\n if (model === mutateModel && idFieldsMatch(model, scalarData, mutateArgs.where, modelMeta)) {\n Object.keys(item).forEach((k) => {\n if (mutateArgs.data[k] !== undefined) {\n item[k] = mutateArgs.data[k];\n }\n });\n item.$optimistic = true;\n updated = true;\n if (logging) {\n console.log(`Optimistic update for ${queryModel}:`, item);\n }\n }\n });\n }\n\n return updated ? deepcopy(currentData) /* ensures new object identity */ : undefined;\n}\n\nfunction deleteMutate(\n queryModel: string,\n currentData: any,\n mutateModel: string,\n mutateArgs: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n // TODO: handle mutation of nested reads?\n\n if (!currentData || !mutateArgs) {\n return undefined;\n }\n\n if (queryModel !== mutateModel) {\n return undefined;\n }\n\n let updated = false;\n let result = currentData;\n\n if (Array.isArray(currentData)) {\n for (const item of currentData) {\n if (idFieldsMatch(mutateModel, item, mutateArgs, modelMeta)) {\n result = (result as unknown[]).filter((x) => x !== item);\n updated = true;\n if (logging) {\n console.log(`Optimistic delete for ${queryModel}:`, item);\n }\n }\n }\n } else {\n if (idFieldsMatch(mutateModel, currentData, mutateArgs, modelMeta)) {\n result = null;\n updated = true;\n if (logging) {\n console.log(`Optimistic delete for ${queryModel}:`, currentData);\n }\n }\n }\n\n return updated ? result : undefined;\n}\n\nfunction idFieldsMatch(model: string, x: any, y: any, modelMeta: ModelMeta) {\n if (!x || !y || typeof x !== 'object' || typeof y !== 'object') {\n return false;\n }\n const idFields = getIdFields(modelMeta, model, false);\n if (idFields.length === 0) {\n return false;\n }\n return idFields.every((f) => x[f.name] === y[f.name]);\n}\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { resolveField, type FieldInfo, type ModelMeta } from './model-meta';\n\nexport type NestedReadVisitorCallback = {\n field?: (\n model: string,\n field: FieldInfo | undefined,\n kind: 'include' | 'select' | undefined,\n args: unknown\n ) => void | boolean;\n};\n\n/**\n * Visitor for nested read payload.\n */\nexport class NestedReadVisitor {\n constructor(private readonly modelMeta: ModelMeta, private readonly callback: NestedReadVisitorCallback) {}\n\n doVisit(model: string, field: FieldInfo | undefined, kind: 'include' | 'select' | undefined, args: unknown) {\n if (this.callback.field) {\n const r = this.callback.field(model, field, kind, args);\n if (r === false) {\n return;\n }\n }\n\n if (!args || typeof args !== 'object') {\n return;\n }\n\n let selectInclude: any;\n let nextKind: 'select' | 'include' | undefined;\n if ((args as any).select) {\n selectInclude = (args as any).select;\n nextKind = 'select';\n } else if ((args as any).include) {\n selectInclude = (args as any).include;\n nextKind = 'include';\n }\n\n if (selectInclude && typeof selectInclude === 'object') {\n for (const [k, v] of Object.entries(selectInclude)) {\n if (k === '_count' && typeof v === 'object' && v) {\n // recurse into { _count: { ... } }\n this.doVisit(model, field, kind, v);\n } else {\n const field = resolveField(this.modelMeta, model, k);\n if (field) {\n this.doVisit(field.type, field, nextKind, v);\n }\n }\n }\n }\n }\n\n visit(model: string, args: unknown) {\n this.doVisit(model, undefined, undefined, args);\n }\n}\n","/**\n * Prisma write operation kinds\n */\nexport const PrismaWriteActions = [\n 'create',\n 'createMany',\n 'connectOrCreate',\n 'update',\n 'updateMany',\n 'upsert',\n 'connect',\n 'disconnect',\n 'set',\n 'delete',\n 'deleteMany',\n] as const;\n\n/**\n * Prisma write operation kinds\n */\nexport type PrismaWriteActionType = (typeof PrismaWriteActions)[number];\n\n/**\n * Maybe promise\n */\nexport type MaybePromise<T> = T | Promise<T> | PromiseLike<T>;\n","import { lowerCaseFirst } from 'lower-case-first';\nimport { ModelMeta } from '.';\n\n/**\n * Gets field names in a data model entity, filtering out internal fields.\n */\nexport function getModelFields(data: object) {\n return data ? Object.keys(data) : [];\n}\n\n/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n\n/**\n * Zip two arrays or scalars.\n */\nexport function zip<T1, T2>(x: Enumerable<T1>, y: Enumerable<T2>): Array<[T1, T2]> {\n if (Array.isArray(x)) {\n if (!Array.isArray(y)) {\n throw new Error('x and y should be both array or both scalar');\n }\n if (x.length !== y.length) {\n throw new Error('x and y should have the same length');\n }\n return x.map((_, i) => [x[i], y[i]] as [T1, T2]);\n } else {\n if (Array.isArray(y)) {\n throw new Error('x and y should be both array or both scalar');\n }\n return [[x, y]];\n }\n}\n\nexport function getIdFields(modelMeta: ModelMeta, model: string, throwIfNotFound = false) {\n let fields = modelMeta.fields[lowerCaseFirst(model)];\n if (!fields) {\n if (throwIfNotFound) {\n throw new Error(`Unable to load fields for ${model}`);\n } else {\n fields = {};\n }\n }\n const result = Object.values(fields).filter((f) => f.isId);\n if (result.length === 0 && throwIfNotFound) {\n throw new Error(`model ${model} does not have an id field`);\n }\n return result;\n}\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { FieldInfo, ModelMeta } from './model-meta';\nimport { resolveField } from './model-meta';\nimport { MaybePromise, PrismaWriteActionType, PrismaWriteActions } from './types';\nimport { enumerate, getModelFields } from './utils';\n\ntype NestingPathItem = { field?: FieldInfo; model: string; where: any; unique: boolean };\n\n/**\n * Context for visiting\n */\nexport type NestedWriteVisitorContext = {\n /**\n * Parent data, can be used to replace fields\n */\n parent: any;\n\n /**\n * Current field, undefined if toplevel\n */\n field?: FieldInfo;\n\n /**\n * A top-down path of all nested update conditions and corresponding field till now\n */\n nestingPath: NestingPathItem[];\n};\n\n/**\n * NestedWriteVisitor's callback actions. A call back function should return true or void to indicate\n * that the visitor should continue traversing its children, or false to stop. It can also return an object\n * to let the visitor traverse it instead of its original children.\n */\nexport type NestedWriterVisitorCallback = {\n create?: (model: string, args: any[], context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n createMany?: (\n model: string,\n args: { data: any; skipDuplicates?: boolean },\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n connectOrCreate?: (\n model: string,\n args: { where: object; create: any },\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n connect?: (\n model: string,\n args: object,\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n disconnect?: (\n model: string,\n args: object,\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n set?: (model: string, args: object, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n update?: (model: string, args: object, context: NestedWriteVisitorContext) => MaybePromise<boolean | object | void>;\n\n updateMany?: (\n model: string,\n args: { where?: object; data: any },\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n upsert?: (\n model: string,\n args: { where: object; create: any; update: any },\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n delete?: (\n model: string,\n args: object | boolean,\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n deleteMany?: (\n model: string,\n args: any | object,\n context: NestedWriteVisitorContext\n ) => MaybePromise<boolean | object | void>;\n\n field?: (\n field: FieldInfo,\n action: PrismaWriteActionType,\n data: any,\n context: NestedWriteVisitorContext\n ) => MaybePromise<void>;\n};\n\n/**\n * Recursive visitor for nested write (create/update) payload.\n */\nexport class NestedWriteVisitor {\n constructor(private readonly modelMeta: ModelMeta, private readonly callback: NestedWriterVisitorCallback) {}\n\n private isPrismaWriteAction(value: string): value is PrismaWriteActionType {\n return PrismaWriteActions.includes(value as PrismaWriteActionType);\n }\n\n /**\n * Start visiting\n *\n * @see NestedWriterVisitorCallback\n */\n async visit(model: string, action: PrismaWriteActionType, args: any): Promise<void> {\n if (!args) {\n return;\n }\n\n let topData = args;\n\n switch (action) {\n // create has its data wrapped in 'data' field\n case 'create':\n topData = topData.data;\n break;\n\n case 'delete':\n case 'deleteMany':\n topData = topData.where;\n break;\n }\n\n await this.doVisit(model, action, topData, undefined, undefined, []);\n }\n\n private async doVisit(\n model: string,\n action: PrismaWriteActionType,\n data: any,\n parent: any,\n field: FieldInfo | undefined,\n nestingPath: NestingPathItem[]\n ): Promise<void> {\n if (!data) {\n return;\n }\n\n const toplevel = field == undefined;\n\n const context = { parent, field, nestingPath: [...nestingPath] };\n const pushNewContext = (field: FieldInfo | undefined, model: string, where: any, unique = false) => {\n return { ...context, nestingPath: [...context.nestingPath, { field, model, where, unique }] };\n };\n\n // visit payload\n switch (action) {\n case 'create':\n for (const item of enumerate(data)) {\n const newContext = pushNewContext(field, model, {});\n let callbackResult: any;\n if (this.callback.create) {\n callbackResult = await this.callback.create(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'createMany':\n if (data) {\n const newContext = pushNewContext(field, model, {});\n let callbackResult: any;\n if (this.callback.createMany) {\n callbackResult = await this.callback.createMany(model, data, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : data.data;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'connectOrCreate':\n for (const item of enumerate(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.connectOrCreate) {\n callbackResult = await this.callback.connectOrCreate(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item.create;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'connect':\n if (this.callback.connect) {\n for (const item of enumerate(data)) {\n const newContext = pushNewContext(field, model, item, true);\n await this.callback.connect(model, item, newContext);\n }\n }\n break;\n\n case 'disconnect':\n // disconnect has two forms:\n // if relation is to-many, the payload is a unique filter object\n // if relation is to-one, the payload can only be boolean `true`\n if (this.callback.disconnect) {\n for (const item of enumerate(data)) {\n const newContext = pushNewContext(field, model, item, typeof item === 'object');\n await this.callback.disconnect(model, item, newContext);\n }\n }\n break;\n\n case 'set':\n if (this.callback.set) {\n const newContext = pushNewContext(field, model, {});\n await this.callback.set(model, data, newContext);\n }\n break;\n\n case 'update':\n for (const item of enumerate(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.update) {\n callbackResult = await this.callback.update(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload =\n typeof callbackResult === 'object'\n ? callbackResult\n : typeof item.data === 'object'\n ? item.data\n : item;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'updateMany':\n for (const item of enumerate(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.updateMany) {\n callbackResult = await this.callback.updateMany(model, item, newContext);\n }\n if (callbackResult !== false) {\n const subPayload = typeof callbackResult === 'object' ? callbackResult : item;\n await this.visitSubPayload(model, action, subPayload, newContext.nestingPath);\n }\n }\n break;\n\n case 'upsert': {\n for (const item of enumerate(data)) {\n const newContext = pushNewContext(field, model, item.where);\n let callbackResult: any;\n if (this.callback.upsert) {\n callbackResult = await this.callback.upsert(model, item, newContext);\n }\n if (callbackResult !== false) {\n if (typeof callbackResult === 'object') {\n await this.visitSubPayload(model, action, callbackResult, newContext.nestingPath);\n } else {\n await this.visitSubPayload(model, action, item.create, newContext.nestingPath);\n await this.visitSubPayload(model, action, item.update, newContext.nestingPath);\n }\n }\n }\n break;\n }\n\n case 'delete': {\n if (this.callback.delete) {\n for (const item of enumerate(data)) {\n const newContext = pushNewContext(field, model, toplevel ? item.where : item);\n await this.callback.delete(model, item, newContext);\n }\n }\n break;\n }\n\n case 'deleteMany':\n if (this.callback.deleteMany) {\n for (const item of enumerate(data)) {\n const newContext = pushNewContext(field, model, toplevel ? item.where : item);\n await this.callback.deleteMany(model, item, newContext);\n }\n }\n break;\n\n default: {\n throw new Error(`unhandled action type ${action}`);\n }\n }\n }\n\n private async visitSubPayload(\n model: string,\n action: PrismaWriteActionType,\n payload: any,\n nestingPath: NestingPathItem[]\n ) {\n for (const field of getModelFields(payload)) {\n const fieldInfo = resolveField(this.modelMeta, model, field);\n if (!fieldInfo) {\n continue;\n }\n\n if (fieldInfo.isDataModel) {\n if (payload[field]) {\n // recurse into nested payloads\n for (const [subAction, subData] of Object.entries<any>(payload[field])) {\n if (this.isPrismaWriteAction(subAction) && subData) {\n await this.doVisit(fieldInfo.type, subAction, subData, payload[field], fieldInfo, [\n ...nestingPath,\n ]);\n }\n }\n }\n } else {\n // visit plain field\n if (this.callback.field) {\n await this.callback.field(fieldInfo, action, payload[field], {\n parent: payload,\n nestingPath,\n field: fieldInfo,\n });\n }\n }\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { lowerCaseFirst } from 'lower-case-first';\nimport type { ModelMeta } from './model-meta';\nimport { NestedReadVisitor } from './nested-read-visitor';\nimport { NestedWriteVisitor } from './nested-write-visitor';\nimport type { PrismaWriteActionType } from './types';\n\n/**\n * Gets models read (including nested ones) given a query args.\n * @param model\n * @param targetModels\n * @param modelMeta\n * @param args\n * @returns\n */\nexport function getReadModels(model: string, modelMeta: ModelMeta, args: any) {\n const result = new Set<string>();\n result.add(model);\n const visitor = new NestedReadVisitor(modelMeta, {\n field: (model) => {\n result.add(model);\n return true;\n },\n });\n visitor.visit(model, args);\n return [...result];\n}\n\n/**\n * Gets mutated models (including nested ones) given a mutation args.\n */\nexport async function getMutatedModels(\n model: string,\n operation: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta\n) {\n const result = new Set<string>();\n result.add(model);\n\n if (mutationArgs) {\n const addModel = (model: string) => void result.add(model);\n\n // add models that are cascaded deleted recursively\n const addCascades = (model: string) => {\n const cascades = new Set<string>();\n const visited = new Set<string>();\n collectDeleteCascades(model, modelMeta, cascades, visited);\n cascades.forEach((m) => addModel(m));\n };\n\n const visitor = new NestedWriteVisitor(modelMeta, {\n create: addModel,\n createMany: addModel,\n connectOrCreate: addModel,\n connect: addModel,\n disconnect: addModel,\n set: addModel,\n update: addModel,\n updateMany: addModel,\n upsert: addModel,\n delete: (model) => {\n addModel(model);\n addCascades(model);\n },\n deleteMany: (model) => {\n addModel(model);\n addCascades(model);\n },\n });\n await visitor.visit(model, operation, mutationArgs);\n }\n\n return [...result];\n}\n\nfunction collectDeleteCascades(model: string, modelMeta: ModelMeta, result: Set<string>, visited: Set<string>) {\n if (visited.has(model)) {\n // break circle\n return;\n }\n visited.add(model);\n\n const cascades = modelMeta.deleteCascade[lowerCaseFirst(model)];\n\n if (!cascades) {\n return;\n }\n\n cascades.forEach((m) => {\n result.add(m);\n collectDeleteCascades(m, modelMeta, result, visited);\n });\n}\n"],"mappings":"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","names":["model","data","uuid","deepcopy","field","import_lower_case_first","field","model","import_lower_case_first","model"]}
|