@inixiative/json-rules 1.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -3
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -6
- package/dist/index.d.ts +30 -6
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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/countStep.ts","../src/toPrisma/utils.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/quoting.ts","../src/toSql/array.ts","../src/toSql/dayNames.ts","../src/toSql/join.ts","../src/toSql/params.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","checkIfThenElse","error","errors","result","arrayValue","defaultMsg","requiresCondition","requiresCount","itemCondition","count","matches","failures","some","isObject","results","item","r","buildCountStep","rule","options","state","buildCondition","map","currentModel","fieldEntry","targetModel","fkOnTarget","pkOnCurrent","reverseRelation","findReverseRelation","isImplicitM2M","f","innerWhere","having","buildHaving","step","stepIndex","stepRef","relationName","targetEntry","fieldDef","buildNestedFilter","field","filter","parts","i","setConditionBuilderForArray","fn","buildArrayRule","buildArrayLeafFilter","buildDateRule","buildDateLeafFilter","resolveDateValue","val","v","start","end","normalizeDateRange","first","second","compareDateValues","normalizeComparableDateValue","walkFieldPath","rootModel","modelEntry","buildFieldRule","buildLeafFilter","buildMapAwareFilter","resolveRuleValue","walkResult","jsonFilter","fieldUpToJson","setConditionBuilder","buildAll","c","buildAny","buildIfThenElse","cond","ifClause","notIf","thenClause","elseClause","executePrismaQueryPlan","prismaDelegate","groupBySteps","s","whereStep","stepResults","modelKey","delegate","rows","resolveStepRefs","obj","record","idx","resolved","key","toPrisma","where","escapeLikePattern","quoteField","escapeIdentifier","column","jsonPath","buildJsonPath","quoteQualifiedField","alias","escapeJsonKey","columnExpr","pathParts","leaf","_state","isNative","lengthFn","mapDayNames","days","dayMap","d","num","resolveFieldSql","currentAlias","registryKey","existingAlias","targetAlias","joinCounter","joinClause","buildJoinClause","remaining","targetDbName","onCondition","from","reverse","nextParam","resolveDateRhs","rhsVal","rhsCol","refField","resolveComparison","toSql","hasMap","rootAlias","FIELD_OPERATORS","ARRAY_OPERATORS","DATE_OPERATORS","validateRule","validateCondition","assertValidRule","message","path","pushIssue","isPlainObject","shape","detectShape","validateLogicalArray","validateFieldRule","validateArrayRule","validateDateRule","shapes","uniqueShapes","index","isPresenceOperator","forbidValueAndPath","requireValueOrPath","isOrderedRuleValue","isOrderedRange","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';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\nimport timezone from 'dayjs/plugin/timezone';\nimport utc from 'dayjs/plugin/utc';\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 } from './operator';\nimport type { 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 ('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 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 { ArrayOperator } from '../operator';\nimport type { ArrayRule, Condition } from '../types';\nimport type {\n BuildOptions,\n FieldMap,\n FieldMapEntry,\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);\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\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\nconst buildHaving = (op: ArrayOperator, count: number): Record<string, unknown> => {\n switch (op) {\n case ArrayOperator.atLeast:\n return { _count: { _all: { gte: count } } };\n case ArrayOperator.atMost:\n return { _count: { _all: { lte: count } } };\n case ArrayOperator.exactly:\n return { _count: { _all: { equals: count } } };\n default:\n throw new Error('unreachable');\n }\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 { 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 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 return { in: [null, ''] };\n\n case Operator.notEmpty:\n return { notIn: [null, ''] };\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 { 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 ('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);\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 { 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","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 isNative = rule.arrayType === 'native';\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 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 { 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 { 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 ('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 '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' | '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 ('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' | '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 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 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/toPrisma/relationUtils.ts","../src/toPrisma/aggregate.ts","../src/toPrisma/countStep.ts","../src/toPrisma/utils.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","mode","itemField","numbers","item","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","buildAggregateRule","rule","options","state","buildAggregateStep","fieldEntry","targetFieldEntry","fkOnTarget","pkOnCurrent","reverseRelation","having","buildPrismaFilter","step","stepIndex","stepRef","buildCountStep","buildCondition","isImplicitM2M","f","innerWhere","buildHaving","buildNestedFilter","field","filter","parts","i","setConditionBuilderForArray","fn","buildArrayRule","buildArrayLeafFilter","buildDateRule","buildDateLeafFilter","resolveDateValue","val","v","start","end","normalizeDateRange","first","second","compareDateValues","normalizeComparableDateValue","walkFieldPath","rootModel","modelEntry","buildFieldRule","buildLeafFilter","buildMapAwareFilter","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';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\nimport timezone from 'dayjs/plugin/timezone';\nimport utc from 'dayjs/plugin/utc';\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 const { mode, field: itemField } = condition.aggregate;\n\n const numbers: number[] = arrayValue.map((item, index) => {\n const raw = itemField ? get(item as Record<string, unknown>, itemField) : item;\n if (typeof raw !== '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 { Operator } from '../operator';\nimport type { AggregateRule } from '../types';\nimport { findReverseRelation } from './relationUtils';\nimport type {\n BuildOptions,\n FieldMap,\n GroupByStep,\n PrismaBuildState,\n PrismaWhere,\n StepRef,\n} from './types';\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\nconst buildAggregateStep = (\n rule: AggregateRule,\n options: BuildOptions & { map: FieldMap; model: string },\n state: PrismaBuildState,\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 `Prisma aggregate rules only support relation fields.`,\n );\n }\n\n if (!fieldEntry.isList) {\n throw new Error(`Field '${rule.field}' is not a list relation in model '${currentModel}'.`);\n }\n\n const targetModel = fieldEntry.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 pkOnCurrent: string;\n\n if (fieldEntry.fromFields && fieldEntry.fromFields.length > 0) {\n if (fieldEntry.fromFields.length > 1) {\n throw new Error(`Aggregate rules do not support composite FK relations.`);\n }\n fkOnTarget = fieldEntry.toFields?.[0] ?? 'id';\n pkOnCurrent = fieldEntry.fromFields[0];\n } else {\n const reverseRelation = findReverseRelation(\n map,\n targetModel,\n currentModel,\n fieldEntry.relationName,\n );\n if (!reverseRelation) {\n throw new Error(\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(`Aggregate rules do not support composite FK relations.`);\n }\n fkOnTarget = reverseRelation.fromFields?.[0] ?? '';\n pkOnCurrent = reverseRelation.toFields?.[0] ?? '';\n }\n\n const aggKey = rule.aggregate.mode === 'sum' ? '_sum' : '_avg';\n const having = { [aggKey]: { [itemField]: buildPrismaFilter(rule) } };\n\n const step: GroupByStep = {\n operation: 'groupBy',\n model: targetModel,\n args: { by: [fkOnTarget], where: {}, 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\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);\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\nconst buildHaving = (op: ArrayOperator, count: number): Record<string, unknown> => {\n switch (op) {\n case ArrayOperator.atLeast:\n return { _count: { _all: { gte: count } } };\n case ArrayOperator.atMost:\n return { _count: { _all: { lte: count } } };\n case ArrayOperator.exactly:\n return { _count: { _all: { equals: count } } };\n default:\n throw new Error('unreachable');\n }\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 { 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 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 return { in: [null, ''] };\n\n case Operator.notEmpty:\n return { notIn: [null, ''] };\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 } 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);\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 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 (!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"]}
|