@inixiative/json-rules 1.3.4 → 2.0.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 +168 -0
- package/dist/index.cjs +6 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +144 -42
- package/dist/index.d.ts +144 -42
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -6
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/operator.ts","../src/date.ts","../src/field.ts","../src/check.ts","../src/toPrisma/relationUtils.ts","../src/toPrisma/utils.ts","../src/toPrisma/aggregate.ts","../src/toPrisma/countStep.ts","../src/toPrisma/array.ts","../src/toPrisma/date.ts","../src/toPrisma/mapWalk.ts","../src/toPrisma/field.ts","../src/toPrisma/logical.ts","../src/toPrisma/condition.ts","../src/toPrisma/execute.ts","../src/toPrisma/index.ts","../src/toSql/params.ts","../src/toSql/quoting.ts","../src/toSql/aggregate.ts","../src/toSql/array.ts","../src/toSql/dayNames.ts","../src/toSql/join.ts","../src/toSql/date.ts","../src/toSql/field.ts","../src/toSql/logical.ts","../src/toSql/condition.ts","../src/toSql/index.ts","../src/validate.ts"],"names":["Operator","ArrayOperator","DateOperator","dayjs","utc","timezone","isSameOrBefore","isSameOrAfter","checkDate","condition","data","context","fieldValue","get","isDateInputValue","fieldDate","getError","op","dates","parseCompareDates","compareDate","endDate","dayName","allowedDays","day","excludedDays","excludedDay","_fieldDate","rawDate1","rawDate2","date1","parseDateWithTimezone","date2","startDate","value","pathValue","date","valueStr","fieldStr","offset","match","checkField","needsValue","getValue","compareOrderedValues","containsValue","hasMatch","range","normalizeRange","isOrderedValue","comparableFieldValue","toOrderedPrimitive","min","max","isEmpty","left","right","operator","lhs","rhs","rawMin","rawMax","container","search","check","conditions","all","any","checkArray","checkAggregate","checkIfThenElse","error","errors","result","arrayValue","nestedCondition","filtered","item","mode","itemField","numbers","index","raw","loc","s","n","msg","a","b","defaultMsg","requiresCondition","requiresCount","itemCondition","count","matches","failures","some","isObject","results","r","findReverseRelation","map","targetModel","currentModel","relationName","targetEntry","fieldDef","buildNestedFilter","field","filter","parts","i","buildConditionRef","setConditionBuilderForAggregate","fn","buildAggregateRule","rule","options","state","buildAggregateStep","walkAggregateFieldPath","rootModel","segments","intermediateRelations","seg","fieldEntry","terminalModel","terminalEntry","targetFieldEntry","fkOnTarget","pkOnTerminal","reverseRelation","innerWhere","aggKey","having","buildPrismaFilter","step","stepIndex","stepRef","leafFilter","relationPath","buildCountStep","buildCondition","pkOnCurrent","isImplicitM2M","f","buildHaving","groupByField","setConditionBuilderForArray","buildArrayRule","buildArrayLeafFilter","buildDateRule","buildDateLeafFilter","resolveDateValue","val","v","start","end","normalizeDateRange","first","second","compareDateValues","normalizeComparableDateValue","walkFieldPath","modelEntry","buildFieldRule","buildMapAwareFilter","buildLeafFilter","resolveRuleValue","walkResult","jsonFilter","fieldUpToJson","setConditionBuilder","buildAll","c","buildAny","buildIfThenElse","cond","ifClause","notIf","thenClause","elseClause","executePrismaQueryPlan","prismaDelegate","groupBySteps","whereStep","stepResults","modelKey","delegate","rows","resolveStepRefs","obj","record","idx","resolved","key","toPrisma","where","nextParam","escapeLikePattern","quoteField","escapeIdentifier","column","jsonPath","buildJsonPath","quoteQualifiedField","alias","escapeJsonKey","columnExpr","pathParts","leaf","quoteFieldAsJsonb","buildJsonPathJsonb","allParts","subquery","buildAggregateSubquery","buildAggregateComparison","extract","resolveRhs","refField","rhsVal","rhsCol","isNative","lengthFn","mapDayNames","days","dayMap","d","num","resolveFieldSql","currentAlias","registryKey","existingAlias","targetAlias","joinCounter","joinClause","buildJoinClause","remaining","targetDbName","onCondition","from","reverse","resolveDateRhs","resolveComparison","toSql","hasMap","rootAlias","FIELD_OPERATORS","ARRAY_OPERATORS","DATE_OPERATORS","validateRule","validateCondition","assertValidRule","message","path","pushIssue","isPlainObject","shape","detectShape","validateLogicalArray","validateFieldRule","validateAggregateRule","validateArrayRule","validateDateRule","shapes","uniqueShapes","isPresenceOperator","forbidValueAndPath","requireValueOrPath","isOrderedRuleValue","isOrderedRange","AGGREGATE_SINGLE_OPERATORS","AGGREGATE_RANGE_OPERATORS","agg","isSingle","isRange","isNumericRange","isComplexArrayOperator","isDateRange","hasValue","hasPath","code"],"mappings":"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","file":"index.cjs","sourcesContent":["export const Operator = {\n equals: 'equals',\n notEquals: 'notEquals',\n lessThan: 'lessThan',\n lessThanEquals: 'lessThanEquals',\n greaterThan: 'greaterThan',\n greaterThanEquals: 'greaterThanEquals',\n contains: 'contains',\n notContains: 'notContains',\n in: 'in',\n notIn: 'notIn',\n matches: 'matches',\n notMatches: 'notMatches',\n between: 'between',\n notBetween: 'notBetween',\n isEmpty: 'isEmpty',\n notEmpty: 'notEmpty',\n exists: 'exists',\n notExists: 'notExists',\n startsWith: 'startsWith',\n endsWith: 'endsWith',\n} as const;\n\nexport type Operator = (typeof Operator)[keyof typeof Operator];\n\nexport const ArrayOperator = {\n all: 'all',\n any: 'any',\n none: 'none',\n atLeast: 'atLeast',\n atMost: 'atMost',\n exactly: 'exactly',\n empty: 'empty',\n notEmpty: 'notEmpty',\n} as const;\n\nexport type ArrayOperator = (typeof ArrayOperator)[keyof typeof ArrayOperator];\n\nexport const DateOperator = {\n before: 'before',\n after: 'after',\n onOrBefore: 'onOrBefore',\n onOrAfter: 'onOrAfter',\n between: 'between',\n notBetween: 'notBetween',\n dayIn: 'dayIn',\n dayNotIn: 'dayNotIn',\n} as const;\n\nexport type DateOperator = (typeof DateOperator)[keyof typeof DateOperator];\n","import dayjs from 'dayjs';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter.js';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore.js';\nimport timezone from 'dayjs/plugin/timezone.js';\nimport utc from 'dayjs/plugin/utc.js';\nimport { get } from 'lodash';\nimport { DateOperator } from './operator';\nimport type { DateInputValue, DateRule } from './types';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(isSameOrBefore);\ndayjs.extend(isSameOrAfter);\n\nexport const checkDate = <TData extends Record<string, unknown>>(\n condition: DateRule,\n data: TData,\n context: TData,\n): boolean | string => {\n const fieldValue = get(data, condition.field) as unknown;\n\n if (!fieldValue) throw new Error(`${condition.field} is null or undefined`);\n if (!isDateInputValue(fieldValue))\n throw new Error(`${condition.field} is not a valid date: ${String(fieldValue)}`);\n\n const fieldDate = dayjs(fieldValue);\n\n if (!fieldDate.isValid())\n throw new Error(`${condition.field} is not a valid date: ${fieldValue}`);\n\n const getError = (op: string) => condition.error || `${condition.field} ${op}`;\n\n // Parse comparison dates with timezone context - pass the original string to preserve offset info\n const dates = parseCompareDates(condition, data, context, fieldDate, fieldValue);\n const compareDate = dates[0];\n const endDate = dates[1];\n\n switch (condition.dateOperator) {\n case DateOperator.before:\n return fieldDate.isBefore(compareDate) || getError(`must be before ${compareDate.format()}`);\n\n case DateOperator.after:\n return fieldDate.isAfter(compareDate) || getError(`must be after ${compareDate.format()}`);\n\n case DateOperator.onOrBefore:\n return (\n fieldDate.isSameOrBefore(compareDate) ||\n getError(`must be on or before ${compareDate.format()}`)\n );\n\n case DateOperator.onOrAfter:\n return (\n fieldDate.isSameOrAfter(compareDate) ||\n getError(`must be on or after ${compareDate.format()}`)\n );\n\n case DateOperator.between: {\n if (!endDate) throw new Error('between operator requires an end date');\n return (\n (fieldDate.isSameOrAfter(compareDate) && fieldDate.isSameOrBefore(endDate)) ||\n getError(`must be between ${compareDate.format()} and ${endDate?.format()}`)\n );\n }\n\n case DateOperator.notBetween: {\n if (!endDate) throw new Error('notBetween operator requires an end date');\n return (\n fieldDate.isBefore(compareDate) ||\n fieldDate.isAfter(endDate) ||\n getError(`must not be between ${compareDate.format()} and ${endDate?.format()}`)\n );\n }\n\n case DateOperator.dayIn: {\n if (!Array.isArray(condition.value))\n throw new Error('dayIn operator requires an array of day names');\n const dayName = fieldDate.format('dddd').toLowerCase();\n const allowedDays = condition.value.map((day) => String(day).toLowerCase());\n return allowedDays.includes(dayName) || getError(`must be on ${allowedDays.join(' or ')}`);\n }\n\n case DateOperator.dayNotIn: {\n if (!Array.isArray(condition.value))\n throw new Error('dayNotIn operator requires an array of day names');\n const day = fieldDate.format('dddd').toLowerCase();\n const excludedDays = condition.value.map((excludedDay) => String(excludedDay).toLowerCase());\n return !excludedDays.includes(day) || getError(`must not be on ${excludedDays.join(' or ')}`);\n }\n\n default:\n throw new Error('Unknown date operator');\n }\n};\n\nconst parseCompareDates = <TData extends Record<string, unknown>>(\n condition: DateRule,\n data: TData,\n context: TData,\n _fieldDate: dayjs.Dayjs,\n fieldValue: DateInputValue,\n): [dayjs.Dayjs, dayjs.Dayjs | undefined] => {\n const requiresTwoDates: DateOperator[] = [DateOperator.between, DateOperator.notBetween];\n\n if (requiresTwoDates.includes(condition.dateOperator)) {\n if (!Array.isArray(condition.value) || condition.value.length !== 2)\n throw new Error(`${condition.dateOperator} operator requires an array of two dates`);\n const [rawDate1, rawDate2] = condition.value as [DateInputValue, DateInputValue];\n const date1 = parseDateWithTimezone(rawDate1, fieldValue);\n const date2 = parseDateWithTimezone(rawDate2, fieldValue);\n if (!date1.isValid()) throw new Error(`Invalid start date: ${condition.value[0]}`);\n if (!date2.isValid()) throw new Error(`Invalid end date: ${condition.value[1]}`);\n // Auto-sort: ensure startDate <= endDate\n const [startDate, endDate] =\n date1.isBefore(date2) || date1.isSame(date2) ? [date1, date2] : [date2, date1];\n return [startDate, endDate];\n }\n\n const requiresOneDate: DateOperator[] = [\n DateOperator.before,\n DateOperator.after,\n DateOperator.onOrBefore,\n DateOperator.onOrAfter,\n ];\n\n if (requiresOneDate.includes(condition.dateOperator)) {\n let value: DateInputValue | undefined;\n if (condition.value !== undefined) {\n if (Array.isArray(condition.value)) {\n throw new Error(`${condition.dateOperator} operator requires a single date value`);\n }\n value = condition.value as DateInputValue;\n } else if (condition.path) {\n // Support $.path for current element\n if (condition.path.startsWith('$.')) {\n const pathValue = get(data, condition.path.substring(2)) as unknown;\n value = isDateInputValue(pathValue) ? pathValue : undefined;\n } else {\n const pathValue = get(context, condition.path) as unknown;\n value = isDateInputValue(pathValue) ? pathValue : undefined;\n }\n } else {\n throw new Error('No value or path specified for date comparison');\n }\n const date = parseDateWithTimezone(value, fieldValue);\n if (!date.isValid()) throw new Error(`Invalid comparison date: ${value}`);\n return [date, undefined];\n }\n\n return [dayjs(), undefined]; // Won't be used for dayIn/dayNotIn\n};\n\nconst parseDateWithTimezone = (\n value: DateInputValue | undefined,\n fieldValue: DateInputValue,\n): dayjs.Dayjs => {\n const valueStr = String(value);\n\n // Check if value has explicit timezone information\n const hasTimezone =\n valueStr.includes('Z') ||\n (valueStr.includes('T') && (valueStr.includes('+') || valueStr.match(/T.*-\\d{2}:/)));\n\n if (hasTimezone) return dayjs(value);\n\n // No timezone info in value - interpret in field's timezone\n // Extract offset from field value\n const fieldStr = String(fieldValue);\n let offset = 0;\n\n if (fieldStr.includes('+') || (fieldStr.includes('T') && fieldStr.match(/T.*-\\d{2}:/))) {\n // Field has explicit offset like +11:00 or -08:00\n const match = fieldStr.match(/([+-])(\\d{2}):(\\d{2})/);\n if (match) {\n const sign = match[1] === '+' ? 1 : -1;\n offset = sign * (parseInt(match[2], 10) * 60 + parseInt(match[3], 10));\n }\n } else if (!fieldStr.includes('Z')) {\n // Field has no timezone, assume local time (offset 0)\n offset = 0;\n }\n // If field has Z, it's UTC (offset 0)\n\n // Create a date representing the same local time as the field's timezone\n if (valueStr.match(/^\\d{4}-\\d{2}-\\d{2}$/)) {\n // For date-only, we want midnight in the field's timezone\n const localMidnight = dayjs(`${value}T00:00:00`);\n return localMidnight.subtract(offset, 'minute');\n }\n\n // For datetime without timezone, interpret as local time in field's timezone\n const localTime = dayjs(value);\n return localTime.subtract(offset, 'minute');\n};\n\nconst isDateInputValue = (value: unknown): value is DateInputValue =>\n typeof value === 'string' || typeof value === 'number' || value instanceof Date;\n","import { get, isEmpty } from 'lodash';\nimport { Operator } from './operator';\nimport type { Rule } from './types';\n\nexport const checkField = <TData extends Record<string, unknown>>(\n condition: Rule,\n data: TData,\n context: TData,\n): boolean | string => {\n // Use data for field access (current element) but context remains available for path references\n const fieldValue = get(data, condition.field) as unknown;\n\n // Operators that don't need a value\n const noValueOps: Operator[] = [\n Operator.isEmpty,\n Operator.notEmpty,\n Operator.exists,\n Operator.notExists,\n ];\n const needsValue = !noValueOps.includes(condition.operator);\n const value = needsValue ? getValue(condition, data, context) : undefined;\n\n const getError = (op: string) =>\n condition.error || `${condition.field} ${op}${needsValue ? ` ${JSON.stringify(value)}` : ''}`;\n\n switch (condition.operator) {\n case Operator.equals:\n return fieldValue === value || getError(`must equal`);\n case Operator.notEquals:\n return fieldValue !== value || getError(`must not equal`);\n case Operator.lessThan:\n return compareOrderedValues(fieldValue, value, 'lt') || getError(`must be less than`);\n case Operator.lessThanEquals:\n return (\n compareOrderedValues(fieldValue, value, 'lte') || getError(`must be less than or equal to`)\n );\n case Operator.greaterThan:\n return compareOrderedValues(fieldValue, value, 'gt') || getError(`must be greater than`);\n case Operator.greaterThanEquals:\n return (\n compareOrderedValues(fieldValue, value, 'gte') ||\n getError(`must be greater than or equal to`)\n );\n case Operator.in:\n return (Array.isArray(value) && value.includes(fieldValue)) || getError(`must be one of`);\n case Operator.notIn:\n return !Array.isArray(value) || !value.includes(fieldValue) || getError(`must not be one of`);\n case Operator.contains:\n return containsValue(fieldValue, value) || getError(`must contain`);\n case Operator.notContains:\n return !containsValue(fieldValue, value) || getError(`must not contain`);\n case Operator.matches:\n return (\n (hasMatch(fieldValue) &&\n (value instanceof RegExp || typeof value === 'string') &&\n !!fieldValue.match(value)) ||\n getError(`must match pattern`)\n );\n case Operator.notMatches:\n return (\n !hasMatch(fieldValue) ||\n !(value instanceof RegExp || typeof value === 'string') ||\n !fieldValue.match(value) ||\n getError(`must not match pattern`)\n );\n case Operator.between: {\n const range = normalizeRange(value);\n if (!range) throw new Error('between operator requires an array of two values');\n if (!isOrderedValue(fieldValue)) return getError(`must be between`);\n const comparableFieldValue = toOrderedPrimitive(fieldValue);\n const [min, max] = range;\n return (\n (comparableFieldValue >= min && comparableFieldValue <= max) || getError(`must be between`)\n );\n }\n case Operator.notBetween: {\n const range = normalizeRange(value);\n if (!range) throw new Error('notBetween operator requires an array of two values');\n if (!isOrderedValue(fieldValue)) return true;\n const comparableFieldValue = toOrderedPrimitive(fieldValue);\n const [min, max] = range;\n return (\n comparableFieldValue < min || comparableFieldValue > max || getError(`must not be between`)\n );\n }\n case Operator.isEmpty:\n return isEmpty(fieldValue) || getError(`must be empty`);\n case Operator.notEmpty:\n return !isEmpty(fieldValue) || getError(`must not be empty`);\n case Operator.exists:\n return fieldValue !== undefined || getError(`must exist`);\n case Operator.notExists:\n return fieldValue === undefined || getError(`must not exist`);\n case Operator.startsWith:\n return (\n (typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.startsWith(value)) ||\n getError(`must start with`)\n );\n case Operator.endsWith:\n return (\n (typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.endsWith(value)) ||\n getError(`must end with`)\n );\n default:\n throw new Error('Unknown operator');\n }\n};\n\nconst getValue = <TData extends Record<string, unknown>>(\n condition: Rule,\n data: TData,\n context: TData,\n): unknown => {\n if (condition.value !== undefined) return condition.value;\n if (condition.path) {\n // Special case: if path starts with \"$.\" use data (current element)\n if (condition.path.startsWith('$.')) {\n return get(data, condition.path.substring(2));\n }\n // Otherwise use context (root data)\n return get(context, condition.path);\n }\n throw new Error('No value or path specified');\n};\n\ntype OrderedValue = string | number | Date;\n\nconst isOrderedValue = (value: unknown): value is OrderedValue =>\n typeof value === 'string' || typeof value === 'number' || value instanceof Date;\n\nconst toOrderedPrimitive = (value: OrderedValue): string | number =>\n value instanceof Date ? value.getTime() : value;\n\nconst compareOrderedValues = (\n left: unknown,\n right: unknown,\n operator: 'lt' | 'lte' | 'gt' | 'gte',\n): boolean => {\n if (!isOrderedValue(left) || !isOrderedValue(right)) return false;\n\n const lhs = toOrderedPrimitive(left);\n const rhs = toOrderedPrimitive(right);\n\n switch (operator) {\n case 'lt':\n return lhs < rhs;\n case 'lte':\n return lhs <= rhs;\n case 'gt':\n return lhs > rhs;\n case 'gte':\n return lhs >= rhs;\n }\n};\n\nconst hasMatch = (value: unknown): value is string => typeof value === 'string';\n\nconst normalizeRange = (value: unknown): [string | number, string | number] | null => {\n if (!Array.isArray(value) || value.length !== 2) return null;\n\n const [rawMin, rawMax] = value;\n if (!isOrderedValue(rawMin) || !isOrderedValue(rawMax)) return null;\n\n const min = toOrderedPrimitive(rawMin);\n const max = toOrderedPrimitive(rawMax);\n return min <= max ? [min, max] : [max, min];\n};\n\nconst containsValue = (container: unknown, search: unknown): boolean => {\n if (typeof container === 'string') {\n return typeof search === 'string' && container.includes(search);\n }\n\n if (Array.isArray(container)) {\n return container.includes(search);\n }\n\n return false;\n};\n","import { get, isObject, some } from 'lodash';\nimport { checkDate } from './date';\nimport { checkField } from './field';\nimport { ArrayOperator, Operator } from './operator';\nimport type { AggregateRule, ArrayRule, Condition } from './types';\n\nexport const check = <TData extends Record<string, unknown>>(\n conditions: Condition,\n data: TData,\n context: TData = data,\n): boolean | string => {\n if (typeof conditions === 'boolean') return conditions;\n if ('all' in conditions) return all(conditions.all, data, context, conditions.error);\n if ('any' in conditions) return any(conditions.any, data, context, conditions.error);\n if ('arrayOperator' in conditions) return checkArray(conditions, data, context);\n if ('dateOperator' in conditions) return checkDate(conditions, data, context);\n if ('aggregate' in conditions) return checkAggregate(conditions as AggregateRule, data, context);\n if ('field' in conditions) return checkField(conditions, data, context);\n if ('if' in conditions) return checkIfThenElse(conditions, data, context);\n\n return false;\n};\n\nconst all = <TData extends Record<string, unknown>>(\n conditions: Condition[],\n data: TData,\n context: TData,\n error?: string,\n): boolean | string => {\n const errors: string[] = [];\n\n for (const condition of conditions) {\n const result = check(condition, data, context);\n if (result !== true) {\n // Handle both string errors and false boolean results\n if (typeof result === 'string') {\n errors.push(result);\n } else {\n // For boolean false, include it in the error message\n errors.push('false');\n }\n }\n }\n\n if (!errors.length) return true;\n if (error) return error;\n if (errors.length === 1) return errors[0];\n return `All conditions must pass: ${errors.join(' AND ')}`;\n};\n\nconst any = <TData extends Record<string, unknown>>(\n conditions: Condition[],\n data: TData,\n context: TData,\n error?: string,\n): boolean | string => {\n const errors: string[] = [];\n\n for (const condition of conditions) {\n const result = check(condition, data, context);\n if (result === true) return true;\n if (typeof result === 'string') errors.push(result);\n // boolean false: record as failure but continue checking other conditions\n }\n\n if (error) return error;\n if (errors.length === 1) return errors[0];\n return `At least one condition must pass: ${errors.join(' OR ')}`;\n};\n\nconst checkIfThenElse = <TData extends Record<string, unknown>>(\n condition: { if: Condition; then: Condition; else?: Condition },\n data: TData,\n context: TData,\n): boolean | string => {\n const ifResult = check(condition.if, data, context);\n\n if (ifResult === true) return check(condition.then, data, context);\n return condition.else ? check(condition.else, data, context) : true;\n};\n\nconst checkAggregate = <TData extends Record<string, unknown>>(\n condition: AggregateRule,\n data: TData,\n context: TData,\n): boolean | string => {\n const arrayValue = get(data, condition.field);\n if (!Array.isArray(arrayValue)) throw new Error(`${condition.field} must be an array`);\n\n // Filter elements by condition before aggregating\n const nestedCondition = condition.condition;\n const filtered = nestedCondition\n ? arrayValue.filter(\n (item) => check(nestedCondition, item as Record<string, unknown>, context) === true,\n )\n : arrayValue;\n\n const { mode, field: itemField } = condition.aggregate;\n\n const numbers: number[] = filtered.map((item, index) => {\n const raw = itemField ? get(item as Record<string, unknown>, itemField) : item;\n if (typeof raw !== 'number' || !Number.isFinite(raw)) {\n const loc = `${condition.field}[${index}]${itemField ? `.${itemField}` : ''}`;\n throw new Error(`${loc} must be a finite number`);\n }\n return raw;\n });\n\n // sum([]) = 0, avg([]) = null → comparison fails\n let result: number | null;\n if (mode === 'sum') {\n result = numbers.reduce((s, n) => s + n, 0);\n } else {\n result = numbers.length === 0 ? null : numbers.reduce((s, n) => s + n, 0) / numbers.length;\n }\n\n if (result === null) {\n return condition.error || `${condition.field} ${mode} comparison failed (empty array)`;\n }\n\n let rhs: unknown;\n if (condition.value !== undefined) {\n rhs = condition.value;\n } else if (condition.path) {\n rhs = condition.path.startsWith('$.')\n ? get(data, condition.path.substring(2))\n : get(context, condition.path);\n } else {\n throw new Error('Aggregate rule requires value or path');\n }\n\n const getError = (msg: string) =>\n condition.error || `${condition.field} ${mode} ${msg} ${JSON.stringify(rhs)}`;\n\n switch (condition.operator) {\n case Operator.equals:\n return result === rhs || getError('must equal');\n case Operator.notEquals:\n return result !== rhs || getError('must not equal');\n case Operator.lessThan:\n return (typeof rhs === 'number' && result < rhs) || getError('must be less than');\n case Operator.lessThanEquals:\n return (\n (typeof rhs === 'number' && result <= rhs) || getError('must be less than or equal to')\n );\n case Operator.greaterThan:\n return (typeof rhs === 'number' && result > rhs) || getError('must be greater than');\n case Operator.greaterThanEquals:\n return (\n (typeof rhs === 'number' && result >= rhs) || getError('must be greater than or equal to')\n );\n case Operator.between: {\n if (!Array.isArray(rhs) || rhs.length !== 2)\n throw new Error('between requires a two-element array');\n const [a, b] = rhs as number[];\n const [min, max] = a <= b ? [a, b] : [b, a];\n return (result >= min && result <= max) || getError('must be between');\n }\n case Operator.notBetween: {\n if (!Array.isArray(rhs) || rhs.length !== 2)\n throw new Error('notBetween requires a two-element array');\n const [a, b] = rhs as number[];\n const [min, max] = a <= b ? [a, b] : [b, a];\n return result < min || result > max || getError('must not be between');\n }\n default:\n throw new Error(`Operator '${condition.operator}' is not supported for aggregate rules`);\n }\n};\n\nconst checkArray = <TData extends Record<string, unknown>>(\n condition: ArrayRule,\n data: TData,\n context: TData,\n): boolean | string => {\n const arrayValue = get(data, condition.field);\n\n if (!Array.isArray(arrayValue)) throw new Error(`${condition.field} must be an array`);\n\n const getError = (defaultMsg: string) => condition.error || `${condition.field} ${defaultMsg}`;\n\n // Operators that require a condition\n const requiresCondition: ArrayOperator[] = [\n ArrayOperator.all,\n ArrayOperator.any,\n ArrayOperator.none,\n ArrayOperator.atLeast,\n ArrayOperator.atMost,\n ArrayOperator.exactly,\n ];\n\n // Operators that require a count\n const requiresCount: ArrayOperator[] = [\n ArrayOperator.atLeast,\n ArrayOperator.atMost,\n ArrayOperator.exactly,\n ];\n\n const itemCondition = condition.condition;\n if (requiresCondition.includes(condition.arrayOperator) && !itemCondition)\n throw new Error(\n `${condition.arrayOperator} requires a condition to check against array elements`,\n );\n\n const count = condition.count;\n if (requiresCount.includes(condition.arrayOperator) && count === undefined)\n throw new Error(`${condition.arrayOperator} requires a count`);\n\n // For operators that check elements, compute matches\n let matches = 0;\n let failures = 0;\n\n if (requiresCondition.includes(condition.arrayOperator)) {\n if (!itemCondition) {\n throw new Error(\n `${condition.arrayOperator} requires a condition to check against array elements`,\n );\n }\n\n // Check if array contains any objects\n if (!some(arrayValue, isObject))\n throw new Error(\n `${condition.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`,\n );\n\n // Pass item as data (for relative field access) but keep original context (for path access)\n const results = arrayValue.map((item) =>\n check(itemCondition, item as Record<string, unknown>, context),\n );\n matches = results.filter((r) => r === true).length;\n failures = results.filter((r) => typeof r === 'string').length;\n }\n\n switch (condition.arrayOperator) {\n case ArrayOperator.empty:\n return !arrayValue.length || getError('must be empty');\n\n case ArrayOperator.notEmpty:\n return !!arrayValue.length || getError('must not be empty');\n\n case ArrayOperator.all:\n return (\n matches === arrayValue.length || getError(`all elements must match (${failures} failed)`)\n );\n\n case ArrayOperator.any:\n return !!matches || getError('at least one element must match');\n\n case ArrayOperator.none:\n return !matches || getError(`no elements should match (${matches} matched)`);\n\n case ArrayOperator.atLeast:\n if (count === undefined) throw new Error(`${condition.arrayOperator} requires a count`);\n return (\n matches >= count || getError(`at least ${count} elements must match (${matches} matched)`)\n );\n\n case ArrayOperator.atMost:\n if (count === undefined) throw new Error(`${condition.arrayOperator} requires a count`);\n return (\n matches <= count || getError(`at most ${count} elements must match (${matches} matched)`)\n );\n\n case ArrayOperator.exactly:\n if (count === undefined) throw new Error(`${condition.arrayOperator} requires a count`);\n return (\n matches === count || getError(`exactly ${count} elements must match (${matches} matched)`)\n );\n\n default:\n throw new Error('Unknown array operator');\n }\n};\n","import type { FieldMap, FieldMapEntry } from './types';\n\nexport const findReverseRelation = (\n map: FieldMap,\n targetModel: string,\n currentModel: string,\n relationName?: string,\n): FieldMapEntry | null => {\n const targetEntry = map[targetModel];\n if (!targetEntry) return null;\n\n for (const fieldDef of Object.values(targetEntry.fields)) {\n if (\n fieldDef.kind === 'object' &&\n fieldDef.type === currentModel &&\n (fieldDef.fromFields?.length ?? 0) > 0 &&\n (fieldDef.toFields?.length ?? 0) > 0 &&\n (relationName === undefined || fieldDef.relationName === relationName)\n ) {\n return fieldDef;\n }\n }\n return null;\n};\n","import type { PrismaWhere } from './types';\n\n/**\n * Build a nested Prisma filter from a dot-notation field path.\n *\n * In Prisma, dot-notation always means relation traversal (unlike toSql where\n * dots mean JSON path). Each segment wraps the next from the inside out.\n *\n * @example\n * buildNestedFilter('status', { equals: 'active' })\n * // → { status: { equals: 'active' } }\n *\n * buildNestedFilter('user.profile.bio', { contains: 'hello' })\n * // → { user: { profile: { bio: { contains: 'hello' } } } }\n */\nexport const buildNestedFilter = (field: string, filter: unknown): PrismaWhere => {\n const parts = field.split('.');\n let result: unknown = filter;\n for (let i = parts.length - 1; i >= 0; i--) {\n result = { [parts[i]]: result };\n }\n return result as PrismaWhere;\n};\n","import { Operator } from '../operator';\nimport type { AggregateRule, Condition } from '../types';\nimport { findReverseRelation } from './relationUtils';\nimport type {\n BuildOptions,\n FieldMap,\n FieldMapEntry,\n GroupByStep,\n PrismaBuildState,\n PrismaWhere,\n StepRef,\n} from './types';\nimport { buildNestedFilter } from './utils';\n\n// Forward declaration - provided by condition.ts to avoid circular import\ntype BuildConditionFn = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n) => PrismaWhere;\nlet buildConditionRef: BuildConditionFn;\n\nexport const setConditionBuilderForAggregate = (fn: BuildConditionFn) => {\n buildConditionRef = fn;\n};\n\nexport const buildAggregateRule = (\n rule: AggregateRule,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n if (!options?.map || !options?.model || !state) {\n throw new Error(\n `Aggregate rules require a FieldMap and model to generate a Prisma plan. ` +\n `Pass { map, model } options to toPrisma().`,\n );\n }\n\n if (!rule.aggregate.field) {\n throw new Error(\n `Prisma aggregate rules require aggregate.field to specify the numeric field on the related model.`,\n );\n }\n\n if (rule.path) {\n throw new Error(`path is not supported for Prisma aggregate rules; use value instead.`);\n }\n\n return buildAggregateStep(\n rule,\n options as BuildOptions & { map: FieldMap; model: string },\n state,\n );\n};\n\n/**\n * Walk a dot-notation field path through the FieldMap to find the terminal list relation.\n *\n * Returns the segments traversed, the final list relation entry, and the model it lives on.\n * E.g. for 'department.employees' on User:\n * - segments: ['department', 'employees']\n * - intermediate: User → Department (singular)\n * - terminal: Department.employees → Employee (list)\n */\nconst walkAggregateFieldPath = (\n field: string,\n map: FieldMap,\n rootModel: string,\n): {\n segments: string[];\n intermediateRelations: { fieldName: string; entry: FieldMapEntry; onModel: string }[];\n terminalModel: string;\n terminalEntry: FieldMapEntry;\n} => {\n const segments = field.split('.');\n const intermediateRelations: { fieldName: string; entry: FieldMapEntry; onModel: string }[] = [];\n let currentModel = rootModel;\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const fieldEntry = map[currentModel]?.fields[seg];\n if (!fieldEntry || fieldEntry.kind !== 'object') {\n throw new Error(\n `Field '${seg}' is not a relation in model '${currentModel}'. ` +\n `Prisma aggregate rules only support relation fields.`,\n );\n }\n\n if (i === segments.length - 1) {\n // Terminal segment — must be a list relation\n if (!fieldEntry.isList) {\n throw new Error(`Field '${seg}' is not a list relation in model '${currentModel}'.`);\n }\n return {\n segments,\n intermediateRelations,\n terminalModel: currentModel,\n terminalEntry: fieldEntry,\n };\n }\n\n // Intermediate segment — must be a singular relation\n if (fieldEntry.isList) {\n throw new Error(\n `Intermediate field '${seg}' in path '${field}' is a list relation. ` +\n `Only the final segment can be a list relation for aggregate rules.`,\n );\n }\n\n intermediateRelations.push({ fieldName: seg, entry: fieldEntry, onModel: currentModel });\n currentModel = fieldEntry.type;\n }\n\n throw new Error(`Field path '${field}' did not terminate at a list relation.`);\n};\n\nconst buildAggregateStep = (\n rule: AggregateRule,\n options: BuildOptions & { map: FieldMap; model: string },\n state: PrismaBuildState,\n): PrismaWhere => {\n const { map, model: rootModel } = options;\n\n const { intermediateRelations, terminalModel, terminalEntry } = walkAggregateFieldPath(\n rule.field,\n map,\n rootModel,\n );\n\n const targetModel = terminalEntry.type;\n const itemField = rule.aggregate.field ?? '';\n\n const targetFieldEntry = map[targetModel]?.fields[itemField];\n if (!targetFieldEntry) {\n throw new Error(`aggregate.field '${itemField}' does not exist on model '${targetModel}'.`);\n }\n if (targetFieldEntry.kind !== 'scalar') {\n throw new Error(\n `aggregate.field '${itemField}' on model '${targetModel}' must be a scalar field, got '${targetFieldEntry.kind}'.`,\n );\n }\n\n if (targetFieldEntry.type === 'Json') {\n throw new Error(\n `aggregate.field '${itemField}' on model '${targetModel}' is a Json field — aggregate rules require a numeric scalar.`,\n );\n }\n\n let fkOnTarget: string;\n let pkOnTerminal: string;\n\n if (terminalEntry.fromFields && terminalEntry.fromFields.length > 0) {\n if (terminalEntry.fromFields.length > 1) {\n throw new Error(`Aggregate rules do not support composite FK relations.`);\n }\n fkOnTarget = terminalEntry.toFields?.[0] ?? 'id';\n pkOnTerminal = terminalEntry.fromFields[0];\n } else {\n const reverseRelation = findReverseRelation(\n map,\n targetModel,\n terminalModel,\n terminalEntry.relationName,\n );\n if (!reverseRelation) {\n throw new Error(\n `Cannot determine FK relationship between '${terminalModel}' and '${targetModel}'. ` +\n `Ensure the FieldMap contains both sides of the relation.`,\n );\n }\n if ((reverseRelation.fromFields?.length ?? 0) > 1) {\n throw new Error(`Aggregate rules do not support composite FK relations.`);\n }\n fkOnTarget = reverseRelation.fromFields?.[0] ?? '';\n pkOnTerminal = reverseRelation.toFields?.[0] ?? '';\n }\n\n // Build inner WHERE from condition (if present)\n const innerWhere = rule.condition\n ? buildConditionRef(rule.condition, { ...options, model: targetModel }, state)\n : {};\n\n // Prisma 6.x having format: field first, then aggregate operator nested inside.\n const aggKey = rule.aggregate.mode === 'sum' ? '_sum' : '_avg';\n const having = { [itemField]: { [aggKey]: buildPrismaFilter(rule) } };\n\n const step: GroupByStep = {\n operation: 'groupBy',\n model: targetModel,\n args: { by: [fkOnTarget], where: innerWhere, having },\n extract: fkOnTarget,\n };\n\n const stepIndex = state.steps.length;\n state.steps.push(step);\n\n const stepRef: StepRef = { __step: stepIndex };\n\n // If there are intermediate relations, nest the filter through them\n if (intermediateRelations.length > 0) {\n // The step ref gives us IDs of the model that owns the terminal list relation.\n // We need to filter back through intermediate relations to the root model.\n const leafFilter = { [pkOnTerminal]: { in: stepRef } };\n const relationPath = intermediateRelations.map((r) => r.fieldName).join('.');\n return buildNestedFilter(relationPath, leafFilter);\n }\n\n return { [pkOnTerminal]: { in: stepRef } };\n};\n\nconst buildPrismaFilter = (rule: AggregateRule): Record<string, unknown> => {\n const value = rule.value;\n switch (rule.operator) {\n case Operator.equals:\n return { equals: value };\n case Operator.notEquals:\n return { not: value };\n case Operator.lessThan:\n return { lt: value };\n case Operator.lessThanEquals:\n return { lte: value };\n case Operator.greaterThan:\n return { gt: value };\n case Operator.greaterThanEquals:\n return { gte: value };\n case Operator.between: {\n if (!Array.isArray(value) || value.length !== 2)\n throw new Error('between requires two values');\n const [a, b] = value as number[];\n const [min, max] = a <= b ? [a, b] : [b, a];\n return { gte: min, lte: max };\n }\n case Operator.notBetween:\n throw new Error(`Operator 'notBetween' is not supported for Prisma aggregate rules.`);\n default:\n throw new Error(`Operator '${rule.operator}' is not supported for Prisma aggregate rules.`);\n }\n};\n","import { ArrayOperator } from '../operator';\nimport type { ArrayRule, Condition } from '../types';\nimport { findReverseRelation } from './relationUtils';\nimport type {\n BuildOptions,\n FieldMap,\n GroupByStep,\n PrismaBuildState,\n PrismaWhere,\n StepRef,\n} from './types';\n\ntype BuildConditionFn = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n) => PrismaWhere;\n\n/**\n * Generate a multi-step groupBy plan for count-based relation filtering.\n *\n * For { field: 'posts', arrayOperator: 'atLeast', count: 3, condition: ... } on User:\n * step 0: groupBy Post by authorId where <condition> having _count >= 3\n * where: { id: { in: { __step: 0 } } }\n *\n * The step is pushed into state.steps and the WHERE clause is returned directly.\n */\nexport const buildCountStep = (\n rule: ArrayRule,\n options: BuildOptions & { map: FieldMap; model: string },\n state: PrismaBuildState,\n buildCondition: BuildConditionFn,\n): PrismaWhere => {\n const { map, model: currentModel } = options;\n\n const fieldEntry = map[currentModel]?.fields[rule.field];\n if (!fieldEntry || fieldEntry.kind !== 'object') {\n throw new Error(\n `Field '${rule.field}' is not a relation in model '${currentModel}'. ` +\n `Count operators require a relation field.`,\n );\n }\n\n if (!fieldEntry.isList) {\n throw new Error(\n `Field '${rule.field}' is not a list relation in model '${currentModel}'. ` +\n `Count operators only apply to one-to-many or many-to-many relations.`,\n );\n }\n\n const targetModel = fieldEntry.type;\n\n let fkOnTarget: string;\n let pkOnCurrent: string;\n\n if (fieldEntry.fromFields && fieldEntry.fromFields.length > 0) {\n // Forward relation (current model has FK) — unusual for list relations but handle it\n if (fieldEntry.fromFields.length > 1) {\n throw new Error(\n `Count operators (atLeast/atMost/exactly) do not support composite FK relations ` +\n `('${currentModel}.${rule.field}'). Use prisma.$queryRaw for composite FK count filtering.`,\n );\n }\n fkOnTarget = fieldEntry.toFields?.[0] ?? 'id';\n pkOnCurrent = fieldEntry.fromFields[0];\n } else {\n // Back-relation: FK is on the target model. Find the reverse relation.\n const reverseRelation = findReverseRelation(\n map,\n targetModel,\n currentModel,\n fieldEntry.relationName,\n );\n if (!reverseRelation) {\n const targetFields = Object.values(map[targetModel]?.fields ?? {});\n const isImplicitM2M = targetFields.some(\n (f) => f.kind === 'object' && f.type === currentModel && f.isList && !f.fromFields?.length,\n );\n throw new Error(\n isImplicitM2M\n ? `'${currentModel}.${rule.field}' is an implicit many-to-many relation. ` +\n `Count operators require an explicit join model with a FK — convert to an explicit ` +\n `@relation or use prisma.$queryRaw.`\n : `Cannot determine FK relationship between '${currentModel}' and '${targetModel}'. ` +\n `Ensure the FieldMap contains both sides of the relation.`,\n );\n }\n if ((reverseRelation.fromFields?.length ?? 0) > 1) {\n throw new Error(\n `Count operators (atLeast/atMost/exactly) do not support composite FK relations ` +\n `('${currentModel}.${rule.field}'). Use prisma.$queryRaw for composite FK count filtering.`,\n );\n }\n fkOnTarget = reverseRelation.fromFields?.[0] ?? '';\n pkOnCurrent = reverseRelation.toFields?.[0] ?? '';\n }\n\n const innerWhere = rule.condition\n ? buildCondition(rule.condition, { ...options, model: targetModel }, state)\n : {};\n\n const count = rule.count ?? 1;\n const having = buildHaving(rule.arrayOperator, count, fkOnTarget);\n\n const step: GroupByStep = {\n operation: 'groupBy',\n model: targetModel,\n args: { by: [fkOnTarget], where: innerWhere, having },\n extract: fkOnTarget,\n };\n\n const stepIndex = state.steps.length;\n state.steps.push(step);\n\n const stepRef: StepRef = { __step: stepIndex };\n return { [pkOnCurrent]: { in: stepRef } };\n};\n\n// Prisma 6.x having format: field first, then _count nested inside.\n// e.g. { fanUserUuid: { _count: { gte: 3 } } } — NOT { _count: { _all: { gte: 3 } } }\nconst buildHaving = (\n op: ArrayOperator,\n count: number,\n groupByField: string,\n): Record<string, unknown> => {\n switch (op) {\n case ArrayOperator.atLeast:\n return { [groupByField]: { _count: { gte: count } } };\n case ArrayOperator.atMost:\n return { [groupByField]: { _count: { lte: count } } };\n case ArrayOperator.exactly:\n return { [groupByField]: { _count: { equals: count } } };\n default:\n throw new Error('unreachable');\n }\n};\n","import { ArrayOperator } from '../operator';\nimport type { ArrayRule, Condition } from '../types';\nimport { buildCountStep } from './countStep';\nimport type { BuildOptions, PrismaBuildState, PrismaWhere } from './types';\nimport { buildNestedFilter } from './utils';\n\n// Forward declaration - provided by condition.ts to avoid circular import\ntype BuildConditionFn = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n) => PrismaWhere;\nlet buildCondition: BuildConditionFn;\n\nexport const setConditionBuilderForArray = (fn: BuildConditionFn) => {\n buildCondition = fn;\n};\n\nexport const buildArrayRule = (\n rule: ArrayRule,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n // Count operators generate a full WHERE clause (step ref) — skip the nested-filter wrapper\n if (\n rule.arrayOperator === ArrayOperator.atLeast ||\n rule.arrayOperator === ArrayOperator.atMost ||\n rule.arrayOperator === ArrayOperator.exactly\n ) {\n if (options?.map && options?.model && state) {\n return buildCountStep(\n rule,\n options as BuildOptions & { map: NonNullable<BuildOptions['map']>; model: string },\n state,\n buildCondition,\n );\n }\n throw new Error(\n `ArrayOperator '${rule.arrayOperator}' requires a FieldMap and model to generate a multi-step plan. ` +\n `Pass { map, model } options to toPrisma(). Without them, use prisma.$queryRaw for count-based relation filtering.`,\n );\n }\n\n const filter = buildArrayLeafFilter(rule, options, state);\n return buildNestedFilter(rule.field, filter);\n};\n\nconst buildArrayLeafFilter = (\n rule: ArrayRule,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): unknown => {\n switch (rule.arrayOperator) {\n case ArrayOperator.all:\n if (!rule.condition) throw new Error(`ArrayOperator 'all' requires a condition`);\n return { every: buildCondition(rule.condition, options, state) };\n\n case ArrayOperator.any:\n if (!rule.condition) throw new Error(`ArrayOperator 'any' requires a condition`);\n return { some: buildCondition(rule.condition, options, state) };\n\n case ArrayOperator.none:\n if (!rule.condition) throw new Error(`ArrayOperator 'none' requires a condition`);\n return { none: buildCondition(rule.condition, options, state) };\n\n case ArrayOperator.empty:\n return { none: {} };\n\n case ArrayOperator.notEmpty:\n return { some: {} };\n\n default:\n throw new Error(`Unknown array operator: ${(rule as ArrayRule).arrayOperator}`);\n }\n};\n","import { get } from 'lodash';\nimport { DateOperator } from '../operator';\nimport type { DateRule } from '../types';\nimport type { BuildOptions, PrismaWhere } from './types';\nimport { buildNestedFilter } from './utils';\n\nexport const buildDateRule = (rule: DateRule, options?: BuildOptions): PrismaWhere => {\n const filter = buildDateLeafFilter(rule, options);\n return buildNestedFilter(rule.field, filter);\n};\n\n/**\n * Resolve the date value for a DateRule.\n * - rule.value → use literal\n * - rule.path starting with '$.' → throw (no column-to-column in Prisma WHERE)\n * - rule.path (context ref) → look up from options.context\n */\nconst resolveDateValue = (rule: DateRule, options?: BuildOptions): unknown => {\n if (rule.value !== undefined) return rule.value;\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n throw new Error(\n `Prisma WHERE has no column-to-column date comparison for path '${rule.path}'. ` +\n `Use prisma.$queryRaw for field-to-field filtering.`,\n );\n }\n if (!options?.context) {\n throw new Error(\n `options.context is required to resolve date path '${rule.path}'. ` +\n `Pass context when calling toPrisma().`,\n );\n }\n return get(options.context, rule.path);\n }\n return undefined;\n};\n\nconst buildDateLeafFilter = (rule: DateRule, options?: BuildOptions): unknown => {\n const val = () => resolveDateValue(rule, options);\n\n switch (rule.dateOperator) {\n case DateOperator.before:\n return { lt: val() };\n\n case DateOperator.after:\n return { gt: val() };\n\n case DateOperator.onOrBefore:\n return { lte: val() };\n\n case DateOperator.onOrAfter:\n return { gte: val() };\n\n case DateOperator.between: {\n const v = val();\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('between date operator requires an array of two values');\n }\n const [start, end] = normalizeDateRange(v);\n return { gte: start, lte: end };\n }\n\n case DateOperator.notBetween: {\n const v = val();\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('notBetween date operator requires an array of two values');\n }\n const [start, end] = normalizeDateRange(v);\n return { NOT: { gte: start, lte: end } };\n }\n\n case DateOperator.dayIn:\n throw new Error(\n `DateOperator 'dayIn' has no Prisma equivalent. Use prisma.$queryRaw with EXTRACT(DOW FROM ...) for day-of-week filtering.`,\n );\n\n case DateOperator.dayNotIn:\n throw new Error(\n `DateOperator 'dayNotIn' has no Prisma equivalent. Use prisma.$queryRaw with EXTRACT(DOW FROM ...) for day-of-week filtering.`,\n );\n\n default:\n throw new Error(`Unknown date operator: ${(rule as DateRule).dateOperator}`);\n }\n};\n\nconst normalizeDateRange = (value: unknown[]): [unknown, unknown] => {\n const [first, second] = value;\n return compareDateValues(first, second) <= 0 ? [first, second] : [second, first];\n};\n\nconst compareDateValues = (left: unknown, right: unknown): number => {\n const lhs = normalizeComparableDateValue(left);\n const rhs = normalizeComparableDateValue(right);\n return lhs < rhs ? -1 : lhs > rhs ? 1 : 0;\n};\n\nconst normalizeComparableDateValue = (value: unknown): string | number => {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number' || typeof value === 'string') return value;\n return String(value);\n};\n","import type { FieldMap } from './types';\n\nexport type MapWalkResult =\n | { kind: 'direct' }\n | { kind: 'json-path'; stopIndex: number; jsonPath: string[] }\n | { kind: 'fallback' };\n\n/**\n * Walk a dot-notation field path through the FieldMap.\n *\n * Returns how to interpret the path:\n * - 'direct' – all segments are relations/scalars, use standard nested filter\n * - 'json-path' – a Json scalar was found mid-path; stopIndex segments form the\n * Prisma nested key, the rest become the JSON path array\n * - 'fallback' – a segment was not found in the map; use existing behavior\n */\nexport const walkFieldPath = (field: string, map: FieldMap, rootModel: string): MapWalkResult => {\n const parts = field.split('.');\n let currentModel = rootModel;\n\n for (let i = 0; i < parts.length; i++) {\n const modelEntry = map[currentModel];\n if (!modelEntry) return { kind: 'fallback' };\n\n const fieldEntry = modelEntry.fields[parts[i]];\n if (!fieldEntry) return { kind: 'fallback' };\n\n if (fieldEntry.kind === 'scalar' && fieldEntry.type === 'Json' && i < parts.length - 1) {\n // This segment is a Json field and there are more segments → JSON path\n return { kind: 'json-path', stopIndex: i + 1, jsonPath: parts.slice(i + 1) };\n }\n\n if (fieldEntry.kind === 'object') {\n if (!map[fieldEntry.type]) return { kind: 'fallback' };\n currentModel = fieldEntry.type;\n continue;\n }\n\n // scalar or enum at a terminal position\n return { kind: 'direct' };\n }\n\n return { kind: 'direct' };\n};\n","import { get } from 'lodash';\nimport { Operator } from '../operator';\nimport type { Rule } from '../types';\nimport { walkFieldPath } from './mapWalk';\nimport type { BuildOptions, PrismaWhere } from './types';\nimport { buildNestedFilter } from './utils';\n\nexport const buildFieldRule = (rule: Rule, options?: BuildOptions): PrismaWhere => {\n // isEmpty/notEmpty need OR/AND at the WHERE level (not field-filter level)\n // because Prisma 6.x rejects mixed null/string in `in`/`notIn` for nullable fields.\n if (rule.operator === Operator.isEmpty) {\n return {\n OR: [\n buildMapAwareFilter(rule.field, { equals: null }, options),\n buildMapAwareFilter(rule.field, { equals: '' }, options),\n ],\n };\n }\n if (rule.operator === Operator.notEmpty) {\n return {\n AND: [\n buildMapAwareFilter(rule.field, { not: null }, options),\n buildMapAwareFilter(rule.field, { not: '' }, options),\n ],\n };\n }\n\n const filter = buildLeafFilter(rule, options);\n return buildMapAwareFilter(rule.field, filter, options);\n};\n\n/**\n * Resolve the comparison value for a rule.\n * - rule.value → use literal value\n * - rule.path starting with '$.' → throw: Prisma WHERE has no column-to-column comparison\n * - rule.path (context ref) → look up from options.context via lodash get\n */\nconst resolveRuleValue = (rule: Rule, options?: BuildOptions): unknown => {\n if (rule.value !== undefined) return rule.value;\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n throw new Error(\n `Prisma WHERE has no column-to-column comparison for path '${rule.path}'. ` +\n `Use prisma.$queryRaw for field-to-field filtering.`,\n );\n }\n if (!options?.context) {\n throw new Error(\n `options.context is required to resolve path '${rule.path}'. ` +\n `Pass context when calling toPrisma().`,\n );\n }\n return get(options.context, rule.path);\n }\n throw new Error(`Rule for field '${rule.field}' has neither value nor path set`);\n};\n\nconst buildLeafFilter = (rule: Rule, options?: BuildOptions): unknown => {\n // Lazy resolver: only called by operators that need a value\n const val = () => resolveRuleValue(rule, options);\n\n switch (rule.operator) {\n case Operator.equals:\n return { equals: val() ?? null };\n\n case Operator.notEquals:\n return { not: val() ?? null };\n\n case Operator.lessThan:\n return { lt: val() };\n\n case Operator.lessThanEquals:\n return { lte: val() };\n\n case Operator.greaterThan:\n return { gt: val() };\n\n case Operator.greaterThanEquals:\n return { gte: val() };\n\n case Operator.in:\n return { in: val() };\n\n case Operator.notIn:\n return { notIn: val() };\n\n case Operator.contains:\n return { contains: val() };\n\n case Operator.notContains:\n return { not: { contains: val() } };\n\n case Operator.startsWith:\n return { startsWith: val() };\n\n case Operator.endsWith:\n return { endsWith: val() };\n\n case Operator.matches:\n throw new Error(\n `Operator 'matches' has no Prisma equivalent. Use prisma.$queryRaw for regex filtering.`,\n );\n\n case Operator.notMatches:\n throw new Error(\n `Operator 'notMatches' has no Prisma equivalent. Use prisma.$queryRaw for regex filtering.`,\n );\n\n case Operator.between: {\n const v = val();\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('between operator requires an array of two values');\n }\n const [min, max] = v[0] <= v[1] ? v : [v[1], v[0]];\n return { gte: min, lte: max };\n }\n\n case Operator.notBetween: {\n const v = val();\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('notBetween operator requires an array of two values');\n }\n const [min, max] = v[0] <= v[1] ? v : [v[1], v[0]];\n return { NOT: { gte: min, lte: max } };\n }\n\n case Operator.isEmpty:\n case Operator.notEmpty:\n // Handled in buildFieldRule — should not reach here\n throw new Error('isEmpty/notEmpty handled at buildFieldRule level');\n\n case Operator.exists:\n return { not: null };\n\n case Operator.notExists:\n return { equals: null };\n\n default:\n throw new Error(`Unknown operator: ${(rule as Rule).operator}`);\n }\n};\n\n/**\n * Build the Prisma WHERE using map-aware traversal when a map+model is available.\n * - JSON field mid-path → Prisma JSON path syntax: { metadata: { path: ['theme'], equals: 'dark' } }\n * - All other paths → standard nested relation filter\n */\nconst buildMapAwareFilter = (\n field: string,\n filter: unknown,\n options?: BuildOptions,\n): PrismaWhere => {\n if (!options?.map || !options?.model) {\n return buildNestedFilter(field, filter);\n }\n\n const walkResult = walkFieldPath(field, options.map, options.model);\n const parts = field.split('.');\n\n switch (walkResult.kind) {\n case 'fallback':\n case 'direct':\n return buildNestedFilter(field, filter);\n\n case 'json-path': {\n // Merge the json path array into the leaf filter, then nest normally\n const jsonFilter = { path: walkResult.jsonPath, ...(filter as object) };\n const fieldUpToJson = parts.slice(0, walkResult.stopIndex).join('.');\n return buildNestedFilter(fieldUpToJson, jsonFilter);\n }\n }\n};\n","import type { All, Any, Condition, IfThenElse } from '../types';\nimport type { BuildOptions, PrismaBuildState, PrismaWhere } from './types';\n\n// Forward declaration - provided by condition.ts to avoid circular import\ntype BuildConditionFn = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n) => PrismaWhere;\nlet buildCondition: BuildConditionFn;\n\nexport const setConditionBuilder = (fn: BuildConditionFn) => {\n buildCondition = fn;\n};\n\nexport const buildAll = (\n all: All,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n if (all.all.length === 0) return {};\n return { AND: all.all.map((c) => buildCondition(c, options, state)) };\n};\n\nexport const buildAny = (\n any: Any,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n if (any.any.length === 0) return { AND: [{ id: null }, { id: { not: null } }] };\n return { OR: any.any.map((c) => buildCondition(c, options, state)) };\n};\n\nexport const buildIfThenElse = (\n cond: IfThenElse,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n // if → then is equivalent to: NOT(if) OR then\n // With else: (NOT(if) OR then) AND (if OR else)\n //\n // Build the `if` clause once to avoid pushing duplicate GroupBySteps into state\n // when the `if` clause contains a count-based array operator (atLeast/atMost/exactly).\n const ifClause = buildCondition(cond.if, options, state);\n const notIf = { NOT: ifClause };\n const thenClause = buildCondition(cond.then, options, state);\n\n if (cond.else) {\n const elseClause = buildCondition(cond.else, options, state);\n return {\n AND: [{ OR: [notIf, thenClause] }, { OR: [ifClause, elseClause] }],\n };\n }\n\n return { OR: [notIf, thenClause] };\n};\n","import type { Condition } from '../types';\nimport { buildAggregateRule, setConditionBuilderForAggregate } from './aggregate';\nimport { buildArrayRule, setConditionBuilderForArray } from './array';\nimport { buildDateRule } from './date';\nimport { buildFieldRule } from './field';\nimport { buildAll, buildAny, buildIfThenElse, setConditionBuilder } from './logical';\nimport type { BuildOptions, PrismaBuildState, PrismaWhere } from './types';\n\nexport const buildCondition = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n if (typeof condition === 'boolean') {\n if (condition) return {};\n throw new Error(\n `Boolean 'false' has no direct Prisma WHERE equivalent. toPrisma is designed for structured Rule conditions.`,\n );\n }\n\n if ('all' in condition) return buildAll(condition, options, state);\n if ('any' in condition) return buildAny(condition, options, state);\n if ('if' in condition) return buildIfThenElse(condition, options, state);\n if ('arrayOperator' in condition) return buildArrayRule(condition, options, state);\n if ('dateOperator' in condition) return buildDateRule(condition, options);\n if ('aggregate' in condition) return buildAggregateRule(condition, options, state);\n if ('field' in condition) return buildFieldRule(condition, options);\n\n throw new Error('Unknown condition type');\n};\n\n// Wire up circular dependencies\nsetConditionBuilder(buildCondition);\nsetConditionBuilderForArray(buildCondition);\nsetConditionBuilderForAggregate(buildCondition);\n","import type { GroupByStep, ToPrismaResult, WhereStep } from './types';\n\n/**\n * Execute a Prisma query plan produced by toPrisma().\n *\n * The plan is a flat list of steps where all but the last are `groupBy` steps\n * that feed results (via { __step: N } sentinels) into subsequent steps.\n * The final step is always a `where` step whose resolved WHERE clause is returned.\n *\n * @param result - Result from toPrisma()\n * @param prismaDelegate - Map of camelCase model name → Prisma delegate\n * e.g. { post: prisma.post, user: prisma.user }\n * @returns The resolved WHERE clause (ready for findMany/count/etc.)\n *\n * @example\n * const plan = toPrisma(condition, { map, model: 'User' });\n * const where = await executePrismaQueryPlan(plan, { post: prisma.post });\n * await prisma.user.findMany({ where });\n */\nexport const executePrismaQueryPlan = async (\n result: ToPrismaResult,\n prismaDelegate: Record<string, Record<string, (...args: unknown[]) => unknown>>,\n): Promise<Record<string, unknown>> => {\n const groupBySteps = result.steps.filter((s): s is GroupByStep => s.operation === 'groupBy');\n const whereStep = result.steps.find((s): s is WhereStep => s.operation === 'where');\n\n if (!whereStep) {\n throw new Error('executePrismaQueryPlan: result has no where step');\n }\n\n const stepResults: unknown[][] = [];\n\n for (const step of groupBySteps) {\n const modelKey = step.model.charAt(0).toLowerCase() + step.model.slice(1);\n const delegate = prismaDelegate[modelKey];\n if (!delegate) {\n throw new Error(\n `executePrismaQueryPlan: no delegate for model '${step.model}'. ` +\n `Ensure prismaDelegate has a key '${modelKey}'.`,\n );\n }\n const rows = await delegate[step.operation](step.args);\n stepResults.push((rows as Record<string, unknown>[]).map((r) => r[step.extract]));\n }\n\n return resolveStepRefs(whereStep.where, stepResults) as Record<string, unknown>;\n};\n\n/**\n * Recursively replace { __step: N } sentinels with the corresponding step result array.\n */\nconst resolveStepRefs = (obj: unknown, stepResults: unknown[][]): unknown => {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveStepRefs(item, stepResults));\n }\n\n if (typeof obj === 'object') {\n const record = obj as Record<string, unknown>;\n\n if ('__step' in record && typeof record.__step === 'number') {\n const idx = record.__step;\n if (idx >= stepResults.length) {\n throw new Error(\n `Step ref __step: ${idx} out of range (${stepResults.length} steps executed)`,\n );\n }\n return stepResults[idx];\n }\n\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n resolved[key] = resolveStepRefs(value, stepResults);\n }\n return resolved;\n }\n\n return obj;\n};\n","import type { Condition } from '../types';\nimport { buildCondition } from './condition';\nimport type { BuildOptions, PrismaBuildState, ToPrismaResult } from './types';\n\nexport { executePrismaQueryPlan } from './execute';\nexport type {\n BuildOptions,\n FieldMap,\n FieldMapEntry,\n GroupByStep,\n PrismaStep,\n PrismaWhere,\n StepRef,\n ToPrismaResult,\n WhereStep,\n} from './types';\n\n/**\n * Convert a json-rules Condition to a Prisma query plan.\n *\n * Returns a `ToPrismaResult` with:\n * - `where` – the Prisma WHERE clause\n * - `steps` – optional array of groupBy steps for count-based relation filters\n * (only present when `atLeast`/`atMost`/`exactly` operators are used with a map)\n *\n * When `steps` is present, pass the result to `executePrismaQueryPlan` to\n * resolve step refs before using `where` in a Prisma query.\n *\n * @param condition - The rule condition to convert\n * @param options - Optional map, model, and context\n *\n * @example\n * ```typescript\n * // Simple scalar\n * toPrisma({ field: 'status', operator: Operator.equals, value: 'active' })\n * // → { where: { status: { equals: 'active' } } }\n *\n * // JSON field detection (map required)\n * toPrisma({ field: 'metadata.theme', operator: Operator.equals, value: 'dark' }, { map, model: 'User' })\n * // → { where: { metadata: { path: ['theme'], equals: 'dark' } } }\n *\n * // Context path ref\n * toPrisma({ field: 'userId', operator: Operator.equals, path: 'currentUser.id' }, { context: { currentUser: { id: '123' } } })\n * // → { where: { userId: { equals: '123' } } }\n *\n * // Multi-step (map required)\n * const plan = toPrisma({ field: 'posts', arrayOperator: 'atLeast', count: 3, condition: {...} }, { map, model: 'User' });\n * const where = await executePrismaQueryPlan(plan, { post: prisma.post });\n * await prisma.user.findMany({ where });\n * ```\n */\nexport const toPrisma = (condition: Condition, options?: BuildOptions): ToPrismaResult => {\n const state: PrismaBuildState = { steps: [] };\n const where = buildCondition(condition, options, state);\n return {\n steps: [...state.steps, { operation: 'where', where }],\n };\n};\n","import type { BuilderState } from './types';\n\nexport const nextParam = (state: BuilderState, value: unknown): string => {\n state.params.push(value);\n return `$${++state.paramIndex}`;\n};\n","import { escapeIdentifier } from 'pg';\n\n/**\n * Escape a value for use in a LIKE pattern.\n * Escapes \\, %, and _ which are special characters in PostgreSQL LIKE.\n */\nexport const escapeLikePattern = (value: string): string => {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\n};\n\n/**\n * Quote a field name as a SQL identifier, handling JSON paths.\n * Uses pg's escapeIdentifier for proper SQL injection prevention.\n *\n * Examples:\n * \"name\" → \"name\"\n * \"data.theme\" → \"data\"->>'theme'\n * \"settings.display.mode\" → \"settings\"->'display'->>'mode'\n */\nexport const quoteField = (field: string): string => {\n const parts = field.split('.');\n if (parts.length === 1) return escapeIdentifier(field);\n\n const [column, ...jsonPath] = parts;\n if (jsonPath.length === 0) return escapeIdentifier(column);\n\n return buildJsonPath(escapeIdentifier(column), jsonPath);\n};\n\n/**\n * Quote a field (with possible JSON sub-path) qualified with a table alias.\n *\n * Examples:\n * quoteQualifiedField('name', 't0') → \"t0\".\"name\"\n * quoteQualifiedField('data.theme', 't0') → \"t0\".\"data\"->>'theme'\n * quoteQualifiedField('data.a.b', 't0') → \"t0\".\"data\"->'a'->>'b'\n */\nexport const quoteQualifiedField = (field: string, alias: string): string => {\n const parts = field.split('.');\n if (parts.length === 1) {\n return `${escapeIdentifier(alias)}.${escapeIdentifier(field)}`;\n }\n\n const [column, ...jsonPath] = parts;\n return buildJsonPath(`${escapeIdentifier(alias)}.${escapeIdentifier(column)}`, jsonPath);\n};\n\nconst escapeJsonKey = (key: string) => `'${key.replace(/'/g, \"''\")}'`;\n\nconst buildJsonPath = (columnExpr: string, jsonPath: string[]): string => {\n if (jsonPath.length === 0) return columnExpr;\n\n const pathParts = jsonPath.slice(0, -1).map(escapeJsonKey).join('->');\n const leaf = escapeJsonKey(jsonPath[jsonPath.length - 1]);\n\n if (pathParts) {\n return `${columnExpr}->${pathParts}->>${leaf}`;\n }\n return `${columnExpr}->>${leaf}`;\n};\n\n/**\n * Like quoteField but keeps the leaf as JSONB (uses -> instead of ->> at the end).\n * Required when the result must be a JSONB value, e.g. as input to jsonb_array_elements().\n *\n * Examples:\n * \"scores\" → \"scores\"\n * \"settings.scores\" → \"settings\"->'scores'\n */\nexport const quoteFieldAsJsonb = (field: string): string => {\n const parts = field.split('.');\n if (parts.length === 1) return escapeIdentifier(field);\n\n const [column, ...jsonPath] = parts;\n if (jsonPath.length === 0) return escapeIdentifier(column);\n\n return buildJsonPathJsonb(escapeIdentifier(column), jsonPath);\n};\n\nconst buildJsonPathJsonb = (columnExpr: string, jsonPath: string[]): string => {\n const allParts = jsonPath.map(escapeJsonKey).join('->');\n return `${columnExpr}->${allParts}`;\n};\n","import { get } from 'lodash';\nimport { escapeIdentifier } from 'pg';\nimport { Operator } from '../operator';\nimport type { AggregateRule } from '../types';\nimport { nextParam } from './params';\nimport { quoteField, quoteFieldAsJsonb } from './quoting';\nimport type { BuilderState } from './types';\n\nexport const buildAggregateRule = (rule: AggregateRule, state: BuilderState): string => {\n if (rule.condition) {\n throw new Error(\n `Aggregate condition filtering is not yet supported by toSql(). ` +\n `Use check() for in-memory evaluation or toPrisma() for database queries.`,\n );\n }\n\n const subquery = buildAggregateSubquery(rule, state);\n return buildAggregateComparison(subquery, rule, state);\n};\n\nconst buildAggregateSubquery = (rule: AggregateRule, state: BuilderState): string => {\n // Use JSONB-preserving field reference — aggregate functions need JSONB input, not text\n const field = quoteFieldAsJsonb(rule.field);\n const { mode, field: itemField } = rule.aggregate;\n const fn = mode === 'sum' ? 'SUM' : 'AVG';\n\n const fieldEntry = state.map?.[state.currentModel ?? '']?.fields[rule.field];\n\n if (fieldEntry?.kind === 'object') {\n throw new Error(\n `Field '${rule.field}' is a relation — toSql() cannot aggregate relation lists. Use toPrisma() instead.`,\n );\n }\n\n if (itemField?.includes('.')) {\n throw new Error(\n `aggregate.field '${itemField}' contains a nested path — toSql() only supports flat field names. Use check() for nested paths.`,\n );\n }\n\n const isNative = fieldEntry?.kind === 'scalar' && fieldEntry?.isList === true;\n\n if (isNative) {\n if (itemField) {\n throw new Error(\n `aggregate.field is not supported for native array types. Use a JSONB column for object arrays.`,\n );\n }\n const agg = fn === 'SUM' ? `COALESCE(SUM(elem), 0)` : `AVG(elem)`;\n return `(SELECT ${agg} FROM unnest(${field}) AS elem)`;\n }\n\n if (itemField) {\n // JSONB object array\n const extract = `(elem->>'${itemField}')::numeric`;\n const agg = fn === 'SUM' ? `COALESCE(SUM(${extract}), 0)` : `AVG(${extract})`;\n return `(SELECT ${agg} FROM jsonb_array_elements(${field}) AS elem)`;\n }\n\n // JSONB primitive array\n const extract = `elem::numeric`;\n const agg = fn === 'SUM' ? `COALESCE(SUM(${extract}), 0)` : `AVG(${extract})`;\n return `(SELECT ${agg} FROM jsonb_array_elements_text(${field}) AS elem)`;\n};\n\ntype ResolvedRhs = { type: 'value'; value: unknown } | { type: 'column'; sql: string };\n\nconst resolveRhs = (rule: AggregateRule, state: BuilderState): ResolvedRhs => {\n if (rule.value !== undefined) return { type: 'value', value: rule.value };\n\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n const refField = rule.path.substring(2);\n const sql = state.currentAlias\n ? `${escapeIdentifier(state.currentAlias)}.${escapeIdentifier(refField)}`\n : quoteField(refField);\n return { type: 'column', sql };\n }\n if (!state.context) {\n throw new Error(\n `BuilderState.context is required to resolve path '${rule.path}'. Pass context in options.`,\n );\n }\n return { type: 'value', value: get(state.context, rule.path) };\n }\n\n throw new Error('Aggregate rule requires value or path');\n};\n\nconst buildAggregateComparison = (\n lhs: string,\n rule: AggregateRule,\n state: BuilderState,\n): string => {\n const rhs = resolveRhs(rule, state);\n const rhsVal = rhs.type === 'value' ? rhs.value : undefined;\n const rhsCol = rhs.type === 'column' ? rhs.sql : undefined;\n\n switch (rule.operator) {\n case Operator.equals:\n if (rhsCol) return `${lhs} = ${rhsCol}`;\n if (rhsVal === null) return `${lhs} IS NULL`;\n return `${lhs} = ${nextParam(state, rhsVal)}`;\n case Operator.notEquals:\n if (rhsCol) return `${lhs} <> ${rhsCol}`;\n if (rhsVal === null) return `${lhs} IS NOT NULL`;\n return `${lhs} <> ${nextParam(state, rhsVal)}`;\n case Operator.lessThan:\n if (rhsCol) return `${lhs} < ${rhsCol}`;\n return `${lhs} < ${nextParam(state, rhsVal)}`;\n case Operator.lessThanEquals:\n if (rhsCol) return `${lhs} <= ${rhsCol}`;\n return `${lhs} <= ${nextParam(state, rhsVal)}`;\n case Operator.greaterThan:\n if (rhsCol) return `${lhs} > ${rhsCol}`;\n return `${lhs} > ${nextParam(state, rhsVal)}`;\n case Operator.greaterThanEquals:\n if (rhsCol) return `${lhs} >= ${rhsCol}`;\n return `${lhs} >= ${nextParam(state, rhsVal)}`;\n case Operator.between: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) throw new Error('between requires two values');\n const [min, max] = (v[0] as number) <= (v[1] as number) ? v : [v[1], v[0]];\n return `${lhs} BETWEEN ${nextParam(state, min)} AND ${nextParam(state, max)}`;\n }\n case Operator.notBetween: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) throw new Error('notBetween requires two values');\n const [min, max] = (v[0] as number) <= (v[1] as number) ? v : [v[1], v[0]];\n return `${lhs} NOT BETWEEN ${nextParam(state, min)} AND ${nextParam(state, max)}`;\n }\n default:\n throw new Error(`Operator '${rule.operator}' is not supported for aggregate rules`);\n }\n};\n","import { ArrayOperator } from '../operator';\nimport type { ArrayRule } from '../types';\nimport { quoteField } from './quoting';\nimport type { BuilderState } from './types';\n\nexport const buildArrayRule = (rule: ArrayRule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n const fieldEntry = state.map?.[state.currentModel ?? '']?.fields[rule.field];\n const isNative = fieldEntry?.kind === 'scalar' && fieldEntry?.isList === true;\n\n // Different length functions for JSONB vs native PostgreSQL arrays\n const lengthFn = isNative\n ? `array_length(${field}, 1)` // Native: TEXT[], INT[], etc.\n : `jsonb_array_length(${field})`; // JSONB arrays\n\n switch (rule.arrayOperator) {\n case ArrayOperator.empty:\n if (isNative) {\n // Native arrays: NULL or empty (array_length returns NULL for empty)\n return `(${field} IS NULL OR ${lengthFn} IS NULL)`;\n }\n return `(${field} IS NULL OR ${lengthFn} = 0)`;\n\n case ArrayOperator.notEmpty:\n if (isNative) {\n return `(${field} IS NOT NULL AND ${lengthFn} IS NOT NULL)`;\n }\n return `(${field} IS NOT NULL AND ${lengthFn} > 0)`;\n\n case ArrayOperator.all:\n case ArrayOperator.any:\n case ArrayOperator.none:\n case ArrayOperator.atLeast:\n case ArrayOperator.atMost:\n case ArrayOperator.exactly:\n throw new Error(\n `Array operator '${rule.arrayOperator}' with conditions is not supported in SQL. ` +\n 'Use application-level filtering for complex array operations.',\n );\n\n default:\n throw new Error(`Unknown array operator: ${(rule as ArrayRule).arrayOperator}`);\n }\n};\n","export const mapDayNames = (days: string[]): number[] => {\n const dayMap: Record<string, number> = {\n sunday: 0,\n monday: 1,\n tuesday: 2,\n wednesday: 3,\n thursday: 4,\n friday: 5,\n saturday: 6,\n };\n return days.map((d) => {\n const num = dayMap[d.toLowerCase()];\n if (num === undefined) throw new Error(`Unknown day name: ${d}`);\n return num;\n });\n};\n","import { escapeIdentifier } from 'pg';\nimport type { FieldMapEntry } from '../toPrisma/types';\nimport { quoteField, quoteQualifiedField } from './quoting';\nimport type { BuilderState, FieldMap } from './types';\n\n/**\n * Resolve a dot-notation field to a fully-qualified SQL expression,\n * generating LEFT JOINs for any relation traversals found in the map.\n *\n * Falls back to quoteField() when map/model/alias are not set or a\n * segment is not found in the map.\n *\n * Mutates state.joins, state.joinCounter, and state.joinRegistry.\n */\nexport const resolveFieldSql = (field: string, state: BuilderState): string => {\n if (!state.map || !state.currentModel || !state.currentAlias) {\n return quoteField(field);\n }\n\n const parts = field.split('.');\n let currentModel = state.currentModel;\n let currentAlias = state.currentAlias;\n\n for (let i = 0; i < parts.length; i++) {\n const modelEntry = state.map[currentModel];\n if (!modelEntry) return quoteField(field); // fallback\n\n const fieldEntry = modelEntry.fields[parts[i]];\n if (!fieldEntry) return quoteField(field); // fallback\n\n if (fieldEntry.kind === 'object') {\n // Traverse relation: generate (or reuse) a JOIN\n const registryKey = `${currentAlias}.${parts[i]}`;\n const existingAlias = state.joinRegistry?.get(registryKey);\n let targetAlias: string;\n\n if (existingAlias) {\n targetAlias = existingAlias;\n } else {\n const joinCounter = state.joinCounter;\n if (!joinCounter) return quoteField(field);\n\n targetAlias = `t${++joinCounter.n}`;\n const joinClause = buildJoinClause(\n state.map,\n currentModel,\n currentAlias,\n fieldEntry,\n targetAlias,\n );\n if (!joinClause) return quoteField(field); // fallback: can't determine FK\n\n state.joins?.push(joinClause);\n state.joinRegistry?.set(registryKey, targetAlias);\n }\n\n currentModel = fieldEntry.type;\n currentAlias = targetAlias;\n continue;\n }\n\n // scalar or enum — remaining parts are either the column itself or JSON sub-path\n const remaining = parts.slice(i);\n return quoteQualifiedField(remaining.join('.'), currentAlias);\n }\n\n // Reached end after only traversing relations (field is the relation itself)\n return quoteField(field);\n};\n\n/**\n * Build a LEFT JOIN clause string for a relation field traversal.\n * Returns null when the FK cannot be determined.\n */\nconst buildJoinClause = (\n map: FieldMap,\n currentModel: string,\n currentAlias: string,\n fieldEntry: FieldMapEntry,\n targetAlias: string,\n): string | null => {\n const targetModel = fieldEntry.type;\n const targetDbName = map[targetModel]?.dbName ?? targetModel;\n\n let onCondition: string;\n\n if (\n fieldEntry.fromFields &&\n fieldEntry.fromFields.length > 0 &&\n fieldEntry.toFields &&\n fieldEntry.toFields.length > 0\n ) {\n // Forward relation: current model has FK (composite FK supported via multi-condition AND)\n onCondition = fieldEntry.fromFields\n .map(\n (from, i) =>\n `${escapeIdentifier(targetAlias)}.${escapeIdentifier(fieldEntry.toFields?.[i] ?? '')} = ` +\n `${escapeIdentifier(currentAlias)}.${escapeIdentifier(from)}`,\n )\n .join(' AND ');\n } else {\n // Back-relation: FK is on the target model — find the reverse relation.\n // Pass relationName so multiple relations between the same two models are disambiguated.\n const reverse = findReverseRelation(map, targetModel, currentModel, fieldEntry.relationName);\n if (!reverse) return null;\n onCondition = (reverse.fromFields ?? [])\n .map(\n (from, i) =>\n `${escapeIdentifier(targetAlias)}.${escapeIdentifier(from)} = ` +\n `${escapeIdentifier(currentAlias)}.${escapeIdentifier(reverse.toFields?.[i] ?? '')}`,\n )\n .join(' AND ');\n }\n\n return `LEFT JOIN ${escapeIdentifier(targetDbName as string)} AS ${escapeIdentifier(targetAlias)} ON ${onCondition}`;\n};\n\nconst findReverseRelation = (\n map: FieldMap,\n targetModel: string,\n currentModel: string,\n relationName?: string,\n): FieldMapEntry | null => {\n const targetEntry = map[targetModel];\n if (!targetEntry) return null;\n\n for (const fieldDef of Object.values(targetEntry.fields)) {\n if (\n fieldDef.kind === 'object' &&\n fieldDef.type === currentModel &&\n (fieldDef.fromFields?.length ?? 0) > 0 &&\n (fieldDef.toFields?.length ?? 0) > 0 &&\n (relationName === undefined || fieldDef.relationName === relationName)\n ) {\n return fieldDef;\n }\n }\n return null;\n};\n","import { get } from 'lodash';\nimport { escapeIdentifier } from 'pg';\nimport { DateOperator } from '../operator';\nimport type { DateRule } from '../types';\nimport { mapDayNames } from './dayNames';\nimport { resolveFieldSql } from './join';\nimport { nextParam } from './params';\nimport { quoteField } from './quoting';\nimport type { BuilderState } from './types';\n\nexport const buildDateRule = (rule: DateRule, state: BuilderState): string => {\n const field = resolveFieldSql(rule.field, state);\n const rhs = resolveDateRhs(rule, state);\n\n const rhsVal = rhs.type === 'value' ? rhs.value : undefined;\n const rhsCol = rhs.type === 'column' ? rhs.sql : undefined;\n\n switch (rule.dateOperator) {\n case DateOperator.before:\n if (rhsCol !== undefined) return `${field} < ${rhsCol}`;\n return `${field} < ${nextParam(state, rhsVal)}`;\n\n case DateOperator.after:\n if (rhsCol !== undefined) return `${field} > ${rhsCol}`;\n return `${field} > ${nextParam(state, rhsVal)}`;\n\n case DateOperator.onOrBefore:\n if (rhsCol !== undefined) return `${field} <= ${rhsCol}`;\n return `${field} <= ${nextParam(state, rhsVal)}`;\n\n case DateOperator.onOrAfter:\n if (rhsCol !== undefined) return `${field} >= ${rhsCol}`;\n return `${field} >= ${nextParam(state, rhsVal)}`;\n\n case DateOperator.between: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('between date operator requires an array of two values');\n }\n const [start, end] = normalizeDateRange(v);\n return `${field} BETWEEN ${nextParam(state, start)} AND ${nextParam(state, end)}`;\n }\n\n case DateOperator.notBetween: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('notBetween date operator requires an array of two values');\n }\n const [start, end] = normalizeDateRange(v);\n return `${field} NOT BETWEEN ${nextParam(state, start)} AND ${nextParam(state, end)}`;\n }\n\n case DateOperator.dayIn: {\n if (!Array.isArray(rule.value)) {\n throw new Error('dayIn operator requires an array of day names');\n }\n const days = mapDayNames(rule.value.map((day) => String(day)));\n return `EXTRACT(DOW FROM ${field}) = ANY(${nextParam(state, days)})`;\n }\n\n case DateOperator.dayNotIn: {\n if (!Array.isArray(rule.value)) {\n throw new Error('dayNotIn operator requires an array of day names');\n }\n const days = mapDayNames(rule.value.map((day) => String(day)));\n return `EXTRACT(DOW FROM ${field}) <> ALL(${nextParam(state, days)})`;\n }\n\n default:\n throw new Error(`Unknown date operator: ${(rule as DateRule).dateOperator}`);\n }\n};\n\nconst normalizeDateRange = (value: unknown[]): [unknown, unknown] => {\n const [first, second] = value;\n return compareDateValues(first, second) <= 0 ? [first, second] : [second, first];\n};\n\nconst compareDateValues = (left: unknown, right: unknown): number => {\n const lhs = normalizeComparableDateValue(left);\n const rhs = normalizeComparableDateValue(right);\n return lhs < rhs ? -1 : lhs > rhs ? 1 : 0;\n};\n\nconst normalizeComparableDateValue = (value: unknown): string | number => {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number' || typeof value === 'string') return value;\n return String(value);\n};\n\ntype ResolvedRhs = { type: 'value'; value: unknown } | { type: 'column'; sql: string };\n\nconst resolveDateRhs = (rule: DateRule, state: BuilderState): ResolvedRhs => {\n if (rule.value !== undefined) {\n return { type: 'value', value: rule.value };\n }\n\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n const refField = rule.path.substring(2);\n const sql = state.currentAlias\n ? `${escapeIdentifier(state.currentAlias)}.${escapeIdentifier(refField)}`\n : quoteField(refField);\n return { type: 'column', sql };\n }\n\n if (!state.context) {\n throw new Error(\n `BuilderState.context is required to resolve date path '${rule.path}'. ` +\n `Pass context in options when calling toSql().`,\n );\n }\n return { type: 'value', value: get(state.context, rule.path) };\n }\n\n return { type: 'value', value: undefined };\n};\n","import { get } from 'lodash';\nimport { escapeIdentifier } from 'pg';\nimport { Operator } from '../operator';\nimport type { Rule } from '../types';\nimport { resolveFieldSql } from './join';\nimport { nextParam } from './params';\nimport { escapeLikePattern, quoteField } from './quoting';\nimport type { BuilderState } from './types';\n\nexport const buildFieldRule = (rule: Rule, state: BuilderState): string => {\n const field = resolveFieldSql(rule.field, state);\n const rhs = resolveComparison(rule, state);\n\n // Extract both variants up front so TypeScript doesn't need to narrow inside each case\n const rhsVal = rhs.type === 'value' ? rhs.value : undefined;\n const rhsCol = rhs.type === 'column' ? rhs.sql : undefined;\n\n switch (rule.operator) {\n case Operator.equals:\n if (rhsCol !== undefined) return `${field} = ${rhsCol}`;\n if (rhsVal === null) return `${field} IS NULL`;\n return `${field} = ${nextParam(state, rhsVal)}`;\n\n case Operator.notEquals:\n if (rhsCol !== undefined) return `${field} <> ${rhsCol}`;\n if (rhsVal === null) return `${field} IS NOT NULL`;\n return `${field} <> ${nextParam(state, rhsVal)}`;\n\n case Operator.lessThan:\n if (rhsCol !== undefined) return `${field} < ${rhsCol}`;\n return `${field} < ${nextParam(state, rhsVal)}`;\n\n case Operator.lessThanEquals:\n if (rhsCol !== undefined) return `${field} <= ${rhsCol}`;\n return `${field} <= ${nextParam(state, rhsVal)}`;\n\n case Operator.greaterThan:\n if (rhsCol !== undefined) return `${field} > ${rhsCol}`;\n return `${field} > ${nextParam(state, rhsVal)}`;\n\n case Operator.greaterThanEquals:\n if (rhsCol !== undefined) return `${field} >= ${rhsCol}`;\n return `${field} >= ${nextParam(state, rhsVal)}`;\n\n case Operator.in:\n if (!Array.isArray(rhsVal) || rhsVal.length === 0) return 'FALSE';\n return `${field} = ANY(${nextParam(state, rhsVal)})`;\n\n case Operator.notIn:\n if (!Array.isArray(rhsVal) || rhsVal.length === 0) return 'TRUE';\n return `${field} <> ALL(${nextParam(state, rhsVal)})`;\n\n case Operator.contains:\n return `${field} LIKE ${nextParam(state, `%${escapeLikePattern(String(rhsVal))}%`)}`;\n\n case Operator.notContains:\n return `${field} NOT LIKE ${nextParam(state, `%${escapeLikePattern(String(rhsVal))}%`)}`;\n\n case Operator.startsWith:\n return `${field} LIKE ${nextParam(state, `${escapeLikePattern(String(rhsVal))}%`)}`;\n\n case Operator.endsWith:\n return `${field} LIKE ${nextParam(state, `%${escapeLikePattern(String(rhsVal))}`)}`;\n\n case Operator.matches:\n return `${field} ~ ${nextParam(state, rhsVal)}`;\n\n case Operator.notMatches:\n return `${field} !~ ${nextParam(state, rhsVal)}`;\n\n case Operator.between: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('between operator requires an array of two values');\n }\n const [min, max] = (v[0] as number) <= (v[1] as number) ? v : [v[1], v[0]];\n return `${field} BETWEEN ${nextParam(state, min)} AND ${nextParam(state, max)}`;\n }\n\n case Operator.notBetween: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('notBetween operator requires an array of two values');\n }\n const [min, max] = (v[0] as number) <= (v[1] as number) ? v : [v[1], v[0]];\n return `${field} NOT BETWEEN ${nextParam(state, min)} AND ${nextParam(state, max)}`;\n }\n\n case Operator.isEmpty:\n return `(${field} IS NULL OR ${field} = '')`;\n\n case Operator.notEmpty:\n return `(${field} IS NOT NULL AND ${field} <> '')`;\n\n case Operator.exists:\n return `${field} IS NOT NULL`;\n\n case Operator.notExists:\n return `${field} IS NULL`;\n\n default:\n throw new Error(`Unknown operator: ${(rule as Rule).operator}`);\n }\n};\n\ntype ResolvedRhs = { type: 'value'; value: unknown } | { type: 'column'; sql: string };\n\n/**\n * Resolve the right-hand side of a comparison from a Rule.\n *\n * - rule.value set → { type: 'value', value }\n * - rule.path = '$.field' → { type: 'column', sql: '\"alias\".\"field\"' } (column-to-column)\n * - rule.path = 'ctx.key' → { type: 'value', value: context[key] } (external context)\n * - neither set → { type: 'value', value: undefined } for no-value operators\n */\nconst resolveComparison = (rule: Rule, state: BuilderState): ResolvedRhs => {\n if (rule.value !== undefined) {\n return { type: 'value', value: rule.value };\n }\n\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n const refField = rule.path.substring(2);\n const sql = state.currentAlias\n ? `${escapeIdentifier(state.currentAlias)}.${escapeIdentifier(refField)}`\n : quoteField(refField);\n return { type: 'column', sql };\n }\n\n if (!state.context) {\n throw new Error(\n `BuilderState.context is required to resolve path '${rule.path}'. ` +\n `Pass context in options when calling toSql().`,\n );\n }\n return { type: 'value', value: get(state.context, rule.path) };\n }\n\n // No value, no path — valid for no-value operators (isEmpty, notEmpty, exists, notExists)\n return { type: 'value', value: undefined };\n};\n","import type { All, Any, Condition, IfThenElse } from '../types';\nimport type { BuilderState } from './types';\n\n// Forward declaration - will be provided by condition.ts\ntype BuildConditionFn = (condition: Condition, state: BuilderState) => string;\nlet buildCondition: BuildConditionFn;\n\nexport const setConditionBuilder = (fn: BuildConditionFn) => {\n buildCondition = fn;\n};\n\nexport const buildAll = (all: All, state: BuilderState): string => {\n if (all.all.length === 0) return 'TRUE';\n const clauses = all.all.map((c) => buildCondition(c, state));\n return `(${clauses.join(' AND ')})`;\n};\n\nexport const buildAny = (any: Any, state: BuilderState): string => {\n if (any.any.length === 0) return 'FALSE';\n const clauses = any.any.map((c) => buildCondition(c, state));\n return `(${clauses.join(' OR ')})`;\n};\n\nexport const buildIfThenElse = (cond: IfThenElse, state: BuilderState): string => {\n const ifClause = buildCondition(cond.if, state);\n const thenClause = buildCondition(cond.then, state);\n const elseClause = cond.else ? buildCondition(cond.else, state) : 'TRUE';\n\n // if → then is equivalent to: NOT(if) OR then\n // With else: (NOT(if) OR then) AND (if OR else)\n if (cond.else) {\n return `((NOT(${ifClause}) OR ${thenClause}) AND (${ifClause} OR ${elseClause}))`;\n }\n return `(NOT(${ifClause}) OR ${thenClause})`;\n};\n","import type { Condition } from '../types';\nimport { buildAggregateRule } from './aggregate';\nimport { buildArrayRule } from './array';\nimport { buildDateRule } from './date';\nimport { buildFieldRule } from './field';\nimport { buildAll, buildAny, buildIfThenElse, setConditionBuilder } from './logical';\nimport type { BuilderState } from './types';\n\nexport const buildCondition = (condition: Condition, state: BuilderState): string => {\n if (typeof condition === 'boolean') {\n return condition ? 'TRUE' : 'FALSE';\n }\n\n if ('all' in condition) return buildAll(condition, state);\n if ('any' in condition) return buildAny(condition, state);\n if ('if' in condition) return buildIfThenElse(condition, state);\n if ('arrayOperator' in condition) return buildArrayRule(condition, state);\n if ('dateOperator' in condition) return buildDateRule(condition, state);\n if ('aggregate' in condition) return buildAggregateRule(condition, state);\n if ('field' in condition) return buildFieldRule(condition, state);\n\n throw new Error('Unknown condition type');\n};\n\n// Wire up circular dependency\nsetConditionBuilder(buildCondition);\n","import type { Condition } from '../types';\nimport { buildCondition } from './condition';\nimport type { BuilderState, FieldMap, SqlResult } from './types';\n\nexport type { FieldMap, SqlResult } from './types';\n\ntype SqlBuildOptions = {\n map?: FieldMap;\n model?: string;\n alias?: string; // root table alias, defaults to 't0' when map is provided\n context?: Record<string, unknown>;\n};\n\n/**\n * Convert a json-rules Condition to a PostgreSQL WHERE clause.\n *\n * @param condition - The rule condition to convert\n * @param options - Optional map/model/alias for JOIN generation; context for path refs\n * @returns Object with `sql`, `params`, and `joins` (LEFT JOIN clauses)\n *\n * @example\n * ```typescript\n * // Simple field\n * const { sql, params } = toSql({ field: 'status', operator: Operator.equals, value: 'active' });\n * // sql: '\"status\" = $1'\n *\n * // Relation traversal with JOINs (map required)\n * const { sql, params, joins } = toSql(\n * { field: 'author.email', operator: Operator.equals, value: 'a@b.com' },\n * { map, model: 'Post', alias: 't0' }\n * );\n * // sql: '\"t1\".\"email\" = $1'\n * // joins: ['LEFT JOIN \"User\" AS \"t1\" ON \"t1\".\"id\" = \"t0\".\"authorId\"']\n *\n * // Same-record field comparison ($.field)\n * const { sql: sql2 } = toSql({ field: 'endDate', operator: Operator.greaterThan, path: '$.startDate' });\n * // sql2: '\"endDate\" > \"startDate\"'\n *\n * // External context ref\n * const { sql: sql3 } = toSql(\n * { field: 'userId', operator: Operator.equals, path: 'currentUser.id' },\n * { context: { currentUser: { id: '123' } } }\n * );\n * // sql3: '\"userId\" = $1' params: ['123']\n * ```\n */\nexport const toSql = (condition: Condition, options?: SqlBuildOptions): SqlResult => {\n const hasMap = !!(options?.map && options?.model);\n const rootAlias = options?.alias ?? (hasMap ? 't0' : undefined);\n\n const state: BuilderState = {\n params: [],\n paramIndex: 0,\n context: options?.context,\n map: options?.map,\n currentModel: options?.model,\n currentAlias: rootAlias,\n joinCounter: hasMap ? { n: 0 } : undefined,\n joins: hasMap ? [] : undefined,\n joinRegistry: hasMap ? new Map() : undefined,\n };\n\n const sql = buildCondition(condition, state);\n return { sql, params: state.params, joins: state.joins ?? [] };\n};\n","import { ArrayOperator, DateOperator, Operator } from './operator';\nimport type { Condition, DateInputValue, OrderedRuleValue } from './types';\n\nexport type RuleValidationTarget = 'check' | 'toPrisma' | 'toSql';\n\nexport type ValidationIssue = {\n path: string;\n message: string;\n code: string;\n};\n\nexport type ValidationResult = {\n ok: boolean;\n errors: ValidationIssue[];\n};\n\ntype ValidationContext = {\n target: RuleValidationTarget;\n errors: ValidationIssue[];\n};\n\nconst FIELD_OPERATORS = new Set<string>(Object.values(Operator));\nconst ARRAY_OPERATORS = new Set<string>(Object.values(ArrayOperator));\nconst DATE_OPERATORS = new Set<string>(Object.values(DateOperator));\n\nexport const validateRule = (\n condition: unknown,\n options: { target?: RuleValidationTarget } = {},\n): ValidationResult => {\n const context: ValidationContext = {\n target: options.target ?? 'check',\n errors: [],\n };\n\n validateCondition(condition, '$', context);\n return { ok: context.errors.length === 0, errors: context.errors };\n};\n\nexport const assertValidRule = (\n condition: unknown,\n options: { target?: RuleValidationTarget } = {},\n): asserts condition is Condition => {\n const result = validateRule(condition, options);\n if (result.ok) return;\n\n const message = result.errors.map((error) => `${error.path}: ${error.message}`).join('\\n');\n throw new Error(`Invalid rule:\\n${message}`);\n};\n\nconst validateCondition = (condition: unknown, path: string, context: ValidationContext): void => {\n if (typeof condition === 'boolean') {\n if (context.target === 'toPrisma' && condition === false) {\n pushIssue(\n context,\n path,\n 'boolean_false_not_supported',\n `Boolean 'false' is not supported by toPrisma()`,\n );\n }\n return;\n }\n\n if (!isPlainObject(condition)) {\n pushIssue(context, path, 'invalid_condition', 'Condition must be a boolean or object');\n return;\n }\n\n const shape = detectShape(condition);\n if (!shape) {\n pushIssue(\n context,\n path,\n 'ambiguous_condition',\n 'Condition must be exactly one of: field rule, array rule, date rule, all, any, or if/then[/else]',\n );\n return;\n }\n\n switch (shape) {\n case 'all':\n validateLogicalArray(condition.all, `${path}.all`, context);\n break;\n case 'any':\n validateLogicalArray(condition.any, `${path}.any`, context);\n break;\n case 'if':\n validateCondition(condition.if, `${path}.if`, context);\n validateCondition(condition.then, `${path}.then`, context);\n if ('else' in condition && condition.else !== undefined) {\n validateCondition(condition.else, `${path}.else`, context);\n }\n break;\n case 'field':\n validateFieldRule(condition, path, context);\n break;\n case 'aggregate':\n validateAggregateRule(condition, path, context);\n break;\n case 'array':\n validateArrayRule(condition, path, context);\n break;\n case 'date':\n validateDateRule(condition, path, context);\n break;\n }\n};\n\nconst detectShape = (\n condition: Record<string, unknown>,\n): 'all' | 'any' | 'if' | 'field' | 'aggregate' | 'array' | 'date' | null => {\n const shapes: string[] = [];\n if ('all' in condition) shapes.push('all');\n if ('any' in condition) shapes.push('any');\n if ('if' in condition || 'then' in condition || 'else' in condition) shapes.push('if');\n if ('arrayOperator' in condition) shapes.push('array');\n if ('dateOperator' in condition) shapes.push('date');\n if ('aggregate' in condition) shapes.push('aggregate');\n else if ('operator' in condition) shapes.push('field');\n\n const uniqueShapes = Array.from(new Set(shapes));\n if (uniqueShapes.length !== 1) return null;\n return uniqueShapes[0] as 'all' | 'any' | 'if' | 'field' | 'aggregate' | 'array' | 'date';\n};\n\nconst validateLogicalArray = (value: unknown, path: string, context: ValidationContext): void => {\n if (!Array.isArray(value)) {\n pushIssue(\n context,\n path,\n 'logical_array_required',\n 'Logical operator requires an array of conditions',\n );\n return;\n }\n\n value.forEach((item, index) => {\n validateCondition(item, `${path}[${index}]`, context);\n });\n};\n\nconst validateFieldRule = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if (typeof rule.field !== 'string') {\n pushIssue(context, `${path}.field`, 'field_required', 'Field rule requires a string field');\n }\n\n if (typeof rule.operator !== 'string' || !FIELD_OPERATORS.has(rule.operator)) {\n pushIssue(context, `${path}.operator`, 'invalid_operator', 'Unknown field operator');\n return;\n }\n\n const operator = rule.operator as Operator;\n\n if (context.target === 'toPrisma') {\n if ((operator === Operator.matches || operator === Operator.notMatches) && 'operator' in rule) {\n pushIssue(\n context,\n `${path}.operator`,\n 'unsupported_prisma_operator',\n `Operator '${operator}' is not supported by toPrisma()`,\n );\n }\n if (typeof rule.path === 'string' && rule.path.startsWith('$.')) {\n pushIssue(\n context,\n `${path}.path`,\n 'unsupported_prisma_path',\n `Path '${rule.path}' is not supported by toPrisma()`,\n );\n }\n }\n\n if (isPresenceOperator(operator)) {\n forbidValueAndPath(rule, path, context);\n return;\n }\n\n if (!requireValueOrPath(rule, path, context)) return;\n\n if ('path' in rule && typeof rule.path === 'string') return;\n\n const value = rule.value;\n switch (operator) {\n case Operator.lessThan:\n case Operator.lessThanEquals:\n case Operator.greaterThan:\n case Operator.greaterThanEquals:\n if (!isOrderedRuleValue(value)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_ordered_value',\n `Operator '${operator}' requires a string, number, or Date value`,\n );\n }\n break;\n case Operator.in:\n case Operator.notIn:\n if (!Array.isArray(value)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_membership_value',\n `Operator '${operator}' requires an array value`,\n );\n }\n break;\n case Operator.matches:\n case Operator.notMatches:\n if (!(typeof value === 'string' || value instanceof RegExp)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_pattern_value',\n `Operator '${operator}' requires a string or RegExp value`,\n );\n }\n break;\n case Operator.startsWith:\n case Operator.endsWith:\n if (typeof value !== 'string') {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_string_value',\n `Operator '${operator}' requires a string value`,\n );\n }\n break;\n case Operator.between:\n case Operator.notBetween:\n if (!isOrderedRange(value)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_range_value',\n `Operator '${operator}' requires a two-item range`,\n );\n }\n break;\n }\n};\n\nconst AGGREGATE_SINGLE_OPERATORS = new Set<string>([\n Operator.equals,\n Operator.notEquals,\n Operator.lessThan,\n Operator.lessThanEquals,\n Operator.greaterThan,\n Operator.greaterThanEquals,\n]);\n\nconst AGGREGATE_RANGE_OPERATORS = new Set<string>([Operator.between, Operator.notBetween]);\n\nconst validateAggregateRule = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if (typeof rule.field !== 'string') {\n pushIssue(context, `${path}.field`, 'field_required', 'Aggregate rule requires a string field');\n }\n\n if (!isPlainObject(rule.aggregate)) {\n pushIssue(context, `${path}.aggregate`, 'invalid_aggregate', 'aggregate must be an object');\n return;\n }\n\n const agg = rule.aggregate as Record<string, unknown>;\n if (agg.mode !== 'sum' && agg.mode !== 'avg') {\n pushIssue(\n context,\n `${path}.aggregate.mode`,\n 'invalid_aggregate_mode',\n \"aggregate.mode must be 'sum' or 'avg'\",\n );\n }\n\n if ('field' in agg && agg.field !== undefined && typeof agg.field !== 'string') {\n pushIssue(\n context,\n `${path}.aggregate.field`,\n 'invalid_aggregate_field',\n 'aggregate.field must be a string',\n );\n }\n\n const isSingle =\n typeof rule.operator === 'string' && AGGREGATE_SINGLE_OPERATORS.has(rule.operator);\n const isRange = typeof rule.operator === 'string' && AGGREGATE_RANGE_OPERATORS.has(rule.operator);\n\n if (!isSingle && !isRange) {\n pushIssue(\n context,\n `${path}.operator`,\n 'invalid_aggregate_operator',\n `Aggregate rules only support: equals, notEquals, lessThan, lessThanEquals, greaterThan, greaterThanEquals, between, notBetween`,\n );\n return;\n }\n\n if (context.target === 'toPrisma' && rule.operator === Operator.notBetween) {\n pushIssue(\n context,\n `${path}.operator`,\n 'unsupported_prisma_aggregate_operator',\n `Operator 'notBetween' is not supported by toPrisma() for aggregate rules`,\n );\n }\n\n if (context.target === 'toPrisma' && typeof rule.path === 'string') {\n pushIssue(\n context,\n `${path}.path`,\n 'unsupported_prisma_aggregate_path',\n `path is not supported by toPrisma() for aggregate rules; use value instead`,\n );\n }\n\n if ('condition' in rule && rule.condition !== undefined) {\n if (context.target === 'toSql') {\n pushIssue(\n context,\n `${path}.condition`,\n 'unsupported_sql_aggregate_condition',\n `Aggregate condition filtering is not supported by toSql(); use check() or toPrisma()`,\n );\n }\n validateCondition(rule.condition, `${path}.condition`, context);\n }\n\n if (!requireValueOrPath(rule, path, context)) return;\n if ('path' in rule && typeof rule.path === 'string') return;\n\n const value = rule.value;\n if (isRange) {\n if (!isNumericRange(value)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_range_value',\n `Operator '${rule.operator}' requires a two-item numeric range`,\n );\n }\n } else {\n if (typeof value !== 'number') {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_aggregate_value',\n `Aggregate rule value must be a number`,\n );\n }\n }\n};\n\nconst validateArrayRule = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if (typeof rule.field !== 'string') {\n pushIssue(context, `${path}.field`, 'field_required', 'Array rule requires a string field');\n }\n\n if (typeof rule.arrayOperator !== 'string' || !ARRAY_OPERATORS.has(rule.arrayOperator)) {\n pushIssue(context, `${path}.arrayOperator`, 'invalid_array_operator', 'Unknown array operator');\n return;\n }\n\n const operator = rule.arrayOperator as ArrayOperator;\n\n if (context.target === 'toSql' && isComplexArrayOperator(operator)) {\n pushIssue(\n context,\n `${path}.arrayOperator`,\n 'unsupported_sql_array_operator',\n `Array operator '${operator}' is not supported by toSql()`,\n );\n }\n\n switch (operator) {\n case ArrayOperator.empty:\n case ArrayOperator.notEmpty:\n if ('condition' in rule && rule.condition !== undefined) {\n pushIssue(\n context,\n `${path}.condition`,\n 'unexpected_condition',\n `Array operator '${operator}' does not accept condition`,\n );\n }\n if ('count' in rule && rule.count !== undefined) {\n pushIssue(\n context,\n `${path}.count`,\n 'unexpected_count',\n `Array operator '${operator}' does not accept count`,\n );\n }\n break;\n case ArrayOperator.all:\n case ArrayOperator.any:\n case ArrayOperator.none:\n if (!('condition' in rule) || rule.condition === undefined) {\n pushIssue(\n context,\n `${path}.condition`,\n 'missing_condition',\n `Array operator '${operator}' requires condition`,\n );\n } else {\n validateCondition(rule.condition, `${path}.condition`, context);\n }\n if ('count' in rule && rule.count !== undefined) {\n pushIssue(\n context,\n `${path}.count`,\n 'unexpected_count',\n `Array operator '${operator}' does not accept count`,\n );\n }\n break;\n case ArrayOperator.atLeast:\n case ArrayOperator.atMost:\n case ArrayOperator.exactly:\n if (context.target !== 'toPrisma' && typeof rule.count !== 'number') {\n pushIssue(\n context,\n `${path}.count`,\n 'missing_count',\n `Array operator '${operator}' requires count`,\n );\n } else if ('count' in rule && rule.count !== undefined && typeof rule.count !== 'number') {\n pushIssue(context, `${path}.count`, 'invalid_count', 'count must be a number');\n }\n if (context.target === 'check' && (!('condition' in rule) || rule.condition === undefined)) {\n pushIssue(\n context,\n `${path}.condition`,\n 'missing_condition',\n `Array operator '${operator}' requires condition for check()`,\n );\n } else if ('condition' in rule && rule.condition !== undefined) {\n validateCondition(rule.condition, `${path}.condition`, context);\n }\n break;\n }\n};\n\nconst validateDateRule = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if (typeof rule.field !== 'string') {\n pushIssue(context, `${path}.field`, 'field_required', 'Date rule requires a string field');\n }\n\n if (typeof rule.dateOperator !== 'string' || !DATE_OPERATORS.has(rule.dateOperator)) {\n pushIssue(context, `${path}.dateOperator`, 'invalid_date_operator', 'Unknown date operator');\n return;\n }\n\n const operator = rule.dateOperator as DateOperator;\n\n if (context.target === 'toPrisma') {\n if (\n (operator === DateOperator.dayIn || operator === DateOperator.dayNotIn) &&\n 'dateOperator' in rule\n ) {\n pushIssue(\n context,\n `${path}.dateOperator`,\n 'unsupported_prisma_date_operator',\n `Date operator '${operator}' is not supported by toPrisma()`,\n );\n }\n if (typeof rule.path === 'string' && rule.path.startsWith('$.')) {\n pushIssue(\n context,\n `${path}.path`,\n 'unsupported_prisma_path',\n `Path '${rule.path}' is not supported by toPrisma()`,\n );\n }\n }\n\n switch (operator) {\n case DateOperator.dayIn:\n case DateOperator.dayNotIn:\n if (!Array.isArray(rule.value) || !rule.value.every((item) => typeof item === 'string')) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_day_list',\n `Date operator '${operator}' requires an array of day names`,\n );\n }\n if ('path' in rule && rule.path !== undefined) {\n pushIssue(\n context,\n `${path}.path`,\n 'unexpected_path',\n `Date operator '${operator}' does not accept path`,\n );\n }\n return;\n case DateOperator.between:\n case DateOperator.notBetween:\n if (!requireValueOrPath(rule, path, context)) return;\n if ('path' in rule && typeof rule.path === 'string') return;\n if (!isDateRange(rule.value)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_date_range',\n `Date operator '${operator}' requires a two-item date range`,\n );\n }\n return;\n default:\n if (!requireValueOrPath(rule, path, context)) return;\n if ('path' in rule && typeof rule.path === 'string') return;\n if (!isDateInputValue(rule.value)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_date_value',\n `Date operator '${operator}' requires a date-like value`,\n );\n }\n }\n};\n\nconst requireValueOrPath = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): boolean => {\n const hasValue = 'value' in rule && rule.value !== undefined;\n const hasPath = typeof rule.path === 'string';\n\n if (hasValue && hasPath) {\n pushIssue(context, path, 'ambiguous_value_source', 'Rule cannot define both value and path');\n return false;\n }\n\n if (!hasValue && !hasPath) {\n pushIssue(context, path, 'missing_value_source', 'Rule requires either value or path');\n return false;\n }\n\n return true;\n};\n\nconst forbidValueAndPath = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if ('value' in rule && rule.value !== undefined) {\n pushIssue(context, `${path}.value`, 'unexpected_value', 'Rule does not accept value');\n }\n if ('path' in rule && rule.path !== undefined) {\n pushIssue(context, `${path}.path`, 'unexpected_path', 'Rule does not accept path');\n }\n};\n\nconst isPresenceOperator = (operator: Operator): boolean =>\n operator === Operator.isEmpty ||\n operator === Operator.notEmpty ||\n operator === Operator.exists ||\n operator === Operator.notExists;\n\nconst isComplexArrayOperator = (operator: ArrayOperator): boolean =>\n operator === ArrayOperator.all ||\n operator === ArrayOperator.any ||\n operator === ArrayOperator.none ||\n operator === ArrayOperator.atLeast ||\n operator === ArrayOperator.atMost ||\n operator === ArrayOperator.exactly;\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst isOrderedRuleValue = (value: unknown): value is OrderedRuleValue =>\n typeof value === 'string' || typeof value === 'number' || value instanceof Date;\n\nconst isOrderedRange = (value: unknown): value is [OrderedRuleValue, OrderedRuleValue] =>\n Array.isArray(value) &&\n value.length === 2 &&\n isOrderedRuleValue(value[0]) &&\n isOrderedRuleValue(value[1]);\n\nconst isNumericRange = (value: unknown): value is [number, number] =>\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'number' &&\n typeof value[1] === 'number';\n\nconst isDateInputValue = (value: unknown): value is DateInputValue =>\n typeof value === 'string' || typeof value === 'number' || value instanceof Date;\n\nconst isDateRange = (value: unknown): value is [DateInputValue, DateInputValue] =>\n Array.isArray(value) &&\n value.length === 2 &&\n isDateInputValue(value[0]) &&\n isDateInputValue(value[1]);\n\nconst pushIssue = (\n context: ValidationContext,\n path: string,\n code: string,\n message: string,\n): void => {\n context.errors.push({ path, code, message });\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/operator.ts","../src/date.ts","../src/field.ts","../src/check.ts","../src/fieldMap/buildBridgeDictionary.ts","../src/fieldMap/stitch.ts","../src/fieldMap/validate.ts","../src/lens/walk.ts","../src/lens/applyLens.ts","../src/lens/project.ts","../src/lens/checkRule.ts","../src/lens/createLens.ts","../src/lens/narrowing.ts","../src/operatorCatalog.ts","../src/toPrisma/relationUtils.ts","../src/toPrisma/utils.ts","../src/toPrisma/aggregate.ts","../src/toPrisma/countStep.ts","../src/toPrisma/array.ts","../src/toPrisma/date.ts","../src/toPrisma/mapWalk.ts","../src/toPrisma/field.ts","../src/toPrisma/logical.ts","../src/toPrisma/condition.ts","../src/toPrisma/execute.ts","../src/toPrisma/index.ts","../src/toSql/escape.ts","../src/toSql/params.ts","../src/toSql/quoting.ts","../src/toSql/aggregate.ts","../src/toSql/array.ts","../src/toSql/dayNames.ts","../src/toSql/join.ts","../src/toSql/date.ts","../src/toSql/field.ts","../src/toSql/logical.ts","../src/toSql/condition.ts","../src/toSql/index.ts","../src/validate.ts"],"names":["Operator","ArrayOperator","DateOperator","dayjs","utc","timezone","isSameOrBefore","isSameOrAfter","checkDate","condition","data","context","fieldValue","get","isDateInputValue","fieldDate","getError","op","dates","parseCompareDates","compareDate","endDate","dayName","allowedDays","day","excludedDays","excludedDay","_fieldDate","rawDate1","rawDate2","date1","parseDateWithTimezone","date2","startDate","value","pathValue","date","valueStr","fieldStr","offset","match","checkField","needsValue","getValue","compareOrderedValues","containsValue","hasMatch","range","normalizeRange","isOrderedValue","comparableFieldValue","toOrderedPrimitive","min","max","isEmpty","left","right","operator","lhs","rhs","rawMin","rawMax","container","search","validateRootArrayShape","rule","c","check","conditions","options","opts","all","any","checkArray","checkAggregate","checkIfThenElse","error","errors","result","arrayValue","mode","itemField","nestedCondition","numbers","item","index","raw","loc","sum","s","n","msg","a","b","defaultMsg","requiresCondition","requiresCount","itemCondition","count","matches","failures","some","isObject","results","r","buildBridgeDictionary","set","rawData","out","bridge","aKey","bKey","keyBy","groupBy","stitchFieldMaps","aOwner","bOwner","isOneToMany","FORBIDDEN_FIELD_CHARS","validateFieldMapSet","mapName","fieldMap","modelName","model","fieldName","entry","validateFieldMap","isLens","x","getRoot","visited","cursor","collectChain","list","resolveRelationTarget","currentMap","m","walkPath","startMap","startModel","path","parts","target","applyLens","narrowing","chain","applyToModel","keep","f","relField","sub","targetMap","projectNarrowing","lensOrNarrowing","root","mapNarrowing","modelNarrowing","aBridgeKey","bBridgeKey","aHasKey","bHasKey","visit","cond","violations","nextMap","nextModel","resolved","aggField","checkRuleAgainstLens","projectedSet","createLens","input","validateModelNode","ancestorChain","modelFields","position","anc","targetFields","childAncestorChain","validateNarrowing","ancestors","v","FieldKind","NUMERIC_KINDS","ORDERABLE_KINDS","STRINGY_KINDS","EQUATABLE_KINDS","ALL_KINDS","RuleTarget","ALL_TARGETS","NON_SQL_TARGETS","NON_PRISMA_TARGETS","ValueShape","FIELD_OPERATOR_CATALOG","DATE_OPERATOR_CATALOG","ARRAY_OPERATOR_CATALOG","AGGREGATE_SINGLE_VALUE_SHAPES","AGGREGATE_RANGE_VALUE_SHAPES","AGGREGATE_OPERATORS","isAggregateSingleOperator","isAggregateRangeOperator","getValueShape","isOperatorSupportedForTarget","getOperatorsForKind","kind","field","getArrayOperators","findReverseRelation","map","targetModel","currentModel","relationName","targetEntry","fieldDef","buildNestedFilter","filter","i","buildConditionRef","setConditionBuilderForAggregate","fn","buildAggregateRule","state","buildAggregateStep","walkAggregateFieldPath","rootModel","segments","intermediateRelations","seg","fieldEntry","terminalModel","terminalEntry","targetFieldEntry","fkOnTarget","pkOnTerminal","reverseRelation","innerWhere","aggKey","having","buildPrismaFilter","step","stepIndex","stepRef","leafFilter","relationPath","buildCountStep","buildCondition","pkOnCurrent","isImplicitM2M","buildHaving","groupByField","setConditionBuilderForArray","buildArrayRule","buildArrayLeafFilter","buildDateRule","buildDateLeafFilter","resolveDateValue","val","start","end","normalizeDateRange","first","second","compareDateValues","normalizeComparableDateValue","walkFieldPath","modelEntry","buildFieldRule","buildMapAwareFilter","buildLeafFilter","resolveRuleValue","walkResult","jsonFilter","fieldUpToJson","setConditionBuilder","buildAll","buildAny","buildIfThenElse","ifClause","notIf","thenClause","elseClause","executePrismaQueryPlan","prismaDelegate","groupBySteps","whereStep","stepResults","modelKey","delegate","rows","resolveStepRefs","obj","record","idx","key","normalizeOptions","toPrisma","where","escapeIdentifier","identifier","nextParam","escapeLikePattern","quoteField","column","jsonPath","buildJsonPath","quoteQualifiedField","alias","escapeJsonKey","columnExpr","pathParts","leaf","quoteFieldAsJsonb","buildJsonPathJsonb","allParts","subquery","buildAggregateSubquery","buildAggregateComparison","extract","resolveRhs","refField","rhsVal","rhsCol","isNative","lengthFn","mapDayNames","days","dayMap","d","num","resolveFieldSql","currentAlias","registryKey","existingAlias","targetAlias","joinCounter","joinClause","buildJoinClause","remaining","targetDbName","onCondition","from","reverse","resolveDateRhs","resolveComparison","pathHitsBridge","cur","me","fe","toSql","hasMap","rootAlias","FIELD_OPERATORS","ARRAY_OPERATORS","DATE_OPERATORS","validateRule","validateCondition","assertValidRule","message","pushIssue","isPlainObject","shape","detectShape","validateLogicalArray","validateFieldRule","validateAggregateRule","validateArrayRule","validateDateRule","shapes","uniqueShapes","targetSlug","forbidValueAndPath","requireValueOrPath","validateValueShape","isOrderedRuleValue","isOrderedRange","agg","isSingle","isRange","isNumericRange","isDateRange","hasValue","hasPath","code"],"mappings":"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","file":"index.cjs","sourcesContent":["export const Operator = {\n equals: 'equals',\n notEquals: 'notEquals',\n lessThan: 'lessThan',\n lessThanEquals: 'lessThanEquals',\n greaterThan: 'greaterThan',\n greaterThanEquals: 'greaterThanEquals',\n contains: 'contains',\n notContains: 'notContains',\n in: 'in',\n notIn: 'notIn',\n matches: 'matches',\n notMatches: 'notMatches',\n between: 'between',\n notBetween: 'notBetween',\n isEmpty: 'isEmpty',\n notEmpty: 'notEmpty',\n exists: 'exists',\n notExists: 'notExists',\n startsWith: 'startsWith',\n endsWith: 'endsWith',\n} as const;\n\nexport type Operator = (typeof Operator)[keyof typeof Operator];\n\nexport const ArrayOperator = {\n all: 'all',\n any: 'any',\n none: 'none',\n atLeast: 'atLeast',\n atMost: 'atMost',\n exactly: 'exactly',\n empty: 'empty',\n notEmpty: 'notEmpty',\n} as const;\n\nexport type ArrayOperator = (typeof ArrayOperator)[keyof typeof ArrayOperator];\n\nexport const DateOperator = {\n before: 'before',\n after: 'after',\n onOrBefore: 'onOrBefore',\n onOrAfter: 'onOrAfter',\n between: 'between',\n notBetween: 'notBetween',\n dayIn: 'dayIn',\n dayNotIn: 'dayNotIn',\n} as const;\n\nexport type DateOperator = (typeof DateOperator)[keyof typeof DateOperator];\n","import dayjs from 'dayjs';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter.js';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore.js';\nimport timezone from 'dayjs/plugin/timezone.js';\nimport utc from 'dayjs/plugin/utc.js';\nimport { get } from 'lodash';\nimport { DateOperator } from './operator';\nimport type { DateInputValue, DateRule } from './types';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(isSameOrBefore);\ndayjs.extend(isSameOrAfter);\n\nexport const checkDate = <TData extends Record<string, unknown>>(\n condition: DateRule,\n data: TData,\n context: TData,\n): boolean | string => {\n const fieldValue = get(data, condition.field) as unknown;\n\n if (!fieldValue) throw new Error(`${condition.field} is null or undefined`);\n if (!isDateInputValue(fieldValue))\n throw new Error(`${condition.field} is not a valid date: ${String(fieldValue)}`);\n\n const fieldDate = dayjs(fieldValue);\n\n if (!fieldDate.isValid())\n throw new Error(`${condition.field} is not a valid date: ${fieldValue}`);\n\n const getError = (op: string) => condition.error || `${condition.field} ${op}`;\n\n // Parse comparison dates with timezone context - pass the original string to preserve offset info\n const dates = parseCompareDates(condition, data, context, fieldDate, fieldValue);\n const compareDate = dates[0];\n const endDate = dates[1];\n\n switch (condition.dateOperator) {\n case DateOperator.before:\n return fieldDate.isBefore(compareDate) || getError(`must be before ${compareDate.format()}`);\n\n case DateOperator.after:\n return fieldDate.isAfter(compareDate) || getError(`must be after ${compareDate.format()}`);\n\n case DateOperator.onOrBefore:\n return (\n fieldDate.isSameOrBefore(compareDate) ||\n getError(`must be on or before ${compareDate.format()}`)\n );\n\n case DateOperator.onOrAfter:\n return (\n fieldDate.isSameOrAfter(compareDate) ||\n getError(`must be on or after ${compareDate.format()}`)\n );\n\n case DateOperator.between: {\n if (!endDate) throw new Error('between operator requires an end date');\n return (\n (fieldDate.isSameOrAfter(compareDate) && fieldDate.isSameOrBefore(endDate)) ||\n getError(`must be between ${compareDate.format()} and ${endDate?.format()}`)\n );\n }\n\n case DateOperator.notBetween: {\n if (!endDate) throw new Error('notBetween operator requires an end date');\n return (\n fieldDate.isBefore(compareDate) ||\n fieldDate.isAfter(endDate) ||\n getError(`must not be between ${compareDate.format()} and ${endDate?.format()}`)\n );\n }\n\n case DateOperator.dayIn: {\n if (!Array.isArray(condition.value))\n throw new Error('dayIn operator requires an array of day names');\n const dayName = fieldDate.format('dddd').toLowerCase();\n const allowedDays = condition.value.map((day) => String(day).toLowerCase());\n return allowedDays.includes(dayName) || getError(`must be on ${allowedDays.join(' or ')}`);\n }\n\n case DateOperator.dayNotIn: {\n if (!Array.isArray(condition.value))\n throw new Error('dayNotIn operator requires an array of day names');\n const day = fieldDate.format('dddd').toLowerCase();\n const excludedDays = condition.value.map((excludedDay) => String(excludedDay).toLowerCase());\n return !excludedDays.includes(day) || getError(`must not be on ${excludedDays.join(' or ')}`);\n }\n\n default:\n throw new Error('Unknown date operator');\n }\n};\n\nconst parseCompareDates = <TData extends Record<string, unknown>>(\n condition: DateRule,\n data: TData,\n context: TData,\n _fieldDate: dayjs.Dayjs,\n fieldValue: DateInputValue,\n): [dayjs.Dayjs, dayjs.Dayjs | undefined] => {\n const requiresTwoDates: DateOperator[] = [DateOperator.between, DateOperator.notBetween];\n\n if (requiresTwoDates.includes(condition.dateOperator)) {\n if (!Array.isArray(condition.value) || condition.value.length !== 2)\n throw new Error(`${condition.dateOperator} operator requires an array of two dates`);\n const [rawDate1, rawDate2] = condition.value as [DateInputValue, DateInputValue];\n const date1 = parseDateWithTimezone(rawDate1, fieldValue);\n const date2 = parseDateWithTimezone(rawDate2, fieldValue);\n if (!date1.isValid()) throw new Error(`Invalid start date: ${condition.value[0]}`);\n if (!date2.isValid()) throw new Error(`Invalid end date: ${condition.value[1]}`);\n // Auto-sort: ensure startDate <= endDate\n const [startDate, endDate] =\n date1.isBefore(date2) || date1.isSame(date2) ? [date1, date2] : [date2, date1];\n return [startDate, endDate];\n }\n\n const requiresOneDate: DateOperator[] = [\n DateOperator.before,\n DateOperator.after,\n DateOperator.onOrBefore,\n DateOperator.onOrAfter,\n ];\n\n if (requiresOneDate.includes(condition.dateOperator)) {\n let value: DateInputValue | undefined;\n if (condition.value !== undefined) {\n if (Array.isArray(condition.value)) {\n throw new Error(`${condition.dateOperator} operator requires a single date value`);\n }\n value = condition.value as DateInputValue;\n } else if (condition.path) {\n // Support $.path for current element\n if (condition.path.startsWith('$.')) {\n const pathValue = get(data, condition.path.substring(2)) as unknown;\n value = isDateInputValue(pathValue) ? pathValue : undefined;\n } else {\n const pathValue = get(context, condition.path) as unknown;\n value = isDateInputValue(pathValue) ? pathValue : undefined;\n }\n } else {\n throw new Error('No value or path specified for date comparison');\n }\n const date = parseDateWithTimezone(value, fieldValue);\n if (!date.isValid()) throw new Error(`Invalid comparison date: ${value}`);\n return [date, undefined];\n }\n\n return [dayjs(), undefined]; // Won't be used for dayIn/dayNotIn\n};\n\nconst parseDateWithTimezone = (\n value: DateInputValue | undefined,\n fieldValue: DateInputValue,\n): dayjs.Dayjs => {\n const valueStr = String(value);\n\n // Check if value has explicit timezone information\n const hasTimezone =\n valueStr.includes('Z') ||\n (valueStr.includes('T') && (valueStr.includes('+') || valueStr.match(/T.*-\\d{2}:/)));\n\n if (hasTimezone) return dayjs(value);\n\n // No timezone info in value - interpret in field's timezone\n // Extract offset from field value\n const fieldStr = String(fieldValue);\n let offset = 0;\n\n if (fieldStr.includes('+') || (fieldStr.includes('T') && fieldStr.match(/T.*-\\d{2}:/))) {\n // Field has explicit offset like +11:00 or -08:00\n const match = fieldStr.match(/([+-])(\\d{2}):(\\d{2})/);\n if (match) {\n const sign = match[1] === '+' ? 1 : -1;\n offset = sign * (parseInt(match[2], 10) * 60 + parseInt(match[3], 10));\n }\n } else if (!fieldStr.includes('Z')) {\n // Field has no timezone, assume local time (offset 0)\n offset = 0;\n }\n // If field has Z, it's UTC (offset 0)\n\n // Create a date representing the same local time as the field's timezone\n if (valueStr.match(/^\\d{4}-\\d{2}-\\d{2}$/)) {\n // For date-only, we want midnight in the field's timezone\n const localMidnight = dayjs(`${value}T00:00:00`);\n return localMidnight.subtract(offset, 'minute');\n }\n\n // For datetime without timezone, interpret as local time in field's timezone\n const localTime = dayjs(value);\n return localTime.subtract(offset, 'minute');\n};\n\nconst isDateInputValue = (value: unknown): value is DateInputValue =>\n typeof value === 'string' || typeof value === 'number' || value instanceof Date;\n","import { get, isEmpty } from 'lodash';\nimport { Operator } from './operator';\nimport type { Rule } from './types';\n\nexport const checkField = <TData extends Record<string, unknown>>(\n condition: Rule,\n data: TData,\n context: TData,\n): boolean | string => {\n // Use data for field access (current element) but context remains available for path references\n const fieldValue = get(data, condition.field) as unknown;\n\n // Operators that don't need a value\n const noValueOps: Operator[] = [\n Operator.isEmpty,\n Operator.notEmpty,\n Operator.exists,\n Operator.notExists,\n ];\n const needsValue = !noValueOps.includes(condition.operator);\n const value = needsValue ? getValue(condition, data, context) : undefined;\n\n const getError = (op: string) =>\n condition.error || `${condition.field} ${op}${needsValue ? ` ${JSON.stringify(value)}` : ''}`;\n\n switch (condition.operator) {\n case Operator.equals:\n return fieldValue === value || getError(`must equal`);\n case Operator.notEquals:\n return fieldValue !== value || getError(`must not equal`);\n case Operator.lessThan:\n return compareOrderedValues(fieldValue, value, 'lt') || getError(`must be less than`);\n case Operator.lessThanEquals:\n return (\n compareOrderedValues(fieldValue, value, 'lte') || getError(`must be less than or equal to`)\n );\n case Operator.greaterThan:\n return compareOrderedValues(fieldValue, value, 'gt') || getError(`must be greater than`);\n case Operator.greaterThanEquals:\n return (\n compareOrderedValues(fieldValue, value, 'gte') ||\n getError(`must be greater than or equal to`)\n );\n case Operator.in:\n return (Array.isArray(value) && value.includes(fieldValue)) || getError(`must be one of`);\n case Operator.notIn:\n return !Array.isArray(value) || !value.includes(fieldValue) || getError(`must not be one of`);\n case Operator.contains:\n return containsValue(fieldValue, value) || getError(`must contain`);\n case Operator.notContains:\n return !containsValue(fieldValue, value) || getError(`must not contain`);\n case Operator.matches:\n return (\n (hasMatch(fieldValue) &&\n (value instanceof RegExp || typeof value === 'string') &&\n !!fieldValue.match(value)) ||\n getError(`must match pattern`)\n );\n case Operator.notMatches:\n return (\n !hasMatch(fieldValue) ||\n !(value instanceof RegExp || typeof value === 'string') ||\n !fieldValue.match(value) ||\n getError(`must not match pattern`)\n );\n case Operator.between: {\n const range = normalizeRange(value);\n if (!range) throw new Error('between operator requires an array of two values');\n if (!isOrderedValue(fieldValue)) return getError(`must be between`);\n const comparableFieldValue = toOrderedPrimitive(fieldValue);\n const [min, max] = range;\n return (\n (comparableFieldValue >= min && comparableFieldValue <= max) || getError(`must be between`)\n );\n }\n case Operator.notBetween: {\n const range = normalizeRange(value);\n if (!range) throw new Error('notBetween operator requires an array of two values');\n if (!isOrderedValue(fieldValue)) return true;\n const comparableFieldValue = toOrderedPrimitive(fieldValue);\n const [min, max] = range;\n return (\n comparableFieldValue < min || comparableFieldValue > max || getError(`must not be between`)\n );\n }\n case Operator.isEmpty:\n return isEmpty(fieldValue) || getError(`must be empty`);\n case Operator.notEmpty:\n return !isEmpty(fieldValue) || getError(`must not be empty`);\n case Operator.exists:\n return fieldValue !== undefined || getError(`must exist`);\n case Operator.notExists:\n return fieldValue === undefined || getError(`must not exist`);\n case Operator.startsWith:\n return (\n (typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.startsWith(value)) ||\n getError(`must start with`)\n );\n case Operator.endsWith:\n return (\n (typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.endsWith(value)) ||\n getError(`must end with`)\n );\n default:\n throw new Error('Unknown operator');\n }\n};\n\nconst getValue = <TData extends Record<string, unknown>>(\n condition: Rule,\n data: TData,\n context: TData,\n): unknown => {\n if (condition.value !== undefined) return condition.value;\n if (condition.path) {\n // Special case: if path starts with \"$.\" use data (current element)\n if (condition.path.startsWith('$.')) {\n return get(data, condition.path.substring(2));\n }\n // Otherwise use context (root data)\n return get(context, condition.path);\n }\n throw new Error('No value or path specified');\n};\n\ntype OrderedValue = string | number | Date;\n\nconst isOrderedValue = (value: unknown): value is OrderedValue =>\n typeof value === 'string' || typeof value === 'number' || value instanceof Date;\n\nconst toOrderedPrimitive = (value: OrderedValue): string | number =>\n value instanceof Date ? value.getTime() : value;\n\nconst compareOrderedValues = (\n left: unknown,\n right: unknown,\n operator: 'lt' | 'lte' | 'gt' | 'gte',\n): boolean => {\n if (!isOrderedValue(left) || !isOrderedValue(right)) return false;\n\n const lhs = toOrderedPrimitive(left);\n const rhs = toOrderedPrimitive(right);\n\n switch (operator) {\n case 'lt':\n return lhs < rhs;\n case 'lte':\n return lhs <= rhs;\n case 'gt':\n return lhs > rhs;\n case 'gte':\n return lhs >= rhs;\n }\n};\n\nconst hasMatch = (value: unknown): value is string => typeof value === 'string';\n\nconst normalizeRange = (value: unknown): [string | number, string | number] | null => {\n if (!Array.isArray(value) || value.length !== 2) return null;\n\n const [rawMin, rawMax] = value;\n if (!isOrderedValue(rawMin) || !isOrderedValue(rawMax)) return null;\n\n const min = toOrderedPrimitive(rawMin);\n const max = toOrderedPrimitive(rawMax);\n return min <= max ? [min, max] : [max, min];\n};\n\nconst containsValue = (container: unknown, search: unknown): boolean => {\n if (typeof container === 'string') {\n return typeof search === 'string' && container.includes(search);\n }\n\n if (Array.isArray(container)) {\n return container.includes(search);\n }\n\n return false;\n};\n","import { get, isObject, some } from 'lodash';\nimport { checkDate } from './date';\nimport { checkField } from './field';\nimport { ArrayOperator, Operator } from './operator';\nimport type { AggregateRule, ArrayRule, Condition } from './types';\n\ntype Row = Record<string, unknown>;\ntype CheckData = Row | unknown[];\n\nexport type CheckOptions = {\n context?: CheckData;\n};\n\nconst validateRootArrayShape = (rule: Condition): void => {\n if (typeof rule === 'boolean') return;\n if ('all' in rule) {\n for (const c of rule.all) validateRootArrayShape(c);\n return;\n }\n if ('any' in rule) {\n for (const c of rule.any) validateRootArrayShape(c);\n return;\n }\n if ('arrayOperator' in rule && !('field' in rule)) return;\n throw new Error(\n 'check: when data is an array, every leaf must be a fieldless arrayOperator (composable with all/any)',\n );\n};\n\nexport const check = <TData extends CheckData>(\n conditions: Condition,\n data: TData,\n options?: CheckOptions,\n): boolean | string => {\n if (Array.isArray(data)) validateRootArrayShape(conditions);\n if (typeof conditions === 'boolean') return conditions;\n\n const opts: CheckOptions = { ...options, context: options?.context ?? data };\n\n if ('all' in conditions) return all(conditions.all, data, opts, conditions.error);\n if ('any' in conditions) return any(conditions.any, data, opts, conditions.error);\n if ('arrayOperator' in conditions) return checkArray(conditions, data, opts);\n if ('dateOperator' in conditions) return checkDate(conditions, data as Row, opts.context as Row);\n if ('aggregate' in conditions) return checkAggregate(conditions as AggregateRule, data, opts);\n if ('field' in conditions) return checkField(conditions, data as Row, opts.context as Row);\n if ('if' in conditions) return checkIfThenElse(conditions, data, opts);\n\n return false;\n};\n\nconst all = <TData extends CheckData>(\n conditions: Condition[],\n data: TData,\n opts: CheckOptions,\n error?: string,\n): boolean | string => {\n const errors: string[] = [];\n\n for (const condition of conditions) {\n const result = check(condition, data, opts);\n if (result !== true) {\n if (typeof result === 'string') {\n errors.push(result);\n } else {\n errors.push('false');\n }\n }\n }\n\n if (!errors.length) return true;\n if (error) return error;\n if (errors.length === 1) return errors[0];\n return `All conditions must pass: ${errors.join(' AND ')}`;\n};\n\nconst any = <TData extends CheckData>(\n conditions: Condition[],\n data: TData,\n opts: CheckOptions,\n error?: string,\n): boolean | string => {\n const errors: string[] = [];\n\n for (const condition of conditions) {\n const result = check(condition, data, opts);\n if (result === true) return true;\n if (typeof result === 'string') errors.push(result);\n }\n\n if (error) return error;\n if (errors.length === 1) return errors[0];\n return `At least one condition must pass: ${errors.join(' OR ')}`;\n};\n\nconst checkIfThenElse = <TData extends CheckData>(\n condition: { if: Condition; then: Condition; else?: Condition },\n data: TData,\n opts: CheckOptions,\n): boolean | string => {\n const ifResult = check(condition.if, data, opts);\n if (ifResult === true) return check(condition.then, data, opts);\n return condition.else ? check(condition.else, data, opts) : true;\n};\n\nconst checkAggregate = <TData extends CheckData>(\n condition: AggregateRule,\n data: TData,\n opts: CheckOptions,\n): boolean | string => {\n const arrayValue = get(data, condition.field);\n if (!Array.isArray(arrayValue)) throw new Error(`${condition.field} must be an array`);\n\n const { mode, field: itemField } = condition.aggregate;\n if (mode !== 'sum' && mode !== 'avg') {\n return condition.error || `${condition.field} aggregate.mode must be 'sum' or 'avg'`;\n }\n\n const nestedCondition = condition.condition;\n const filtered = nestedCondition\n ? arrayValue.filter((item) => check(nestedCondition, item as Row, opts) === true)\n : arrayValue;\n\n const numbers: number[] = filtered.map((item, index) => {\n const raw = itemField ? get(item as Row, itemField) : item;\n if (typeof raw !== 'number' || !Number.isFinite(raw)) {\n const loc = `${condition.field}[${index}]${itemField ? `.${itemField}` : ''}`;\n throw new Error(`${loc} must be a finite number`);\n }\n return raw;\n });\n\n const sum = numbers.reduce((s, n) => s + n, 0);\n const result = mode === 'sum' ? sum : numbers.length === 0 ? 0 : sum / numbers.length;\n\n const context = opts.context as TData;\n let rhs: unknown;\n if (condition.value !== undefined) {\n rhs = condition.value;\n } else if (condition.path) {\n rhs = condition.path.startsWith('$.')\n ? get(data, condition.path.substring(2))\n : get(context, condition.path);\n } else {\n throw new Error('Aggregate rule requires value or path');\n }\n\n const getError = (msg: string) =>\n condition.error || `${condition.field} ${mode} ${msg} ${JSON.stringify(rhs)}`;\n\n switch (condition.operator) {\n case Operator.equals:\n return result === rhs || getError('must equal');\n case Operator.notEquals:\n return result !== rhs || getError('must not equal');\n case Operator.lessThan:\n return (typeof rhs === 'number' && result < rhs) || getError('must be less than');\n case Operator.lessThanEquals:\n return (\n (typeof rhs === 'number' && result <= rhs) || getError('must be less than or equal to')\n );\n case Operator.greaterThan:\n return (typeof rhs === 'number' && result > rhs) || getError('must be greater than');\n case Operator.greaterThanEquals:\n return (\n (typeof rhs === 'number' && result >= rhs) || getError('must be greater than or equal to')\n );\n case Operator.between: {\n if (!Array.isArray(rhs) || rhs.length !== 2)\n throw new Error('between requires a two-element array');\n const [a, b] = rhs as number[];\n const [min, max] = a <= b ? [a, b] : [b, a];\n return (result >= min && result <= max) || getError('must be between');\n }\n case Operator.notBetween: {\n if (!Array.isArray(rhs) || rhs.length !== 2)\n throw new Error('notBetween requires a two-element array');\n const [a, b] = rhs as number[];\n const [min, max] = a <= b ? [a, b] : [b, a];\n return result < min || result > max || getError('must not be between');\n }\n default:\n throw new Error(`Operator '${condition.operator}' is not supported for aggregate rules`);\n }\n};\n\nconst checkArray = <TData extends CheckData>(\n condition: ArrayRule,\n data: TData,\n opts: CheckOptions,\n): boolean | string => {\n const arrayValue = condition.field ? get(data, condition.field) : data;\n\n if (!Array.isArray(arrayValue))\n throw new Error(`${condition.field || '(root)'} must be an array`);\n\n const getError = (defaultMsg: string) => condition.error || `${condition.field} ${defaultMsg}`;\n\n const requiresCondition: ArrayOperator[] = [\n ArrayOperator.all,\n ArrayOperator.any,\n ArrayOperator.none,\n ArrayOperator.atLeast,\n ArrayOperator.atMost,\n ArrayOperator.exactly,\n ];\n\n const requiresCount: ArrayOperator[] = [\n ArrayOperator.atLeast,\n ArrayOperator.atMost,\n ArrayOperator.exactly,\n ];\n\n const itemCondition = condition.condition;\n if (requiresCondition.includes(condition.arrayOperator) && !itemCondition)\n throw new Error(\n `${condition.arrayOperator} requires a condition to check against array elements`,\n );\n\n const count = condition.count;\n if (requiresCount.includes(condition.arrayOperator) && count === undefined)\n throw new Error(`${condition.arrayOperator} requires a count`);\n\n let matches = 0;\n let failures = 0;\n\n if (requiresCondition.includes(condition.arrayOperator)) {\n if (!itemCondition) {\n throw new Error(\n `${condition.arrayOperator} requires a condition to check against array elements`,\n );\n }\n\n if (!some(arrayValue, isObject))\n throw new Error(\n `${condition.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`,\n );\n\n const results = arrayValue.map((item) => check(itemCondition, item as Row, opts));\n matches = results.filter((r) => r === true).length;\n failures = results.filter((r) => typeof r === 'string').length;\n }\n\n switch (condition.arrayOperator) {\n case ArrayOperator.empty:\n return !arrayValue.length || getError('must be empty');\n\n case ArrayOperator.notEmpty:\n return !!arrayValue.length || getError('must not be empty');\n\n case ArrayOperator.all:\n return (\n matches === arrayValue.length || getError(`all elements must match (${failures} failed)`)\n );\n\n case ArrayOperator.any:\n return !!matches || getError('at least one element must match');\n\n case ArrayOperator.none:\n return !matches || getError(`no elements should match (${matches} matched)`);\n\n case ArrayOperator.atLeast:\n if (count === undefined) throw new Error(`${condition.arrayOperator} requires a count`);\n return (\n matches >= count || getError(`at least ${count} elements must match (${matches} matched)`)\n );\n\n case ArrayOperator.atMost:\n if (count === undefined) throw new Error(`${condition.arrayOperator} requires a count`);\n return (\n matches <= count || getError(`at most ${count} elements must match (${matches} matched)`)\n );\n\n case ArrayOperator.exactly:\n if (count === undefined) throw new Error(`${condition.arrayOperator} requires a count`);\n return (\n matches === count || getError(`exactly ${count} elements must match (${matches} matched)`)\n );\n\n default:\n throw new Error(`Unknown array operator: ${(condition as ArrayRule).arrayOperator}`);\n }\n};\n","import { groupBy, keyBy } from 'lodash';\nimport type { FieldMapSet } from './types.ts';\n\ntype Row = Record<string, unknown>;\n\nexport type BridgeDictionary = Record<\n string, // map name\n Record<\n string, // model name\n Record<string, Record<string, Row | Row[]>> // on field → identifier → row(s)\n >\n>;\n\nexport const buildBridgeDictionary = (\n set: FieldMapSet,\n rawData: Record<string, Row[]>,\n): BridgeDictionary => {\n const out: BridgeDictionary = {};\n for (const bridge of set.bridges ?? []) {\n const [a, b] = bridge.endpoints;\n const aKey = `${a.fieldMap}:${a.model}`;\n const bKey = `${b.fieldMap}:${b.model}`;\n if (rawData[aKey]) {\n out[a.fieldMap] ??= {};\n out[a.fieldMap][a.model] ??= {};\n out[a.fieldMap][a.model][a.on] = keyBy(rawData[aKey], a.on);\n }\n if (rawData[bKey]) {\n out[b.fieldMap] ??= {};\n out[b.fieldMap][b.model] ??= {};\n out[b.fieldMap][b.model][b.on] =\n bridge.cardinality === 'oneToMany'\n ? groupBy(rawData[bKey], b.on)\n : keyBy(rawData[bKey], b.on);\n }\n }\n return out;\n};\n","import type { FieldMapSet } from './types.ts';\n\nexport const stitchFieldMaps = (set: FieldMapSet): FieldMapSet => {\n const out: FieldMapSet = {\n maps: structuredClone(set.maps),\n bridges: set.bridges ? structuredClone(set.bridges) : undefined,\n };\n\n for (const bridge of set.bridges ?? []) {\n const [a, b] = bridge.endpoints;\n const aOwner = out.maps[a.fieldMap]?.[a.model];\n const bOwner = out.maps[b.fieldMap]?.[b.model];\n if (!aOwner) {\n throw new Error(`stitchFieldMaps: endpoint '${a.fieldMap}:${a.model}' not found`);\n }\n if (!bOwner) {\n throw new Error(`stitchFieldMaps: endpoint '${b.fieldMap}:${b.model}' not found`);\n }\n if (a.fieldMap === b.fieldMap && a.model === b.model) {\n throw new Error(\n `stitchFieldMaps: self-bridge '${a.fieldMap}:${a.model}' to itself is not supported`,\n );\n }\n if (!aOwner.fields[a.on]) {\n throw new Error(\n `stitchFieldMaps: endpoint '${a.fieldMap}:${a.model}' has no field '${a.on}' for join`,\n );\n }\n if (!bOwner.fields[b.on]) {\n throw new Error(\n `stitchFieldMaps: endpoint '${b.fieldMap}:${b.model}' has no field '${b.on}' for join`,\n );\n }\n\n const aKey = `${a.fieldMap}:${a.model}`;\n const bKey = `${b.fieldMap}:${b.model}`;\n\n if (aOwner.fields[bKey]) {\n throw new Error(`stitchFieldMaps: bridge '${bKey}' already injected on '${aKey}'`);\n }\n if (bOwner.fields[aKey]) {\n throw new Error(`stitchFieldMaps: bridge '${aKey}' already injected on '${bKey}'`);\n }\n\n const isOneToMany = bridge.cardinality === 'oneToMany';\n aOwner.fields[bKey] = { kind: 'bridge', type: bKey, isList: isOneToMany };\n bOwner.fields[aKey] = { kind: 'bridge', type: aKey, isList: false };\n }\n\n return out;\n};\n","import type { FieldMap } from '../toPrisma/types.ts';\nimport type { FieldMapSet } from './types.ts';\n\nconst FORBIDDEN_FIELD_CHARS = /[.:]/;\n\nexport const validateFieldMapSet = (set: FieldMapSet): void => {\n const errors: string[] = [];\n for (const [mapName, fieldMap] of Object.entries(set.maps)) {\n for (const [modelName, model] of Object.entries(fieldMap)) {\n for (const [fieldName, entry] of Object.entries(model.fields)) {\n if (entry.kind === 'bridge') continue;\n if (FORBIDDEN_FIELD_CHARS.test(fieldName)) {\n errors.push(`'${mapName}:${modelName}.${fieldName}' contains forbidden character . or :`);\n }\n }\n }\n }\n if (errors.length) {\n throw new Error(`validateFieldMapSet:\\n${errors.join('\\n')}`);\n }\n};\n\nexport const validateFieldMap = (fieldMap: FieldMap, mapName = 'fieldMap'): void => {\n validateFieldMapSet({ maps: { [mapName]: fieldMap } });\n};\n","import type { FieldMapSet } from '../fieldMap/types.ts';\nimport type { FieldMap, FieldMapEntry } from '../toPrisma/types.ts';\nimport type { Lens, LensNarrowing } from './types.ts';\n\nexport const isLens = (x: Lens | LensNarrowing): x is Lens => 'model' in x;\n\nexport const getRoot = (x: Lens | LensNarrowing): Lens => {\n const visited = new Set<LensNarrowing>();\n let cursor: Lens | LensNarrowing = x;\n while (!isLens(cursor)) {\n if (visited.has(cursor)) throw new Error('cycle detected in narrowing parent chain');\n visited.add(cursor);\n cursor = cursor.parent;\n }\n return cursor;\n};\n\nexport const collectChain = (x: Lens | LensNarrowing): LensNarrowing[] => {\n const list: LensNarrowing[] = [];\n const visited = new Set<LensNarrowing>();\n let cursor: Lens | LensNarrowing = x;\n while (!isLens(cursor)) {\n if (visited.has(cursor)) throw new Error('cycle detected in narrowing parent chain');\n visited.add(cursor);\n list.unshift(cursor);\n cursor = cursor.parent;\n }\n return list;\n};\n\nexport const resolveRelationTarget = (\n entry: FieldMapEntry,\n currentMap: string,\n): { mapName: string; modelName: string } | null => {\n if (entry.kind === 'object') return { mapName: currentMap, modelName: entry.type };\n if (entry.kind === 'bridge') {\n const [m, n] = entry.type.includes(':') ? entry.type.split(':') : [currentMap, entry.type];\n return { mapName: m, modelName: n };\n }\n return null;\n};\n\nexport const walkPath = (\n set: FieldMapSet,\n startMap: string,\n startModel: string,\n path: string,\n): { entry: FieldMapEntry; mapName: string; modelName: string } | null => {\n const parts = path.split('.');\n let mapName = startMap;\n let modelName = startModel;\n for (let i = 0; i < parts.length; i++) {\n const model: FieldMap[string] | undefined = set.maps[mapName]?.[modelName];\n if (!model) return null;\n const entry = model.fields[parts[i]];\n if (!entry) return null;\n if (i === parts.length - 1) return { entry, mapName, modelName };\n const target = resolveRelationTarget(entry, mapName);\n if (!target) return null;\n mapName = target.mapName;\n modelName = target.modelName;\n }\n return null;\n};\n","import type { Condition } from '../types.ts';\nimport type { Lens, LensNarrowing } from './types.ts';\nimport { collectChain } from './walk.ts';\n\nexport const applyLens = (rule: Condition, narrowing: Lens | LensNarrowing): Condition => {\n const chain = collectChain(narrowing);\n const all: Condition[] = [];\n for (const n of chain) {\n if (n.constrains !== undefined) all.push(n.constrains);\n }\n return all.length ? { all: [...all, rule] } : rule;\n};\n","import type { FieldMapSet } from '../fieldMap/types.ts';\nimport type { FieldMap } from '../toPrisma/types.ts';\nimport type { Lens, LensNarrowing, ModelNarrowing } from './types.ts';\nimport { collectChain, getRoot, resolveRelationTarget } from './walk.ts';\n\nconst applyToModel = (\n fieldMap: FieldMap,\n modelName: string,\n mapName: string,\n set: FieldMapSet,\n narrowing: ModelNarrowing,\n): void => {\n const model = fieldMap[modelName];\n if (!model) return;\n\n if (narrowing.picks) {\n const keep = new Set(narrowing.picks);\n for (const r of Object.keys(narrowing.relations ?? {})) keep.add(r);\n for (const f of Object.keys(model.fields)) {\n if (!keep.has(f)) delete model.fields[f];\n }\n }\n if (narrowing.omits) {\n for (const f of narrowing.omits) delete model.fields[f];\n }\n\n for (const [relField, sub] of Object.entries(narrowing.relations ?? {})) {\n const entry = model.fields[relField];\n if (!entry) continue;\n const target = resolveRelationTarget(entry, mapName);\n if (!target) continue;\n const targetMap = set.maps[target.mapName];\n if (!targetMap) continue;\n applyToModel(targetMap, target.modelName, target.mapName, set, sub);\n }\n};\n\nexport const projectNarrowing = (lensOrNarrowing: Lens | LensNarrowing): FieldMapSet => {\n const root = getRoot(lensOrNarrowing);\n const set: FieldMapSet = {\n maps: structuredClone(root.maps),\n bridges: root.bridges ? structuredClone(root.bridges) : undefined,\n };\n const chain = collectChain(lensOrNarrowing);\n\n for (const narrowing of chain) {\n for (const [mapName, mapNarrowing] of Object.entries(narrowing.maps)) {\n const fieldMap = set.maps[mapName];\n if (!fieldMap) continue;\n for (const [modelName, modelNarrowing] of Object.entries(mapNarrowing.models)) {\n applyToModel(fieldMap, modelName, mapName, set, modelNarrowing);\n }\n }\n }\n\n if (set.bridges) {\n set.bridges = set.bridges.filter((bridge) => {\n const [a, b] = bridge.endpoints;\n const aBridgeKey = `${b.fieldMap}:${b.model}`;\n const bBridgeKey = `${a.fieldMap}:${a.model}`;\n const aHasKey = set.maps[a.fieldMap]?.[a.model]?.fields[aBridgeKey] !== undefined;\n const bHasKey = set.maps[b.fieldMap]?.[b.model]?.fields[bBridgeKey] !== undefined;\n return aHasKey && bHasKey;\n });\n }\n\n return set;\n};\n","import type { FieldMapSet } from '../fieldMap/types.ts';\nimport type { Condition } from '../types';\nimport { projectNarrowing } from './project.ts';\nimport type { Lens, LensNarrowing } from './types.ts';\nimport { getRoot, resolveRelationTarget, walkPath } from './walk.ts';\n\nexport type RuleLensViolation = {\n path: string;\n reason: string;\n};\n\nexport type RuleLensCheck = {\n ok: boolean;\n violations: RuleLensViolation[];\n};\n\nconst visit = (\n cond: Condition,\n set: FieldMapSet,\n mapName: string,\n modelName: string,\n violations: RuleLensViolation[],\n): void => {\n if (typeof cond === 'boolean') return;\n if ('all' in cond) {\n for (const c of cond.all) visit(c, set, mapName, modelName, violations);\n return;\n }\n if ('any' in cond) {\n for (const c of cond.any) visit(c, set, mapName, modelName, violations);\n return;\n }\n if ('if' in cond) {\n visit(cond.if, set, mapName, modelName, violations);\n visit(cond.then, set, mapName, modelName, violations);\n if (cond.else !== undefined) visit(cond.else, set, mapName, modelName, violations);\n return;\n }\n\n let nextMap = mapName;\n let nextModel = modelName;\n\n if ('field' in cond && typeof cond.field === 'string' && cond.field !== '') {\n const resolved = walkPath(set, mapName, modelName, cond.field);\n if (!resolved) {\n violations.push({\n path: cond.field,\n reason: 'path does not resolve through the narrowed lens',\n });\n return;\n }\n const target = resolveRelationTarget(resolved.entry, resolved.mapName);\n if (target) {\n nextMap = target.mapName;\n nextModel = target.modelName;\n }\n }\n\n if (\n 'aggregate' in cond &&\n typeof cond.aggregate === 'object' &&\n cond.aggregate !== null &&\n typeof cond.aggregate.field === 'string' &&\n cond.aggregate.field !== ''\n ) {\n const aggField = cond.aggregate.field;\n if (!walkPath(set, nextMap, nextModel, aggField)) {\n violations.push({\n path: aggField,\n reason: 'aggregate.field does not resolve through the narrowed lens',\n });\n }\n }\n\n if ('condition' in cond && cond.condition !== undefined) {\n visit(cond.condition, set, nextMap, nextModel, violations);\n }\n};\n\nexport const checkRuleAgainstLens = (\n rule: Condition,\n lensOrNarrowing: Lens | LensNarrowing,\n): RuleLensCheck => {\n const root = getRoot(lensOrNarrowing);\n const projectedSet = projectNarrowing(lensOrNarrowing);\n const violations: RuleLensViolation[] = [];\n visit(rule, projectedSet, root.mapName, root.model, violations);\n return { ok: violations.length === 0, violations };\n};\n","import { stitchFieldMaps } from '../fieldMap/stitch.ts';\nimport type { Bridge, FieldMapSet } from '../fieldMap/types.ts';\nimport type { FieldMap } from '../toPrisma/types.ts';\nimport type { Lens } from './types.ts';\n\nexport type CreateLensInput = {\n maps: Record<string, FieldMap>;\n bridges?: Bridge[];\n mapName: string;\n model: string;\n};\n\nexport const createLens = (input: CreateLensInput): Lens => {\n const stitched: FieldMapSet = stitchFieldMaps({ maps: input.maps, bridges: input.bridges });\n return { ...stitched, mapName: input.mapName, model: input.model };\n};\n","import type { FieldMapSet } from '../fieldMap/types.ts';\nimport type { FieldMapEntry } from '../toPrisma/types.ts';\nimport { checkRuleAgainstLens } from './checkRule.ts';\nimport type { LensNarrowing, ModelNarrowing } from './types.ts';\nimport { collectChain, getRoot, resolveRelationTarget } from './walk.ts';\n\nconst validateModelNode = (\n narrowing: ModelNarrowing,\n ancestorChain: ModelNarrowing[],\n modelFields: Record<string, FieldMapEntry>,\n mapName: string,\n set: FieldMapSet,\n position: string,\n errors: string[],\n): void => {\n if (narrowing.picks && narrowing.omits) {\n errors.push(`${position}: cannot specify both picks and omits`);\n }\n\n for (const f of narrowing.picks ?? []) {\n if (!modelFields[f]) {\n errors.push(`${position}.picks: field '${f}' not on model`);\n continue;\n }\n for (const anc of ancestorChain) {\n if (anc.picks && !anc.picks.includes(f)) {\n errors.push(`${position}.picks: '${f}' not in ancestor's picks`);\n break;\n }\n if (anc.omits?.includes(f)) {\n errors.push(`${position}.picks: '${f}' was omitted by ancestor`);\n break;\n }\n }\n }\n\n for (const f of narrowing.omits ?? []) {\n if (!modelFields[f]) {\n errors.push(`${position}.omits: field '${f}' not on model`);\n continue;\n }\n for (const anc of ancestorChain) {\n if (anc.picks && !anc.picks.includes(f)) {\n errors.push(`${position}.omits: '${f}' not in ancestor's picks (already invisible)`);\n break;\n }\n }\n }\n\n for (const [relField, sub] of Object.entries(narrowing.relations ?? {})) {\n const entry = modelFields[relField];\n if (!entry) {\n errors.push(`${position}.relations: '${relField}' not on model`);\n continue;\n }\n if (entry.kind !== 'object' && entry.kind !== 'bridge') {\n errors.push(`${position}.relations: '${relField}' is not a relation (kind=${entry.kind})`);\n continue;\n }\n const target = resolveRelationTarget(entry, mapName);\n if (!target) continue;\n const targetFields = set.maps[target.mapName]?.[target.modelName]?.fields;\n if (!targetFields) {\n errors.push(`${position}.relations.${relField}: target model not found in lens`);\n continue;\n }\n const childAncestorChain = ancestorChain\n .map((anc) => anc.relations?.[relField])\n .filter((x): x is ModelNarrowing => x !== undefined);\n validateModelNode(\n sub,\n childAncestorChain,\n targetFields,\n target.mapName,\n set,\n `${position}.relations.${relField}`,\n errors,\n );\n }\n};\n\nexport const validateNarrowing = (narrowing: LensNarrowing): void => {\n const errors: string[] = [];\n const set = getRoot(narrowing);\n const ancestors = collectChain(narrowing.parent);\n\n for (const [mapName, mapNarrowing] of Object.entries(narrowing.maps)) {\n const fieldMap = set.maps[mapName];\n if (!fieldMap) {\n errors.push(`maps.${mapName}: not in lens`);\n continue;\n }\n for (const [modelName, modelNarrowing] of Object.entries(mapNarrowing.models)) {\n const model = fieldMap[modelName];\n if (!model) {\n errors.push(`maps.${mapName}.models.${modelName}: not in fieldMap`);\n continue;\n }\n const ancestorChain = ancestors\n .map((anc) => anc.maps[mapName]?.models[modelName])\n .filter((x): x is ModelNarrowing => x !== undefined);\n validateModelNode(\n modelNarrowing,\n ancestorChain,\n model.fields,\n mapName,\n set,\n `maps.${mapName}.models.${modelName}`,\n errors,\n );\n }\n }\n\n if (narrowing.constrains !== undefined) {\n const check = checkRuleAgainstLens(narrowing.constrains, narrowing);\n for (const v of check.violations) {\n errors.push(`constrains: '${v.path}' ${v.reason}`);\n }\n }\n\n if (errors.length) {\n throw new Error(`validateNarrowing:\\n${errors.join('\\n')}`);\n }\n};\n","import { ArrayOperator, DateOperator, Operator } from './operator';\n\nexport const FieldKind = {\n String: 'String',\n Boolean: 'Boolean',\n Int: 'Int',\n BigInt: 'BigInt',\n Float: 'Float',\n Decimal: 'Decimal',\n DateTime: 'DateTime',\n Json: 'Json',\n Bytes: 'Bytes',\n Enum: 'Enum',\n} as const;\n\nexport type FieldKind = (typeof FieldKind)[keyof typeof FieldKind];\n\nexport const NUMERIC_KINDS: readonly FieldKind[] = ['Int', 'Float', 'Decimal', 'BigInt'];\nexport const ORDERABLE_KINDS: readonly FieldKind[] = ['String', ...NUMERIC_KINDS, 'DateTime'];\nexport const STRINGY_KINDS: readonly FieldKind[] = ['String'];\nexport const EQUATABLE_KINDS: readonly FieldKind[] = [\n 'String',\n 'Boolean',\n 'Int',\n 'BigInt',\n 'Float',\n 'Decimal',\n 'DateTime',\n 'Enum',\n];\nexport const ALL_KINDS: readonly FieldKind[] = Object.values(FieldKind);\n\nexport const RuleTarget = {\n check: 'check',\n toPrisma: 'toPrisma',\n toSql: 'toSql',\n} as const;\n\nexport type RuleTarget = (typeof RuleTarget)[keyof typeof RuleTarget];\n\nconst ALL_TARGETS: readonly RuleTarget[] = ['check', 'toPrisma', 'toSql'];\nconst NON_SQL_TARGETS: readonly RuleTarget[] = ['check', 'toPrisma'];\nconst NON_PRISMA_TARGETS: readonly RuleTarget[] = ['check', 'toSql'];\n\nexport const ValueShape = {\n none: 'none',\n scalar: 'scalar',\n ordered: 'ordered',\n array: 'array',\n string: 'string',\n pattern: 'pattern',\n range: 'range',\n dateValue: 'dateValue',\n dateRange: 'dateRange',\n dayList: 'dayList',\n count: 'count',\n predicate: 'predicate',\n} as const;\n\nexport type ValueShape = (typeof ValueShape)[keyof typeof ValueShape];\n\nexport type CatalogEntry = {\n kinds: readonly FieldKind[];\n targets: readonly RuleTarget[];\n valueShape: ValueShape;\n};\n\nexport const FIELD_OPERATOR_CATALOG: Record<Operator, CatalogEntry> = {\n [Operator.equals]: { kinds: EQUATABLE_KINDS, targets: ALL_TARGETS, valueShape: 'scalar' },\n [Operator.notEquals]: { kinds: EQUATABLE_KINDS, targets: ALL_TARGETS, valueShape: 'scalar' },\n [Operator.lessThan]: { kinds: ORDERABLE_KINDS, targets: ALL_TARGETS, valueShape: 'ordered' },\n [Operator.lessThanEquals]: {\n kinds: ORDERABLE_KINDS,\n targets: ALL_TARGETS,\n valueShape: 'ordered',\n },\n [Operator.greaterThan]: { kinds: ORDERABLE_KINDS, targets: ALL_TARGETS, valueShape: 'ordered' },\n [Operator.greaterThanEquals]: {\n kinds: ORDERABLE_KINDS,\n targets: ALL_TARGETS,\n valueShape: 'ordered',\n },\n [Operator.in]: { kinds: EQUATABLE_KINDS, targets: ALL_TARGETS, valueShape: 'array' },\n [Operator.notIn]: { kinds: EQUATABLE_KINDS, targets: ALL_TARGETS, valueShape: 'array' },\n [Operator.contains]: { kinds: STRINGY_KINDS, targets: ALL_TARGETS, valueShape: 'string' },\n [Operator.notContains]: { kinds: STRINGY_KINDS, targets: ALL_TARGETS, valueShape: 'string' },\n [Operator.startsWith]: { kinds: STRINGY_KINDS, targets: ALL_TARGETS, valueShape: 'string' },\n [Operator.endsWith]: { kinds: STRINGY_KINDS, targets: ALL_TARGETS, valueShape: 'string' },\n [Operator.matches]: { kinds: STRINGY_KINDS, targets: NON_PRISMA_TARGETS, valueShape: 'pattern' },\n [Operator.notMatches]: {\n kinds: STRINGY_KINDS,\n targets: NON_PRISMA_TARGETS,\n valueShape: 'pattern',\n },\n [Operator.between]: { kinds: ORDERABLE_KINDS, targets: ALL_TARGETS, valueShape: 'range' },\n [Operator.notBetween]: { kinds: ORDERABLE_KINDS, targets: ALL_TARGETS, valueShape: 'range' },\n [Operator.isEmpty]: { kinds: STRINGY_KINDS, targets: ALL_TARGETS, valueShape: 'none' },\n [Operator.notEmpty]: { kinds: STRINGY_KINDS, targets: ALL_TARGETS, valueShape: 'none' },\n [Operator.exists]: { kinds: ALL_KINDS, targets: ALL_TARGETS, valueShape: 'none' },\n [Operator.notExists]: { kinds: ALL_KINDS, targets: ALL_TARGETS, valueShape: 'none' },\n};\n\nexport const DATE_OPERATOR_CATALOG: Record<DateOperator, CatalogEntry> = {\n [DateOperator.before]: { kinds: ['DateTime'], targets: ALL_TARGETS, valueShape: 'dateValue' },\n [DateOperator.after]: { kinds: ['DateTime'], targets: ALL_TARGETS, valueShape: 'dateValue' },\n [DateOperator.onOrBefore]: { kinds: ['DateTime'], targets: ALL_TARGETS, valueShape: 'dateValue' },\n [DateOperator.onOrAfter]: { kinds: ['DateTime'], targets: ALL_TARGETS, valueShape: 'dateValue' },\n [DateOperator.between]: { kinds: ['DateTime'], targets: ALL_TARGETS, valueShape: 'dateRange' },\n [DateOperator.notBetween]: { kinds: ['DateTime'], targets: ALL_TARGETS, valueShape: 'dateRange' },\n [DateOperator.dayIn]: {\n kinds: ['DateTime'],\n targets: NON_PRISMA_TARGETS,\n valueShape: 'dayList',\n },\n [DateOperator.dayNotIn]: {\n kinds: ['DateTime'],\n targets: NON_PRISMA_TARGETS,\n valueShape: 'dayList',\n },\n};\n\nexport type ArrayCatalogEntry = {\n targets: readonly RuleTarget[];\n valueShape: ValueShape;\n};\n\nexport const ARRAY_OPERATOR_CATALOG: Record<ArrayOperator, ArrayCatalogEntry> = {\n [ArrayOperator.all]: { targets: NON_SQL_TARGETS, valueShape: 'predicate' },\n [ArrayOperator.any]: { targets: NON_SQL_TARGETS, valueShape: 'predicate' },\n [ArrayOperator.none]: { targets: NON_SQL_TARGETS, valueShape: 'predicate' },\n [ArrayOperator.atLeast]: { targets: NON_SQL_TARGETS, valueShape: 'count' },\n [ArrayOperator.atMost]: { targets: NON_SQL_TARGETS, valueShape: 'count' },\n [ArrayOperator.exactly]: { targets: NON_SQL_TARGETS, valueShape: 'count' },\n [ArrayOperator.empty]: { targets: ALL_TARGETS, valueShape: 'none' },\n [ArrayOperator.notEmpty]: { targets: ALL_TARGETS, valueShape: 'none' },\n};\n\nconst AGGREGATE_SINGLE_VALUE_SHAPES: ReadonlySet<ValueShape> = new Set(['scalar', 'ordered']);\nconst AGGREGATE_RANGE_VALUE_SHAPES: ReadonlySet<ValueShape> = new Set(['range']);\n\nexport const AGGREGATE_OPERATORS: readonly Operator[] = [\n Operator.equals,\n Operator.notEquals,\n Operator.lessThan,\n Operator.lessThanEquals,\n Operator.greaterThan,\n Operator.greaterThanEquals,\n Operator.between,\n Operator.notBetween,\n];\n\nexport const isAggregateSingleOperator = (operator: Operator): boolean => {\n const entry = FIELD_OPERATOR_CATALOG[operator];\n if (!entry) return false;\n return AGGREGATE_SINGLE_VALUE_SHAPES.has(entry.valueShape);\n};\n\nexport const isAggregateRangeOperator = (operator: Operator): boolean => {\n const entry = FIELD_OPERATOR_CATALOG[operator];\n if (!entry) return false;\n return AGGREGATE_RANGE_VALUE_SHAPES.has(entry.valueShape);\n};\n\nexport const getValueShape = (operator: Operator | DateOperator | ArrayOperator): ValueShape => {\n if (Object.hasOwn(FIELD_OPERATOR_CATALOG, operator)) {\n return FIELD_OPERATOR_CATALOG[operator as Operator].valueShape;\n }\n if (Object.hasOwn(DATE_OPERATOR_CATALOG, operator)) {\n return DATE_OPERATOR_CATALOG[operator as DateOperator].valueShape;\n }\n if (Object.hasOwn(ARRAY_OPERATOR_CATALOG, operator)) {\n return ARRAY_OPERATOR_CATALOG[operator as ArrayOperator].valueShape;\n }\n throw new Error(`Unknown operator: ${operator}`);\n};\n\nexport const isOperatorSupportedForTarget = (\n operator: Operator | DateOperator | ArrayOperator,\n target: RuleTarget,\n): boolean => {\n if (Object.hasOwn(FIELD_OPERATOR_CATALOG, operator)) {\n return FIELD_OPERATOR_CATALOG[operator as Operator].targets.includes(target);\n }\n if (Object.hasOwn(DATE_OPERATOR_CATALOG, operator)) {\n return DATE_OPERATOR_CATALOG[operator as DateOperator].targets.includes(target);\n }\n if (Object.hasOwn(ARRAY_OPERATOR_CATALOG, operator)) {\n return ARRAY_OPERATOR_CATALOG[operator as ArrayOperator].targets.includes(target);\n }\n return false;\n};\n\nexport const getOperatorsForKind = (\n kind: FieldKind,\n target?: RuleTarget,\n): { field: Operator[]; date: DateOperator[] } => {\n const field = (Object.keys(FIELD_OPERATOR_CATALOG) as Operator[]).filter((op) => {\n const entry = FIELD_OPERATOR_CATALOG[op];\n if (!entry.kinds.includes(kind)) return false;\n if (target && !entry.targets.includes(target)) return false;\n return true;\n });\n const date = (Object.keys(DATE_OPERATOR_CATALOG) as DateOperator[]).filter((op) => {\n const entry = DATE_OPERATOR_CATALOG[op];\n if (!entry.kinds.includes(kind)) return false;\n if (target && !entry.targets.includes(target)) return false;\n return true;\n });\n return { field, date };\n};\n\nexport const getArrayOperators = (target?: RuleTarget): ArrayOperator[] => {\n return (Object.keys(ARRAY_OPERATOR_CATALOG) as ArrayOperator[]).filter((op) => {\n if (!target) return true;\n return ARRAY_OPERATOR_CATALOG[op].targets.includes(target);\n });\n};\n","import type { FieldMap, FieldMapEntry } from './types';\n\nexport const findReverseRelation = (\n map: FieldMap,\n targetModel: string,\n currentModel: string,\n relationName?: string,\n): FieldMapEntry | null => {\n const targetEntry = map[targetModel];\n if (!targetEntry) return null;\n\n for (const fieldDef of Object.values(targetEntry.fields)) {\n if (\n fieldDef.kind === 'object' &&\n fieldDef.type === currentModel &&\n (fieldDef.fromFields?.length ?? 0) > 0 &&\n (fieldDef.toFields?.length ?? 0) > 0 &&\n (relationName === undefined || fieldDef.relationName === relationName)\n ) {\n return fieldDef;\n }\n }\n return null;\n};\n","import type { PrismaWhere } from './types';\n\n/**\n * Build a nested Prisma filter from a dot-notation field path.\n *\n * In Prisma, dot-notation always means relation traversal (unlike toSql where\n * dots mean JSON path). Each segment wraps the next from the inside out.\n *\n * @example\n * buildNestedFilter('status', { equals: 'active' })\n * // → { status: { equals: 'active' } }\n *\n * buildNestedFilter('user.profile.bio', { contains: 'hello' })\n * // → { user: { profile: { bio: { contains: 'hello' } } } }\n */\nexport const buildNestedFilter = (field: string, filter: unknown): PrismaWhere => {\n const parts = field.split('.');\n let result: unknown = filter;\n for (let i = parts.length - 1; i >= 0; i--) {\n result = { [parts[i]]: result };\n }\n return result as PrismaWhere;\n};\n","import { Operator } from '../operator';\nimport type { AggregateRule, Condition } from '../types';\nimport { findReverseRelation } from './relationUtils';\nimport type {\n BuildOptions,\n FieldMap,\n FieldMapEntry,\n GroupByStep,\n PrismaBuildState,\n PrismaWhere,\n StepRef,\n} from './types';\nimport { buildNestedFilter } from './utils';\n\n// Forward declaration - provided by condition.ts to avoid circular import\ntype BuildConditionFn = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n) => PrismaWhere;\nlet buildConditionRef: BuildConditionFn;\n\nexport const setConditionBuilderForAggregate = (fn: BuildConditionFn) => {\n buildConditionRef = fn;\n};\n\nexport const buildAggregateRule = (\n rule: AggregateRule,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n if (!options?.map || !options?.model || !state) {\n throw new Error(\n `Aggregate rules require a FieldMap and model to generate a Prisma plan. ` +\n `Pass { map, model } options to toPrisma().`,\n );\n }\n\n if (!rule.aggregate.field) {\n throw new Error(\n `Prisma aggregate rules require aggregate.field to specify the numeric field on the related model.`,\n );\n }\n\n if (rule.path) {\n throw new Error(`path is not supported for Prisma aggregate rules; use value instead.`);\n }\n\n return buildAggregateStep(\n rule,\n options as BuildOptions & { map: FieldMap; model: string },\n state,\n );\n};\n\n/**\n * Walk a dot-notation field path through the FieldMap to find the terminal list relation.\n *\n * Returns the segments traversed, the final list relation entry, and the model it lives on.\n * E.g. for 'department.employees' on User:\n * - segments: ['department', 'employees']\n * - intermediate: User → Department (singular)\n * - terminal: Department.employees → Employee (list)\n */\nconst walkAggregateFieldPath = (\n field: string,\n map: FieldMap,\n rootModel: string,\n): {\n segments: string[];\n intermediateRelations: { fieldName: string; entry: FieldMapEntry; onModel: string }[];\n terminalModel: string;\n terminalEntry: FieldMapEntry;\n} => {\n const segments = field.split('.');\n const intermediateRelations: { fieldName: string; entry: FieldMapEntry; onModel: string }[] = [];\n let currentModel = rootModel;\n\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const fieldEntry = map[currentModel]?.fields[seg];\n if (!fieldEntry || fieldEntry.kind !== 'object') {\n throw new Error(\n `Field '${seg}' is not a relation in model '${currentModel}'. ` +\n `Prisma aggregate rules only support relation fields.`,\n );\n }\n\n if (i === segments.length - 1) {\n // Terminal segment — must be a list relation\n if (!fieldEntry.isList) {\n throw new Error(`Field '${seg}' is not a list relation in model '${currentModel}'.`);\n }\n return {\n segments,\n intermediateRelations,\n terminalModel: currentModel,\n terminalEntry: fieldEntry,\n };\n }\n\n // Intermediate segment — must be a singular relation\n if (fieldEntry.isList) {\n throw new Error(\n `Intermediate field '${seg}' in path '${field}' is a list relation. ` +\n `Only the final segment can be a list relation for aggregate rules.`,\n );\n }\n\n intermediateRelations.push({ fieldName: seg, entry: fieldEntry, onModel: currentModel });\n currentModel = fieldEntry.type;\n }\n\n throw new Error(`Field path '${field}' did not terminate at a list relation.`);\n};\n\nconst buildAggregateStep = (\n rule: AggregateRule,\n options: BuildOptions & { map: FieldMap; model: string },\n state: PrismaBuildState,\n): PrismaWhere => {\n const { map, model: rootModel } = options;\n\n const { intermediateRelations, terminalModel, terminalEntry } = walkAggregateFieldPath(\n rule.field,\n map,\n rootModel,\n );\n\n const targetModel = terminalEntry.type;\n const itemField = rule.aggregate.field ?? '';\n\n const targetFieldEntry = map[targetModel]?.fields[itemField];\n if (!targetFieldEntry) {\n throw new Error(`aggregate.field '${itemField}' does not exist on model '${targetModel}'.`);\n }\n if (targetFieldEntry.kind !== 'scalar') {\n throw new Error(\n `aggregate.field '${itemField}' on model '${targetModel}' must be a scalar field, got '${targetFieldEntry.kind}'.`,\n );\n }\n\n if (targetFieldEntry.type === 'Json') {\n throw new Error(\n `aggregate.field '${itemField}' on model '${targetModel}' is a Json field — aggregate rules require a numeric scalar.`,\n );\n }\n\n let fkOnTarget: string;\n let pkOnTerminal: string;\n\n if (terminalEntry.fromFields && terminalEntry.fromFields.length > 0) {\n if (terminalEntry.fromFields.length > 1) {\n throw new Error(`Aggregate rules do not support composite FK relations.`);\n }\n fkOnTarget = terminalEntry.toFields?.[0] ?? 'id';\n pkOnTerminal = terminalEntry.fromFields[0];\n } else {\n const reverseRelation = findReverseRelation(\n map,\n targetModel,\n terminalModel,\n terminalEntry.relationName,\n );\n if (!reverseRelation) {\n throw new Error(\n `Cannot determine FK relationship between '${terminalModel}' and '${targetModel}'. ` +\n `Ensure the FieldMap contains both sides of the relation.`,\n );\n }\n if ((reverseRelation.fromFields?.length ?? 0) > 1) {\n throw new Error(`Aggregate rules do not support composite FK relations.`);\n }\n fkOnTarget = reverseRelation.fromFields?.[0] ?? '';\n pkOnTerminal = reverseRelation.toFields?.[0] ?? '';\n }\n\n // Build inner WHERE from condition (if present)\n const innerWhere = rule.condition\n ? buildConditionRef(rule.condition, { ...options, model: targetModel }, state)\n : {};\n\n // Prisma 6.x having format: field first, then aggregate operator nested inside.\n const aggKey = rule.aggregate.mode === 'sum' ? '_sum' : '_avg';\n const having = { [itemField]: { [aggKey]: buildPrismaFilter(rule) } };\n\n const step: GroupByStep = {\n operation: 'groupBy',\n model: targetModel,\n args: { by: [fkOnTarget], where: innerWhere, having },\n extract: fkOnTarget,\n };\n\n const stepIndex = state.steps.length;\n state.steps.push(step);\n\n const stepRef: StepRef = { __step: stepIndex };\n\n // If there are intermediate relations, nest the filter through them\n if (intermediateRelations.length > 0) {\n // The step ref gives us IDs of the model that owns the terminal list relation.\n // We need to filter back through intermediate relations to the root model.\n const leafFilter = { [pkOnTerminal]: { in: stepRef } };\n const relationPath = intermediateRelations.map((r) => r.fieldName).join('.');\n return buildNestedFilter(relationPath, leafFilter);\n }\n\n return { [pkOnTerminal]: { in: stepRef } };\n};\n\nconst buildPrismaFilter = (rule: AggregateRule): Record<string, unknown> => {\n const value = rule.value;\n switch (rule.operator) {\n case Operator.equals:\n return { equals: value };\n case Operator.notEquals:\n return { not: value };\n case Operator.lessThan:\n return { lt: value };\n case Operator.lessThanEquals:\n return { lte: value };\n case Operator.greaterThan:\n return { gt: value };\n case Operator.greaterThanEquals:\n return { gte: value };\n case Operator.between: {\n if (!Array.isArray(value) || value.length !== 2)\n throw new Error('between requires two values');\n const [a, b] = value as number[];\n const [min, max] = a <= b ? [a, b] : [b, a];\n return { gte: min, lte: max };\n }\n case Operator.notBetween:\n throw new Error(`Operator 'notBetween' is not supported for Prisma aggregate rules.`);\n default:\n throw new Error(`Operator '${rule.operator}' is not supported for Prisma aggregate rules.`);\n }\n};\n","import { ArrayOperator } from '../operator';\nimport type { ArrayRule, Condition } from '../types';\nimport { findReverseRelation } from './relationUtils';\nimport type {\n BuildOptions,\n FieldMap,\n GroupByStep,\n PrismaBuildState,\n PrismaWhere,\n StepRef,\n} from './types';\n\ntype BuildConditionFn = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n) => PrismaWhere;\n\n/**\n * Generate a multi-step groupBy plan for count-based relation filtering.\n *\n * For { field: 'posts', arrayOperator: 'atLeast', count: 3, condition: ... } on User:\n * step 0: groupBy Post by authorId where <condition> having _count >= 3\n * where: { id: { in: { __step: 0 } } }\n *\n * The step is pushed into state.steps and the WHERE clause is returned directly.\n */\nexport const buildCountStep = (\n rule: ArrayRule,\n options: BuildOptions & { map: FieldMap; model: string },\n state: PrismaBuildState,\n buildCondition: BuildConditionFn,\n): PrismaWhere => {\n const { map, model: currentModel } = options;\n\n if (!rule.field) {\n throw new Error('toPrisma: count-based ArrayRule requires a field path');\n }\n const fieldEntry = map[currentModel]?.fields[rule.field];\n if (!fieldEntry || fieldEntry.kind !== 'object') {\n throw new Error(\n `Field '${rule.field}' is not a relation in model '${currentModel}'. ` +\n `Count operators require a relation field.`,\n );\n }\n\n if (!fieldEntry.isList) {\n throw new Error(\n `Field '${rule.field}' is not a list relation in model '${currentModel}'. ` +\n `Count operators only apply to one-to-many or many-to-many relations.`,\n );\n }\n\n const targetModel = fieldEntry.type;\n\n let fkOnTarget: string;\n let pkOnCurrent: string;\n\n if (fieldEntry.fromFields && fieldEntry.fromFields.length > 0) {\n // Forward relation (current model has FK) — unusual for list relations but handle it\n if (fieldEntry.fromFields.length > 1) {\n throw new Error(\n `Count operators (atLeast/atMost/exactly) do not support composite FK relations ` +\n `('${currentModel}.${rule.field}'). Use prisma.$queryRaw for composite FK count filtering.`,\n );\n }\n fkOnTarget = fieldEntry.toFields?.[0] ?? 'id';\n pkOnCurrent = fieldEntry.fromFields[0];\n } else {\n // Back-relation: FK is on the target model. Find the reverse relation.\n const reverseRelation = findReverseRelation(\n map,\n targetModel,\n currentModel,\n fieldEntry.relationName,\n );\n if (!reverseRelation) {\n const targetFields = Object.values(map[targetModel]?.fields ?? {});\n const isImplicitM2M = targetFields.some(\n (f) => f.kind === 'object' && f.type === currentModel && f.isList && !f.fromFields?.length,\n );\n throw new Error(\n isImplicitM2M\n ? `'${currentModel}.${rule.field}' is an implicit many-to-many relation. ` +\n `Count operators require an explicit join model with a FK — convert to an explicit ` +\n `@relation or use prisma.$queryRaw.`\n : `Cannot determine FK relationship between '${currentModel}' and '${targetModel}'. ` +\n `Ensure the FieldMap contains both sides of the relation.`,\n );\n }\n if ((reverseRelation.fromFields?.length ?? 0) > 1) {\n throw new Error(\n `Count operators (atLeast/atMost/exactly) do not support composite FK relations ` +\n `('${currentModel}.${rule.field}'). Use prisma.$queryRaw for composite FK count filtering.`,\n );\n }\n fkOnTarget = reverseRelation.fromFields?.[0] ?? '';\n pkOnCurrent = reverseRelation.toFields?.[0] ?? '';\n }\n\n const innerWhere = rule.condition\n ? buildCondition(rule.condition, { ...options, model: targetModel }, state)\n : {};\n\n const count = rule.count ?? 1;\n const having = buildHaving(rule.arrayOperator, count, fkOnTarget);\n\n const step: GroupByStep = {\n operation: 'groupBy',\n model: targetModel,\n args: { by: [fkOnTarget], where: innerWhere, having },\n extract: fkOnTarget,\n };\n\n const stepIndex = state.steps.length;\n state.steps.push(step);\n\n const stepRef: StepRef = { __step: stepIndex };\n return { [pkOnCurrent]: { in: stepRef } };\n};\n\n// Prisma 6.x having format: field first, then _count nested inside.\n// e.g. { fanUserUuid: { _count: { gte: 3 } } } — NOT { _count: { _all: { gte: 3 } } }\nconst buildHaving = (\n op: ArrayOperator,\n count: number,\n groupByField: string,\n): Record<string, unknown> => {\n switch (op) {\n case ArrayOperator.atLeast:\n return { [groupByField]: { _count: { gte: count } } };\n case ArrayOperator.atMost:\n return { [groupByField]: { _count: { lte: count } } };\n case ArrayOperator.exactly:\n return { [groupByField]: { _count: { equals: count } } };\n default:\n throw new Error('unreachable');\n }\n};\n","import { ArrayOperator } from '../operator';\nimport type { ArrayRule, Condition } from '../types';\nimport { buildCountStep } from './countStep';\nimport type { BuildOptions, FieldMap, PrismaBuildState, PrismaWhere } from './types';\nimport { buildNestedFilter } from './utils';\n\n// Forward declaration - provided by condition.ts to avoid circular import\ntype BuildConditionFn = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n) => PrismaWhere;\nlet buildCondition: BuildConditionFn;\n\nexport const setConditionBuilderForArray = (fn: BuildConditionFn) => {\n buildCondition = fn;\n};\n\nexport const buildArrayRule = (\n rule: ArrayRule,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n // Count operators generate a full WHERE clause (step ref) — skip the nested-filter wrapper\n if (\n rule.arrayOperator === ArrayOperator.atLeast ||\n rule.arrayOperator === ArrayOperator.atMost ||\n rule.arrayOperator === ArrayOperator.exactly\n ) {\n if (options?.map && options?.model && state) {\n return buildCountStep(\n rule,\n options as BuildOptions & { map: FieldMap; model: string },\n state,\n buildCondition,\n );\n }\n throw new Error(\n `ArrayOperator '${rule.arrayOperator}' requires a FieldMap and model to generate a multi-step plan. ` +\n `Pass { map, model } options to toPrisma(). Without them, use prisma.$queryRaw for count-based relation filtering.`,\n );\n }\n\n if (!rule.field) {\n throw new Error('toPrisma: ArrayRule.field is required (fieldless arrayOps are check-only)');\n }\n const filter = buildArrayLeafFilter(rule, options, state);\n return buildNestedFilter(rule.field, filter);\n};\n\nconst buildArrayLeafFilter = (\n rule: ArrayRule,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): unknown => {\n switch (rule.arrayOperator) {\n case ArrayOperator.all:\n if (!rule.condition) throw new Error(`ArrayOperator 'all' requires a condition`);\n return { every: buildCondition(rule.condition, options, state) };\n\n case ArrayOperator.any:\n if (!rule.condition) throw new Error(`ArrayOperator 'any' requires a condition`);\n return { some: buildCondition(rule.condition, options, state) };\n\n case ArrayOperator.none:\n if (!rule.condition) throw new Error(`ArrayOperator 'none' requires a condition`);\n return { none: buildCondition(rule.condition, options, state) };\n\n case ArrayOperator.empty:\n return { none: {} };\n\n case ArrayOperator.notEmpty:\n return { some: {} };\n\n default:\n throw new Error(`Unknown array operator: ${(rule as ArrayRule).arrayOperator}`);\n }\n};\n","import { get } from 'lodash';\nimport { DateOperator } from '../operator';\nimport type { DateRule } from '../types';\nimport type { BuildOptions, PrismaWhere } from './types';\nimport { buildNestedFilter } from './utils';\n\nexport const buildDateRule = (rule: DateRule, options?: BuildOptions): PrismaWhere => {\n const filter = buildDateLeafFilter(rule, options);\n return buildNestedFilter(rule.field, filter);\n};\n\n/**\n * Resolve the date value for a DateRule.\n * - rule.value → use literal\n * - rule.path starting with '$.' → throw (no column-to-column in Prisma WHERE)\n * - rule.path (context ref) → look up from options.context\n */\nconst resolveDateValue = (rule: DateRule, options?: BuildOptions): unknown => {\n if (rule.value !== undefined) return rule.value;\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n throw new Error(\n `Prisma WHERE has no column-to-column date comparison for path '${rule.path}'. ` +\n `Use prisma.$queryRaw for field-to-field filtering.`,\n );\n }\n if (!options?.context) {\n throw new Error(\n `options.context is required to resolve date path '${rule.path}'. ` +\n `Pass context when calling toPrisma().`,\n );\n }\n return get(options.context, rule.path);\n }\n return undefined;\n};\n\nconst buildDateLeafFilter = (rule: DateRule, options?: BuildOptions): unknown => {\n const val = () => resolveDateValue(rule, options);\n\n switch (rule.dateOperator) {\n case DateOperator.before:\n return { lt: val() };\n\n case DateOperator.after:\n return { gt: val() };\n\n case DateOperator.onOrBefore:\n return { lte: val() };\n\n case DateOperator.onOrAfter:\n return { gte: val() };\n\n case DateOperator.between: {\n const v = val();\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('between date operator requires an array of two values');\n }\n const [start, end] = normalizeDateRange(v);\n return { gte: start, lte: end };\n }\n\n case DateOperator.notBetween: {\n const v = val();\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('notBetween date operator requires an array of two values');\n }\n const [start, end] = normalizeDateRange(v);\n return { NOT: { gte: start, lte: end } };\n }\n\n case DateOperator.dayIn:\n throw new Error(\n `DateOperator 'dayIn' has no Prisma equivalent. Use prisma.$queryRaw with EXTRACT(DOW FROM ...) for day-of-week filtering.`,\n );\n\n case DateOperator.dayNotIn:\n throw new Error(\n `DateOperator 'dayNotIn' has no Prisma equivalent. Use prisma.$queryRaw with EXTRACT(DOW FROM ...) for day-of-week filtering.`,\n );\n\n default:\n throw new Error(`Unknown date operator: ${(rule as DateRule).dateOperator}`);\n }\n};\n\nconst normalizeDateRange = (value: unknown[]): [unknown, unknown] => {\n const [first, second] = value;\n return compareDateValues(first, second) <= 0 ? [first, second] : [second, first];\n};\n\nconst compareDateValues = (left: unknown, right: unknown): number => {\n const lhs = normalizeComparableDateValue(left);\n const rhs = normalizeComparableDateValue(right);\n return lhs < rhs ? -1 : lhs > rhs ? 1 : 0;\n};\n\nconst normalizeComparableDateValue = (value: unknown): string | number => {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number' || typeof value === 'string') return value;\n return String(value);\n};\n","import type { FieldMap } from './types';\n\nexport type MapWalkResult =\n | { kind: 'direct' }\n | { kind: 'json-path'; stopIndex: number; jsonPath: string[] }\n | { kind: 'bridge' }\n | { kind: 'fallback' };\n\n/**\n * Walk a dot-notation field path through the FieldMap.\n *\n * Returns how to interpret the path:\n * - 'direct' – all segments are relations/scalars, use standard nested filter\n * - 'json-path' – a Json scalar was found mid-path; stopIndex segments form the\n * Prisma nested key, the rest become the JSON path array\n * - 'fallback' – a segment was not found in the map; use existing behavior\n */\nexport const walkFieldPath = (field: string, map: FieldMap, rootModel: string): MapWalkResult => {\n const parts = field.split('.');\n let currentModel = rootModel;\n\n for (let i = 0; i < parts.length; i++) {\n const modelEntry = map[currentModel];\n if (!modelEntry) return { kind: 'fallback' };\n\n const fieldEntry = modelEntry.fields[parts[i]];\n if (!fieldEntry) return { kind: 'fallback' };\n\n if (fieldEntry.kind === 'bridge') return { kind: 'bridge' };\n\n if (fieldEntry.kind === 'scalar' && fieldEntry.type === 'Json' && i < parts.length - 1) {\n // This segment is a Json field and there are more segments → JSON path\n return { kind: 'json-path', stopIndex: i + 1, jsonPath: parts.slice(i + 1) };\n }\n\n if (fieldEntry.kind === 'object') {\n if (!map[fieldEntry.type]) return { kind: 'fallback' };\n currentModel = fieldEntry.type;\n continue;\n }\n\n // scalar or enum at a terminal position\n return { kind: 'direct' };\n }\n\n return { kind: 'direct' };\n};\n","import { get } from 'lodash';\nimport { Operator } from '../operator';\nimport type { Rule } from '../types';\nimport { walkFieldPath } from './mapWalk';\nimport type { BuildOptions, FieldMap, PrismaWhere } from './types';\nimport { buildNestedFilter } from './utils';\n\nexport const buildFieldRule = (rule: Rule, options?: BuildOptions): PrismaWhere => {\n // isEmpty/notEmpty need OR/AND at the WHERE level (not field-filter level)\n // because Prisma 6.x rejects mixed null/string in `in`/`notIn` for nullable fields.\n if (rule.operator === Operator.isEmpty) {\n return {\n OR: [\n buildMapAwareFilter(rule.field, { equals: null }, options),\n buildMapAwareFilter(rule.field, { equals: '' }, options),\n ],\n };\n }\n if (rule.operator === Operator.notEmpty) {\n return {\n AND: [\n buildMapAwareFilter(rule.field, { not: null }, options),\n buildMapAwareFilter(rule.field, { not: '' }, options),\n ],\n };\n }\n\n const filter = buildLeafFilter(rule, options);\n return buildMapAwareFilter(rule.field, filter, options);\n};\n\n/**\n * Resolve the comparison value for a rule.\n * - rule.value → use literal value\n * - rule.path starting with '$.' → throw: Prisma WHERE has no column-to-column comparison\n * - rule.path (context ref) → look up from options.context via lodash get\n */\nconst resolveRuleValue = (rule: Rule, options?: BuildOptions): unknown => {\n if (rule.value !== undefined) return rule.value;\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n throw new Error(\n `Prisma WHERE has no column-to-column comparison for path '${rule.path}'. ` +\n `Use prisma.$queryRaw for field-to-field filtering.`,\n );\n }\n if (!options?.context) {\n throw new Error(\n `options.context is required to resolve path '${rule.path}'. ` +\n `Pass context when calling toPrisma().`,\n );\n }\n return get(options.context, rule.path);\n }\n throw new Error(`Rule for field '${rule.field}' has neither value nor path set`);\n};\n\nconst buildLeafFilter = (rule: Rule, options?: BuildOptions): unknown => {\n // Lazy resolver: only called by operators that need a value\n const val = () => resolveRuleValue(rule, options);\n\n switch (rule.operator) {\n case Operator.equals:\n return { equals: val() ?? null };\n\n case Operator.notEquals:\n return { not: val() ?? null };\n\n case Operator.lessThan:\n return { lt: val() };\n\n case Operator.lessThanEquals:\n return { lte: val() };\n\n case Operator.greaterThan:\n return { gt: val() };\n\n case Operator.greaterThanEquals:\n return { gte: val() };\n\n case Operator.in:\n return { in: val() };\n\n case Operator.notIn:\n return { notIn: val() };\n\n case Operator.contains:\n return { contains: val() };\n\n case Operator.notContains:\n return { not: { contains: val() } };\n\n case Operator.startsWith:\n return { startsWith: val() };\n\n case Operator.endsWith:\n return { endsWith: val() };\n\n case Operator.matches:\n throw new Error(\n `Operator 'matches' has no Prisma equivalent. Use prisma.$queryRaw for regex filtering.`,\n );\n\n case Operator.notMatches:\n throw new Error(\n `Operator 'notMatches' has no Prisma equivalent. Use prisma.$queryRaw for regex filtering.`,\n );\n\n case Operator.between: {\n const v = val();\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('between operator requires an array of two values');\n }\n const [min, max] = v[0] <= v[1] ? v : [v[1], v[0]];\n return { gte: min, lte: max };\n }\n\n case Operator.notBetween: {\n const v = val();\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('notBetween operator requires an array of two values');\n }\n const [min, max] = v[0] <= v[1] ? v : [v[1], v[0]];\n return { NOT: { gte: min, lte: max } };\n }\n\n case Operator.isEmpty:\n case Operator.notEmpty:\n // Handled in buildFieldRule — should not reach here\n throw new Error('isEmpty/notEmpty handled at buildFieldRule level');\n\n case Operator.exists:\n return { not: null };\n\n case Operator.notExists:\n return { equals: null };\n\n default:\n throw new Error(`Unknown operator: ${(rule as Rule).operator}`);\n }\n};\n\n/**\n * Build the Prisma WHERE using map-aware traversal when a map+model is available.\n * - JSON field mid-path → Prisma JSON path syntax: { metadata: { path: ['theme'], equals: 'dark' } }\n * - All other paths → standard nested relation filter\n */\nconst buildMapAwareFilter = (\n field: string,\n filter: unknown,\n options?: BuildOptions,\n): PrismaWhere => {\n if (!options?.map || !options?.model) {\n return buildNestedFilter(field, filter);\n }\n\n const walkResult = walkFieldPath(field, options.map as FieldMap, options.model);\n const parts = field.split('.');\n\n switch (walkResult.kind) {\n case 'fallback':\n case 'direct':\n return buildNestedFilter(field, filter);\n\n case 'bridge':\n return {};\n\n case 'json-path': {\n // Merge the json path array into the leaf filter, then nest normally\n const jsonFilter = { path: walkResult.jsonPath, ...(filter as object) };\n const fieldUpToJson = parts.slice(0, walkResult.stopIndex).join('.');\n return buildNestedFilter(fieldUpToJson, jsonFilter);\n }\n }\n};\n","import type { All, Any, Condition, IfThenElse } from '../types';\nimport type { BuildOptions, PrismaBuildState, PrismaWhere } from './types';\n\n// Forward declaration - provided by condition.ts to avoid circular import\ntype BuildConditionFn = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n) => PrismaWhere;\nlet buildCondition: BuildConditionFn;\n\nexport const setConditionBuilder = (fn: BuildConditionFn) => {\n buildCondition = fn;\n};\n\nexport const buildAll = (\n all: All,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n if (all.all.length === 0) return {};\n return { AND: all.all.map((c) => buildCondition(c, options, state)) };\n};\n\nexport const buildAny = (\n any: Any,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n if (any.any.length === 0) return { AND: [{ id: null }, { id: { not: null } }] };\n return { OR: any.any.map((c) => buildCondition(c, options, state)) };\n};\n\nexport const buildIfThenElse = (\n cond: IfThenElse,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n // if → then is equivalent to: NOT(if) OR then\n // With else: (NOT(if) OR then) AND (if OR else)\n //\n // Build the `if` clause once to avoid pushing duplicate GroupBySteps into state\n // when the `if` clause contains a count-based array operator (atLeast/atMost/exactly).\n const ifClause = buildCondition(cond.if, options, state);\n const notIf = { NOT: ifClause };\n const thenClause = buildCondition(cond.then, options, state);\n\n if (cond.else) {\n const elseClause = buildCondition(cond.else, options, state);\n return {\n AND: [{ OR: [notIf, thenClause] }, { OR: [ifClause, elseClause] }],\n };\n }\n\n return { OR: [notIf, thenClause] };\n};\n","import type { Condition } from '../types';\nimport { buildAggregateRule, setConditionBuilderForAggregate } from './aggregate';\nimport { buildArrayRule, setConditionBuilderForArray } from './array';\nimport { buildDateRule } from './date';\nimport { buildFieldRule } from './field';\nimport { buildAll, buildAny, buildIfThenElse, setConditionBuilder } from './logical';\nimport type { BuildOptions, PrismaBuildState, PrismaWhere } from './types';\n\nexport const buildCondition = (\n condition: Condition,\n options?: BuildOptions,\n state?: PrismaBuildState,\n): PrismaWhere => {\n if (typeof condition === 'boolean') {\n if (condition) return {};\n throw new Error(\n `Boolean 'false' has no direct Prisma WHERE equivalent. toPrisma is designed for structured Rule conditions.`,\n );\n }\n\n if ('all' in condition) return buildAll(condition, options, state);\n if ('any' in condition) return buildAny(condition, options, state);\n if ('if' in condition) return buildIfThenElse(condition, options, state);\n if ('arrayOperator' in condition) return buildArrayRule(condition, options, state);\n if ('dateOperator' in condition) return buildDateRule(condition, options);\n if ('aggregate' in condition) return buildAggregateRule(condition, options, state);\n if ('field' in condition) return buildFieldRule(condition, options);\n\n throw new Error('Unknown condition type');\n};\n\n// Wire up circular dependencies\nsetConditionBuilder(buildCondition);\nsetConditionBuilderForArray(buildCondition);\nsetConditionBuilderForAggregate(buildCondition);\n","import type { GroupByStep, ToPrismaResult, WhereStep } from './types';\n\n/**\n * Execute a Prisma query plan produced by toPrisma().\n *\n * The plan is a flat list of steps where all but the last are `groupBy` steps\n * that feed results (via { __step: N } sentinels) into subsequent steps.\n * The final step is always a `where` step whose resolved WHERE clause is returned.\n *\n * @param result - Result from toPrisma()\n * @param prismaDelegate - Map of camelCase model name → Prisma delegate\n * e.g. { post: prisma.post, user: prisma.user }\n * @returns The resolved WHERE clause (ready for findMany/count/etc.)\n *\n * @example\n * const plan = toPrisma(condition, { map, model: 'User' });\n * const where = await executePrismaQueryPlan(plan, { post: prisma.post });\n * await prisma.user.findMany({ where });\n */\nexport const executePrismaQueryPlan = async (\n result: ToPrismaResult,\n prismaDelegate: Record<string, Record<string, (...args: unknown[]) => unknown>>,\n): Promise<Record<string, unknown>> => {\n const groupBySteps = result.steps.filter((s): s is GroupByStep => s.operation === 'groupBy');\n const whereStep = result.steps.find((s): s is WhereStep => s.operation === 'where');\n\n if (!whereStep) {\n throw new Error('executePrismaQueryPlan: result has no where step');\n }\n\n const stepResults: unknown[][] = [];\n\n for (const step of groupBySteps) {\n const modelKey = step.model.charAt(0).toLowerCase() + step.model.slice(1);\n const delegate = prismaDelegate[modelKey];\n if (!delegate) {\n throw new Error(\n `executePrismaQueryPlan: no delegate for model '${step.model}'. ` +\n `Ensure prismaDelegate has a key '${modelKey}'.`,\n );\n }\n const rows = await delegate[step.operation](step.args);\n stepResults.push((rows as Record<string, unknown>[]).map((r) => r[step.extract]));\n }\n\n return resolveStepRefs(whereStep.where, stepResults) as Record<string, unknown>;\n};\n\n/**\n * Recursively replace { __step: N } sentinels with the corresponding step result array.\n */\nconst resolveStepRefs = (obj: unknown, stepResults: unknown[][]): unknown => {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj.map((item) => resolveStepRefs(item, stepResults));\n }\n\n if (typeof obj === 'object') {\n const record = obj as Record<string, unknown>;\n\n if ('__step' in record && typeof record.__step === 'number') {\n const idx = record.__step;\n if (idx >= stepResults.length) {\n throw new Error(\n `Step ref __step: ${idx} out of range (${stepResults.length} steps executed)`,\n );\n }\n return stepResults[idx];\n }\n\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n resolved[key] = resolveStepRefs(value, stepResults);\n }\n return resolved;\n }\n\n return obj;\n};\n","import type { Condition } from '../types';\nimport { buildCondition } from './condition';\nimport type { BuildOptions, FieldMap, PrismaBuildState, ToPrismaResult } from './types';\n\nconst normalizeOptions = (options?: BuildOptions): BuildOptions | undefined => {\n if (!options?.map || !options.mapName) return options;\n if (!('maps' in options.map)) return options;\n const resolved = (options.map as { maps: Record<string, FieldMap> }).maps[options.mapName];\n if (!resolved) {\n throw new Error(`toPrisma: fieldMap set has no entry for '${options.mapName}'`);\n }\n return { ...options, map: resolved };\n};\n\nexport { executePrismaQueryPlan } from './execute';\nexport type {\n BuildOptions,\n FieldMap,\n FieldMapEntry,\n GroupByStep,\n PrismaStep,\n PrismaWhere,\n StepRef,\n ToPrismaResult,\n WhereStep,\n} from './types';\n\n/**\n * Convert a json-rules Condition to a Prisma query plan.\n *\n * Returns a `ToPrismaResult` with:\n * - `where` – the Prisma WHERE clause\n * - `steps` – optional array of groupBy steps for count-based relation filters\n * (only present when `atLeast`/`atMost`/`exactly` operators are used with a map)\n *\n * When `steps` is present, pass the result to `executePrismaQueryPlan` to\n * resolve step refs before using `where` in a Prisma query.\n *\n * @param condition - The rule condition to convert\n * @param options - Optional map, model, and context\n *\n * @example\n * ```typescript\n * // Simple scalar\n * toPrisma({ field: 'status', operator: Operator.equals, value: 'active' })\n * // → { where: { status: { equals: 'active' } } }\n *\n * // JSON field detection (map required)\n * toPrisma({ field: 'metadata.theme', operator: Operator.equals, value: 'dark' }, { map, model: 'User' })\n * // → { where: { metadata: { path: ['theme'], equals: 'dark' } } }\n *\n * // Context path ref\n * toPrisma({ field: 'userId', operator: Operator.equals, path: 'currentUser.id' }, { context: { currentUser: { id: '123' } } })\n * // → { where: { userId: { equals: '123' } } }\n *\n * // Multi-step (map required)\n * const plan = toPrisma({ field: 'posts', arrayOperator: 'atLeast', count: 3, condition: {...} }, { map, model: 'User' });\n * const where = await executePrismaQueryPlan(plan, { post: prisma.post });\n * await prisma.user.findMany({ where });\n * ```\n */\nexport const toPrisma = (condition: Condition, options?: BuildOptions): ToPrismaResult => {\n const state: PrismaBuildState = { steps: [] };\n const where = buildCondition(condition, normalizeOptions(options), state);\n return {\n steps: [...state.steps, { operation: 'where', where }],\n };\n};\n","export const escapeIdentifier = (identifier: string): string =>\n `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n","import type { BuilderState } from './types';\n\nexport const nextParam = (state: BuilderState, value: unknown): string => {\n state.params.push(value);\n return `$${++state.paramIndex}`;\n};\n","import { escapeIdentifier } from './escape';\n\n/**\n * Escape a value for use in a LIKE pattern.\n * Escapes \\, %, and _ which are special characters in PostgreSQL LIKE.\n */\nexport const escapeLikePattern = (value: string): string => {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/%/g, '\\\\%').replace(/_/g, '\\\\_');\n};\n\n/**\n * Quote a field name as a SQL identifier, handling JSON paths.\n * Uses pg's escapeIdentifier for proper SQL injection prevention.\n *\n * Examples:\n * \"name\" → \"name\"\n * \"data.theme\" → \"data\"->>'theme'\n * \"settings.display.mode\" → \"settings\"->'display'->>'mode'\n */\nexport const quoteField = (field: string): string => {\n const parts = field.split('.');\n if (parts.length === 1) return escapeIdentifier(field);\n\n const [column, ...jsonPath] = parts;\n if (jsonPath.length === 0) return escapeIdentifier(column);\n\n return buildJsonPath(escapeIdentifier(column), jsonPath);\n};\n\n/**\n * Quote a field (with possible JSON sub-path) qualified with a table alias.\n *\n * Examples:\n * quoteQualifiedField('name', 't0') → \"t0\".\"name\"\n * quoteQualifiedField('data.theme', 't0') → \"t0\".\"data\"->>'theme'\n * quoteQualifiedField('data.a.b', 't0') → \"t0\".\"data\"->'a'->>'b'\n */\nexport const quoteQualifiedField = (field: string, alias: string): string => {\n const parts = field.split('.');\n if (parts.length === 1) {\n return `${escapeIdentifier(alias)}.${escapeIdentifier(field)}`;\n }\n\n const [column, ...jsonPath] = parts;\n return buildJsonPath(`${escapeIdentifier(alias)}.${escapeIdentifier(column)}`, jsonPath);\n};\n\nconst escapeJsonKey = (key: string) => `'${key.replace(/'/g, \"''\")}'`;\n\nconst buildJsonPath = (columnExpr: string, jsonPath: string[]): string => {\n if (jsonPath.length === 0) return columnExpr;\n\n const pathParts = jsonPath.slice(0, -1).map(escapeJsonKey).join('->');\n const leaf = escapeJsonKey(jsonPath[jsonPath.length - 1]);\n\n if (pathParts) {\n return `${columnExpr}->${pathParts}->>${leaf}`;\n }\n return `${columnExpr}->>${leaf}`;\n};\n\n/**\n * Like quoteField but keeps the leaf as JSONB (uses -> instead of ->> at the end).\n * Required when the result must be a JSONB value, e.g. as input to jsonb_array_elements().\n *\n * Examples:\n * \"scores\" → \"scores\"\n * \"settings.scores\" → \"settings\"->'scores'\n */\nexport const quoteFieldAsJsonb = (field: string): string => {\n const parts = field.split('.');\n if (parts.length === 1) return escapeIdentifier(field);\n\n const [column, ...jsonPath] = parts;\n if (jsonPath.length === 0) return escapeIdentifier(column);\n\n return buildJsonPathJsonb(escapeIdentifier(column), jsonPath);\n};\n\nconst buildJsonPathJsonb = (columnExpr: string, jsonPath: string[]): string => {\n const allParts = jsonPath.map(escapeJsonKey).join('->');\n return `${columnExpr}->${allParts}`;\n};\n","import { get } from 'lodash';\nimport { Operator } from '../operator';\nimport type { AggregateRule } from '../types';\nimport { escapeIdentifier } from './escape';\nimport { nextParam } from './params';\nimport { quoteField, quoteFieldAsJsonb } from './quoting';\nimport type { BuilderState } from './types';\n\nexport const buildAggregateRule = (rule: AggregateRule, state: BuilderState): string => {\n if (rule.condition) {\n throw new Error(\n `Aggregate condition filtering is not yet supported by toSql(). ` +\n `Use check() for in-memory evaluation or toPrisma() for database queries.`,\n );\n }\n\n const subquery = buildAggregateSubquery(rule, state);\n return buildAggregateComparison(subquery, rule, state);\n};\n\nconst buildAggregateSubquery = (rule: AggregateRule, state: BuilderState): string => {\n // Use JSONB-preserving field reference — aggregate functions need JSONB input, not text\n const field = quoteFieldAsJsonb(rule.field);\n const { mode, field: itemField } = rule.aggregate;\n const fn = mode === 'sum' ? 'SUM' : 'AVG';\n\n const fieldEntry = state.map?.[state.currentModel ?? '']?.fields[rule.field];\n\n if (fieldEntry?.kind === 'object') {\n throw new Error(\n `Field '${rule.field}' is a relation — toSql() cannot aggregate relation lists. Use toPrisma() instead.`,\n );\n }\n\n if (itemField?.includes('.')) {\n throw new Error(\n `aggregate.field '${itemField}' contains a nested path — toSql() only supports flat field names. Use check() for nested paths.`,\n );\n }\n\n const isNative = fieldEntry?.kind === 'scalar' && fieldEntry?.isList === true;\n\n if (isNative) {\n if (itemField) {\n throw new Error(\n `aggregate.field is not supported for native array types. Use a JSONB column for object arrays.`,\n );\n }\n const agg = fn === 'SUM' ? `COALESCE(SUM(elem), 0)` : `AVG(elem)`;\n return `(SELECT ${agg} FROM unnest(${field}) AS elem)`;\n }\n\n if (itemField) {\n // JSONB object array\n const extract = `(elem->>'${itemField}')::numeric`;\n const agg = fn === 'SUM' ? `COALESCE(SUM(${extract}), 0)` : `AVG(${extract})`;\n return `(SELECT ${agg} FROM jsonb_array_elements(${field}) AS elem)`;\n }\n\n // JSONB primitive array\n const extract = `elem::numeric`;\n const agg = fn === 'SUM' ? `COALESCE(SUM(${extract}), 0)` : `AVG(${extract})`;\n return `(SELECT ${agg} FROM jsonb_array_elements_text(${field}) AS elem)`;\n};\n\ntype ResolvedRhs = { type: 'value'; value: unknown } | { type: 'column'; sql: string };\n\nconst resolveRhs = (rule: AggregateRule, state: BuilderState): ResolvedRhs => {\n if (rule.value !== undefined) return { type: 'value', value: rule.value };\n\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n const refField = rule.path.substring(2);\n const sql = state.currentAlias\n ? `${escapeIdentifier(state.currentAlias)}.${escapeIdentifier(refField)}`\n : quoteField(refField);\n return { type: 'column', sql };\n }\n if (!state.context) {\n throw new Error(\n `BuilderState.context is required to resolve path '${rule.path}'. Pass context in options.`,\n );\n }\n return { type: 'value', value: get(state.context, rule.path) };\n }\n\n throw new Error('Aggregate rule requires value or path');\n};\n\nconst buildAggregateComparison = (\n lhs: string,\n rule: AggregateRule,\n state: BuilderState,\n): string => {\n const rhs = resolveRhs(rule, state);\n const rhsVal = rhs.type === 'value' ? rhs.value : undefined;\n const rhsCol = rhs.type === 'column' ? rhs.sql : undefined;\n\n switch (rule.operator) {\n case Operator.equals:\n if (rhsCol) return `${lhs} = ${rhsCol}`;\n if (rhsVal === null) return `${lhs} IS NULL`;\n return `${lhs} = ${nextParam(state, rhsVal)}`;\n case Operator.notEquals:\n if (rhsCol) return `${lhs} <> ${rhsCol}`;\n if (rhsVal === null) return `${lhs} IS NOT NULL`;\n return `${lhs} <> ${nextParam(state, rhsVal)}`;\n case Operator.lessThan:\n if (rhsCol) return `${lhs} < ${rhsCol}`;\n return `${lhs} < ${nextParam(state, rhsVal)}`;\n case Operator.lessThanEquals:\n if (rhsCol) return `${lhs} <= ${rhsCol}`;\n return `${lhs} <= ${nextParam(state, rhsVal)}`;\n case Operator.greaterThan:\n if (rhsCol) return `${lhs} > ${rhsCol}`;\n return `${lhs} > ${nextParam(state, rhsVal)}`;\n case Operator.greaterThanEquals:\n if (rhsCol) return `${lhs} >= ${rhsCol}`;\n return `${lhs} >= ${nextParam(state, rhsVal)}`;\n case Operator.between: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) throw new Error('between requires two values');\n const [min, max] = (v[0] as number) <= (v[1] as number) ? v : [v[1], v[0]];\n return `${lhs} BETWEEN ${nextParam(state, min)} AND ${nextParam(state, max)}`;\n }\n case Operator.notBetween: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) throw new Error('notBetween requires two values');\n const [min, max] = (v[0] as number) <= (v[1] as number) ? v : [v[1], v[0]];\n return `${lhs} NOT BETWEEN ${nextParam(state, min)} AND ${nextParam(state, max)}`;\n }\n default:\n throw new Error(`Operator '${rule.operator}' is not supported for aggregate rules`);\n }\n};\n","import { ArrayOperator } from '../operator';\nimport type { ArrayRule } from '../types';\nimport { quoteField } from './quoting';\nimport type { BuilderState } from './types';\n\nexport const buildArrayRule = (rule: ArrayRule, state: BuilderState): string => {\n if (!rule.field) {\n throw new Error('toSql: ArrayRule.field is required (fieldless arrayOps are check-only)');\n }\n const field = quoteField(rule.field);\n const fieldEntry = state.map?.[state.currentModel ?? '']?.fields[rule.field];\n const isNative = fieldEntry?.kind === 'scalar' && fieldEntry?.isList === true;\n\n // Different length functions for JSONB vs native PostgreSQL arrays\n const lengthFn = isNative\n ? `array_length(${field}, 1)` // Native: TEXT[], INT[], etc.\n : `jsonb_array_length(${field})`; // JSONB arrays\n\n switch (rule.arrayOperator) {\n case ArrayOperator.empty:\n if (isNative) {\n // Native arrays: NULL or empty (array_length returns NULL for empty)\n return `(${field} IS NULL OR ${lengthFn} IS NULL)`;\n }\n return `(${field} IS NULL OR ${lengthFn} = 0)`;\n\n case ArrayOperator.notEmpty:\n if (isNative) {\n return `(${field} IS NOT NULL AND ${lengthFn} IS NOT NULL)`;\n }\n return `(${field} IS NOT NULL AND ${lengthFn} > 0)`;\n\n case ArrayOperator.all:\n case ArrayOperator.any:\n case ArrayOperator.none:\n case ArrayOperator.atLeast:\n case ArrayOperator.atMost:\n case ArrayOperator.exactly:\n throw new Error(\n `Array operator '${rule.arrayOperator}' with conditions is not supported in SQL. ` +\n 'Use application-level filtering for complex array operations.',\n );\n\n default:\n throw new Error(`Unknown array operator: ${(rule as ArrayRule).arrayOperator}`);\n }\n};\n","export const mapDayNames = (days: string[]): number[] => {\n const dayMap: Record<string, number> = {\n sunday: 0,\n monday: 1,\n tuesday: 2,\n wednesday: 3,\n thursday: 4,\n friday: 5,\n saturday: 6,\n };\n return days.map((d) => {\n const num = dayMap[d.toLowerCase()];\n if (num === undefined) throw new Error(`Unknown day name: ${d}`);\n return num;\n });\n};\n","import type { FieldMapEntry } from '../toPrisma/types';\nimport { escapeIdentifier } from './escape';\nimport { quoteField, quoteQualifiedField } from './quoting';\nimport type { BuilderState, FieldMap } from './types';\n\n/**\n * Resolve a dot-notation field to a fully-qualified SQL expression,\n * generating LEFT JOINs for any relation traversals found in the map.\n *\n * Falls back to quoteField() when map/model/alias are not set or a\n * segment is not found in the map.\n *\n * Mutates state.joins, state.joinCounter, and state.joinRegistry.\n */\nexport const resolveFieldSql = (field: string, state: BuilderState): string => {\n if (!state.map || !state.currentModel || !state.currentAlias) {\n return quoteField(field);\n }\n\n const parts = field.split('.');\n let currentModel = state.currentModel;\n let currentAlias = state.currentAlias;\n\n for (let i = 0; i < parts.length; i++) {\n const modelEntry = state.map[currentModel];\n if (!modelEntry) return quoteField(field); // fallback\n\n const fieldEntry = modelEntry.fields[parts[i]];\n if (!fieldEntry) return quoteField(field); // fallback\n\n if (fieldEntry.kind === 'object') {\n // Traverse relation: generate (or reuse) a JOIN\n const registryKey = `${currentAlias}.${parts[i]}`;\n const existingAlias = state.joinRegistry?.get(registryKey);\n let targetAlias: string;\n\n if (existingAlias) {\n targetAlias = existingAlias;\n } else {\n const joinCounter = state.joinCounter;\n if (!joinCounter) return quoteField(field);\n\n targetAlias = `t${++joinCounter.n}`;\n const joinClause = buildJoinClause(\n state.map,\n currentModel,\n currentAlias,\n fieldEntry,\n targetAlias,\n );\n if (!joinClause) return quoteField(field); // fallback: can't determine FK\n\n state.joins?.push(joinClause);\n state.joinRegistry?.set(registryKey, targetAlias);\n }\n\n currentModel = fieldEntry.type;\n currentAlias = targetAlias;\n continue;\n }\n\n // scalar or enum — remaining parts are either the column itself or JSON sub-path\n const remaining = parts.slice(i);\n return quoteQualifiedField(remaining.join('.'), currentAlias);\n }\n\n // Reached end after only traversing relations (field is the relation itself)\n return quoteField(field);\n};\n\n/**\n * Build a LEFT JOIN clause string for a relation field traversal.\n * Returns null when the FK cannot be determined.\n */\nconst buildJoinClause = (\n map: FieldMap,\n currentModel: string,\n currentAlias: string,\n fieldEntry: FieldMapEntry,\n targetAlias: string,\n): string | null => {\n const targetModel = fieldEntry.type;\n const targetDbName = map[targetModel]?.dbName ?? targetModel;\n\n let onCondition: string;\n\n if (\n fieldEntry.fromFields &&\n fieldEntry.fromFields.length > 0 &&\n fieldEntry.toFields &&\n fieldEntry.toFields.length > 0\n ) {\n // Forward relation: current model has FK (composite FK supported via multi-condition AND)\n onCondition = fieldEntry.fromFields\n .map(\n (from, i) =>\n `${escapeIdentifier(targetAlias)}.${escapeIdentifier(fieldEntry.toFields?.[i] ?? '')} = ` +\n `${escapeIdentifier(currentAlias)}.${escapeIdentifier(from)}`,\n )\n .join(' AND ');\n } else {\n // Back-relation: FK is on the target model — find the reverse relation.\n // Pass relationName so multiple relations between the same two models are disambiguated.\n const reverse = findReverseRelation(map, targetModel, currentModel, fieldEntry.relationName);\n if (!reverse) return null;\n onCondition = (reverse.fromFields ?? [])\n .map(\n (from, i) =>\n `${escapeIdentifier(targetAlias)}.${escapeIdentifier(from)} = ` +\n `${escapeIdentifier(currentAlias)}.${escapeIdentifier(reverse.toFields?.[i] ?? '')}`,\n )\n .join(' AND ');\n }\n\n return `LEFT JOIN ${escapeIdentifier(targetDbName as string)} AS ${escapeIdentifier(targetAlias)} ON ${onCondition}`;\n};\n\nconst findReverseRelation = (\n map: FieldMap,\n targetModel: string,\n currentModel: string,\n relationName?: string,\n): FieldMapEntry | null => {\n const targetEntry = map[targetModel];\n if (!targetEntry) return null;\n\n for (const fieldDef of Object.values(targetEntry.fields)) {\n if (\n fieldDef.kind === 'object' &&\n fieldDef.type === currentModel &&\n (fieldDef.fromFields?.length ?? 0) > 0 &&\n (fieldDef.toFields?.length ?? 0) > 0 &&\n (relationName === undefined || fieldDef.relationName === relationName)\n ) {\n return fieldDef;\n }\n }\n return null;\n};\n","import { get } from 'lodash';\nimport { DateOperator } from '../operator';\nimport type { DateRule } from '../types';\nimport { mapDayNames } from './dayNames';\nimport { escapeIdentifier } from './escape';\nimport { resolveFieldSql } from './join';\nimport { nextParam } from './params';\nimport { quoteField } from './quoting';\nimport type { BuilderState } from './types';\n\nexport const buildDateRule = (rule: DateRule, state: BuilderState): string => {\n const field = resolveFieldSql(rule.field, state);\n const rhs = resolveDateRhs(rule, state);\n\n const rhsVal = rhs.type === 'value' ? rhs.value : undefined;\n const rhsCol = rhs.type === 'column' ? rhs.sql : undefined;\n\n switch (rule.dateOperator) {\n case DateOperator.before:\n if (rhsCol !== undefined) return `${field} < ${rhsCol}`;\n return `${field} < ${nextParam(state, rhsVal)}`;\n\n case DateOperator.after:\n if (rhsCol !== undefined) return `${field} > ${rhsCol}`;\n return `${field} > ${nextParam(state, rhsVal)}`;\n\n case DateOperator.onOrBefore:\n if (rhsCol !== undefined) return `${field} <= ${rhsCol}`;\n return `${field} <= ${nextParam(state, rhsVal)}`;\n\n case DateOperator.onOrAfter:\n if (rhsCol !== undefined) return `${field} >= ${rhsCol}`;\n return `${field} >= ${nextParam(state, rhsVal)}`;\n\n case DateOperator.between: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('between date operator requires an array of two values');\n }\n const [start, end] = normalizeDateRange(v);\n return `${field} BETWEEN ${nextParam(state, start)} AND ${nextParam(state, end)}`;\n }\n\n case DateOperator.notBetween: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('notBetween date operator requires an array of two values');\n }\n const [start, end] = normalizeDateRange(v);\n return `${field} NOT BETWEEN ${nextParam(state, start)} AND ${nextParam(state, end)}`;\n }\n\n case DateOperator.dayIn: {\n if (!Array.isArray(rule.value)) {\n throw new Error('dayIn operator requires an array of day names');\n }\n const days = mapDayNames(rule.value.map((day) => String(day)));\n return `EXTRACT(DOW FROM ${field}) = ANY(${nextParam(state, days)})`;\n }\n\n case DateOperator.dayNotIn: {\n if (!Array.isArray(rule.value)) {\n throw new Error('dayNotIn operator requires an array of day names');\n }\n const days = mapDayNames(rule.value.map((day) => String(day)));\n return `EXTRACT(DOW FROM ${field}) <> ALL(${nextParam(state, days)})`;\n }\n\n default:\n throw new Error(`Unknown date operator: ${(rule as DateRule).dateOperator}`);\n }\n};\n\nconst normalizeDateRange = (value: unknown[]): [unknown, unknown] => {\n const [first, second] = value;\n return compareDateValues(first, second) <= 0 ? [first, second] : [second, first];\n};\n\nconst compareDateValues = (left: unknown, right: unknown): number => {\n const lhs = normalizeComparableDateValue(left);\n const rhs = normalizeComparableDateValue(right);\n return lhs < rhs ? -1 : lhs > rhs ? 1 : 0;\n};\n\nconst normalizeComparableDateValue = (value: unknown): string | number => {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number' || typeof value === 'string') return value;\n return String(value);\n};\n\ntype ResolvedRhs = { type: 'value'; value: unknown } | { type: 'column'; sql: string };\n\nconst resolveDateRhs = (rule: DateRule, state: BuilderState): ResolvedRhs => {\n if (rule.value !== undefined) {\n return { type: 'value', value: rule.value };\n }\n\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n const refField = rule.path.substring(2);\n const sql = state.currentAlias\n ? `${escapeIdentifier(state.currentAlias)}.${escapeIdentifier(refField)}`\n : quoteField(refField);\n return { type: 'column', sql };\n }\n\n if (!state.context) {\n throw new Error(\n `BuilderState.context is required to resolve date path '${rule.path}'. ` +\n `Pass context in options when calling toSql().`,\n );\n }\n return { type: 'value', value: get(state.context, rule.path) };\n }\n\n return { type: 'value', value: undefined };\n};\n","import { get } from 'lodash';\nimport { Operator } from '../operator';\nimport type { Rule } from '../types';\nimport { escapeIdentifier } from './escape';\nimport { resolveFieldSql } from './join';\nimport { nextParam } from './params';\nimport { escapeLikePattern, quoteField } from './quoting';\nimport type { BuilderState } from './types';\n\nexport const buildFieldRule = (rule: Rule, state: BuilderState): string => {\n const field = resolveFieldSql(rule.field, state);\n const rhs = resolveComparison(rule, state);\n\n // Extract both variants up front so TypeScript doesn't need to narrow inside each case\n const rhsVal = rhs.type === 'value' ? rhs.value : undefined;\n const rhsCol = rhs.type === 'column' ? rhs.sql : undefined;\n\n switch (rule.operator) {\n case Operator.equals:\n if (rhsCol !== undefined) return `${field} = ${rhsCol}`;\n if (rhsVal === null) return `${field} IS NULL`;\n return `${field} = ${nextParam(state, rhsVal)}`;\n\n case Operator.notEquals:\n if (rhsCol !== undefined) return `${field} <> ${rhsCol}`;\n if (rhsVal === null) return `${field} IS NOT NULL`;\n return `${field} <> ${nextParam(state, rhsVal)}`;\n\n case Operator.lessThan:\n if (rhsCol !== undefined) return `${field} < ${rhsCol}`;\n return `${field} < ${nextParam(state, rhsVal)}`;\n\n case Operator.lessThanEquals:\n if (rhsCol !== undefined) return `${field} <= ${rhsCol}`;\n return `${field} <= ${nextParam(state, rhsVal)}`;\n\n case Operator.greaterThan:\n if (rhsCol !== undefined) return `${field} > ${rhsCol}`;\n return `${field} > ${nextParam(state, rhsVal)}`;\n\n case Operator.greaterThanEquals:\n if (rhsCol !== undefined) return `${field} >= ${rhsCol}`;\n return `${field} >= ${nextParam(state, rhsVal)}`;\n\n case Operator.in:\n if (!Array.isArray(rhsVal) || rhsVal.length === 0) return 'FALSE';\n return `${field} = ANY(${nextParam(state, rhsVal)})`;\n\n case Operator.notIn:\n if (!Array.isArray(rhsVal) || rhsVal.length === 0) return 'TRUE';\n return `${field} <> ALL(${nextParam(state, rhsVal)})`;\n\n case Operator.contains:\n return `${field} LIKE ${nextParam(state, `%${escapeLikePattern(String(rhsVal))}%`)}`;\n\n case Operator.notContains:\n return `${field} NOT LIKE ${nextParam(state, `%${escapeLikePattern(String(rhsVal))}%`)}`;\n\n case Operator.startsWith:\n return `${field} LIKE ${nextParam(state, `${escapeLikePattern(String(rhsVal))}%`)}`;\n\n case Operator.endsWith:\n return `${field} LIKE ${nextParam(state, `%${escapeLikePattern(String(rhsVal))}`)}`;\n\n case Operator.matches:\n return `${field} ~ ${nextParam(state, rhsVal)}`;\n\n case Operator.notMatches:\n return `${field} !~ ${nextParam(state, rhsVal)}`;\n\n case Operator.between: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('between operator requires an array of two values');\n }\n const [min, max] = (v[0] as number) <= (v[1] as number) ? v : [v[1], v[0]];\n return `${field} BETWEEN ${nextParam(state, min)} AND ${nextParam(state, max)}`;\n }\n\n case Operator.notBetween: {\n const v = rhsVal as unknown[];\n if (!Array.isArray(v) || v.length !== 2) {\n throw new Error('notBetween operator requires an array of two values');\n }\n const [min, max] = (v[0] as number) <= (v[1] as number) ? v : [v[1], v[0]];\n return `${field} NOT BETWEEN ${nextParam(state, min)} AND ${nextParam(state, max)}`;\n }\n\n case Operator.isEmpty:\n return `(${field} IS NULL OR ${field} = '')`;\n\n case Operator.notEmpty:\n return `(${field} IS NOT NULL AND ${field} <> '')`;\n\n case Operator.exists:\n return `${field} IS NOT NULL`;\n\n case Operator.notExists:\n return `${field} IS NULL`;\n\n default:\n throw new Error(`Unknown operator: ${(rule as Rule).operator}`);\n }\n};\n\ntype ResolvedRhs = { type: 'value'; value: unknown } | { type: 'column'; sql: string };\n\n/**\n * Resolve the right-hand side of a comparison from a Rule.\n *\n * - rule.value set → { type: 'value', value }\n * - rule.path = '$.field' → { type: 'column', sql: '\"alias\".\"field\"' } (column-to-column)\n * - rule.path = 'ctx.key' → { type: 'value', value: context[key] } (external context)\n * - neither set → { type: 'value', value: undefined } for no-value operators\n */\nconst resolveComparison = (rule: Rule, state: BuilderState): ResolvedRhs => {\n if (rule.value !== undefined) {\n return { type: 'value', value: rule.value };\n }\n\n if (rule.path) {\n if (rule.path.startsWith('$.')) {\n const refField = rule.path.substring(2);\n const sql = state.currentAlias\n ? `${escapeIdentifier(state.currentAlias)}.${escapeIdentifier(refField)}`\n : quoteField(refField);\n return { type: 'column', sql };\n }\n\n if (!state.context) {\n throw new Error(\n `BuilderState.context is required to resolve path '${rule.path}'. ` +\n `Pass context in options when calling toSql().`,\n );\n }\n return { type: 'value', value: get(state.context, rule.path) };\n }\n\n // No value, no path — valid for no-value operators (isEmpty, notEmpty, exists, notExists)\n return { type: 'value', value: undefined };\n};\n","import type { All, Any, Condition, IfThenElse } from '../types';\nimport type { BuilderState } from './types';\n\n// Forward declaration - will be provided by condition.ts\ntype BuildConditionFn = (condition: Condition, state: BuilderState) => string;\nlet buildCondition: BuildConditionFn;\n\nexport const setConditionBuilder = (fn: BuildConditionFn) => {\n buildCondition = fn;\n};\n\nexport const buildAll = (all: All, state: BuilderState): string => {\n if (all.all.length === 0) return 'TRUE';\n const clauses = all.all.map((c) => buildCondition(c, state));\n return `(${clauses.join(' AND ')})`;\n};\n\nexport const buildAny = (any: Any, state: BuilderState): string => {\n if (any.any.length === 0) return 'FALSE';\n const clauses = any.any.map((c) => buildCondition(c, state));\n return `(${clauses.join(' OR ')})`;\n};\n\nexport const buildIfThenElse = (cond: IfThenElse, state: BuilderState): string => {\n const ifClause = buildCondition(cond.if, state);\n const thenClause = buildCondition(cond.then, state);\n const elseClause = cond.else ? buildCondition(cond.else, state) : 'TRUE';\n\n // if → then is equivalent to: NOT(if) OR then\n // With else: (NOT(if) OR then) AND (if OR else)\n if (cond.else) {\n return `((NOT(${ifClause}) OR ${thenClause}) AND (${ifClause} OR ${elseClause}))`;\n }\n return `(NOT(${ifClause}) OR ${thenClause})`;\n};\n","import type { Condition } from '../types';\nimport { buildAggregateRule } from './aggregate';\nimport { buildArrayRule } from './array';\nimport { buildDateRule } from './date';\nimport { buildFieldRule } from './field';\nimport { buildAll, buildAny, buildIfThenElse, setConditionBuilder } from './logical';\nimport type { BuilderState, FieldMap } from './types';\n\nconst pathHitsBridge = (field: string, map: FieldMap, model: string): boolean => {\n const parts = field.split('.');\n let cur = model;\n for (let i = 0; i < parts.length; i++) {\n const me = map[cur];\n if (!me) return false;\n const fe = me.fields[parts[i]];\n if (!fe) return false;\n if (fe.kind === 'bridge') return true;\n if (fe.kind === 'object') {\n cur = fe.type;\n continue;\n }\n return false;\n }\n return false;\n};\n\nexport const buildCondition = (condition: Condition, state: BuilderState): string => {\n if (typeof condition === 'boolean') {\n return condition ? 'TRUE' : 'FALSE';\n }\n\n if (\n 'field' in condition &&\n typeof condition.field === 'string' &&\n state.map &&\n state.currentModel &&\n pathHitsBridge(condition.field, state.map, state.currentModel)\n ) {\n return 'TRUE';\n }\n\n if ('all' in condition) return buildAll(condition, state);\n if ('any' in condition) return buildAny(condition, state);\n if ('if' in condition) return buildIfThenElse(condition, state);\n if ('arrayOperator' in condition) return buildArrayRule(condition, state);\n if ('dateOperator' in condition) return buildDateRule(condition, state);\n if ('aggregate' in condition) return buildAggregateRule(condition, state);\n if ('field' in condition) return buildFieldRule(condition, state);\n\n throw new Error('Unknown condition type');\n};\n\n// Wire up circular dependency\nsetConditionBuilder(buildCondition);\n","import type { Condition } from '../types';\nimport { buildCondition } from './condition';\nimport type { BuilderState, FieldMap, SqlResult } from './types';\n\nexport type { FieldMap, SqlResult } from './types';\n\ntype SqlBuildOptions = {\n map?: FieldMap;\n model?: string;\n alias?: string; // root table alias, defaults to 't0' when map is provided\n context?: Record<string, unknown>;\n};\n\nexport const toSql = (condition: Condition, options?: SqlBuildOptions): SqlResult => {\n const hasMap = !!(options?.map && options?.model);\n const rootAlias = options?.alias ?? (hasMap ? 't0' : undefined);\n\n const state: BuilderState = {\n params: [],\n paramIndex: 0,\n context: options?.context,\n map: options?.map,\n currentModel: options?.model,\n currentAlias: rootAlias,\n joinCounter: hasMap ? { n: 0 } : undefined,\n joins: hasMap ? [] : undefined,\n joinRegistry: hasMap ? new Map() : undefined,\n };\n\n const sql = buildCondition(condition, state);\n return { sql, params: state.params, joins: state.joins ?? [] };\n};\n","import { ArrayOperator, type DateOperator, Operator } from './operator';\nimport {\n ARRAY_OPERATOR_CATALOG,\n DATE_OPERATOR_CATALOG,\n FIELD_OPERATOR_CATALOG,\n getValueShape,\n isAggregateRangeOperator,\n isAggregateSingleOperator,\n isOperatorSupportedForTarget,\n type RuleTarget,\n type ValueShape,\n} from './operatorCatalog';\nimport type { Condition, DateInputValue, OrderedRuleValue } from './types';\n\nexport type ValidationIssue = {\n path: string;\n message: string;\n code: string;\n};\n\nexport type ValidationResult = {\n ok: boolean;\n errors: ValidationIssue[];\n};\n\ntype ValidationContext = {\n target: RuleTarget;\n errors: ValidationIssue[];\n};\n\nconst FIELD_OPERATORS = new Set<string>(Object.keys(FIELD_OPERATOR_CATALOG));\nconst ARRAY_OPERATORS = new Set<string>(Object.keys(ARRAY_OPERATOR_CATALOG));\nconst DATE_OPERATORS = new Set<string>(Object.keys(DATE_OPERATOR_CATALOG));\n\nexport const validateRule = (\n condition: unknown,\n options: { target?: RuleTarget } = {},\n): ValidationResult => {\n const context: ValidationContext = {\n target: options.target ?? 'check',\n errors: [],\n };\n\n validateCondition(condition, '$', context);\n return { ok: context.errors.length === 0, errors: context.errors };\n};\n\nexport const assertValidRule = (\n condition: unknown,\n options: { target?: RuleTarget } = {},\n): asserts condition is Condition => {\n const result = validateRule(condition, options);\n if (result.ok) return;\n\n const message = result.errors.map((error) => `${error.path}: ${error.message}`).join('\\n');\n throw new Error(`Invalid rule:\\n${message}`);\n};\n\nconst validateCondition = (condition: unknown, path: string, context: ValidationContext): void => {\n if (typeof condition === 'boolean') {\n if (context.target === 'toPrisma' && condition === false) {\n pushIssue(\n context,\n path,\n 'boolean_false_not_supported',\n `Boolean 'false' is not supported by toPrisma()`,\n );\n }\n return;\n }\n\n if (!isPlainObject(condition)) {\n pushIssue(context, path, 'invalid_condition', 'Condition must be a boolean or object');\n return;\n }\n\n const shape = detectShape(condition);\n if (!shape) {\n pushIssue(\n context,\n path,\n 'ambiguous_condition',\n 'Condition must be exactly one of: field rule, array rule, date rule, all, any, or if/then[/else]',\n );\n return;\n }\n\n switch (shape) {\n case 'all':\n validateLogicalArray(condition.all, `${path}.all`, context);\n break;\n case 'any':\n validateLogicalArray(condition.any, `${path}.any`, context);\n break;\n case 'if':\n validateCondition(condition.if, `${path}.if`, context);\n validateCondition(condition.then, `${path}.then`, context);\n if ('else' in condition && condition.else !== undefined) {\n validateCondition(condition.else, `${path}.else`, context);\n }\n break;\n case 'field':\n validateFieldRule(condition, path, context);\n break;\n case 'aggregate':\n validateAggregateRule(condition, path, context);\n break;\n case 'array':\n validateArrayRule(condition, path, context);\n break;\n case 'date':\n validateDateRule(condition, path, context);\n break;\n }\n};\n\nconst detectShape = (\n condition: Record<string, unknown>,\n): 'all' | 'any' | 'if' | 'field' | 'aggregate' | 'array' | 'date' | null => {\n const shapes: string[] = [];\n if ('all' in condition) shapes.push('all');\n if ('any' in condition) shapes.push('any');\n if ('if' in condition || 'then' in condition || 'else' in condition) shapes.push('if');\n if ('arrayOperator' in condition) shapes.push('array');\n if ('dateOperator' in condition) shapes.push('date');\n if ('aggregate' in condition) shapes.push('aggregate');\n else if ('operator' in condition) shapes.push('field');\n\n const uniqueShapes = Array.from(new Set(shapes));\n if (uniqueShapes.length !== 1) return null;\n return uniqueShapes[0] as 'all' | 'any' | 'if' | 'field' | 'aggregate' | 'array' | 'date';\n};\n\nconst validateLogicalArray = (value: unknown, path: string, context: ValidationContext): void => {\n if (!Array.isArray(value)) {\n pushIssue(\n context,\n path,\n 'logical_array_required',\n 'Logical operator requires an array of conditions',\n );\n return;\n }\n\n value.forEach((item, index) => {\n validateCondition(item, `${path}[${index}]`, context);\n });\n};\n\nconst validateFieldRule = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if (typeof rule.field !== 'string') {\n pushIssue(context, `${path}.field`, 'field_required', 'Field rule requires a string field');\n }\n\n if (typeof rule.operator !== 'string' || !FIELD_OPERATORS.has(rule.operator)) {\n pushIssue(context, `${path}.operator`, 'invalid_operator', 'Unknown field operator');\n return;\n }\n\n const operator = rule.operator as Operator;\n\n if (!isOperatorSupportedForTarget(operator, context.target)) {\n pushIssue(\n context,\n `${path}.operator`,\n `unsupported_${targetSlug(context.target)}_operator`,\n `Operator '${operator}' is not supported by ${context.target}()`,\n );\n }\n\n if (\n context.target === 'toPrisma' &&\n typeof rule.path === 'string' &&\n rule.path.startsWith('$.')\n ) {\n pushIssue(\n context,\n `${path}.path`,\n 'unsupported_prisma_path',\n `Path '${rule.path}' is not supported by toPrisma()`,\n );\n }\n\n const shape = getValueShape(operator);\n\n if (shape === 'none') {\n forbidValueAndPath(rule, path, context);\n return;\n }\n\n if (!requireValueOrPath(rule, path, context)) return;\n if ('path' in rule && typeof rule.path === 'string') return;\n\n validateValueShape(shape, rule.value, operator, `${path}.value`, context);\n};\n\nconst validateValueShape = (\n shape: ValueShape,\n value: unknown,\n operator: string,\n path: string,\n context: ValidationContext,\n): void => {\n switch (shape) {\n case 'scalar':\n case 'string':\n if (shape === 'string' && typeof value !== 'string') {\n pushIssue(\n context,\n path,\n 'invalid_string_value',\n `Operator '${operator}' requires a string value`,\n );\n }\n return;\n case 'ordered':\n if (!isOrderedRuleValue(value)) {\n pushIssue(\n context,\n path,\n 'invalid_ordered_value',\n `Operator '${operator}' requires a string, number, or Date value`,\n );\n }\n return;\n case 'array':\n if (!Array.isArray(value)) {\n pushIssue(\n context,\n path,\n 'invalid_membership_value',\n `Operator '${operator}' requires an array value`,\n );\n }\n return;\n case 'pattern':\n if (!(typeof value === 'string' || value instanceof RegExp)) {\n pushIssue(\n context,\n path,\n 'invalid_pattern_value',\n `Operator '${operator}' requires a string or RegExp value`,\n );\n }\n return;\n case 'range':\n if (!isOrderedRange(value)) {\n pushIssue(\n context,\n path,\n 'invalid_range_value',\n `Operator '${operator}' requires a two-item range`,\n );\n }\n return;\n }\n};\n\nconst validateAggregateRule = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if (typeof rule.field !== 'string') {\n pushIssue(context, `${path}.field`, 'field_required', 'Aggregate rule requires a string field');\n }\n\n if (!isPlainObject(rule.aggregate)) {\n pushIssue(context, `${path}.aggregate`, 'invalid_aggregate', 'aggregate must be an object');\n return;\n }\n\n const agg = rule.aggregate as Record<string, unknown>;\n if (agg.mode !== 'sum' && agg.mode !== 'avg') {\n pushIssue(\n context,\n `${path}.aggregate.mode`,\n 'invalid_aggregate_mode',\n \"aggregate.mode must be 'sum' or 'avg'\",\n );\n }\n\n if ('field' in agg && agg.field !== undefined && typeof agg.field !== 'string') {\n pushIssue(\n context,\n `${path}.aggregate.field`,\n 'invalid_aggregate_field',\n 'aggregate.field must be a string',\n );\n }\n\n const isSingle =\n typeof rule.operator === 'string' && isAggregateSingleOperator(rule.operator as Operator);\n const isRange =\n typeof rule.operator === 'string' && isAggregateRangeOperator(rule.operator as Operator);\n\n if (!isSingle && !isRange) {\n pushIssue(\n context,\n `${path}.operator`,\n 'invalid_aggregate_operator',\n `Aggregate rules only support: equals, notEquals, lessThan, lessThanEquals, greaterThan, greaterThanEquals, between, notBetween`,\n );\n return;\n }\n\n if (context.target === 'toPrisma' && rule.operator === Operator.notBetween) {\n pushIssue(\n context,\n `${path}.operator`,\n 'unsupported_prisma_aggregate_operator',\n `Operator 'notBetween' is not supported by toPrisma() for aggregate rules`,\n );\n }\n\n if (context.target === 'toPrisma' && typeof rule.path === 'string') {\n pushIssue(\n context,\n `${path}.path`,\n 'unsupported_prisma_aggregate_path',\n `path is not supported by toPrisma() for aggregate rules; use value instead`,\n );\n }\n\n if ('condition' in rule && rule.condition !== undefined) {\n if (context.target === 'toSql') {\n pushIssue(\n context,\n `${path}.condition`,\n 'unsupported_sql_aggregate_condition',\n `Aggregate condition filtering is not supported by toSql(); use check() or toPrisma()`,\n );\n }\n validateCondition(rule.condition, `${path}.condition`, context);\n }\n\n if (!requireValueOrPath(rule, path, context)) return;\n if ('path' in rule && typeof rule.path === 'string') return;\n\n const value = rule.value;\n if (isRange) {\n if (!isNumericRange(value)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_range_value',\n `Operator '${rule.operator}' requires a two-item numeric range`,\n );\n }\n } else {\n if (typeof value !== 'number') {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_aggregate_value',\n `Aggregate rule value must be a number`,\n );\n }\n }\n};\n\nconst validateArrayRule = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if (typeof rule.field !== 'string') {\n if (context.target !== 'check') {\n pushIssue(\n context,\n `${path}.field`,\n 'field_required',\n 'Array rule requires a string field for this target',\n );\n }\n }\n\n if (typeof rule.arrayOperator !== 'string' || !ARRAY_OPERATORS.has(rule.arrayOperator)) {\n pushIssue(context, `${path}.arrayOperator`, 'invalid_array_operator', 'Unknown array operator');\n return;\n }\n\n const operator = rule.arrayOperator as ArrayOperator;\n\n if (!isOperatorSupportedForTarget(operator, context.target)) {\n pushIssue(\n context,\n `${path}.arrayOperator`,\n `unsupported_${targetSlug(context.target)}_array_operator`,\n `Array operator '${operator}' is not supported by ${context.target}()`,\n );\n }\n\n switch (operator) {\n case ArrayOperator.empty:\n case ArrayOperator.notEmpty:\n if ('condition' in rule && rule.condition !== undefined) {\n pushIssue(\n context,\n `${path}.condition`,\n 'unexpected_condition',\n `Array operator '${operator}' does not accept condition`,\n );\n }\n if ('count' in rule && rule.count !== undefined) {\n pushIssue(\n context,\n `${path}.count`,\n 'unexpected_count',\n `Array operator '${operator}' does not accept count`,\n );\n }\n break;\n case ArrayOperator.all:\n case ArrayOperator.any:\n case ArrayOperator.none:\n if (!('condition' in rule) || rule.condition === undefined) {\n pushIssue(\n context,\n `${path}.condition`,\n 'missing_condition',\n `Array operator '${operator}' requires condition`,\n );\n } else {\n validateCondition(rule.condition, `${path}.condition`, context);\n }\n if ('count' in rule && rule.count !== undefined) {\n pushIssue(\n context,\n `${path}.count`,\n 'unexpected_count',\n `Array operator '${operator}' does not accept count`,\n );\n }\n break;\n case ArrayOperator.atLeast:\n case ArrayOperator.atMost:\n case ArrayOperator.exactly:\n if (context.target !== 'toPrisma' && typeof rule.count !== 'number') {\n pushIssue(\n context,\n `${path}.count`,\n 'missing_count',\n `Array operator '${operator}' requires count`,\n );\n } else if ('count' in rule && rule.count !== undefined && typeof rule.count !== 'number') {\n pushIssue(context, `${path}.count`, 'invalid_count', 'count must be a number');\n }\n if (context.target === 'check' && (!('condition' in rule) || rule.condition === undefined)) {\n pushIssue(\n context,\n `${path}.condition`,\n 'missing_condition',\n `Array operator '${operator}' requires condition for check()`,\n );\n } else if ('condition' in rule && rule.condition !== undefined) {\n validateCondition(rule.condition, `${path}.condition`, context);\n }\n break;\n }\n};\n\nconst validateDateRule = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if (typeof rule.field !== 'string') {\n pushIssue(context, `${path}.field`, 'field_required', 'Date rule requires a string field');\n }\n\n if (typeof rule.dateOperator !== 'string' || !DATE_OPERATORS.has(rule.dateOperator)) {\n pushIssue(context, `${path}.dateOperator`, 'invalid_date_operator', 'Unknown date operator');\n return;\n }\n\n const operator = rule.dateOperator as DateOperator;\n\n if (!isOperatorSupportedForTarget(operator, context.target)) {\n pushIssue(\n context,\n `${path}.dateOperator`,\n `unsupported_${targetSlug(context.target)}_date_operator`,\n `Date operator '${operator}' is not supported by ${context.target}()`,\n );\n }\n\n if (\n context.target === 'toPrisma' &&\n typeof rule.path === 'string' &&\n rule.path.startsWith('$.')\n ) {\n pushIssue(\n context,\n `${path}.path`,\n 'unsupported_prisma_path',\n `Path '${rule.path}' is not supported by toPrisma()`,\n );\n }\n\n const shape = getValueShape(operator);\n\n if (shape === 'dayList') {\n if (!Array.isArray(rule.value) || !rule.value.every((item) => typeof item === 'string')) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_day_list',\n `Date operator '${operator}' requires an array of day names`,\n );\n }\n if ('path' in rule && rule.path !== undefined) {\n pushIssue(\n context,\n `${path}.path`,\n 'unexpected_path',\n `Date operator '${operator}' does not accept path`,\n );\n }\n return;\n }\n\n if (!requireValueOrPath(rule, path, context)) return;\n if ('path' in rule && typeof rule.path === 'string') return;\n\n if (shape === 'dateRange') {\n if (!isDateRange(rule.value)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_date_range',\n `Date operator '${operator}' requires a two-item date range`,\n );\n }\n return;\n }\n\n if (!isDateInputValue(rule.value)) {\n pushIssue(\n context,\n `${path}.value`,\n 'invalid_date_value',\n `Date operator '${operator}' requires a date-like value`,\n );\n }\n};\n\nconst requireValueOrPath = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): boolean => {\n const hasValue = 'value' in rule && rule.value !== undefined;\n const hasPath = typeof rule.path === 'string';\n\n if (hasValue && hasPath) {\n pushIssue(context, path, 'ambiguous_value_source', 'Rule cannot define both value and path');\n return false;\n }\n\n if (!hasValue && !hasPath) {\n pushIssue(context, path, 'missing_value_source', 'Rule requires either value or path');\n return false;\n }\n\n return true;\n};\n\nconst forbidValueAndPath = (\n rule: Record<string, unknown>,\n path: string,\n context: ValidationContext,\n): void => {\n if ('value' in rule && rule.value !== undefined) {\n pushIssue(context, `${path}.value`, 'unexpected_value', 'Rule does not accept value');\n }\n if ('path' in rule && rule.path !== undefined) {\n pushIssue(context, `${path}.path`, 'unexpected_path', 'Rule does not accept path');\n }\n};\n\nconst targetSlug = (target: RuleTarget): string =>\n target === 'toPrisma' ? 'prisma' : target === 'toSql' ? 'sql' : 'check';\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst isOrderedRuleValue = (value: unknown): value is OrderedRuleValue =>\n typeof value === 'string' || typeof value === 'number' || value instanceof Date;\n\nconst isOrderedRange = (value: unknown): value is [OrderedRuleValue, OrderedRuleValue] =>\n Array.isArray(value) &&\n value.length === 2 &&\n isOrderedRuleValue(value[0]) &&\n isOrderedRuleValue(value[1]);\n\nconst isNumericRange = (value: unknown): value is [number, number] =>\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'number' &&\n typeof value[1] === 'number';\n\nconst isDateInputValue = (value: unknown): value is DateInputValue =>\n typeof value === 'string' || typeof value === 'number' || value instanceof Date;\n\nconst isDateRange = (value: unknown): value is [DateInputValue, DateInputValue] =>\n Array.isArray(value) &&\n value.length === 2 &&\n isDateInputValue(value[0]) &&\n isDateInputValue(value[1]);\n\nconst pushIssue = (\n context: ValidationContext,\n path: string,\n code: string,\n message: string,\n): void => {\n context.errors.push({ path, code, message });\n};\n"]}
|