@zenstackhq/runtime 2.15.1 → 2.16.0
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/cross/index.js +32 -12
- package/cross/index.js.map +1 -1
- package/cross/index.mjs +28 -8
- package/cross/index.mjs.map +1 -1
- package/enhancements/edge/delegate.js +5 -6
- package/enhancements/edge/delegate.js.map +1 -1
- package/enhancements/edge/policy/handler.js +5 -7
- package/enhancements/edge/policy/handler.js.map +1 -1
- package/enhancements/edge/policy/policy-utils.js +13 -14
- package/enhancements/edge/policy/policy-utils.js.map +1 -1
- package/enhancements/node/delegate.js +5 -6
- package/enhancements/node/delegate.js.map +1 -1
- package/enhancements/node/policy/handler.js +5 -7
- package/enhancements/node/policy/handler.js.map +1 -1
- package/enhancements/node/policy/policy-utils.js +13 -14
- package/enhancements/node/policy/policy-utils.js.map +1 -1
- package/local-helpers/index.d.ts +6 -0
- package/local-helpers/index.js +23 -0
- package/local-helpers/index.js.map +1 -0
- package/local-helpers/is-plain-object.d.ts +1 -0
- package/local-helpers/is-plain-object.js +25 -0
- package/local-helpers/is-plain-object.js.map +1 -0
- package/local-helpers/lower-case-first.d.ts +1 -0
- package/local-helpers/lower-case-first.js +7 -0
- package/local-helpers/lower-case-first.js.map +1 -0
- package/local-helpers/param-case.d.ts +1 -0
- package/local-helpers/param-case.js +20 -0
- package/local-helpers/param-case.js.map +1 -0
- package/local-helpers/sleep.d.ts +1 -0
- package/local-helpers/sleep.js +9 -0
- package/local-helpers/sleep.js.map +1 -0
- package/local-helpers/tiny-invariant.d.ts +1 -0
- package/local-helpers/tiny-invariant.js +15 -0
- package/local-helpers/tiny-invariant.js.map +1 -0
- package/local-helpers/upper-case-first.d.ts +1 -0
- package/local-helpers/upper-case-first.js +7 -0
- package/local-helpers/upper-case-first.js.map +1 -0
- package/package.json +10 -8
- package/types.d.ts +20 -0
package/cross/index.js
CHANGED
|
@@ -79,14 +79,37 @@ __export(cross_exports, {
|
|
|
79
79
|
});
|
|
80
80
|
module.exports = __toCommonJS(cross_exports);
|
|
81
81
|
|
|
82
|
+
// src/local-helpers/is-plain-object.ts
|
|
83
|
+
function isObject(o) {
|
|
84
|
+
return Object.prototype.toString.call(o) === "[object Object]";
|
|
85
|
+
}
|
|
86
|
+
function isPlainObject(o) {
|
|
87
|
+
if (isObject(o) === false) return false;
|
|
88
|
+
const ctor = o.constructor;
|
|
89
|
+
if (ctor === void 0) return true;
|
|
90
|
+
const prot = ctor.prototype;
|
|
91
|
+
if (isObject(prot) === false) return false;
|
|
92
|
+
if (Object.prototype.hasOwnProperty.call(prot, "isPrototypeOf") === false) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/local-helpers/lower-case-first.ts
|
|
99
|
+
function lowerCaseFirst(input) {
|
|
100
|
+
return input.charAt(0).toLowerCase() + input.slice(1);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/local-helpers/tiny-invariant.ts
|
|
104
|
+
var isProduction = process.env.NODE_ENV === "production";
|
|
105
|
+
|
|
82
106
|
// src/cross/clone.ts
|
|
83
|
-
var import_is_plain_object = require("is-plain-object");
|
|
84
107
|
function clone(value) {
|
|
85
108
|
if (Array.isArray(value)) {
|
|
86
109
|
return value.map((v) => clone(v));
|
|
87
110
|
}
|
|
88
111
|
if (typeof value === "object") {
|
|
89
|
-
if (!value || !
|
|
112
|
+
if (!value || !isPlainObject(value)) {
|
|
90
113
|
return value;
|
|
91
114
|
}
|
|
92
115
|
const result = {};
|
|
@@ -130,11 +153,10 @@ var ModelDataVisitor = class {
|
|
|
130
153
|
};
|
|
131
154
|
|
|
132
155
|
// src/cross/model-meta.ts
|
|
133
|
-
var import_lower_case_first = require("lower-case-first");
|
|
134
156
|
function resolveField(modelMeta, modelOrTypeDef, field, isTypeDef = false) {
|
|
135
157
|
var _a, _b;
|
|
136
158
|
const container = isTypeDef ? modelMeta.typeDefs : modelMeta.models;
|
|
137
|
-
return (_b = (_a = container == null ? void 0 : container[
|
|
159
|
+
return (_b = (_a = container == null ? void 0 : container[lowerCaseFirst(modelOrTypeDef)]) == null ? void 0 : _a.fields) == null ? void 0 : _b[field];
|
|
138
160
|
}
|
|
139
161
|
function requireField(modelMeta, model, field, isTypeDef = false) {
|
|
140
162
|
const f = resolveField(modelMeta, model, field, isTypeDef);
|
|
@@ -145,11 +167,11 @@ function requireField(modelMeta, model, field, isTypeDef = false) {
|
|
|
145
167
|
}
|
|
146
168
|
function getFields(modelMeta, model) {
|
|
147
169
|
var _a;
|
|
148
|
-
return (_a = modelMeta.models[
|
|
170
|
+
return (_a = modelMeta.models[lowerCaseFirst(model)]) == null ? void 0 : _a.fields;
|
|
149
171
|
}
|
|
150
172
|
function getUniqueConstraints(modelMeta, model) {
|
|
151
173
|
var _a;
|
|
152
|
-
return (_a = modelMeta.models[
|
|
174
|
+
return (_a = modelMeta.models[lowerCaseFirst(model)]) == null ? void 0 : _a.uniqueConstraints;
|
|
153
175
|
}
|
|
154
176
|
|
|
155
177
|
// src/cross/mutator.ts
|
|
@@ -520,7 +542,6 @@ var PrismaWriteActions = [
|
|
|
520
542
|
];
|
|
521
543
|
|
|
522
544
|
// src/cross/utils.ts
|
|
523
|
-
var import_lower_case_first2 = require("lower-case-first");
|
|
524
545
|
function getModelFields(data) {
|
|
525
546
|
return data ? Object.keys(data) : [];
|
|
526
547
|
}
|
|
@@ -551,7 +572,7 @@ function zip(x, y) {
|
|
|
551
572
|
}
|
|
552
573
|
function getIdFields(modelMeta, model, throwIfNotFound = false) {
|
|
553
574
|
var _a, _b;
|
|
554
|
-
const uniqueConstraints = (_b = (_a = modelMeta.models[
|
|
575
|
+
const uniqueConstraints = (_b = (_a = modelMeta.models[lowerCaseFirst(model)]) == null ? void 0 : _a.uniqueConstraints) != null ? _b : {};
|
|
555
576
|
const entries = Object.values(uniqueConstraints);
|
|
556
577
|
if (entries.length === 0) {
|
|
557
578
|
if (throwIfNotFound) {
|
|
@@ -562,7 +583,7 @@ function getIdFields(modelMeta, model, throwIfNotFound = false) {
|
|
|
562
583
|
return entries[0].fields.map((f) => requireField(modelMeta, model, f));
|
|
563
584
|
}
|
|
564
585
|
function getModelInfo(modelMeta, model, throwIfNotFound = false) {
|
|
565
|
-
const info = modelMeta.models[
|
|
586
|
+
const info = modelMeta.models[lowerCaseFirst(model)];
|
|
566
587
|
if (!info && throwIfNotFound) {
|
|
567
588
|
throw new Error(`Unable to load info for ${model}`);
|
|
568
589
|
}
|
|
@@ -570,7 +591,7 @@ function getModelInfo(modelMeta, model, throwIfNotFound = false) {
|
|
|
570
591
|
}
|
|
571
592
|
function getTypeDefInfo(modelMeta, typeDef, throwIfNotFound = false) {
|
|
572
593
|
var _a;
|
|
573
|
-
const info = (_a = modelMeta.typeDefs) == null ? void 0 : _a[
|
|
594
|
+
const info = (_a = modelMeta.typeDefs) == null ? void 0 : _a[lowerCaseFirst(typeDef)];
|
|
574
595
|
if (!info && throwIfNotFound) {
|
|
575
596
|
throw new Error(`Unable to load info for ${typeDef}`);
|
|
576
597
|
}
|
|
@@ -801,7 +822,6 @@ var NestedWriteVisitor = class {
|
|
|
801
822
|
};
|
|
802
823
|
|
|
803
824
|
// src/cross/query-analyzer.ts
|
|
804
|
-
var import_lower_case_first3 = require("lower-case-first");
|
|
805
825
|
function getReadModels(model, modelMeta, args) {
|
|
806
826
|
const result = /* @__PURE__ */ new Set();
|
|
807
827
|
result.add(model);
|
|
@@ -859,7 +879,7 @@ function collectDeleteCascades(model, modelMeta, result, visited) {
|
|
|
859
879
|
return;
|
|
860
880
|
}
|
|
861
881
|
visited.add(model);
|
|
862
|
-
const cascades = (_a = modelMeta.deleteCascade) == null ? void 0 : _a[
|
|
882
|
+
const cascades = (_a = modelMeta.deleteCascade) == null ? void 0 : _a[lowerCaseFirst(model)];
|
|
863
883
|
if (!cascades) {
|
|
864
884
|
return;
|
|
865
885
|
}
|
package/cross/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cross/index.ts","../../src/cross/clone.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 './clone';\nexport * 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","import { isPlainObject } from 'is-plain-object';\n\n/**\n * Clones the given object. Only arrays and plain objects are cloned. Other values are returned as is.\n */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => clone(v)) as T;\n }\n\n if (typeof value === 'object') {\n if (!value || !isPlainObject(value)) {\n return value;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any = {};\n for (const key of Object.keys(value)) {\n result[key] = clone(value[key as keyof T]);\n }\n return result;\n }\n\n return value;\n}\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 /**\n * Attribute name\n */\n name: string;\n\n /**\n * Attribute arguments\n */\n args: Array<{ name?: string; value: unknown }>;\n};\n\n/**\n * Function for computing default value for a field\n */\nexport type FieldDefaultValueProvider = (userContext: unknown) => unknown;\n\n/**\n * Action to take when the related model is deleted or updated\n */\nexport type RelationAction = 'Cascade' | 'Restrict' | 'NoAction' | 'SetNull' | 'SetDefault';\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 type is a type def (or an optional/array of type def)\n */\n isTypeDef?: 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 * Action to take when the related model is deleted.\n */\n onDeleteAction?: RelationAction;\n\n /**\n * Action to take when the related model is updated.\n */\n onUpdateAction?: RelationAction;\n\n /**\n * If the field is a foreign key field\n */\n isForeignKey?: boolean;\n\n /**\n * If the field is a foreign key field, the field name of the corresponding relation field.\n * Only available on foreign key fields.\n */\n relationField?: string;\n\n /**\n * Mapping from relation's pk to fk. Only available on relation fields.\n */\n foreignKeyMapping?: Record<string, string>;\n\n /**\n * Model from which the field is inherited\n */\n inheritedFrom?: string;\n\n /**\n * A function that provides a default value for the field\n */\n defaultValueProvider?: FieldDefaultValueProvider;\n\n /**\n * If the field is an auto-increment field\n */\n isAutoIncrement?: boolean;\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 * Metadata for a data model\n */\nexport type ModelInfo = {\n /**\n * Model name\n */\n name: string;\n\n /**\n * Base types (not including abstract base models).\n */\n baseTypes?: string[];\n\n /**\n * Fields\n */\n fields: Record<string, FieldInfo>;\n\n /**\n * Unique constraints\n */\n uniqueConstraints?: Record<string, UniqueConstraint>;\n\n /**\n * Attributes on the model\n */\n attributes?: RuntimeAttribute[];\n\n /**\n * Discriminator field name\n */\n discriminator?: string;\n};\n\n/**\n * Metadata for a type def\n */\nexport type TypeDefInfo = {\n /**\n * TypeDef name\n */\n name: string;\n\n /**\n * Fields\n */\n fields: Record<string, FieldInfo>;\n};\n\n/**\n * ZModel data model metadata\n */\nexport type ModelMeta = {\n /**\n * Data models\n */\n models: Record<string, ModelInfo>;\n\n /**\n * Type defs\n */\n typeDefs?: Record<string, TypeDefInfo>;\n\n /**\n * Mapping from model name to models that will be deleted because of it due to cascade 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 * Optional map from full names to shortened names, used for extra fields/relations generated by ZenStack\n */\n shortNameMap?: Record<string, string>;\n};\n\n/**\n * Resolves a model field to its metadata. Returns undefined if not found.\n */\nexport function resolveField(\n modelMeta: ModelMeta,\n modelOrTypeDef: string,\n field: string,\n isTypeDef = false\n): FieldInfo | undefined {\n const container = isTypeDef ? modelMeta.typeDefs : modelMeta.models;\n return container?.[lowerCaseFirst(modelOrTypeDef)]?.fields?.[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, isTypeDef = false) {\n const f = resolveField(modelMeta, model, field, isTypeDef);\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.models[lowerCaseFirst(model)]?.fields;\n}\n\n/**\n * Gets unique constraints of a model.\n */\nexport function getUniqueConstraints(modelMeta: ModelMeta, model: string) {\n return modelMeta.models[lowerCaseFirst(model)]?.uniqueConstraints;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { v4 as uuid } from 'uuid';\nimport {\n FieldInfo,\n NestedWriteVisitor,\n enumerate,\n getFields,\n getIdFields,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '.';\nimport { clone } from './clone';\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 (!queryData || (typeof queryData !== 'object' && !Array.isArray(queryData))) {\n return undefined;\n }\n\n if (!queryOp.startsWith('find')) {\n // only findXXX results are applicable\n return undefined;\n }\n\n return await doApplyMutation(queryModel, queryData, mutationModel, mutationOp, mutationArgs, modelMeta, logging);\n}\n\nasync function doApplyMutation(\n queryModel: string,\n queryData: any,\n mutationModel: string,\n mutationOp: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n let resultData = queryData;\n let updated = false;\n\n const visitor = new NestedWriteVisitor(modelMeta, {\n create: (model, args) => {\n if (\n model === queryModel &&\n Array.isArray(resultData) // \"create\" mutation is only relevant for arrays\n ) {\n const r = createMutate(queryModel, resultData, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n createMany: (model, args) => {\n if (\n model === queryModel &&\n args?.data &&\n Array.isArray(resultData) // \"createMany\" mutation is only relevant for arrays\n ) {\n for (const oneArg of enumerate(args.data)) {\n const r = createMutate(queryModel, resultData, oneArg, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n }\n },\n\n update: (model, args) => {\n if (\n model === queryModel &&\n !Array.isArray(resultData) // array elements will be handled with recursion\n ) {\n const r = updateMutate(queryModel, resultData, model, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n upsert: (model, args) => {\n if (model === queryModel && args?.where && args?.create && args?.update) {\n const r = upsertMutate(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 const modelFields = getFields(modelMeta, queryModel);\n\n if (Array.isArray(resultData)) {\n // try to apply mutation to each item in the array, replicate the entire\n // array if any item is updated\n\n let arrayCloned = false;\n for (let i = 0; i < resultData.length; i++) {\n const item = resultData[i];\n if (\n !item ||\n typeof item !== 'object' ||\n item.$optimistic // skip items already optimistically updated\n ) {\n continue;\n }\n\n const r = await doApplyMutation(\n queryModel,\n item,\n mutationModel,\n mutationOp,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (r && typeof r === 'object') {\n if (!arrayCloned) {\n resultData = [...resultData];\n arrayCloned = true;\n }\n resultData[i] = r;\n updated = true;\n }\n }\n } else if (resultData !== null && typeof resultData === 'object') {\n // Clone resultData to prevent mutations affecting the loop\n const currentData = { ...resultData };\n\n // iterate over each field and apply mutation to nested data models\n for (const [key, value] of Object.entries(currentData)) {\n const fieldInfo = modelFields[key];\n if (!fieldInfo?.isDataModel) {\n continue;\n }\n\n const r = await doApplyMutation(\n fieldInfo.type,\n value,\n mutationModel,\n mutationOp,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (r && typeof r === 'object') {\n resultData = { ...resultData, [key]: r };\n updated = true;\n }\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction createMutate(queryModel: string, currentData: any, newData: any, modelMeta: ModelMeta, logging: boolean) {\n if (!newData) {\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 && newData[name]) {\n // deal with \"connect\"\n assignForeignKeyFields(field, insert, newData[name]);\n return;\n }\n\n if (newDataFields.includes(name)) {\n insert[name] = clone(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 || typeof currentData !== 'object') {\n return undefined;\n }\n\n if (!mutateArgs?.where || typeof mutateArgs.where !== 'object') {\n return undefined;\n }\n\n if (!mutateArgs?.data || typeof mutateArgs.data !== 'object') {\n return undefined;\n }\n\n if (!idFieldsMatch(mutateModel, currentData, mutateArgs.where, modelMeta)) {\n return undefined;\n }\n\n const modelFields = getFields(modelMeta, queryModel);\n if (!modelFields) {\n return undefined;\n }\n\n let updated = false;\n let resultData = currentData;\n\n for (const [key, value] of Object.entries<any>(mutateArgs.data)) {\n const fieldInfo = modelFields[key];\n if (!fieldInfo) {\n continue;\n }\n\n if (fieldInfo.isDataModel && !value?.connect) {\n // relation field but without \"connect\"\n continue;\n }\n\n if (!updated) {\n // clone\n resultData = { ...currentData };\n }\n\n if (fieldInfo.isDataModel) {\n // deal with \"connect\"\n assignForeignKeyFields(fieldInfo, resultData, value);\n } else {\n resultData[key] = clone(value);\n }\n resultData.$optimistic = true;\n updated = true;\n\n if (logging) {\n console.log(`Optimistic update for ${queryModel}:`, resultData);\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction upsertMutate(\n queryModel: string,\n currentData: any,\n model: string,\n args: { where: object; create: any; update: any },\n modelMeta: ModelMeta,\n logging: boolean\n) {\n let updated = false;\n let resultData = currentData;\n\n if (Array.isArray(resultData)) {\n // check if we should create or update\n const foundIndex = resultData.findIndex((x) => idFieldsMatch(model, x, args.where, modelMeta));\n if (foundIndex >= 0) {\n const updateResult = updateMutate(\n queryModel,\n resultData[foundIndex],\n model,\n { where: args.where, data: args.update },\n modelMeta,\n logging\n );\n if (updateResult) {\n // replace the found item with updated item\n resultData = [...resultData.slice(0, foundIndex), updateResult, ...resultData.slice(foundIndex + 1)];\n updated = true;\n }\n } else {\n const createResult = createMutate(queryModel, resultData, args.create, modelMeta, logging);\n if (createResult) {\n resultData = createResult;\n updated = true;\n }\n }\n } else {\n // try update only\n const updateResult = updateMutate(\n queryModel,\n resultData,\n model,\n { where: args.where, data: args.update },\n modelMeta,\n logging\n );\n if (updateResult) {\n resultData = updateResult;\n updated = true;\n }\n }\n\n return updated ? resultData : 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\nfunction assignForeignKeyFields(field: FieldInfo, resultData: any, mutationData: any) {\n // convert \"connect\" like `{ connect: { id: '...' } }` to foreign key fields\n // assignment: `{ userId: '...' }`\n if (!mutationData?.connect) {\n return;\n }\n\n if (!field.foreignKeyMapping) {\n return;\n }\n\n for (const [idField, fkField] of Object.entries(field.foreignKeyMapping)) {\n if (idField in mutationData.connect) {\n resultData[fkField] = mutationData.connect[idField];\n }\n }\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 'createManyAndReturn',\n 'connectOrCreate',\n 'update',\n 'updateMany',\n 'updateManyAndReturn',\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 { requireField, type ModelInfo, type ModelMeta, type TypeDefInfo } 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\n/**\n * Gets ID fields of a model.\n */\nexport function getIdFields(modelMeta: ModelMeta, model: string, throwIfNotFound = false) {\n const uniqueConstraints = modelMeta.models[lowerCaseFirst(model)]?.uniqueConstraints ?? {};\n\n const entries = Object.values(uniqueConstraints);\n if (entries.length === 0) {\n if (throwIfNotFound) {\n throw new Error(`Model ${model} does not have any id field`);\n }\n return [];\n }\n\n return entries[0].fields.map((f) => requireField(modelMeta, model, f));\n}\n\n/**\n * Gets info for a model.\n */\nexport function getModelInfo<Throw extends boolean = false>(\n modelMeta: ModelMeta,\n model: string,\n throwIfNotFound: Throw = false as Throw\n): Throw extends true ? ModelInfo : ModelInfo | undefined {\n const info = modelMeta.models[lowerCaseFirst(model)];\n if (!info && throwIfNotFound) {\n throw new Error(`Unable to load info for ${model}`);\n }\n return info;\n}\n\n/**\n * Gets info for a type def.\n */\nexport function getTypeDefInfo<Throw extends boolean = false>(\n modelMeta: ModelMeta,\n typeDef: string,\n throwIfNotFound: Throw = false as Throw\n): Throw extends true ? TypeDefInfo : TypeDefInfo | undefined {\n const info = modelMeta.typeDefs?.[lowerCaseFirst(typeDef)];\n if (!info && throwIfNotFound) {\n throw new Error(`Unable to load info for ${typeDef}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return info as any;\n}\n\n/**\n * Checks if a model is a delegate model.\n */\nexport function isDelegateModel(modelMeta: ModelMeta, model: string) {\n return !!getModelInfo(modelMeta, model)?.attributes?.some((attr) => attr.name === '@@delegate');\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, data: 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 this.enumerateReverse(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 case 'createManyAndReturn':\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 this.enumerateReverse(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 this.enumerateReverse(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 this.enumerateReverse(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 for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item, true);\n await this.callback.set(model, item, newContext);\n }\n }\n break;\n\n case 'update':\n for (const item of this.enumerateReverse(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 case 'updateManyAndReturn':\n for (const item of this.enumerateReverse(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 this.enumerateReverse(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 this.enumerateReverse(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 this.enumerateReverse(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 item of enumerate(payload)) {\n for (const field of getModelFields(item)) {\n const fieldInfo = resolveField(this.modelMeta, model, field);\n if (!fieldInfo) {\n continue;\n }\n\n if (fieldInfo.isDataModel) {\n if (item[field]) {\n // recurse into nested payloads\n for (const [subAction, subData] of Object.entries<any>(item[field])) {\n if (this.isPrismaWriteAction(subAction) && subData) {\n await this.doVisit(fieldInfo.type, subAction, subData, item[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, item[field], {\n parent: item,\n nestingPath,\n field: fieldInfo,\n });\n }\n }\n }\n }\n }\n\n // enumerate a (possible) array in reverse order, so that the enumeration\n // callback can safely delete the current item\n private *enumerateReverse(data: any) {\n if (Array.isArray(data)) {\n for (let i = data.length - 1; i >= 0; i--) {\n yield data[i];\n }\n } else {\n yield data;\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';\nimport { getModelInfo } from './utils';\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 // include delegate base models recursively\n result.forEach((m) => {\n getBaseRecursively(m, modelMeta, result);\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\nfunction getBaseRecursively(model: string, modelMeta: ModelMeta, result: Set<string>) {\n const bases = getModelInfo(modelMeta, model)?.baseTypes;\n if (bases) {\n bases.forEach((base) => {\n result.add(base);\n getBaseRecursively(base, modelMeta, result);\n });\n }\n}\n"],"mappings":"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","names":["model","data","uuid","field","import_lower_case_first","field","model","import_lower_case_first","model"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cross/index.ts","../../src/local-helpers/is-plain-object.ts","../../src/local-helpers/lower-case-first.ts","../../src/local-helpers/tiny-invariant.ts","../../src/cross/clone.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 './clone';\nexport * 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","function isObject(o: unknown) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isPlainObject(o: unknown) {\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n const ctor = (o as { constructor: unknown }).constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n const prot = (ctor as { prototype: unknown }).prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n","export function lowerCaseFirst(input: string) {\n return input.charAt(0).toLowerCase() + input.slice(1);\n}\n","const isProduction = process.env.NODE_ENV === 'production';\nconst prefix = 'Invariant failed';\n\nexport function invariant(\n condition: unknown,\n message?: string,\n): asserts condition {\n if (condition) {\n return;\n }\n\n if (isProduction) {\n throw new Error(prefix);\n }\n\n throw new Error(message ? `${prefix}: ${message}` : prefix);\n}\n","import { isPlainObject } from '../local-helpers';\n\n/**\n * Clones the given object. Only arrays and plain objects are cloned. Other values are returned as is.\n */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => clone(v)) as T;\n }\n\n if (typeof value === 'object') {\n if (!value || !isPlainObject(value)) {\n return value;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any = {};\n for (const key of Object.keys(value)) {\n result[key] = clone(value[key as keyof T]);\n }\n return result;\n }\n\n return value;\n}\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 '../local-helpers';\n\n/**\n * Runtime information of a data model or field attribute\n */\nexport type RuntimeAttribute = {\n /**\n * Attribute name\n */\n name: string;\n\n /**\n * Attribute arguments\n */\n args: Array<{ name?: string; value: unknown }>;\n};\n\n/**\n * Function for computing default value for a field\n */\nexport type FieldDefaultValueProvider = (userContext: unknown) => unknown;\n\n/**\n * Action to take when the related model is deleted or updated\n */\nexport type RelationAction = 'Cascade' | 'Restrict' | 'NoAction' | 'SetNull' | 'SetDefault';\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 type is a type def (or an optional/array of type def)\n */\n isTypeDef?: 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 * Action to take when the related model is deleted.\n */\n onDeleteAction?: RelationAction;\n\n /**\n * Action to take when the related model is updated.\n */\n onUpdateAction?: RelationAction;\n\n /**\n * If the field is a foreign key field\n */\n isForeignKey?: boolean;\n\n /**\n * If the field is a foreign key field, the field name of the corresponding relation field.\n * Only available on foreign key fields.\n */\n relationField?: string;\n\n /**\n * Mapping from relation's pk to fk. Only available on relation fields.\n */\n foreignKeyMapping?: Record<string, string>;\n\n /**\n * Model from which the field is inherited\n */\n inheritedFrom?: string;\n\n /**\n * A function that provides a default value for the field\n */\n defaultValueProvider?: FieldDefaultValueProvider;\n\n /**\n * If the field is an auto-increment field\n */\n isAutoIncrement?: boolean;\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 * Metadata for a data model\n */\nexport type ModelInfo = {\n /**\n * Model name\n */\n name: string;\n\n /**\n * Base types (not including abstract base models).\n */\n baseTypes?: string[];\n\n /**\n * Fields\n */\n fields: Record<string, FieldInfo>;\n\n /**\n * Unique constraints\n */\n uniqueConstraints?: Record<string, UniqueConstraint>;\n\n /**\n * Attributes on the model\n */\n attributes?: RuntimeAttribute[];\n\n /**\n * Discriminator field name\n */\n discriminator?: string;\n};\n\n/**\n * Metadata for a type def\n */\nexport type TypeDefInfo = {\n /**\n * TypeDef name\n */\n name: string;\n\n /**\n * Fields\n */\n fields: Record<string, FieldInfo>;\n};\n\n/**\n * ZModel data model metadata\n */\nexport type ModelMeta = {\n /**\n * Data models\n */\n models: Record<string, ModelInfo>;\n\n /**\n * Type defs\n */\n typeDefs?: Record<string, TypeDefInfo>;\n\n /**\n * Mapping from model name to models that will be deleted because of it due to cascade 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 * Optional map from full names to shortened names, used for extra fields/relations generated by ZenStack\n */\n shortNameMap?: Record<string, string>;\n};\n\n/**\n * Resolves a model field to its metadata. Returns undefined if not found.\n */\nexport function resolveField(\n modelMeta: ModelMeta,\n modelOrTypeDef: string,\n field: string,\n isTypeDef = false\n): FieldInfo | undefined {\n const container = isTypeDef ? modelMeta.typeDefs : modelMeta.models;\n return container?.[lowerCaseFirst(modelOrTypeDef)]?.fields?.[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, isTypeDef = false) {\n const f = resolveField(modelMeta, model, field, isTypeDef);\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.models[lowerCaseFirst(model)]?.fields;\n}\n\n/**\n * Gets unique constraints of a model.\n */\nexport function getUniqueConstraints(modelMeta: ModelMeta, model: string) {\n return modelMeta.models[lowerCaseFirst(model)]?.uniqueConstraints;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { v4 as uuid } from 'uuid';\nimport {\n FieldInfo,\n NestedWriteVisitor,\n enumerate,\n getFields,\n getIdFields,\n type ModelMeta,\n type PrismaWriteActionType,\n} from '.';\nimport { clone } from './clone';\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 (!queryData || (typeof queryData !== 'object' && !Array.isArray(queryData))) {\n return undefined;\n }\n\n if (!queryOp.startsWith('find')) {\n // only findXXX results are applicable\n return undefined;\n }\n\n return await doApplyMutation(queryModel, queryData, mutationModel, mutationOp, mutationArgs, modelMeta, logging);\n}\n\nasync function doApplyMutation(\n queryModel: string,\n queryData: any,\n mutationModel: string,\n mutationOp: PrismaWriteActionType,\n mutationArgs: any,\n modelMeta: ModelMeta,\n logging: boolean\n) {\n let resultData = queryData;\n let updated = false;\n\n const visitor = new NestedWriteVisitor(modelMeta, {\n create: (model, args) => {\n if (\n model === queryModel &&\n Array.isArray(resultData) // \"create\" mutation is only relevant for arrays\n ) {\n const r = createMutate(queryModel, resultData, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n createMany: (model, args) => {\n if (\n model === queryModel &&\n args?.data &&\n Array.isArray(resultData) // \"createMany\" mutation is only relevant for arrays\n ) {\n for (const oneArg of enumerate(args.data)) {\n const r = createMutate(queryModel, resultData, oneArg, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n }\n },\n\n update: (model, args) => {\n if (\n model === queryModel &&\n !Array.isArray(resultData) // array elements will be handled with recursion\n ) {\n const r = updateMutate(queryModel, resultData, model, args, modelMeta, logging);\n if (r) {\n resultData = r;\n updated = true;\n }\n }\n },\n\n upsert: (model, args) => {\n if (model === queryModel && args?.where && args?.create && args?.update) {\n const r = upsertMutate(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 const modelFields = getFields(modelMeta, queryModel);\n\n if (Array.isArray(resultData)) {\n // try to apply mutation to each item in the array, replicate the entire\n // array if any item is updated\n\n let arrayCloned = false;\n for (let i = 0; i < resultData.length; i++) {\n const item = resultData[i];\n if (\n !item ||\n typeof item !== 'object' ||\n item.$optimistic // skip items already optimistically updated\n ) {\n continue;\n }\n\n const r = await doApplyMutation(\n queryModel,\n item,\n mutationModel,\n mutationOp,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (r && typeof r === 'object') {\n if (!arrayCloned) {\n resultData = [...resultData];\n arrayCloned = true;\n }\n resultData[i] = r;\n updated = true;\n }\n }\n } else if (resultData !== null && typeof resultData === 'object') {\n // Clone resultData to prevent mutations affecting the loop\n const currentData = { ...resultData };\n\n // iterate over each field and apply mutation to nested data models\n for (const [key, value] of Object.entries(currentData)) {\n const fieldInfo = modelFields[key];\n if (!fieldInfo?.isDataModel) {\n continue;\n }\n\n const r = await doApplyMutation(\n fieldInfo.type,\n value,\n mutationModel,\n mutationOp,\n mutationArgs,\n modelMeta,\n logging\n );\n\n if (r && typeof r === 'object') {\n resultData = { ...resultData, [key]: r };\n updated = true;\n }\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction createMutate(queryModel: string, currentData: any, newData: any, modelMeta: ModelMeta, logging: boolean) {\n if (!newData) {\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 && newData[name]) {\n // deal with \"connect\"\n assignForeignKeyFields(field, insert, newData[name]);\n return;\n }\n\n if (newDataFields.includes(name)) {\n insert[name] = clone(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 || typeof currentData !== 'object') {\n return undefined;\n }\n\n if (!mutateArgs?.where || typeof mutateArgs.where !== 'object') {\n return undefined;\n }\n\n if (!mutateArgs?.data || typeof mutateArgs.data !== 'object') {\n return undefined;\n }\n\n if (!idFieldsMatch(mutateModel, currentData, mutateArgs.where, modelMeta)) {\n return undefined;\n }\n\n const modelFields = getFields(modelMeta, queryModel);\n if (!modelFields) {\n return undefined;\n }\n\n let updated = false;\n let resultData = currentData;\n\n for (const [key, value] of Object.entries<any>(mutateArgs.data)) {\n const fieldInfo = modelFields[key];\n if (!fieldInfo) {\n continue;\n }\n\n if (fieldInfo.isDataModel && !value?.connect) {\n // relation field but without \"connect\"\n continue;\n }\n\n if (!updated) {\n // clone\n resultData = { ...currentData };\n }\n\n if (fieldInfo.isDataModel) {\n // deal with \"connect\"\n assignForeignKeyFields(fieldInfo, resultData, value);\n } else {\n resultData[key] = clone(value);\n }\n resultData.$optimistic = true;\n updated = true;\n\n if (logging) {\n console.log(`Optimistic update for ${queryModel}:`, resultData);\n }\n }\n\n return updated ? resultData : undefined;\n}\n\nfunction upsertMutate(\n queryModel: string,\n currentData: any,\n model: string,\n args: { where: object; create: any; update: any },\n modelMeta: ModelMeta,\n logging: boolean\n) {\n let updated = false;\n let resultData = currentData;\n\n if (Array.isArray(resultData)) {\n // check if we should create or update\n const foundIndex = resultData.findIndex((x) => idFieldsMatch(model, x, args.where, modelMeta));\n if (foundIndex >= 0) {\n const updateResult = updateMutate(\n queryModel,\n resultData[foundIndex],\n model,\n { where: args.where, data: args.update },\n modelMeta,\n logging\n );\n if (updateResult) {\n // replace the found item with updated item\n resultData = [...resultData.slice(0, foundIndex), updateResult, ...resultData.slice(foundIndex + 1)];\n updated = true;\n }\n } else {\n const createResult = createMutate(queryModel, resultData, args.create, modelMeta, logging);\n if (createResult) {\n resultData = createResult;\n updated = true;\n }\n }\n } else {\n // try update only\n const updateResult = updateMutate(\n queryModel,\n resultData,\n model,\n { where: args.where, data: args.update },\n modelMeta,\n logging\n );\n if (updateResult) {\n resultData = updateResult;\n updated = true;\n }\n }\n\n return updated ? resultData : 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\nfunction assignForeignKeyFields(field: FieldInfo, resultData: any, mutationData: any) {\n // convert \"connect\" like `{ connect: { id: '...' } }` to foreign key fields\n // assignment: `{ userId: '...' }`\n if (!mutationData?.connect) {\n return;\n }\n\n if (!field.foreignKeyMapping) {\n return;\n }\n\n for (const [idField, fkField] of Object.entries(field.foreignKeyMapping)) {\n if (idField in mutationData.connect) {\n resultData[fkField] = mutationData.connect[idField];\n }\n }\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 'createManyAndReturn',\n 'connectOrCreate',\n 'update',\n 'updateMany',\n 'updateManyAndReturn',\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 '../local-helpers';\nimport { requireField, type ModelInfo, type ModelMeta, type TypeDefInfo } 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\n/**\n * Gets ID fields of a model.\n */\nexport function getIdFields(modelMeta: ModelMeta, model: string, throwIfNotFound = false) {\n const uniqueConstraints = modelMeta.models[lowerCaseFirst(model)]?.uniqueConstraints ?? {};\n\n const entries = Object.values(uniqueConstraints);\n if (entries.length === 0) {\n if (throwIfNotFound) {\n throw new Error(`Model ${model} does not have any id field`);\n }\n return [];\n }\n\n return entries[0].fields.map((f) => requireField(modelMeta, model, f));\n}\n\n/**\n * Gets info for a model.\n */\nexport function getModelInfo<Throw extends boolean = false>(\n modelMeta: ModelMeta,\n model: string,\n throwIfNotFound: Throw = false as Throw\n): Throw extends true ? ModelInfo : ModelInfo | undefined {\n const info = modelMeta.models[lowerCaseFirst(model)];\n if (!info && throwIfNotFound) {\n throw new Error(`Unable to load info for ${model}`);\n }\n return info;\n}\n\n/**\n * Gets info for a type def.\n */\nexport function getTypeDefInfo<Throw extends boolean = false>(\n modelMeta: ModelMeta,\n typeDef: string,\n throwIfNotFound: Throw = false as Throw\n): Throw extends true ? TypeDefInfo : TypeDefInfo | undefined {\n const info = modelMeta.typeDefs?.[lowerCaseFirst(typeDef)];\n if (!info && throwIfNotFound) {\n throw new Error(`Unable to load info for ${typeDef}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return info as any;\n}\n\n/**\n * Checks if a model is a delegate model.\n */\nexport function isDelegateModel(modelMeta: ModelMeta, model: string) {\n return !!getModelInfo(modelMeta, model)?.attributes?.some((attr) => attr.name === '@@delegate');\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, data: 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 this.enumerateReverse(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 case 'createManyAndReturn':\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 this.enumerateReverse(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 this.enumerateReverse(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 this.enumerateReverse(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 for (const item of this.enumerateReverse(data)) {\n const newContext = pushNewContext(field, model, item, true);\n await this.callback.set(model, item, newContext);\n }\n }\n break;\n\n case 'update':\n for (const item of this.enumerateReverse(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 case 'updateManyAndReturn':\n for (const item of this.enumerateReverse(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 this.enumerateReverse(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 this.enumerateReverse(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 this.enumerateReverse(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 item of enumerate(payload)) {\n for (const field of getModelFields(item)) {\n const fieldInfo = resolveField(this.modelMeta, model, field);\n if (!fieldInfo) {\n continue;\n }\n\n if (fieldInfo.isDataModel) {\n if (item[field]) {\n // recurse into nested payloads\n for (const [subAction, subData] of Object.entries<any>(item[field])) {\n if (this.isPrismaWriteAction(subAction) && subData) {\n await this.doVisit(fieldInfo.type, subAction, subData, item[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, item[field], {\n parent: item,\n nestingPath,\n field: fieldInfo,\n });\n }\n }\n }\n }\n }\n\n // enumerate a (possible) array in reverse order, so that the enumeration\n // callback can safely delete the current item\n private *enumerateReverse(data: any) {\n if (Array.isArray(data)) {\n for (let i = data.length - 1; i >= 0; i--) {\n yield data[i];\n }\n } else {\n yield data;\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { lowerCaseFirst } from '../local-helpers';\nimport type { ModelMeta } from './model-meta';\nimport { NestedReadVisitor } from './nested-read-visitor';\nimport { NestedWriteVisitor } from './nested-write-visitor';\nimport type { PrismaWriteActionType } from './types';\nimport { getModelInfo } from './utils';\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 // include delegate base models recursively\n result.forEach((m) => {\n getBaseRecursively(m, modelMeta, result);\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\nfunction getBaseRecursively(model: string, modelMeta: ModelMeta, result: Set<string>) {\n const bases = getModelInfo(modelMeta, model)?.baseTypes;\n if (bases) {\n bases.forEach((base) => {\n result.add(base);\n getBaseRecursively(base, modelMeta, result);\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,SAAS,GAAY;AAC1B,SAAO,OAAO,UAAU,SAAS,KAAK,CAAC,MAAM;AACjD;AAEO,SAAS,cAAc,GAAY;AACtC,MAAI,SAAS,CAAC,MAAM,MAAO,QAAO;AAGlC,QAAM,OAAQ,EAA+B;AAC7C,MAAI,SAAS,OAAW,QAAO;AAG/B,QAAM,OAAQ,KAAgC;AAC9C,MAAI,SAAS,IAAI,MAAM,MAAO,QAAO;AAGrC,MAAI,OAAO,UAAU,eAAe,KAAK,MAAM,eAAe,MAAM,OAAO;AACvE,WAAO;AAAA,EACX;AAGA,SAAO;AACX;;;ACtBO,SAAS,eAAe,OAAe;AAC1C,SAAO,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AACxD;;;ACFA,IAAM,eAAe,QAAQ,IAAI,aAAa;;;ACKvC,SAAS,MAAS,OAAa;AAClC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,MAAM,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;AAAA,EACpC;AAEA,MAAI,OAAO,UAAU,UAAU;AAC3B,QAAI,CAAC,SAAS,CAAC,cAAc,KAAK,GAAG;AACjC,aAAO;AAAA,IACX;AAGA,UAAM,SAAc,CAAC;AACrB,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AAClC,aAAO,GAAG,IAAI,MAAM,MAAM,GAAc,CAAC;AAAA,IAC7C;AACA,WAAO;AAAA,EACX;AAEA,SAAO;AACX;;;ACZO,IAAM,mBAAN,MAAuB;AAAA,EAC1B,YAAoB,WAAsB;AAAtB;AAAA,EAAuB;AAAA;AAAA;AAAA;AAAA,EAK3C,MAAM,OAAe,MAAW,UAAoC;AAChE,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACnC;AAAA,IACJ;AAEA,UAAM,aAAsC,CAAC;AAC7C,UAAM,WAAgD,CAAC;AAEvD,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACvC,YAAM,QAAQ,aAAa,KAAK,WAAW,OAAO,CAAC;AACnD,UAAI,SAAS,MAAM,aAAa;AAC5B,YAAI,MAAM,WAAW,MAAM,QAAQ,CAAC,GAAG;AACnC,mBAAS,KAAK,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,MAAM,MAAM,MAAM,KAAK,EAAE,CAAC;AAAA,QACzE,OAAO;AACH,mBAAS,KAAK,EAAE,OAAO,MAAM,MAAM,MAAM,EAAE,CAAC;AAAA,QAChD;AAAA,MACJ,OAAO;AACH,mBAAW,CAAC,IAAI;AAAA,MACpB;AAAA,IACJ;AAEA,aAAS,OAAO,MAAM,UAAU;AAChC,aAAS,QAAQ,CAAC,EAAE,OAAAA,QAAO,MAAAC,MAAK,MAAM,KAAK,MAAMD,QAAOC,OAAM,QAAQ,CAAC;AAAA,EAC3E;AACJ;;;AC0KO,SAAS,aACZ,WACA,gBACA,OACA,YAAY,OACS;AAzNzB;AA0NI,QAAM,YAAY,YAAY,UAAU,WAAW,UAAU;AAC7D,UAAO,kDAAY,eAAe,cAAc,OAAzC,mBAA6C,WAA7C,mBAAsD;AACjE;AAKO,SAAS,aAAa,WAAsB,OAAe,OAAe,YAAY,OAAO;AAChG,QAAM,IAAI,aAAa,WAAW,OAAO,OAAO,SAAS;AACzD,MAAI,CAAC,GAAG;AACJ,UAAM,IAAI,MAAM,SAAS,KAAK,IAAI,KAAK,qBAAqB;AAAA,EAChE;AACA,SAAO;AACX;AAKO,SAAS,UAAU,WAAsB,OAAe;AA5O/D;AA6OI,UAAO,eAAU,OAAO,eAAe,KAAK,CAAC,MAAtC,mBAAyC;AACpD;AAKO,SAAS,qBAAqB,WAAsB,OAAe;AAnP1E;AAoPI,UAAO,eAAU,OAAO,eAAe,KAAK,CAAC,MAAtC,mBAAyC;AACpD;;;ACpPA,kBAA2B;AAyB3B,SAAsB,cAClB,YACA,SACA,WACA,eACA,YACA,cACA,WACA,SACF;AAAA;AACE,QAAI,CAAC,aAAc,OAAO,cAAc,YAAY,CAAC,MAAM,QAAQ,SAAS,GAAI;AAC5E,aAAO;AAAA,IACX;AAEA,QAAI,CAAC,QAAQ,WAAW,MAAM,GAAG;AAE7B,aAAO;AAAA,IACX;AAEA,WAAO,MAAM,gBAAgB,YAAY,WAAW,eAAe,YAAY,cAAc,WAAW,OAAO;AAAA,EACnH;AAAA;AAEA,SAAe,gBACX,YACA,WACA,eACA,YACA,cACA,WACA,SACF;AAAA;AACE,QAAI,aAAa;AACjB,QAAI,UAAU;AAEd,UAAM,UAAU,IAAI,mBAAmB,WAAW;AAAA,MAC9C,QAAQ,CAAC,OAAO,SAAS;AACrB,YACI,UAAU,cACV,MAAM,QAAQ,UAAU,GAC1B;AACE,gBAAM,IAAI,aAAa,YAAY,YAAY,MAAM,WAAW,OAAO;AACvE,cAAI,GAAG;AACH,yBAAa;AACb,sBAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,YAAY,CAAC,OAAO,SAAS;AACzB,YACI,UAAU,eACV,6BAAM,SACN,MAAM,QAAQ,UAAU,GAC1B;AACE,qBAAW,UAAU,UAAU,KAAK,IAAI,GAAG;AACvC,kBAAM,IAAI,aAAa,YAAY,YAAY,QAAQ,WAAW,OAAO;AACzE,gBAAI,GAAG;AACH,2BAAa;AACb,wBAAU;AAAA,YACd;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,QAAQ,CAAC,OAAO,SAAS;AACrB,YACI,UAAU,cACV,CAAC,MAAM,QAAQ,UAAU,GAC3B;AACE,gBAAM,IAAI,aAAa,YAAY,YAAY,OAAO,MAAM,WAAW,OAAO;AAC9E,cAAI,GAAG;AACH,yBAAa;AACb,sBAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,QAAQ,CAAC,OAAO,SAAS;AACrB,YAAI,UAAU,eAAc,6BAAM,WAAS,6BAAM,YAAU,6BAAM,SAAQ;AACrE,gBAAM,IAAI,aAAa,YAAY,YAAY,OAAO,MAAM,WAAW,OAAO;AAC9E,cAAI,GAAG;AACH,yBAAa;AACb,sBAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAAA,MAEA,QAAQ,CAAC,OAAO,SAAS;AACrB,YAAI,UAAU,YAAY;AACtB,gBAAM,IAAI,aAAa,YAAY,YAAY,OAAO,MAAM,WAAW,OAAO;AAC9E,cAAI,GAAG;AACH,yBAAa;AACb,sBAAU;AAAA,UACd;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,UAAM,QAAQ,MAAM,eAAe,YAAY,YAAY;AAE3D,UAAM,cAAc,UAAU,WAAW,UAAU;AAEnD,QAAI,MAAM,QAAQ,UAAU,GAAG;AAI3B,UAAI,cAAc;AAClB,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACxC,cAAM,OAAO,WAAW,CAAC;AACzB,YACI,CAAC,QACD,OAAO,SAAS,YAChB,KAAK,aACP;AACE;AAAA,QACJ;AAEA,cAAM,IAAI,MAAM;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAEA,YAAI,KAAK,OAAO,MAAM,UAAU;AAC5B,cAAI,CAAC,aAAa;AACd,yBAAa,CAAC,GAAG,UAAU;AAC3B,0BAAc;AAAA,UAClB;AACA,qBAAW,CAAC,IAAI;AAChB,oBAAU;AAAA,QACd;AAAA,MACJ;AAAA,IACJ,WAAW,eAAe,QAAQ,OAAO,eAAe,UAAU;AAE9D,YAAM,cAAc,mBAAK;AAGzB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACpD,cAAM,YAAY,YAAY,GAAG;AACjC,YAAI,EAAC,uCAAW,cAAa;AACzB;AAAA,QACJ;AAEA,cAAM,IAAI,MAAM;AAAA,UACZ,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAEA,YAAI,KAAK,OAAO,MAAM,UAAU;AAC5B,uBAAa,iCAAK,aAAL,EAAiB,CAAC,GAAG,GAAG,EAAE;AACvC,oBAAU;AAAA,QACd;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,UAAU,aAAa;AAAA,EAClC;AAAA;AAEA,SAAS,aAAa,YAAoB,aAAkB,SAAc,WAAsB,SAAkB;AAC9G,MAAI,CAAC,SAAS;AACV,WAAO;AAAA,EACX;AAEA,QAAM,cAAc,UAAU,WAAW,UAAU;AACnD,MAAI,CAAC,aAAa;AACd,WAAO;AAAA,EACX;AAEA,QAAM,SAAc,CAAC;AACrB,QAAM,gBAAgB,OAAO,KAAK,OAAO;AAEzC,SAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AA9M3D;AA+MQ,QAAI,MAAM,eAAe,QAAQ,IAAI,GAAG;AAEpC,6BAAuB,OAAO,QAAQ,QAAQ,IAAI,CAAC;AACnD;AAAA,IACJ;AAEA,QAAI,cAAc,SAAS,IAAI,GAAG;AAC9B,aAAO,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC;AAAA,IACtC,OAAO;AACH,YAAM,eAAc,WAAM,eAAN,mBAAkB,KAAK,CAAC,SAAS,KAAK,SAAS;AACnE,UAAI,MAAM,SAAS,YAAY;AAE3B,YAAI,iBAAe,WAAM,eAAN,mBAAkB,KAAK,CAAC,SAAS,KAAK,SAAS,gBAAe;AAC7E,iBAAO,IAAI,IAAI,oBAAI,KAAK;AAAA,QAC5B;AAAA,MACJ,aAAW,sDAAa,SAAb,mBAAoB,OAApB,mBAAwB,WAAU,QAAW;AAEpD,eAAO,IAAI,IAAI,YAAY,KAAK,CAAC,EAAE;AAAA,MACvC;AAAA,IACJ;AAAA,EACJ,CAAC;AAGD,QAAM,WAAW,YAAY,WAAW,YAAY,KAAK;AACzD,WAAS,QAAQ,CAAC,MAAM;AACpB,QAAI,OAAO,EAAE,IAAI,MAAM,QAAW;AAC9B,UAAI,EAAE,SAAS,SAAS,EAAE,SAAS,UAAU;AACzC,cAAM,UAAU,MAAM,QAAQ,WAAW,IACnC,KAAK;AAAA,UACD,GAAG,CAAC,GAAG,WAAW,EAAE,IAAI,CAAC,SAAS;AAC9B,kBAAM,MAAM,SAAS,KAAK,EAAE,IAAI,CAAC;AACjC,mBAAO,MAAM,GAAG,IAAI,IAAI;AAAA,UAC5B,CAAC;AAAA,QACL,IACA;AACN,eAAO,EAAE,IAAI,IAAI,UAAU;AAAA,MAC/B,OAAO;AACH,eAAO,EAAE,IAAI,QAAI,YAAAC,IAAK;AAAA,MAC1B;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,SAAO,cAAc;AAErB,MAAI,SAAS;AACT,YAAQ,IAAI,yBAAyB,UAAU,KAAK,MAAM;AAAA,EAC9D;AACA,SAAO,CAAC,QAAQ,GAAI,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,CAAE;AACtE;AAEA,SAAS,aACL,YACA,aACA,aACA,YACA,WACA,SACF;AACE,MAAI,CAAC,eAAe,OAAO,gBAAgB,UAAU;AACjD,WAAO;AAAA,EACX;AAEA,MAAI,EAAC,yCAAY,UAAS,OAAO,WAAW,UAAU,UAAU;AAC5D,WAAO;AAAA,EACX;AAEA,MAAI,EAAC,yCAAY,SAAQ,OAAO,WAAW,SAAS,UAAU;AAC1D,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,cAAc,aAAa,aAAa,WAAW,OAAO,SAAS,GAAG;AACvE,WAAO;AAAA,EACX;AAEA,QAAM,cAAc,UAAU,WAAW,UAAU;AACnD,MAAI,CAAC,aAAa;AACd,WAAO;AAAA,EACX;AAEA,MAAI,UAAU;AACd,MAAI,aAAa;AAEjB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAa,WAAW,IAAI,GAAG;AAC7D,UAAM,YAAY,YAAY,GAAG;AACjC,QAAI,CAAC,WAAW;AACZ;AAAA,IACJ;AAEA,QAAI,UAAU,eAAe,EAAC,+BAAO,UAAS;AAE1C;AAAA,IACJ;AAEA,QAAI,CAAC,SAAS;AAEV,mBAAa,mBAAK;AAAA,IACtB;AAEA,QAAI,UAAU,aAAa;AAEvB,6BAAuB,WAAW,YAAY,KAAK;AAAA,IACvD,OAAO;AACH,iBAAW,GAAG,IAAI,MAAM,KAAK;AAAA,IACjC;AACA,eAAW,cAAc;AACzB,cAAU;AAEV,QAAI,SAAS;AACT,cAAQ,IAAI,yBAAyB,UAAU,KAAK,UAAU;AAAA,IAClE;AAAA,EACJ;AAEA,SAAO,UAAU,aAAa;AAClC;AAEA,SAAS,aACL,YACA,aACA,OACA,MACA,WACA,SACF;AACE,MAAI,UAAU;AACd,MAAI,aAAa;AAEjB,MAAI,MAAM,QAAQ,UAAU,GAAG;AAE3B,UAAM,aAAa,WAAW,UAAU,CAAC,MAAM,cAAc,OAAO,GAAG,KAAK,OAAO,SAAS,CAAC;AAC7F,QAAI,cAAc,GAAG;AACjB,YAAM,eAAe;AAAA,QACjB;AAAA,QACA,WAAW,UAAU;AAAA,QACrB;AAAA,QACA,EAAE,OAAO,KAAK,OAAO,MAAM,KAAK,OAAO;AAAA,QACvC;AAAA,QACA;AAAA,MACJ;AACA,UAAI,cAAc;AAEd,qBAAa,CAAC,GAAG,WAAW,MAAM,GAAG,UAAU,GAAG,cAAc,GAAG,WAAW,MAAM,aAAa,CAAC,CAAC;AACnG,kBAAU;AAAA,MACd;AAAA,IACJ,OAAO;AACH,YAAM,eAAe,aAAa,YAAY,YAAY,KAAK,QAAQ,WAAW,OAAO;AACzF,UAAI,cAAc;AACd,qBAAa;AACb,kBAAU;AAAA,MACd;AAAA,IACJ;AAAA,EACJ,OAAO;AAEH,UAAM,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,OAAO,KAAK,OAAO,MAAM,KAAK,OAAO;AAAA,MACvC;AAAA,MACA;AAAA,IACJ;AACA,QAAI,cAAc;AACd,mBAAa;AACb,gBAAU;AAAA,IACd;AAAA,EACJ;AAEA,SAAO,UAAU,aAAa;AAClC;AAEA,SAAS,aACL,YACA,aACA,aACA,YACA,WACA,SACF;AAGE,MAAI,CAAC,eAAe,CAAC,YAAY;AAC7B,WAAO;AAAA,EACX;AAEA,MAAI,eAAe,aAAa;AAC5B,WAAO;AAAA,EACX;AAEA,MAAI,UAAU;AACd,MAAI,SAAS;AAEb,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC5B,eAAW,QAAQ,aAAa;AAC5B,UAAI,cAAc,aAAa,MAAM,YAAY,SAAS,GAAG;AACzD,iBAAU,OAAqB,OAAO,CAAC,MAAM,MAAM,IAAI;AACvD,kBAAU;AACV,YAAI,SAAS;AACT,kBAAQ,IAAI,yBAAyB,UAAU,KAAK,IAAI;AAAA,QAC5D;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,OAAO;AACH,QAAI,cAAc,aAAa,aAAa,YAAY,SAAS,GAAG;AAChE,eAAS;AACT,gBAAU;AACV,UAAI,SAAS;AACT,gBAAQ,IAAI,yBAAyB,UAAU,KAAK,WAAW;AAAA,MACnE;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,UAAU,SAAS;AAC9B;AAEA,SAAS,cAAc,OAAe,GAAQ,GAAQ,WAAsB;AACxE,MAAI,CAAC,KAAK,CAAC,KAAK,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAC5D,WAAO;AAAA,EACX;AACA,QAAM,WAAW,YAAY,WAAW,OAAO,KAAK;AACpD,MAAI,SAAS,WAAW,GAAG;AACvB,WAAO;AAAA,EACX;AACA,SAAO,SAAS,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,EAAE,IAAI,CAAC;AACxD;AAEA,SAAS,uBAAuB,OAAkB,YAAiB,cAAmB;AAGlF,MAAI,EAAC,6CAAc,UAAS;AACxB;AAAA,EACJ;AAEA,MAAI,CAAC,MAAM,mBAAmB;AAC1B;AAAA,EACJ;AAEA,aAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,MAAM,iBAAiB,GAAG;AACtE,QAAI,WAAW,aAAa,SAAS;AACjC,iBAAW,OAAO,IAAI,aAAa,QAAQ,OAAO;AAAA,IACtD;AAAA,EACJ;AACJ;;;AC/aO,IAAM,oBAAN,MAAwB;AAAA,EAC3B,YAA6B,WAAuC,UAAqC;AAA5E;AAAuC;AAAA,EAAsC;AAAA,EAE1G,QAAQ,OAAe,OAA8B,MAAwC,MAAe;AACxG,QAAI,KAAK,SAAS,OAAO;AACrB,YAAM,IAAI,KAAK,SAAS,MAAM,OAAO,OAAO,MAAM,IAAI;AACtD,UAAI,MAAM,OAAO;AACb;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACnC;AAAA,IACJ;AAEA,QAAI;AACJ,QAAI;AACJ,QAAK,KAAa,QAAQ;AACtB,sBAAiB,KAAa;AAC9B,iBAAW;AAAA,IACf,WAAY,KAAa,SAAS;AAC9B,sBAAiB,KAAa;AAC9B,iBAAW;AAAA,IACf;AAEA,QAAI,iBAAiB,OAAO,kBAAkB,UAAU;AACpD,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,aAAa,GAAG;AAChD,YAAI,MAAM,YAAY,OAAO,MAAM,YAAY,GAAG;AAE9C,eAAK,QAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,QACtC,OAAO;AACH,gBAAMC,SAAQ,aAAa,KAAK,WAAW,OAAO,CAAC;AACnD,cAAIA,QAAO;AACP,iBAAK,QAAQA,OAAM,MAAMA,QAAO,UAAU,CAAC;AAAA,UAC/C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,OAAe,MAAe;AAChC,SAAK,QAAQ,OAAO,QAAW,QAAW,IAAI;AAAA,EAClD;AACJ;;;ACxDO,IAAM,qBAAqB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;;;ACXO,SAAS,eAAe,MAAc;AACzC,SAAO,OAAO,OAAO,KAAK,IAAI,IAAI,CAAC;AACvC;AAUO,SAAS,UAAa,GAAkB;AAC3C,MAAI,MAAM,QAAQ,MAAM,QAAW;AAC/B,WAAO,CAAC;AAAA,EACZ,WAAW,MAAM,QAAQ,CAAC,GAAG;AACzB,WAAO;AAAA,EACX,OAAO;AACH,WAAO,CAAC,CAAC;AAAA,EACb;AACJ;AAKO,SAAS,IAAY,GAAmB,GAAoC;AAC/E,MAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,QAAI,CAAC,MAAM,QAAQ,CAAC,GAAG;AACnB,YAAM,IAAI,MAAM,6CAA6C;AAAA,IACjE;AACA,QAAI,EAAE,WAAW,EAAE,QAAQ;AACvB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACzD;AACA,WAAO,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAa;AAAA,EACnD,OAAO;AACH,QAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,YAAM,IAAI,MAAM,6CAA6C;AAAA,IACjE;AACA,WAAO,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,EAClB;AACJ;AAKO,SAAS,YAAY,WAAsB,OAAe,kBAAkB,OAAO;AAnD1F;AAoDI,QAAM,qBAAoB,qBAAU,OAAO,eAAe,KAAK,CAAC,MAAtC,mBAAyC,sBAAzC,YAA8D,CAAC;AAEzF,QAAM,UAAU,OAAO,OAAO,iBAAiB;AAC/C,MAAI,QAAQ,WAAW,GAAG;AACtB,QAAI,iBAAiB;AACjB,YAAM,IAAI,MAAM,SAAS,KAAK,6BAA6B;AAAA,IAC/D;AACA,WAAO,CAAC;AAAA,EACZ;AAEA,SAAO,QAAQ,CAAC,EAAE,OAAO,IAAI,CAAC,MAAM,aAAa,WAAW,OAAO,CAAC,CAAC;AACzE;AAKO,SAAS,aACZ,WACA,OACA,kBAAyB,OAC6B;AACtD,QAAM,OAAO,UAAU,OAAO,eAAe,KAAK,CAAC;AACnD,MAAI,CAAC,QAAQ,iBAAiB;AAC1B,UAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AAAA,EACtD;AACA,SAAO;AACX;AAKO,SAAS,eACZ,WACA,SACA,kBAAyB,OACiC;AAvF9D;AAwFI,QAAM,QAAO,eAAU,aAAV,mBAAqB,eAAe,OAAO;AACxD,MAAI,CAAC,QAAQ,iBAAiB;AAC1B,UAAM,IAAI,MAAM,2BAA2B,OAAO,EAAE;AAAA,EACxD;AAEA,SAAO;AACX;AAKO,SAAS,gBAAgB,WAAsB,OAAe;AAnGrE;AAoGI,SAAO,CAAC,GAAC,wBAAa,WAAW,KAAK,MAA7B,mBAAgC,eAAhC,mBAA4C,KAAK,CAAC,SAAS,KAAK,SAAS;AACtF;;;ACAO,IAAM,qBAAN,MAAyB;AAAA,EAC5B,YAA6B,WAAuC,UAAuC;AAA9E;AAAuC;AAAA,EAAwC;AAAA,EAEpG,oBAAoB,OAA+C;AACvE,WAAO,mBAAmB,SAAS,KAA8B;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOM,MAAM,OAAe,QAA+B,MAA0B;AAAA;AAChF,UAAI,CAAC,MAAM;AACP;AAAA,MACJ;AAEA,UAAI,UAAU;AAEd,cAAQ,QAAQ;AAAA,QAEZ,KAAK;AACD,oBAAU,QAAQ;AAClB;AAAA,QAEJ,KAAK;AAAA,QACL,KAAK;AACD,oBAAU,QAAQ;AAClB;AAAA,MACR;AAEA,YAAM,KAAK,QAAQ,OAAO,QAAQ,SAAS,QAAW,QAAW,CAAC,CAAC;AAAA,IACvE;AAAA;AAAA,EAEc,QACV,OACA,QACA,MACA,QACA,OACA,aACa;AAAA;AACb,UAAI,CAAC,MAAM;AACP;AAAA,MACJ;AAEA,YAAM,WAAW,SAAS;AAE1B,YAAM,UAAU,EAAE,QAAQ,OAAO,aAAa,CAAC,GAAG,WAAW,EAAE;AAC/D,YAAM,iBAAiB,CAACC,QAA8BC,QAAe,OAAY,SAAS,UAAU;AAChG,eAAO,iCAAK,UAAL,EAAc,aAAa,CAAC,GAAG,QAAQ,aAAa,EAAE,OAAAD,QAAO,OAAAC,QAAO,OAAO,OAAO,CAAC,EAAE;AAAA,MAChG;AAGA,cAAQ,QAAQ;AAAA,QACZ,KAAK;AACD,qBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,kBAAM,aAAa,eAAe,OAAO,OAAO,CAAC,CAAC;AAClD,gBAAI;AACJ,gBAAI,KAAK,SAAS,QAAQ;AACtB,+BAAiB,MAAM,KAAK,SAAS,OAAO,OAAO,MAAM,UAAU;AAAA,YACvE;AACA,gBAAI,mBAAmB,OAAO;AAC1B,oBAAM,aAAa,OAAO,mBAAmB,WAAW,iBAAiB;AACzE,oBAAM,KAAK,gBAAgB,OAAO,QAAQ,YAAY,WAAW,WAAW;AAAA,YAChF;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AAAA,QACL,KAAK;AACD,cAAI,MAAM;AACN,kBAAM,aAAa,eAAe,OAAO,OAAO,CAAC,CAAC;AAClD,gBAAI;AACJ,gBAAI,KAAK,SAAS,YAAY;AAC1B,+BAAiB,MAAM,KAAK,SAAS,WAAW,OAAO,MAAM,UAAU;AAAA,YAC3E;AACA,gBAAI,mBAAmB,OAAO;AAC1B,oBAAM,aAAa,OAAO,mBAAmB,WAAW,iBAAiB,KAAK;AAC9E,oBAAM,KAAK,gBAAgB,OAAO,QAAQ,YAAY,WAAW,WAAW;AAAA,YAChF;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AACD,qBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,kBAAM,aAAa,eAAe,OAAO,OAAO,KAAK,KAAK;AAC1D,gBAAI;AACJ,gBAAI,KAAK,SAAS,iBAAiB;AAC/B,+BAAiB,MAAM,KAAK,SAAS,gBAAgB,OAAO,MAAM,UAAU;AAAA,YAChF;AACA,gBAAI,mBAAmB,OAAO;AAC1B,oBAAM,aAAa,OAAO,mBAAmB,WAAW,iBAAiB,KAAK;AAC9E,oBAAM,KAAK,gBAAgB,OAAO,QAAQ,YAAY,WAAW,WAAW;AAAA,YAChF;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AACD,cAAI,KAAK,SAAS,SAAS;AACvB,uBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,oBAAM,aAAa,eAAe,OAAO,OAAO,MAAM,IAAI;AAC1D,oBAAM,KAAK,SAAS,QAAQ,OAAO,MAAM,UAAU;AAAA,YACvD;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AAID,cAAI,KAAK,SAAS,YAAY;AAC1B,uBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,oBAAM,aAAa,eAAe,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAC9E,oBAAM,KAAK,SAAS,WAAW,OAAO,MAAM,UAAU;AAAA,YAC1D;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AACD,cAAI,KAAK,SAAS,KAAK;AACnB,uBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,oBAAM,aAAa,eAAe,OAAO,OAAO,MAAM,IAAI;AAC1D,oBAAM,KAAK,SAAS,IAAI,OAAO,MAAM,UAAU;AAAA,YACnD;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AACD,qBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,kBAAM,aAAa,eAAe,OAAO,OAAO,KAAK,KAAK;AAC1D,gBAAI;AACJ,gBAAI,KAAK,SAAS,QAAQ;AACtB,+BAAiB,MAAM,KAAK,SAAS,OAAO,OAAO,MAAM,UAAU;AAAA,YACvE;AACA,gBAAI,mBAAmB,OAAO;AAC1B,oBAAM,aACF,OAAO,mBAAmB,WACpB,iBACA,OAAO,KAAK,SAAS,WACrB,KAAK,OACL;AACV,oBAAM,KAAK,gBAAgB,OAAO,QAAQ,YAAY,WAAW,WAAW;AAAA,YAChF;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK;AAAA,QACL,KAAK;AACD,qBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,kBAAM,aAAa,eAAe,OAAO,OAAO,KAAK,KAAK;AAC1D,gBAAI;AACJ,gBAAI,KAAK,SAAS,YAAY;AAC1B,+BAAiB,MAAM,KAAK,SAAS,WAAW,OAAO,MAAM,UAAU;AAAA,YAC3E;AACA,gBAAI,mBAAmB,OAAO;AAC1B,oBAAM,aAAa,OAAO,mBAAmB,WAAW,iBAAiB;AACzE,oBAAM,KAAK,gBAAgB,OAAO,QAAQ,YAAY,WAAW,WAAW;AAAA,YAChF;AAAA,UACJ;AACA;AAAA,QAEJ,KAAK,UAAU;AACX,qBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,kBAAM,aAAa,eAAe,OAAO,OAAO,KAAK,KAAK;AAC1D,gBAAI;AACJ,gBAAI,KAAK,SAAS,QAAQ;AACtB,+BAAiB,MAAM,KAAK,SAAS,OAAO,OAAO,MAAM,UAAU;AAAA,YACvE;AACA,gBAAI,mBAAmB,OAAO;AAC1B,kBAAI,OAAO,mBAAmB,UAAU;AACpC,sBAAM,KAAK,gBAAgB,OAAO,QAAQ,gBAAgB,WAAW,WAAW;AAAA,cACpF,OAAO;AACH,sBAAM,KAAK,gBAAgB,OAAO,QAAQ,KAAK,QAAQ,WAAW,WAAW;AAC7E,sBAAM,KAAK,gBAAgB,OAAO,QAAQ,KAAK,QAAQ,WAAW,WAAW;AAAA,cACjF;AAAA,YACJ;AAAA,UACJ;AACA;AAAA,QACJ;AAAA,QAEA,KAAK,UAAU;AACX,cAAI,KAAK,SAAS,QAAQ;AACtB,uBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,oBAAM,aAAa,eAAe,OAAO,OAAO,WAAW,KAAK,QAAQ,IAAI;AAC5E,oBAAM,KAAK,SAAS,OAAO,OAAO,MAAM,UAAU;AAAA,YACtD;AAAA,UACJ;AACA;AAAA,QACJ;AAAA,QAEA,KAAK;AACD,cAAI,KAAK,SAAS,YAAY;AAC1B,uBAAW,QAAQ,KAAK,iBAAiB,IAAI,GAAG;AAC5C,oBAAM,aAAa,eAAe,OAAO,OAAO,WAAW,KAAK,QAAQ,IAAI;AAC5E,oBAAM,KAAK,SAAS,WAAW,OAAO,MAAM,UAAU;AAAA,YAC1D;AAAA,UACJ;AACA;AAAA,QAEJ,SAAS;AACL,gBAAM,IAAI,MAAM,yBAAyB,MAAM,EAAE;AAAA,QACrD;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA,EAEc,gBACV,OACA,QACA,SACA,aACF;AAAA;AACE,iBAAW,QAAQ,UAAU,OAAO,GAAG;AACnC,mBAAW,SAAS,eAAe,IAAI,GAAG;AACtC,gBAAM,YAAY,aAAa,KAAK,WAAW,OAAO,KAAK;AAC3D,cAAI,CAAC,WAAW;AACZ;AAAA,UACJ;AAEA,cAAI,UAAU,aAAa;AACvB,gBAAI,KAAK,KAAK,GAAG;AAEb,yBAAW,CAAC,WAAW,OAAO,KAAK,OAAO,QAAa,KAAK,KAAK,CAAC,GAAG;AACjE,oBAAI,KAAK,oBAAoB,SAAS,KAAK,SAAS;AAChD,wBAAM,KAAK,QAAQ,UAAU,MAAM,WAAW,SAAS,KAAK,KAAK,GAAG,WAAW;AAAA,oBAC3E,GAAG;AAAA,kBACP,CAAC;AAAA,gBACL;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ,OAAO;AAEH,gBAAI,KAAK,SAAS,OAAO;AACrB,oBAAM,KAAK,SAAS,MAAM,WAAW,QAAQ,KAAK,KAAK,GAAG;AAAA,gBACtD,QAAQ;AAAA,gBACR;AAAA,gBACA,OAAO;AAAA,cACX,CAAC;AAAA,YACL;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA;AAAA;AAAA;AAAA,EAIA,CAAS,iBAAiB,MAAW;AACjC,QAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,eAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACvC,cAAM,KAAK,CAAC;AAAA,MAChB;AAAA,IACJ,OAAO;AACH,YAAM;AAAA,IACV;AAAA,EACJ;AACJ;;;ACpVO,SAAS,cAAc,OAAe,WAAsB,MAAW;AAC1E,QAAM,SAAS,oBAAI,IAAY;AAC/B,SAAO,IAAI,KAAK;AAChB,QAAM,UAAU,IAAI,kBAAkB,WAAW;AAAA,IAC7C,OAAO,CAACC,WAAU;AACd,aAAO,IAAIA,MAAK;AAChB,aAAO;AAAA,IACX;AAAA,EACJ,CAAC;AACD,UAAQ,MAAM,OAAO,IAAI;AACzB,SAAO,CAAC,GAAG,MAAM;AACrB;AAKA,SAAsB,iBAClB,OACA,WACA,cACA,WACF;AAAA;AACE,UAAM,SAAS,oBAAI,IAAY;AAC/B,WAAO,IAAI,KAAK;AAEhB,QAAI,cAAc;AACd,YAAM,WAAW,CAACA,WAAkB,KAAK,OAAO,IAAIA,MAAK;AAGzD,YAAM,cAAc,CAACA,WAAkB;AACnC,cAAM,WAAW,oBAAI,IAAY;AACjC,cAAM,UAAU,oBAAI,IAAY;AAChC,8BAAsBA,QAAO,WAAW,UAAU,OAAO;AACzD,iBAAS,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;AAAA,MACvC;AAEA,YAAM,UAAU,IAAI,mBAAmB,WAAW;AAAA,QAC9C,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ,CAACA,WAAU;AACf,mBAASA,MAAK;AACd,sBAAYA,MAAK;AAAA,QACrB;AAAA,QACA,YAAY,CAACA,WAAU;AACnB,mBAASA,MAAK;AACd,sBAAYA,MAAK;AAAA,QACrB;AAAA,MACJ,CAAC;AACD,YAAM,QAAQ,MAAM,OAAO,WAAW,YAAY;AAAA,IACtD;AAGA,WAAO,QAAQ,CAAC,MAAM;AAClB,yBAAmB,GAAG,WAAW,MAAM;AAAA,IAC3C,CAAC;AAED,WAAO,CAAC,GAAG,MAAM;AAAA,EACrB;AAAA;AAEA,SAAS,sBAAsB,OAAe,WAAsB,QAAqB,SAAsB;AAlF/G;AAmFI,MAAI,QAAQ,IAAI,KAAK,GAAG;AAEpB;AAAA,EACJ;AACA,UAAQ,IAAI,KAAK;AAEjB,QAAM,YAAW,eAAU,kBAAV,mBAA0B,eAAe,KAAK;AAE/D,MAAI,CAAC,UAAU;AACX;AAAA,EACJ;AAEA,WAAS,QAAQ,CAAC,MAAM;AACpB,WAAO,IAAI,CAAC;AACZ,0BAAsB,GAAG,WAAW,QAAQ,OAAO;AAAA,EACvD,CAAC;AACL;AAEA,SAAS,mBAAmB,OAAe,WAAsB,QAAqB;AArGtF;AAsGI,QAAM,SAAQ,kBAAa,WAAW,KAAK,MAA7B,mBAAgC;AAC9C,MAAI,OAAO;AACP,UAAM,QAAQ,CAAC,SAAS;AACpB,aAAO,IAAI,IAAI;AACf,yBAAmB,MAAM,WAAW,MAAM;AAAA,IAC9C,CAAC;AAAA,EACL;AACJ;","names":["model","data","uuid","field","field","model","model"]}
|
package/cross/index.mjs
CHANGED
|
@@ -38,8 +38,31 @@ var __async = (__this, __arguments, generator) => {
|
|
|
38
38
|
});
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
+
// src/local-helpers/is-plain-object.ts
|
|
42
|
+
function isObject(o) {
|
|
43
|
+
return Object.prototype.toString.call(o) === "[object Object]";
|
|
44
|
+
}
|
|
45
|
+
function isPlainObject(o) {
|
|
46
|
+
if (isObject(o) === false) return false;
|
|
47
|
+
const ctor = o.constructor;
|
|
48
|
+
if (ctor === void 0) return true;
|
|
49
|
+
const prot = ctor.prototype;
|
|
50
|
+
if (isObject(prot) === false) return false;
|
|
51
|
+
if (Object.prototype.hasOwnProperty.call(prot, "isPrototypeOf") === false) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// src/local-helpers/lower-case-first.ts
|
|
58
|
+
function lowerCaseFirst(input) {
|
|
59
|
+
return input.charAt(0).toLowerCase() + input.slice(1);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// src/local-helpers/tiny-invariant.ts
|
|
63
|
+
var isProduction = process.env.NODE_ENV === "production";
|
|
64
|
+
|
|
41
65
|
// src/cross/clone.ts
|
|
42
|
-
import { isPlainObject } from "is-plain-object";
|
|
43
66
|
function clone(value) {
|
|
44
67
|
if (Array.isArray(value)) {
|
|
45
68
|
return value.map((v) => clone(v));
|
|
@@ -89,7 +112,6 @@ var ModelDataVisitor = class {
|
|
|
89
112
|
};
|
|
90
113
|
|
|
91
114
|
// src/cross/model-meta.ts
|
|
92
|
-
import { lowerCaseFirst } from "lower-case-first";
|
|
93
115
|
function resolveField(modelMeta, modelOrTypeDef, field, isTypeDef = false) {
|
|
94
116
|
var _a, _b;
|
|
95
117
|
const container = isTypeDef ? modelMeta.typeDefs : modelMeta.models;
|
|
@@ -479,7 +501,6 @@ var PrismaWriteActions = [
|
|
|
479
501
|
];
|
|
480
502
|
|
|
481
503
|
// src/cross/utils.ts
|
|
482
|
-
import { lowerCaseFirst as lowerCaseFirst2 } from "lower-case-first";
|
|
483
504
|
function getModelFields(data) {
|
|
484
505
|
return data ? Object.keys(data) : [];
|
|
485
506
|
}
|
|
@@ -510,7 +531,7 @@ function zip(x, y) {
|
|
|
510
531
|
}
|
|
511
532
|
function getIdFields(modelMeta, model, throwIfNotFound = false) {
|
|
512
533
|
var _a, _b;
|
|
513
|
-
const uniqueConstraints = (_b = (_a = modelMeta.models[
|
|
534
|
+
const uniqueConstraints = (_b = (_a = modelMeta.models[lowerCaseFirst(model)]) == null ? void 0 : _a.uniqueConstraints) != null ? _b : {};
|
|
514
535
|
const entries = Object.values(uniqueConstraints);
|
|
515
536
|
if (entries.length === 0) {
|
|
516
537
|
if (throwIfNotFound) {
|
|
@@ -521,7 +542,7 @@ function getIdFields(modelMeta, model, throwIfNotFound = false) {
|
|
|
521
542
|
return entries[0].fields.map((f) => requireField(modelMeta, model, f));
|
|
522
543
|
}
|
|
523
544
|
function getModelInfo(modelMeta, model, throwIfNotFound = false) {
|
|
524
|
-
const info = modelMeta.models[
|
|
545
|
+
const info = modelMeta.models[lowerCaseFirst(model)];
|
|
525
546
|
if (!info && throwIfNotFound) {
|
|
526
547
|
throw new Error(`Unable to load info for ${model}`);
|
|
527
548
|
}
|
|
@@ -529,7 +550,7 @@ function getModelInfo(modelMeta, model, throwIfNotFound = false) {
|
|
|
529
550
|
}
|
|
530
551
|
function getTypeDefInfo(modelMeta, typeDef, throwIfNotFound = false) {
|
|
531
552
|
var _a;
|
|
532
|
-
const info = (_a = modelMeta.typeDefs) == null ? void 0 : _a[
|
|
553
|
+
const info = (_a = modelMeta.typeDefs) == null ? void 0 : _a[lowerCaseFirst(typeDef)];
|
|
533
554
|
if (!info && throwIfNotFound) {
|
|
534
555
|
throw new Error(`Unable to load info for ${typeDef}`);
|
|
535
556
|
}
|
|
@@ -760,7 +781,6 @@ var NestedWriteVisitor = class {
|
|
|
760
781
|
};
|
|
761
782
|
|
|
762
783
|
// src/cross/query-analyzer.ts
|
|
763
|
-
import { lowerCaseFirst as lowerCaseFirst3 } from "lower-case-first";
|
|
764
784
|
function getReadModels(model, modelMeta, args) {
|
|
765
785
|
const result = /* @__PURE__ */ new Set();
|
|
766
786
|
result.add(model);
|
|
@@ -818,7 +838,7 @@ function collectDeleteCascades(model, modelMeta, result, visited) {
|
|
|
818
838
|
return;
|
|
819
839
|
}
|
|
820
840
|
visited.add(model);
|
|
821
|
-
const cascades = (_a = modelMeta.deleteCascade) == null ? void 0 : _a[
|
|
841
|
+
const cascades = (_a = modelMeta.deleteCascade) == null ? void 0 : _a[lowerCaseFirst(model)];
|
|
822
842
|
if (!cascades) {
|
|
823
843
|
return;
|
|
824
844
|
}
|