prisma-guard 1.26.1 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -695,6 +695,26 @@ where: {
695
695
  }
696
696
  ```
697
697
 
698
+ **Case-insensitive string filtering with `mode`:**
699
+
700
+ String fields support Prisma's `mode` modifier alongside `contains`, `startsWith`, `endsWith`, and `equals`. Use `mode: true` to let the client choose, or force a specific mode in the shape:
701
+ ```ts
702
+ where: {
703
+ // client controls mode
704
+ title: { contains: true, mode: true },
705
+
706
+ // server forces case-insensitive matching
707
+ description: { contains: true, mode: 'insensitive' },
708
+
709
+ // server forces case-insensitive matching using force()
710
+ slug: { contains: true, mode: force('insensitive') },
711
+ }
712
+ ```
713
+
714
+ `mode` is also supported on `Json` fields with the `string_contains`, `string_starts_with`, and `string_ends_with` operators. The shape must include at least one mode-compatible operator alongside `mode` — `{ title: { mode: true } }` alone is rejected.
715
+
716
+ When `mode` is forced (e.g. `mode: 'insensitive'`) and the client provides a compatible operator value (e.g. `{ contains: 'foo' }`), the forced mode is inlined into the same operator object, producing `{ contains: 'foo', mode: 'insensitive' }` in the final Prisma query. This is required for `mode` to actually affect the query — Prisma's `mode` is a modifier that must be co-located with the string operator it modifies.
717
+
698
718
  **Relation existence checks with `is: null` / `isNot: null`:**
699
719
 
700
720
  To-one relation filters support null checks for testing relation existence. In the shape config, use `null` as the operator value to force a null check:
@@ -1951,6 +1971,16 @@ Fields in `orderBy`, `cursor`, `having`, `_count` (object form), `_avg`, `_sum`,
1951
1971
 
1952
1972
  Both `@zod .default(...)` and `@zod .catch(...)` are tracked in the generated `ZOD_DEFAULTS` map. Fields with either directive are exempted from create completeness checks and auto-injected as forced values when omitted from data shapes. The `.catch()` behavior (fallback on parse error) is preserved in create mode by not wrapping the schema with `.optional()`.
1953
1973
 
1974
+ ### `mode` modifier in where filters
1975
+
1976
+ Prisma's `mode` modifier for case-insensitive string filtering is supported on `String` fields (with `contains`, `startsWith`, `endsWith`, `equals`) and `Json` fields (with `string_contains`, `string_starts_with`, `string_ends_with`). The shape syntax is `{ field: { contains: true, mode: true } }` for client-controlled mode or `{ field: { contains: true, mode: 'insensitive' } }` for forced mode.
1977
+
1978
+ When mode is forced, prisma-guard inlines the forced `mode` value into the same operator object as the client-provided string operator, producing `{ field: { contains: 'foo', mode: 'insensitive' } }` in the final query. This co-location is necessary because Prisma's `mode` is a modifier on `StringFilter` — a sibling AND clause carrying only `mode` would have no operator to modify and would be silently ignored.
1979
+
1980
+ The same inline-merge behavior applies to any other forced operator on a field where the client provides a different operator on the same field. Forced operators that conflict with the client's value on the same op key (e.g. forced `{ equals: 'x' }` plus client `{ equals: 'y' }`) are rejected with `ShapeError` at merge time. Forced conditions on fields the client did not touch fall back to AND-wrapping, unchanged from previous behavior.
1981
+
1982
+ A shape with `{ field: { mode: true } }` alone (no compatible string operator) is rejected with `ShapeError`.
1983
+
1954
1984
  ---
1955
1985
 
1956
1986
  ## Advanced: SQL-backed runtimes
@@ -2047,6 +2077,15 @@ Caller routing is resolved before method execution: the explicit `caller` argume
2047
2077
 
2048
2078
  The context function is validated on every code path that consumes it — scope injection, caller resolution, and dynamic shape evaluation all enforce the plain-object contract and throw `PolicyError` for invalid returns. Additionally, if a context key matches a known scope root but has a non-primitive value, `PolicyError` is thrown immediately rather than silently dropping the scope.
2049
2079
 
2080
+ ### Forced where merge strategy
2081
+
2082
+ When a where shape includes forced conditions, prisma-guard merges them into the client's validated where in two ways:
2083
+
2084
+ 1. **Inline merge** — if a forced field's value is a plain operator object and the client also provided an operator object for the same field, the forced operator keys are merged into the client's operator object. This is required for modifiers like `mode` that must co-locate with the operator they modify. Conflicts on the same op key (different values) throw `ShapeError`.
2085
+ 2. **AND-wrap** — forced fields not present in the client's where, or where the value types don't allow inline merging, are placed in a separate AND branch.
2086
+
2087
+ If all forced fields inline successfully, the result is a flat object with no synthetic `AND` wrapper. Forced conditions inside combinators are still lifted to top-level AND constraints, following the same merge logic.
2088
+
2050
2089
  ### The `force()` helper
2051
2090
 
2052
2091
  The `force()` function is exported from `prisma-guard` and creates a wrapper object with an internal symbol marker. At runtime, shape processing checks for this marker to distinguish forced values from the `true` sentinel. The wrapper is unwrapped before Zod validation, so the forced value is validated against the field's schema like any other literal. The symbol is not enumerable and does not interfere with serialization or inspection of shape objects.
@@ -2129,6 +2168,8 @@ For upsert, `create` and `update` data schemas are cached independently under na
2129
2168
  | context function returns non-object | error always (PolicyError) |
2130
2169
  | conflicting forced where values | error always (ShapeError) |
2131
2170
  | invalid context function return | error always (PolicyError) |
2171
+ | `mode` modifier without compatible op | error always (ShapeError) |
2172
+ | forced operator conflicts with client value | error always (ShapeError) |
2132
2173
  | `@zod .default()`/`.catch()` field omitted from shape | auto-injected as forced value |
2133
2174
  | read shape with select/include, client omits | auto-applied as default projection |
2134
2175
  | mutation shape with select/include, client omits | full payload unless enforceProjection enabled |
@@ -2232,6 +2273,8 @@ Node 22
2232
2273
  | Empty projection shape rejection | yes | n/a |
2233
2274
  | Forced where conflict detection | yes | n/a |
2234
2275
  | Forced boolean values via `force()` | yes | n/a |
2276
+ | Case-insensitive string filtering (`mode`) | yes | manual |
2277
+ | Forced operator inline merge | yes | n/a |
2235
2278
  | Strict Decimal mode | opt-in | n/a |
2236
2279
  | `@zod .default()`/`.catch()` auto-injection | yes | n/a |
2237
2280
  | Nested write scope enforcement | no (top-level only) | no |
@@ -2252,4 +2295,4 @@ Possible future improvements:
2252
2295
 
2253
2296
  ## License
2254
2297
 
2255
- MIT
2298
+ MIT
@@ -6,19 +6,29 @@ import { mkdirSync, writeFileSync } from "fs";
6
6
  import { relative } from "path";
7
7
 
8
8
  // src/generator/emit-client.ts
9
- function emitClient(_dmmf, prismaClientImport) {
9
+ function delegateKey(modelName) {
10
+ return modelName.charAt(0).toLowerCase() + modelName.slice(1);
11
+ }
12
+ function emitGuardModelExtension(dmmf) {
13
+ const entries = dmmf.datamodel.models.map((model) => {
14
+ const key = delegateKey(model.name);
15
+ return ` ${key}: {
16
+ guard(input: GuardInput, caller?: string): GuardedModel<PrismaClient['${key}']>
17
+ }`;
18
+ }).join("\n");
19
+ return `interface GuardModelExtension {
20
+ ${entries}
21
+ }
22
+ `;
23
+ }
24
+ function emitClient(dmmf, prismaClientImport) {
10
25
  return `import type { PrismaClient } from '${prismaClientImport}'
11
26
  import type { GuardInput, GuardedModel } from 'prisma-guard'
12
27
  import { createGuard } from 'prisma-guard'
13
28
  import { SCOPE_MAP, TYPE_MAP, ENUM_MAP, ZOD_CHAINS, GUARD_CONFIG, UNIQUE_MAP, ZOD_DEFAULTS } from './index'
14
29
  import type { ScopeRoot } from './index'
15
30
 
16
- interface GuardModelExtension {
17
- $allModels: {
18
- guard<TDelegate>(this: TDelegate, input: GuardInput, caller?: string): GuardedModel<TDelegate>
19
- }
20
- }
21
-
31
+ ` + emitGuardModelExtension(dmmf) + `
22
32
  export const guard = createGuard<typeof TYPE_MAP, ScopeRoot, GuardModelExtension>({
23
33
  scopeMap: SCOPE_MAP,
24
34
  typeMap: TYPE_MAP,
@@ -1 +1 @@
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\ninterface UniqueConstraintMeta {\n selector: string;\n fields: string[];\n}\n\nfunction uniqueSelector(fields: string[], name?: string | null): string {\n if (typeof name === \"string\" && name.trim().length > 0) return name;\n return fields.join(\"_\");\n}\n\nfunction collectUniqueConstraints(model: DMMF.Model): UniqueConstraintMeta[] {\n const fieldSetSeen = new Set<string>();\n const selectorToFields = new Map<string, string>();\n const constraints: UniqueConstraintMeta[] = [];\n\n function fieldsKey(fields: string[]): string {\n return fields.join(\"\\0\");\n }\n\n function add(fields: string[], selector?: string | null): void {\n if (fields.length === 0) return;\n\n const normalizedSelector =\n fields.length === 1 ? fields[0] : uniqueSelector(fields, selector);\n\n const key = fieldsKey(fields);\n const existingFieldsForSelector = selectorToFields.get(normalizedSelector);\n\n if (existingFieldsForSelector && existingFieldsForSelector !== key) {\n throw new Error(\n `prisma-guard: Unique selector \"${normalizedSelector}\" on model \"${model.name}\" maps to multiple field sets.`,\n );\n }\n\n if (fieldSetSeen.has(key)) return;\n\n fieldSetSeen.add(key);\n selectorToFields.set(normalizedSelector, key);\n\n constraints.push({\n selector: normalizedSelector,\n fields: [...fields],\n });\n }\n\n for (const field of model.fields) {\n if (field.isId) add([field.name], field.name);\n }\n\n if (model.primaryKey) {\n add([...model.primaryKey.fields], model.primaryKey.name);\n }\n\n for (const field of model.fields) {\n if (field.isUnique) add([field.name], field.name);\n }\n\n const uniqueIndexes =\n (\n model as DMMF.Model & {\n uniqueIndexes?: Array<{ name?: string | null; fields: string[] }>;\n }\n ).uniqueIndexes ?? [];\n\n for (const index of uniqueIndexes) {\n add([...index.fields], index.name);\n }\n\n for (const fields of model.uniqueFields) {\n add([...fields], fields.length === 1 ? fields[0] : fields.join(\"_\"));\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 =\n 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\n const constraintsStr = constraints\n .map((c) => {\n const fields = c.fields.map((f) => JSON.stringify(f)).join(\", \");\n return `{ selector: ${JSON.stringify(c.selector)}, fields: [${fields}] }`;\n })\n .join(\", \");\n\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}\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, UNIQUE_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 `type UM = typeof UNIQUE_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}, UM>\\n` +\n `export type ${m}Projection = ${m}Select\\n` +\n `export type ${m}Include = ` +\n `TypedInclude<TM, '${m}', ${depth}, UM>\\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}, UM>\\n`\n\n const opAliases = OPERATIONS.map((op) => {\n const c = cap(op)\n\n return (\n `export type ${m}${c}Shape = ` +\n `OperationShape<TM, '${m}', '${op}', ${depth}, UM>\\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"]}
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\nfunction delegateKey(modelName: string): string {\n return modelName.charAt(0).toLowerCase() + modelName.slice(1)\n}\n\nfunction emitGuardModelExtension(dmmf: DMMF.Document): string {\n const entries = dmmf.datamodel.models\n .map((model) => {\n const key = delegateKey(model.name)\n return (\n ` ${key}: {\\n` +\n ` guard(input: GuardInput, caller?: string): GuardedModel<PrismaClient['${key}']>\\n` +\n ` }`\n )\n })\n .join('\\n')\n\n return `interface GuardModelExtension {\\n${entries}\\n}\\n`\n}\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 emitGuardModelExtension(dmmf) +\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\ninterface UniqueConstraintMeta {\n selector: string;\n fields: string[];\n}\n\nfunction uniqueSelector(fields: string[], name?: string | null): string {\n if (typeof name === \"string\" && name.trim().length > 0) return name;\n return fields.join(\"_\");\n}\n\nfunction collectUniqueConstraints(model: DMMF.Model): UniqueConstraintMeta[] {\n const fieldSetSeen = new Set<string>();\n const selectorToFields = new Map<string, string>();\n const constraints: UniqueConstraintMeta[] = [];\n\n function fieldsKey(fields: string[]): string {\n return fields.join(\"\\0\");\n }\n\n function add(fields: string[], selector?: string | null): void {\n if (fields.length === 0) return;\n\n const normalizedSelector =\n fields.length === 1 ? fields[0] : uniqueSelector(fields, selector);\n\n const key = fieldsKey(fields);\n const existingFieldsForSelector = selectorToFields.get(normalizedSelector);\n\n if (existingFieldsForSelector && existingFieldsForSelector !== key) {\n throw new Error(\n `prisma-guard: Unique selector \"${normalizedSelector}\" on model \"${model.name}\" maps to multiple field sets.`,\n );\n }\n\n if (fieldSetSeen.has(key)) return;\n\n fieldSetSeen.add(key);\n selectorToFields.set(normalizedSelector, key);\n\n constraints.push({\n selector: normalizedSelector,\n fields: [...fields],\n });\n }\n\n for (const field of model.fields) {\n if (field.isId) add([field.name], field.name);\n }\n\n if (model.primaryKey) {\n add([...model.primaryKey.fields], model.primaryKey.name);\n }\n\n for (const field of model.fields) {\n if (field.isUnique) add([field.name], field.name);\n }\n\n const uniqueIndexes =\n (\n model as DMMF.Model & {\n uniqueIndexes?: Array<{ name?: string | null; fields: string[] }>;\n }\n ).uniqueIndexes ?? [];\n\n for (const index of uniqueIndexes) {\n add([...index.fields], index.name);\n }\n\n for (const fields of model.uniqueFields) {\n add([...fields], fields.length === 1 ? fields[0] : fields.join(\"_\"));\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 =\n 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\n const constraintsStr = constraints\n .map((c) => {\n const fields = c.fields.map((f) => JSON.stringify(f)).join(\", \");\n return `{ selector: ${JSON.stringify(c.selector)}, fields: [${fields}] }`;\n })\n .join(\", \");\n\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}\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, UNIQUE_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 `type UM = typeof UNIQUE_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}, UM>\\n` +\n `export type ${m}Projection = ${m}Select\\n` +\n `export type ${m}Include = ` +\n `TypedInclude<TM, '${m}', ${depth}, UM>\\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}, UM>\\n`\n\n const opAliases = OPERATIONS.map((op) => {\n const c = cap(op)\n\n return (\n `export type ${m}${c}Shape = ` +\n `OperationShape<TM, '${m}', '${op}', ${depth}, UM>\\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"]}
@@ -990,6 +990,60 @@ var EMPTY_WHERE_FORCED = {
990
990
  function hasWhereForced(f) {
991
991
  return Object.keys(f.conditions).length > 0 || Object.keys(f.relations).length > 0;
992
992
  }
993
+ function forcedScalarsEqual(a, b) {
994
+ if (a === b)
995
+ return true;
996
+ if (a === null || b === null)
997
+ return false;
998
+ if (typeof a !== typeof b)
999
+ return false;
1000
+ if (a instanceof Date && b instanceof Date) {
1001
+ return a.getTime() === b.getTime();
1002
+ }
1003
+ if (a instanceof RegExp && b instanceof RegExp) {
1004
+ return a.source === b.source && a.flags === b.flags;
1005
+ }
1006
+ if (Array.isArray(a)) {
1007
+ if (!Array.isArray(b))
1008
+ return false;
1009
+ if (a.length !== b.length)
1010
+ return false;
1011
+ return a.every((v, i) => forcedScalarsEqual(v, b[i]));
1012
+ }
1013
+ if (isPlainObject(a) && isPlainObject(b)) {
1014
+ const aKeys = Object.keys(a);
1015
+ const bKeys = Object.keys(b);
1016
+ if (aKeys.length !== bKeys.length)
1017
+ return false;
1018
+ return aKeys.every(
1019
+ (k) => k in b && forcedScalarsEqual(a[k], b[k])
1020
+ );
1021
+ }
1022
+ return false;
1023
+ }
1024
+ function tryInlineForcedField(result, field, forcedValue) {
1025
+ if (!(field in result))
1026
+ return false;
1027
+ if (!isPlainObject(forcedValue))
1028
+ return false;
1029
+ const existing = result[field];
1030
+ if (!isPlainObject(existing))
1031
+ return false;
1032
+ const merged = { ...existing };
1033
+ for (const [op, value] of Object.entries(forcedValue)) {
1034
+ if (op in merged) {
1035
+ if (!forcedScalarsEqual(merged[op], value)) {
1036
+ throw new ShapeError(
1037
+ `Conflicting where values for "${field}.${op}": client provided a different value than the forced shape`
1038
+ );
1039
+ }
1040
+ continue;
1041
+ }
1042
+ merged[op] = deepClone(value);
1043
+ }
1044
+ result[field] = merged;
1045
+ return true;
1046
+ }
993
1047
  function mergeWhereForced(where, forced) {
994
1048
  if (!hasWhereForced(forced))
995
1049
  return where ?? {};
@@ -1007,11 +1061,19 @@ function mergeWhereForced(where, forced) {
1007
1061
  }
1008
1062
  }
1009
1063
  if (Object.keys(forced.conditions).length > 0) {
1010
- const scalarClone = deepClone(forced.conditions);
1011
- if (Object.keys(result).length === 0) {
1012
- result = scalarClone;
1013
- } else {
1014
- result = { AND: [result, scalarClone] };
1064
+ const remaining = {};
1065
+ for (const [field, forcedValue] of Object.entries(forced.conditions)) {
1066
+ const inlined = tryInlineForcedField(result, field, forcedValue);
1067
+ if (!inlined) {
1068
+ remaining[field] = deepClone(forcedValue);
1069
+ }
1070
+ }
1071
+ if (Object.keys(remaining).length > 0) {
1072
+ if (Object.keys(result).length === 0) {
1073
+ result = remaining;
1074
+ } else {
1075
+ result = { AND: [result, remaining] };
1076
+ }
1015
1077
  }
1016
1078
  }
1017
1079
  return result;
@@ -5541,15 +5603,15 @@ function createModelGuardExtension(config) {
5541
5603
  }
5542
5604
  return wrapped;
5543
5605
  }
5544
- return {
5545
- $allModels: {
5606
+ const extension = {};
5607
+ for (const modelName of Object.keys(typeMap)) {
5608
+ const key = toDelegateKey(modelName);
5609
+ extension[key] = {
5546
5610
  guard(input, caller) {
5547
- const modelName = this.$name;
5548
- const delegateKey = toDelegateKey(modelName);
5549
- const modelDelegate = this.$parent[delegateKey];
5611
+ const modelDelegate = this.$parent[key];
5550
5612
  if (!modelDelegate) {
5551
5613
  throw new ShapeError(
5552
- `Could not resolve Prisma delegate for model "${modelName}" (key: "${delegateKey}")`
5614
+ `Could not resolve Prisma delegate for model "${modelName}" (key: "${key}")`
5553
5615
  );
5554
5616
  }
5555
5617
  const methods = createGuardedMethods(
@@ -5562,8 +5624,9 @@ function createModelGuardExtension(config) {
5562
5624
  return methods;
5563
5625
  return wrapMethods(methods);
5564
5626
  }
5565
- }
5566
- };
5627
+ };
5628
+ }
5629
+ return extension;
5567
5630
  }
5568
5631
 
5569
5632
  // src/runtime/guard.ts