prisma-guard 1.22.3 → 1.24.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.
@@ -2,8 +2,34 @@
2
2
 
3
3
  // src/generator/index.ts
4
4
  import pkg from "@prisma/generator-helper";
5
- import { writeFileSync, mkdirSync } from "fs";
6
- import { join } from "path";
5
+ import { mkdirSync, writeFileSync } from "fs";
6
+ import { relative } from "path";
7
+
8
+ // src/generator/emit-client.ts
9
+ function emitClient(_dmmf, prismaClientImport) {
10
+ return `import type { PrismaClient } from '${prismaClientImport}'
11
+ import type { GuardInput, GuardedModel } from 'prisma-guard'
12
+ import { createGuard } from 'prisma-guard'
13
+ import { SCOPE_MAP, TYPE_MAP, ENUM_MAP, ZOD_CHAINS, GUARD_CONFIG, UNIQUE_MAP, ZOD_DEFAULTS } from './index'
14
+ import type { ScopeRoot } from './index'
15
+
16
+ interface GuardModelExtension {
17
+ $allModels: {
18
+ guard<TDelegate>(this: TDelegate, input: GuardInput, caller?: string): GuardedModel<TDelegate>
19
+ }
20
+ }
21
+
22
+ export const guard = createGuard<typeof TYPE_MAP, ScopeRoot, GuardModelExtension>({
23
+ scopeMap: SCOPE_MAP,
24
+ typeMap: TYPE_MAP,
25
+ enumMap: ENUM_MAP,
26
+ zodChains: ZOD_CHAINS,
27
+ guardConfig: GUARD_CONFIG,
28
+ uniqueMap: UNIQUE_MAP,
29
+ zodDefaults: ZOD_DEFAULTS,
30
+ })
31
+ `;
32
+ }
7
33
 
8
34
  // src/generator/emit-scope-map.ts
9
35
  function isScopeRoot(documentation) {
@@ -94,6 +120,182 @@ export type ScopeRoot = ${scopeRootType}
94
120
  return { source };
95
121
  }
96
122
 
123
+ // src/generator/emit-type-map.ts
124
+ function collectUniqueConstraints(model) {
125
+ const seen = /* @__PURE__ */ new Set();
126
+ const constraints = [];
127
+ function add(fields) {
128
+ const key = fields.join("\0");
129
+ if (seen.has(key))
130
+ return;
131
+ seen.add(key);
132
+ constraints.push(fields);
133
+ }
134
+ for (const field of model.fields) {
135
+ if (field.isId)
136
+ add([field.name]);
137
+ }
138
+ if (model.primaryKey) {
139
+ add([...model.primaryKey.fields]);
140
+ }
141
+ for (const field of model.fields) {
142
+ if (field.isUnique)
143
+ add([field.name]);
144
+ }
145
+ for (const fields of model.uniqueFields) {
146
+ add([...fields]);
147
+ }
148
+ return constraints;
149
+ }
150
+ function emitTypeMap(dmmf) {
151
+ const enumNames = new Set(dmmf.datamodel.enums.map((e) => e.name));
152
+ for (const e of dmmf.datamodel.enums) {
153
+ if (e.values.length === 0) {
154
+ throw new Error(`prisma-guard: Enum "${e.name}" has zero values.`);
155
+ }
156
+ }
157
+ const modelEntries = dmmf.datamodel.models.map((model) => {
158
+ const fieldEntries = model.fields.map((field) => {
159
+ const isRelation = field.kind === "object" || field.relationName != null;
160
+ const isEnum = enumNames.has(field.type);
161
+ const isUnsupported = field.kind === "unsupported";
162
+ const meta = [
163
+ `type: ${JSON.stringify(field.type)}`,
164
+ `isList: ${field.isList}`,
165
+ `isRequired: ${field.isRequired}`,
166
+ `isId: ${field.isId}`,
167
+ `isRelation: ${isRelation}`,
168
+ `hasDefault: ${field.hasDefaultValue}`,
169
+ `isUpdatedAt: ${field.isUpdatedAt}`
170
+ ];
171
+ if (isEnum)
172
+ meta.push(`isEnum: true`);
173
+ if (isUnsupported)
174
+ meta.push(`isUnsupported: true`);
175
+ if (field.isUnique)
176
+ meta.push(`isUnique: true`);
177
+ return ` ${JSON.stringify(field.name)}: { ${meta.join(", ")} },`;
178
+ }).join("\n");
179
+ return ` ${JSON.stringify(model.name)}: {
180
+ ${fieldEntries}
181
+ },`;
182
+ }).join("\n");
183
+ const enumEntries = dmmf.datamodel.enums.map((e) => {
184
+ const values = e.values.map((v) => JSON.stringify(v.name)).join(", ");
185
+ return ` ${JSON.stringify(e.name)}: [${values}],`;
186
+ }).join("\n");
187
+ const uniqueMapEntries = dmmf.datamodel.models.map((model) => {
188
+ const constraints = collectUniqueConstraints(model);
189
+ if (constraints.length === 0)
190
+ return null;
191
+ const constraintsStr = constraints.map((c) => `[${c.map((f) => JSON.stringify(f)).join(", ")}]`).join(", ");
192
+ return ` ${JSON.stringify(model.name)}: [${constraintsStr}],`;
193
+ }).filter(Boolean).join("\n");
194
+ const typeMapSource = `export const TYPE_MAP = {
195
+ ${modelEntries}
196
+ } as const
197
+ `;
198
+ const enumMapSource = `export const ENUM_MAP = {
199
+ ${enumEntries}
200
+ } as const
201
+ `;
202
+ const uniqueMapSource = `export const UNIQUE_MAP = {
203
+ ${uniqueMapEntries}
204
+ } as const
205
+ `;
206
+ const typesSource = [
207
+ `export type ModelName = keyof typeof TYPE_MAP`,
208
+ `export type FieldName<M extends ModelName> = keyof (typeof TYPE_MAP)[M]`
209
+ ].join("\n");
210
+ return `${typeMapSource}
211
+ ${enumMapSource}
212
+ ${uniqueMapSource}
213
+ ${typesSource}
214
+ `;
215
+ }
216
+
217
+ // src/shared/operation-shape-keys.ts
218
+ var OPERATION_SHAPE_KEYS = {
219
+ findMany: ["where", "include", "select", "orderBy", "cursor", "take", "skip", "distinct"],
220
+ findFirst: ["where", "include", "select", "orderBy", "cursor", "take", "skip", "distinct"],
221
+ findFirstOrThrow: ["where", "include", "select", "orderBy", "cursor", "take", "skip", "distinct"],
222
+ findUnique: ["where", "include", "select"],
223
+ findUniqueOrThrow: ["where", "include", "select"],
224
+ findManyPaginated: ["where", "include", "select", "orderBy", "cursor", "take", "skip", "distinct"],
225
+ count: ["where", "select", "cursor", "orderBy", "skip", "take"],
226
+ aggregate: ["where", "orderBy", "cursor", "take", "skip", "_count", "_avg", "_sum", "_min", "_max"],
227
+ groupBy: ["where", "by", "having", "_count", "_avg", "_sum", "_min", "_max", "orderBy", "take", "skip"],
228
+ create: ["data", "select", "include"],
229
+ createMany: ["data"],
230
+ createManyAndReturn: ["data", "select", "include"],
231
+ update: ["data", "where", "select", "include"],
232
+ updateMany: ["data", "where"],
233
+ updateManyAndReturn: ["data", "where", "select", "include"],
234
+ upsert: ["where", "create", "update", "select", "include"],
235
+ delete: ["where", "select", "include"],
236
+ deleteMany: ["where"]
237
+ };
238
+ var READ_METHOD_ALLOWED_ARGS = {
239
+ findMany: new Set(OPERATION_SHAPE_KEYS.findMany),
240
+ findFirst: new Set(OPERATION_SHAPE_KEYS.findFirst),
241
+ findFirstOrThrow: new Set(OPERATION_SHAPE_KEYS.findFirstOrThrow),
242
+ findUnique: new Set(OPERATION_SHAPE_KEYS.findUnique),
243
+ findUniqueOrThrow: new Set(OPERATION_SHAPE_KEYS.findUniqueOrThrow),
244
+ count: new Set(OPERATION_SHAPE_KEYS.count),
245
+ aggregate: new Set(OPERATION_SHAPE_KEYS.aggregate),
246
+ groupBy: new Set(OPERATION_SHAPE_KEYS.groupBy)
247
+ };
248
+ var MUTATION_SHAPE_KEYS = {
249
+ create: new Set(OPERATION_SHAPE_KEYS.create),
250
+ createMany: new Set(OPERATION_SHAPE_KEYS.createMany),
251
+ createManyAndReturn: new Set(OPERATION_SHAPE_KEYS.createManyAndReturn),
252
+ update: new Set(OPERATION_SHAPE_KEYS.update),
253
+ updateMany: new Set(OPERATION_SHAPE_KEYS.updateMany),
254
+ updateManyAndReturn: new Set(OPERATION_SHAPE_KEYS.updateManyAndReturn),
255
+ upsert: new Set(OPERATION_SHAPE_KEYS.upsert),
256
+ delete: new Set(OPERATION_SHAPE_KEYS.delete),
257
+ deleteMany: new Set(OPERATION_SHAPE_KEYS.deleteMany)
258
+ };
259
+
260
+ // src/generator/emit-typed-shapes.ts
261
+ var OPERATIONS = Object.keys(OPERATION_SHAPE_KEYS);
262
+ function cap(s) {
263
+ return s.charAt(0).toUpperCase() + s.slice(1);
264
+ }
265
+ function emitTypedShapes(dmmf, depth) {
266
+ const header = `import type { TYPE_MAP } from './index'
267
+ import type {
268
+ TypedGuardShape,
269
+ OperationShape,
270
+ ShapeInput,
271
+ TypedProjection,
272
+ TypedInclude,
273
+ TypedCountSelect,
274
+ } from 'prisma-guard'
275
+
276
+ type TM = typeof TYPE_MAP
277
+
278
+ `;
279
+ const blocks = dmmf.datamodel.models.map((model) => {
280
+ const m = model.name;
281
+ const projAlias = `export type ${m}Select = TypedProjection<TM, '${m}', ${depth}>
282
+ export type ${m}Projection = ${m}Select
283
+ export type ${m}Include = TypedInclude<TM, '${m}', ${depth}>
284
+ export type ${m}CountSelect = TypedCountSelect<TM, '${m}'>
285
+ `;
286
+ const guardAlias = `export type ${m}GuardShape = TypedGuardShape<TM, '${m}', ${depth}>
287
+ `;
288
+ const opAliases = OPERATIONS.map((op) => {
289
+ const c = cap(op);
290
+ return `export type ${m}${c}Shape = OperationShape<TM, '${m}', '${op}', ${depth}>
291
+ export type ${m}${c}ShapeInput<TCtx = unknown> = ShapeInput<${m}${c}Shape, TCtx>
292
+ `;
293
+ }).join("");
294
+ return projAlias + guardAlias + opAliases;
295
+ }).join("\n");
296
+ return header + blocks;
297
+ }
298
+
97
299
  // src/generator/emit-zod-chains.ts
98
300
  import { z as z2 } from "zod";
99
301
 
@@ -790,247 +992,6 @@ ${entries}
790
992
  };
791
993
  }
792
994
 
793
- // src/generator/emit-type-map.ts
794
- function collectUniqueConstraints(model) {
795
- const seen = /* @__PURE__ */ new Set();
796
- const constraints = [];
797
- function add(fields) {
798
- const key = fields.join("\0");
799
- if (seen.has(key))
800
- return;
801
- seen.add(key);
802
- constraints.push(fields);
803
- }
804
- for (const field of model.fields) {
805
- if (field.isId)
806
- add([field.name]);
807
- }
808
- if (model.primaryKey) {
809
- add([...model.primaryKey.fields]);
810
- }
811
- for (const field of model.fields) {
812
- if (field.isUnique)
813
- add([field.name]);
814
- }
815
- for (const fields of model.uniqueFields) {
816
- add([...fields]);
817
- }
818
- return constraints;
819
- }
820
- function emitTypeMap(dmmf) {
821
- const enumNames = new Set(dmmf.datamodel.enums.map((e) => e.name));
822
- for (const e of dmmf.datamodel.enums) {
823
- if (e.values.length === 0) {
824
- throw new Error(`prisma-guard: Enum "${e.name}" has zero values.`);
825
- }
826
- }
827
- const modelEntries = dmmf.datamodel.models.map((model) => {
828
- const fieldEntries = model.fields.map((field) => {
829
- const isRelation = field.kind === "object" || field.relationName != null;
830
- const isEnum = enumNames.has(field.type);
831
- const isUnsupported = field.kind === "unsupported";
832
- const meta = [
833
- `type: ${JSON.stringify(field.type)}`,
834
- `isList: ${field.isList}`,
835
- `isRequired: ${field.isRequired}`,
836
- `isId: ${field.isId}`,
837
- `isRelation: ${isRelation}`,
838
- `hasDefault: ${field.hasDefaultValue}`,
839
- `isUpdatedAt: ${field.isUpdatedAt}`
840
- ];
841
- if (isEnum)
842
- meta.push(`isEnum: true`);
843
- if (isUnsupported)
844
- meta.push(`isUnsupported: true`);
845
- if (field.isUnique)
846
- meta.push(`isUnique: true`);
847
- return ` ${JSON.stringify(field.name)}: { ${meta.join(", ")} },`;
848
- }).join("\n");
849
- return ` ${JSON.stringify(model.name)}: {
850
- ${fieldEntries}
851
- },`;
852
- }).join("\n");
853
- const enumEntries = dmmf.datamodel.enums.map((e) => {
854
- const values = e.values.map((v) => JSON.stringify(v.name)).join(", ");
855
- return ` ${JSON.stringify(e.name)}: [${values}],`;
856
- }).join("\n");
857
- const uniqueMapEntries = dmmf.datamodel.models.map((model) => {
858
- const constraints = collectUniqueConstraints(model);
859
- if (constraints.length === 0)
860
- return null;
861
- const constraintsStr = constraints.map((c) => `[${c.map((f) => JSON.stringify(f)).join(", ")}]`).join(", ");
862
- return ` ${JSON.stringify(model.name)}: [${constraintsStr}],`;
863
- }).filter(Boolean).join("\n");
864
- const typeMapSource = `export const TYPE_MAP = {
865
- ${modelEntries}
866
- } as const
867
- `;
868
- const enumMapSource = `export const ENUM_MAP = {
869
- ${enumEntries}
870
- } as const
871
- `;
872
- const uniqueMapSource = `export const UNIQUE_MAP = {
873
- ${uniqueMapEntries}
874
- } as const
875
- `;
876
- const typesSource = [
877
- `export type ModelName = keyof typeof TYPE_MAP`,
878
- `export type FieldName<M extends ModelName> = keyof (typeof TYPE_MAP)[M]`
879
- ].join("\n");
880
- return `${typeMapSource}
881
- ${enumMapSource}
882
- ${uniqueMapSource}
883
- ${typesSource}
884
- `;
885
- }
886
-
887
- // src/shared/constants.ts
888
- var SHAPE_CONFIG_KEY_LIST = [
889
- "where",
890
- "include",
891
- "select",
892
- "orderBy",
893
- "cursor",
894
- "take",
895
- "skip",
896
- "distinct",
897
- "having",
898
- "_count",
899
- "_avg",
900
- "_sum",
901
- "_min",
902
- "_max",
903
- "by"
904
- ];
905
- var SHAPE_CONFIG_KEYS = new Set(SHAPE_CONFIG_KEY_LIST);
906
- var GUARD_SHAPE_KEY_LIST = [
907
- "data",
908
- "create",
909
- "update",
910
- ...SHAPE_CONFIG_KEY_LIST
911
- ];
912
- var GUARD_SHAPE_KEYS = new Set(GUARD_SHAPE_KEY_LIST);
913
- var TO_MANY_RELATION_OPS = /* @__PURE__ */ new Set(["some", "every", "none"]);
914
- var TO_ONE_RELATION_OPS = /* @__PURE__ */ new Set(["is", "isNot"]);
915
- var ALL_RELATION_OPS = /* @__PURE__ */ new Set([...TO_MANY_RELATION_OPS, ...TO_ONE_RELATION_OPS]);
916
- function toDelegateKey(modelName) {
917
- return modelName[0].toLowerCase() + modelName.slice(1);
918
- }
919
- var FORCED_MARKER = Symbol.for("prisma-guard.forced");
920
- var UNSUPPORTED_MARKER = Symbol.for("prisma-guard.unsupported");
921
-
922
- // src/generator/emit-client.ts
923
- function emitClient(dmmf) {
924
- const modelEntries = dmmf.datamodel.models.map((model) => {
925
- const key = toDelegateKey(model.name);
926
- return ` ${key}: {
927
- guard(input: GuardInput, caller?: string): GuardedModel<PrismaClient['${key}']>
928
- }`;
929
- }).join("\n");
930
- return `import type { PrismaClient } from '@prisma/client'
931
- import type { GuardInput, GuardedModel } from 'prisma-guard'
932
- import { createGuard } from 'prisma-guard'
933
- import { SCOPE_MAP, TYPE_MAP, ENUM_MAP, ZOD_CHAINS, GUARD_CONFIG, UNIQUE_MAP, ZOD_DEFAULTS } from './index'
934
- import type { ScopeRoot } from './index'
935
-
936
- interface GuardModelExtension {
937
- ${modelEntries}
938
- }
939
-
940
- export const guard = createGuard<typeof TYPE_MAP, ScopeRoot, GuardModelExtension>({
941
- scopeMap: SCOPE_MAP,
942
- typeMap: TYPE_MAP,
943
- enumMap: ENUM_MAP,
944
- zodChains: ZOD_CHAINS,
945
- guardConfig: GUARD_CONFIG,
946
- uniqueMap: UNIQUE_MAP,
947
- zodDefaults: ZOD_DEFAULTS,
948
- })
949
- `;
950
- }
951
-
952
- // src/shared/operation-shape-keys.ts
953
- var OPERATION_SHAPE_KEYS = {
954
- findMany: ["where", "include", "select", "orderBy", "cursor", "take", "skip", "distinct"],
955
- findFirst: ["where", "include", "select", "orderBy", "cursor", "take", "skip", "distinct"],
956
- findFirstOrThrow: ["where", "include", "select", "orderBy", "cursor", "take", "skip", "distinct"],
957
- findUnique: ["where", "include", "select"],
958
- findUniqueOrThrow: ["where", "include", "select"],
959
- findManyPaginated: ["where", "include", "select", "orderBy", "cursor", "take", "skip", "distinct"],
960
- count: ["where", "select", "cursor", "orderBy", "skip", "take"],
961
- aggregate: ["where", "orderBy", "cursor", "take", "skip", "_count", "_avg", "_sum", "_min", "_max"],
962
- groupBy: ["where", "by", "having", "_count", "_avg", "_sum", "_min", "_max", "orderBy", "take", "skip"],
963
- create: ["data", "select", "include"],
964
- createMany: ["data"],
965
- createManyAndReturn: ["data", "select", "include"],
966
- update: ["data", "where", "select", "include"],
967
- updateMany: ["data", "where"],
968
- updateManyAndReturn: ["data", "where", "select", "include"],
969
- upsert: ["where", "create", "update", "select", "include"],
970
- delete: ["where", "select", "include"],
971
- deleteMany: ["where"]
972
- };
973
- var READ_METHOD_ALLOWED_ARGS = {
974
- findMany: new Set(OPERATION_SHAPE_KEYS.findMany),
975
- findFirst: new Set(OPERATION_SHAPE_KEYS.findFirst),
976
- findFirstOrThrow: new Set(OPERATION_SHAPE_KEYS.findFirstOrThrow),
977
- findUnique: new Set(OPERATION_SHAPE_KEYS.findUnique),
978
- findUniqueOrThrow: new Set(OPERATION_SHAPE_KEYS.findUniqueOrThrow),
979
- count: new Set(OPERATION_SHAPE_KEYS.count),
980
- aggregate: new Set(OPERATION_SHAPE_KEYS.aggregate),
981
- groupBy: new Set(OPERATION_SHAPE_KEYS.groupBy)
982
- };
983
- var MUTATION_SHAPE_KEYS = {
984
- create: new Set(OPERATION_SHAPE_KEYS.create),
985
- createMany: new Set(OPERATION_SHAPE_KEYS.createMany),
986
- createManyAndReturn: new Set(OPERATION_SHAPE_KEYS.createManyAndReturn),
987
- update: new Set(OPERATION_SHAPE_KEYS.update),
988
- updateMany: new Set(OPERATION_SHAPE_KEYS.updateMany),
989
- updateManyAndReturn: new Set(OPERATION_SHAPE_KEYS.updateManyAndReturn),
990
- upsert: new Set(OPERATION_SHAPE_KEYS.upsert),
991
- delete: new Set(OPERATION_SHAPE_KEYS.delete),
992
- deleteMany: new Set(OPERATION_SHAPE_KEYS.deleteMany)
993
- };
994
-
995
- // src/generator/emit-typed-shapes.ts
996
- var OPERATIONS = Object.keys(OPERATION_SHAPE_KEYS);
997
- function cap(s) {
998
- return s.charAt(0).toUpperCase() + s.slice(1);
999
- }
1000
- function emitTypedShapes(dmmf, depth) {
1001
- const header = `import type { TYPE_MAP } from './index'
1002
- import type {
1003
- TypedGuardShape,
1004
- OperationShape,
1005
- ShapeInput,
1006
- TypedProjection,
1007
- TypedInclude,
1008
- TypedCountSelect,
1009
- } from 'prisma-guard'
1010
-
1011
- type TM = typeof TYPE_MAP
1012
-
1013
- `;
1014
- const blocks = dmmf.datamodel.models.map((model) => {
1015
- const m = model.name;
1016
- const projAlias = `export type ${m}Select = TypedProjection<TM, '${m}', ${depth}>
1017
- export type ${m}Projection = ${m}Select
1018
- export type ${m}Include = TypedInclude<TM, '${m}', ${depth}>
1019
- export type ${m}CountSelect = TypedCountSelect<TM, '${m}'>
1020
- `;
1021
- const guardAlias = `export type ${m}GuardShape = TypedGuardShape<TM, '${m}', ${depth}>
1022
- `;
1023
- const opAliases = OPERATIONS.map((op) => {
1024
- const c = cap(op);
1025
- return `export type ${m}${c}Shape = OperationShape<TM, '${m}', '${op}', ${depth}>
1026
- export type ${m}${c}ShapeInput<TCtx = unknown> = ShapeInput<${m}${c}Shape, TCtx>
1027
- `;
1028
- }).join("");
1029
- return projAlias + guardAlias + opAliases;
1030
- }).join("\n");
1031
- return header + blocks;
1032
- }
1033
-
1034
995
  // src/generator/index.ts
1035
996
  var { generatorHandler } = pkg;
1036
997
  var VALID_ON_INVALID_ZOD = /* @__PURE__ */ new Set(["error", "warn"]);
@@ -1073,7 +1034,7 @@ function emitZodDefaults(defaults) {
1073
1034
  `;
1074
1035
  }
1075
1036
  const mapEntries = entries.map(([model, fields]) => {
1076
- const fieldsStr = fields.map((f) => JSON.stringify(f)).join(", ");
1037
+ const fieldsStr = fields.map((field) => JSON.stringify(field)).join(", ");
1077
1038
  return ` ${JSON.stringify(model)}: [${fieldsStr}],`;
1078
1039
  }).join("\n");
1079
1040
  return `export const ZOD_DEFAULTS: Record<string, readonly string[]> = {
@@ -1081,6 +1042,35 @@ ${mapEntries}
1081
1042
  }
1082
1043
  `;
1083
1044
  }
1045
+ function getProviderValue(provider) {
1046
+ if (typeof provider === "string")
1047
+ return provider;
1048
+ if (provider && typeof provider === "object" && "value" in provider) {
1049
+ const value = provider.value;
1050
+ if (typeof value === "string")
1051
+ return value;
1052
+ }
1053
+ return "";
1054
+ }
1055
+ function isPrismaClientProvider(provider) {
1056
+ const value = getProviderValue(provider);
1057
+ return value === "prisma-client-js" || value.endsWith("/prisma-client-js");
1058
+ }
1059
+ function normalizeImportPath(path) {
1060
+ const normalized = path.replace(/\\/g, "/");
1061
+ if (normalized.startsWith("."))
1062
+ return normalized;
1063
+ return `./${normalized}`;
1064
+ }
1065
+ function resolvePrismaClientImport(options, guardOutput) {
1066
+ const prismaClientGenerator = options.otherGenerators.find(
1067
+ (generator) => isPrismaClientProvider(generator.provider)
1068
+ );
1069
+ const clientOutput = prismaClientGenerator?.output?.value;
1070
+ if (!clientOutput)
1071
+ return "@prisma/client";
1072
+ return normalizeImportPath(relative(guardOutput, clientOutput));
1073
+ }
1084
1074
  generatorHandler({
1085
1075
  onManifest() {
1086
1076
  return {
@@ -1093,15 +1083,49 @@ generatorHandler({
1093
1083
  if (!output)
1094
1084
  throw new Error("prisma-guard: No output directory specified");
1095
1085
  const config = options.generator.config ?? {};
1096
- const onInvalidZod = validateConfigEnum("onInvalidZod", config.onInvalidZod ?? "error", VALID_ON_INVALID_ZOD);
1097
- const onAmbiguousScope = validateConfigEnum("onAmbiguousScope", config.onAmbiguousScope ?? "error", VALID_ON_AMBIGUOUS_SCOPE);
1098
- const onMissingScopeContext = validateConfigEnum("onMissingScopeContext", config.onMissingScopeContext ?? "error", VALID_ON_MISSING_SCOPE_CONTEXT);
1099
- const findUniqueMode = validateConfigEnum("findUniqueMode", config.findUniqueMode ?? "reject", VALID_FIND_UNIQUE_MODE);
1100
- const onScopeRelationWrite = validateConfigEnum("onScopeRelationWrite", config.onScopeRelationWrite ?? "error", VALID_ON_SCOPE_RELATION_WRITE);
1101
- const strictDecimal = validateBooleanConfig("strictDecimal", config.strictDecimal, false);
1102
- const enforceProjection = validateBooleanConfig("enforceProjection", config.enforceProjection, false);
1103
- const typedGuardShapes = validateBooleanConfig("typedGuardShapes", config.typedGuardShapes, true);
1104
- const typedGuardRelationDepth = validateDepthConfig(config.typedGuardRelationDepth);
1086
+ const onInvalidZod = validateConfigEnum(
1087
+ "onInvalidZod",
1088
+ config.onInvalidZod ?? "error",
1089
+ VALID_ON_INVALID_ZOD
1090
+ );
1091
+ const onAmbiguousScope = validateConfigEnum(
1092
+ "onAmbiguousScope",
1093
+ config.onAmbiguousScope ?? "error",
1094
+ VALID_ON_AMBIGUOUS_SCOPE
1095
+ );
1096
+ const onMissingScopeContext = validateConfigEnum(
1097
+ "onMissingScopeContext",
1098
+ config.onMissingScopeContext ?? "error",
1099
+ VALID_ON_MISSING_SCOPE_CONTEXT
1100
+ );
1101
+ const findUniqueMode = validateConfigEnum(
1102
+ "findUniqueMode",
1103
+ config.findUniqueMode ?? "reject",
1104
+ VALID_FIND_UNIQUE_MODE
1105
+ );
1106
+ const onScopeRelationWrite = validateConfigEnum(
1107
+ "onScopeRelationWrite",
1108
+ config.onScopeRelationWrite ?? "error",
1109
+ VALID_ON_SCOPE_RELATION_WRITE
1110
+ );
1111
+ const strictDecimal = validateBooleanConfig(
1112
+ "strictDecimal",
1113
+ config.strictDecimal,
1114
+ false
1115
+ );
1116
+ const enforceProjection = validateBooleanConfig(
1117
+ "enforceProjection",
1118
+ config.enforceProjection,
1119
+ false
1120
+ );
1121
+ const typedGuardShapes = validateBooleanConfig(
1122
+ "typedGuardShapes",
1123
+ config.typedGuardShapes,
1124
+ true
1125
+ );
1126
+ const typedGuardRelationDepth = validateDepthConfig(
1127
+ config.typedGuardRelationDepth
1128
+ );
1105
1129
  const dmmf = options.dmmf;
1106
1130
  const parts = [];
1107
1131
  parts.push(
@@ -1122,12 +1146,13 @@ generatorHandler({
1122
1146
  parts.push(zodChainsSource);
1123
1147
  parts.push(emitZodDefaults(defaults));
1124
1148
  mkdirSync(output, { recursive: true });
1125
- writeFileSync(join(output, "index.ts"), parts.join("\n"), "utf-8");
1126
- const clientSource = emitClient(dmmf);
1127
- writeFileSync(join(output, "client.ts"), clientSource, "utf-8");
1149
+ writeFileSync(`${output}/index.ts`, parts.join("\n"), "utf-8");
1150
+ const prismaClientImport = resolvePrismaClientImport(options, output);
1151
+ const clientSource = emitClient(dmmf, prismaClientImport);
1152
+ writeFileSync(`${output}/client.ts`, clientSource, "utf-8");
1128
1153
  if (typedGuardShapes) {
1129
1154
  writeFileSync(
1130
- join(output, "shapes.ts"),
1155
+ `${output}/shapes.ts`,
1131
1156
  emitTypedShapes(dmmf, typedGuardRelationDepth),
1132
1157
  "utf-8"
1133
1158
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/generator/index.ts","../../src/generator/emit-scope-map.ts","../../src/generator/emit-zod-chains.ts","../../src/generator/validate-directive.ts","../../src/shared/scalar-base.ts","../../src/generator/emit-type-map.ts","../../src/shared/constants.ts","../../src/generator/emit-client.ts","../../src/shared/operation-shape-keys.ts","../../src/generator/emit-typed-shapes.ts"],"sourcesContent":["import pkg from '@prisma/generator-helper'\nconst { generatorHandler } = pkg\nimport type { DMMF } from '@prisma/generator-helper'\nimport { writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { emitScopeMap } from './emit-scope-map.js'\nimport { emitZodChains } from './emit-zod-chains.js'\nimport { emitTypeMap } from './emit-type-map.js'\nimport { emitClient } from './emit-client.js'\nimport { emitTypedShapes } from './emit-typed-shapes.js'\n\nconst VALID_ON_INVALID_ZOD = new Set<'error' | 'warn'>(['error', 'warn'])\nconst VALID_ON_AMBIGUOUS_SCOPE = new Set<'error' | 'warn' | 'ignore'>(['error', 'warn', 'ignore'])\nconst VALID_ON_MISSING_SCOPE_CONTEXT = new Set<'error' | 'warn' | 'ignore'>(['error', 'warn', 'ignore'])\nconst VALID_FIND_UNIQUE_MODE = new Set<'verify' | 'reject'>(['verify', 'reject'])\nconst VALID_ON_SCOPE_RELATION_WRITE = new Set<'error' | 'warn' | 'strip'>(['error', 'warn', 'strip'])\nconst VALID_BOOLEAN_CONFIG = new Set(['true', 'false'])\nconst VALID_TYPED_GUARD_DEPTH = new Set(['0', '1', '2', '3'])\n\nfunction validateConfigEnum<T extends string>(\n name: string,\n value: string,\n allowed: Set<T>,\n): T {\n if (!allowed.has(value as T)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"${name}\": \"${value}\". Allowed values: ${[...allowed].join(', ')}`,\n )\n }\n return value as T\n}\n\nfunction validateBooleanConfig(name: string, raw: string | undefined, fallback: boolean): boolean {\n const value = raw ?? (fallback ? 'true' : 'false')\n if (!VALID_BOOLEAN_CONFIG.has(value)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"${name}\": \"${value}\". Allowed values: true, false`,\n )\n }\n return value === 'true'\n}\n\nfunction validateDepthConfig(raw: string | undefined): 0 | 1 | 2 | 3 {\n const value = raw ?? '1'\n if (!VALID_TYPED_GUARD_DEPTH.has(value)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"typedGuardRelationDepth\": \"${value}\". Allowed values: 0, 1, 2, 3`,\n )\n }\n return Number(value) as 0 | 1 | 2 | 3\n}\n\nfunction emitZodDefaults(defaults: Record<string, string[]>): string {\n const entries = Object.entries(defaults)\n if (entries.length === 0) {\n return `export const ZOD_DEFAULTS: Record<string, readonly string[]> = {}\\n`\n }\n const mapEntries = entries\n .map(([model, fields]) => {\n const fieldsStr = fields.map(f => JSON.stringify(f)).join(', ')\n return ` ${JSON.stringify(model)}: [${fieldsStr}],`\n })\n .join('\\n')\n return `export const ZOD_DEFAULTS: Record<string, readonly string[]> = {\\n${mapEntries}\\n}\\n`\n}\n\ngeneratorHandler({\n onManifest() {\n return {\n prettyName: 'Prisma Guard',\n defaultOutput: 'generated/guard',\n }\n },\n\n async onGenerate(options) {\n const output = options.generator.output?.value\n if (!output) throw new Error('prisma-guard: No output directory specified')\n\n const config = options.generator.config ?? {}\n const onInvalidZod = validateConfigEnum('onInvalidZod', (config.onInvalidZod as string) ?? 'error', VALID_ON_INVALID_ZOD)\n const onAmbiguousScope = validateConfigEnum('onAmbiguousScope', (config.onAmbiguousScope as string) ?? 'error', VALID_ON_AMBIGUOUS_SCOPE)\n const onMissingScopeContext = validateConfigEnum('onMissingScopeContext', (config.onMissingScopeContext as string) ?? 'error', VALID_ON_MISSING_SCOPE_CONTEXT)\n const findUniqueMode = validateConfigEnum('findUniqueMode', (config.findUniqueMode as string) ?? 'reject', VALID_FIND_UNIQUE_MODE)\n const onScopeRelationWrite = validateConfigEnum('onScopeRelationWrite', (config.onScopeRelationWrite as string) ?? 'error', VALID_ON_SCOPE_RELATION_WRITE)\n const strictDecimal = validateBooleanConfig('strictDecimal', config.strictDecimal as string | undefined, false)\n const enforceProjection = validateBooleanConfig('enforceProjection', config.enforceProjection as string | undefined, false)\n const typedGuardShapes = validateBooleanConfig('typedGuardShapes', config.typedGuardShapes as string | undefined, true)\n const typedGuardRelationDepth = validateDepthConfig(config.typedGuardRelationDepth as string | undefined)\n\n const dmmf = options.dmmf\n\n const parts: string[] = []\n\n parts.push(\n `export const GUARD_CONFIG = {\\n` +\n ` onMissingScopeContext: ${JSON.stringify(onMissingScopeContext)},\\n` +\n ` findUniqueMode: ${JSON.stringify(findUniqueMode)},\\n` +\n ` onScopeRelationWrite: ${JSON.stringify(onScopeRelationWrite)},\\n` +\n ` strictDecimal: ${JSON.stringify(strictDecimal)},\\n` +\n ` enforceProjection: ${JSON.stringify(enforceProjection)},\\n` +\n `} as const\\n`,\n )\n\n const { source: scopeSource } = emitScopeMap(dmmf, onAmbiguousScope)\n parts.push(scopeSource)\n\n const typeMapSource = emitTypeMap(dmmf)\n parts.push(typeMapSource)\n\n const { source: zodChainsSource, defaults } = emitZodChains(dmmf, onInvalidZod)\n parts.push(zodChainsSource)\n\n parts.push(emitZodDefaults(defaults))\n\n mkdirSync(output, { recursive: true })\n writeFileSync(join(output, 'index.ts'), parts.join('\\n'), 'utf-8')\n\n const clientSource = emitClient(dmmf)\n writeFileSync(join(output, 'client.ts'), clientSource, 'utf-8')\n\n if (typedGuardShapes) {\n writeFileSync(\n join(output, 'shapes.ts'),\n emitTypedShapes(dmmf, typedGuardRelationDepth),\n 'utf-8',\n )\n }\n },\n})","import type { DMMF } from '@prisma/generator-helper'\n\nfunction isScopeRoot(documentation: string | undefined): boolean {\n if (!documentation) return false\n const tokens = documentation.split(/[\\s\\n\\r]+/)\n return tokens.some(t => t === '@scope-root')\n}\n\ninterface RelationEntry {\n fks: string[]\n root: string\n relationName: string\n}\n\nexport function emitScopeMap(\n dmmf: DMMF.Document,\n onAmbiguousScope: 'error' | 'warn' | 'ignore',\n): { source: string } {\n const rootModels = new Set<string>()\n\n for (const model of dmmf.datamodel.models) {\n if (isScopeRoot(model.documentation)) {\n rootModels.add(model.name)\n }\n }\n\n const scopeMap: Record<string, { fk: string; root: string; relationName: string }[]> = {}\n\n for (const model of dmmf.datamodel.models) {\n if (rootModels.has(model.name)) continue\n\n const relations: RelationEntry[] = []\n\n for (const field of model.fields) {\n if (!field.relationFromFields || field.relationFromFields.length === 0) continue\n if (!rootModels.has(field.type)) continue\n\n if (field.relationFromFields.length > 1) {\n const msg = `Model \"${model.name}\" has a composite foreign key to scope root \"${field.type}\" via relation \"${field.name}\" ` +\n `(fields: ${field.relationFromFields.join(', ')}). Composite scope relations are not supported.`\n\n if (onAmbiguousScope === 'error') {\n throw new Error(`prisma-guard: ${msg}`)\n }\n\n if (onAmbiguousScope === 'warn') {\n console.warn(`prisma-guard: ${msg} Excluding relation \"${field.name}\" to scope root \"${field.type}\" from scope map for model \"${model.name}\".`)\n }\n\n continue\n }\n\n relations.push({\n fks: [...field.relationFromFields],\n root: field.type,\n relationName: field.name,\n })\n }\n\n if (relations.length === 0) continue\n\n const relationsByRoot: Record<string, RelationEntry[]> = {}\n for (const rel of relations) {\n if (!relationsByRoot[rel.root]) relationsByRoot[rel.root] = []\n relationsByRoot[rel.root].push(rel)\n }\n\n const entries: { fk: string; root: string; relationName: string }[] = []\n\n for (const [root, rels] of Object.entries(relationsByRoot)) {\n if (rels.length > 1) {\n const relNames = rels.map(r => r.relationName)\n const msg = `Model \"${model.name}\" has multiple relations to scope root \"${root}\" (${relNames.join(', ')}).`\n\n if (onAmbiguousScope === 'error') {\n throw new Error(\n `prisma-guard: Ambiguous scope detected. Resolve these or set onAmbiguousScope to \"warn\" or \"ignore\":\\n` +\n ` - ${msg}`,\n )\n }\n\n if (onAmbiguousScope === 'warn') {\n console.warn(`prisma-guard: ${msg} Excluding relations to scope root \"${root}\" from scope map for model \"${model.name}\".`)\n }\n\n continue\n }\n\n entries.push({\n fk: rels[0].fks[0],\n root: rels[0].root,\n relationName: rels[0].relationName,\n })\n }\n\n if (entries.length > 0) {\n scopeMap[model.name] = entries\n }\n }\n\n const roots = Array.from(rootModels).sort()\n\n const mapEntries = Object.entries(scopeMap)\n .map(([model, entries]) => {\n const entriesStr = entries\n .map(e => `{ fk: ${JSON.stringify(e.fk)}, root: ${JSON.stringify(e.root)}, relationName: ${JSON.stringify(e.relationName)} }`)\n .join(', ')\n return ` ${model}: [${entriesStr}],`\n })\n .join('\\n')\n\n const scopeRootType = roots.length > 0\n ? roots.map(r => `'${r}'`).join(' | ')\n : 'never'\n\n const source = `export const SCOPE_MAP = {\\n${mapEntries}\\n} as const\\n\\nexport type ScopeRoot = ${scopeRootType}\\n`\n\n return { source }\n}","import type { DMMF } from '@prisma/generator-helper'\nimport { z } from 'zod'\nimport { validateDirective } from './validate-directive.js'\nimport { SCALAR_BASE } from '../shared/scalar-base.js'\n\nfunction buildGenerationBase(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues?: readonly string[],\n): z.ZodTypeAny | null {\n let base: z.ZodTypeAny\n\n if (isEnum) {\n const values = enumValues && enumValues.length > 0 ? enumValues : ['__placeholder__']\n base = z.enum(values as [string, ...string[]])\n } else {\n const factory = SCALAR_BASE[fieldType]\n if (!factory) return null\n base = factory()\n }\n\n if (isList) base = z.array(base)\n\n return base\n}\n\nconst TYPE_CHANGING_METHODS = new Set([\n 'optional', 'nullable', 'nullish', 'readonly', 'default', 'catch',\n])\n\nfunction checkChainCompatibility(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues: readonly string[] | undefined,\n methods: string[],\n): string | null {\n let current = buildGenerationBase(fieldType, isList, isEnum, enumValues)\n if (!current) return null\n\n for (const method of methods) {\n if (typeof (current as any)[method] !== 'function') {\n return method\n }\n if (TYPE_CHANGING_METHODS.has(method)) {\n try {\n if (method === 'default' || method === 'catch') {\n current = (current as any)[method](undefined)\n } else {\n current = (current as any)[method]()\n }\n } catch {\n }\n }\n }\n return null\n}\n\nfunction verifyChainExecution(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues: readonly string[] | undefined,\n chainStr: string,\n): string | null {\n const base = buildGenerationBase(fieldType, isList, isEnum, enumValues)\n if (!base) return null\n\n let fn: (base: z.ZodTypeAny) => z.ZodTypeAny\n try {\n fn = new Function('base', `'use strict'; return base${chainStr}`) as (base: z.ZodTypeAny) => z.ZodTypeAny\n } catch (err: any) {\n return `syntax error: ${err.message}`\n }\n\n try {\n const result = fn(base)\n if (result === null || result === undefined || typeof result !== 'object' || typeof (result as any).parse !== 'function') {\n return 'chain did not produce a valid Zod schema'\n }\n } catch (err: any) {\n return err.message\n }\n\n return null\n}\n\nfunction findZodInDoc(documentation: string): string[] {\n return documentation.split('\\n').filter(line => {\n const trimmed = line.trim()\n return /^@zod(?:\\s|$|\\.)/.test(trimmed)\n })\n}\n\nexport function emitZodChains(\n dmmf: DMMF.Document,\n onInvalidZod: 'error' | 'warn',\n): { source: string; hasChains: boolean; defaults: Record<string, string[]> } {\n const enumNames = new Set(dmmf.datamodel.enums.map(e => e.name))\n const enumValues: Record<string, readonly string[]> = {}\n for (const e of dmmf.datamodel.enums) {\n enumValues[e.name] = e.values.map(v => v.name)\n }\n\n const modelChains: Record<string, Record<string, string>> = {}\n const defaults: Record<string, string[]> = {}\n\n for (const model of dmmf.datamodel.models) {\n for (const field of model.fields) {\n if (!field.documentation) continue\n\n const zodLines = findZodInDoc(field.documentation)\n\n if (zodLines.length === 0) continue\n if (zodLines.length > 1) {\n const msg = `prisma-guard: Multiple @zod directives on ${model.name}.${field.name}. Only one @zod per field allowed.`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const line = zodLines[0]\n const idx = line.indexOf('@zod')\n const chainStr = line.slice(idx + 4).trim()\n\n if (chainStr.length === 0) {\n const msg = `prisma-guard: Empty @zod directive on ${model.name}.${field.name}. Add a method chain (e.g. @zod .min(1)) or remove the directive.`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const result = validateDirective(chainStr)\n if (!result.valid) {\n const msg = `prisma-guard: Invalid @zod directive on ${model.name}.${field.name}: ${result.reason}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const isEnum = enumNames.has(field.type)\n const incompatible = checkChainCompatibility(\n field.type,\n field.isList,\n isEnum,\n isEnum ? enumValues[field.type] : undefined,\n result.methods,\n )\n if (incompatible) {\n const msg = `prisma-guard: @zod method \"${incompatible}\" on ${model.name}.${field.name} is not compatible with type \"${field.type}\"${field.isList ? '[]' : ''}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const execError = verifyChainExecution(\n field.type,\n field.isList,\n isEnum,\n isEnum ? enumValues[field.type] : undefined,\n chainStr,\n )\n if (execError) {\n const msg = `prisma-guard: @zod directive on ${model.name}.${field.name} fails at schema construction: ${execError}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n if (!modelChains[model.name]) modelChains[model.name] = {}\n modelChains[model.name][field.name] = chainStr\n\n if (result.methods.includes('default') || result.methods.includes('catch')) {\n if (!defaults[model.name]) defaults[model.name] = []\n defaults[model.name].push(field.name)\n }\n }\n }\n\n const hasChains = Object.keys(modelChains).length > 0\n\n if (!hasChains) {\n return { source: 'export const ZOD_CHAINS = {}\\n', hasChains: false, defaults }\n }\n\n const entries = Object.entries(modelChains)\n .map(([model, fields]) => {\n const fieldEntries = Object.entries(fields)\n .map(([field, chain]) => ` ${JSON.stringify(field)}: (base: any) => base${chain},`)\n .join('\\n')\n return ` ${JSON.stringify(model)}: {\\n${fieldEntries}\\n },`\n })\n .join('\\n')\n\n return {\n source: `export const ZOD_CHAINS = {\\n${entries}\\n}\\n`,\n hasChains: true,\n defaults,\n }\n}","const ALLOWED_ZOD_METHODS = new Set([\n 'min', 'max', 'length', 'email', 'url', 'uuid', 'cuid', 'cuid2',\n 'ulid', 'trim', 'toLowerCase', 'toUpperCase',\n 'startsWith', 'endsWith', 'includes',\n 'datetime', 'ip', 'cidr', 'date', 'time', 'duration',\n 'base64', 'nanoid', 'emoji',\n 'int', 'positive', 'nonnegative', 'negative', 'nonpositive',\n 'finite', 'safe', 'multipleOf', 'step',\n 'gt', 'gte', 'lt', 'lte',\n 'nonempty',\n 'regex',\n 'readonly',\n 'optional', 'nullable', 'nullish',\n 'default', 'catch',\n])\n\nconst METHOD_ARITY: Record<string, [number, number]> = {\n min: [1, 2], max: [1, 2], length: [1, 2],\n email: [0, 1], url: [0, 1], uuid: [0, 1], cuid: [0, 1], cuid2: [0, 1], ulid: [0, 1],\n trim: [0, 0], toLowerCase: [0, 0], toUpperCase: [0, 0],\n startsWith: [1, 2], endsWith: [1, 2], includes: [1, 2],\n datetime: [0, 1], ip: [0, 1], cidr: [0, 1], date: [0, 1], time: [0, 1], duration: [0, 1],\n base64: [0, 1], nanoid: [0, 1], emoji: [0, 1],\n int: [0, 1], positive: [0, 1], nonnegative: [0, 1], negative: [0, 1], nonpositive: [0, 1],\n finite: [0, 1], safe: [0, 1],\n multipleOf: [1, 2], step: [1, 2],\n gt: [1, 2], gte: [1, 2], lt: [1, 2], lte: [1, 2],\n nonempty: [0, 1],\n regex: [1, 2],\n readonly: [0, 0],\n optional: [0, 0], nullable: [0, 0], nullish: [0, 0],\n default: [1, 1], catch: [1, 1],\n}\n\nconst MAX_DIRECTIVE_LENGTH = 1024\nconst MAX_CHAIN_DEPTH = 20\n\ntype ValidationResult =\n | { valid: true; methods: string[] }\n | { valid: false; reason: string }\n\nexport function validateDirective(raw: string): ValidationResult {\n if (raw.length > MAX_DIRECTIVE_LENGTH) {\n return { valid: false, reason: 'Directive exceeds maximum length' }\n }\n\n const input = raw.trim()\n if (input.length === 0) {\n return { valid: false, reason: 'Empty directive' }\n }\n if (input[0] !== '.') {\n return { valid: false, reason: 'Directive must start with \".\"' }\n }\n\n let pos = 0\n let chainCount = 0\n const methods: string[] = []\n\n function peek(): string {\n return input[pos] ?? ''\n }\n\n function advance(): string {\n return input[pos++] ?? ''\n }\n\n function skipWhitespace(): void {\n while (pos < input.length && (input[pos] === ' ' || input[pos] === '\\t')) {\n pos++\n }\n }\n\n function parseString(): ValidationResult | null {\n const quote = peek()\n if (quote !== '\"' && quote !== \"'\") return null\n advance()\n while (pos < input.length) {\n const ch = input[pos]\n if (ch === '\\\\') {\n const next = input[pos + 1]\n if (next === \"'\" || next === '\"' || next === '\\\\') {\n pos += 2\n continue\n }\n return { valid: false, reason: `Invalid escape sequence \"\\\\${next ?? ''}\" in string` }\n }\n if (ch === quote) {\n advance()\n return null\n }\n if (ch.charCodeAt(0) < 32) {\n return { valid: false, reason: 'Control character in string' }\n }\n advance()\n }\n return { valid: false, reason: 'Unterminated string' }\n }\n\n function parseNumber(): ValidationResult | null {\n const start = pos\n if (peek() === '-') advance()\n if (pos >= input.length || !/[0-9]/.test(peek())) {\n pos = start\n return null\n }\n if (peek() === '0' && pos + 1 < input.length && /[0-9]/.test(input[pos + 1])) {\n return { valid: false, reason: 'Leading zeros not allowed in numbers' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n if (peek() === '.') {\n advance()\n if (!/[0-9]/.test(peek())) {\n return { valid: false, reason: 'Invalid number: expected digit after decimal point' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n }\n if (peek() === 'e' || peek() === 'E') {\n advance()\n if (peek() === '-' || peek() === '+') advance()\n if (!/[0-9]/.test(peek())) {\n return { valid: false, reason: 'Invalid number: expected digit in exponent' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n }\n return null\n }\n\n function parseRegex(): ValidationResult | null {\n advance()\n if (peek() === '/' || peek() === '*') {\n return { valid: false, reason: 'Empty or comment-like regex pattern' }\n }\n let inCharClass = false\n while (pos < input.length) {\n const ch = input[pos]\n if (ch === '\\\\') {\n if (pos + 1 >= input.length) {\n return { valid: false, reason: 'Unterminated escape in regex' }\n }\n pos += 2\n continue\n }\n if (ch === '[' && !inCharClass) {\n inCharClass = true\n pos++\n continue\n }\n if (ch === ']' && inCharClass) {\n inCharClass = false\n pos++\n continue\n }\n if (ch === '/' && !inCharClass) {\n advance()\n while (pos < input.length && /[gimsuydv]/.test(peek())) {\n advance()\n }\n return null\n }\n if (ch.charCodeAt(0) < 32 && ch !== '\\t') {\n return { valid: false, reason: 'Control character in regex' }\n }\n pos++\n }\n return { valid: false, reason: 'Unterminated regex literal' }\n }\n\n function parseObjectKey(): ValidationResult | null {\n skipWhitespace()\n const ch = peek()\n if (ch === '\"' || ch === \"'\") {\n return parseString()\n }\n if (/[a-zA-Z_]/.test(ch)) {\n while (pos < input.length && /[a-zA-Z0-9_]/.test(peek())) {\n advance()\n }\n return null\n }\n return { valid: false, reason: 'Expected object key (identifier or string)' }\n }\n\n function parseArg(): ValidationResult | null {\n skipWhitespace()\n const ch = peek()\n\n if (ch === '}') {\n return { valid: false, reason: 'Unexpected \"}\" in directive args' }\n }\n if (ch === '`') {\n return { valid: false, reason: 'Template literals not allowed in directive args' }\n }\n if (ch !== '' && ch.charCodeAt(0) < 32) {\n return { valid: false, reason: 'Control character not allowed outside strings' }\n }\n\n if (ch === '\"' || ch === \"'\") {\n return parseString()\n }\n\n if (ch === '/') {\n return parseRegex()\n }\n\n if (ch === '{') {\n advance()\n skipWhitespace()\n if (peek() === '}') {\n advance()\n return null\n }\n const keyErr = parseObjectKey()\n if (keyErr) return keyErr\n skipWhitespace()\n if (peek() !== ':') {\n return { valid: false, reason: 'Expected \":\" after object key' }\n }\n advance()\n const valErr = parseArg()\n if (valErr) return valErr\n skipWhitespace()\n while (peek() === ',') {\n advance()\n skipWhitespace()\n if (peek() === '}') break\n const nextKeyErr = parseObjectKey()\n if (nextKeyErr) return nextKeyErr\n skipWhitespace()\n if (peek() !== ':') {\n return { valid: false, reason: 'Expected \":\" after object key' }\n }\n advance()\n const nextValErr = parseArg()\n if (nextValErr) return nextValErr\n skipWhitespace()\n }\n if (peek() !== '}') {\n return { valid: false, reason: 'Expected \"}\" to close object' }\n }\n advance()\n return null\n }\n\n if (ch === '[') {\n advance()\n skipWhitespace()\n if (peek() === ']') {\n advance()\n return null\n }\n const firstErr = parseArg()\n if (firstErr) return firstErr\n skipWhitespace()\n while (peek() === ',') {\n advance()\n skipWhitespace()\n if (peek() === ']') break\n const elemErr = parseArg()\n if (elemErr) return elemErr\n skipWhitespace()\n }\n if (peek() !== ']') {\n return { valid: false, reason: 'Expected \"]\" to close array' }\n }\n advance()\n return null\n }\n\n if (ch === '-' || /[0-9]/.test(ch)) {\n return parseNumber()\n }\n\n if (input.startsWith('true', pos)) {\n const after = input[pos + 4]\n if (!after || !/[a-zA-Z0-9_]/.test(after)) {\n pos += 4\n return null\n }\n }\n if (input.startsWith('false', pos)) {\n const after = input[pos + 5]\n if (!after || !/[a-zA-Z0-9_]/.test(after)) {\n pos += 5\n return null\n }\n }\n\n if (input.startsWith('NaN', pos)) {\n return { valid: false, reason: 'NaN not allowed' }\n }\n if (input.startsWith('Infinity', pos)) {\n return { valid: false, reason: 'Infinity not allowed' }\n }\n if (input.startsWith('null', pos)) {\n return { valid: false, reason: 'null not allowed as argument value' }\n }\n if (ch === '+') {\n return { valid: false, reason: '\"+\" prefix not allowed on numbers' }\n }\n\n if (/[a-zA-Z_]/.test(ch)) {\n return { valid: false, reason: 'Identifiers not allowed as argument values' }\n }\n\n return { valid: false, reason: `Unexpected character \"${ch}\"` }\n }\n\n while (pos < input.length) {\n skipWhitespace()\n if (pos >= input.length) break\n\n if (peek() !== '.') {\n return { valid: false, reason: `Expected \".\" at position ${pos}, got \"${peek()}\"` }\n }\n advance()\n\n if (!/[a-zA-Z_]/.test(peek())) {\n return { valid: false, reason: `Expected method name after \".\" at position ${pos}` }\n }\n\n let ident = ''\n while (pos < input.length && /[a-zA-Z0-9_]/.test(peek())) {\n ident += advance()\n }\n\n if (!ALLOWED_ZOD_METHODS.has(ident)) {\n return { valid: false, reason: `Unknown zod method: ${ident}` }\n }\n\n skipWhitespace()\n\n if (peek() !== '(') {\n return { valid: false, reason: `Expected \"(\" after method \"${ident}\"` }\n }\n advance()\n\n skipWhitespace()\n\n let argCount = 0\n if (peek() !== ')') {\n const argErr = parseArg()\n if (argErr) return argErr\n argCount = 1\n skipWhitespace()\n while (peek() === ',') {\n advance()\n skipWhitespace()\n if (peek() === ')') break\n const nextArgErr = parseArg()\n if (nextArgErr) return nextArgErr\n argCount++\n skipWhitespace()\n }\n }\n\n if (peek() !== ')') {\n return { valid: false, reason: `Expected \")\" to close method \"${ident}\"` }\n }\n advance()\n\n const arity = METHOD_ARITY[ident]\n if (arity) {\n const [minArgs, maxArgs] = arity\n if (argCount < minArgs || argCount > maxArgs) {\n if (minArgs === maxArgs) {\n return { valid: false, reason: `Method \"${ident}\" expects ${minArgs} argument(s), got ${argCount}` }\n }\n return { valid: false, reason: `Method \"${ident}\" expects ${minArgs}-${maxArgs} arguments, got ${argCount}` }\n }\n }\n\n methods.push(ident)\n chainCount++\n if (chainCount > MAX_CHAIN_DEPTH) {\n return { valid: false, reason: 'Directive exceeds maximum chain depth' }\n }\n }\n\n if (chainCount === 0) {\n return { valid: false, reason: 'No method calls found' }\n }\n\n return { valid: true, methods }\n}","import { z } from \"zod\";\n\nexport type ScalarBaseMap = Record<string, () => z.ZodTypeAny>;\n\nfunction isJsonSafe(value: unknown): boolean {\n type Entry = { tag: \"visit\"; value: unknown } | { tag: \"exit\"; ref: object };\n\n const stack: Entry[] = [{ tag: \"visit\", value }];\n const ancestors = new Set<object>();\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n\n if (entry.tag === \"exit\") {\n ancestors.delete(entry.ref);\n continue;\n }\n\n const current = entry.value;\n\n if (current === undefined) return false;\n if (current === null) continue;\n\n switch (typeof current) {\n case \"string\":\n case \"boolean\":\n continue;\n case \"number\":\n if (!Number.isFinite(current)) return false;\n continue;\n case \"object\": {\n if (ancestors.has(current)) return false;\n ancestors.add(current);\n stack.push({ tag: \"exit\", ref: current });\n if (Array.isArray(current)) {\n for (let i = 0; i < current.length; i++) {\n stack.push({ tag: \"visit\", value: current[i] });\n }\n continue;\n }\n const proto = Object.getPrototypeOf(current);\n if (proto !== Object.prototype && proto !== null) return false;\n const values = Object.values(current as Record<string, unknown>);\n for (let i = 0; i < values.length; i++) {\n stack.push({ tag: \"visit\", value: values[i] });\n }\n continue;\n }\n default:\n return false;\n }\n }\n\n return true;\n}\n\nconst DECIMAL_REGEX = /^-?(\\d+\\.?\\d*|\\.\\d+)([eE]-?\\d+)?$/;\n\nconst decimalStringSchema = z\n .string()\n .refine((s) => DECIMAL_REGEX.test(s), \"Invalid decimal string\");\n\nconst decimalObjectSchema = z.custom<unknown>(\n (v) =>\n v !== null &&\n typeof v === \"object\" &&\n typeof (v as any).toFixed === \"function\" &&\n typeof (v as any).toNumber === \"function\",\n \"Expected Decimal-compatible object\",\n);\n\nfunction createDecimalFactory(strict: boolean): () => z.ZodTypeAny {\n if (strict) {\n return () => z.union([decimalStringSchema, decimalObjectSchema]);\n }\n return () => z.union([z.number(), decimalStringSchema, decimalObjectSchema]);\n}\n\nexport function createScalarBase(strictDecimal: boolean): ScalarBaseMap {\n return {\n String: () => z.string(),\n Int: () => z.number().int(),\n Float: () => z.number(),\n Decimal: createDecimalFactory(strictDecimal),\n BigInt: () =>\n z.union([\n z.bigint(),\n z\n .number()\n .int()\n .refine(\n (v) => v >= Number.MIN_SAFE_INTEGER && v <= Number.MAX_SAFE_INTEGER,\n \"Number exceeds safe integer range for BigInt conversion\",\n )\n .transform((v) => BigInt(v)),\n z\n .string()\n .regex(/^-?\\d+$/)\n .transform((v) => BigInt(v)),\n ]),\n Boolean: () => z.boolean(),\n DateTime: () =>\n z\n .union([\n z.date(),\n z.string().refine(\n (s) => !isNaN(Date.parse(s)),\n \"Invalid date string\",\n ),\n ])\n .pipe(z.coerce.date()),\n Json: () =>\n z\n .unknown()\n .refine(\n isJsonSafe,\n \"Value must be JSON-serializable (no undefined, functions, symbols, class instances, NaN, Infinity, or circular references)\",\n ),\n Bytes: () =>\n z.union([z.string(), z.custom<unknown>((v) => v instanceof Uint8Array)]),\n };\n}\n\nexport const SCALAR_BASE: ScalarBaseMap = createScalarBase(false);\n\nexport function wrapWithInputCoercion(\n fieldType: string,\n isList: boolean,\n schema: z.ZodTypeAny,\n): z.ZodTypeAny {\n let itemCoercion: z.ZodTypeAny | null = null;\n\n switch (fieldType) {\n case \"String\":\n itemCoercion = z.union([z.string(), z.number().transform(String)]);\n break;\n case \"Int\":\n itemCoercion = z.union([\n z.number().transform((v) => Math.trunc(v)).pipe(z.number().int()),\n z\n .string()\n .regex(/^-?\\d+(\\.\\d+)?$/)\n .transform((v) => Math.trunc(Number(v))),\n ]);\n break;\n case \"Float\":\n itemCoercion = z.union([\n z.number(),\n z\n .string()\n .regex(/^-?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/)\n .transform(Number),\n ]);\n break;\n default:\n return schema;\n }\n\n const coercion = isList ? z.array(itemCoercion) : itemCoercion;\n return coercion.pipe(schema);\n}","import type { DMMF } from '@prisma/generator-helper'\n\nfunction collectUniqueConstraints(model: DMMF.Model): string[][] {\n const seen = new Set<string>()\n const constraints: string[][] = []\n\n function add(fields: string[]) {\n const key = fields.join('\\0')\n if (seen.has(key)) return\n seen.add(key)\n constraints.push(fields)\n }\n\n for (const field of model.fields) {\n if (field.isId) add([field.name])\n }\n\n if (model.primaryKey) {\n add([...model.primaryKey.fields])\n }\n\n for (const field of model.fields) {\n if (field.isUnique) add([field.name])\n }\n\n for (const fields of model.uniqueFields) {\n add([...fields])\n }\n\n return constraints\n}\n\nexport function emitTypeMap(dmmf: DMMF.Document): string {\n const enumNames = new Set(dmmf.datamodel.enums.map(e => e.name))\n\n for (const e of dmmf.datamodel.enums) {\n if (e.values.length === 0) {\n throw new Error(`prisma-guard: Enum \"${e.name}\" has zero values.`)\n }\n }\n\n const modelEntries = dmmf.datamodel.models\n .map(model => {\n const fieldEntries = model.fields\n .map(field => {\n const isRelation = field.kind === 'object' || field.relationName != null\n const isEnum = enumNames.has(field.type)\n const isUnsupported = field.kind === 'unsupported'\n const meta: string[] = [\n `type: ${JSON.stringify(field.type)}`,\n `isList: ${field.isList}`,\n `isRequired: ${field.isRequired}`,\n `isId: ${field.isId}`,\n `isRelation: ${isRelation}`,\n `hasDefault: ${field.hasDefaultValue}`,\n `isUpdatedAt: ${field.isUpdatedAt}`,\n ]\n if (isEnum) meta.push(`isEnum: true`)\n if (isUnsupported) meta.push(`isUnsupported: true`)\n if (field.isUnique) meta.push(`isUnique: true`)\n return ` ${JSON.stringify(field.name)}: { ${meta.join(', ')} },`\n })\n .join('\\n')\n return ` ${JSON.stringify(model.name)}: {\\n${fieldEntries}\\n },`\n })\n .join('\\n')\n\n const enumEntries = dmmf.datamodel.enums\n .map(e => {\n const values = e.values.map(v => JSON.stringify(v.name)).join(', ')\n return ` ${JSON.stringify(e.name)}: [${values}],`\n })\n .join('\\n')\n\n const uniqueMapEntries = dmmf.datamodel.models\n .map(model => {\n const constraints = collectUniqueConstraints(model)\n if (constraints.length === 0) return null\n const constraintsStr = constraints\n .map(c => `[${c.map(f => JSON.stringify(f)).join(', ')}]`)\n .join(', ')\n return ` ${JSON.stringify(model.name)}: [${constraintsStr}],`\n })\n .filter(Boolean)\n .join('\\n')\n\n const typeMapSource = `export const TYPE_MAP = {\\n${modelEntries}\\n} as const\\n`\n const enumMapSource = `export const ENUM_MAP = {\\n${enumEntries}\\n} as const\\n`\n const uniqueMapSource = `export const UNIQUE_MAP = {\\n${uniqueMapEntries}\\n} as const\\n`\n\n const typesSource = [\n `export type ModelName = keyof typeof TYPE_MAP`,\n `export type FieldName<M extends ModelName> = keyof (typeof TYPE_MAP)[M]`,\n ].join('\\n')\n\n return `${typeMapSource}\\n${enumMapSource}\\n${uniqueMapSource}\\n${typesSource}\\n`\n}","export const SHAPE_CONFIG_KEY_LIST = [\n 'where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip',\n 'distinct', 'having', '_count', '_avg', '_sum', '_min', '_max', 'by',\n] as const\n\nexport type ShapeConfigKey = (typeof SHAPE_CONFIG_KEY_LIST)[number]\n\nexport const SHAPE_CONFIG_KEYS = new Set<string>(SHAPE_CONFIG_KEY_LIST)\n\nexport const GUARD_SHAPE_KEY_LIST = [\n 'data', 'create', 'update', ...SHAPE_CONFIG_KEY_LIST,\n] as const\n\nexport type GuardShapeKey = (typeof GUARD_SHAPE_KEY_LIST)[number]\n\nexport const GUARD_SHAPE_KEYS = new Set<string>(GUARD_SHAPE_KEY_LIST)\n\nexport const COMBINATOR_KEYS = new Set(['AND', 'OR', 'NOT'])\n\nexport const TO_MANY_RELATION_OPS = new Set(['some', 'every', 'none'])\nexport const TO_ONE_RELATION_OPS = new Set(['is', 'isNot'])\nexport const ALL_RELATION_OPS = new Set([...TO_MANY_RELATION_OPS, ...TO_ONE_RELATION_OPS])\n\nexport function toDelegateKey(modelName: string): string {\n return modelName[0].toLowerCase() + modelName.slice(1)\n}\n\nconst FORCED_MARKER = Symbol.for('prisma-guard.forced')\n\nexport function isForcedValue(v: unknown): v is { value: unknown } {\n return v !== null && typeof v === 'object' && (v as any)[FORCED_MARKER] === true\n}\n\nexport function force<T>(value: T): { value: T } {\n const wrapper: any = { value }\n wrapper[FORCED_MARKER] = true\n return wrapper\n}\n\nconst UNSUPPORTED_MARKER = Symbol.for('prisma-guard.unsupported')\n\nexport function isUnsupportedMarker(v: unknown): boolean {\n return v !== null && typeof v === 'object' && (v as any)[UNSUPPORTED_MARKER] === true\n}\n\nexport function unsupported(): { __brand: 'unsupported' } {\n const marker: any = {}\n marker[UNSUPPORTED_MARKER] = true\n return marker\n}","import type { DMMF } from '@prisma/generator-helper'\nimport { toDelegateKey } from '../shared/constants.js'\n\nexport function emitClient(dmmf: DMMF.Document): string {\n const modelEntries = dmmf.datamodel.models\n .map(model => {\n const key = toDelegateKey(model.name)\n return ` ${key}: {\\n guard(input: GuardInput, caller?: string): GuardedModel<PrismaClient['${key}']>\\n }`\n })\n .join('\\n')\n\n return (\n `import type { PrismaClient } from '@prisma/client'\\n` +\n `import type { GuardInput, GuardedModel } from 'prisma-guard'\\n` +\n `import { createGuard } from 'prisma-guard'\\n` +\n `import { SCOPE_MAP, TYPE_MAP, ENUM_MAP, ZOD_CHAINS, GUARD_CONFIG, UNIQUE_MAP, ZOD_DEFAULTS } from './index'\\n` +\n `import type { ScopeRoot } from './index'\\n\\n` +\n `interface GuardModelExtension {\\n${modelEntries}\\n}\\n\\n` +\n `export const guard = createGuard<typeof TYPE_MAP, ScopeRoot, GuardModelExtension>({\\n` +\n ` scopeMap: SCOPE_MAP,\\n` +\n ` typeMap: TYPE_MAP,\\n` +\n ` enumMap: ENUM_MAP,\\n` +\n ` zodChains: ZOD_CHAINS,\\n` +\n ` guardConfig: GUARD_CONFIG,\\n` +\n ` uniqueMap: UNIQUE_MAP,\\n` +\n ` zodDefaults: ZOD_DEFAULTS,\\n` +\n `})\\n`\n )\n}","export const OPERATION_SHAPE_KEYS = {\n findMany: ['where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip', 'distinct'],\n findFirst: ['where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip', 'distinct'],\n findFirstOrThrow: ['where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip', 'distinct'],\n findUnique: ['where', 'include', 'select'],\n findUniqueOrThrow: ['where', 'include', 'select'],\n findManyPaginated: ['where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip', 'distinct'],\n count: ['where', 'select', 'cursor', 'orderBy', 'skip', 'take'],\n aggregate: ['where', 'orderBy', 'cursor', 'take', 'skip', '_count', '_avg', '_sum', '_min', '_max'],\n groupBy: ['where', 'by', 'having', '_count', '_avg', '_sum', '_min', '_max', 'orderBy', 'take', 'skip'],\n create: ['data', 'select', 'include'],\n createMany: ['data'],\n createManyAndReturn: ['data', 'select', 'include'],\n update: ['data', 'where', 'select', 'include'],\n updateMany: ['data', 'where'],\n updateManyAndReturn: ['data', 'where', 'select', 'include'],\n upsert: ['where', 'create', 'update', 'select', 'include'],\n delete: ['where', 'select', 'include'],\n deleteMany: ['where'],\n} as const\n\nexport type OperationName = keyof typeof OPERATION_SHAPE_KEYS\n\nexport type OperationShapeKey<O extends OperationName> =\n (typeof OPERATION_SHAPE_KEYS)[O][number]\n\nexport const READ_METHOD_ALLOWED_ARGS: Record<string, Set<string>> = {\n findMany: new Set(OPERATION_SHAPE_KEYS.findMany),\n findFirst: new Set(OPERATION_SHAPE_KEYS.findFirst),\n findFirstOrThrow: new Set(OPERATION_SHAPE_KEYS.findFirstOrThrow),\n findUnique: new Set(OPERATION_SHAPE_KEYS.findUnique),\n findUniqueOrThrow: new Set(OPERATION_SHAPE_KEYS.findUniqueOrThrow),\n count: new Set(OPERATION_SHAPE_KEYS.count),\n aggregate: new Set(OPERATION_SHAPE_KEYS.aggregate),\n groupBy: new Set(OPERATION_SHAPE_KEYS.groupBy),\n}\n\nexport const MUTATION_SHAPE_KEYS = {\n create: new Set(OPERATION_SHAPE_KEYS.create),\n createMany: new Set(OPERATION_SHAPE_KEYS.createMany),\n createManyAndReturn: new Set(OPERATION_SHAPE_KEYS.createManyAndReturn),\n update: new Set(OPERATION_SHAPE_KEYS.update),\n updateMany: new Set(OPERATION_SHAPE_KEYS.updateMany),\n updateManyAndReturn: new Set(OPERATION_SHAPE_KEYS.updateManyAndReturn),\n upsert: new Set(OPERATION_SHAPE_KEYS.upsert),\n delete: new Set(OPERATION_SHAPE_KEYS.delete),\n deleteMany: new Set(OPERATION_SHAPE_KEYS.deleteMany),\n}","import type { DMMF } from '@prisma/generator-helper'\nimport { OPERATION_SHAPE_KEYS } from '../shared/operation-shape-keys.js'\n\nconst OPERATIONS = Object.keys(OPERATION_SHAPE_KEYS) as Array<\n keyof typeof OPERATION_SHAPE_KEYS\n>\n\nfunction cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport function emitTypedShapes(\n dmmf: DMMF.Document,\n depth: 0 | 1 | 2 | 3,\n): string {\n const header =\n `import type { TYPE_MAP } from './index'\\n` +\n `import type {\\n` +\n ` TypedGuardShape,\\n` +\n ` OperationShape,\\n` +\n ` ShapeInput,\\n` +\n ` TypedProjection,\\n` +\n ` TypedInclude,\\n` +\n ` TypedCountSelect,\\n` +\n `} from 'prisma-guard'\\n\\n` +\n `type TM = typeof TYPE_MAP\\n\\n`\n\n const blocks = dmmf.datamodel.models\n .map((model) => {\n const m = model.name\n\n const projAlias =\n `export type ${m}Select = ` +\n `TypedProjection<TM, '${m}', ${depth}>\\n` +\n `export type ${m}Projection = ${m}Select\\n` +\n `export type ${m}Include = ` +\n `TypedInclude<TM, '${m}', ${depth}>\\n` +\n `export type ${m}CountSelect = ` +\n `TypedCountSelect<TM, '${m}'>\\n`\n\n const guardAlias =\n `export type ${m}GuardShape = ` +\n `TypedGuardShape<TM, '${m}', ${depth}>\\n`\n\n const opAliases = OPERATIONS.map((op) => {\n const c = cap(op)\n return (\n `export type ${m}${c}Shape = ` +\n `OperationShape<TM, '${m}', '${op}', ${depth}>\\n` +\n `export type ${m}${c}ShapeInput<TCtx = unknown> = ` +\n `ShapeInput<${m}${c}Shape, TCtx>\\n`\n )\n }).join('')\n\n return projAlias + guardAlias + opAliases\n })\n .join('\\n')\n\n return header + blocks\n}"],"mappings":"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","names":["z","z"]}
1
+ {"version":3,"sources":["../../src/generator/index.ts","../../src/generator/emit-client.ts","../../src/generator/emit-scope-map.ts","../../src/generator/emit-type-map.ts","../../src/shared/operation-shape-keys.ts","../../src/generator/emit-typed-shapes.ts","../../src/generator/emit-zod-chains.ts","../../src/generator/validate-directive.ts","../../src/shared/scalar-base.ts"],"sourcesContent":["import pkg from '@prisma/generator-helper'\nconst { generatorHandler } = pkg\nimport type { DMMF, GeneratorOptions } from '@prisma/generator-helper'\nimport { mkdirSync, writeFileSync } from 'fs'\nimport { dirname, relative } from 'path'\nimport { emitClient } from './emit-client.js'\nimport { emitScopeMap } from './emit-scope-map.js'\nimport { emitTypeMap } from './emit-type-map.js'\nimport { emitTypedShapes } from './emit-typed-shapes.js'\nimport { emitZodChains } from './emit-zod-chains.js'\n\nconst VALID_ON_INVALID_ZOD = new Set<'error' | 'warn'>(['error', 'warn'])\nconst VALID_ON_AMBIGUOUS_SCOPE = new Set<'error' | 'warn' | 'ignore'>(['error', 'warn', 'ignore'])\nconst VALID_ON_MISSING_SCOPE_CONTEXT = new Set<'error' | 'warn' | 'ignore'>(['error', 'warn', 'ignore'])\nconst VALID_FIND_UNIQUE_MODE = new Set<'verify' | 'reject'>(['verify', 'reject'])\nconst VALID_ON_SCOPE_RELATION_WRITE = new Set<'error' | 'warn' | 'strip'>(['error', 'warn', 'strip'])\nconst VALID_BOOLEAN_CONFIG = new Set(['true', 'false'])\nconst VALID_TYPED_GUARD_DEPTH = new Set(['0', '1', '2', '3'])\n\nfunction validateConfigEnum<T extends string>(\n name: string,\n value: string,\n allowed: Set<T>,\n): T {\n if (!allowed.has(value as T)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"${name}\": \"${value}\". Allowed values: ${[...allowed].join(', ')}`,\n )\n }\n\n return value as T\n}\n\nfunction validateBooleanConfig(\n name: string,\n raw: string | undefined,\n fallback: boolean,\n): boolean {\n const value = raw ?? (fallback ? 'true' : 'false')\n\n if (!VALID_BOOLEAN_CONFIG.has(value)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"${name}\": \"${value}\". Allowed values: true, false`,\n )\n }\n\n return value === 'true'\n}\n\nfunction validateDepthConfig(raw: string | undefined): 0 | 1 | 2 | 3 {\n const value = raw ?? '1'\n\n if (!VALID_TYPED_GUARD_DEPTH.has(value)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"typedGuardRelationDepth\": \"${value}\". Allowed values: 0, 1, 2, 3`,\n )\n }\n\n return Number(value) as 0 | 1 | 2 | 3\n}\n\nfunction emitZodDefaults(defaults: Record<string, string[]>): string {\n const entries = Object.entries(defaults)\n\n if (entries.length === 0) {\n return `export const ZOD_DEFAULTS: Record<string, readonly string[]> = {}\\n`\n }\n\n const mapEntries = entries\n .map(([model, fields]) => {\n const fieldsStr = fields.map((field) => JSON.stringify(field)).join(', ')\n return ` ${JSON.stringify(model)}: [${fieldsStr}],`\n })\n .join('\\n')\n\n return `export const ZOD_DEFAULTS: Record<string, readonly string[]> = {\\n${mapEntries}\\n}\\n`\n}\n\nfunction getProviderValue(provider: unknown): string {\n if (typeof provider === 'string') return provider\n\n if (provider && typeof provider === 'object' && 'value' in provider) {\n const value = (provider as { value?: unknown }).value\n if (typeof value === 'string') return value\n }\n\n return ''\n}\n\nfunction isPrismaClientProvider(provider: unknown): boolean {\n const value = getProviderValue(provider)\n return value === 'prisma-client-js' || value.endsWith('/prisma-client-js')\n}\n\nfunction normalizeImportPath(path: string): string {\n const normalized = path.replace(/\\\\/g, '/')\n if (normalized.startsWith('.')) return normalized\n return `./${normalized}`\n}\n\nfunction resolvePrismaClientImport(options: GeneratorOptions, guardOutput: string): string {\n const prismaClientGenerator = options.otherGenerators.find((generator) =>\n isPrismaClientProvider(generator.provider),\n )\n\n const clientOutput = prismaClientGenerator?.output?.value\n if (!clientOutput) return '@prisma/client'\n\n return normalizeImportPath(relative(guardOutput, clientOutput))\n}\n\ngeneratorHandler({\n onManifest() {\n return {\n prettyName: 'Prisma Guard',\n defaultOutput: 'generated/guard',\n }\n },\n\n async onGenerate(options) {\n const output = options.generator.output?.value\n if (!output) throw new Error('prisma-guard: No output directory specified')\n\n const config = options.generator.config ?? {}\n\n const onInvalidZod = validateConfigEnum(\n 'onInvalidZod',\n (config.onInvalidZod as string) ?? 'error',\n VALID_ON_INVALID_ZOD,\n )\n\n const onAmbiguousScope = validateConfigEnum(\n 'onAmbiguousScope',\n (config.onAmbiguousScope as string) ?? 'error',\n VALID_ON_AMBIGUOUS_SCOPE,\n )\n\n const onMissingScopeContext = validateConfigEnum(\n 'onMissingScopeContext',\n (config.onMissingScopeContext as string) ?? 'error',\n VALID_ON_MISSING_SCOPE_CONTEXT,\n )\n\n const findUniqueMode = validateConfigEnum(\n 'findUniqueMode',\n (config.findUniqueMode as string) ?? 'reject',\n VALID_FIND_UNIQUE_MODE,\n )\n\n const onScopeRelationWrite = validateConfigEnum(\n 'onScopeRelationWrite',\n (config.onScopeRelationWrite as string) ?? 'error',\n VALID_ON_SCOPE_RELATION_WRITE,\n )\n\n const strictDecimal = validateBooleanConfig(\n 'strictDecimal',\n config.strictDecimal as string | undefined,\n false,\n )\n\n const enforceProjection = validateBooleanConfig(\n 'enforceProjection',\n config.enforceProjection as string | undefined,\n false,\n )\n\n const typedGuardShapes = validateBooleanConfig(\n 'typedGuardShapes',\n config.typedGuardShapes as string | undefined,\n true,\n )\n\n const typedGuardRelationDepth = validateDepthConfig(\n config.typedGuardRelationDepth as string | undefined,\n )\n\n const dmmf: DMMF.Document = options.dmmf\n const parts: string[] = []\n\n parts.push(\n `export const GUARD_CONFIG = {\\n` +\n ` onMissingScopeContext: ${JSON.stringify(onMissingScopeContext)},\\n` +\n ` findUniqueMode: ${JSON.stringify(findUniqueMode)},\\n` +\n ` onScopeRelationWrite: ${JSON.stringify(onScopeRelationWrite)},\\n` +\n ` strictDecimal: ${JSON.stringify(strictDecimal)},\\n` +\n ` enforceProjection: ${JSON.stringify(enforceProjection)},\\n` +\n `} as const\\n`,\n )\n\n const { source: scopeSource } = emitScopeMap(dmmf, onAmbiguousScope)\n parts.push(scopeSource)\n\n const typeMapSource = emitTypeMap(dmmf)\n parts.push(typeMapSource)\n\n const { source: zodChainsSource, defaults } = emitZodChains(dmmf, onInvalidZod)\n parts.push(zodChainsSource)\n parts.push(emitZodDefaults(defaults))\n\n mkdirSync(output, { recursive: true })\n\n writeFileSync(`${output}/index.ts`, parts.join('\\n'), 'utf-8')\n\n const prismaClientImport = resolvePrismaClientImport(options, output)\n const clientSource = emitClient(dmmf, prismaClientImport)\n writeFileSync(`${output}/client.ts`, clientSource, 'utf-8')\n\n if (typedGuardShapes) {\n writeFileSync(\n `${output}/shapes.ts`,\n emitTypedShapes(dmmf, typedGuardRelationDepth),\n 'utf-8',\n )\n }\n },\n})","import type { DMMF } from '@prisma/generator-helper'\n\nexport function emitClient(_dmmf: DMMF.Document, prismaClientImport: string): string {\n return (\n `import type { PrismaClient } from '${prismaClientImport}'\\n` +\n `import type { GuardInput, GuardedModel } from 'prisma-guard'\\n` +\n `import { createGuard } from 'prisma-guard'\\n` +\n `import { SCOPE_MAP, TYPE_MAP, ENUM_MAP, ZOD_CHAINS, GUARD_CONFIG, UNIQUE_MAP, ZOD_DEFAULTS } from './index'\\n` +\n `import type { ScopeRoot } from './index'\\n\\n` +\n `interface GuardModelExtension {\\n` +\n ` $allModels: {\\n` +\n ` guard<TDelegate>(this: TDelegate, input: GuardInput, caller?: string): GuardedModel<TDelegate>\\n` +\n ` }\\n` +\n `}\\n\\n` +\n `export const guard = createGuard<typeof TYPE_MAP, ScopeRoot, GuardModelExtension>({\\n` +\n ` scopeMap: SCOPE_MAP,\\n` +\n ` typeMap: TYPE_MAP,\\n` +\n ` enumMap: ENUM_MAP,\\n` +\n ` zodChains: ZOD_CHAINS,\\n` +\n ` guardConfig: GUARD_CONFIG,\\n` +\n ` uniqueMap: UNIQUE_MAP,\\n` +\n ` zodDefaults: ZOD_DEFAULTS,\\n` +\n `})\\n`\n )\n}","import type { DMMF } from '@prisma/generator-helper'\n\nfunction isScopeRoot(documentation: string | undefined): boolean {\n if (!documentation) return false\n const tokens = documentation.split(/[\\s\\n\\r]+/)\n return tokens.some(t => t === '@scope-root')\n}\n\ninterface RelationEntry {\n fks: string[]\n root: string\n relationName: string\n}\n\nexport function emitScopeMap(\n dmmf: DMMF.Document,\n onAmbiguousScope: 'error' | 'warn' | 'ignore',\n): { source: string } {\n const rootModels = new Set<string>()\n\n for (const model of dmmf.datamodel.models) {\n if (isScopeRoot(model.documentation)) {\n rootModels.add(model.name)\n }\n }\n\n const scopeMap: Record<string, { fk: string; root: string; relationName: string }[]> = {}\n\n for (const model of dmmf.datamodel.models) {\n if (rootModels.has(model.name)) continue\n\n const relations: RelationEntry[] = []\n\n for (const field of model.fields) {\n if (!field.relationFromFields || field.relationFromFields.length === 0) continue\n if (!rootModels.has(field.type)) continue\n\n if (field.relationFromFields.length > 1) {\n const msg = `Model \"${model.name}\" has a composite foreign key to scope root \"${field.type}\" via relation \"${field.name}\" ` +\n `(fields: ${field.relationFromFields.join(', ')}). Composite scope relations are not supported.`\n\n if (onAmbiguousScope === 'error') {\n throw new Error(`prisma-guard: ${msg}`)\n }\n\n if (onAmbiguousScope === 'warn') {\n console.warn(`prisma-guard: ${msg} Excluding relation \"${field.name}\" to scope root \"${field.type}\" from scope map for model \"${model.name}\".`)\n }\n\n continue\n }\n\n relations.push({\n fks: [...field.relationFromFields],\n root: field.type,\n relationName: field.name,\n })\n }\n\n if (relations.length === 0) continue\n\n const relationsByRoot: Record<string, RelationEntry[]> = {}\n for (const rel of relations) {\n if (!relationsByRoot[rel.root]) relationsByRoot[rel.root] = []\n relationsByRoot[rel.root].push(rel)\n }\n\n const entries: { fk: string; root: string; relationName: string }[] = []\n\n for (const [root, rels] of Object.entries(relationsByRoot)) {\n if (rels.length > 1) {\n const relNames = rels.map(r => r.relationName)\n const msg = `Model \"${model.name}\" has multiple relations to scope root \"${root}\" (${relNames.join(', ')}).`\n\n if (onAmbiguousScope === 'error') {\n throw new Error(\n `prisma-guard: Ambiguous scope detected. Resolve these or set onAmbiguousScope to \"warn\" or \"ignore\":\\n` +\n ` - ${msg}`,\n )\n }\n\n if (onAmbiguousScope === 'warn') {\n console.warn(`prisma-guard: ${msg} Excluding relations to scope root \"${root}\" from scope map for model \"${model.name}\".`)\n }\n\n continue\n }\n\n entries.push({\n fk: rels[0].fks[0],\n root: rels[0].root,\n relationName: rels[0].relationName,\n })\n }\n\n if (entries.length > 0) {\n scopeMap[model.name] = entries\n }\n }\n\n const roots = Array.from(rootModels).sort()\n\n const mapEntries = Object.entries(scopeMap)\n .map(([model, entries]) => {\n const entriesStr = entries\n .map(e => `{ fk: ${JSON.stringify(e.fk)}, root: ${JSON.stringify(e.root)}, relationName: ${JSON.stringify(e.relationName)} }`)\n .join(', ')\n return ` ${model}: [${entriesStr}],`\n })\n .join('\\n')\n\n const scopeRootType = roots.length > 0\n ? roots.map(r => `'${r}'`).join(' | ')\n : 'never'\n\n const source = `export const SCOPE_MAP = {\\n${mapEntries}\\n} as const\\n\\nexport type ScopeRoot = ${scopeRootType}\\n`\n\n return { source }\n}","import type { DMMF } from '@prisma/generator-helper'\n\nfunction collectUniqueConstraints(model: DMMF.Model): string[][] {\n const seen = new Set<string>()\n const constraints: string[][] = []\n\n function add(fields: string[]) {\n const key = fields.join('\\0')\n if (seen.has(key)) return\n seen.add(key)\n constraints.push(fields)\n }\n\n for (const field of model.fields) {\n if (field.isId) add([field.name])\n }\n\n if (model.primaryKey) {\n add([...model.primaryKey.fields])\n }\n\n for (const field of model.fields) {\n if (field.isUnique) add([field.name])\n }\n\n for (const fields of model.uniqueFields) {\n add([...fields])\n }\n\n return constraints\n}\n\nexport function emitTypeMap(dmmf: DMMF.Document): string {\n const enumNames = new Set(dmmf.datamodel.enums.map(e => e.name))\n\n for (const e of dmmf.datamodel.enums) {\n if (e.values.length === 0) {\n throw new Error(`prisma-guard: Enum \"${e.name}\" has zero values.`)\n }\n }\n\n const modelEntries = dmmf.datamodel.models\n .map(model => {\n const fieldEntries = model.fields\n .map(field => {\n const isRelation = field.kind === 'object' || field.relationName != null\n const isEnum = enumNames.has(field.type)\n const isUnsupported = field.kind === 'unsupported'\n const meta: string[] = [\n `type: ${JSON.stringify(field.type)}`,\n `isList: ${field.isList}`,\n `isRequired: ${field.isRequired}`,\n `isId: ${field.isId}`,\n `isRelation: ${isRelation}`,\n `hasDefault: ${field.hasDefaultValue}`,\n `isUpdatedAt: ${field.isUpdatedAt}`,\n ]\n if (isEnum) meta.push(`isEnum: true`)\n if (isUnsupported) meta.push(`isUnsupported: true`)\n if (field.isUnique) meta.push(`isUnique: true`)\n return ` ${JSON.stringify(field.name)}: { ${meta.join(', ')} },`\n })\n .join('\\n')\n return ` ${JSON.stringify(model.name)}: {\\n${fieldEntries}\\n },`\n })\n .join('\\n')\n\n const enumEntries = dmmf.datamodel.enums\n .map(e => {\n const values = e.values.map(v => JSON.stringify(v.name)).join(', ')\n return ` ${JSON.stringify(e.name)}: [${values}],`\n })\n .join('\\n')\n\n const uniqueMapEntries = dmmf.datamodel.models\n .map(model => {\n const constraints = collectUniqueConstraints(model)\n if (constraints.length === 0) return null\n const constraintsStr = constraints\n .map(c => `[${c.map(f => JSON.stringify(f)).join(', ')}]`)\n .join(', ')\n return ` ${JSON.stringify(model.name)}: [${constraintsStr}],`\n })\n .filter(Boolean)\n .join('\\n')\n\n const typeMapSource = `export const TYPE_MAP = {\\n${modelEntries}\\n} as const\\n`\n const enumMapSource = `export const ENUM_MAP = {\\n${enumEntries}\\n} as const\\n`\n const uniqueMapSource = `export const UNIQUE_MAP = {\\n${uniqueMapEntries}\\n} as const\\n`\n\n const typesSource = [\n `export type ModelName = keyof typeof TYPE_MAP`,\n `export type FieldName<M extends ModelName> = keyof (typeof TYPE_MAP)[M]`,\n ].join('\\n')\n\n return `${typeMapSource}\\n${enumMapSource}\\n${uniqueMapSource}\\n${typesSource}\\n`\n}","export const OPERATION_SHAPE_KEYS = {\n findMany: ['where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip', 'distinct'],\n findFirst: ['where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip', 'distinct'],\n findFirstOrThrow: ['where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip', 'distinct'],\n findUnique: ['where', 'include', 'select'],\n findUniqueOrThrow: ['where', 'include', 'select'],\n findManyPaginated: ['where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip', 'distinct'],\n count: ['where', 'select', 'cursor', 'orderBy', 'skip', 'take'],\n aggregate: ['where', 'orderBy', 'cursor', 'take', 'skip', '_count', '_avg', '_sum', '_min', '_max'],\n groupBy: ['where', 'by', 'having', '_count', '_avg', '_sum', '_min', '_max', 'orderBy', 'take', 'skip'],\n create: ['data', 'select', 'include'],\n createMany: ['data'],\n createManyAndReturn: ['data', 'select', 'include'],\n update: ['data', 'where', 'select', 'include'],\n updateMany: ['data', 'where'],\n updateManyAndReturn: ['data', 'where', 'select', 'include'],\n upsert: ['where', 'create', 'update', 'select', 'include'],\n delete: ['where', 'select', 'include'],\n deleteMany: ['where'],\n} as const\n\nexport type OperationName = keyof typeof OPERATION_SHAPE_KEYS\n\nexport type OperationShapeKey<O extends OperationName> =\n (typeof OPERATION_SHAPE_KEYS)[O][number]\n\nexport const READ_METHOD_ALLOWED_ARGS: Record<string, Set<string>> = {\n findMany: new Set(OPERATION_SHAPE_KEYS.findMany),\n findFirst: new Set(OPERATION_SHAPE_KEYS.findFirst),\n findFirstOrThrow: new Set(OPERATION_SHAPE_KEYS.findFirstOrThrow),\n findUnique: new Set(OPERATION_SHAPE_KEYS.findUnique),\n findUniqueOrThrow: new Set(OPERATION_SHAPE_KEYS.findUniqueOrThrow),\n count: new Set(OPERATION_SHAPE_KEYS.count),\n aggregate: new Set(OPERATION_SHAPE_KEYS.aggregate),\n groupBy: new Set(OPERATION_SHAPE_KEYS.groupBy),\n}\n\nexport const MUTATION_SHAPE_KEYS = {\n create: new Set(OPERATION_SHAPE_KEYS.create),\n createMany: new Set(OPERATION_SHAPE_KEYS.createMany),\n createManyAndReturn: new Set(OPERATION_SHAPE_KEYS.createManyAndReturn),\n update: new Set(OPERATION_SHAPE_KEYS.update),\n updateMany: new Set(OPERATION_SHAPE_KEYS.updateMany),\n updateManyAndReturn: new Set(OPERATION_SHAPE_KEYS.updateManyAndReturn),\n upsert: new Set(OPERATION_SHAPE_KEYS.upsert),\n delete: new Set(OPERATION_SHAPE_KEYS.delete),\n deleteMany: new Set(OPERATION_SHAPE_KEYS.deleteMany),\n}","import type { DMMF } from '@prisma/generator-helper'\nimport { OPERATION_SHAPE_KEYS } from '../shared/operation-shape-keys.js'\n\nconst OPERATIONS = Object.keys(OPERATION_SHAPE_KEYS) as Array<\n keyof typeof OPERATION_SHAPE_KEYS\n>\n\nfunction cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport function emitTypedShapes(\n dmmf: DMMF.Document,\n depth: 0 | 1 | 2 | 3,\n): string {\n const header =\n `import type { TYPE_MAP } from './index'\\n` +\n `import type {\\n` +\n ` TypedGuardShape,\\n` +\n ` OperationShape,\\n` +\n ` ShapeInput,\\n` +\n ` TypedProjection,\\n` +\n ` TypedInclude,\\n` +\n ` TypedCountSelect,\\n` +\n `} from 'prisma-guard'\\n\\n` +\n `type TM = typeof TYPE_MAP\\n\\n`\n\n const blocks = dmmf.datamodel.models\n .map((model) => {\n const m = model.name\n\n const projAlias =\n `export type ${m}Select = ` +\n `TypedProjection<TM, '${m}', ${depth}>\\n` +\n `export type ${m}Projection = ${m}Select\\n` +\n `export type ${m}Include = ` +\n `TypedInclude<TM, '${m}', ${depth}>\\n` +\n `export type ${m}CountSelect = ` +\n `TypedCountSelect<TM, '${m}'>\\n`\n\n const guardAlias =\n `export type ${m}GuardShape = ` +\n `TypedGuardShape<TM, '${m}', ${depth}>\\n`\n\n const opAliases = OPERATIONS.map((op) => {\n const c = cap(op)\n return (\n `export type ${m}${c}Shape = ` +\n `OperationShape<TM, '${m}', '${op}', ${depth}>\\n` +\n `export type ${m}${c}ShapeInput<TCtx = unknown> = ` +\n `ShapeInput<${m}${c}Shape, TCtx>\\n`\n )\n }).join('')\n\n return projAlias + guardAlias + opAliases\n })\n .join('\\n')\n\n return header + blocks\n}","import type { DMMF } from '@prisma/generator-helper'\nimport { z } from 'zod'\nimport { validateDirective } from './validate-directive.js'\nimport { SCALAR_BASE } from '../shared/scalar-base.js'\n\nfunction buildGenerationBase(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues?: readonly string[],\n): z.ZodTypeAny | null {\n let base: z.ZodTypeAny\n\n if (isEnum) {\n const values = enumValues && enumValues.length > 0 ? enumValues : ['__placeholder__']\n base = z.enum(values as [string, ...string[]])\n } else {\n const factory = SCALAR_BASE[fieldType]\n if (!factory) return null\n base = factory()\n }\n\n if (isList) base = z.array(base)\n\n return base\n}\n\nconst TYPE_CHANGING_METHODS = new Set([\n 'optional', 'nullable', 'nullish', 'readonly', 'default', 'catch',\n])\n\nfunction checkChainCompatibility(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues: readonly string[] | undefined,\n methods: string[],\n): string | null {\n let current = buildGenerationBase(fieldType, isList, isEnum, enumValues)\n if (!current) return null\n\n for (const method of methods) {\n if (typeof (current as any)[method] !== 'function') {\n return method\n }\n if (TYPE_CHANGING_METHODS.has(method)) {\n try {\n if (method === 'default' || method === 'catch') {\n current = (current as any)[method](undefined)\n } else {\n current = (current as any)[method]()\n }\n } catch {\n }\n }\n }\n return null\n}\n\nfunction verifyChainExecution(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues: readonly string[] | undefined,\n chainStr: string,\n): string | null {\n const base = buildGenerationBase(fieldType, isList, isEnum, enumValues)\n if (!base) return null\n\n let fn: (base: z.ZodTypeAny) => z.ZodTypeAny\n try {\n fn = new Function('base', `'use strict'; return base${chainStr}`) as (base: z.ZodTypeAny) => z.ZodTypeAny\n } catch (err: any) {\n return `syntax error: ${err.message}`\n }\n\n try {\n const result = fn(base)\n if (result === null || result === undefined || typeof result !== 'object' || typeof (result as any).parse !== 'function') {\n return 'chain did not produce a valid Zod schema'\n }\n } catch (err: any) {\n return err.message\n }\n\n return null\n}\n\nfunction findZodInDoc(documentation: string): string[] {\n return documentation.split('\\n').filter(line => {\n const trimmed = line.trim()\n return /^@zod(?:\\s|$|\\.)/.test(trimmed)\n })\n}\n\nexport function emitZodChains(\n dmmf: DMMF.Document,\n onInvalidZod: 'error' | 'warn',\n): { source: string; hasChains: boolean; defaults: Record<string, string[]> } {\n const enumNames = new Set(dmmf.datamodel.enums.map(e => e.name))\n const enumValues: Record<string, readonly string[]> = {}\n for (const e of dmmf.datamodel.enums) {\n enumValues[e.name] = e.values.map(v => v.name)\n }\n\n const modelChains: Record<string, Record<string, string>> = {}\n const defaults: Record<string, string[]> = {}\n\n for (const model of dmmf.datamodel.models) {\n for (const field of model.fields) {\n if (!field.documentation) continue\n\n const zodLines = findZodInDoc(field.documentation)\n\n if (zodLines.length === 0) continue\n if (zodLines.length > 1) {\n const msg = `prisma-guard: Multiple @zod directives on ${model.name}.${field.name}. Only one @zod per field allowed.`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const line = zodLines[0]\n const idx = line.indexOf('@zod')\n const chainStr = line.slice(idx + 4).trim()\n\n if (chainStr.length === 0) {\n const msg = `prisma-guard: Empty @zod directive on ${model.name}.${field.name}. Add a method chain (e.g. @zod .min(1)) or remove the directive.`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const result = validateDirective(chainStr)\n if (!result.valid) {\n const msg = `prisma-guard: Invalid @zod directive on ${model.name}.${field.name}: ${result.reason}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const isEnum = enumNames.has(field.type)\n const incompatible = checkChainCompatibility(\n field.type,\n field.isList,\n isEnum,\n isEnum ? enumValues[field.type] : undefined,\n result.methods,\n )\n if (incompatible) {\n const msg = `prisma-guard: @zod method \"${incompatible}\" on ${model.name}.${field.name} is not compatible with type \"${field.type}\"${field.isList ? '[]' : ''}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const execError = verifyChainExecution(\n field.type,\n field.isList,\n isEnum,\n isEnum ? enumValues[field.type] : undefined,\n chainStr,\n )\n if (execError) {\n const msg = `prisma-guard: @zod directive on ${model.name}.${field.name} fails at schema construction: ${execError}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n if (!modelChains[model.name]) modelChains[model.name] = {}\n modelChains[model.name][field.name] = chainStr\n\n if (result.methods.includes('default') || result.methods.includes('catch')) {\n if (!defaults[model.name]) defaults[model.name] = []\n defaults[model.name].push(field.name)\n }\n }\n }\n\n const hasChains = Object.keys(modelChains).length > 0\n\n if (!hasChains) {\n return { source: 'export const ZOD_CHAINS = {}\\n', hasChains: false, defaults }\n }\n\n const entries = Object.entries(modelChains)\n .map(([model, fields]) => {\n const fieldEntries = Object.entries(fields)\n .map(([field, chain]) => ` ${JSON.stringify(field)}: (base: any) => base${chain},`)\n .join('\\n')\n return ` ${JSON.stringify(model)}: {\\n${fieldEntries}\\n },`\n })\n .join('\\n')\n\n return {\n source: `export const ZOD_CHAINS = {\\n${entries}\\n}\\n`,\n hasChains: true,\n defaults,\n }\n}","const ALLOWED_ZOD_METHODS = new Set([\n 'min', 'max', 'length', 'email', 'url', 'uuid', 'cuid', 'cuid2',\n 'ulid', 'trim', 'toLowerCase', 'toUpperCase',\n 'startsWith', 'endsWith', 'includes',\n 'datetime', 'ip', 'cidr', 'date', 'time', 'duration',\n 'base64', 'nanoid', 'emoji',\n 'int', 'positive', 'nonnegative', 'negative', 'nonpositive',\n 'finite', 'safe', 'multipleOf', 'step',\n 'gt', 'gte', 'lt', 'lte',\n 'nonempty',\n 'regex',\n 'readonly',\n 'optional', 'nullable', 'nullish',\n 'default', 'catch',\n])\n\nconst METHOD_ARITY: Record<string, [number, number]> = {\n min: [1, 2], max: [1, 2], length: [1, 2],\n email: [0, 1], url: [0, 1], uuid: [0, 1], cuid: [0, 1], cuid2: [0, 1], ulid: [0, 1],\n trim: [0, 0], toLowerCase: [0, 0], toUpperCase: [0, 0],\n startsWith: [1, 2], endsWith: [1, 2], includes: [1, 2],\n datetime: [0, 1], ip: [0, 1], cidr: [0, 1], date: [0, 1], time: [0, 1], duration: [0, 1],\n base64: [0, 1], nanoid: [0, 1], emoji: [0, 1],\n int: [0, 1], positive: [0, 1], nonnegative: [0, 1], negative: [0, 1], nonpositive: [0, 1],\n finite: [0, 1], safe: [0, 1],\n multipleOf: [1, 2], step: [1, 2],\n gt: [1, 2], gte: [1, 2], lt: [1, 2], lte: [1, 2],\n nonempty: [0, 1],\n regex: [1, 2],\n readonly: [0, 0],\n optional: [0, 0], nullable: [0, 0], nullish: [0, 0],\n default: [1, 1], catch: [1, 1],\n}\n\nconst MAX_DIRECTIVE_LENGTH = 1024\nconst MAX_CHAIN_DEPTH = 20\n\ntype ValidationResult =\n | { valid: true; methods: string[] }\n | { valid: false; reason: string }\n\nexport function validateDirective(raw: string): ValidationResult {\n if (raw.length > MAX_DIRECTIVE_LENGTH) {\n return { valid: false, reason: 'Directive exceeds maximum length' }\n }\n\n const input = raw.trim()\n if (input.length === 0) {\n return { valid: false, reason: 'Empty directive' }\n }\n if (input[0] !== '.') {\n return { valid: false, reason: 'Directive must start with \".\"' }\n }\n\n let pos = 0\n let chainCount = 0\n const methods: string[] = []\n\n function peek(): string {\n return input[pos] ?? ''\n }\n\n function advance(): string {\n return input[pos++] ?? ''\n }\n\n function skipWhitespace(): void {\n while (pos < input.length && (input[pos] === ' ' || input[pos] === '\\t')) {\n pos++\n }\n }\n\n function parseString(): ValidationResult | null {\n const quote = peek()\n if (quote !== '\"' && quote !== \"'\") return null\n advance()\n while (pos < input.length) {\n const ch = input[pos]\n if (ch === '\\\\') {\n const next = input[pos + 1]\n if (next === \"'\" || next === '\"' || next === '\\\\') {\n pos += 2\n continue\n }\n return { valid: false, reason: `Invalid escape sequence \"\\\\${next ?? ''}\" in string` }\n }\n if (ch === quote) {\n advance()\n return null\n }\n if (ch.charCodeAt(0) < 32) {\n return { valid: false, reason: 'Control character in string' }\n }\n advance()\n }\n return { valid: false, reason: 'Unterminated string' }\n }\n\n function parseNumber(): ValidationResult | null {\n const start = pos\n if (peek() === '-') advance()\n if (pos >= input.length || !/[0-9]/.test(peek())) {\n pos = start\n return null\n }\n if (peek() === '0' && pos + 1 < input.length && /[0-9]/.test(input[pos + 1])) {\n return { valid: false, reason: 'Leading zeros not allowed in numbers' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n if (peek() === '.') {\n advance()\n if (!/[0-9]/.test(peek())) {\n return { valid: false, reason: 'Invalid number: expected digit after decimal point' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n }\n if (peek() === 'e' || peek() === 'E') {\n advance()\n if (peek() === '-' || peek() === '+') advance()\n if (!/[0-9]/.test(peek())) {\n return { valid: false, reason: 'Invalid number: expected digit in exponent' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n }\n return null\n }\n\n function parseRegex(): ValidationResult | null {\n advance()\n if (peek() === '/' || peek() === '*') {\n return { valid: false, reason: 'Empty or comment-like regex pattern' }\n }\n let inCharClass = false\n while (pos < input.length) {\n const ch = input[pos]\n if (ch === '\\\\') {\n if (pos + 1 >= input.length) {\n return { valid: false, reason: 'Unterminated escape in regex' }\n }\n pos += 2\n continue\n }\n if (ch === '[' && !inCharClass) {\n inCharClass = true\n pos++\n continue\n }\n if (ch === ']' && inCharClass) {\n inCharClass = false\n pos++\n continue\n }\n if (ch === '/' && !inCharClass) {\n advance()\n while (pos < input.length && /[gimsuydv]/.test(peek())) {\n advance()\n }\n return null\n }\n if (ch.charCodeAt(0) < 32 && ch !== '\\t') {\n return { valid: false, reason: 'Control character in regex' }\n }\n pos++\n }\n return { valid: false, reason: 'Unterminated regex literal' }\n }\n\n function parseObjectKey(): ValidationResult | null {\n skipWhitespace()\n const ch = peek()\n if (ch === '\"' || ch === \"'\") {\n return parseString()\n }\n if (/[a-zA-Z_]/.test(ch)) {\n while (pos < input.length && /[a-zA-Z0-9_]/.test(peek())) {\n advance()\n }\n return null\n }\n return { valid: false, reason: 'Expected object key (identifier or string)' }\n }\n\n function parseArg(): ValidationResult | null {\n skipWhitespace()\n const ch = peek()\n\n if (ch === '}') {\n return { valid: false, reason: 'Unexpected \"}\" in directive args' }\n }\n if (ch === '`') {\n return { valid: false, reason: 'Template literals not allowed in directive args' }\n }\n if (ch !== '' && ch.charCodeAt(0) < 32) {\n return { valid: false, reason: 'Control character not allowed outside strings' }\n }\n\n if (ch === '\"' || ch === \"'\") {\n return parseString()\n }\n\n if (ch === '/') {\n return parseRegex()\n }\n\n if (ch === '{') {\n advance()\n skipWhitespace()\n if (peek() === '}') {\n advance()\n return null\n }\n const keyErr = parseObjectKey()\n if (keyErr) return keyErr\n skipWhitespace()\n if (peek() !== ':') {\n return { valid: false, reason: 'Expected \":\" after object key' }\n }\n advance()\n const valErr = parseArg()\n if (valErr) return valErr\n skipWhitespace()\n while (peek() === ',') {\n advance()\n skipWhitespace()\n if (peek() === '}') break\n const nextKeyErr = parseObjectKey()\n if (nextKeyErr) return nextKeyErr\n skipWhitespace()\n if (peek() !== ':') {\n return { valid: false, reason: 'Expected \":\" after object key' }\n }\n advance()\n const nextValErr = parseArg()\n if (nextValErr) return nextValErr\n skipWhitespace()\n }\n if (peek() !== '}') {\n return { valid: false, reason: 'Expected \"}\" to close object' }\n }\n advance()\n return null\n }\n\n if (ch === '[') {\n advance()\n skipWhitespace()\n if (peek() === ']') {\n advance()\n return null\n }\n const firstErr = parseArg()\n if (firstErr) return firstErr\n skipWhitespace()\n while (peek() === ',') {\n advance()\n skipWhitespace()\n if (peek() === ']') break\n const elemErr = parseArg()\n if (elemErr) return elemErr\n skipWhitespace()\n }\n if (peek() !== ']') {\n return { valid: false, reason: 'Expected \"]\" to close array' }\n }\n advance()\n return null\n }\n\n if (ch === '-' || /[0-9]/.test(ch)) {\n return parseNumber()\n }\n\n if (input.startsWith('true', pos)) {\n const after = input[pos + 4]\n if (!after || !/[a-zA-Z0-9_]/.test(after)) {\n pos += 4\n return null\n }\n }\n if (input.startsWith('false', pos)) {\n const after = input[pos + 5]\n if (!after || !/[a-zA-Z0-9_]/.test(after)) {\n pos += 5\n return null\n }\n }\n\n if (input.startsWith('NaN', pos)) {\n return { valid: false, reason: 'NaN not allowed' }\n }\n if (input.startsWith('Infinity', pos)) {\n return { valid: false, reason: 'Infinity not allowed' }\n }\n if (input.startsWith('null', pos)) {\n return { valid: false, reason: 'null not allowed as argument value' }\n }\n if (ch === '+') {\n return { valid: false, reason: '\"+\" prefix not allowed on numbers' }\n }\n\n if (/[a-zA-Z_]/.test(ch)) {\n return { valid: false, reason: 'Identifiers not allowed as argument values' }\n }\n\n return { valid: false, reason: `Unexpected character \"${ch}\"` }\n }\n\n while (pos < input.length) {\n skipWhitespace()\n if (pos >= input.length) break\n\n if (peek() !== '.') {\n return { valid: false, reason: `Expected \".\" at position ${pos}, got \"${peek()}\"` }\n }\n advance()\n\n if (!/[a-zA-Z_]/.test(peek())) {\n return { valid: false, reason: `Expected method name after \".\" at position ${pos}` }\n }\n\n let ident = ''\n while (pos < input.length && /[a-zA-Z0-9_]/.test(peek())) {\n ident += advance()\n }\n\n if (!ALLOWED_ZOD_METHODS.has(ident)) {\n return { valid: false, reason: `Unknown zod method: ${ident}` }\n }\n\n skipWhitespace()\n\n if (peek() !== '(') {\n return { valid: false, reason: `Expected \"(\" after method \"${ident}\"` }\n }\n advance()\n\n skipWhitespace()\n\n let argCount = 0\n if (peek() !== ')') {\n const argErr = parseArg()\n if (argErr) return argErr\n argCount = 1\n skipWhitespace()\n while (peek() === ',') {\n advance()\n skipWhitespace()\n if (peek() === ')') break\n const nextArgErr = parseArg()\n if (nextArgErr) return nextArgErr\n argCount++\n skipWhitespace()\n }\n }\n\n if (peek() !== ')') {\n return { valid: false, reason: `Expected \")\" to close method \"${ident}\"` }\n }\n advance()\n\n const arity = METHOD_ARITY[ident]\n if (arity) {\n const [minArgs, maxArgs] = arity\n if (argCount < minArgs || argCount > maxArgs) {\n if (minArgs === maxArgs) {\n return { valid: false, reason: `Method \"${ident}\" expects ${minArgs} argument(s), got ${argCount}` }\n }\n return { valid: false, reason: `Method \"${ident}\" expects ${minArgs}-${maxArgs} arguments, got ${argCount}` }\n }\n }\n\n methods.push(ident)\n chainCount++\n if (chainCount > MAX_CHAIN_DEPTH) {\n return { valid: false, reason: 'Directive exceeds maximum chain depth' }\n }\n }\n\n if (chainCount === 0) {\n return { valid: false, reason: 'No method calls found' }\n }\n\n return { valid: true, methods }\n}","import { z } from \"zod\";\n\nexport type ScalarBaseMap = Record<string, () => z.ZodTypeAny>;\n\nfunction isJsonSafe(value: unknown): boolean {\n type Entry = { tag: \"visit\"; value: unknown } | { tag: \"exit\"; ref: object };\n\n const stack: Entry[] = [{ tag: \"visit\", value }];\n const ancestors = new Set<object>();\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n\n if (entry.tag === \"exit\") {\n ancestors.delete(entry.ref);\n continue;\n }\n\n const current = entry.value;\n\n if (current === undefined) return false;\n if (current === null) continue;\n\n switch (typeof current) {\n case \"string\":\n case \"boolean\":\n continue;\n case \"number\":\n if (!Number.isFinite(current)) return false;\n continue;\n case \"object\": {\n if (ancestors.has(current)) return false;\n ancestors.add(current);\n stack.push({ tag: \"exit\", ref: current });\n if (Array.isArray(current)) {\n for (let i = 0; i < current.length; i++) {\n stack.push({ tag: \"visit\", value: current[i] });\n }\n continue;\n }\n const proto = Object.getPrototypeOf(current);\n if (proto !== Object.prototype && proto !== null) return false;\n const values = Object.values(current as Record<string, unknown>);\n for (let i = 0; i < values.length; i++) {\n stack.push({ tag: \"visit\", value: values[i] });\n }\n continue;\n }\n default:\n return false;\n }\n }\n\n return true;\n}\n\nconst DECIMAL_REGEX = /^-?(\\d+\\.?\\d*|\\.\\d+)([eE]-?\\d+)?$/;\n\nconst decimalStringSchema = z\n .string()\n .refine((s) => DECIMAL_REGEX.test(s), \"Invalid decimal string\");\n\nconst decimalObjectSchema = z.custom<unknown>(\n (v) =>\n v !== null &&\n typeof v === \"object\" &&\n typeof (v as any).toFixed === \"function\" &&\n typeof (v as any).toNumber === \"function\",\n \"Expected Decimal-compatible object\",\n);\n\nfunction createDecimalFactory(strict: boolean): () => z.ZodTypeAny {\n if (strict) {\n return () => z.union([decimalStringSchema, decimalObjectSchema]);\n }\n return () => z.union([z.number(), decimalStringSchema, decimalObjectSchema]);\n}\n\nexport function createScalarBase(strictDecimal: boolean): ScalarBaseMap {\n return {\n String: () => z.string(),\n Int: () => z.number().int(),\n Float: () => z.number(),\n Decimal: createDecimalFactory(strictDecimal),\n BigInt: () =>\n z.union([\n z.bigint(),\n z\n .number()\n .int()\n .refine(\n (v) => v >= Number.MIN_SAFE_INTEGER && v <= Number.MAX_SAFE_INTEGER,\n \"Number exceeds safe integer range for BigInt conversion\",\n )\n .transform((v) => BigInt(v)),\n z\n .string()\n .regex(/^-?\\d+$/)\n .transform((v) => BigInt(v)),\n ]),\n Boolean: () => z.boolean(),\n DateTime: () =>\n z\n .union([\n z.date(),\n z.string().refine(\n (s) => !isNaN(Date.parse(s)),\n \"Invalid date string\",\n ),\n ])\n .pipe(z.coerce.date()),\n Json: () =>\n z\n .unknown()\n .refine(\n isJsonSafe,\n \"Value must be JSON-serializable (no undefined, functions, symbols, class instances, NaN, Infinity, or circular references)\",\n ),\n Bytes: () =>\n z.union([z.string(), z.custom<unknown>((v) => v instanceof Uint8Array)]),\n };\n}\n\nexport const SCALAR_BASE: ScalarBaseMap = createScalarBase(false);\n\nexport function wrapWithInputCoercion(\n fieldType: string,\n isList: boolean,\n schema: z.ZodTypeAny,\n): z.ZodTypeAny {\n let itemCoercion: z.ZodTypeAny | null = null;\n\n switch (fieldType) {\n case \"String\":\n itemCoercion = z.union([z.string(), z.number().transform(String)]);\n break;\n case \"Int\":\n itemCoercion = z.union([\n z.number().transform((v) => Math.trunc(v)).pipe(z.number().int()),\n z\n .string()\n .regex(/^-?\\d+(\\.\\d+)?$/)\n .transform((v) => Math.trunc(Number(v))),\n ]);\n break;\n case \"Float\":\n itemCoercion = z.union([\n z.number(),\n z\n .string()\n .regex(/^-?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/)\n .transform(Number),\n ]);\n break;\n default:\n return schema;\n }\n\n const coercion = isList ? z.array(itemCoercion) : itemCoercion;\n return coercion.pipe(schema);\n}"],"mappings":"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","names":["z","z"]}
@@ -84,9 +84,9 @@ interface NestedIncludeArgs {
84
84
  skip?: true;
85
85
  }
86
86
  interface NestedSelectArgs {
87
- select?: Record<string, true | NestedSelectArgs>;
88
- include?: Record<string, true | NestedIncludeArgs>;
89
87
  where?: Record<string, unknown>;
88
+ include?: Record<string, true | NestedIncludeArgs>;
89
+ select?: Record<string, true | NestedSelectArgs>;
90
90
  orderBy?: Record<string, OrderByFieldConfig>;
91
91
  cursor?: Record<string, true>;
92
92
  take?: number | {
@@ -148,9 +148,10 @@ interface GuardShape extends ShapeConfig {
148
148
  type GuardShapeOrFn = GuardShape | ((ctx: any) => GuardShape);
149
149
  type GuardInput = GuardShapeOrFn | Record<string, GuardShapeOrFn>;
150
150
  type GuardableMethodName = QueryMethod | MutationMethod;
151
- type ExtractReturn<T, K extends string> = K extends keyof T ? T[K] extends (...args: any[]) => infer R ? R : never : never;
151
+ type AnyFn = (...args: any[]) => any;
152
+ type DelegateMethod<TDelegate, K extends PropertyKey> = K extends keyof TDelegate ? TDelegate[K] extends AnyFn ? TDelegate[K] : never : never;
152
153
  type GuardedModel<TDelegate> = {
153
- [K in GuardableMethodName as K extends keyof TDelegate ? K : never]: ExtractReturn<TDelegate, K> extends never ? never : (body?: unknown) => ExtractReturn<TDelegate, K>;
154
+ [K in GuardableMethodName as DelegateMethod<TDelegate, K> extends never ? never : K]: DelegateMethod<TDelegate, K>;
154
155
  };
155
156
 
156
157
  declare function createGuard<TModels extends TypeMap = TypeMap, TRoots extends string = string, TModelExt = unknown>(config: GuardConfig & {
@@ -236,6 +237,9 @@ type ScalarFields<TM extends TypeMapConst, M extends keyof TM> = {
236
237
  type RelationFields<TM extends TypeMapConst, M extends keyof TM> = {
237
238
  [K in keyof TM[M]]: TM[M][K]['isRelation'] extends true ? K : never;
238
239
  }[keyof TM[M]] & string;
240
+ type ListRelationFields<TM extends TypeMapConst, M extends keyof TM> = {
241
+ [K in keyof TM[M]]: TM[M][K]['isRelation'] extends true ? TM[M][K]['isList'] extends true ? K : never : never;
242
+ }[keyof TM[M]] & string;
239
243
  type WritableFields<TM extends TypeMapConst, M extends keyof TM> = {
240
244
  [K in keyof TM[M]]: TM[M][K]['isRelation'] extends true ? never : TM[M][K]['isUpdatedAt'] extends true ? never : K;
241
245
  }[keyof TM[M]] & string;
@@ -264,6 +268,14 @@ type LooseNestedArgs = {
264
268
  skip?: true;
265
269
  };
266
270
  type TypedWhere<TM extends TypeMapConst, M extends keyof TM> = Partial<Record<AllFields<TM, M> | 'AND' | 'OR' | 'NOT', unknown>>;
271
+ type TypedCountSelectInProjection<TM extends TypeMapConst, M extends keyof TM> = {
272
+ [K in ListRelationFields<TM, M>]?: true | {
273
+ where?: TypedWhere<TM, RelTarget<TM, M, K>>;
274
+ };
275
+ };
276
+ type TypedProjectionCount<TM extends TypeMapConst, M extends keyof TM> = true | {
277
+ select: TypedCountSelectInProjection<TM, M>;
278
+ };
267
279
  type TypedNestedRelArgs<TM extends TypeMapConst, T, D extends ShapeDepth> = T extends keyof TM ? D extends 0 ? LooseNestedArgs : {
268
280
  select?: TypedProjection<TM, T, DecDepth<D>>;
269
281
  include?: TypedInclude<TM, T, DecDepth<D>>;
@@ -278,9 +290,13 @@ type TypedNestedRelArgs<TM extends TypeMapConst, T, D extends ShapeDepth> = T ex
278
290
  } : LooseNestedArgs;
279
291
  type TypedProjection<TM extends TypeMapConst, M extends keyof TM, D extends ShapeDepth> = {
280
292
  [K in AllFields<TM, M>]?: K extends RelationFields<TM, M> ? true | TypedNestedRelArgs<TM, RelTarget<TM, M, K>, D> : true;
293
+ } & {
294
+ _count?: TypedProjectionCount<TM, M>;
281
295
  };
282
296
  type TypedInclude<TM extends TypeMapConst, M extends keyof TM, D extends ShapeDepth> = {
283
297
  [K in RelationFields<TM, M>]?: true | TypedNestedRelArgs<TM, RelTarget<TM, M, K>, D>;
298
+ } & {
299
+ _count?: TypedProjectionCount<TM, M>;
284
300
  };
285
301
  type TypedCountSelect<TM extends TypeMapConst, M extends keyof TM> = Partial<Record<ScalarFields<TM, M> | '_all', true>>;
286
302
  type TypedCountField<TM extends TypeMapConst, M extends keyof TM> = true | Partial<Record<ScalarFields<TM, M> | '_all', true>>;
@@ -84,9 +84,9 @@ interface NestedIncludeArgs {
84
84
  skip?: true;
85
85
  }
86
86
  interface NestedSelectArgs {
87
- select?: Record<string, true | NestedSelectArgs>;
88
- include?: Record<string, true | NestedIncludeArgs>;
89
87
  where?: Record<string, unknown>;
88
+ include?: Record<string, true | NestedIncludeArgs>;
89
+ select?: Record<string, true | NestedSelectArgs>;
90
90
  orderBy?: Record<string, OrderByFieldConfig>;
91
91
  cursor?: Record<string, true>;
92
92
  take?: number | {
@@ -148,9 +148,10 @@ interface GuardShape extends ShapeConfig {
148
148
  type GuardShapeOrFn = GuardShape | ((ctx: any) => GuardShape);
149
149
  type GuardInput = GuardShapeOrFn | Record<string, GuardShapeOrFn>;
150
150
  type GuardableMethodName = QueryMethod | MutationMethod;
151
- type ExtractReturn<T, K extends string> = K extends keyof T ? T[K] extends (...args: any[]) => infer R ? R : never : never;
151
+ type AnyFn = (...args: any[]) => any;
152
+ type DelegateMethod<TDelegate, K extends PropertyKey> = K extends keyof TDelegate ? TDelegate[K] extends AnyFn ? TDelegate[K] : never : never;
152
153
  type GuardedModel<TDelegate> = {
153
- [K in GuardableMethodName as K extends keyof TDelegate ? K : never]: ExtractReturn<TDelegate, K> extends never ? never : (body?: unknown) => ExtractReturn<TDelegate, K>;
154
+ [K in GuardableMethodName as DelegateMethod<TDelegate, K> extends never ? never : K]: DelegateMethod<TDelegate, K>;
154
155
  };
155
156
 
156
157
  declare function createGuard<TModels extends TypeMap = TypeMap, TRoots extends string = string, TModelExt = unknown>(config: GuardConfig & {
@@ -236,6 +237,9 @@ type ScalarFields<TM extends TypeMapConst, M extends keyof TM> = {
236
237
  type RelationFields<TM extends TypeMapConst, M extends keyof TM> = {
237
238
  [K in keyof TM[M]]: TM[M][K]['isRelation'] extends true ? K : never;
238
239
  }[keyof TM[M]] & string;
240
+ type ListRelationFields<TM extends TypeMapConst, M extends keyof TM> = {
241
+ [K in keyof TM[M]]: TM[M][K]['isRelation'] extends true ? TM[M][K]['isList'] extends true ? K : never : never;
242
+ }[keyof TM[M]] & string;
239
243
  type WritableFields<TM extends TypeMapConst, M extends keyof TM> = {
240
244
  [K in keyof TM[M]]: TM[M][K]['isRelation'] extends true ? never : TM[M][K]['isUpdatedAt'] extends true ? never : K;
241
245
  }[keyof TM[M]] & string;
@@ -264,6 +268,14 @@ type LooseNestedArgs = {
264
268
  skip?: true;
265
269
  };
266
270
  type TypedWhere<TM extends TypeMapConst, M extends keyof TM> = Partial<Record<AllFields<TM, M> | 'AND' | 'OR' | 'NOT', unknown>>;
271
+ type TypedCountSelectInProjection<TM extends TypeMapConst, M extends keyof TM> = {
272
+ [K in ListRelationFields<TM, M>]?: true | {
273
+ where?: TypedWhere<TM, RelTarget<TM, M, K>>;
274
+ };
275
+ };
276
+ type TypedProjectionCount<TM extends TypeMapConst, M extends keyof TM> = true | {
277
+ select: TypedCountSelectInProjection<TM, M>;
278
+ };
267
279
  type TypedNestedRelArgs<TM extends TypeMapConst, T, D extends ShapeDepth> = T extends keyof TM ? D extends 0 ? LooseNestedArgs : {
268
280
  select?: TypedProjection<TM, T, DecDepth<D>>;
269
281
  include?: TypedInclude<TM, T, DecDepth<D>>;
@@ -278,9 +290,13 @@ type TypedNestedRelArgs<TM extends TypeMapConst, T, D extends ShapeDepth> = T ex
278
290
  } : LooseNestedArgs;
279
291
  type TypedProjection<TM extends TypeMapConst, M extends keyof TM, D extends ShapeDepth> = {
280
292
  [K in AllFields<TM, M>]?: K extends RelationFields<TM, M> ? true | TypedNestedRelArgs<TM, RelTarget<TM, M, K>, D> : true;
293
+ } & {
294
+ _count?: TypedProjectionCount<TM, M>;
281
295
  };
282
296
  type TypedInclude<TM extends TypeMapConst, M extends keyof TM, D extends ShapeDepth> = {
283
297
  [K in RelationFields<TM, M>]?: true | TypedNestedRelArgs<TM, RelTarget<TM, M, K>, D>;
298
+ } & {
299
+ _count?: TypedProjectionCount<TM, M>;
284
300
  };
285
301
  type TypedCountSelect<TM extends TypeMapConst, M extends keyof TM> = Partial<Record<ScalarFields<TM, M> | '_all', true>>;
286
302
  type TypedCountField<TM extends TypeMapConst, M extends keyof TM> = true | Partial<Record<ScalarFields<TM, M> | '_all', true>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prisma-guard",
3
- "version": "1.22.3",
3
+ "version": "1.24.0",
4
4
  "description": "Prisma generator + runtime for input validation, query shape enforcement, and row-level tenant isolation",
5
5
  "license": "MIT",
6
6
  "type": "module",