prisma-guard 1.21.0 → 1.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -268,11 +268,8 @@ function validateDirective(raw) {
268
268
  }
269
269
  if (peek() === "e" || peek() === "E") {
270
270
  advance();
271
- if (peek() === "-")
271
+ if (peek() === "-" || peek() === "+")
272
272
  advance();
273
- if (peek() === "+") {
274
- return { valid: false, reason: 'Invalid number: "+" not allowed in exponent' };
275
- }
276
273
  if (!/[0-9]/.test(peek())) {
277
274
  return { valid: false, reason: "Invalid number: expected digit in exponent" };
278
275
  }
@@ -602,7 +599,13 @@ function createScalarBase(strictDecimal) {
602
599
  z.string().regex(/^-?\d+$/).transform((v) => BigInt(v))
603
600
  ]),
604
601
  Boolean: () => z.boolean(),
605
- DateTime: () => z.union([z.date(), z.string().datetime({ offset: true })]).pipe(z.coerce.date()),
602
+ DateTime: () => z.union([
603
+ z.date(),
604
+ z.string().refine(
605
+ (s) => !isNaN(Date.parse(s)),
606
+ "Invalid date string"
607
+ )
608
+ ]).pipe(z.coerce.date()),
606
609
  Json: () => z.unknown().refine(
607
610
  isJsonSafe,
608
611
  "Value must be JSON-serializable (no undefined, functions, symbols, class instances, NaN, Infinity, or circular references)"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/generator/index.ts","../../src/generator/emit-scope-map.ts","../../src/generator/emit-zod-chains.ts","../../src/generator/validate-directive.ts","../../src/shared/scalar-base.ts","../../src/generator/emit-type-map.ts","../../src/shared/constants.ts","../../src/generator/emit-client.ts"],"sourcesContent":["import pkg from '@prisma/generator-helper'\nconst { generatorHandler } = pkg\nimport type { DMMF } from '@prisma/generator-helper'\nimport { writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { emitScopeMap } from './emit-scope-map.js'\nimport { emitZodChains } from './emit-zod-chains.js'\nimport { emitTypeMap } from './emit-type-map.js'\nimport { emitClient } from './emit-client.js'\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'])\n\nfunction validateConfigEnum<T extends string>(\n name: string,\n value: string,\n allowed: Set<T>,\n): T {\n if (!allowed.has(value as T)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"${name}\": \"${value}\". Allowed values: ${[...allowed].join(', ')}`,\n )\n }\n return value as T\n}\n\nfunction validateBooleanConfig(name: string, raw: string | undefined, fallback: boolean): boolean {\n const value = raw ?? (fallback ? 'true' : 'false')\n if (!VALID_BOOLEAN_CONFIG.has(value)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"${name}\": \"${value}\". Allowed values: true, false`,\n )\n }\n return value === 'true'\n}\n\nfunction emitZodDefaults(defaults: Record<string, string[]>): string {\n const entries = Object.entries(defaults)\n if (entries.length === 0) {\n return `export const ZOD_DEFAULTS: Record<string, readonly string[]> = {}\\n`\n }\n const mapEntries = entries\n .map(([model, fields]) => {\n const fieldsStr = fields.map(f => JSON.stringify(f)).join(', ')\n return ` ${JSON.stringify(model)}: [${fieldsStr}],`\n })\n .join('\\n')\n return `export const ZOD_DEFAULTS: Record<string, readonly string[]> = {\\n${mapEntries}\\n}\\n`\n}\n\ngeneratorHandler({\n onManifest() {\n return {\n prettyName: 'Prisma Guard',\n defaultOutput: 'generated/guard',\n }\n },\n\n async onGenerate(options) {\n const output = options.generator.output?.value\n if (!output) throw new Error('prisma-guard: No output directory specified')\n\n const config = options.generator.config ?? {}\n const onInvalidZod = validateConfigEnum('onInvalidZod', (config.onInvalidZod as string) ?? 'error', VALID_ON_INVALID_ZOD)\n const onAmbiguousScope = validateConfigEnum('onAmbiguousScope', (config.onAmbiguousScope as string) ?? 'error', VALID_ON_AMBIGUOUS_SCOPE)\n const onMissingScopeContext = validateConfigEnum('onMissingScopeContext', (config.onMissingScopeContext as string) ?? 'error', VALID_ON_MISSING_SCOPE_CONTEXT)\n const findUniqueMode = validateConfigEnum('findUniqueMode', (config.findUniqueMode as string) ?? 'reject', VALID_FIND_UNIQUE_MODE)\n const onScopeRelationWrite = validateConfigEnum('onScopeRelationWrite', (config.onScopeRelationWrite as string) ?? 'error', VALID_ON_SCOPE_RELATION_WRITE)\n const strictDecimal = validateBooleanConfig('strictDecimal', config.strictDecimal as string | undefined, false)\n const enforceProjection = validateBooleanConfig('enforceProjection', config.enforceProjection as string | undefined, false)\n\n const dmmf = options.dmmf\n\n const parts: string[] = []\n\n parts.push(\n `export const GUARD_CONFIG = {\\n` +\n ` onMissingScopeContext: ${JSON.stringify(onMissingScopeContext)},\\n` +\n ` findUniqueMode: ${JSON.stringify(findUniqueMode)},\\n` +\n ` onScopeRelationWrite: ${JSON.stringify(onScopeRelationWrite)},\\n` +\n ` strictDecimal: ${JSON.stringify(strictDecimal)},\\n` +\n ` enforceProjection: ${JSON.stringify(enforceProjection)},\\n` +\n `} as const\\n`,\n )\n\n const { source: scopeSource } = emitScopeMap(dmmf, onAmbiguousScope)\n parts.push(scopeSource)\n\n const typeMapSource = emitTypeMap(dmmf)\n parts.push(typeMapSource)\n\n const { source: zodChainsSource, defaults } = emitZodChains(dmmf, onInvalidZod)\n parts.push(zodChainsSource)\n\n parts.push(emitZodDefaults(defaults))\n\n mkdirSync(output, { recursive: true })\n writeFileSync(join(output, 'index.ts'), parts.join('\\n'), 'utf-8')\n\n const clientSource = emitClient(dmmf)\n writeFileSync(join(output, 'client.ts'), clientSource, 'utf-8')\n },\n})","import type { DMMF } from '@prisma/generator-helper'\n\nfunction isScopeRoot(documentation: string | undefined): boolean {\n if (!documentation) return false\n const tokens = documentation.split(/[\\s\\n\\r]+/)\n return tokens.some(t => t === '@scope-root')\n}\n\ninterface RelationEntry {\n fks: string[]\n root: string\n relationName: string\n}\n\nexport function emitScopeMap(\n dmmf: DMMF.Document,\n onAmbiguousScope: 'error' | 'warn' | 'ignore',\n): { source: string } {\n const rootModels = new Set<string>()\n\n for (const model of dmmf.datamodel.models) {\n if (isScopeRoot(model.documentation)) {\n rootModels.add(model.name)\n }\n }\n\n const scopeMap: Record<string, { fk: string; root: string; relationName: string }[]> = {}\n\n for (const model of dmmf.datamodel.models) {\n if (rootModels.has(model.name)) continue\n\n const relations: RelationEntry[] = []\n\n for (const field of model.fields) {\n if (!field.relationFromFields || field.relationFromFields.length === 0) continue\n if (!rootModels.has(field.type)) continue\n\n if (field.relationFromFields.length > 1) {\n const msg = `Model \"${model.name}\" has a composite foreign key to scope root \"${field.type}\" via relation \"${field.name}\" ` +\n `(fields: ${field.relationFromFields.join(', ')}). Composite scope relations are not supported.`\n\n if (onAmbiguousScope === 'error') {\n throw new Error(`prisma-guard: ${msg}`)\n }\n\n if (onAmbiguousScope === 'warn') {\n console.warn(`prisma-guard: ${msg} Excluding relation \"${field.name}\" to scope root \"${field.type}\" from scope map for model \"${model.name}\".`)\n }\n\n continue\n }\n\n relations.push({\n fks: [...field.relationFromFields],\n root: field.type,\n relationName: field.name,\n })\n }\n\n if (relations.length === 0) continue\n\n const relationsByRoot: Record<string, RelationEntry[]> = {}\n for (const rel of relations) {\n if (!relationsByRoot[rel.root]) relationsByRoot[rel.root] = []\n relationsByRoot[rel.root].push(rel)\n }\n\n const entries: { fk: string; root: string; relationName: string }[] = []\n\n for (const [root, rels] of Object.entries(relationsByRoot)) {\n if (rels.length > 1) {\n const relNames = rels.map(r => r.relationName)\n const msg = `Model \"${model.name}\" has multiple relations to scope root \"${root}\" (${relNames.join(', ')}).`\n\n if (onAmbiguousScope === 'error') {\n throw new Error(\n `prisma-guard: Ambiguous scope detected. Resolve these or set onAmbiguousScope to \"warn\" or \"ignore\":\\n` +\n ` - ${msg}`,\n )\n }\n\n if (onAmbiguousScope === 'warn') {\n console.warn(`prisma-guard: ${msg} Excluding relations to scope root \"${root}\" from scope map for model \"${model.name}\".`)\n }\n\n continue\n }\n\n entries.push({\n fk: rels[0].fks[0],\n root: rels[0].root,\n relationName: rels[0].relationName,\n })\n }\n\n if (entries.length > 0) {\n scopeMap[model.name] = entries\n }\n }\n\n const roots = Array.from(rootModels).sort()\n\n const mapEntries = Object.entries(scopeMap)\n .map(([model, entries]) => {\n const entriesStr = entries\n .map(e => `{ fk: ${JSON.stringify(e.fk)}, root: ${JSON.stringify(e.root)}, relationName: ${JSON.stringify(e.relationName)} }`)\n .join(', ')\n return ` ${model}: [${entriesStr}],`\n })\n .join('\\n')\n\n const scopeRootType = roots.length > 0\n ? roots.map(r => `'${r}'`).join(' | ')\n : 'never'\n\n const source = `export const SCOPE_MAP = {\\n${mapEntries}\\n} as const\\n\\nexport type ScopeRoot = ${scopeRootType}\\n`\n\n return { source }\n}","import type { DMMF } from '@prisma/generator-helper'\nimport { z } from 'zod'\nimport { validateDirective } from './validate-directive.js'\nimport { SCALAR_BASE } from '../shared/scalar-base.js'\n\nfunction buildGenerationBase(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues?: readonly string[],\n): z.ZodTypeAny | null {\n let base: z.ZodTypeAny\n\n if (isEnum) {\n const values = enumValues && enumValues.length > 0 ? enumValues : ['__placeholder__']\n base = z.enum(values as [string, ...string[]])\n } else {\n const factory = SCALAR_BASE[fieldType]\n if (!factory) return null\n base = factory()\n }\n\n if (isList) base = z.array(base)\n\n return base\n}\n\nconst TYPE_CHANGING_METHODS = new Set([\n 'optional', 'nullable', 'nullish', 'readonly', 'default', 'catch',\n])\n\nfunction checkChainCompatibility(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues: readonly string[] | undefined,\n methods: string[],\n): string | null {\n let current = buildGenerationBase(fieldType, isList, isEnum, enumValues)\n if (!current) return null\n\n for (const method of methods) {\n if (typeof (current as any)[method] !== 'function') {\n return method\n }\n if (TYPE_CHANGING_METHODS.has(method)) {\n try {\n if (method === 'default' || method === 'catch') {\n current = (current as any)[method](undefined)\n } else {\n current = (current as any)[method]()\n }\n } catch {\n }\n }\n }\n return null\n}\n\nfunction verifyChainExecution(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues: readonly string[] | undefined,\n chainStr: string,\n): string | null {\n const base = buildGenerationBase(fieldType, isList, isEnum, enumValues)\n if (!base) return null\n\n let fn: (base: z.ZodTypeAny) => z.ZodTypeAny\n try {\n fn = new Function('base', `'use strict'; return base${chainStr}`) as (base: z.ZodTypeAny) => z.ZodTypeAny\n } catch (err: any) {\n return `syntax error: ${err.message}`\n }\n\n try {\n const result = fn(base)\n if (result === null || result === undefined || typeof result !== 'object' || typeof (result as any).parse !== 'function') {\n return 'chain did not produce a valid Zod schema'\n }\n } catch (err: any) {\n return err.message\n }\n\n return null\n}\n\nfunction findZodInDoc(documentation: string): string[] {\n return documentation.split('\\n').filter(line => {\n const trimmed = line.trim()\n return /^@zod(?:\\s|$|\\.)/.test(trimmed)\n })\n}\n\nexport function emitZodChains(\n dmmf: DMMF.Document,\n onInvalidZod: 'error' | 'warn',\n): { source: string; hasChains: boolean; defaults: Record<string, string[]> } {\n const enumNames = new Set(dmmf.datamodel.enums.map(e => e.name))\n const enumValues: Record<string, readonly string[]> = {}\n for (const e of dmmf.datamodel.enums) {\n enumValues[e.name] = e.values.map(v => v.name)\n }\n\n const modelChains: Record<string, Record<string, string>> = {}\n const defaults: Record<string, string[]> = {}\n\n for (const model of dmmf.datamodel.models) {\n for (const field of model.fields) {\n if (!field.documentation) continue\n\n const zodLines = findZodInDoc(field.documentation)\n\n if (zodLines.length === 0) continue\n if (zodLines.length > 1) {\n const msg = `prisma-guard: Multiple @zod directives on ${model.name}.${field.name}. Only one @zod per field allowed.`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const line = zodLines[0]\n const idx = line.indexOf('@zod')\n const chainStr = line.slice(idx + 4).trim()\n\n if (chainStr.length === 0) {\n const msg = `prisma-guard: Empty @zod directive on ${model.name}.${field.name}. Add a method chain (e.g. @zod .min(1)) or remove the directive.`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const result = validateDirective(chainStr)\n if (!result.valid) {\n const msg = `prisma-guard: Invalid @zod directive on ${model.name}.${field.name}: ${result.reason}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const isEnum = enumNames.has(field.type)\n const incompatible = checkChainCompatibility(\n field.type,\n field.isList,\n isEnum,\n isEnum ? enumValues[field.type] : undefined,\n result.methods,\n )\n if (incompatible) {\n const msg = `prisma-guard: @zod method \"${incompatible}\" on ${model.name}.${field.name} is not compatible with type \"${field.type}\"${field.isList ? '[]' : ''}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const execError = verifyChainExecution(\n field.type,\n field.isList,\n isEnum,\n isEnum ? enumValues[field.type] : undefined,\n chainStr,\n )\n if (execError) {\n const msg = `prisma-guard: @zod directive on ${model.name}.${field.name} fails at schema construction: ${execError}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n if (!modelChains[model.name]) modelChains[model.name] = {}\n modelChains[model.name][field.name] = chainStr\n\n if (result.methods.includes('default') || result.methods.includes('catch')) {\n if (!defaults[model.name]) defaults[model.name] = []\n defaults[model.name].push(field.name)\n }\n }\n }\n\n const hasChains = Object.keys(modelChains).length > 0\n\n if (!hasChains) {\n return { source: 'export const ZOD_CHAINS = {}\\n', hasChains: false, defaults }\n }\n\n const entries = Object.entries(modelChains)\n .map(([model, fields]) => {\n const fieldEntries = Object.entries(fields)\n .map(([field, chain]) => ` ${JSON.stringify(field)}: (base: any) => base${chain},`)\n .join('\\n')\n return ` ${JSON.stringify(model)}: {\\n${fieldEntries}\\n },`\n })\n .join('\\n')\n\n return {\n source: `export const ZOD_CHAINS = {\\n${entries}\\n}\\n`,\n hasChains: true,\n defaults,\n }\n}","const ALLOWED_ZOD_METHODS = new Set([\n 'min', 'max', 'length', 'email', 'url', 'uuid', 'cuid', 'cuid2',\n 'ulid', 'trim', 'toLowerCase', 'toUpperCase',\n 'startsWith', 'endsWith', 'includes',\n 'datetime', 'ip', 'cidr', 'date', 'time', 'duration',\n 'base64', 'nanoid', 'emoji',\n 'int', 'positive', 'nonnegative', 'negative', 'nonpositive',\n 'finite', 'safe', 'multipleOf', 'step',\n 'gt', 'gte', 'lt', 'lte',\n 'nonempty',\n 'regex',\n 'readonly',\n 'optional', 'nullable', 'nullish',\n 'default', 'catch',\n])\n\nconst METHOD_ARITY: Record<string, [number, number]> = {\n min: [1, 2], max: [1, 2], length: [1, 2],\n email: [0, 1], url: [0, 1], uuid: [0, 1], cuid: [0, 1], cuid2: [0, 1], ulid: [0, 1],\n trim: [0, 0], toLowerCase: [0, 0], toUpperCase: [0, 0],\n startsWith: [1, 2], endsWith: [1, 2], includes: [1, 2],\n datetime: [0, 1], ip: [0, 1], cidr: [0, 1], date: [0, 1], time: [0, 1], duration: [0, 1],\n base64: [0, 1], nanoid: [0, 1], emoji: [0, 1],\n int: [0, 1], positive: [0, 1], nonnegative: [0, 1], negative: [0, 1], nonpositive: [0, 1],\n finite: [0, 1], safe: [0, 1],\n multipleOf: [1, 2], step: [1, 2],\n gt: [1, 2], gte: [1, 2], lt: [1, 2], lte: [1, 2],\n nonempty: [0, 1],\n regex: [1, 2],\n readonly: [0, 0],\n optional: [0, 0], nullable: [0, 0], nullish: [0, 0],\n default: [1, 1], catch: [1, 1],\n}\n\nconst MAX_DIRECTIVE_LENGTH = 1024\nconst MAX_CHAIN_DEPTH = 20\n\ntype ValidationResult =\n | { valid: true; methods: string[] }\n | { valid: false; reason: string }\n\nexport function validateDirective(raw: string): ValidationResult {\n if (raw.length > MAX_DIRECTIVE_LENGTH) {\n return { valid: false, reason: 'Directive exceeds maximum length' }\n }\n\n const input = raw.trim()\n if (input.length === 0) {\n return { valid: false, reason: 'Empty directive' }\n }\n if (input[0] !== '.') {\n return { valid: false, reason: 'Directive must start with \".\"' }\n }\n\n let pos = 0\n let chainCount = 0\n const methods: string[] = []\n\n function peek(): string {\n return input[pos] ?? ''\n }\n\n function advance(): string {\n return input[pos++] ?? ''\n }\n\n function skipWhitespace(): void {\n while (pos < input.length && (input[pos] === ' ' || input[pos] === '\\t')) {\n pos++\n }\n }\n\n function parseString(): ValidationResult | null {\n const quote = peek()\n if (quote !== '\"' && quote !== \"'\") return null\n advance()\n while (pos < input.length) {\n const ch = input[pos]\n if (ch === '\\\\') {\n const next = input[pos + 1]\n if (next === \"'\" || next === '\"' || next === '\\\\') {\n pos += 2\n continue\n }\n return { valid: false, reason: `Invalid escape sequence \"\\\\${next ?? ''}\" in string` }\n }\n if (ch === quote) {\n advance()\n return null\n }\n if (ch.charCodeAt(0) < 32) {\n return { valid: false, reason: 'Control character in string' }\n }\n advance()\n }\n return { valid: false, reason: 'Unterminated string' }\n }\n\n function parseNumber(): ValidationResult | null {\n const start = pos\n if (peek() === '-') advance()\n if (pos >= input.length || !/[0-9]/.test(peek())) {\n pos = start\n return null\n }\n if (peek() === '0' && pos + 1 < input.length && /[0-9]/.test(input[pos + 1])) {\n return { valid: false, reason: 'Leading zeros not allowed in numbers' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n if (peek() === '.') {\n advance()\n if (!/[0-9]/.test(peek())) {\n return { valid: false, reason: 'Invalid number: expected digit after decimal point' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n }\n if (peek() === 'e' || peek() === 'E') {\n advance()\n if (peek() === '-') advance()\n if (peek() === '+') {\n return { valid: false, reason: 'Invalid number: \"+\" not allowed in exponent' }\n }\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([z.date(), z.string().datetime({ offset: true })])\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().int(),\n z\n .string()\n .regex(/^-?\\d+$/)\n .transform(Number),\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}\n","import type { DMMF } from '@prisma/generator-helper'\n\nfunction collectUniqueConstraints(model: DMMF.Model): string[][] {\n const seen = new Set<string>()\n const constraints: string[][] = []\n\n function add(fields: string[]) {\n const key = fields.join('\\0')\n if (seen.has(key)) return\n seen.add(key)\n constraints.push(fields)\n }\n\n for (const field of model.fields) {\n if (field.isId) add([field.name])\n }\n\n if (model.primaryKey) {\n add([...model.primaryKey.fields])\n }\n\n for (const field of model.fields) {\n if (field.isUnique) add([field.name])\n }\n\n for (const fields of model.uniqueFields) {\n add([...fields])\n }\n\n return constraints\n}\n\nexport function emitTypeMap(dmmf: DMMF.Document): string {\n const enumNames = new Set(dmmf.datamodel.enums.map(e => e.name))\n\n for (const e of dmmf.datamodel.enums) {\n if (e.values.length === 0) {\n throw new Error(`prisma-guard: Enum \"${e.name}\" has zero values.`)\n }\n }\n\n const modelEntries = dmmf.datamodel.models\n .map(model => {\n const fieldEntries = model.fields\n .map(field => {\n const isRelation = field.kind === 'object' || field.relationName != null\n const isEnum = enumNames.has(field.type)\n const isUnsupported = field.kind === 'unsupported'\n const meta: string[] = [\n `type: ${JSON.stringify(field.type)}`,\n `isList: ${field.isList}`,\n `isRequired: ${field.isRequired}`,\n `isId: ${field.isId}`,\n `isRelation: ${isRelation}`,\n `hasDefault: ${field.hasDefaultValue}`,\n `isUpdatedAt: ${field.isUpdatedAt}`,\n ]\n if (isEnum) meta.push(`isEnum: true`)\n if (isUnsupported) meta.push(`isUnsupported: true`)\n if (field.isUnique) meta.push(`isUnique: true`)\n return ` ${JSON.stringify(field.name)}: { ${meta.join(', ')} },`\n })\n .join('\\n')\n return ` ${JSON.stringify(model.name)}: {\\n${fieldEntries}\\n },`\n })\n .join('\\n')\n\n const enumEntries = dmmf.datamodel.enums\n .map(e => {\n const values = e.values.map(v => JSON.stringify(v.name)).join(', ')\n return ` ${JSON.stringify(e.name)}: [${values}],`\n })\n .join('\\n')\n\n const uniqueMapEntries = dmmf.datamodel.models\n .map(model => {\n const constraints = collectUniqueConstraints(model)\n if (constraints.length === 0) return null\n const constraintsStr = constraints\n .map(c => `[${c.map(f => JSON.stringify(f)).join(', ')}]`)\n .join(', ')\n return ` ${JSON.stringify(model.name)}: [${constraintsStr}],`\n })\n .filter(Boolean)\n .join('\\n')\n\n const typeMapSource = `export const TYPE_MAP = {\\n${modelEntries}\\n} as const\\n`\n const enumMapSource = `export const ENUM_MAP = {\\n${enumEntries}\\n} as const\\n`\n const uniqueMapSource = `export const UNIQUE_MAP = {\\n${uniqueMapEntries}\\n} as const\\n`\n\n const typesSource = [\n `export type ModelName = keyof typeof TYPE_MAP`,\n `export type FieldName<M extends ModelName> = keyof (typeof TYPE_MAP)[M]`,\n ].join('\\n')\n\n return `${typeMapSource}\\n${enumMapSource}\\n${uniqueMapSource}\\n${typesSource}\\n`\n}","export const SHAPE_CONFIG_KEYS = new Set([\n 'where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip',\n 'distinct', 'having', '_count', '_avg', '_sum', '_min', '_max', 'by',\n])\n\nexport const GUARD_SHAPE_KEYS = new Set([\n 'data', 'create', 'update', ...SHAPE_CONFIG_KEYS,\n])\n\nexport const COMBINATOR_KEYS = new Set(['AND', 'OR', 'NOT'])\n\nexport const TO_MANY_RELATION_OPS = new Set(['some', 'every', 'none'])\nexport const TO_ONE_RELATION_OPS = new Set(['is', 'isNot'])\nexport const ALL_RELATION_OPS = new Set([...TO_MANY_RELATION_OPS, ...TO_ONE_RELATION_OPS])\n\nexport function toDelegateKey(modelName: string): string {\n return modelName[0].toLowerCase() + modelName.slice(1)\n}\n\nconst FORCED_MARKER = Symbol.for('prisma-guard.forced')\n\nexport function isForcedValue(v: unknown): v is { value: unknown } {\n return v !== null && typeof v === 'object' && (v as any)[FORCED_MARKER] === true\n}\n\nexport function force<T>(value: T): { value: T } {\n const wrapper: any = { value }\n wrapper[FORCED_MARKER] = true\n return wrapper\n}\n\nconst UNSUPPORTED_MARKER = Symbol.for('prisma-guard.unsupported')\n\nexport function isUnsupportedMarker(v: unknown): boolean {\n return v !== null && typeof v === 'object' && (v as any)[UNSUPPORTED_MARKER] === true\n}\n\nexport function unsupported(): { __brand: 'unsupported' } {\n const marker: any = {}\n marker[UNSUPPORTED_MARKER] = true\n return marker\n}","import type { DMMF } from '@prisma/generator-helper'\nimport { toDelegateKey } from '../shared/constants.js'\n\nexport function emitClient(dmmf: DMMF.Document): string {\n const modelEntries = dmmf.datamodel.models\n .map(model => {\n const key = toDelegateKey(model.name)\n return ` ${key}: {\\n guard(input: GuardInput, caller?: string): GuardedModel<PrismaClient['${key}']>\\n }`\n })\n .join('\\n')\n\n return (\n `import type { PrismaClient } from '@prisma/client'\\n` +\n `import type { GuardInput, GuardedModel } from 'prisma-guard'\\n` +\n `import { createGuard } from 'prisma-guard'\\n` +\n `import { SCOPE_MAP, TYPE_MAP, ENUM_MAP, ZOD_CHAINS, GUARD_CONFIG, UNIQUE_MAP, ZOD_DEFAULTS } from './index'\\n` +\n `import type { ScopeRoot } from './index'\\n\\n` +\n `interface GuardModelExtension {\\n${modelEntries}\\n}\\n\\n` +\n `export const guard = createGuard<typeof TYPE_MAP, ScopeRoot, GuardModelExtension>({\\n` +\n ` scopeMap: SCOPE_MAP,\\n` +\n ` typeMap: TYPE_MAP,\\n` +\n ` enumMap: ENUM_MAP,\\n` +\n ` zodChains: ZOD_CHAINS,\\n` +\n ` guardConfig: GUARD_CONFIG,\\n` +\n ` uniqueMap: UNIQUE_MAP,\\n` +\n ` zodDefaults: ZOD_DEFAULTS,\\n` +\n `})\\n`\n )\n}"],"mappings":"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","names":["z","z"]}
1
+ {"version":3,"sources":["../../src/generator/index.ts","../../src/generator/emit-scope-map.ts","../../src/generator/emit-zod-chains.ts","../../src/generator/validate-directive.ts","../../src/shared/scalar-base.ts","../../src/generator/emit-type-map.ts","../../src/shared/constants.ts","../../src/generator/emit-client.ts"],"sourcesContent":["import pkg from '@prisma/generator-helper'\nconst { generatorHandler } = pkg\nimport type { DMMF } from '@prisma/generator-helper'\nimport { writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { emitScopeMap } from './emit-scope-map.js'\nimport { emitZodChains } from './emit-zod-chains.js'\nimport { emitTypeMap } from './emit-type-map.js'\nimport { emitClient } from './emit-client.js'\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'])\n\nfunction validateConfigEnum<T extends string>(\n name: string,\n value: string,\n allowed: Set<T>,\n): T {\n if (!allowed.has(value as T)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"${name}\": \"${value}\". Allowed values: ${[...allowed].join(', ')}`,\n )\n }\n return value as T\n}\n\nfunction validateBooleanConfig(name: string, raw: string | undefined, fallback: boolean): boolean {\n const value = raw ?? (fallback ? 'true' : 'false')\n if (!VALID_BOOLEAN_CONFIG.has(value)) {\n throw new Error(\n `prisma-guard: Invalid generator config \"${name}\": \"${value}\". Allowed values: true, false`,\n )\n }\n return value === 'true'\n}\n\nfunction emitZodDefaults(defaults: Record<string, string[]>): string {\n const entries = Object.entries(defaults)\n if (entries.length === 0) {\n return `export const ZOD_DEFAULTS: Record<string, readonly string[]> = {}\\n`\n }\n const mapEntries = entries\n .map(([model, fields]) => {\n const fieldsStr = fields.map(f => JSON.stringify(f)).join(', ')\n return ` ${JSON.stringify(model)}: [${fieldsStr}],`\n })\n .join('\\n')\n return `export const ZOD_DEFAULTS: Record<string, readonly string[]> = {\\n${mapEntries}\\n}\\n`\n}\n\ngeneratorHandler({\n onManifest() {\n return {\n prettyName: 'Prisma Guard',\n defaultOutput: 'generated/guard',\n }\n },\n\n async onGenerate(options) {\n const output = options.generator.output?.value\n if (!output) throw new Error('prisma-guard: No output directory specified')\n\n const config = options.generator.config ?? {}\n const onInvalidZod = validateConfigEnum('onInvalidZod', (config.onInvalidZod as string) ?? 'error', VALID_ON_INVALID_ZOD)\n const onAmbiguousScope = validateConfigEnum('onAmbiguousScope', (config.onAmbiguousScope as string) ?? 'error', VALID_ON_AMBIGUOUS_SCOPE)\n const onMissingScopeContext = validateConfigEnum('onMissingScopeContext', (config.onMissingScopeContext as string) ?? 'error', VALID_ON_MISSING_SCOPE_CONTEXT)\n const findUniqueMode = validateConfigEnum('findUniqueMode', (config.findUniqueMode as string) ?? 'reject', VALID_FIND_UNIQUE_MODE)\n const onScopeRelationWrite = validateConfigEnum('onScopeRelationWrite', (config.onScopeRelationWrite as string) ?? 'error', VALID_ON_SCOPE_RELATION_WRITE)\n const strictDecimal = validateBooleanConfig('strictDecimal', config.strictDecimal as string | undefined, false)\n const enforceProjection = validateBooleanConfig('enforceProjection', config.enforceProjection as string | undefined, false)\n\n const dmmf = options.dmmf\n\n const parts: string[] = []\n\n parts.push(\n `export const GUARD_CONFIG = {\\n` +\n ` onMissingScopeContext: ${JSON.stringify(onMissingScopeContext)},\\n` +\n ` findUniqueMode: ${JSON.stringify(findUniqueMode)},\\n` +\n ` onScopeRelationWrite: ${JSON.stringify(onScopeRelationWrite)},\\n` +\n ` strictDecimal: ${JSON.stringify(strictDecimal)},\\n` +\n ` enforceProjection: ${JSON.stringify(enforceProjection)},\\n` +\n `} as const\\n`,\n )\n\n const { source: scopeSource } = emitScopeMap(dmmf, onAmbiguousScope)\n parts.push(scopeSource)\n\n const typeMapSource = emitTypeMap(dmmf)\n parts.push(typeMapSource)\n\n const { source: zodChainsSource, defaults } = emitZodChains(dmmf, onInvalidZod)\n parts.push(zodChainsSource)\n\n parts.push(emitZodDefaults(defaults))\n\n mkdirSync(output, { recursive: true })\n writeFileSync(join(output, 'index.ts'), parts.join('\\n'), 'utf-8')\n\n const clientSource = emitClient(dmmf)\n writeFileSync(join(output, 'client.ts'), clientSource, 'utf-8')\n },\n})","import type { DMMF } from '@prisma/generator-helper'\n\nfunction isScopeRoot(documentation: string | undefined): boolean {\n if (!documentation) return false\n const tokens = documentation.split(/[\\s\\n\\r]+/)\n return tokens.some(t => t === '@scope-root')\n}\n\ninterface RelationEntry {\n fks: string[]\n root: string\n relationName: string\n}\n\nexport function emitScopeMap(\n dmmf: DMMF.Document,\n onAmbiguousScope: 'error' | 'warn' | 'ignore',\n): { source: string } {\n const rootModels = new Set<string>()\n\n for (const model of dmmf.datamodel.models) {\n if (isScopeRoot(model.documentation)) {\n rootModels.add(model.name)\n }\n }\n\n const scopeMap: Record<string, { fk: string; root: string; relationName: string }[]> = {}\n\n for (const model of dmmf.datamodel.models) {\n if (rootModels.has(model.name)) continue\n\n const relations: RelationEntry[] = []\n\n for (const field of model.fields) {\n if (!field.relationFromFields || field.relationFromFields.length === 0) continue\n if (!rootModels.has(field.type)) continue\n\n if (field.relationFromFields.length > 1) {\n const msg = `Model \"${model.name}\" has a composite foreign key to scope root \"${field.type}\" via relation \"${field.name}\" ` +\n `(fields: ${field.relationFromFields.join(', ')}). Composite scope relations are not supported.`\n\n if (onAmbiguousScope === 'error') {\n throw new Error(`prisma-guard: ${msg}`)\n }\n\n if (onAmbiguousScope === 'warn') {\n console.warn(`prisma-guard: ${msg} Excluding relation \"${field.name}\" to scope root \"${field.type}\" from scope map for model \"${model.name}\".`)\n }\n\n continue\n }\n\n relations.push({\n fks: [...field.relationFromFields],\n root: field.type,\n relationName: field.name,\n })\n }\n\n if (relations.length === 0) continue\n\n const relationsByRoot: Record<string, RelationEntry[]> = {}\n for (const rel of relations) {\n if (!relationsByRoot[rel.root]) relationsByRoot[rel.root] = []\n relationsByRoot[rel.root].push(rel)\n }\n\n const entries: { fk: string; root: string; relationName: string }[] = []\n\n for (const [root, rels] of Object.entries(relationsByRoot)) {\n if (rels.length > 1) {\n const relNames = rels.map(r => r.relationName)\n const msg = `Model \"${model.name}\" has multiple relations to scope root \"${root}\" (${relNames.join(', ')}).`\n\n if (onAmbiguousScope === 'error') {\n throw new Error(\n `prisma-guard: Ambiguous scope detected. Resolve these or set onAmbiguousScope to \"warn\" or \"ignore\":\\n` +\n ` - ${msg}`,\n )\n }\n\n if (onAmbiguousScope === 'warn') {\n console.warn(`prisma-guard: ${msg} Excluding relations to scope root \"${root}\" from scope map for model \"${model.name}\".`)\n }\n\n continue\n }\n\n entries.push({\n fk: rels[0].fks[0],\n root: rels[0].root,\n relationName: rels[0].relationName,\n })\n }\n\n if (entries.length > 0) {\n scopeMap[model.name] = entries\n }\n }\n\n const roots = Array.from(rootModels).sort()\n\n const mapEntries = Object.entries(scopeMap)\n .map(([model, entries]) => {\n const entriesStr = entries\n .map(e => `{ fk: ${JSON.stringify(e.fk)}, root: ${JSON.stringify(e.root)}, relationName: ${JSON.stringify(e.relationName)} }`)\n .join(', ')\n return ` ${model}: [${entriesStr}],`\n })\n .join('\\n')\n\n const scopeRootType = roots.length > 0\n ? roots.map(r => `'${r}'`).join(' | ')\n : 'never'\n\n const source = `export const SCOPE_MAP = {\\n${mapEntries}\\n} as const\\n\\nexport type ScopeRoot = ${scopeRootType}\\n`\n\n return { source }\n}","import type { DMMF } from '@prisma/generator-helper'\nimport { z } from 'zod'\nimport { validateDirective } from './validate-directive.js'\nimport { SCALAR_BASE } from '../shared/scalar-base.js'\n\nfunction buildGenerationBase(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues?: readonly string[],\n): z.ZodTypeAny | null {\n let base: z.ZodTypeAny\n\n if (isEnum) {\n const values = enumValues && enumValues.length > 0 ? enumValues : ['__placeholder__']\n base = z.enum(values as [string, ...string[]])\n } else {\n const factory = SCALAR_BASE[fieldType]\n if (!factory) return null\n base = factory()\n }\n\n if (isList) base = z.array(base)\n\n return base\n}\n\nconst TYPE_CHANGING_METHODS = new Set([\n 'optional', 'nullable', 'nullish', 'readonly', 'default', 'catch',\n])\n\nfunction checkChainCompatibility(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues: readonly string[] | undefined,\n methods: string[],\n): string | null {\n let current = buildGenerationBase(fieldType, isList, isEnum, enumValues)\n if (!current) return null\n\n for (const method of methods) {\n if (typeof (current as any)[method] !== 'function') {\n return method\n }\n if (TYPE_CHANGING_METHODS.has(method)) {\n try {\n if (method === 'default' || method === 'catch') {\n current = (current as any)[method](undefined)\n } else {\n current = (current as any)[method]()\n }\n } catch {\n }\n }\n }\n return null\n}\n\nfunction verifyChainExecution(\n fieldType: string,\n isList: boolean,\n isEnum: boolean,\n enumValues: readonly string[] | undefined,\n chainStr: string,\n): string | null {\n const base = buildGenerationBase(fieldType, isList, isEnum, enumValues)\n if (!base) return null\n\n let fn: (base: z.ZodTypeAny) => z.ZodTypeAny\n try {\n fn = new Function('base', `'use strict'; return base${chainStr}`) as (base: z.ZodTypeAny) => z.ZodTypeAny\n } catch (err: any) {\n return `syntax error: ${err.message}`\n }\n\n try {\n const result = fn(base)\n if (result === null || result === undefined || typeof result !== 'object' || typeof (result as any).parse !== 'function') {\n return 'chain did not produce a valid Zod schema'\n }\n } catch (err: any) {\n return err.message\n }\n\n return null\n}\n\nfunction findZodInDoc(documentation: string): string[] {\n return documentation.split('\\n').filter(line => {\n const trimmed = line.trim()\n return /^@zod(?:\\s|$|\\.)/.test(trimmed)\n })\n}\n\nexport function emitZodChains(\n dmmf: DMMF.Document,\n onInvalidZod: 'error' | 'warn',\n): { source: string; hasChains: boolean; defaults: Record<string, string[]> } {\n const enumNames = new Set(dmmf.datamodel.enums.map(e => e.name))\n const enumValues: Record<string, readonly string[]> = {}\n for (const e of dmmf.datamodel.enums) {\n enumValues[e.name] = e.values.map(v => v.name)\n }\n\n const modelChains: Record<string, Record<string, string>> = {}\n const defaults: Record<string, string[]> = {}\n\n for (const model of dmmf.datamodel.models) {\n for (const field of model.fields) {\n if (!field.documentation) continue\n\n const zodLines = findZodInDoc(field.documentation)\n\n if (zodLines.length === 0) continue\n if (zodLines.length > 1) {\n const msg = `prisma-guard: Multiple @zod directives on ${model.name}.${field.name}. Only one @zod per field allowed.`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const line = zodLines[0]\n const idx = line.indexOf('@zod')\n const chainStr = line.slice(idx + 4).trim()\n\n if (chainStr.length === 0) {\n const msg = `prisma-guard: Empty @zod directive on ${model.name}.${field.name}. Add a method chain (e.g. @zod .min(1)) or remove the directive.`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const result = validateDirective(chainStr)\n if (!result.valid) {\n const msg = `prisma-guard: Invalid @zod directive on ${model.name}.${field.name}: ${result.reason}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const isEnum = enumNames.has(field.type)\n const incompatible = checkChainCompatibility(\n field.type,\n field.isList,\n isEnum,\n isEnum ? enumValues[field.type] : undefined,\n result.methods,\n )\n if (incompatible) {\n const msg = `prisma-guard: @zod method \"${incompatible}\" on ${model.name}.${field.name} is not compatible with type \"${field.type}\"${field.isList ? '[]' : ''}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n const execError = verifyChainExecution(\n field.type,\n field.isList,\n isEnum,\n isEnum ? enumValues[field.type] : undefined,\n chainStr,\n )\n if (execError) {\n const msg = `prisma-guard: @zod directive on ${model.name}.${field.name} fails at schema construction: ${execError}`\n if (onInvalidZod === 'error') {\n throw new Error(msg)\n }\n console.warn(msg)\n continue\n }\n\n if (!modelChains[model.name]) modelChains[model.name] = {}\n modelChains[model.name][field.name] = chainStr\n\n if (result.methods.includes('default') || result.methods.includes('catch')) {\n if (!defaults[model.name]) defaults[model.name] = []\n defaults[model.name].push(field.name)\n }\n }\n }\n\n const hasChains = Object.keys(modelChains).length > 0\n\n if (!hasChains) {\n return { source: 'export const ZOD_CHAINS = {}\\n', hasChains: false, defaults }\n }\n\n const entries = Object.entries(modelChains)\n .map(([model, fields]) => {\n const fieldEntries = Object.entries(fields)\n .map(([field, chain]) => ` ${JSON.stringify(field)}: (base: any) => base${chain},`)\n .join('\\n')\n return ` ${JSON.stringify(model)}: {\\n${fieldEntries}\\n },`\n })\n .join('\\n')\n\n return {\n source: `export const ZOD_CHAINS = {\\n${entries}\\n}\\n`,\n hasChains: true,\n defaults,\n }\n}","const ALLOWED_ZOD_METHODS = new Set([\n 'min', 'max', 'length', 'email', 'url', 'uuid', 'cuid', 'cuid2',\n 'ulid', 'trim', 'toLowerCase', 'toUpperCase',\n 'startsWith', 'endsWith', 'includes',\n 'datetime', 'ip', 'cidr', 'date', 'time', 'duration',\n 'base64', 'nanoid', 'emoji',\n 'int', 'positive', 'nonnegative', 'negative', 'nonpositive',\n 'finite', 'safe', 'multipleOf', 'step',\n 'gt', 'gte', 'lt', 'lte',\n 'nonempty',\n 'regex',\n 'readonly',\n 'optional', 'nullable', 'nullish',\n 'default', 'catch',\n])\n\nconst METHOD_ARITY: Record<string, [number, number]> = {\n min: [1, 2], max: [1, 2], length: [1, 2],\n email: [0, 1], url: [0, 1], uuid: [0, 1], cuid: [0, 1], cuid2: [0, 1], ulid: [0, 1],\n trim: [0, 0], toLowerCase: [0, 0], toUpperCase: [0, 0],\n startsWith: [1, 2], endsWith: [1, 2], includes: [1, 2],\n datetime: [0, 1], ip: [0, 1], cidr: [0, 1], date: [0, 1], time: [0, 1], duration: [0, 1],\n base64: [0, 1], nanoid: [0, 1], emoji: [0, 1],\n int: [0, 1], positive: [0, 1], nonnegative: [0, 1], negative: [0, 1], nonpositive: [0, 1],\n finite: [0, 1], safe: [0, 1],\n multipleOf: [1, 2], step: [1, 2],\n gt: [1, 2], gte: [1, 2], lt: [1, 2], lte: [1, 2],\n nonempty: [0, 1],\n regex: [1, 2],\n readonly: [0, 0],\n optional: [0, 0], nullable: [0, 0], nullish: [0, 0],\n default: [1, 1], catch: [1, 1],\n}\n\nconst MAX_DIRECTIVE_LENGTH = 1024\nconst MAX_CHAIN_DEPTH = 20\n\ntype ValidationResult =\n | { valid: true; methods: string[] }\n | { valid: false; reason: string }\n\nexport function validateDirective(raw: string): ValidationResult {\n if (raw.length > MAX_DIRECTIVE_LENGTH) {\n return { valid: false, reason: 'Directive exceeds maximum length' }\n }\n\n const input = raw.trim()\n if (input.length === 0) {\n return { valid: false, reason: 'Empty directive' }\n }\n if (input[0] !== '.') {\n return { valid: false, reason: 'Directive must start with \".\"' }\n }\n\n let pos = 0\n let chainCount = 0\n const methods: string[] = []\n\n function peek(): string {\n return input[pos] ?? ''\n }\n\n function advance(): string {\n return input[pos++] ?? ''\n }\n\n function skipWhitespace(): void {\n while (pos < input.length && (input[pos] === ' ' || input[pos] === '\\t')) {\n pos++\n }\n }\n\n function parseString(): ValidationResult | null {\n const quote = peek()\n if (quote !== '\"' && quote !== \"'\") return null\n advance()\n while (pos < input.length) {\n const ch = input[pos]\n if (ch === '\\\\') {\n const next = input[pos + 1]\n if (next === \"'\" || next === '\"' || next === '\\\\') {\n pos += 2\n continue\n }\n return { valid: false, reason: `Invalid escape sequence \"\\\\${next ?? ''}\" in string` }\n }\n if (ch === quote) {\n advance()\n return null\n }\n if (ch.charCodeAt(0) < 32) {\n return { valid: false, reason: 'Control character in string' }\n }\n advance()\n }\n return { valid: false, reason: 'Unterminated string' }\n }\n\n function parseNumber(): ValidationResult | null {\n const start = pos\n if (peek() === '-') advance()\n if (pos >= input.length || !/[0-9]/.test(peek())) {\n pos = start\n return null\n }\n if (peek() === '0' && pos + 1 < input.length && /[0-9]/.test(input[pos + 1])) {\n return { valid: false, reason: 'Leading zeros not allowed in numbers' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n if (peek() === '.') {\n advance()\n if (!/[0-9]/.test(peek())) {\n return { valid: false, reason: 'Invalid number: expected digit after decimal point' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n }\n if (peek() === 'e' || peek() === 'E') {\n advance()\n if (peek() === '-' || peek() === '+') advance()\n if (!/[0-9]/.test(peek())) {\n return { valid: false, reason: 'Invalid number: expected digit in exponent' }\n }\n while (pos < input.length && /[0-9]/.test(peek())) advance()\n }\n return null\n }\n\n function parseRegex(): ValidationResult | null {\n advance()\n if (peek() === '/' || peek() === '*') {\n return { valid: false, reason: 'Empty or comment-like regex pattern' }\n }\n let inCharClass = false\n while (pos < input.length) {\n const ch = input[pos]\n if (ch === '\\\\') {\n if (pos + 1 >= input.length) {\n return { valid: false, reason: 'Unterminated escape in regex' }\n }\n pos += 2\n continue\n }\n if (ch === '[' && !inCharClass) {\n inCharClass = true\n pos++\n continue\n }\n if (ch === ']' && inCharClass) {\n inCharClass = false\n pos++\n continue\n }\n if (ch === '/' && !inCharClass) {\n advance()\n while (pos < input.length && /[gimsuydv]/.test(peek())) {\n advance()\n }\n return null\n }\n if (ch.charCodeAt(0) < 32 && ch !== '\\t') {\n return { valid: false, reason: 'Control character in regex' }\n }\n pos++\n }\n return { valid: false, reason: 'Unterminated regex literal' }\n }\n\n function parseObjectKey(): ValidationResult | null {\n skipWhitespace()\n const ch = peek()\n if (ch === '\"' || ch === \"'\") {\n return parseString()\n }\n if (/[a-zA-Z_]/.test(ch)) {\n while (pos < input.length && /[a-zA-Z0-9_]/.test(peek())) {\n advance()\n }\n return null\n }\n return { valid: false, reason: 'Expected object key (identifier or string)' }\n }\n\n function parseArg(): ValidationResult | null {\n skipWhitespace()\n const ch = peek()\n\n if (ch === '}') {\n return { valid: false, reason: 'Unexpected \"}\" in directive args' }\n }\n if (ch === '`') {\n return { valid: false, reason: 'Template literals not allowed in directive args' }\n }\n if (ch !== '' && ch.charCodeAt(0) < 32) {\n return { valid: false, reason: 'Control character not allowed outside strings' }\n }\n\n if (ch === '\"' || ch === \"'\") {\n return parseString()\n }\n\n if (ch === '/') {\n return parseRegex()\n }\n\n if (ch === '{') {\n advance()\n skipWhitespace()\n if (peek() === '}') {\n advance()\n return null\n }\n const keyErr = parseObjectKey()\n if (keyErr) return keyErr\n skipWhitespace()\n if (peek() !== ':') {\n return { valid: false, reason: 'Expected \":\" after object key' }\n }\n advance()\n const valErr = parseArg()\n if (valErr) return valErr\n skipWhitespace()\n while (peek() === ',') {\n advance()\n skipWhitespace()\n if (peek() === '}') break\n const nextKeyErr = parseObjectKey()\n if (nextKeyErr) return nextKeyErr\n skipWhitespace()\n if (peek() !== ':') {\n return { valid: false, reason: 'Expected \":\" after object key' }\n }\n advance()\n const nextValErr = parseArg()\n if (nextValErr) return nextValErr\n skipWhitespace()\n }\n if (peek() !== '}') {\n return { valid: false, reason: 'Expected \"}\" to close object' }\n }\n advance()\n return null\n }\n\n if (ch === '[') {\n advance()\n skipWhitespace()\n if (peek() === ']') {\n advance()\n return null\n }\n const firstErr = parseArg()\n if (firstErr) return firstErr\n skipWhitespace()\n while (peek() === ',') {\n advance()\n skipWhitespace()\n if (peek() === ']') break\n const elemErr = parseArg()\n if (elemErr) return elemErr\n skipWhitespace()\n }\n if (peek() !== ']') {\n return { valid: false, reason: 'Expected \"]\" to close array' }\n }\n advance()\n return null\n }\n\n if (ch === '-' || /[0-9]/.test(ch)) {\n return parseNumber()\n }\n\n if (input.startsWith('true', pos)) {\n const after = input[pos + 4]\n if (!after || !/[a-zA-Z0-9_]/.test(after)) {\n pos += 4\n return null\n }\n }\n if (input.startsWith('false', pos)) {\n const after = input[pos + 5]\n if (!after || !/[a-zA-Z0-9_]/.test(after)) {\n pos += 5\n return null\n }\n }\n\n if (input.startsWith('NaN', pos)) {\n return { valid: false, reason: 'NaN not allowed' }\n }\n if (input.startsWith('Infinity', pos)) {\n return { valid: false, reason: 'Infinity not allowed' }\n }\n if (input.startsWith('null', pos)) {\n return { valid: false, reason: 'null not allowed as argument value' }\n }\n if (ch === '+') {\n return { valid: false, reason: '\"+\" prefix not allowed on numbers' }\n }\n\n if (/[a-zA-Z_]/.test(ch)) {\n return { valid: false, reason: 'Identifiers not allowed as argument values' }\n }\n\n return { valid: false, reason: `Unexpected character \"${ch}\"` }\n }\n\n while (pos < input.length) {\n skipWhitespace()\n if (pos >= input.length) break\n\n if (peek() !== '.') {\n return { valid: false, reason: `Expected \".\" at position ${pos}, got \"${peek()}\"` }\n }\n advance()\n\n if (!/[a-zA-Z_]/.test(peek())) {\n return { valid: false, reason: `Expected method name after \".\" at position ${pos}` }\n }\n\n let ident = ''\n while (pos < input.length && /[a-zA-Z0-9_]/.test(peek())) {\n ident += advance()\n }\n\n if (!ALLOWED_ZOD_METHODS.has(ident)) {\n return { valid: false, reason: `Unknown zod method: ${ident}` }\n }\n\n skipWhitespace()\n\n if (peek() !== '(') {\n return { valid: false, reason: `Expected \"(\" after method \"${ident}\"` }\n }\n advance()\n\n skipWhitespace()\n\n let argCount = 0\n if (peek() !== ')') {\n const argErr = parseArg()\n if (argErr) return argErr\n argCount = 1\n skipWhitespace()\n while (peek() === ',') {\n advance()\n skipWhitespace()\n if (peek() === ')') break\n const nextArgErr = parseArg()\n if (nextArgErr) return nextArgErr\n argCount++\n skipWhitespace()\n }\n }\n\n if (peek() !== ')') {\n return { valid: false, reason: `Expected \")\" to close method \"${ident}\"` }\n }\n advance()\n\n const arity = METHOD_ARITY[ident]\n if (arity) {\n const [minArgs, maxArgs] = arity\n if (argCount < minArgs || argCount > maxArgs) {\n if (minArgs === maxArgs) {\n return { valid: false, reason: `Method \"${ident}\" expects ${minArgs} argument(s), got ${argCount}` }\n }\n return { valid: false, reason: `Method \"${ident}\" expects ${minArgs}-${maxArgs} arguments, got ${argCount}` }\n }\n }\n\n methods.push(ident)\n chainCount++\n if (chainCount > MAX_CHAIN_DEPTH) {\n return { valid: false, reason: 'Directive exceeds maximum chain depth' }\n }\n }\n\n if (chainCount === 0) {\n return { valid: false, reason: 'No method calls found' }\n }\n\n return { valid: true, methods }\n}","import { z } from \"zod\";\n\nexport type ScalarBaseMap = Record<string, () => z.ZodTypeAny>;\n\nfunction isJsonSafe(value: unknown): boolean {\n type Entry = { tag: \"visit\"; value: unknown } | { tag: \"exit\"; ref: object };\n\n const stack: Entry[] = [{ tag: \"visit\", value }];\n const ancestors = new Set<object>();\n\n while (stack.length > 0) {\n const entry = stack.pop()!;\n\n if (entry.tag === \"exit\") {\n ancestors.delete(entry.ref);\n continue;\n }\n\n const current = entry.value;\n\n if (current === undefined) return false;\n if (current === null) continue;\n\n switch (typeof current) {\n case \"string\":\n case \"boolean\":\n continue;\n case \"number\":\n if (!Number.isFinite(current)) return false;\n continue;\n case \"object\": {\n if (ancestors.has(current)) return false;\n ancestors.add(current);\n stack.push({ tag: \"exit\", ref: current });\n if (Array.isArray(current)) {\n for (let i = 0; i < current.length; i++) {\n stack.push({ tag: \"visit\", value: current[i] });\n }\n continue;\n }\n const proto = Object.getPrototypeOf(current);\n if (proto !== Object.prototype && proto !== null) return false;\n const values = Object.values(current as Record<string, unknown>);\n for (let i = 0; i < values.length; i++) {\n stack.push({ tag: \"visit\", value: values[i] });\n }\n continue;\n }\n default:\n return false;\n }\n }\n\n return true;\n}\n\nconst DECIMAL_REGEX = /^-?(\\d+\\.?\\d*|\\.\\d+)([eE]-?\\d+)?$/;\n\nconst decimalStringSchema = z\n .string()\n .refine((s) => DECIMAL_REGEX.test(s), \"Invalid decimal string\");\n\nconst decimalObjectSchema = z.custom<unknown>(\n (v) =>\n v !== null &&\n typeof v === \"object\" &&\n typeof (v as any).toFixed === \"function\" &&\n typeof (v as any).toNumber === \"function\",\n \"Expected Decimal-compatible object\",\n);\n\nfunction createDecimalFactory(strict: boolean): () => z.ZodTypeAny {\n if (strict) {\n return () => z.union([decimalStringSchema, decimalObjectSchema]);\n }\n return () => z.union([z.number(), decimalStringSchema, decimalObjectSchema]);\n}\n\nexport function createScalarBase(strictDecimal: boolean): ScalarBaseMap {\n return {\n String: () => z.string(),\n Int: () => z.number().int(),\n Float: () => z.number(),\n Decimal: createDecimalFactory(strictDecimal),\n BigInt: () =>\n z.union([\n z.bigint(),\n z\n .number()\n .int()\n .refine(\n (v) => v >= Number.MIN_SAFE_INTEGER && v <= Number.MAX_SAFE_INTEGER,\n \"Number exceeds safe integer range for BigInt conversion\",\n )\n .transform((v) => BigInt(v)),\n z\n .string()\n .regex(/^-?\\d+$/)\n .transform((v) => BigInt(v)),\n ]),\n Boolean: () => z.boolean(),\n DateTime: () =>\n z\n .union([\n z.date(),\n z.string().refine(\n (s) => !isNaN(Date.parse(s)),\n \"Invalid date string\",\n ),\n ])\n .pipe(z.coerce.date()),\n Json: () =>\n z\n .unknown()\n .refine(\n isJsonSafe,\n \"Value must be JSON-serializable (no undefined, functions, symbols, class instances, NaN, Infinity, or circular references)\",\n ),\n Bytes: () =>\n z.union([z.string(), z.custom<unknown>((v) => v instanceof Uint8Array)]),\n };\n}\n\nexport const SCALAR_BASE: ScalarBaseMap = createScalarBase(false);\n\nexport function wrapWithInputCoercion(\n fieldType: string,\n isList: boolean,\n schema: z.ZodTypeAny,\n): z.ZodTypeAny {\n let itemCoercion: z.ZodTypeAny | null = null;\n\n switch (fieldType) {\n case \"String\":\n itemCoercion = z.union([z.string(), z.number().transform(String)]);\n break;\n case \"Int\":\n itemCoercion = z.union([\n z.number().transform((v) => Math.trunc(v)).pipe(z.number().int()),\n z\n .string()\n .regex(/^-?\\d+(\\.\\d+)?$/)\n .transform((v) => Math.trunc(Number(v))),\n ]);\n break;\n case \"Float\":\n itemCoercion = z.union([\n z.number(),\n z\n .string()\n .regex(/^-?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/)\n .transform(Number),\n ]);\n break;\n default:\n return schema;\n }\n\n const coercion = isList ? z.array(itemCoercion) : itemCoercion;\n return coercion.pipe(schema);\n}","import type { DMMF } from '@prisma/generator-helper'\n\nfunction collectUniqueConstraints(model: DMMF.Model): string[][] {\n const seen = new Set<string>()\n const constraints: string[][] = []\n\n function add(fields: string[]) {\n const key = fields.join('\\0')\n if (seen.has(key)) return\n seen.add(key)\n constraints.push(fields)\n }\n\n for (const field of model.fields) {\n if (field.isId) add([field.name])\n }\n\n if (model.primaryKey) {\n add([...model.primaryKey.fields])\n }\n\n for (const field of model.fields) {\n if (field.isUnique) add([field.name])\n }\n\n for (const fields of model.uniqueFields) {\n add([...fields])\n }\n\n return constraints\n}\n\nexport function emitTypeMap(dmmf: DMMF.Document): string {\n const enumNames = new Set(dmmf.datamodel.enums.map(e => e.name))\n\n for (const e of dmmf.datamodel.enums) {\n if (e.values.length === 0) {\n throw new Error(`prisma-guard: Enum \"${e.name}\" has zero values.`)\n }\n }\n\n const modelEntries = dmmf.datamodel.models\n .map(model => {\n const fieldEntries = model.fields\n .map(field => {\n const isRelation = field.kind === 'object' || field.relationName != null\n const isEnum = enumNames.has(field.type)\n const isUnsupported = field.kind === 'unsupported'\n const meta: string[] = [\n `type: ${JSON.stringify(field.type)}`,\n `isList: ${field.isList}`,\n `isRequired: ${field.isRequired}`,\n `isId: ${field.isId}`,\n `isRelation: ${isRelation}`,\n `hasDefault: ${field.hasDefaultValue}`,\n `isUpdatedAt: ${field.isUpdatedAt}`,\n ]\n if (isEnum) meta.push(`isEnum: true`)\n if (isUnsupported) meta.push(`isUnsupported: true`)\n if (field.isUnique) meta.push(`isUnique: true`)\n return ` ${JSON.stringify(field.name)}: { ${meta.join(', ')} },`\n })\n .join('\\n')\n return ` ${JSON.stringify(model.name)}: {\\n${fieldEntries}\\n },`\n })\n .join('\\n')\n\n const enumEntries = dmmf.datamodel.enums\n .map(e => {\n const values = e.values.map(v => JSON.stringify(v.name)).join(', ')\n return ` ${JSON.stringify(e.name)}: [${values}],`\n })\n .join('\\n')\n\n const uniqueMapEntries = dmmf.datamodel.models\n .map(model => {\n const constraints = collectUniqueConstraints(model)\n if (constraints.length === 0) return null\n const constraintsStr = constraints\n .map(c => `[${c.map(f => JSON.stringify(f)).join(', ')}]`)\n .join(', ')\n return ` ${JSON.stringify(model.name)}: [${constraintsStr}],`\n })\n .filter(Boolean)\n .join('\\n')\n\n const typeMapSource = `export const TYPE_MAP = {\\n${modelEntries}\\n} as const\\n`\n const enumMapSource = `export const ENUM_MAP = {\\n${enumEntries}\\n} as const\\n`\n const uniqueMapSource = `export const UNIQUE_MAP = {\\n${uniqueMapEntries}\\n} as const\\n`\n\n const typesSource = [\n `export type ModelName = keyof typeof TYPE_MAP`,\n `export type FieldName<M extends ModelName> = keyof (typeof TYPE_MAP)[M]`,\n ].join('\\n')\n\n return `${typeMapSource}\\n${enumMapSource}\\n${uniqueMapSource}\\n${typesSource}\\n`\n}","export const SHAPE_CONFIG_KEYS = new Set([\n 'where', 'include', 'select', 'orderBy', 'cursor', 'take', 'skip',\n 'distinct', 'having', '_count', '_avg', '_sum', '_min', '_max', 'by',\n])\n\nexport const GUARD_SHAPE_KEYS = new Set([\n 'data', 'create', 'update', ...SHAPE_CONFIG_KEYS,\n])\n\nexport const COMBINATOR_KEYS = new Set(['AND', 'OR', 'NOT'])\n\nexport const TO_MANY_RELATION_OPS = new Set(['some', 'every', 'none'])\nexport const TO_ONE_RELATION_OPS = new Set(['is', 'isNot'])\nexport const ALL_RELATION_OPS = new Set([...TO_MANY_RELATION_OPS, ...TO_ONE_RELATION_OPS])\n\nexport function toDelegateKey(modelName: string): string {\n return modelName[0].toLowerCase() + modelName.slice(1)\n}\n\nconst FORCED_MARKER = Symbol.for('prisma-guard.forced')\n\nexport function isForcedValue(v: unknown): v is { value: unknown } {\n return v !== null && typeof v === 'object' && (v as any)[FORCED_MARKER] === true\n}\n\nexport function force<T>(value: T): { value: T } {\n const wrapper: any = { value }\n wrapper[FORCED_MARKER] = true\n return wrapper\n}\n\nconst UNSUPPORTED_MARKER = Symbol.for('prisma-guard.unsupported')\n\nexport function isUnsupportedMarker(v: unknown): boolean {\n return v !== null && typeof v === 'object' && (v as any)[UNSUPPORTED_MARKER] === true\n}\n\nexport function unsupported(): { __brand: 'unsupported' } {\n const marker: any = {}\n marker[UNSUPPORTED_MARKER] = true\n return marker\n}","import type { DMMF } from '@prisma/generator-helper'\nimport { toDelegateKey } from '../shared/constants.js'\n\nexport function emitClient(dmmf: DMMF.Document): string {\n const modelEntries = dmmf.datamodel.models\n .map(model => {\n const key = toDelegateKey(model.name)\n return ` ${key}: {\\n guard(input: GuardInput, caller?: string): GuardedModel<PrismaClient['${key}']>\\n }`\n })\n .join('\\n')\n\n return (\n `import type { PrismaClient } from '@prisma/client'\\n` +\n `import type { GuardInput, GuardedModel } from 'prisma-guard'\\n` +\n `import { createGuard } from 'prisma-guard'\\n` +\n `import { SCOPE_MAP, TYPE_MAP, ENUM_MAP, ZOD_CHAINS, GUARD_CONFIG, UNIQUE_MAP, ZOD_DEFAULTS } from './index'\\n` +\n `import type { ScopeRoot } from './index'\\n\\n` +\n `interface GuardModelExtension {\\n${modelEntries}\\n}\\n\\n` +\n `export const guard = createGuard<typeof TYPE_MAP, ScopeRoot, GuardModelExtension>({\\n` +\n ` scopeMap: SCOPE_MAP,\\n` +\n ` typeMap: TYPE_MAP,\\n` +\n ` enumMap: ENUM_MAP,\\n` +\n ` zodChains: ZOD_CHAINS,\\n` +\n ` guardConfig: GUARD_CONFIG,\\n` +\n ` uniqueMap: UNIQUE_MAP,\\n` +\n ` zodDefaults: ZOD_DEFAULTS,\\n` +\n `})\\n`\n )\n}"],"mappings":"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","names":["z","z"]}
@@ -222,7 +222,13 @@ function createScalarBase(strictDecimal) {
222
222
  import_zod.z.string().regex(/^-?\d+$/).transform((v) => BigInt(v))
223
223
  ]),
224
224
  Boolean: () => import_zod.z.boolean(),
225
- DateTime: () => import_zod.z.union([import_zod.z.date(), import_zod.z.string().datetime({ offset: true })]).pipe(import_zod.z.coerce.date()),
225
+ DateTime: () => import_zod.z.union([
226
+ import_zod.z.date(),
227
+ import_zod.z.string().refine(
228
+ (s) => !isNaN(Date.parse(s)),
229
+ "Invalid date string"
230
+ )
231
+ ]).pipe(import_zod.z.coerce.date()),
226
232
  Json: () => import_zod.z.unknown().refine(
227
233
  isJsonSafe,
228
234
  "Value must be JSON-serializable (no undefined, functions, symbols, class instances, NaN, Infinity, or circular references)"
@@ -239,8 +245,8 @@ function wrapWithInputCoercion(fieldType, isList, schema) {
239
245
  break;
240
246
  case "Int":
241
247
  itemCoercion = import_zod.z.union([
242
- import_zod.z.number().int(),
243
- import_zod.z.string().regex(/^-?\d+$/).transform(Number)
248
+ import_zod.z.number().transform((v) => Math.trunc(v)).pipe(import_zod.z.number().int()),
249
+ import_zod.z.string().regex(/^-?\d+(\.\d+)?$/).transform((v) => Math.trunc(Number(v)))
244
250
  ]);
245
251
  break;
246
252
  case "Float":
@@ -2949,11 +2955,29 @@ function buildAndConditions(existingWhere, conditions) {
2949
2955
  return conditions[0];
2950
2956
  return { AND: conditions };
2951
2957
  }
2952
- function buildScopedUniqueWhere(existingWhere, conditions) {
2953
- if (!existingWhere) {
2958
+ function stripScopeFksFromWhere(where, scopeFks, log, model) {
2959
+ let result = where;
2960
+ for (const fk of scopeFks) {
2961
+ if (fk in result) {
2962
+ if (result === where)
2963
+ result = { ...where };
2964
+ log.warn(
2965
+ `prisma-guard: Scope FK "${fk}" found in where for model "${model}". Stripped in favor of scope context.`
2966
+ );
2967
+ delete result[fk];
2968
+ }
2969
+ }
2970
+ return result;
2971
+ }
2972
+ function buildScopedUniqueWhere(existingWhere, conditions, scopeFks, log, model) {
2973
+ let cleaned = existingWhere;
2974
+ if (cleaned) {
2975
+ cleaned = stripScopeFksFromWhere(cleaned, scopeFks, log, model);
2976
+ }
2977
+ if (!cleaned || Object.keys(cleaned).length === 0) {
2954
2978
  return conditions.length === 1 ? conditions[0] : { AND: conditions };
2955
2979
  }
2956
- const { AND: existingAnd, ...topLevel } = existingWhere;
2980
+ const { AND: existingAnd, ...topLevel } = cleaned;
2957
2981
  const allConditions = [];
2958
2982
  if (existingAnd !== void 0) {
2959
2983
  if (Array.isArray(existingAnd)) {
@@ -3053,6 +3077,13 @@ function createScopeExtension(scopeMap, contextFn, guardConfig, logger) {
3053
3077
  `prisma-guard: Invalid onScopeRelationWrite "${onScopeRelationWrite}". Allowed: ${[...VALID_ON_SCOPE_RELATION_WRITES].join(", ")}`
3054
3078
  );
3055
3079
  }
3080
+ const scopeFkSets = /* @__PURE__ */ new Map();
3081
+ for (const [model, entries] of Object.entries(scopeMap)) {
3082
+ const fks = /* @__PURE__ */ new Set();
3083
+ for (const entry of entries)
3084
+ fks.add(entry.fk);
3085
+ scopeFkSets.set(model, fks);
3086
+ }
3056
3087
  return {
3057
3088
  name: "prisma-guard-scope",
3058
3089
  query: {
@@ -3073,7 +3104,7 @@ function createScopeExtension(scopeMap, contextFn, guardConfig, logger) {
3073
3104
  if (missingRoots.length > 0) {
3074
3105
  if (isMutation || guardConfig.onMissingScopeContext === "error") {
3075
3106
  throw new PolicyError(
3076
- `Missing scope context for model "${model}": roots ${missingRoots.map((r) => `"${r}"`).join(", ")} not provided. All scope roots must be present.`
3107
+ `prisma-guard: Missing scope context for model "${model}": roots ${missingRoots.map((r) => `"${r}"`).join(", ")} not provided. All scope roots must be present.`
3077
3108
  );
3078
3109
  }
3079
3110
  if (guardConfig.onMissingScopeContext === "warn") {
@@ -3089,9 +3120,10 @@ function createScopeExtension(scopeMap, contextFn, guardConfig, logger) {
3089
3120
  const overrides = Object.fromEntries(
3090
3121
  presentScopes.map((s) => [s.fk, ctx[s.root]])
3091
3122
  );
3123
+ const modelFks = scopeFkSets.get(model) ?? /* @__PURE__ */ new Set();
3092
3124
  const nextArgs = { ...args };
3093
3125
  if (operation === "upsert") {
3094
- nextArgs.where = buildScopedUniqueWhere(args.where, conditions);
3126
+ nextArgs.where = buildScopedUniqueWhere(args.where, conditions, modelFks, log, model);
3095
3127
  if (args.create !== void 0 && args.create !== null) {
3096
3128
  if (typeof args.create !== "object" || Array.isArray(args.create)) {
3097
3129
  throw new ShapeError(`upsert expects create to be an object`);
@@ -3129,7 +3161,7 @@ function createScopeExtension(scopeMap, contextFn, guardConfig, logger) {
3129
3161
  if (FIND_UNIQUE_OPS.has(operation)) {
3130
3162
  if (findUniqueMode === "reject") {
3131
3163
  throw new PolicyError(
3132
- `Scoped model "${model}" does not allow ${operation} via scope extension (findUniqueMode is "reject"). Use findFirst with explicit where conditions instead.`
3164
+ `prisma-guard: Scoped model "${model}" does not allow ${operation} via scope extension (findUniqueMode is "reject"). Use findFirst with explicit where conditions instead.`
3133
3165
  );
3134
3166
  }
3135
3167
  return handleFindUnique(
@@ -3199,7 +3231,7 @@ function createScopeExtension(scopeMap, contextFn, guardConfig, logger) {
3199
3231
  return query(nextArgs);
3200
3232
  }
3201
3233
  if (UNIQUE_MUTATION_OPS.has(operation)) {
3202
- nextArgs.where = buildScopedUniqueWhere(args.where, conditions);
3234
+ nextArgs.where = buildScopedUniqueWhere(args.where, conditions, modelFks, log, model);
3203
3235
  if (args.data !== void 0 && args.data !== null) {
3204
3236
  if (typeof args.data !== "object" || Array.isArray(args.data)) {
3205
3237
  throw new ShapeError(`${operation} expects data to be an object`);
@@ -3239,7 +3271,7 @@ function createScopeExtension(scopeMap, contextFn, guardConfig, logger) {
3239
3271
  return query(nextArgs);
3240
3272
  }
3241
3273
  throw new ShapeError(
3242
- `Unknown operation "${operation}" on scoped model "${model}". Update prisma-guard to handle this operation.`
3274
+ `prisma-guard: Unknown operation "${operation}" on scoped model "${model}". Update prisma-guard to handle this operation.`
3243
3275
  );
3244
3276
  }
3245
3277
  }
@@ -3310,7 +3342,7 @@ async function handleFindUnique(args, query, conditions, scopes, operation, log,
3310
3342
  if (!looseEqual(verifyObj[fk], value, log, fk)) {
3311
3343
  if (operation === "findUniqueOrThrow") {
3312
3344
  throw new PolicyError(
3313
- `Record on model "${model}" not accessible in current scope`
3345
+ `prisma-guard: Record on model "${model}" not accessible in current scope`
3314
3346
  );
3315
3347
  }
3316
3348
  return null;
@@ -4382,8 +4414,10 @@ function createModelGuardExtension(config) {
4382
4414
  equalityFields.add(key);
4383
4415
  continue;
4384
4416
  }
4385
- if (isPlainObject(value) && "equals" in value) {
4386
- equalityFields.add(key);
4417
+ if (isPlainObject(value)) {
4418
+ if ("equals" in value) {
4419
+ equalityFields.add(key);
4420
+ }
4387
4421
  continue;
4388
4422
  }
4389
4423
  if (value !== null && value !== void 0) {