@inixiative/json-rules 1.1.0 → 1.1.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/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var lodash=require('lodash'),m=require('dayjs'),W=require('dayjs/plugin/utc'),k=require('dayjs/plugin/timezone'),F=require('dayjs/plugin/isSameOrBefore'),M=require('dayjs/plugin/isSameOrAfter');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var m__default=/*#__PURE__*/_interopDefault(m);var W__default=/*#__PURE__*/_interopDefault(W);var k__default=/*#__PURE__*/_interopDefault(k);var F__default=/*#__PURE__*/_interopDefault(F);var M__default=/*#__PURE__*/_interopDefault(M);var w=(f=>(f.equals="equals",f.notEquals="notEquals",f.lessThan="lessThan",f.lessThanEquals="lessThanEquals",f.greaterThan="greaterThan",f.greaterThanEquals="greaterThanEquals",f.contains="contains",f.notContains="notContains",f.in="in",f.notIn="notIn",f.matches="matches",f.notMatches="notMatches",f.between="between",f.notBetween="notBetween",f.isEmpty="isEmpty",f.notEmpty="notEmpty",f.exists="exists",f.notExists="notExists",f.startsWith="startsWith",f.endsWith="endsWith",f))(w||{}),E=(u=>(u.all="all",u.any="any",u.none="none",u.atLeast="atLeast",u.atMost="atMost",u.exactly="exactly",u.empty="empty",u.notEmpty="notEmpty",u))(E||{}),g=(u=>(u.before="before",u.after="after",u.onOrBefore="onOrBefore",u.onOrAfter="onOrAfter",u.between="between",u.notBetween="notBetween",u.dayIn="dayIn",u.dayNotIn="dayNotIn",u))(g||{});m__default.default.extend(W__default.default);m__default.default.extend(k__default.default);m__default.default.extend(F__default.default);m__default.default.extend(M__default.default);var x=(e,r,t)=>{let a=lodash.get(r,e.field);if(!a)throw new Error(`${e.field} is null or undefined`);let s=m__default.default(a);if(!s.isValid())throw new Error(`${e.field} is not a valid date: ${a}`);let i=y=>e.error||`${e.field} ${y}`,o=V(e,r,t,s,a),n=o[0],u=o[1];switch(e.dateOperator){case "before":return s.isBefore(n)||i(`must be before ${n.format()}`);case "after":return s.isAfter(n)||i(`must be after ${n.format()}`);case "onOrBefore":return s.isSameOrBefore(n)||i(`must be on or before ${n.format()}`);case "onOrAfter":return s.isSameOrAfter(n)||i(`must be on or after ${n.format()}`);case "between":return s.isSameOrAfter(n)&&s.isSameOrBefore(u)||i(`must be between ${n.format()} and ${u.format()}`);case "notBetween":return s.isBefore(n)||s.isAfter(u)||i(`must not be between ${n.format()} and ${u.format()}`);case "dayIn":if(!Array.isArray(e.value))throw new Error("dayIn operator requires an array of day names");let y=s.format("dddd").toLowerCase(),p=e.value.map($=>$.toLowerCase());return p.includes(y)||i(`must be on ${p.join(" or ")}`);case "dayNotIn":if(!Array.isArray(e.value))throw new Error("dayNotIn operator requires an array of day names");let j=s.format("dddd").toLowerCase(),q=e.value.map($=>$.toLowerCase());return !q.includes(j)||i(`must not be on ${q.join(" or ")}`);default:throw new Error("Unknown date operator")}},V=(e,r,t,a,s)=>{if(["between","notBetween"].includes(e.dateOperator)){if(!Array.isArray(e.value)||e.value.length!==2)throw new Error(`${e.dateOperator} operator requires an array of two dates`);let n=b(e.value[0],s),u=b(e.value[1],s);if(!n.isValid())throw new Error(`Invalid start date: ${e.value[0]}`);if(!u.isValid())throw new Error(`Invalid end date: ${e.value[1]}`);return [n,u]}if(["before","after","onOrBefore","onOrAfter"].includes(e.dateOperator)){let n;if(e.value!==void 0)n=e.value;else if(e.path)e.path.startsWith("$.")?n=lodash.get(r,e.path.substring(2)):n=lodash.get(t,e.path);else throw new Error("No value or path specified for date comparison");let u=b(n,s);if(!u.isValid())throw new Error(`Invalid comparison date: ${n}`);return [u,void 0]}return [m__default.default(),void 0]},b=(e,r)=>{let t=String(e);if(t.includes("Z")||t.includes("T")&&(t.includes("+")||t.match(/T.*-\d{2}:/)))return m__default.default(e);let s=String(r),i=0;if(s.includes("+")||s.includes("T")&&s.match(/T.*-\d{2}:/)){let n=s.match(/([+-])(\d{2}):(\d{2})/);n&&(i=(n[1]==="+"?1:-1)*(parseInt(n[2])*60+parseInt(n[3])));}else s.includes("Z")||(i=0);return t.match(/^\d{4}-\d{2}-\d{2}$/)?m__default.default(e+"T00:00:00").subtract(i,"minute"):m__default.default(e).subtract(i,"minute")};var R=(e,r,t)=>{let a=lodash.get(r,e.field),i=!["isEmpty","notEmpty","exists","notExists"].includes(e.operator),o=i?P(e,r,t):void 0,n=u=>e.error||`${e.field} ${u}${i?" "+JSON.stringify(o):""}`;switch(e.operator){case "equals":return a===o||n("must equal");case "notEquals":return a!==o||n("must not equal");case "lessThan":return a<o||n("must be less than");case "lessThanEquals":return a<=o||n("must be less than or equal to");case "greaterThan":return a>o||n("must be greater than");case "greaterThanEquals":return a>=o||n("must be greater than or equal to");case "in":return o?.includes(a)||n("must be one of");case "notIn":return !o?.includes(a)||n("must not be one of");case "contains":return a?.includes(o)||n("must contain");case "notContains":return !a?.includes(o)||n("must not contain");case "matches":return !!a?.match(o)||n("must match pattern");case "notMatches":return !a?.match(o)||n("must not match pattern");case "between":if(!Array.isArray(o)||o.length!==2)throw new Error("between operator requires an array of two values");return a>=o[0]&&a<=o[1]||n("must be between");case "notBetween":if(!Array.isArray(o)||o.length!==2)throw new Error("notBetween operator requires an array of two values");return a<o[0]||a>o[1]||n("must not be between");case "isEmpty":return lodash.isEmpty(a)||n("must be empty");case "notEmpty":return !lodash.isEmpty(a)||n("must not be empty");case "exists":return a!==void 0||n("must exist");case "notExists":return a===void 0||n("must not exist");case "startsWith":return a?.startsWith?.(o)||n("must start with");case "endsWith":return a?.endsWith?.(o)||n("must end with");default:throw new Error("Unknown operator")}},P=(e,r,t)=>{if(e.value!==void 0)return e.value;if(e.path)return e.path.startsWith("$.")?lodash.get(r,e.path.substring(2)):lodash.get(t,e.path);throw new Error("No value or path specified")};var c=(e,r,t=r)=>typeof e=="boolean"?e:"all"in e?X(e.all,r,t,e.error):"any"in e?Y(e.any,r,t,e.error):"arrayOperator"in e?J(e,r,t):"dateOperator"in e?x(e,r,t):"field"in e?R(e,r,t):"if"in e?Z(e,r,t):false,X=(e,r,t,a)=>{let s=[];for(let i of e){let o=c(i,r,t);o!==true&&(typeof o=="string"?s.push(o):s.push("false"));}return s.length?a||(s.length===1?s[0]:`All conditions must pass: ${s.join(" AND ")}`):true},Y=(e,r,t,a)=>{let s=[];for(let i of e){let o=c(i,r,t);if(typeof o!="string")return true;s.push(o);}return a||(s.length===1?s[0]:`At least one condition must pass: ${s.join(" OR ")}`)},Z=(e,r,t)=>c(e.if,r,t)===true?c(e.then,r,t):e.else?c(e.else,r,t):true,J=(e,r,t)=>{let a=lodash.get(t,e.field);if(!Array.isArray(a))throw new Error(`${e.field} must be an array`);let s=y=>e.error||`${e.field} ${y}`,i=["all","any","none","atLeast","atMost","exactly"],o=["atLeast","atMost","exactly"];if(i.includes(e.arrayOperator)&&!e.condition)throw new Error(`${e.arrayOperator} requires a condition to check against array elements`);if(o.includes(e.arrayOperator)&&e.count===void 0)throw new Error(`${e.arrayOperator} requires a count`);let n=0,u=0;if(i.includes(e.arrayOperator)){if(!lodash.some(a,lodash.isObject))throw new Error(`${e.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`);let y=a.map(p=>c(e.condition,p,t));n=y.filter(p=>p===true).length,u=y.filter(p=>typeof p=="string").length;}switch(e.arrayOperator){case "empty":return !a.length||s("must be empty");case "notEmpty":return !!a.length||s("must not be empty");case "all":return n===a.length||s(`all elements must match (${u} failed)`);case "any":return !!n||s("at least one element must match");case "none":return !n||s(`no elements should match (${n} matched)`);case "atLeast":return n>=e.count||s(`at least ${e.count} elements must match (${n} matched)`);case "atMost":return n<=e.count||s(`at most ${e.count} elements must match (${n} matched)`);case "exactly":return n===e.count||s(`exactly ${e.count} elements must match (${n} matched)`);default:throw new Error("Unknown array operator")}};var l=(e,r)=>(e.params.push(r),`$${++e.paramIndex}`),h=e=>{let r=e.split(".");if(r.length===1)return `"${e}"`;let[t,...a]=r;if(a.length===0)return `"${t}"`;let s=a.slice(0,-1).map(o=>`'${o}'`).join("->"),i=a[a.length-1];return s?`"${t}"->${s}->>'${i}'`:`"${t}"->>'${i}'`},T=e=>{let r={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};return e.map(t=>{let a=r[t.toLowerCase()];if(a===void 0)throw new Error(`Unknown day name: ${t}`);return a})};var S=(e,r)=>{let t=h(e.field);switch(e.operator){case "equals":return e.value===null?`${t} IS NULL`:`${t} = ${l(r,e.value)}`;case "notEquals":return e.value===null?`${t} IS NOT NULL`:`${t} <> ${l(r,e.value)}`;case "lessThan":return `${t} < ${l(r,e.value)}`;case "lessThanEquals":return `${t} <= ${l(r,e.value)}`;case "greaterThan":return `${t} > ${l(r,e.value)}`;case "greaterThanEquals":return `${t} >= ${l(r,e.value)}`;case "in":return !Array.isArray(e.value)||e.value.length===0?"FALSE":`${t} = ANY(${l(r,e.value)})`;case "notIn":return !Array.isArray(e.value)||e.value.length===0?"TRUE":`${t} <> ALL(${l(r,e.value)})`;case "contains":return `${t} LIKE ${l(r,`%${e.value}%`)}`;case "notContains":return `${t} NOT LIKE ${l(r,`%${e.value}%`)}`;case "startsWith":return `${t} LIKE ${l(r,`${e.value}%`)}`;case "endsWith":return `${t} LIKE ${l(r,`%${e.value}`)}`;case "matches":return `${t} ~ ${l(r,e.value)}`;case "notMatches":return `${t} !~ ${l(r,e.value)}`;case "between":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("between operator requires an array of two values");return `${t} BETWEEN ${l(r,e.value[0])} AND ${l(r,e.value[1])}`;case "notBetween":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("notBetween operator requires an array of two values");return `${t} NOT BETWEEN ${l(r,e.value[0])} AND ${l(r,e.value[1])}`;case "isEmpty":return `(${t} IS NULL OR ${t} = '')`;case "notEmpty":return `(${t} IS NOT NULL AND ${t} <> '')`;case "exists":return `${t} IS NOT NULL`;case "notExists":return `${t} IS NULL`;default:throw new Error(`Unknown operator: ${e.operator}`)}};var I=(e,r)=>{let t=h(e.field);switch(e.dateOperator){case "before":return `${t} < ${l(r,e.value)}`;case "after":return `${t} > ${l(r,e.value)}`;case "onOrBefore":return `${t} <= ${l(r,e.value)}`;case "onOrAfter":return `${t} >= ${l(r,e.value)}`;case "between":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("between date operator requires an array of two values");return `${t} BETWEEN ${l(r,e.value[0])} AND ${l(r,e.value[1])}`;case "notBetween":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("notBetween date operator requires an array of two values");return `${t} NOT BETWEEN ${l(r,e.value[0])} AND ${l(r,e.value[1])}`;case "dayIn":let a=T(e.value);return `EXTRACT(DOW FROM ${t}) = ANY(${l(r,a)})`;case "dayNotIn":let s=T(e.value);return `EXTRACT(DOW FROM ${t}) <> ALL(${l(r,s)})`;default:throw new Error(`Unknown date operator: ${e.dateOperator}`)}};var L=(e,r)=>{let t=h(e.field);switch(e.arrayOperator){case "empty":return `(${t} IS NULL OR jsonb_array_length(${t}) = 0)`;case "notEmpty":return `(${t} IS NOT NULL AND jsonb_array_length(${t}) > 0)`;case "all":case "any":case "none":case "atLeast":case "atMost":case "exactly":throw new Error(`Array operator '${e.arrayOperator}' with conditions is not supported in SQL. Use application-level filtering for complex array operations.`);default:throw new Error(`Unknown array operator: ${e.arrayOperator}`)}};var d,C=e=>{d=e;},D=(e,r)=>e.all.length===0?"TRUE":`(${e.all.map(a=>d(a,r)).join(" AND ")})`,O=(e,r)=>e.any.length===0?"FALSE":`(${e.any.map(a=>d(a,r)).join(" OR ")})`,U=(e,r)=>{let t=d(e.if,r),a=d(e.then,r),s=e.else?d(e.else,r):"TRUE";return e.else?`((NOT(${t}) OR ${a}) AND (${t} OR ${s}))`:`(NOT(${t}) OR ${a})`};var B=(e,r)=>{if(typeof e=="boolean")return e?"TRUE":"FALSE";if("all"in e)return D(e,r);if("any"in e)return O(e,r);if("if"in e)return U(e,r);if("arrayOperator"in e)return L(e);if("dateOperator"in e)return I(e,r);if("field"in e)return S(e,r);throw new Error("Unknown condition type")};C(B);var Ie=e=>{let r={params:[],paramIndex:0};return {sql:B(e,r),params:r.params}};exports.ArrayOperator=E;exports.DateOperator=g;exports.Operator=w;exports.check=c;exports.toSql=Ie;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var lodash=require('lodash'),m=require('dayjs'),F=require('dayjs/plugin/utc'),M=require('dayjs/plugin/timezone'),V=require('dayjs/plugin/isSameOrBefore'),P=require('dayjs/plugin/isSameOrAfter'),pg=require('pg');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var m__default=/*#__PURE__*/_interopDefault(m);var F__default=/*#__PURE__*/_interopDefault(F);var M__default=/*#__PURE__*/_interopDefault(M);var V__default=/*#__PURE__*/_interopDefault(V);var P__default=/*#__PURE__*/_interopDefault(P);var E=(f=>(f.equals="equals",f.notEquals="notEquals",f.lessThan="lessThan",f.lessThanEquals="lessThanEquals",f.greaterThan="greaterThan",f.greaterThanEquals="greaterThanEquals",f.contains="contains",f.notContains="notContains",f.in="in",f.notIn="notIn",f.matches="matches",f.notMatches="notMatches",f.between="between",f.notBetween="notBetween",f.isEmpty="isEmpty",f.notEmpty="notEmpty",f.exists="exists",f.notExists="notExists",f.startsWith="startsWith",f.endsWith="endsWith",f))(E||{}),b=(u=>(u.all="all",u.any="any",u.none="none",u.atLeast="atLeast",u.atMost="atMost",u.exactly="exactly",u.empty="empty",u.notEmpty="notEmpty",u))(b||{}),v=(u=>(u.before="before",u.after="after",u.onOrBefore="onOrBefore",u.onOrAfter="onOrAfter",u.between="between",u.notBetween="notBetween",u.dayIn="dayIn",u.dayNotIn="dayNotIn",u))(v||{});m__default.default.extend(F__default.default);m__default.default.extend(M__default.default);m__default.default.extend(V__default.default);m__default.default.extend(P__default.default);var q=(e,t,r)=>{let a=lodash.get(t,e.field);if(!a)throw new Error(`${e.field} is null or undefined`);let s=m__default.default(a);if(!s.isValid())throw new Error(`${e.field} is not a valid date: ${a}`);let i=p=>e.error||`${e.field} ${p}`,o=K(e,t,r,s,a),n=o[0],u=o[1];switch(e.dateOperator){case "before":return s.isBefore(n)||i(`must be before ${n.format()}`);case "after":return s.isAfter(n)||i(`must be after ${n.format()}`);case "onOrBefore":return s.isSameOrBefore(n)||i(`must be on or before ${n.format()}`);case "onOrAfter":return s.isSameOrAfter(n)||i(`must be on or after ${n.format()}`);case "between":return s.isSameOrAfter(n)&&s.isSameOrBefore(u)||i(`must be between ${n.format()} and ${u.format()}`);case "notBetween":return s.isBefore(n)||s.isAfter(u)||i(`must not be between ${n.format()} and ${u.format()}`);case "dayIn":if(!Array.isArray(e.value))throw new Error("dayIn operator requires an array of day names");let p=s.format("dddd").toLowerCase(),y=e.value.map(g=>g.toLowerCase());return y.includes(p)||i(`must be on ${y.join(" or ")}`);case "dayNotIn":if(!Array.isArray(e.value))throw new Error("dayNotIn operator requires an array of day names");let W=s.format("dddd").toLowerCase(),B=e.value.map(g=>g.toLowerCase());return !B.includes(W)||i(`must not be on ${B.join(" or ")}`);default:throw new Error("Unknown date operator")}},K=(e,t,r,a,s)=>{if(["between","notBetween"].includes(e.dateOperator)){if(!Array.isArray(e.value)||e.value.length!==2)throw new Error(`${e.dateOperator} operator requires an array of two dates`);let n=A(e.value[0],s),u=A(e.value[1],s);if(!n.isValid())throw new Error(`Invalid start date: ${e.value[0]}`);if(!u.isValid())throw new Error(`Invalid end date: ${e.value[1]}`);return [n,u]}if(["before","after","onOrBefore","onOrAfter"].includes(e.dateOperator)){let n;if(e.value!==void 0)n=e.value;else if(e.path)e.path.startsWith("$.")?n=lodash.get(t,e.path.substring(2)):n=lodash.get(r,e.path);else throw new Error("No value or path specified for date comparison");let u=A(n,s);if(!u.isValid())throw new Error(`Invalid comparison date: ${n}`);return [u,void 0]}return [m__default.default(),void 0]},A=(e,t)=>{let r=String(e);if(r.includes("Z")||r.includes("T")&&(r.includes("+")||r.match(/T.*-\d{2}:/)))return m__default.default(e);let s=String(t),i=0;if(s.includes("+")||s.includes("T")&&s.match(/T.*-\d{2}:/)){let n=s.match(/([+-])(\d{2}):(\d{2})/);n&&(i=(n[1]==="+"?1:-1)*(parseInt(n[2])*60+parseInt(n[3])));}else s.includes("Z")||(i=0);return r.match(/^\d{4}-\d{2}-\d{2}$/)?m__default.default(e+"T00:00:00").subtract(i,"minute"):m__default.default(e).subtract(i,"minute")};var R=(e,t,r)=>{let a=lodash.get(t,e.field),i=!["isEmpty","notEmpty","exists","notExists"].includes(e.operator),o=i?_(e,t,r):void 0,n=u=>e.error||`${e.field} ${u}${i?" "+JSON.stringify(o):""}`;switch(e.operator){case "equals":return a===o||n("must equal");case "notEquals":return a!==o||n("must not equal");case "lessThan":return a<o||n("must be less than");case "lessThanEquals":return a<=o||n("must be less than or equal to");case "greaterThan":return a>o||n("must be greater than");case "greaterThanEquals":return a>=o||n("must be greater than or equal to");case "in":return o?.includes(a)||n("must be one of");case "notIn":return !o?.includes(a)||n("must not be one of");case "contains":return a?.includes(o)||n("must contain");case "notContains":return !a?.includes(o)||n("must not contain");case "matches":return !!a?.match(o)||n("must match pattern");case "notMatches":return !a?.match(o)||n("must not match pattern");case "between":if(!Array.isArray(o)||o.length!==2)throw new Error("between operator requires an array of two values");return a>=o[0]&&a<=o[1]||n("must be between");case "notBetween":if(!Array.isArray(o)||o.length!==2)throw new Error("notBetween operator requires an array of two values");return a<o[0]||a>o[1]||n("must not be between");case "isEmpty":return lodash.isEmpty(a)||n("must be empty");case "notEmpty":return !lodash.isEmpty(a)||n("must not be empty");case "exists":return a!==void 0||n("must exist");case "notExists":return a===void 0||n("must not exist");case "startsWith":return a?.startsWith?.(o)||n("must start with");case "endsWith":return a?.endsWith?.(o)||n("must end with");default:throw new Error("Unknown operator")}},_=(e,t,r)=>{if(e.value!==void 0)return e.value;if(e.path)return e.path.startsWith("$.")?lodash.get(t,e.path.substring(2)):lodash.get(r,e.path);throw new Error("No value or path specified")};var c=(e,t,r=t)=>typeof e=="boolean"?e:"all"in e?Y(e.all,t,r,e.error):"any"in e?Z(e.any,t,r,e.error):"arrayOperator"in e?G(e,t,r):"dateOperator"in e?q(e,t,r):"field"in e?R(e,t,r):"if"in e?Q(e,t,r):false,Y=(e,t,r,a)=>{let s=[];for(let i of e){let o=c(i,t,r);o!==true&&(typeof o=="string"?s.push(o):s.push("false"));}return s.length?a||(s.length===1?s[0]:`All conditions must pass: ${s.join(" AND ")}`):true},Z=(e,t,r,a)=>{let s=[];for(let i of e){let o=c(i,t,r);if(typeof o!="string")return true;s.push(o);}return a||(s.length===1?s[0]:`At least one condition must pass: ${s.join(" OR ")}`)},Q=(e,t,r)=>c(e.if,t,r)===true?c(e.then,t,r):e.else?c(e.else,t,r):true,G=(e,t,r)=>{let a=lodash.get(r,e.field);if(!Array.isArray(a))throw new Error(`${e.field} must be an array`);let s=p=>e.error||`${e.field} ${p}`,i=["all","any","none","atLeast","atMost","exactly"],o=["atLeast","atMost","exactly"];if(i.includes(e.arrayOperator)&&!e.condition)throw new Error(`${e.arrayOperator} requires a condition to check against array elements`);if(o.includes(e.arrayOperator)&&e.count===void 0)throw new Error(`${e.arrayOperator} requires a count`);let n=0,u=0;if(i.includes(e.arrayOperator)){if(!lodash.some(a,lodash.isObject))throw new Error(`${e.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`);let p=a.map(y=>c(e.condition,y,r));n=p.filter(y=>y===true).length,u=p.filter(y=>typeof y=="string").length;}switch(e.arrayOperator){case "empty":return !a.length||s("must be empty");case "notEmpty":return !!a.length||s("must not be empty");case "all":return n===a.length||s(`all elements must match (${u} failed)`);case "any":return !!n||s("at least one element must match");case "none":return !n||s(`no elements should match (${n} matched)`);case "atLeast":return n>=e.count||s(`at least ${e.count} elements must match (${n} matched)`);case "atMost":return n<=e.count||s(`at most ${e.count} elements must match (${n} matched)`);case "exactly":return n===e.count||s(`exactly ${e.count} elements must match (${n} matched)`);default:throw new Error("Unknown array operator")}};var l=(e,t)=>(e.params.push(t),`$${++e.paramIndex}`),$=e=>e.replace(/\\/g,"\\\\").replace(/%/g,"\\%").replace(/_/g,"\\_"),h=e=>{let t=e.split(".");if(t.length===1)return pg.escapeIdentifier(e);let[r,...a]=t;if(a.length===0)return pg.escapeIdentifier(r);let s=n=>`'${n.replace(/'/g,"''")}'`,i=a.slice(0,-1).map(s).join("->"),o=s(a[a.length-1]);return i?`${pg.escapeIdentifier(r)}->${i}->>${o}`:`${pg.escapeIdentifier(r)}->>${o}`},N=e=>{let t={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};return e.map(r=>{let a=t[r.toLowerCase()];if(a===void 0)throw new Error(`Unknown day name: ${r}`);return a})};var I=(e,t)=>{let r=h(e.field);switch(e.operator){case "equals":return e.value===null?`${r} IS NULL`:`${r} = ${l(t,e.value)}`;case "notEquals":return e.value===null?`${r} IS NOT NULL`:`${r} <> ${l(t,e.value)}`;case "lessThan":return `${r} < ${l(t,e.value)}`;case "lessThanEquals":return `${r} <= ${l(t,e.value)}`;case "greaterThan":return `${r} > ${l(t,e.value)}`;case "greaterThanEquals":return `${r} >= ${l(t,e.value)}`;case "in":return !Array.isArray(e.value)||e.value.length===0?"FALSE":`${r} = ANY(${l(t,e.value)})`;case "notIn":return !Array.isArray(e.value)||e.value.length===0?"TRUE":`${r} <> ALL(${l(t,e.value)})`;case "contains":return `${r} LIKE ${l(t,`%${$(String(e.value))}%`)}`;case "notContains":return `${r} NOT LIKE ${l(t,`%${$(String(e.value))}%`)}`;case "startsWith":return `${r} LIKE ${l(t,`${$(String(e.value))}%`)}`;case "endsWith":return `${r} LIKE ${l(t,`%${$(String(e.value))}`)}`;case "matches":return `${r} ~ ${l(t,e.value)}`;case "notMatches":return `${r} !~ ${l(t,e.value)}`;case "between":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("between operator requires an array of two values");return `${r} BETWEEN ${l(t,e.value[0])} AND ${l(t,e.value[1])}`;case "notBetween":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("notBetween operator requires an array of two values");return `${r} NOT BETWEEN ${l(t,e.value[0])} AND ${l(t,e.value[1])}`;case "isEmpty":return `(${r} IS NULL OR ${r} = '')`;case "notEmpty":return `(${r} IS NOT NULL AND ${r} <> '')`;case "exists":return `${r} IS NOT NULL`;case "notExists":return `${r} IS NULL`;default:throw new Error(`Unknown operator: ${e.operator}`)}};var D=(e,t)=>{let r=h(e.field);switch(e.dateOperator){case "before":return `${r} < ${l(t,e.value)}`;case "after":return `${r} > ${l(t,e.value)}`;case "onOrBefore":return `${r} <= ${l(t,e.value)}`;case "onOrAfter":return `${r} >= ${l(t,e.value)}`;case "between":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("between date operator requires an array of two values");return `${r} BETWEEN ${l(t,e.value[0])} AND ${l(t,e.value[1])}`;case "notBetween":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("notBetween date operator requires an array of two values");return `${r} NOT BETWEEN ${l(t,e.value[0])} AND ${l(t,e.value[1])}`;case "dayIn":{let a=N(e.value);return `EXTRACT(DOW FROM ${r}) = ANY(${l(t,a)})`}case "dayNotIn":{let a=N(e.value);return `EXTRACT(DOW FROM ${r}) <> ALL(${l(t,a)})`}default:throw new Error(`Unknown date operator: ${e.dateOperator}`)}};var C=(e,t)=>{let r=h(e.field),a=e.arrayType==="native",s=a?`array_length(${r}, 1)`:`jsonb_array_length(${r})`;switch(e.arrayOperator){case "empty":return a?`(${r} IS NULL OR ${s} IS NULL)`:`(${r} IS NULL OR ${s} = 0)`;case "notEmpty":return a?`(${r} IS NOT NULL AND ${s} IS NOT NULL)`:`(${r} IS NOT NULL AND ${s} > 0)`;case "all":case "any":case "none":case "atLeast":case "atMost":case "exactly":throw new Error(`Array operator '${e.arrayOperator}' with conditions is not supported in SQL. Use application-level filtering for complex array operations.`);default:throw new Error(`Unknown array operator: ${e.arrayOperator}`)}};var d,O=e=>{d=e;},U=(e,t)=>e.all.length===0?"TRUE":`(${e.all.map(a=>d(a,t)).join(" AND ")})`,j=(e,t)=>e.any.length===0?"FALSE":`(${e.any.map(a=>d(a,t)).join(" OR ")})`,k=(e,t)=>{let r=d(e.if,t),a=d(e.then,t),s=e.else?d(e.else,t):"TRUE";return e.else?`((NOT(${r}) OR ${a}) AND (${r} OR ${s}))`:`(NOT(${r}) OR ${a})`};var L=(e,t)=>{if(typeof e=="boolean")return e?"TRUE":"FALSE";if("all"in e)return U(e,t);if("any"in e)return j(e,t);if("if"in e)return k(e,t);if("arrayOperator"in e)return C(e);if("dateOperator"in e)return D(e,t);if("field"in e)return I(e,t);throw new Error("Unknown condition type")};O(L);var Ce=e=>{let t={params:[],paramIndex:0};return {sql:L(e,t),params:t.params}};exports.ArrayOperator=b;exports.DateOperator=v;exports.Operator=E;exports.check=c;exports.toSql=Ce;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/operator.ts","../src/date.ts","../src/field.ts","../src/check.ts","../src/toSql/utils.ts","../src/toSql/field.ts","../src/toSql/date.ts","../src/toSql/array.ts","../src/toSql/logical.ts","../src/toSql/condition.ts","../src/toSql/index.ts"],"names":["Operator","ArrayOperator","DateOperator","dayjs","utc","timezone","isSameOrBefore","isSameOrAfter","checkDate","condition","data","context","fieldValue","get","fieldDate","getError","op","dates","parseCompareDates","compareDate","endDate","dayName","allowedDays","d","day","excludedDays","startDate","parseDateWithTimezone","value","date","valueStr","fieldStr","offset","match","checkField","needsValue","getValue","isEmpty","check","conditions","all","any","checkArray","checkIfThenElse","error","errors","result","arrayValue","defaultMsg","requiresCondition","requiresCount","matches","failures","some","isObject","results","item","r","nextParam","state","quoteField","field","parts","column","jsonPath","pathParts","p","leaf","mapDayNames","days","dayMap","num","buildFieldRule","rule","buildDateRule","daysIn","daysNotIn","buildArrayRule","buildCondition","setConditionBuilder","fn","buildAll","c","buildAny","buildIfThenElse","cond","ifClause","thenClause","elseClause","toSql"],"mappings":"2fAAO,IAAKA,CAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,MAAA,CAAS,QAAA,CACTA,EAAA,SAAA,CAAY,WAAA,CACZA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,CAAAA,CAAA,cAAA,CAAiB,gBAAA,CACjBA,EAAA,WAAA,CAAc,aAAA,CACdA,CAAAA,CAAA,iBAAA,CAAoB,mBAAA,CACpBA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,EAAA,WAAA,CAAc,aAAA,CACdA,CAAAA,CAAA,EAAA,CAAK,IAAA,CACLA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,EAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,UAAA,CAAa,YAAA,CACbA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,EAAA,UAAA,CAAa,YAAA,CACbA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,EAAA,MAAA,CAAS,QAAA,CACTA,CAAAA,CAAA,SAAA,CAAY,WAAA,CACZA,CAAAA,CAAA,UAAA,CAAa,YAAA,CACbA,EAAA,QAAA,CAAW,UAAA,CApBDA,CAAAA,CAAAA,EAAAA,CAAAA,EAAA,EAAA,CAAA,CAuBAC,CAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,GAAA,CAAM,KAAA,CACNA,EAAA,GAAA,CAAM,KAAA,CACNA,CAAAA,CAAA,IAAA,CAAO,MAAA,CACPA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,EAAA,MAAA,CAAS,QAAA,CACTA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,EAAA,QAAA,CAAW,UAAA,CARDA,CAAAA,CAAAA,EAAAA,CAAAA,EAAA,EAAA,CAAA,CAWAC,CAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,MAAA,CAAS,QAAA,CACTA,EAAA,KAAA,CAAQ,OAAA,CACRA,CAAAA,CAAA,UAAA,CAAa,YAAA,CACbA,CAAAA,CAAA,SAAA,CAAY,WAAA,CACZA,EAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,UAAA,CAAa,YAAA,CACbA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,EAAA,QAAA,CAAW,UAAA,CARDA,CAAAA,CAAAA,EAAAA,CAAAA,EAAA,EAAA,ECzBZC,kBAAAA,CAAM,MAAA,CAAOC,kBAAG,CAAA,CAChBD,mBAAM,MAAA,CAAOE,kBAAQ,CAAA,CACrBF,kBAAAA,CAAM,MAAA,CAAOG,kBAAc,CAAA,CAC3BH,kBAAAA,CAAM,OAAOI,kBAAa,CAAA,CAEnB,IAAMC,CAAAA,CAAY,CAACC,CAAAA,CAAqBC,CAAAA,CAAWC,CAAAA,GAAmC,CAC3F,IAAMC,CAAAA,CAAaC,UAAAA,CAAIH,CAAAA,CAAMD,CAAAA,CAAU,KAAK,CAAA,CAE5C,GAAI,CAACG,CAAAA,CAAY,MAAM,IAAI,KAAA,CAAM,CAAA,EAAGH,CAAAA,CAAU,KAAK,CAAA,qBAAA,CAAuB,EAE1E,IAAMK,CAAAA,CAAYX,kBAAAA,CAAMS,CAAU,CAAA,CAElC,GAAI,CAACE,CAAAA,CAAU,SAAQ,CAAG,MAAM,IAAI,KAAA,CAAM,CAAA,EAAGL,CAAAA,CAAU,KAAK,CAAA,sBAAA,EAAyBG,CAAU,CAAA,CAAE,CAAA,CAEjG,IAAMG,CAAAA,CAAYC,CAAAA,EAAeP,CAAAA,CAAU,KAAA,EAAS,CAAA,EAAGA,EAAU,KAAK,CAAA,CAAA,EAAIO,CAAE,CAAA,CAAA,CAGtEC,CAAAA,CAAQC,CAAAA,CAAkBT,CAAAA,CAAWC,CAAAA,CAAMC,EAASG,CAAAA,CAAWF,CAAU,CAAA,CACzEO,CAAAA,CAAcF,CAAAA,CAAM,CAAC,CAAA,CACrBG,CAAAA,CAAUH,EAAM,CAAC,CAAA,CAEvB,OAAQR,CAAAA,CAAU,YAAA,EAChB,KAAA,QAAA,CACE,OAAOK,EAAU,QAAA,CAASK,CAAW,CAAA,EAAKJ,CAAAA,CAAS,CAAA,eAAA,EAAkBI,CAAAA,CAAY,MAAA,EAAQ,EAAE,CAAA,CAE7F,KAAA,OAAA,CACE,OAAOL,CAAAA,CAAU,OAAA,CAAQK,CAAW,CAAA,EAAKJ,CAAAA,CAAS,iBAAiBI,CAAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,CAAA,CAE3F,KAAA,YAAA,CACE,OAAOL,CAAAA,CAAU,eAAeK,CAAW,CAAA,EAAKJ,CAAAA,CAAS,CAAA,qBAAA,EAAwBI,CAAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,EAEzG,KAAA,WAAA,CACE,OAAOL,CAAAA,CAAU,aAAA,CAAcK,CAAW,CAAA,EAAKJ,CAAAA,CAAS,CAAA,oBAAA,EAAuBI,EAAY,MAAA,EAAQ,CAAA,CAAE,CAAA,CAEvG,KAAA,SAAA,CACE,OAAQL,CAAAA,CAAU,aAAA,CAAcK,CAAW,CAAA,EAAKL,CAAAA,CAAU,cAAA,CAAeM,CAAQ,CAAA,EAC/EL,CAAAA,CAAS,CAAA,gBAAA,EAAmBI,CAAAA,CAAY,QAAQ,CAAA,KAAA,EAAQC,CAAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,CAAA,CAE/E,KAAA,YAAA,CACE,OAAQN,CAAAA,CAAU,QAAA,CAASK,CAAW,CAAA,EAAKL,CAAAA,CAAU,OAAA,CAAQM,CAAQ,CAAA,EACnEL,EAAS,CAAA,oBAAA,EAAuBI,CAAAA,CAAY,MAAA,EAAQ,CAAA,KAAA,EAAQC,CAAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,CAEnF,KAAA,OAAA,CACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQX,CAAAA,CAAU,KAAK,EAAG,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CACpG,IAAMY,CAAAA,CAAUP,CAAAA,CAAU,OAAO,MAAM,CAAA,CAAE,WAAA,EAAY,CAC/CQ,CAAAA,CAAcb,CAAAA,CAAU,KAAA,CAAM,GAAA,CAAIc,GAAKA,CAAAA,CAAE,WAAA,EAAa,CAAA,CAC5D,OAAOD,CAAAA,CAAY,QAAA,CAASD,CAAO,GAAKN,CAAAA,CAAS,CAAA,WAAA,EAAcO,CAAAA,CAAY,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA,CAE3F,gBACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQb,CAAAA,CAAU,KAAK,CAAA,CAAG,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CACvG,IAAMe,CAAAA,CAAMV,CAAAA,CAAU,MAAA,CAAO,MAAM,EAAE,WAAA,EAAY,CAC3CW,CAAAA,CAAehB,CAAAA,CAAU,KAAA,CAAM,GAAA,CAAIc,CAAAA,EAAKA,CAAAA,CAAE,aAAa,CAAA,CAC7D,OAAO,CAACE,CAAAA,CAAa,QAAA,CAASD,CAAG,CAAA,EAAKT,EAAS,CAAA,eAAA,EAAkBU,CAAAA,CAAa,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA,CAE9F,QACE,MAAM,IAAI,KAAA,CAAM,uBAAuB,CAC3C,CACF,CAAA,CAEMP,CAAAA,CAAoB,CAACT,EAAqBC,CAAAA,CAAWC,CAAAA,CAAcG,CAAAA,CAAwBF,CAAAA,GAA+D,CAG9J,GAFyB,CAAA,SAAA,CAAA,YAA8C,CAAA,CAElD,SAASH,CAAAA,CAAU,YAAY,CAAA,CAAG,CACrD,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,EAAU,KAAK,CAAA,EAAKA,CAAAA,CAAU,KAAA,CAAM,MAAA,GAAW,CAAA,CAChE,MAAM,IAAI,MAAM,CAAA,EAAGA,CAAAA,CAAU,YAAY,CAAA,wCAAA,CAA0C,CAAA,CACrF,IAAMiB,CAAAA,CAAYC,CAAAA,CAAsBlB,EAAU,KAAA,CAAM,CAAC,CAAA,CAAGG,CAAU,CAAA,CAChEQ,CAAAA,CAAUO,CAAAA,CAAsBlB,CAAAA,CAAU,MAAM,CAAC,CAAA,CAAGG,CAAU,CAAA,CACpE,GAAI,CAACc,CAAAA,CAAU,OAAA,GAAW,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuBjB,CAAAA,CAAU,KAAA,CAAM,CAAC,CAAC,EAAE,CAAA,CACrF,GAAI,CAACW,CAAAA,CAAQ,OAAA,EAAQ,CAAG,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqBX,CAAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAA,CACjF,OAAO,CAACiB,CAAAA,CAAWN,CAAO,CAC5B,CASA,GAPwB,CAAA,QAAA,CAAA,OAAA,CAAA,YAAA,CAAA,WAKxB,CAAA,CAEoB,QAAA,CAASX,EAAU,YAAY,CAAA,CAAG,CACpD,IAAImB,CAAAA,CACJ,GAAInB,CAAAA,CAAU,KAAA,GAAU,OACtBmB,CAAAA,CAAQnB,CAAAA,CAAU,KAAA,CAAA,KAAA,GACTA,CAAAA,CAAU,IAAA,CAEfA,CAAAA,CAAU,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAChCmB,CAAAA,CAAQf,UAAAA,CAAIH,CAAAA,CAAMD,CAAAA,CAAU,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAE7CmB,CAAAA,CAAQf,UAAAA,CAAIF,CAAAA,CAASF,CAAAA,CAAU,IAAI,CAAA,CAAA,KAGrC,MAAM,IAAI,KAAA,CAAM,gDAAgD,CAAA,CAElE,IAAMoB,CAAAA,CAAOF,CAAAA,CAAsBC,CAAAA,CAAOhB,CAAU,EACpD,GAAI,CAACiB,CAAAA,CAAK,OAAA,EAAQ,CAAG,MAAM,IAAI,KAAA,CAAM,4BAA4BD,CAAK,CAAA,CAAE,CAAA,CACxE,OAAO,CAACC,CAAAA,CAAM,MAAS,CACzB,CAEA,OAAO,CAAC1B,kBAAAA,EAAM,CAAG,MAAS,CAC5B,CAAA,CAEMwB,CAAAA,CAAwB,CAACC,CAAAA,CAAYhB,CAAAA,GAAoC,CAC7E,IAAMkB,CAAAA,CAAW,MAAA,CAAOF,CAAK,CAAA,CAM7B,GAHoBE,CAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EACtCA,CAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAAMA,EAAS,QAAA,CAAS,GAAG,CAAA,EAAKA,CAAAA,CAAS,KAAA,CAAM,YAAY,CAAA,CAAA,CAElE,OAAO3B,mBAAMyB,CAAK,CAAA,CAInC,IAAMG,CAAAA,CAAW,MAAA,CAAOnB,CAAU,CAAA,CAC9BoB,CAAAA,CAAS,EAEb,GAAID,CAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAMA,CAAAA,CAAS,QAAA,CAAS,GAAG,GAAKA,CAAAA,CAAS,KAAA,CAAM,YAAY,CAAA,CAAI,CAEtF,IAAME,CAAAA,CAAQF,CAAAA,CAAS,MAAM,uBAAuB,CAAA,CAChDE,CAAAA,GAEFD,CAAAA,CAAAA,CADaC,CAAAA,CAAM,CAAC,CAAA,GAAM,GAAA,CAAM,EAAI,EAAA,GACnB,QAAA,CAASA,CAAAA,CAAM,CAAC,CAAC,CAAA,CAAI,EAAA,CAAK,QAAA,CAASA,EAAM,CAAC,CAAC,CAAA,CAAA,EAEhE,CAAA,KAAYF,CAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAE/BC,EAAS,CAAA,CAAA,CAKX,OAAIF,CAAAA,CAAS,KAAA,CAAM,qBAAqB,CAAA,CAEhB3B,kBAAAA,CAAMyB,CAAAA,CAAQ,WAAW,CAAA,CAC1B,QAAA,CAASI,CAAAA,CAAQ,QAAQ,CAAA,CAI9B7B,kBAAAA,CAAMyB,CAAK,CAAA,CACZ,SAASI,CAAAA,CAAQ,QAAQ,CAC5C,CAAA,CC/IO,IAAME,CAAAA,CAAa,CAACzB,CAAAA,CAAiBC,CAAAA,CAAWC,CAAAA,GAAmC,CAExF,IAAMC,CAAAA,CAAaC,UAAAA,CAAIH,CAAAA,CAAMD,CAAAA,CAAU,KAAK,CAAA,CAItC0B,CAAAA,CAAa,CADA,0CAAyE,CAAA,CAC7D,QAAA,CAAS1B,CAAAA,CAAU,QAAQ,CAAA,CACpDmB,CAAAA,CAAQO,CAAAA,CAAaC,CAAAA,CAAS3B,EAAWC,CAAAA,CAAMC,CAAO,CAAA,CAAI,MAAA,CAE1DI,CAAAA,CAAYC,CAAAA,EAAeP,CAAAA,CAAU,KAAA,EAAS,GAAGA,CAAAA,CAAU,KAAK,CAAA,CAAA,EAAIO,CAAE,CAAA,EAAGmB,CAAAA,CAAa,GAAA,CAAM,IAAA,CAAK,UAAUP,CAAK,CAAA,CAAI,EAAE,CAAA,CAAA,CAE5H,OAAQnB,CAAAA,CAAU,QAAA,EAChB,cACE,OAAOG,CAAAA,GAAegB,CAAAA,EAASb,CAAAA,CAAS,YAAY,CAAA,CACtD,KAAA,WAAA,CACE,OAAOH,IAAegB,CAAAA,EAASb,CAAAA,CAAS,gBAAgB,CAAA,CAC1D,KAAA,UAAA,CACE,OAAOH,CAAAA,CAAagB,CAAAA,EAASb,EAAS,mBAAmB,CAAA,CAC3D,KAAA,gBAAA,CACE,OAAOH,CAAAA,EAAcgB,CAAAA,EAASb,CAAAA,CAAS,+BAA+B,EACxE,KAAA,aAAA,CACE,OAAOH,CAAAA,CAAagB,CAAAA,EAASb,CAAAA,CAAS,sBAAsB,CAAA,CAC9D,KAAA,mBAAA,CACE,OAAOH,CAAAA,EAAcgB,CAAAA,EAASb,CAAAA,CAAS,kCAAkC,CAAA,CAC3E,KAAA,IAAA,CACE,OAAOa,CAAAA,EAAO,SAAShB,CAAU,CAAA,EAAKG,CAAAA,CAAS,gBAAgB,CAAA,CACjE,KAAA,OAAA,CACE,OAAO,CAACa,GAAO,QAAA,CAAShB,CAAU,CAAA,EAAKG,CAAAA,CAAS,oBAAoB,CAAA,CACtE,KAAA,UAAA,CACE,OAAOH,GAAY,QAAA,CAASgB,CAAK,CAAA,EAAKb,CAAAA,CAAS,cAAc,CAAA,CAC/D,KAAA,aAAA,CACE,OAAO,CAACH,CAAAA,EAAY,QAAA,CAASgB,CAAK,CAAA,EAAKb,CAAAA,CAAS,kBAAkB,CAAA,CACpE,KAAA,SAAA,CACE,OAAO,CAAC,CAACH,CAAAA,EAAY,KAAA,CAAMgB,CAAK,CAAA,EAAKb,CAAAA,CAAS,oBAAoB,EACpE,KAAA,YAAA,CACE,OAAO,CAACH,CAAAA,EAAY,KAAA,CAAMgB,CAAK,CAAA,EAAKb,CAAAA,CAAS,wBAAwB,CAAA,CACvE,KAAA,SAAA,CACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQa,CAAK,CAAA,EAAKA,EAAM,MAAA,GAAW,CAAA,CAC5C,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CACpE,OAAQhB,GAAcgB,CAAAA,CAAM,CAAC,CAAA,EAAKhB,CAAAA,EAAcgB,CAAAA,CAAM,CAAC,CAAA,EAAMb,CAAAA,CAAS,iBAAiB,CAAA,CACzF,KAAA,YAAA,CACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQa,CAAK,CAAA,EAAKA,EAAM,MAAA,GAAW,CAAA,CAC5C,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CACvE,OAAQhB,EAAagB,CAAAA,CAAM,CAAC,CAAA,EAAKhB,CAAAA,CAAagB,CAAAA,CAAM,CAAC,CAAA,EAAMb,CAAAA,CAAS,qBAAqB,CAAA,CAC3F,KAAA,SAAA,CACE,OAAOsB,cAAAA,CAAQzB,CAAU,CAAA,EAAKG,CAAAA,CAAS,eAAe,EACxD,KAAA,UAAA,CACE,OAAO,CAACsB,cAAAA,CAAQzB,CAAU,CAAA,EAAKG,CAAAA,CAAS,mBAAmB,EAC7D,KAAA,QAAA,CACE,OAAOH,CAAAA,GAAe,MAAA,EAAaG,CAAAA,CAAS,YAAY,CAAA,CAC1D,KAAA,WAAA,CACE,OAAOH,CAAAA,GAAe,MAAA,EAAaG,CAAAA,CAAS,gBAAgB,CAAA,CAC9D,KAAA,YAAA,CACE,OAAOH,CAAAA,EAAY,aAAagB,CAAK,CAAA,EAAKb,CAAAA,CAAS,iBAAiB,CAAA,CACtE,KAAA,UAAA,CACE,OAAOH,CAAAA,EAAY,WAAWgB,CAAK,CAAA,EAAKb,CAAAA,CAAS,eAAe,CAAA,CAClE,QACE,MAAM,IAAI,MAAM,kBAAkB,CACtC,CACF,CAAA,CAEMqB,CAAAA,CAAW,CAAC3B,CAAAA,CAAiBC,CAAAA,CAAWC,IAAsB,CAClE,GAAIF,CAAAA,CAAU,KAAA,GAAU,MAAA,CAAW,OAAOA,CAAAA,CAAU,KAAA,CACpD,GAAIA,CAAAA,CAAU,IAAA,CAEZ,OAAIA,CAAAA,CAAU,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CACzBI,WAAIH,CAAAA,CAAMD,CAAAA,CAAU,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAGvCI,UAAAA,CAAIF,EAASF,CAAAA,CAAU,IAAI,CAAA,CAEpC,MAAM,IAAI,KAAA,CAAM,4BAA4B,CAC9C,ECtEO,IAAM6B,CAAAA,CAAQ,CAACC,CAAAA,CAAuB7B,CAAAA,CAAWC,CAAAA,CAAeD,CAAAA,GACjE,OAAO6B,GAAe,SAAA,CAAkBA,CAAAA,CACxC,KAAA,GAASA,CAAAA,CAAmBC,CAAAA,CAAID,CAAAA,CAAW,GAAA,CAAK7B,CAAAA,CAAMC,EAAS4B,CAAAA,CAAW,KAAK,CAAA,CAC/E,KAAA,GAASA,CAAAA,CAAmBE,CAAAA,CAAIF,CAAAA,CAAW,GAAA,CAAK7B,EAAMC,CAAAA,CAAS4B,CAAAA,CAAW,KAAK,CAAA,CAC/E,eAAA,GAAmBA,CAAAA,CAAmBG,CAAAA,CAAWH,CAAAA,CAAY7B,EAAMC,CAAO,CAAA,CAC1E,cAAA,GAAkB4B,CAAAA,CAAmB/B,CAAAA,CAAU+B,CAAAA,CAAY7B,CAAAA,CAAMC,CAAO,EACxE,OAAA,GAAW4B,CAAAA,CAAmBL,CAAAA,CAAWK,CAAAA,CAAY7B,CAAAA,CAAMC,CAAO,CAAA,CAClE,IAAA,GAAQ4B,EAAmBI,CAAAA,CAAgBJ,CAAAA,CAAY7B,CAAAA,CAAMC,CAAO,CAAA,CAEjE,KAAA,CAGH6B,CAAAA,CAAM,CAACD,EAAyB7B,CAAAA,CAAWC,CAAAA,CAAciC,CAAAA,GAAqC,CAClG,IAAMC,CAAAA,CAAmB,EAAC,CAE1B,QAAWpC,CAAAA,IAAa8B,CAAAA,CAAY,CAClC,IAAMO,CAAAA,CAASR,CAAAA,CAAM7B,CAAAA,CAAWC,CAAAA,CAAMC,CAAO,CAAA,CACzCmC,CAAAA,GAAW,IAAA,GAET,OAAOA,CAAAA,EAAW,QAAA,CACpBD,CAAAA,CAAO,IAAA,CAAKC,CAAM,CAAA,CAGlBD,CAAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAGzB,CAEA,OAAKA,CAAAA,CAAO,OACRD,CAAAA,GACAC,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAUA,CAAAA,CAAO,CAAC,CAAA,CACjC,CAAA,0BAAA,EAA6BA,EAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAA,CAH7B,IAI7B,CAAA,CAEMJ,CAAAA,CAAM,CAACF,EAAyB7B,CAAAA,CAAWC,CAAAA,CAAciC,CAAAA,GAAqC,CAClG,IAAMC,CAAAA,CAAmB,EAAC,CAE1B,QAAWpC,CAAAA,IAAa8B,CAAAA,CAAY,CAClC,IAAMO,CAAAA,CAASR,CAAAA,CAAM7B,CAAAA,CAAWC,CAAAA,CAAMC,CAAO,CAAA,CAC7C,GAAI,OAAOmC,CAAAA,EAAW,QAAA,CAAU,OAAO,KAAA,CACvCD,CAAAA,CAAO,KAAKC,CAAM,EACpB,CAEA,OAAIF,CAAAA,GACAC,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAUA,EAAO,CAAC,CAAA,CACjC,CAAA,kCAAA,EAAqCA,CAAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CACjE,EAEMF,CAAAA,CAAkB,CAAClC,CAAAA,CAAgBC,CAAAA,CAAWC,CAAAA,GACjC2B,CAAAA,CAAM7B,CAAAA,CAAU,EAAA,CAAIC,EAAMC,CAAO,CAAA,GAEjC,IAAA,CAAa2B,CAAAA,CAAM7B,CAAAA,CAAU,IAAA,CAAMC,CAAAA,CAAMC,CAAO,EAC1DF,CAAAA,CAAU,IAAA,CAAO6B,CAAAA,CAAM7B,CAAAA,CAAU,IAAA,CAAMC,CAAAA,CAAMC,CAAO,CAAA,CAAI,KAG3D+B,CAAAA,CAAa,CAACjC,CAAAA,CAAsBC,CAAAA,CAAWC,CAAAA,GAAmC,CACtF,IAAMoC,CAAAA,CAAalC,WAAIF,CAAAA,CAASF,CAAAA,CAAU,KAAK,CAAA,CAE/C,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQsC,CAAU,CAAA,CAAG,MAAM,IAAI,KAAA,CAAM,CAAA,EAAGtC,CAAAA,CAAU,KAAK,CAAA,iBAAA,CAAmB,EAErF,IAAMM,CAAAA,CAAYiC,CAAAA,EAAuBvC,CAAAA,CAAU,KAAA,EAAS,CAAA,EAAGA,CAAAA,CAAU,KAAK,IAAIuC,CAAU,CAAA,CAAA,CAGtFC,CAAAA,CAAoB,CAAA,KAAA,CAAA,KAAA,CAAA,MAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAO1B,CAAA,CAGMC,CAAAA,CAAgB,CAAA,SAAA,CAAA,QAAA,CAAA,SAItB,CAAA,CAEA,GAAID,CAAAA,CAAkB,QAAA,CAASxC,CAAAA,CAAU,aAAa,CAAA,EAAK,CAACA,CAAAA,CAAU,SAAA,CACpE,MAAM,IAAI,KAAA,CAAM,CAAA,EAAGA,CAAAA,CAAU,aAAa,CAAA,qDAAA,CAAuD,CAAA,CAEnG,GAAIyC,EAAc,QAAA,CAASzC,CAAAA,CAAU,aAAa,CAAA,EAAKA,CAAAA,CAAU,KAAA,GAAU,MAAA,CACzE,MAAM,IAAI,KAAA,CAAM,CAAA,EAAGA,CAAAA,CAAU,aAAa,CAAA,iBAAA,CAAmB,CAAA,CAG/D,IAAI0C,CAAAA,CAAU,EACVC,CAAAA,CAAW,CAAA,CAEf,GAAIH,CAAAA,CAAkB,QAAA,CAASxC,CAAAA,CAAU,aAAa,CAAA,CAAG,CAEvD,GAAI,CAAC4C,WAAAA,CAAKN,CAAAA,CAAYO,eAAQ,CAAA,CAC5B,MAAM,IAAI,MAAM,CAAA,EAAG7C,CAAAA,CAAU,KAAK,CAAA,iHAAA,CAAmH,CAAA,CAGvJ,IAAM8C,CAAAA,CAAUR,CAAAA,CAAW,IAAIS,CAAAA,EAAQlB,CAAAA,CAAM7B,CAAAA,CAAU,SAAA,CAAY+C,CAAAA,CAAM7C,CAAO,CAAC,CAAA,CACjFwC,EAAUI,CAAAA,CAAQ,MAAA,CAAOE,CAAAA,EAAKA,CAAAA,GAAM,IAAI,CAAA,CAAE,MAAA,CAC1CL,CAAAA,CAAWG,EAAQ,MAAA,CAAOE,CAAAA,EAAK,OAAOA,CAAAA,EAAM,QAAQ,CAAA,CAAE,OACxD,CAEA,OAAQhD,CAAAA,CAAU,aAAA,EAChB,KAAA,OAAA,CACE,OAAO,CAACsC,CAAAA,CAAW,MAAA,EAAUhC,EAAS,eAAe,CAAA,CAEvD,KAAA,UAAA,CACE,OAAO,CAAC,CAACgC,CAAAA,CAAW,MAAA,EAAUhC,EAAS,mBAAmB,CAAA,CAE5D,KAAA,KAAA,CACE,OAAOoC,CAAAA,GAAYJ,CAAAA,CAAW,MAAA,EAAUhC,CAAAA,CAAS,4BAA4BqC,CAAQ,CAAA,QAAA,CAAU,CAAA,CAEjG,KAAA,KAAA,CACE,OAAO,CAAC,CAACD,CAAAA,EAAWpC,EAAS,iCAAiC,CAAA,CAEhE,KAAA,MAAA,CACE,OAAO,CAACoC,CAAAA,EAAWpC,CAAAA,CAAS,CAAA,0BAAA,EAA6BoC,CAAO,CAAA,SAAA,CAAW,CAAA,CAE7E,KAAA,SAAA,CACE,OAAOA,CAAAA,EAAW1C,CAAAA,CAAU,KAAA,EAAUM,CAAAA,CAAS,YAAYN,CAAAA,CAAU,KAAK,CAAA,sBAAA,EAAyB0C,CAAO,CAAA,SAAA,CAAW,CAAA,CAEvH,KAAA,QAAA,CACE,OAAOA,GAAW1C,CAAAA,CAAU,KAAA,EAAUM,CAAAA,CAAS,CAAA,QAAA,EAAWN,CAAAA,CAAU,KAAK,CAAA,sBAAA,EAAyB0C,CAAO,WAAW,CAAA,CAEtH,KAAA,SAAA,CACE,OAAOA,CAAAA,GAAY1C,CAAAA,CAAU,KAAA,EAAUM,CAAAA,CAAS,CAAA,QAAA,EAAWN,EAAU,KAAK,CAAA,sBAAA,EAAyB0C,CAAO,CAAA,SAAA,CAAW,CAAA,CAEvH,QACE,MAAM,IAAI,MAAM,wBAAwB,CAC5C,CACF,ECpIO,IAAMO,CAAAA,CAAY,CAACC,CAAAA,CAAqB/B,KAC7C+B,CAAAA,CAAM,MAAA,CAAO,IAAA,CAAK/B,CAAK,CAAA,CAChB,CAAA,CAAA,EAAI,EAAE+B,CAAAA,CAAM,UAAU,CAAA,CAAA,CAAA,CAGlBC,CAAAA,CAAcC,CAAAA,EAA0B,CAEnD,IAAMC,CAAAA,CAAQD,CAAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAC7B,GAAIC,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,OAAO,CAAA,CAAA,EAAID,CAAK,IAExC,GAAM,CAACE,CAAAA,CAAQ,GAAGC,CAAQ,CAAA,CAAIF,CAAAA,CAC9B,GAAIE,EAAS,MAAA,GAAW,CAAA,CAAG,OAAO,CAAA,CAAA,EAAID,CAAM,CAAA,CAAA,CAAA,CAG5C,IAAME,CAAAA,CAAYD,EAAS,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAE,GAAA,CAAKE,CAAAA,EAAM,CAAA,CAAA,EAAIA,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAChEC,CAAAA,CAAOH,CAAAA,CAASA,CAAAA,CAAS,MAAA,CAAS,CAAC,CAAA,CAEzC,OAAIC,CAAAA,CACK,CAAA,CAAA,EAAIF,CAAM,CAAA,GAAA,EAAME,CAAS,CAAA,IAAA,EAAOE,CAAI,CAAA,CAAA,CAAA,CAEtC,CAAA,CAAA,EAAIJ,CAAM,CAAA,KAAA,EAAQI,CAAI,CAAA,CAAA,CAC/B,CAAA,CAEaC,CAAAA,CAAeC,GAA6B,CACvD,IAAMC,CAAAA,CAAiC,CACrC,MAAA,CAAQ,CAAA,CAAG,MAAA,CAAQ,CAAA,CAAG,QAAS,CAAA,CAAG,SAAA,CAAW,CAAA,CAC7C,QAAA,CAAU,CAAA,CAAG,MAAA,CAAQ,CAAA,CAAG,QAAA,CAAU,CACpC,CAAA,CACA,OAAOD,CAAAA,CAAK,GAAA,CAAK9C,CAAAA,EAAM,CACrB,IAAMgD,CAAAA,CAAMD,EAAO/C,CAAAA,CAAE,WAAA,EAAa,CAAA,CAClC,GAAIgD,CAAAA,GAAQ,MAAA,CAAW,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqBhD,CAAC,CAAA,CAAE,CAAA,CAC/D,OAAOgD,CACT,CAAC,CACH,CAAA,CC9BO,IAAMC,CAAAA,CAAiB,CAACC,CAAAA,CAAYd,CAAAA,GAAgC,CACzE,IAAME,EAAQD,CAAAA,CAAWa,CAAAA,CAAK,KAAK,CAAA,CAEnC,OAAQA,CAAAA,CAAK,QAAA,EACX,cACE,OAAIA,CAAAA,CAAK,KAAA,GAAU,IAAA,CAAa,CAAA,EAAGZ,CAAK,CAAA,QAAA,CAAA,CACjC,CAAA,EAAGA,CAAK,CAAA,GAAA,EAAMH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEnD,KAAA,WAAA,CACE,OAAIA,CAAAA,CAAK,KAAA,GAAU,IAAA,CAAa,CAAA,EAAGZ,CAAK,CAAA,YAAA,CAAA,CACjC,CAAA,EAAGA,CAAK,OAAOH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,UAAA,CACE,OAAO,GAAGZ,CAAK,CAAA,GAAA,EAAMH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEnD,sBACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,IAAA,EAAOH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,aAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,GAAA,EAAMH,CAAAA,CAAUC,CAAAA,CAAOc,EAAK,KAAK,CAAC,CAAA,CAAA,CAEnD,KAAA,mBAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,IAAA,EAAOH,EAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,IAAA,CACE,OAAI,CAAC,MAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAM,MAAA,GAAW,CAAA,CAAU,QAC3D,CAAA,EAAGZ,CAAK,CAAA,OAAA,EAAUH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,IAEvD,KAAA,OAAA,CACE,OAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,EAAK,KAAA,CAAM,MAAA,GAAW,CAAA,CAAU,MAAA,CAC3D,CAAA,EAAGZ,CAAK,CAAA,QAAA,EAAWH,CAAAA,CAAUC,EAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA,CAExD,KAAA,UAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,SAASH,CAAAA,CAAUC,CAAAA,CAAO,CAAA,CAAA,EAAIc,CAAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAE7D,mBACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,UAAA,EAAaH,CAAAA,CAAUC,CAAAA,CAAO,CAAA,CAAA,EAAIc,CAAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAEjE,KAAA,YAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,MAAA,EAASH,EAAUC,CAAAA,CAAO,CAAA,EAAGc,CAAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAE5D,KAAA,UAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,MAAA,EAASH,CAAAA,CAAUC,CAAAA,CAAO,CAAA,CAAA,EAAIc,CAAAA,CAAK,KAAK,EAAE,CAAC,CAAA,CAAA,CAE5D,KAAA,SAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,GAAA,EAAMH,CAAAA,CAAUC,EAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEnD,KAAA,YAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,OAAOH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,SAAA,CACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAM,MAAA,GAAW,EACtD,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAEpE,OAAO,CAAA,EAAGZ,CAAK,YAAYH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,KAAA,EAAQf,EAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAEnG,KAAA,YAAA,CACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAM,SAAW,CAAA,CACtD,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CAEvE,OAAO,CAAA,EAAGZ,CAAK,CAAA,aAAA,EAAgBH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,QAAQf,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAEvG,eACE,OAAO,CAAA,CAAA,EAAIZ,CAAK,CAAA,YAAA,EAAeA,CAAK,CAAA,MAAA,CAAA,CAEtC,KAAA,UAAA,CACE,OAAO,IAAIA,CAAK,CAAA,iBAAA,EAAoBA,CAAK,CAAA,OAAA,CAAA,CAE3C,KAAA,QAAA,CACE,OAAO,CAAA,EAAGA,CAAK,eAEjB,KAAA,WAAA,CACE,OAAO,CAAA,EAAGA,CAAK,CAAA,QAAA,CAAA,CAEjB,QACE,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAsBY,CAAAA,CAAc,QAAQ,CAAA,CAAE,CAClE,CACF,CAAA,CC7EO,IAAMC,EAAgB,CAACD,CAAAA,CAAgBd,CAAAA,GAAgC,CAC5E,IAAME,CAAAA,CAAQD,CAAAA,CAAWa,CAAAA,CAAK,KAAK,CAAA,CAEnC,OAAQA,CAAAA,CAAK,YAAA,EACX,KAAA,QAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,GAAA,EAAMH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEnD,KAAA,OAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,GAAA,EAAMH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,GAEnD,KAAA,YAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,IAAA,EAAOH,CAAAA,CAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,WAAA,CACE,OAAO,CAAA,EAAGZ,CAAK,CAAA,IAAA,EAAOH,CAAAA,CAAUC,EAAOc,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,SAAA,CACE,GAAI,CAAC,KAAA,CAAM,QAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAM,MAAA,GAAW,CAAA,CACtD,MAAM,IAAI,KAAA,CAAM,uDAAuD,CAAA,CAEzE,OAAO,CAAA,EAAGZ,CAAK,CAAA,SAAA,EAAYH,CAAAA,CAAUC,EAAOc,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,KAAA,EAAQf,CAAAA,CAAUC,CAAAA,CAAOc,EAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAEnG,KAAA,YAAA,CACE,GAAI,CAAC,MAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAM,MAAA,GAAW,CAAA,CACtD,MAAM,IAAI,KAAA,CAAM,0DAA0D,CAAA,CAE5E,OAAO,CAAA,EAAGZ,CAAK,CAAA,aAAA,EAAgBH,EAAUC,CAAAA,CAAOc,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,KAAA,EAAQf,CAAAA,CAAUC,EAAOc,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAEvG,KAAA,OAAA,CACE,IAAME,EAASP,CAAAA,CAAYK,CAAAA,CAAK,KAAK,CAAA,CACrC,OAAO,CAAA,iBAAA,EAAoBZ,CAAK,CAAA,QAAA,EAAWH,EAAUC,CAAAA,CAAOgB,CAAM,CAAC,CAAA,CAAA,CAAA,CAErE,KAAA,UAAA,CACE,IAAMC,CAAAA,CAAYR,CAAAA,CAAYK,EAAK,KAAK,CAAA,CACxC,OAAO,CAAA,iBAAA,EAAoBZ,CAAK,CAAA,SAAA,EAAYH,CAAAA,CAAUC,CAAAA,CAAOiB,CAAS,CAAC,CAAA,CAAA,CAAA,CAEzE,QACE,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA2BH,CAAAA,CAAkB,YAAY,CAAA,CAAE,CAC/E,CACF,CAAA,CCvCO,IAAMI,CAAAA,CAAiB,CAACJ,CAAAA,CAAiBd,IAAgC,CAC9E,IAAME,CAAAA,CAAQD,CAAAA,CAAWa,CAAAA,CAAK,KAAK,CAAA,CAEnC,OAAQA,EAAK,aAAA,EACX,KAAA,OAAA,CACE,OAAO,CAAA,CAAA,EAAIZ,CAAK,CAAA,+BAAA,EAAkCA,CAAK,SAEzD,KAAA,UAAA,CACE,OAAO,CAAA,CAAA,EAAIA,CAAK,CAAA,oCAAA,EAAuCA,CAAK,CAAA,MAAA,CAAA,CAE9D,KAAA,KAAA,CACA,WACA,KAAA,MAAA,CACA,KAAA,SAAA,CACA,KAAA,QAAA,CACA,KAAA,SAAA,CACE,MAAM,IAAI,KAAA,CACR,CAAA,gBAAA,EAAmBY,EAAK,aAAa,CAAA,wGAAA,CAEvC,CAAA,CAEF,QACE,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA4BA,EAAmB,aAAa,CAAA,CAAE,CAClF,CACF,CAAA,CCxBA,IAAIK,CAAAA,CAESC,CAAAA,CAAuBC,GAAyB,CAC3DF,CAAAA,CAAiBE,EACnB,CAAA,CAEaC,CAAAA,CAAW,CAACzC,CAAAA,CAAUmB,CAAAA,GAC7BnB,EAAI,GAAA,CAAI,MAAA,GAAW,CAAA,CAAU,MAAA,CAE1B,CAAA,CAAA,EADSA,CAAAA,CAAI,GAAA,CAAI,GAAA,CAAK0C,GAAMJ,CAAAA,CAAeI,CAAAA,CAAGvB,CAAK,CAAC,CAAA,CACxC,IAAA,CAAK,OAAO,CAAC,IAGrBwB,CAAAA,CAAW,CAAC1C,CAAAA,CAAUkB,CAAAA,GAC7BlB,CAAAA,CAAI,GAAA,CAAI,MAAA,GAAW,CAAA,CAAU,QAE1B,CAAA,CAAA,EADSA,CAAAA,CAAI,GAAA,CAAI,GAAA,CAAKyC,CAAAA,EAAMJ,CAAAA,CAAeI,CAAAA,CAAGvB,CAAK,CAAC,CAAA,CACxC,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CAAA,CAGpByB,CAAAA,CAAkB,CAACC,CAAAA,CAAkB1B,IAAgC,CAChF,IAAM2B,CAAAA,CAAWR,CAAAA,CAAeO,CAAAA,CAAK,EAAA,CAAI1B,CAAK,CAAA,CACxC4B,EAAaT,CAAAA,CAAeO,CAAAA,CAAK,IAAA,CAAM1B,CAAK,CAAA,CAC5C6B,CAAAA,CAAaH,CAAAA,CAAK,IAAA,CAAOP,EAAeO,CAAAA,CAAK,IAAA,CAAM1B,CAAK,CAAA,CAAI,MAAA,CAIlE,OAAI0B,CAAAA,CAAK,IAAA,CACA,SAASC,CAAQ,CAAA,KAAA,EAAQC,CAAU,CAAA,OAAA,EAAUD,CAAQ,CAAA,IAAA,EAAOE,CAAU,CAAA,EAAA,CAAA,CAExE,QAAQF,CAAQ,CAAA,KAAA,EAAQC,CAAU,CAAA,CAAA,CAC3C,CAAA,CC3BO,IAAMT,CAAAA,CAAiB,CAACrE,EAAsBkD,CAAAA,GAAgC,CACnF,GAAI,OAAOlD,CAAAA,EAAc,SAAA,CACvB,OAAOA,CAAAA,CAAY,OAAS,OAAA,CAG9B,GAAI,KAAA,GAASA,CAAAA,CAAW,OAAOwE,CAAAA,CAASxE,CAAAA,CAAWkD,CAAK,EACxD,GAAI,KAAA,GAASlD,CAAAA,CAAW,OAAO0E,CAAAA,CAAS1E,CAAAA,CAAWkD,CAAK,CAAA,CACxD,GAAI,IAAA,GAAQlD,CAAAA,CAAW,OAAO2E,CAAAA,CAAgB3E,CAAAA,CAAWkD,CAAK,CAAA,CAC9D,GAAI,kBAAmBlD,CAAAA,CAAW,OAAOoE,CAAAA,CAAepE,CAAgB,CAAA,CACxE,GAAI,cAAA,GAAkBA,EAAW,OAAOiE,CAAAA,CAAcjE,CAAAA,CAAWkD,CAAK,CAAA,CACtE,GAAI,OAAA,GAAWlD,CAAAA,CAAW,OAAO+D,CAAAA,CAAe/D,CAAAA,CAAWkD,CAAK,CAAA,CAEhE,MAAM,IAAI,KAAA,CAAM,wBAAwB,CAC1C,CAAA,CAGAoB,CAAAA,CAAoBD,CAAc,CAAA,CCU3B,IAAMW,EAAAA,CAAShF,CAAAA,EAAoC,CACxD,IAAMkD,CAAAA,CAAsB,CAAE,MAAA,CAAQ,EAAC,CAAG,UAAA,CAAY,CAAE,CAAA,CAExD,OAAO,CAAE,GAAA,CADGmB,CAAAA,CAAerE,CAAAA,CAAWkD,CAAK,CAAA,CAC7B,MAAA,CAAQA,CAAAA,CAAM,MAAO,CACrC","file":"index.cjs","sourcesContent":["export enum 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}\n\nexport enum 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}\n\nexport enum DateOperator {\n before = 'before',\n after = 'after',\n onOrBefore = 'onOrBefore',\n onOrAfter = 'onOrAfter',\n between = 'between',\n notBetween = 'notBetween',\n dayIn = 'dayIn', // e.g., ['monday', 'tuesday', 'friday']\n dayNotIn = 'dayNotIn',\n}\n","import { get } from 'lodash';\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport type { DateRule } from './types';\nimport { DateOperator } from './operator';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(isSameOrBefore);\ndayjs.extend(isSameOrAfter);\n\nexport const checkDate = (condition: DateRule, data: any, context: any): boolean | string => {\n const fieldValue = get(data, condition.field);\n \n if (!fieldValue) throw new Error(`${condition.field} is null or undefined`);\n \n const fieldDate = dayjs(fieldValue);\n \n if (!fieldDate.isValid()) 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 fieldDate.isSameOrBefore(compareDate) || getError(`must be on or before ${compareDate.format()}`);\n \n case DateOperator.onOrAfter:\n return fieldDate.isSameOrAfter(compareDate) || getError(`must be on or after ${compareDate.format()}`);\n \n case DateOperator.between:\n return (fieldDate.isSameOrAfter(compareDate) && fieldDate.isSameOrBefore(endDate!)) || \n getError(`must be between ${compareDate.format()} and ${endDate!.format()}`);\n \n case DateOperator.notBetween:\n return (fieldDate.isBefore(compareDate) || fieldDate.isAfter(endDate!)) || \n getError(`must not be between ${compareDate.format()} and ${endDate!.format()}`);\n \n case DateOperator.dayIn:\n if (!Array.isArray(condition.value)) throw new Error('dayIn operator requires an array of day names');\n const dayName = fieldDate.format('dddd').toLowerCase();\n const allowedDays = condition.value.map(d => d.toLowerCase());\n return allowedDays.includes(dayName) || getError(`must be on ${allowedDays.join(' or ')}`);\n \n case DateOperator.dayNotIn:\n if (!Array.isArray(condition.value)) throw new Error('dayNotIn operator requires an array of day names');\n const day = fieldDate.format('dddd').toLowerCase();\n const excludedDays = condition.value.map(d => d.toLowerCase());\n return !excludedDays.includes(day) || getError(`must not be on ${excludedDays.join(' or ')}`);\n \n default:\n throw new Error('Unknown date operator');\n }\n}\n\nconst parseCompareDates = (condition: DateRule, data: any, context: any, fieldDate: dayjs.Dayjs, fieldValue: string): [dayjs.Dayjs, dayjs.Dayjs | undefined] => {\n const requiresTwoDates = [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 startDate = parseDateWithTimezone(condition.value[0], fieldValue);\n const endDate = parseDateWithTimezone(condition.value[1], fieldValue);\n if (!startDate.isValid()) throw new Error(`Invalid start date: ${condition.value[0]}`);\n if (!endDate.isValid()) throw new Error(`Invalid end date: ${condition.value[1]}`);\n return [startDate, endDate];\n }\n \n const requiresOneDate = [\n DateOperator.before,\n DateOperator.after,\n DateOperator.onOrBefore,\n DateOperator.onOrAfter\n ];\n \n if (requiresOneDate.includes(condition.dateOperator)) {\n let value;\n if (condition.value !== undefined) {\n value = condition.value;\n } else if (condition.path) {\n // Support $.path for current element\n if (condition.path.startsWith('$.')) {\n value = get(data, condition.path.substring(2));\n } else {\n value = get(context, condition.path);\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 = (value: any, fieldValue: string): dayjs.Dayjs => {\n const valueStr = String(value);\n \n // Check if value has explicit timezone information\n const hasTimezone = 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]) * 60 + parseInt(match[3]));\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}","import { get, isEmpty } from 'lodash';\nimport type { Rule } from './types';\nimport { Operator } from './operator';\n\nexport const checkField = (condition: Rule, data: any, context: any): boolean | string => {\n // Use data for field access (current element) but context remains available for path references\n const fieldValue = get(data, condition.field);\n \n // Operators that don't need a value\n const noValueOps = [Operator.isEmpty, Operator.notEmpty, Operator.exists, Operator.notExists];\n const needsValue = !noValueOps.includes(condition.operator);\n const value = needsValue ? getValue(condition, data, context) : undefined;\n \n const getError = (op: string) => 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 fieldValue < value || getError(`must be less than`);\n case Operator.lessThanEquals:\n return fieldValue <= value || getError(`must be less than or equal to`);\n case Operator.greaterThan:\n return fieldValue > value || getError(`must be greater than`);\n case Operator.greaterThanEquals:\n return fieldValue >= value || getError(`must be greater than or equal to`);\n case Operator.in:\n return value?.includes(fieldValue) || getError(`must be one of`);\n case Operator.notIn:\n return !value?.includes(fieldValue) || getError(`must not be one of`);\n case Operator.contains:\n return fieldValue?.includes(value) || getError(`must contain`);\n case Operator.notContains:\n return !fieldValue?.includes(value) || getError(`must not contain`);\n case Operator.matches:\n return !!fieldValue?.match(value) || getError(`must match pattern`);\n case Operator.notMatches:\n return !fieldValue?.match(value) || getError(`must not match pattern`);\n case Operator.between:\n if (!Array.isArray(value) || value.length !== 2) \n throw new Error('between operator requires an array of two values');\n return (fieldValue >= value[0] && fieldValue <= value[1]) || getError(`must be between`);\n case Operator.notBetween:\n if (!Array.isArray(value) || value.length !== 2) \n throw new Error('notBetween operator requires an array of two values');\n return (fieldValue < value[0] || fieldValue > value[1]) || getError(`must not be between`);\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 fieldValue?.startsWith?.(value) || getError(`must start with`);\n case Operator.endsWith:\n return fieldValue?.endsWith?.(value) || getError(`must end with`);\n default:\n throw new Error('Unknown operator');\n }\n};\n\nconst getValue = (condition: Rule, data: any, context: any): any => {\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};","import { get, some, isObject } from 'lodash';\nimport type { Condition, ArrayRule } from './types';\nimport { ArrayOperator } from './operator';\nimport { checkDate } from './date';\nimport { checkField } from './field';\n\nexport const check = (conditions: Condition, data: any, context: any = data): 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 = (conditions: Condition[], data: any, context: any, error?: string): 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 = (conditions: Condition[], data: any, context: any, error?: string): boolean | string => {\n const errors: string[] = [];\n\n for (const condition of conditions) {\n const result = check(condition, data, context);\n if (typeof result !== 'string') return true;\n errors.push(result);\n }\n\n if (error) return error;\n if (errors.length === 1) return errors[0];\n return `At least one condition must pass: ${errors.join(' OR ')}`;\n}\n\nconst checkIfThenElse = (condition: any, data: any, context: any): 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 = (condition: ArrayRule, data: any, context: any): boolean | string => {\n const arrayValue = get(context, 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 = [\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 = [\n ArrayOperator.atLeast,\n ArrayOperator.atMost,\n ArrayOperator.exactly\n ];\n \n if (requiresCondition.includes(condition.arrayOperator) && !condition.condition) \n throw new Error(`${condition.arrayOperator} requires a condition to check against array elements`);\n \n if (requiresCount.includes(condition.arrayOperator) && condition.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 // Check if array contains any objects\n if (!some(arrayValue, isObject)) \n throw new Error(`${condition.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`);\n \n // Pass item as data (for relative field access) but keep original context (for path access)\n const results = arrayValue.map(item => check(condition.condition!, item, context));\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 matches === arrayValue.length || getError(`all elements must match (${failures} failed)`);\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 return matches >= condition.count! || getError(`at least ${condition.count} elements must match (${matches} matched)`);\n \n case ArrayOperator.atMost:\n return matches <= condition.count! || getError(`at most ${condition.count} elements must match (${matches} matched)`);\n \n case ArrayOperator.exactly:\n return matches === condition.count! || getError(`exactly ${condition.count} elements must match (${matches} matched)`);\n \n default:\n throw new Error('Unknown array operator');\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\nexport const quoteField = (field: string): string => {\n // Handle nested JSON paths: data.settings.theme → \"data\"->>'settings'->>'theme'\n const parts = field.split('.');\n if (parts.length === 1) return `\"${field}\"`;\n\n const [column, ...jsonPath] = parts;\n if (jsonPath.length === 0) return `\"${column}\"`;\n\n // Build JSON path: \"column\"->'path1'->>'leaf'\n const pathParts = jsonPath.slice(0, -1).map((p) => `'${p}'`).join('->');\n const leaf = jsonPath[jsonPath.length - 1];\n\n if (pathParts) {\n return `\"${column}\"->${pathParts}->>'${leaf}'`;\n }\n return `\"${column}\"->>'${leaf}'`;\n};\n\nexport const mapDayNames = (days: string[]): number[] => {\n const dayMap: Record<string, number> = {\n sunday: 0, monday: 1, tuesday: 2, wednesday: 3,\n thursday: 4, friday: 5, saturday: 6,\n };\n return days.map((d) => {\n const num = dayMap[d.toLowerCase()];\n if (num === undefined) throw new Error(`Unknown day name: ${d}`);\n return num;\n });\n};\n","import type { Rule } from '../types';\nimport { Operator } from '../operator';\nimport type { BuilderState } from './types';\nimport { nextParam, quoteField } from './utils';\n\nexport const buildFieldRule = (rule: Rule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.operator) {\n case Operator.equals:\n if (rule.value === null) return `${field} IS NULL`;\n return `${field} = ${nextParam(state, rule.value)}`;\n\n case Operator.notEquals:\n if (rule.value === null) return `${field} IS NOT NULL`;\n return `${field} <> ${nextParam(state, rule.value)}`;\n\n case Operator.lessThan:\n return `${field} < ${nextParam(state, rule.value)}`;\n\n case Operator.lessThanEquals:\n return `${field} <= ${nextParam(state, rule.value)}`;\n\n case Operator.greaterThan:\n return `${field} > ${nextParam(state, rule.value)}`;\n\n case Operator.greaterThanEquals:\n return `${field} >= ${nextParam(state, rule.value)}`;\n\n case Operator.in:\n if (!Array.isArray(rule.value) || rule.value.length === 0) return 'FALSE';\n return `${field} = ANY(${nextParam(state, rule.value)})`;\n\n case Operator.notIn:\n if (!Array.isArray(rule.value) || rule.value.length === 0) return 'TRUE';\n return `${field} <> ALL(${nextParam(state, rule.value)})`;\n\n case Operator.contains:\n return `${field} LIKE ${nextParam(state, `%${rule.value}%`)}`;\n\n case Operator.notContains:\n return `${field} NOT LIKE ${nextParam(state, `%${rule.value}%`)}`;\n\n case Operator.startsWith:\n return `${field} LIKE ${nextParam(state, `${rule.value}%`)}`;\n\n case Operator.endsWith:\n return `${field} LIKE ${nextParam(state, `%${rule.value}`)}`;\n\n case Operator.matches:\n return `${field} ~ ${nextParam(state, rule.value)}`;\n\n case Operator.notMatches:\n return `${field} !~ ${nextParam(state, rule.value)}`;\n\n case Operator.between:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('between operator requires an array of two values');\n }\n return `${field} BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case Operator.notBetween:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('notBetween operator requires an array of two values');\n }\n return `${field} NOT BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\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","import type { DateRule } from '../types';\nimport { DateOperator } from '../operator';\nimport type { BuilderState } from './types';\nimport { nextParam, quoteField, mapDayNames } from './utils';\n\nexport const buildDateRule = (rule: DateRule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.dateOperator) {\n case DateOperator.before:\n return `${field} < ${nextParam(state, rule.value)}`;\n\n case DateOperator.after:\n return `${field} > ${nextParam(state, rule.value)}`;\n\n case DateOperator.onOrBefore:\n return `${field} <= ${nextParam(state, rule.value)}`;\n\n case DateOperator.onOrAfter:\n return `${field} >= ${nextParam(state, rule.value)}`;\n\n case DateOperator.between:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('between date operator requires an array of two values');\n }\n return `${field} BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case DateOperator.notBetween:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('notBetween date operator requires an array of two values');\n }\n return `${field} NOT BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case DateOperator.dayIn:\n const daysIn = mapDayNames(rule.value);\n return `EXTRACT(DOW FROM ${field}) = ANY(${nextParam(state, daysIn)})`;\n\n case DateOperator.dayNotIn:\n const daysNotIn = mapDayNames(rule.value);\n return `EXTRACT(DOW FROM ${field}) <> ALL(${nextParam(state, daysNotIn)})`;\n\n default:\n throw new Error(`Unknown date operator: ${(rule as DateRule).dateOperator}`);\n }\n};\n","import type { ArrayRule } from '../types';\nimport { ArrayOperator } from '../operator';\nimport type { BuilderState } from './types';\nimport { quoteField } from './utils';\n\nexport const buildArrayRule = (rule: ArrayRule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.arrayOperator) {\n case ArrayOperator.empty:\n return `(${field} IS NULL OR jsonb_array_length(${field}) = 0)`;\n\n case ArrayOperator.notEmpty:\n return `(${field} IS NOT NULL AND jsonb_array_length(${field}) > 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","import type { All, Any, IfThenElse, Condition } 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 type { BuilderState } from './types';\nimport { buildFieldRule } from './field';\nimport { buildDateRule } from './date';\nimport { buildArrayRule } from './array';\nimport { buildAll, buildAny, buildIfThenElse, setConditionBuilder } from './logical';\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 type { SqlResult, BuilderState } from './types';\nimport { buildCondition } from './condition';\n\nexport type { SqlResult } from './types';\n\n/**\n * Convert a json-rules Condition to a PostgreSQL WHERE clause.\n *\n * @param condition - The rule condition to convert\n * @returns Object with `sql` (WHERE clause fragment) and `params` array\n *\n * @example\n * ```typescript\n * import { toSql, Operator } from '@inixiative/json-rules';\n *\n * const rule = { field: 'status', operator: Operator.equals, value: 'active' };\n * const { sql, params } = toSql(rule);\n * // sql: '\"status\" = $1'\n * // params: ['active']\n *\n * // Complex rule\n * const rule2 = {\n * all: [\n * { field: 'deletedAt', operator: Operator.equals, value: null },\n * { field: 'status', operator: Operator.in, value: ['active', 'pending'] }\n * ]\n * };\n * const { sql: sql2, params: params2 } = toSql(rule2);\n * // sql: '(\"deletedAt\" IS NULL AND \"status\" = ANY($1))'\n * // params: [['active', 'pending']]\n * ```\n */\nexport const toSql = (condition: Condition): SqlResult => {\n const state: BuilderState = { params: [], paramIndex: 0 };\n const sql = buildCondition(condition, state);\n return { sql, params: state.params };\n};\n"]}
1
+ {"version":3,"sources":["../src/operator.ts","../src/date.ts","../src/field.ts","../src/check.ts","../src/toSql/utils.ts","../src/toSql/field.ts","../src/toSql/date.ts","../src/toSql/array.ts","../src/toSql/logical.ts","../src/toSql/condition.ts","../src/toSql/index.ts"],"names":["Operator","ArrayOperator","DateOperator","dayjs","utc","timezone","isSameOrBefore","isSameOrAfter","checkDate","condition","data","context","fieldValue","get","fieldDate","getError","op","dates","parseCompareDates","compareDate","endDate","dayName","allowedDays","d","day","excludedDays","startDate","parseDateWithTimezone","value","date","valueStr","fieldStr","offset","match","checkField","needsValue","getValue","isEmpty","check","conditions","all","any","checkArray","checkIfThenElse","error","errors","result","arrayValue","defaultMsg","requiresCondition","requiresCount","matches","failures","some","isObject","results","item","r","nextParam","state","escapeLikePattern","quoteField","field","parts","escapeIdentifier","column","jsonPath","escapeJsonKey","key","pathParts","leaf","mapDayNames","days","dayMap","num","buildFieldRule","rule","buildDateRule","buildArrayRule","isNative","lengthFn","buildCondition","setConditionBuilder","fn","buildAll","c","buildAny","buildIfThenElse","cond","ifClause","thenClause","elseClause","toSql"],"mappings":"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","file":"index.cjs","sourcesContent":["export enum 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}\n\nexport enum 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}\n\nexport enum DateOperator {\n before = 'before',\n after = 'after',\n onOrBefore = 'onOrBefore',\n onOrAfter = 'onOrAfter',\n between = 'between',\n notBetween = 'notBetween',\n dayIn = 'dayIn', // e.g., ['monday', 'tuesday', 'friday']\n dayNotIn = 'dayNotIn',\n}\n","import { get } from 'lodash';\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport type { DateRule } from './types';\nimport { DateOperator } from './operator';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(isSameOrBefore);\ndayjs.extend(isSameOrAfter);\n\nexport const checkDate = (condition: DateRule, data: any, context: any): boolean | string => {\n const fieldValue = get(data, condition.field);\n \n if (!fieldValue) throw new Error(`${condition.field} is null or undefined`);\n \n const fieldDate = dayjs(fieldValue);\n \n if (!fieldDate.isValid()) 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 fieldDate.isSameOrBefore(compareDate) || getError(`must be on or before ${compareDate.format()}`);\n \n case DateOperator.onOrAfter:\n return fieldDate.isSameOrAfter(compareDate) || getError(`must be on or after ${compareDate.format()}`);\n \n case DateOperator.between:\n return (fieldDate.isSameOrAfter(compareDate) && fieldDate.isSameOrBefore(endDate!)) || \n getError(`must be between ${compareDate.format()} and ${endDate!.format()}`);\n \n case DateOperator.notBetween:\n return (fieldDate.isBefore(compareDate) || fieldDate.isAfter(endDate!)) || \n getError(`must not be between ${compareDate.format()} and ${endDate!.format()}`);\n \n case DateOperator.dayIn:\n if (!Array.isArray(condition.value)) throw new Error('dayIn operator requires an array of day names');\n const dayName = fieldDate.format('dddd').toLowerCase();\n const allowedDays = condition.value.map(d => d.toLowerCase());\n return allowedDays.includes(dayName) || getError(`must be on ${allowedDays.join(' or ')}`);\n \n case DateOperator.dayNotIn:\n if (!Array.isArray(condition.value)) throw new Error('dayNotIn operator requires an array of day names');\n const day = fieldDate.format('dddd').toLowerCase();\n const excludedDays = condition.value.map(d => d.toLowerCase());\n return !excludedDays.includes(day) || getError(`must not be on ${excludedDays.join(' or ')}`);\n \n default:\n throw new Error('Unknown date operator');\n }\n}\n\nconst parseCompareDates = (condition: DateRule, data: any, context: any, fieldDate: dayjs.Dayjs, fieldValue: string): [dayjs.Dayjs, dayjs.Dayjs | undefined] => {\n const requiresTwoDates = [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 startDate = parseDateWithTimezone(condition.value[0], fieldValue);\n const endDate = parseDateWithTimezone(condition.value[1], fieldValue);\n if (!startDate.isValid()) throw new Error(`Invalid start date: ${condition.value[0]}`);\n if (!endDate.isValid()) throw new Error(`Invalid end date: ${condition.value[1]}`);\n return [startDate, endDate];\n }\n \n const requiresOneDate = [\n DateOperator.before,\n DateOperator.after,\n DateOperator.onOrBefore,\n DateOperator.onOrAfter\n ];\n \n if (requiresOneDate.includes(condition.dateOperator)) {\n let value;\n if (condition.value !== undefined) {\n value = condition.value;\n } else if (condition.path) {\n // Support $.path for current element\n if (condition.path.startsWith('$.')) {\n value = get(data, condition.path.substring(2));\n } else {\n value = get(context, condition.path);\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 = (value: any, fieldValue: string): dayjs.Dayjs => {\n const valueStr = String(value);\n \n // Check if value has explicit timezone information\n const hasTimezone = 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]) * 60 + parseInt(match[3]));\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}","import { get, isEmpty } from 'lodash';\nimport type { Rule } from './types';\nimport { Operator } from './operator';\n\nexport const checkField = (condition: Rule, data: any, context: any): boolean | string => {\n // Use data for field access (current element) but context remains available for path references\n const fieldValue = get(data, condition.field);\n \n // Operators that don't need a value\n const noValueOps = [Operator.isEmpty, Operator.notEmpty, Operator.exists, Operator.notExists];\n const needsValue = !noValueOps.includes(condition.operator);\n const value = needsValue ? getValue(condition, data, context) : undefined;\n \n const getError = (op: string) => 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 fieldValue < value || getError(`must be less than`);\n case Operator.lessThanEquals:\n return fieldValue <= value || getError(`must be less than or equal to`);\n case Operator.greaterThan:\n return fieldValue > value || getError(`must be greater than`);\n case Operator.greaterThanEquals:\n return fieldValue >= value || getError(`must be greater than or equal to`);\n case Operator.in:\n return value?.includes(fieldValue) || getError(`must be one of`);\n case Operator.notIn:\n return !value?.includes(fieldValue) || getError(`must not be one of`);\n case Operator.contains:\n return fieldValue?.includes(value) || getError(`must contain`);\n case Operator.notContains:\n return !fieldValue?.includes(value) || getError(`must not contain`);\n case Operator.matches:\n return !!fieldValue?.match(value) || getError(`must match pattern`);\n case Operator.notMatches:\n return !fieldValue?.match(value) || getError(`must not match pattern`);\n case Operator.between:\n if (!Array.isArray(value) || value.length !== 2) \n throw new Error('between operator requires an array of two values');\n return (fieldValue >= value[0] && fieldValue <= value[1]) || getError(`must be between`);\n case Operator.notBetween:\n if (!Array.isArray(value) || value.length !== 2) \n throw new Error('notBetween operator requires an array of two values');\n return (fieldValue < value[0] || fieldValue > value[1]) || getError(`must not be between`);\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 fieldValue?.startsWith?.(value) || getError(`must start with`);\n case Operator.endsWith:\n return fieldValue?.endsWith?.(value) || getError(`must end with`);\n default:\n throw new Error('Unknown operator');\n }\n};\n\nconst getValue = (condition: Rule, data: any, context: any): any => {\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};","import { get, some, isObject } from 'lodash';\nimport type { Condition, ArrayRule } from './types';\nimport { ArrayOperator } from './operator';\nimport { checkDate } from './date';\nimport { checkField } from './field';\n\nexport const check = (conditions: Condition, data: any, context: any = data): 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 = (conditions: Condition[], data: any, context: any, error?: string): 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 = (conditions: Condition[], data: any, context: any, error?: string): boolean | string => {\n const errors: string[] = [];\n\n for (const condition of conditions) {\n const result = check(condition, data, context);\n if (typeof result !== 'string') return true;\n errors.push(result);\n }\n\n if (error) return error;\n if (errors.length === 1) return errors[0];\n return `At least one condition must pass: ${errors.join(' OR ')}`;\n}\n\nconst checkIfThenElse = (condition: any, data: any, context: any): 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 = (condition: ArrayRule, data: any, context: any): boolean | string => {\n const arrayValue = get(context, 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 = [\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 = [\n ArrayOperator.atLeast,\n ArrayOperator.atMost,\n ArrayOperator.exactly\n ];\n \n if (requiresCondition.includes(condition.arrayOperator) && !condition.condition) \n throw new Error(`${condition.arrayOperator} requires a condition to check against array elements`);\n \n if (requiresCount.includes(condition.arrayOperator) && condition.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 // Check if array contains any objects\n if (!some(arrayValue, isObject)) \n throw new Error(`${condition.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`);\n \n // Pass item as data (for relative field access) but keep original context (for path access)\n const results = arrayValue.map(item => check(condition.condition!, item, context));\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 matches === arrayValue.length || getError(`all elements must match (${failures} failed)`);\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 return matches >= condition.count! || getError(`at least ${condition.count} elements must match (${matches} matched)`);\n \n case ArrayOperator.atMost:\n return matches <= condition.count! || getError(`at most ${condition.count} elements must match (${matches} matched)`);\n \n case ArrayOperator.exactly:\n return matches === condition.count! || getError(`exactly ${condition.count} elements must match (${matches} matched)`);\n \n default:\n throw new Error('Unknown array operator');\n }\n}","import { escapeIdentifier } from 'pg';\nimport type { BuilderState } from './types';\n\nexport const nextParam = (state: BuilderState, value: unknown): string => {\n state.params.push(value);\n return `$${++state.paramIndex}`;\n};\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\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/%/g, '\\\\%')\n .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 // Build JSON path: \"column\"->'path1'->'path2'->>'leaf'\n // JSON keys need single quote escaping ('' for literal ')\n const escapeJsonKey = (key: string) => `'${key.replace(/'/g, \"''\")}'`;\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 `${escapeIdentifier(column)}->${pathParts}->>${leaf}`;\n }\n return `${escapeIdentifier(column)}->>${leaf}`;\n};\n\nexport const mapDayNames = (days: string[]): number[] => {\n const dayMap: Record<string, number> = {\n sunday: 0, monday: 1, tuesday: 2, wednesday: 3,\n thursday: 4, friday: 5, saturday: 6,\n };\n return days.map((d) => {\n const num = dayMap[d.toLowerCase()];\n if (num === undefined) throw new Error(`Unknown day name: ${d}`);\n return num;\n });\n};\n","import type { Rule } from '../types';\nimport { Operator } from '../operator';\nimport type { BuilderState } from './types';\nimport { nextParam, quoteField, escapeLikePattern } from './utils';\n\nexport const buildFieldRule = (rule: Rule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.operator) {\n case Operator.equals:\n if (rule.value === null) return `${field} IS NULL`;\n return `${field} = ${nextParam(state, rule.value)}`;\n\n case Operator.notEquals:\n if (rule.value === null) return `${field} IS NOT NULL`;\n return `${field} <> ${nextParam(state, rule.value)}`;\n\n case Operator.lessThan:\n return `${field} < ${nextParam(state, rule.value)}`;\n\n case Operator.lessThanEquals:\n return `${field} <= ${nextParam(state, rule.value)}`;\n\n case Operator.greaterThan:\n return `${field} > ${nextParam(state, rule.value)}`;\n\n case Operator.greaterThanEquals:\n return `${field} >= ${nextParam(state, rule.value)}`;\n\n case Operator.in:\n if (!Array.isArray(rule.value) || rule.value.length === 0) return 'FALSE';\n return `${field} = ANY(${nextParam(state, rule.value)})`;\n\n case Operator.notIn:\n if (!Array.isArray(rule.value) || rule.value.length === 0) return 'TRUE';\n return `${field} <> ALL(${nextParam(state, rule.value)})`;\n\n case Operator.contains:\n return `${field} LIKE ${nextParam(state, `%${escapeLikePattern(String(rule.value))}%`)}`;\n\n case Operator.notContains:\n return `${field} NOT LIKE ${nextParam(state, `%${escapeLikePattern(String(rule.value))}%`)}`;\n\n case Operator.startsWith:\n return `${field} LIKE ${nextParam(state, `${escapeLikePattern(String(rule.value))}%`)}`;\n\n case Operator.endsWith:\n return `${field} LIKE ${nextParam(state, `%${escapeLikePattern(String(rule.value))}`)}`;\n\n case Operator.matches:\n return `${field} ~ ${nextParam(state, rule.value)}`;\n\n case Operator.notMatches:\n return `${field} !~ ${nextParam(state, rule.value)}`;\n\n case Operator.between:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('between operator requires an array of two values');\n }\n return `${field} BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case Operator.notBetween:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('notBetween operator requires an array of two values');\n }\n return `${field} NOT BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\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","import type { DateRule } from '../types';\nimport { DateOperator } from '../operator';\nimport type { BuilderState } from './types';\nimport { nextParam, quoteField, mapDayNames } from './utils';\n\nexport const buildDateRule = (rule: DateRule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.dateOperator) {\n case DateOperator.before:\n return `${field} < ${nextParam(state, rule.value)}`;\n\n case DateOperator.after:\n return `${field} > ${nextParam(state, rule.value)}`;\n\n case DateOperator.onOrBefore:\n return `${field} <= ${nextParam(state, rule.value)}`;\n\n case DateOperator.onOrAfter:\n return `${field} >= ${nextParam(state, rule.value)}`;\n\n case DateOperator.between:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('between date operator requires an array of two values');\n }\n return `${field} BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case DateOperator.notBetween:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('notBetween date operator requires an array of two values');\n }\n return `${field} NOT BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case DateOperator.dayIn: {\n const days = mapDayNames(rule.value);\n return `EXTRACT(DOW FROM ${field}) = ANY(${nextParam(state, days)})`;\n }\n\n case DateOperator.dayNotIn: {\n const days = mapDayNames(rule.value);\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","import type { ArrayRule } from '../types';\nimport { ArrayOperator } from '../operator';\nimport type { BuilderState } from './types';\nimport { quoteField } from './utils';\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","import type { All, Any, IfThenElse, Condition } 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 type { BuilderState } from './types';\nimport { buildFieldRule } from './field';\nimport { buildDateRule } from './date';\nimport { buildArrayRule } from './array';\nimport { buildAll, buildAny, buildIfThenElse, setConditionBuilder } from './logical';\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 type { SqlResult, BuilderState } from './types';\nimport { buildCondition } from './condition';\n\nexport type { SqlResult } from './types';\n\n/**\n * Convert a json-rules Condition to a PostgreSQL WHERE clause.\n *\n * @param condition - The rule condition to convert\n * @returns Object with `sql` (WHERE clause fragment) and `params` array\n *\n * @example\n * ```typescript\n * import { toSql, Operator } from '@inixiative/json-rules';\n *\n * const rule = { field: 'status', operator: Operator.equals, value: 'active' };\n * const { sql, params } = toSql(rule);\n * // sql: '\"status\" = $1'\n * // params: ['active']\n *\n * // Complex rule\n * const rule2 = {\n * all: [\n * { field: 'deletedAt', operator: Operator.equals, value: null },\n * { field: 'status', operator: Operator.in, value: ['active', 'pending'] }\n * ]\n * };\n * const { sql: sql2, params: params2 } = toSql(rule2);\n * // sql: '(\"deletedAt\" IS NULL AND \"status\" = ANY($1))'\n * // params: [['active', 'pending']]\n * ```\n */\nexport const toSql = (condition: Condition): SqlResult => {\n const state: BuilderState = { params: [], paramIndex: 0 };\n const sql = buildCondition(condition, state);\n return { sql, params: state.params };\n};\n"]}
package/dist/index.d.cts CHANGED
@@ -48,9 +48,11 @@ type Rule = {
48
48
  path?: string;
49
49
  error?: string;
50
50
  };
51
+ type ArrayType = 'jsonb' | 'native';
51
52
  type ArrayRule = {
52
53
  field: string;
53
54
  arrayOperator: ArrayOperator;
55
+ arrayType?: ArrayType;
54
56
  condition?: Condition;
55
57
  count?: number;
56
58
  error?: string;
@@ -114,4 +116,4 @@ type SqlResult = {
114
116
  */
115
117
  declare const toSql: (condition: Condition) => SqlResult;
116
118
 
117
- export { type All, type Any, ArrayOperator, type ArrayRule, type Condition, DateOperator, type DateRule, type IfThenElse, Operator, type Rule, type SqlResult, check, toSql };
119
+ export { type All, type Any, ArrayOperator, type ArrayRule, type ArrayType, type Condition, DateOperator, type DateRule, type IfThenElse, Operator, type Rule, type SqlResult, check, toSql };
package/dist/index.d.ts CHANGED
@@ -48,9 +48,11 @@ type Rule = {
48
48
  path?: string;
49
49
  error?: string;
50
50
  };
51
+ type ArrayType = 'jsonb' | 'native';
51
52
  type ArrayRule = {
52
53
  field: string;
53
54
  arrayOperator: ArrayOperator;
55
+ arrayType?: ArrayType;
54
56
  condition?: Condition;
55
57
  count?: number;
56
58
  error?: string;
@@ -114,4 +116,4 @@ type SqlResult = {
114
116
  */
115
117
  declare const toSql: (condition: Condition) => SqlResult;
116
118
 
117
- export { type All, type Any, ArrayOperator, type ArrayRule, type Condition, DateOperator, type DateRule, type IfThenElse, Operator, type Rule, type SqlResult, check, toSql };
119
+ export { type All, type Any, ArrayOperator, type ArrayRule, type ArrayType, type Condition, DateOperator, type DateRule, type IfThenElse, Operator, type Rule, type SqlResult, check, toSql };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import {get,isEmpty,some,isObject}from'lodash';import m from'dayjs';import W from'dayjs/plugin/utc';import k from'dayjs/plugin/timezone';import F from'dayjs/plugin/isSameOrBefore';import M from'dayjs/plugin/isSameOrAfter';var w=(f=>(f.equals="equals",f.notEquals="notEquals",f.lessThan="lessThan",f.lessThanEquals="lessThanEquals",f.greaterThan="greaterThan",f.greaterThanEquals="greaterThanEquals",f.contains="contains",f.notContains="notContains",f.in="in",f.notIn="notIn",f.matches="matches",f.notMatches="notMatches",f.between="between",f.notBetween="notBetween",f.isEmpty="isEmpty",f.notEmpty="notEmpty",f.exists="exists",f.notExists="notExists",f.startsWith="startsWith",f.endsWith="endsWith",f))(w||{}),E=(u=>(u.all="all",u.any="any",u.none="none",u.atLeast="atLeast",u.atMost="atMost",u.exactly="exactly",u.empty="empty",u.notEmpty="notEmpty",u))(E||{}),g=(u=>(u.before="before",u.after="after",u.onOrBefore="onOrBefore",u.onOrAfter="onOrAfter",u.between="between",u.notBetween="notBetween",u.dayIn="dayIn",u.dayNotIn="dayNotIn",u))(g||{});m.extend(W);m.extend(k);m.extend(F);m.extend(M);var x=(e,r,t)=>{let a=get(r,e.field);if(!a)throw new Error(`${e.field} is null or undefined`);let s=m(a);if(!s.isValid())throw new Error(`${e.field} is not a valid date: ${a}`);let i=y=>e.error||`${e.field} ${y}`,o=V(e,r,t,s,a),n=o[0],u=o[1];switch(e.dateOperator){case "before":return s.isBefore(n)||i(`must be before ${n.format()}`);case "after":return s.isAfter(n)||i(`must be after ${n.format()}`);case "onOrBefore":return s.isSameOrBefore(n)||i(`must be on or before ${n.format()}`);case "onOrAfter":return s.isSameOrAfter(n)||i(`must be on or after ${n.format()}`);case "between":return s.isSameOrAfter(n)&&s.isSameOrBefore(u)||i(`must be between ${n.format()} and ${u.format()}`);case "notBetween":return s.isBefore(n)||s.isAfter(u)||i(`must not be between ${n.format()} and ${u.format()}`);case "dayIn":if(!Array.isArray(e.value))throw new Error("dayIn operator requires an array of day names");let y=s.format("dddd").toLowerCase(),p=e.value.map($=>$.toLowerCase());return p.includes(y)||i(`must be on ${p.join(" or ")}`);case "dayNotIn":if(!Array.isArray(e.value))throw new Error("dayNotIn operator requires an array of day names");let j=s.format("dddd").toLowerCase(),q=e.value.map($=>$.toLowerCase());return !q.includes(j)||i(`must not be on ${q.join(" or ")}`);default:throw new Error("Unknown date operator")}},V=(e,r,t,a,s)=>{if(["between","notBetween"].includes(e.dateOperator)){if(!Array.isArray(e.value)||e.value.length!==2)throw new Error(`${e.dateOperator} operator requires an array of two dates`);let n=b(e.value[0],s),u=b(e.value[1],s);if(!n.isValid())throw new Error(`Invalid start date: ${e.value[0]}`);if(!u.isValid())throw new Error(`Invalid end date: ${e.value[1]}`);return [n,u]}if(["before","after","onOrBefore","onOrAfter"].includes(e.dateOperator)){let n;if(e.value!==void 0)n=e.value;else if(e.path)e.path.startsWith("$.")?n=get(r,e.path.substring(2)):n=get(t,e.path);else throw new Error("No value or path specified for date comparison");let u=b(n,s);if(!u.isValid())throw new Error(`Invalid comparison date: ${n}`);return [u,void 0]}return [m(),void 0]},b=(e,r)=>{let t=String(e);if(t.includes("Z")||t.includes("T")&&(t.includes("+")||t.match(/T.*-\d{2}:/)))return m(e);let s=String(r),i=0;if(s.includes("+")||s.includes("T")&&s.match(/T.*-\d{2}:/)){let n=s.match(/([+-])(\d{2}):(\d{2})/);n&&(i=(n[1]==="+"?1:-1)*(parseInt(n[2])*60+parseInt(n[3])));}else s.includes("Z")||(i=0);return t.match(/^\d{4}-\d{2}-\d{2}$/)?m(e+"T00:00:00").subtract(i,"minute"):m(e).subtract(i,"minute")};var R=(e,r,t)=>{let a=get(r,e.field),i=!["isEmpty","notEmpty","exists","notExists"].includes(e.operator),o=i?P(e,r,t):void 0,n=u=>e.error||`${e.field} ${u}${i?" "+JSON.stringify(o):""}`;switch(e.operator){case "equals":return a===o||n("must equal");case "notEquals":return a!==o||n("must not equal");case "lessThan":return a<o||n("must be less than");case "lessThanEquals":return a<=o||n("must be less than or equal to");case "greaterThan":return a>o||n("must be greater than");case "greaterThanEquals":return a>=o||n("must be greater than or equal to");case "in":return o?.includes(a)||n("must be one of");case "notIn":return !o?.includes(a)||n("must not be one of");case "contains":return a?.includes(o)||n("must contain");case "notContains":return !a?.includes(o)||n("must not contain");case "matches":return !!a?.match(o)||n("must match pattern");case "notMatches":return !a?.match(o)||n("must not match pattern");case "between":if(!Array.isArray(o)||o.length!==2)throw new Error("between operator requires an array of two values");return a>=o[0]&&a<=o[1]||n("must be between");case "notBetween":if(!Array.isArray(o)||o.length!==2)throw new Error("notBetween operator requires an array of two values");return a<o[0]||a>o[1]||n("must not be between");case "isEmpty":return isEmpty(a)||n("must be empty");case "notEmpty":return !isEmpty(a)||n("must not be empty");case "exists":return a!==void 0||n("must exist");case "notExists":return a===void 0||n("must not exist");case "startsWith":return a?.startsWith?.(o)||n("must start with");case "endsWith":return a?.endsWith?.(o)||n("must end with");default:throw new Error("Unknown operator")}},P=(e,r,t)=>{if(e.value!==void 0)return e.value;if(e.path)return e.path.startsWith("$.")?get(r,e.path.substring(2)):get(t,e.path);throw new Error("No value or path specified")};var c=(e,r,t=r)=>typeof e=="boolean"?e:"all"in e?X(e.all,r,t,e.error):"any"in e?Y(e.any,r,t,e.error):"arrayOperator"in e?J(e,r,t):"dateOperator"in e?x(e,r,t):"field"in e?R(e,r,t):"if"in e?Z(e,r,t):false,X=(e,r,t,a)=>{let s=[];for(let i of e){let o=c(i,r,t);o!==true&&(typeof o=="string"?s.push(o):s.push("false"));}return s.length?a||(s.length===1?s[0]:`All conditions must pass: ${s.join(" AND ")}`):true},Y=(e,r,t,a)=>{let s=[];for(let i of e){let o=c(i,r,t);if(typeof o!="string")return true;s.push(o);}return a||(s.length===1?s[0]:`At least one condition must pass: ${s.join(" OR ")}`)},Z=(e,r,t)=>c(e.if,r,t)===true?c(e.then,r,t):e.else?c(e.else,r,t):true,J=(e,r,t)=>{let a=get(t,e.field);if(!Array.isArray(a))throw new Error(`${e.field} must be an array`);let s=y=>e.error||`${e.field} ${y}`,i=["all","any","none","atLeast","atMost","exactly"],o=["atLeast","atMost","exactly"];if(i.includes(e.arrayOperator)&&!e.condition)throw new Error(`${e.arrayOperator} requires a condition to check against array elements`);if(o.includes(e.arrayOperator)&&e.count===void 0)throw new Error(`${e.arrayOperator} requires a count`);let n=0,u=0;if(i.includes(e.arrayOperator)){if(!some(a,isObject))throw new Error(`${e.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`);let y=a.map(p=>c(e.condition,p,t));n=y.filter(p=>p===true).length,u=y.filter(p=>typeof p=="string").length;}switch(e.arrayOperator){case "empty":return !a.length||s("must be empty");case "notEmpty":return !!a.length||s("must not be empty");case "all":return n===a.length||s(`all elements must match (${u} failed)`);case "any":return !!n||s("at least one element must match");case "none":return !n||s(`no elements should match (${n} matched)`);case "atLeast":return n>=e.count||s(`at least ${e.count} elements must match (${n} matched)`);case "atMost":return n<=e.count||s(`at most ${e.count} elements must match (${n} matched)`);case "exactly":return n===e.count||s(`exactly ${e.count} elements must match (${n} matched)`);default:throw new Error("Unknown array operator")}};var l=(e,r)=>(e.params.push(r),`$${++e.paramIndex}`),h=e=>{let r=e.split(".");if(r.length===1)return `"${e}"`;let[t,...a]=r;if(a.length===0)return `"${t}"`;let s=a.slice(0,-1).map(o=>`'${o}'`).join("->"),i=a[a.length-1];return s?`"${t}"->${s}->>'${i}'`:`"${t}"->>'${i}'`},T=e=>{let r={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};return e.map(t=>{let a=r[t.toLowerCase()];if(a===void 0)throw new Error(`Unknown day name: ${t}`);return a})};var S=(e,r)=>{let t=h(e.field);switch(e.operator){case "equals":return e.value===null?`${t} IS NULL`:`${t} = ${l(r,e.value)}`;case "notEquals":return e.value===null?`${t} IS NOT NULL`:`${t} <> ${l(r,e.value)}`;case "lessThan":return `${t} < ${l(r,e.value)}`;case "lessThanEquals":return `${t} <= ${l(r,e.value)}`;case "greaterThan":return `${t} > ${l(r,e.value)}`;case "greaterThanEquals":return `${t} >= ${l(r,e.value)}`;case "in":return !Array.isArray(e.value)||e.value.length===0?"FALSE":`${t} = ANY(${l(r,e.value)})`;case "notIn":return !Array.isArray(e.value)||e.value.length===0?"TRUE":`${t} <> ALL(${l(r,e.value)})`;case "contains":return `${t} LIKE ${l(r,`%${e.value}%`)}`;case "notContains":return `${t} NOT LIKE ${l(r,`%${e.value}%`)}`;case "startsWith":return `${t} LIKE ${l(r,`${e.value}%`)}`;case "endsWith":return `${t} LIKE ${l(r,`%${e.value}`)}`;case "matches":return `${t} ~ ${l(r,e.value)}`;case "notMatches":return `${t} !~ ${l(r,e.value)}`;case "between":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("between operator requires an array of two values");return `${t} BETWEEN ${l(r,e.value[0])} AND ${l(r,e.value[1])}`;case "notBetween":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("notBetween operator requires an array of two values");return `${t} NOT BETWEEN ${l(r,e.value[0])} AND ${l(r,e.value[1])}`;case "isEmpty":return `(${t} IS NULL OR ${t} = '')`;case "notEmpty":return `(${t} IS NOT NULL AND ${t} <> '')`;case "exists":return `${t} IS NOT NULL`;case "notExists":return `${t} IS NULL`;default:throw new Error(`Unknown operator: ${e.operator}`)}};var I=(e,r)=>{let t=h(e.field);switch(e.dateOperator){case "before":return `${t} < ${l(r,e.value)}`;case "after":return `${t} > ${l(r,e.value)}`;case "onOrBefore":return `${t} <= ${l(r,e.value)}`;case "onOrAfter":return `${t} >= ${l(r,e.value)}`;case "between":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("between date operator requires an array of two values");return `${t} BETWEEN ${l(r,e.value[0])} AND ${l(r,e.value[1])}`;case "notBetween":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("notBetween date operator requires an array of two values");return `${t} NOT BETWEEN ${l(r,e.value[0])} AND ${l(r,e.value[1])}`;case "dayIn":let a=T(e.value);return `EXTRACT(DOW FROM ${t}) = ANY(${l(r,a)})`;case "dayNotIn":let s=T(e.value);return `EXTRACT(DOW FROM ${t}) <> ALL(${l(r,s)})`;default:throw new Error(`Unknown date operator: ${e.dateOperator}`)}};var L=(e,r)=>{let t=h(e.field);switch(e.arrayOperator){case "empty":return `(${t} IS NULL OR jsonb_array_length(${t}) = 0)`;case "notEmpty":return `(${t} IS NOT NULL AND jsonb_array_length(${t}) > 0)`;case "all":case "any":case "none":case "atLeast":case "atMost":case "exactly":throw new Error(`Array operator '${e.arrayOperator}' with conditions is not supported in SQL. Use application-level filtering for complex array operations.`);default:throw new Error(`Unknown array operator: ${e.arrayOperator}`)}};var d,C=e=>{d=e;},D=(e,r)=>e.all.length===0?"TRUE":`(${e.all.map(a=>d(a,r)).join(" AND ")})`,O=(e,r)=>e.any.length===0?"FALSE":`(${e.any.map(a=>d(a,r)).join(" OR ")})`,U=(e,r)=>{let t=d(e.if,r),a=d(e.then,r),s=e.else?d(e.else,r):"TRUE";return e.else?`((NOT(${t}) OR ${a}) AND (${t} OR ${s}))`:`(NOT(${t}) OR ${a})`};var B=(e,r)=>{if(typeof e=="boolean")return e?"TRUE":"FALSE";if("all"in e)return D(e,r);if("any"in e)return O(e,r);if("if"in e)return U(e,r);if("arrayOperator"in e)return L(e);if("dateOperator"in e)return I(e,r);if("field"in e)return S(e,r);throw new Error("Unknown condition type")};C(B);var Ie=e=>{let r={params:[],paramIndex:0};return {sql:B(e,r),params:r.params}};export{E as ArrayOperator,g as DateOperator,w as Operator,c as check,Ie as toSql};//# sourceMappingURL=index.js.map
1
+ import {get,isEmpty,some,isObject}from'lodash';import m from'dayjs';import F from'dayjs/plugin/utc';import M from'dayjs/plugin/timezone';import V from'dayjs/plugin/isSameOrBefore';import P from'dayjs/plugin/isSameOrAfter';import {escapeIdentifier}from'pg';var E=(f=>(f.equals="equals",f.notEquals="notEquals",f.lessThan="lessThan",f.lessThanEquals="lessThanEquals",f.greaterThan="greaterThan",f.greaterThanEquals="greaterThanEquals",f.contains="contains",f.notContains="notContains",f.in="in",f.notIn="notIn",f.matches="matches",f.notMatches="notMatches",f.between="between",f.notBetween="notBetween",f.isEmpty="isEmpty",f.notEmpty="notEmpty",f.exists="exists",f.notExists="notExists",f.startsWith="startsWith",f.endsWith="endsWith",f))(E||{}),b=(u=>(u.all="all",u.any="any",u.none="none",u.atLeast="atLeast",u.atMost="atMost",u.exactly="exactly",u.empty="empty",u.notEmpty="notEmpty",u))(b||{}),v=(u=>(u.before="before",u.after="after",u.onOrBefore="onOrBefore",u.onOrAfter="onOrAfter",u.between="between",u.notBetween="notBetween",u.dayIn="dayIn",u.dayNotIn="dayNotIn",u))(v||{});m.extend(F);m.extend(M);m.extend(V);m.extend(P);var q=(e,t,r)=>{let a=get(t,e.field);if(!a)throw new Error(`${e.field} is null or undefined`);let s=m(a);if(!s.isValid())throw new Error(`${e.field} is not a valid date: ${a}`);let i=p=>e.error||`${e.field} ${p}`,o=K(e,t,r,s,a),n=o[0],u=o[1];switch(e.dateOperator){case "before":return s.isBefore(n)||i(`must be before ${n.format()}`);case "after":return s.isAfter(n)||i(`must be after ${n.format()}`);case "onOrBefore":return s.isSameOrBefore(n)||i(`must be on or before ${n.format()}`);case "onOrAfter":return s.isSameOrAfter(n)||i(`must be on or after ${n.format()}`);case "between":return s.isSameOrAfter(n)&&s.isSameOrBefore(u)||i(`must be between ${n.format()} and ${u.format()}`);case "notBetween":return s.isBefore(n)||s.isAfter(u)||i(`must not be between ${n.format()} and ${u.format()}`);case "dayIn":if(!Array.isArray(e.value))throw new Error("dayIn operator requires an array of day names");let p=s.format("dddd").toLowerCase(),y=e.value.map(g=>g.toLowerCase());return y.includes(p)||i(`must be on ${y.join(" or ")}`);case "dayNotIn":if(!Array.isArray(e.value))throw new Error("dayNotIn operator requires an array of day names");let W=s.format("dddd").toLowerCase(),B=e.value.map(g=>g.toLowerCase());return !B.includes(W)||i(`must not be on ${B.join(" or ")}`);default:throw new Error("Unknown date operator")}},K=(e,t,r,a,s)=>{if(["between","notBetween"].includes(e.dateOperator)){if(!Array.isArray(e.value)||e.value.length!==2)throw new Error(`${e.dateOperator} operator requires an array of two dates`);let n=A(e.value[0],s),u=A(e.value[1],s);if(!n.isValid())throw new Error(`Invalid start date: ${e.value[0]}`);if(!u.isValid())throw new Error(`Invalid end date: ${e.value[1]}`);return [n,u]}if(["before","after","onOrBefore","onOrAfter"].includes(e.dateOperator)){let n;if(e.value!==void 0)n=e.value;else if(e.path)e.path.startsWith("$.")?n=get(t,e.path.substring(2)):n=get(r,e.path);else throw new Error("No value or path specified for date comparison");let u=A(n,s);if(!u.isValid())throw new Error(`Invalid comparison date: ${n}`);return [u,void 0]}return [m(),void 0]},A=(e,t)=>{let r=String(e);if(r.includes("Z")||r.includes("T")&&(r.includes("+")||r.match(/T.*-\d{2}:/)))return m(e);let s=String(t),i=0;if(s.includes("+")||s.includes("T")&&s.match(/T.*-\d{2}:/)){let n=s.match(/([+-])(\d{2}):(\d{2})/);n&&(i=(n[1]==="+"?1:-1)*(parseInt(n[2])*60+parseInt(n[3])));}else s.includes("Z")||(i=0);return r.match(/^\d{4}-\d{2}-\d{2}$/)?m(e+"T00:00:00").subtract(i,"minute"):m(e).subtract(i,"minute")};var R=(e,t,r)=>{let a=get(t,e.field),i=!["isEmpty","notEmpty","exists","notExists"].includes(e.operator),o=i?_(e,t,r):void 0,n=u=>e.error||`${e.field} ${u}${i?" "+JSON.stringify(o):""}`;switch(e.operator){case "equals":return a===o||n("must equal");case "notEquals":return a!==o||n("must not equal");case "lessThan":return a<o||n("must be less than");case "lessThanEquals":return a<=o||n("must be less than or equal to");case "greaterThan":return a>o||n("must be greater than");case "greaterThanEquals":return a>=o||n("must be greater than or equal to");case "in":return o?.includes(a)||n("must be one of");case "notIn":return !o?.includes(a)||n("must not be one of");case "contains":return a?.includes(o)||n("must contain");case "notContains":return !a?.includes(o)||n("must not contain");case "matches":return !!a?.match(o)||n("must match pattern");case "notMatches":return !a?.match(o)||n("must not match pattern");case "between":if(!Array.isArray(o)||o.length!==2)throw new Error("between operator requires an array of two values");return a>=o[0]&&a<=o[1]||n("must be between");case "notBetween":if(!Array.isArray(o)||o.length!==2)throw new Error("notBetween operator requires an array of two values");return a<o[0]||a>o[1]||n("must not be between");case "isEmpty":return isEmpty(a)||n("must be empty");case "notEmpty":return !isEmpty(a)||n("must not be empty");case "exists":return a!==void 0||n("must exist");case "notExists":return a===void 0||n("must not exist");case "startsWith":return a?.startsWith?.(o)||n("must start with");case "endsWith":return a?.endsWith?.(o)||n("must end with");default:throw new Error("Unknown operator")}},_=(e,t,r)=>{if(e.value!==void 0)return e.value;if(e.path)return e.path.startsWith("$.")?get(t,e.path.substring(2)):get(r,e.path);throw new Error("No value or path specified")};var c=(e,t,r=t)=>typeof e=="boolean"?e:"all"in e?Y(e.all,t,r,e.error):"any"in e?Z(e.any,t,r,e.error):"arrayOperator"in e?G(e,t,r):"dateOperator"in e?q(e,t,r):"field"in e?R(e,t,r):"if"in e?Q(e,t,r):false,Y=(e,t,r,a)=>{let s=[];for(let i of e){let o=c(i,t,r);o!==true&&(typeof o=="string"?s.push(o):s.push("false"));}return s.length?a||(s.length===1?s[0]:`All conditions must pass: ${s.join(" AND ")}`):true},Z=(e,t,r,a)=>{let s=[];for(let i of e){let o=c(i,t,r);if(typeof o!="string")return true;s.push(o);}return a||(s.length===1?s[0]:`At least one condition must pass: ${s.join(" OR ")}`)},Q=(e,t,r)=>c(e.if,t,r)===true?c(e.then,t,r):e.else?c(e.else,t,r):true,G=(e,t,r)=>{let a=get(r,e.field);if(!Array.isArray(a))throw new Error(`${e.field} must be an array`);let s=p=>e.error||`${e.field} ${p}`,i=["all","any","none","atLeast","atMost","exactly"],o=["atLeast","atMost","exactly"];if(i.includes(e.arrayOperator)&&!e.condition)throw new Error(`${e.arrayOperator} requires a condition to check against array elements`);if(o.includes(e.arrayOperator)&&e.count===void 0)throw new Error(`${e.arrayOperator} requires a count`);let n=0,u=0;if(i.includes(e.arrayOperator)){if(!some(a,isObject))throw new Error(`${e.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`);let p=a.map(y=>c(e.condition,y,r));n=p.filter(y=>y===true).length,u=p.filter(y=>typeof y=="string").length;}switch(e.arrayOperator){case "empty":return !a.length||s("must be empty");case "notEmpty":return !!a.length||s("must not be empty");case "all":return n===a.length||s(`all elements must match (${u} failed)`);case "any":return !!n||s("at least one element must match");case "none":return !n||s(`no elements should match (${n} matched)`);case "atLeast":return n>=e.count||s(`at least ${e.count} elements must match (${n} matched)`);case "atMost":return n<=e.count||s(`at most ${e.count} elements must match (${n} matched)`);case "exactly":return n===e.count||s(`exactly ${e.count} elements must match (${n} matched)`);default:throw new Error("Unknown array operator")}};var l=(e,t)=>(e.params.push(t),`$${++e.paramIndex}`),$=e=>e.replace(/\\/g,"\\\\").replace(/%/g,"\\%").replace(/_/g,"\\_"),h=e=>{let t=e.split(".");if(t.length===1)return escapeIdentifier(e);let[r,...a]=t;if(a.length===0)return escapeIdentifier(r);let s=n=>`'${n.replace(/'/g,"''")}'`,i=a.slice(0,-1).map(s).join("->"),o=s(a[a.length-1]);return i?`${escapeIdentifier(r)}->${i}->>${o}`:`${escapeIdentifier(r)}->>${o}`},N=e=>{let t={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};return e.map(r=>{let a=t[r.toLowerCase()];if(a===void 0)throw new Error(`Unknown day name: ${r}`);return a})};var I=(e,t)=>{let r=h(e.field);switch(e.operator){case "equals":return e.value===null?`${r} IS NULL`:`${r} = ${l(t,e.value)}`;case "notEquals":return e.value===null?`${r} IS NOT NULL`:`${r} <> ${l(t,e.value)}`;case "lessThan":return `${r} < ${l(t,e.value)}`;case "lessThanEquals":return `${r} <= ${l(t,e.value)}`;case "greaterThan":return `${r} > ${l(t,e.value)}`;case "greaterThanEquals":return `${r} >= ${l(t,e.value)}`;case "in":return !Array.isArray(e.value)||e.value.length===0?"FALSE":`${r} = ANY(${l(t,e.value)})`;case "notIn":return !Array.isArray(e.value)||e.value.length===0?"TRUE":`${r} <> ALL(${l(t,e.value)})`;case "contains":return `${r} LIKE ${l(t,`%${$(String(e.value))}%`)}`;case "notContains":return `${r} NOT LIKE ${l(t,`%${$(String(e.value))}%`)}`;case "startsWith":return `${r} LIKE ${l(t,`${$(String(e.value))}%`)}`;case "endsWith":return `${r} LIKE ${l(t,`%${$(String(e.value))}`)}`;case "matches":return `${r} ~ ${l(t,e.value)}`;case "notMatches":return `${r} !~ ${l(t,e.value)}`;case "between":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("between operator requires an array of two values");return `${r} BETWEEN ${l(t,e.value[0])} AND ${l(t,e.value[1])}`;case "notBetween":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("notBetween operator requires an array of two values");return `${r} NOT BETWEEN ${l(t,e.value[0])} AND ${l(t,e.value[1])}`;case "isEmpty":return `(${r} IS NULL OR ${r} = '')`;case "notEmpty":return `(${r} IS NOT NULL AND ${r} <> '')`;case "exists":return `${r} IS NOT NULL`;case "notExists":return `${r} IS NULL`;default:throw new Error(`Unknown operator: ${e.operator}`)}};var D=(e,t)=>{let r=h(e.field);switch(e.dateOperator){case "before":return `${r} < ${l(t,e.value)}`;case "after":return `${r} > ${l(t,e.value)}`;case "onOrBefore":return `${r} <= ${l(t,e.value)}`;case "onOrAfter":return `${r} >= ${l(t,e.value)}`;case "between":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("between date operator requires an array of two values");return `${r} BETWEEN ${l(t,e.value[0])} AND ${l(t,e.value[1])}`;case "notBetween":if(!Array.isArray(e.value)||e.value.length!==2)throw new Error("notBetween date operator requires an array of two values");return `${r} NOT BETWEEN ${l(t,e.value[0])} AND ${l(t,e.value[1])}`;case "dayIn":{let a=N(e.value);return `EXTRACT(DOW FROM ${r}) = ANY(${l(t,a)})`}case "dayNotIn":{let a=N(e.value);return `EXTRACT(DOW FROM ${r}) <> ALL(${l(t,a)})`}default:throw new Error(`Unknown date operator: ${e.dateOperator}`)}};var C=(e,t)=>{let r=h(e.field),a=e.arrayType==="native",s=a?`array_length(${r}, 1)`:`jsonb_array_length(${r})`;switch(e.arrayOperator){case "empty":return a?`(${r} IS NULL OR ${s} IS NULL)`:`(${r} IS NULL OR ${s} = 0)`;case "notEmpty":return a?`(${r} IS NOT NULL AND ${s} IS NOT NULL)`:`(${r} IS NOT NULL AND ${s} > 0)`;case "all":case "any":case "none":case "atLeast":case "atMost":case "exactly":throw new Error(`Array operator '${e.arrayOperator}' with conditions is not supported in SQL. Use application-level filtering for complex array operations.`);default:throw new Error(`Unknown array operator: ${e.arrayOperator}`)}};var d,O=e=>{d=e;},U=(e,t)=>e.all.length===0?"TRUE":`(${e.all.map(a=>d(a,t)).join(" AND ")})`,j=(e,t)=>e.any.length===0?"FALSE":`(${e.any.map(a=>d(a,t)).join(" OR ")})`,k=(e,t)=>{let r=d(e.if,t),a=d(e.then,t),s=e.else?d(e.else,t):"TRUE";return e.else?`((NOT(${r}) OR ${a}) AND (${r} OR ${s}))`:`(NOT(${r}) OR ${a})`};var L=(e,t)=>{if(typeof e=="boolean")return e?"TRUE":"FALSE";if("all"in e)return U(e,t);if("any"in e)return j(e,t);if("if"in e)return k(e,t);if("arrayOperator"in e)return C(e);if("dateOperator"in e)return D(e,t);if("field"in e)return I(e,t);throw new Error("Unknown condition type")};O(L);var Ce=e=>{let t={params:[],paramIndex:0};return {sql:L(e,t),params:t.params}};export{b as ArrayOperator,v as DateOperator,E as Operator,c as check,Ce as toSql};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/operator.ts","../src/date.ts","../src/field.ts","../src/check.ts","../src/toSql/utils.ts","../src/toSql/field.ts","../src/toSql/date.ts","../src/toSql/array.ts","../src/toSql/logical.ts","../src/toSql/condition.ts","../src/toSql/index.ts"],"names":["Operator","ArrayOperator","DateOperator","dayjs","utc","timezone","isSameOrBefore","isSameOrAfter","checkDate","condition","data","context","fieldValue","get","fieldDate","getError","op","dates","parseCompareDates","compareDate","endDate","dayName","allowedDays","d","day","excludedDays","startDate","parseDateWithTimezone","value","date","valueStr","fieldStr","offset","match","checkField","needsValue","getValue","isEmpty","check","conditions","all","any","checkArray","checkIfThenElse","error","errors","result","arrayValue","defaultMsg","requiresCondition","requiresCount","matches","failures","some","isObject","results","item","r","nextParam","state","quoteField","field","parts","column","jsonPath","pathParts","p","leaf","mapDayNames","days","dayMap","num","buildFieldRule","rule","buildDateRule","daysIn","daysNotIn","buildArrayRule","buildCondition","setConditionBuilder","fn","buildAll","c","buildAny","buildIfThenElse","cond","ifClause","thenClause","elseClause","toSql"],"mappings":"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","file":"index.js","sourcesContent":["export enum 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}\n\nexport enum 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}\n\nexport enum DateOperator {\n before = 'before',\n after = 'after',\n onOrBefore = 'onOrBefore',\n onOrAfter = 'onOrAfter',\n between = 'between',\n notBetween = 'notBetween',\n dayIn = 'dayIn', // e.g., ['monday', 'tuesday', 'friday']\n dayNotIn = 'dayNotIn',\n}\n","import { get } from 'lodash';\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport type { DateRule } from './types';\nimport { DateOperator } from './operator';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(isSameOrBefore);\ndayjs.extend(isSameOrAfter);\n\nexport const checkDate = (condition: DateRule, data: any, context: any): boolean | string => {\n const fieldValue = get(data, condition.field);\n \n if (!fieldValue) throw new Error(`${condition.field} is null or undefined`);\n \n const fieldDate = dayjs(fieldValue);\n \n if (!fieldDate.isValid()) 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 fieldDate.isSameOrBefore(compareDate) || getError(`must be on or before ${compareDate.format()}`);\n \n case DateOperator.onOrAfter:\n return fieldDate.isSameOrAfter(compareDate) || getError(`must be on or after ${compareDate.format()}`);\n \n case DateOperator.between:\n return (fieldDate.isSameOrAfter(compareDate) && fieldDate.isSameOrBefore(endDate!)) || \n getError(`must be between ${compareDate.format()} and ${endDate!.format()}`);\n \n case DateOperator.notBetween:\n return (fieldDate.isBefore(compareDate) || fieldDate.isAfter(endDate!)) || \n getError(`must not be between ${compareDate.format()} and ${endDate!.format()}`);\n \n case DateOperator.dayIn:\n if (!Array.isArray(condition.value)) throw new Error('dayIn operator requires an array of day names');\n const dayName = fieldDate.format('dddd').toLowerCase();\n const allowedDays = condition.value.map(d => d.toLowerCase());\n return allowedDays.includes(dayName) || getError(`must be on ${allowedDays.join(' or ')}`);\n \n case DateOperator.dayNotIn:\n if (!Array.isArray(condition.value)) throw new Error('dayNotIn operator requires an array of day names');\n const day = fieldDate.format('dddd').toLowerCase();\n const excludedDays = condition.value.map(d => d.toLowerCase());\n return !excludedDays.includes(day) || getError(`must not be on ${excludedDays.join(' or ')}`);\n \n default:\n throw new Error('Unknown date operator');\n }\n}\n\nconst parseCompareDates = (condition: DateRule, data: any, context: any, fieldDate: dayjs.Dayjs, fieldValue: string): [dayjs.Dayjs, dayjs.Dayjs | undefined] => {\n const requiresTwoDates = [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 startDate = parseDateWithTimezone(condition.value[0], fieldValue);\n const endDate = parseDateWithTimezone(condition.value[1], fieldValue);\n if (!startDate.isValid()) throw new Error(`Invalid start date: ${condition.value[0]}`);\n if (!endDate.isValid()) throw new Error(`Invalid end date: ${condition.value[1]}`);\n return [startDate, endDate];\n }\n \n const requiresOneDate = [\n DateOperator.before,\n DateOperator.after,\n DateOperator.onOrBefore,\n DateOperator.onOrAfter\n ];\n \n if (requiresOneDate.includes(condition.dateOperator)) {\n let value;\n if (condition.value !== undefined) {\n value = condition.value;\n } else if (condition.path) {\n // Support $.path for current element\n if (condition.path.startsWith('$.')) {\n value = get(data, condition.path.substring(2));\n } else {\n value = get(context, condition.path);\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 = (value: any, fieldValue: string): dayjs.Dayjs => {\n const valueStr = String(value);\n \n // Check if value has explicit timezone information\n const hasTimezone = 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]) * 60 + parseInt(match[3]));\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}","import { get, isEmpty } from 'lodash';\nimport type { Rule } from './types';\nimport { Operator } from './operator';\n\nexport const checkField = (condition: Rule, data: any, context: any): boolean | string => {\n // Use data for field access (current element) but context remains available for path references\n const fieldValue = get(data, condition.field);\n \n // Operators that don't need a value\n const noValueOps = [Operator.isEmpty, Operator.notEmpty, Operator.exists, Operator.notExists];\n const needsValue = !noValueOps.includes(condition.operator);\n const value = needsValue ? getValue(condition, data, context) : undefined;\n \n const getError = (op: string) => 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 fieldValue < value || getError(`must be less than`);\n case Operator.lessThanEquals:\n return fieldValue <= value || getError(`must be less than or equal to`);\n case Operator.greaterThan:\n return fieldValue > value || getError(`must be greater than`);\n case Operator.greaterThanEquals:\n return fieldValue >= value || getError(`must be greater than or equal to`);\n case Operator.in:\n return value?.includes(fieldValue) || getError(`must be one of`);\n case Operator.notIn:\n return !value?.includes(fieldValue) || getError(`must not be one of`);\n case Operator.contains:\n return fieldValue?.includes(value) || getError(`must contain`);\n case Operator.notContains:\n return !fieldValue?.includes(value) || getError(`must not contain`);\n case Operator.matches:\n return !!fieldValue?.match(value) || getError(`must match pattern`);\n case Operator.notMatches:\n return !fieldValue?.match(value) || getError(`must not match pattern`);\n case Operator.between:\n if (!Array.isArray(value) || value.length !== 2) \n throw new Error('between operator requires an array of two values');\n return (fieldValue >= value[0] && fieldValue <= value[1]) || getError(`must be between`);\n case Operator.notBetween:\n if (!Array.isArray(value) || value.length !== 2) \n throw new Error('notBetween operator requires an array of two values');\n return (fieldValue < value[0] || fieldValue > value[1]) || getError(`must not be between`);\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 fieldValue?.startsWith?.(value) || getError(`must start with`);\n case Operator.endsWith:\n return fieldValue?.endsWith?.(value) || getError(`must end with`);\n default:\n throw new Error('Unknown operator');\n }\n};\n\nconst getValue = (condition: Rule, data: any, context: any): any => {\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};","import { get, some, isObject } from 'lodash';\nimport type { Condition, ArrayRule } from './types';\nimport { ArrayOperator } from './operator';\nimport { checkDate } from './date';\nimport { checkField } from './field';\n\nexport const check = (conditions: Condition, data: any, context: any = data): 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 = (conditions: Condition[], data: any, context: any, error?: string): 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 = (conditions: Condition[], data: any, context: any, error?: string): boolean | string => {\n const errors: string[] = [];\n\n for (const condition of conditions) {\n const result = check(condition, data, context);\n if (typeof result !== 'string') return true;\n errors.push(result);\n }\n\n if (error) return error;\n if (errors.length === 1) return errors[0];\n return `At least one condition must pass: ${errors.join(' OR ')}`;\n}\n\nconst checkIfThenElse = (condition: any, data: any, context: any): 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 = (condition: ArrayRule, data: any, context: any): boolean | string => {\n const arrayValue = get(context, 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 = [\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 = [\n ArrayOperator.atLeast,\n ArrayOperator.atMost,\n ArrayOperator.exactly\n ];\n \n if (requiresCondition.includes(condition.arrayOperator) && !condition.condition) \n throw new Error(`${condition.arrayOperator} requires a condition to check against array elements`);\n \n if (requiresCount.includes(condition.arrayOperator) && condition.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 // Check if array contains any objects\n if (!some(arrayValue, isObject)) \n throw new Error(`${condition.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`);\n \n // Pass item as data (for relative field access) but keep original context (for path access)\n const results = arrayValue.map(item => check(condition.condition!, item, context));\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 matches === arrayValue.length || getError(`all elements must match (${failures} failed)`);\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 return matches >= condition.count! || getError(`at least ${condition.count} elements must match (${matches} matched)`);\n \n case ArrayOperator.atMost:\n return matches <= condition.count! || getError(`at most ${condition.count} elements must match (${matches} matched)`);\n \n case ArrayOperator.exactly:\n return matches === condition.count! || getError(`exactly ${condition.count} elements must match (${matches} matched)`);\n \n default:\n throw new Error('Unknown array operator');\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\nexport const quoteField = (field: string): string => {\n // Handle nested JSON paths: data.settings.theme → \"data\"->>'settings'->>'theme'\n const parts = field.split('.');\n if (parts.length === 1) return `\"${field}\"`;\n\n const [column, ...jsonPath] = parts;\n if (jsonPath.length === 0) return `\"${column}\"`;\n\n // Build JSON path: \"column\"->'path1'->>'leaf'\n const pathParts = jsonPath.slice(0, -1).map((p) => `'${p}'`).join('->');\n const leaf = jsonPath[jsonPath.length - 1];\n\n if (pathParts) {\n return `\"${column}\"->${pathParts}->>'${leaf}'`;\n }\n return `\"${column}\"->>'${leaf}'`;\n};\n\nexport const mapDayNames = (days: string[]): number[] => {\n const dayMap: Record<string, number> = {\n sunday: 0, monday: 1, tuesday: 2, wednesday: 3,\n thursday: 4, friday: 5, saturday: 6,\n };\n return days.map((d) => {\n const num = dayMap[d.toLowerCase()];\n if (num === undefined) throw new Error(`Unknown day name: ${d}`);\n return num;\n });\n};\n","import type { Rule } from '../types';\nimport { Operator } from '../operator';\nimport type { BuilderState } from './types';\nimport { nextParam, quoteField } from './utils';\n\nexport const buildFieldRule = (rule: Rule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.operator) {\n case Operator.equals:\n if (rule.value === null) return `${field} IS NULL`;\n return `${field} = ${nextParam(state, rule.value)}`;\n\n case Operator.notEquals:\n if (rule.value === null) return `${field} IS NOT NULL`;\n return `${field} <> ${nextParam(state, rule.value)}`;\n\n case Operator.lessThan:\n return `${field} < ${nextParam(state, rule.value)}`;\n\n case Operator.lessThanEquals:\n return `${field} <= ${nextParam(state, rule.value)}`;\n\n case Operator.greaterThan:\n return `${field} > ${nextParam(state, rule.value)}`;\n\n case Operator.greaterThanEquals:\n return `${field} >= ${nextParam(state, rule.value)}`;\n\n case Operator.in:\n if (!Array.isArray(rule.value) || rule.value.length === 0) return 'FALSE';\n return `${field} = ANY(${nextParam(state, rule.value)})`;\n\n case Operator.notIn:\n if (!Array.isArray(rule.value) || rule.value.length === 0) return 'TRUE';\n return `${field} <> ALL(${nextParam(state, rule.value)})`;\n\n case Operator.contains:\n return `${field} LIKE ${nextParam(state, `%${rule.value}%`)}`;\n\n case Operator.notContains:\n return `${field} NOT LIKE ${nextParam(state, `%${rule.value}%`)}`;\n\n case Operator.startsWith:\n return `${field} LIKE ${nextParam(state, `${rule.value}%`)}`;\n\n case Operator.endsWith:\n return `${field} LIKE ${nextParam(state, `%${rule.value}`)}`;\n\n case Operator.matches:\n return `${field} ~ ${nextParam(state, rule.value)}`;\n\n case Operator.notMatches:\n return `${field} !~ ${nextParam(state, rule.value)}`;\n\n case Operator.between:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('between operator requires an array of two values');\n }\n return `${field} BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case Operator.notBetween:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('notBetween operator requires an array of two values');\n }\n return `${field} NOT BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\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","import type { DateRule } from '../types';\nimport { DateOperator } from '../operator';\nimport type { BuilderState } from './types';\nimport { nextParam, quoteField, mapDayNames } from './utils';\n\nexport const buildDateRule = (rule: DateRule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.dateOperator) {\n case DateOperator.before:\n return `${field} < ${nextParam(state, rule.value)}`;\n\n case DateOperator.after:\n return `${field} > ${nextParam(state, rule.value)}`;\n\n case DateOperator.onOrBefore:\n return `${field} <= ${nextParam(state, rule.value)}`;\n\n case DateOperator.onOrAfter:\n return `${field} >= ${nextParam(state, rule.value)}`;\n\n case DateOperator.between:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('between date operator requires an array of two values');\n }\n return `${field} BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case DateOperator.notBetween:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('notBetween date operator requires an array of two values');\n }\n return `${field} NOT BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case DateOperator.dayIn:\n const daysIn = mapDayNames(rule.value);\n return `EXTRACT(DOW FROM ${field}) = ANY(${nextParam(state, daysIn)})`;\n\n case DateOperator.dayNotIn:\n const daysNotIn = mapDayNames(rule.value);\n return `EXTRACT(DOW FROM ${field}) <> ALL(${nextParam(state, daysNotIn)})`;\n\n default:\n throw new Error(`Unknown date operator: ${(rule as DateRule).dateOperator}`);\n }\n};\n","import type { ArrayRule } from '../types';\nimport { ArrayOperator } from '../operator';\nimport type { BuilderState } from './types';\nimport { quoteField } from './utils';\n\nexport const buildArrayRule = (rule: ArrayRule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.arrayOperator) {\n case ArrayOperator.empty:\n return `(${field} IS NULL OR jsonb_array_length(${field}) = 0)`;\n\n case ArrayOperator.notEmpty:\n return `(${field} IS NOT NULL AND jsonb_array_length(${field}) > 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","import type { All, Any, IfThenElse, Condition } 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 type { BuilderState } from './types';\nimport { buildFieldRule } from './field';\nimport { buildDateRule } from './date';\nimport { buildArrayRule } from './array';\nimport { buildAll, buildAny, buildIfThenElse, setConditionBuilder } from './logical';\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 type { SqlResult, BuilderState } from './types';\nimport { buildCondition } from './condition';\n\nexport type { SqlResult } from './types';\n\n/**\n * Convert a json-rules Condition to a PostgreSQL WHERE clause.\n *\n * @param condition - The rule condition to convert\n * @returns Object with `sql` (WHERE clause fragment) and `params` array\n *\n * @example\n * ```typescript\n * import { toSql, Operator } from '@inixiative/json-rules';\n *\n * const rule = { field: 'status', operator: Operator.equals, value: 'active' };\n * const { sql, params } = toSql(rule);\n * // sql: '\"status\" = $1'\n * // params: ['active']\n *\n * // Complex rule\n * const rule2 = {\n * all: [\n * { field: 'deletedAt', operator: Operator.equals, value: null },\n * { field: 'status', operator: Operator.in, value: ['active', 'pending'] }\n * ]\n * };\n * const { sql: sql2, params: params2 } = toSql(rule2);\n * // sql: '(\"deletedAt\" IS NULL AND \"status\" = ANY($1))'\n * // params: [['active', 'pending']]\n * ```\n */\nexport const toSql = (condition: Condition): SqlResult => {\n const state: BuilderState = { params: [], paramIndex: 0 };\n const sql = buildCondition(condition, state);\n return { sql, params: state.params };\n};\n"]}
1
+ {"version":3,"sources":["../src/operator.ts","../src/date.ts","../src/field.ts","../src/check.ts","../src/toSql/utils.ts","../src/toSql/field.ts","../src/toSql/date.ts","../src/toSql/array.ts","../src/toSql/logical.ts","../src/toSql/condition.ts","../src/toSql/index.ts"],"names":["Operator","ArrayOperator","DateOperator","dayjs","utc","timezone","isSameOrBefore","isSameOrAfter","checkDate","condition","data","context","fieldValue","get","fieldDate","getError","op","dates","parseCompareDates","compareDate","endDate","dayName","allowedDays","d","day","excludedDays","startDate","parseDateWithTimezone","value","date","valueStr","fieldStr","offset","match","checkField","needsValue","getValue","isEmpty","check","conditions","all","any","checkArray","checkIfThenElse","error","errors","result","arrayValue","defaultMsg","requiresCondition","requiresCount","matches","failures","some","isObject","results","item","r","nextParam","state","escapeLikePattern","quoteField","field","parts","escapeIdentifier","column","jsonPath","escapeJsonKey","key","pathParts","leaf","mapDayNames","days","dayMap","num","buildFieldRule","rule","buildDateRule","buildArrayRule","isNative","lengthFn","buildCondition","setConditionBuilder","fn","buildAll","c","buildAny","buildIfThenElse","cond","ifClause","thenClause","elseClause","toSql"],"mappings":"gQAAO,IAAKA,CAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,MAAA,CAAS,QAAA,CACTA,EAAA,SAAA,CAAY,WAAA,CACZA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,CAAAA,CAAA,cAAA,CAAiB,gBAAA,CACjBA,EAAA,WAAA,CAAc,aAAA,CACdA,CAAAA,CAAA,iBAAA,CAAoB,mBAAA,CACpBA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,EAAA,WAAA,CAAc,aAAA,CACdA,CAAAA,CAAA,EAAA,CAAK,KACLA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,CAAAA,CAAA,QAAU,SAAA,CACVA,CAAAA,CAAA,UAAA,CAAa,YAAA,CACbA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,WAAa,YAAA,CACbA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,QAAA,CAAW,UAAA,CACXA,CAAAA,CAAA,OAAS,QAAA,CACTA,CAAAA,CAAA,SAAA,CAAY,WAAA,CACZA,CAAAA,CAAA,UAAA,CAAa,YAAA,CACbA,CAAAA,CAAA,SAAW,UAAA,CApBDA,CAAAA,CAAAA,EAAAA,CAAAA,EAAA,EAAA,CAAA,CAuBAC,CAAAA,CAAAA,CAAAA,CAAAA,GACVA,EAAA,GAAA,CAAM,KAAA,CACNA,CAAAA,CAAA,GAAA,CAAM,MACNA,CAAAA,CAAA,IAAA,CAAO,MAAA,CACPA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,MAAA,CAAS,SACTA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,CAAAA,CAAA,QAAA,CAAW,WARDA,CAAAA,CAAAA,EAAAA,CAAAA,EAAA,EAAA,CAAA,CAWAC,CAAAA,CAAAA,CAAAA,CAAAA,GACVA,CAAAA,CAAA,MAAA,CAAS,QAAA,CACTA,CAAAA,CAAA,KAAA,CAAQ,QACRA,CAAAA,CAAA,UAAA,CAAa,YAAA,CACbA,CAAAA,CAAA,UAAY,WAAA,CACZA,CAAAA,CAAA,OAAA,CAAU,SAAA,CACVA,EAAA,UAAA,CAAa,YAAA,CACbA,CAAAA,CAAA,KAAA,CAAQ,OAAA,CACRA,CAAAA,CAAA,QAAA,CAAW,UAAA,CARDA,OAAA,EAAA,ECzBZC,CAAAA,CAAM,MAAA,CAAOC,CAAG,CAAA,CAChBD,CAAAA,CAAM,MAAA,CAAOE,CAAQ,CAAA,CACrBF,EAAM,MAAA,CAAOG,CAAc,CAAA,CAC3BH,CAAAA,CAAM,MAAA,CAAOI,CAAa,CAAA,CAEnB,IAAMC,EAAY,CAACC,CAAAA,CAAqBC,CAAAA,CAAWC,CAAAA,GAAmC,CAC3F,IAAMC,CAAAA,CAAaC,GAAAA,CAAIH,EAAMD,CAAAA,CAAU,KAAK,CAAA,CAE5C,GAAI,CAACG,CAAAA,CAAY,MAAM,IAAI,KAAA,CAAM,GAAGH,CAAAA,CAAU,KAAK,CAAA,qBAAA,CAAuB,CAAA,CAE1E,IAAMK,CAAAA,CAAYX,CAAAA,CAAMS,CAAU,EAElC,GAAI,CAACE,CAAAA,CAAU,OAAA,EAAQ,CAAG,MAAM,IAAI,KAAA,CAAM,GAAGL,CAAAA,CAAU,KAAK,CAAA,sBAAA,EAAyBG,CAAU,CAAA,CAAE,CAAA,CAEjG,IAAMG,CAAAA,CAAYC,GAAeP,CAAAA,CAAU,KAAA,EAAS,CAAA,EAAGA,CAAAA,CAAU,KAAK,CAAA,CAAA,EAAIO,CAAE,CAAA,CAAA,CAGtEC,CAAAA,CAAQC,EAAkBT,CAAAA,CAAWC,CAAAA,CAAMC,CAAAA,CAASG,CAAAA,CAAWF,CAAU,CAAA,CACzEO,CAAAA,CAAcF,CAAAA,CAAM,CAAC,CAAA,CACrBG,CAAAA,CAAUH,CAAAA,CAAM,CAAC,CAAA,CAEvB,OAAQR,CAAAA,CAAU,YAAA,EAChB,KAAA,QAAA,CACE,OAAOK,CAAAA,CAAU,QAAA,CAASK,CAAW,CAAA,EAAKJ,CAAAA,CAAS,CAAA,eAAA,EAAkBI,EAAY,MAAA,EAAQ,CAAA,CAAE,CAAA,CAE7F,aACE,OAAOL,CAAAA,CAAU,OAAA,CAAQK,CAAW,GAAKJ,CAAAA,CAAS,CAAA,cAAA,EAAiBI,CAAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,CAAA,CAE3F,KAAA,YAAA,CACE,OAAOL,CAAAA,CAAU,cAAA,CAAeK,CAAW,CAAA,EAAKJ,EAAS,CAAA,qBAAA,EAAwBI,CAAAA,CAAY,MAAA,EAAQ,EAAE,CAAA,CAEzG,KAAA,WAAA,CACE,OAAOL,CAAAA,CAAU,aAAA,CAAcK,CAAW,CAAA,EAAKJ,CAAAA,CAAS,uBAAuBI,CAAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,EAEvG,KAAA,SAAA,CACE,OAAQL,CAAAA,CAAU,aAAA,CAAcK,CAAW,CAAA,EAAKL,CAAAA,CAAU,cAAA,CAAeM,CAAQ,CAAA,EAC/EL,CAAAA,CAAS,CAAA,gBAAA,EAAmBI,CAAAA,CAAY,QAAQ,CAAA,KAAA,EAAQC,CAAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,CAAA,CAE/E,KAAA,YAAA,CACE,OAAQN,CAAAA,CAAU,QAAA,CAASK,CAAW,CAAA,EAAKL,CAAAA,CAAU,OAAA,CAAQM,CAAQ,CAAA,EACnEL,EAAS,CAAA,oBAAA,EAAuBI,CAAAA,CAAY,MAAA,EAAQ,QAAQC,CAAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,EAEnF,KAAA,OAAA,CACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQX,CAAAA,CAAU,KAAK,CAAA,CAAG,MAAM,IAAI,KAAA,CAAM,+CAA+C,CAAA,CACpG,IAAMY,CAAAA,CAAUP,CAAAA,CAAU,MAAA,CAAO,MAAM,CAAA,CAAE,WAAA,EAAY,CAC/CQ,CAAAA,CAAcb,CAAAA,CAAU,KAAA,CAAM,GAAA,CAAIc,CAAAA,EAAKA,EAAE,WAAA,EAAa,CAAA,CAC5D,OAAOD,EAAY,QAAA,CAASD,CAAO,CAAA,EAAKN,CAAAA,CAAS,cAAcO,CAAAA,CAAY,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,CAAA,CAE3F,KAAA,UAAA,CACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQb,CAAAA,CAAU,KAAK,CAAA,CAAG,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CACvG,IAAMe,CAAAA,CAAMV,CAAAA,CAAU,MAAA,CAAO,MAAM,CAAA,CAAE,WAAA,GAC/BW,CAAAA,CAAehB,CAAAA,CAAU,KAAA,CAAM,GAAA,CAAIc,GAAKA,CAAAA,CAAE,WAAA,EAAa,CAAA,CAC7D,OAAO,CAACE,CAAAA,CAAa,QAAA,CAASD,CAAG,CAAA,EAAKT,CAAAA,CAAS,CAAA,eAAA,EAAkBU,CAAAA,CAAa,KAAK,MAAM,CAAC,CAAA,CAAE,CAAA,CAE9F,QACE,MAAM,IAAI,KAAA,CAAM,uBAAuB,CAC3C,CACF,CAAA,CAEMP,CAAAA,CAAoB,CAACT,CAAAA,CAAqBC,CAAAA,CAAWC,CAAAA,CAAcG,EAAwBF,CAAAA,GAA+D,CAG9J,GAFyB,CAAA,SAAA,CAAA,YAA8C,EAElD,QAAA,CAASH,CAAAA,CAAU,YAAY,CAAA,CAAG,CACrD,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAU,KAAK,CAAA,EAAKA,CAAAA,CAAU,MAAM,MAAA,GAAW,CAAA,CAChE,MAAM,IAAI,KAAA,CAAM,CAAA,EAAGA,CAAAA,CAAU,YAAY,0CAA0C,CAAA,CACrF,IAAMiB,CAAAA,CAAYC,CAAAA,CAAsBlB,CAAAA,CAAU,KAAA,CAAM,CAAC,CAAA,CAAGG,CAAU,CAAA,CAChEQ,CAAAA,CAAUO,CAAAA,CAAsBlB,CAAAA,CAAU,MAAM,CAAC,CAAA,CAAGG,CAAU,CAAA,CACpE,GAAI,CAACc,CAAAA,CAAU,OAAA,EAAQ,CAAG,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuBjB,EAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAA,CACrF,GAAI,CAACW,CAAAA,CAAQ,SAAQ,CAAG,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqBX,CAAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,CAAA,CACjF,OAAO,CAACiB,EAAWN,CAAO,CAC5B,CASA,GAPwB,0CAKxB,CAAA,CAEoB,QAAA,CAASX,CAAAA,CAAU,YAAY,CAAA,CAAG,CACpD,IAAImB,CAAAA,CACJ,GAAInB,CAAAA,CAAU,KAAA,GAAU,MAAA,CACtBmB,CAAAA,CAAQnB,CAAAA,CAAU,KAAA,CAAA,KAAA,GACTA,CAAAA,CAAU,IAAA,CAEfA,EAAU,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAChCmB,CAAAA,CAAQf,GAAAA,CAAIH,CAAAA,CAAMD,CAAAA,CAAU,KAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAE7CmB,EAAQf,GAAAA,CAAIF,CAAAA,CAASF,CAAAA,CAAU,IAAI,OAGrC,MAAM,IAAI,KAAA,CAAM,gDAAgD,CAAA,CAElE,IAAMoB,CAAAA,CAAOF,CAAAA,CAAsBC,EAAOhB,CAAU,CAAA,CACpD,GAAI,CAACiB,EAAK,OAAA,EAAQ,CAAG,MAAM,IAAI,MAAM,CAAA,yBAAA,EAA4BD,CAAK,CAAA,CAAE,CAAA,CACxE,OAAO,CAACC,CAAAA,CAAM,MAAS,CACzB,CAEA,OAAO,CAAC1B,CAAAA,GAAS,MAAS,CAC5B,CAAA,CAEMwB,CAAAA,CAAwB,CAACC,CAAAA,CAAYhB,CAAAA,GAAoC,CAC7E,IAAMkB,CAAAA,CAAW,MAAA,CAAOF,CAAK,CAAA,CAM7B,GAHoBE,CAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EACtCA,CAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAAMA,EAAS,QAAA,CAAS,GAAG,CAAA,EAAKA,CAAAA,CAAS,KAAA,CAAM,YAAY,CAAA,CAAA,CAElE,OAAO3B,EAAMyB,CAAK,CAAA,CAInC,IAAMG,CAAAA,CAAW,OAAOnB,CAAU,CAAA,CAC9BoB,CAAAA,CAAS,CAAA,CAEb,GAAID,CAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAMA,CAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAKA,EAAS,KAAA,CAAM,YAAY,CAAA,CAAI,CAEtF,IAAME,CAAAA,CAAQF,CAAAA,CAAS,KAAA,CAAM,uBAAuB,CAAA,CAChDE,CAAAA,GAEFD,CAAAA,CAAAA,CADaC,CAAAA,CAAM,CAAC,CAAA,GAAM,GAAA,CAAM,CAAA,CAAI,KACnB,QAAA,CAASA,CAAAA,CAAM,CAAC,CAAC,EAAI,EAAA,CAAK,QAAA,CAASA,CAAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAEhE,CAAA,KAAYF,CAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAE/BC,CAAAA,CAAS,CAAA,CAAA,CAKX,OAAIF,CAAAA,CAAS,KAAA,CAAM,qBAAqB,CAAA,CAEhB3B,CAAAA,CAAMyB,CAAAA,CAAQ,WAAW,CAAA,CAC1B,SAASI,CAAAA,CAAQ,QAAQ,CAAA,CAI9B7B,CAAAA,CAAMyB,CAAK,CAAA,CACZ,QAAA,CAASI,CAAAA,CAAQ,QAAQ,CAC5C,CAAA,CC/IO,IAAME,EAAa,CAACzB,CAAAA,CAAiBC,CAAAA,CAAWC,CAAAA,GAAmC,CAExF,IAAMC,CAAAA,CAAaC,GAAAA,CAAIH,EAAMD,CAAAA,CAAU,KAAK,CAAA,CAItC0B,CAAAA,CAAa,CADA,CAAA,SAAA,CAAA,UAAA,CAAA,QAAA,CAAA,WAAyE,CAAA,CAC7D,QAAA,CAAS1B,EAAU,QAAQ,CAAA,CACpDmB,CAAAA,CAAQO,CAAAA,CAAaC,CAAAA,CAAS3B,CAAAA,CAAWC,CAAAA,CAAMC,CAAO,EAAI,MAAA,CAE1DI,CAAAA,CAAYC,CAAAA,EAAeP,CAAAA,CAAU,OAAS,CAAA,EAAGA,CAAAA,CAAU,KAAK,CAAA,CAAA,EAAIO,CAAE,CAAA,EAAGmB,CAAAA,CAAa,GAAA,CAAM,IAAA,CAAK,SAAA,CAAUP,CAAK,CAAA,CAAI,EAAE,GAE5H,OAAQnB,CAAAA,CAAU,QAAA,EAChB,KAAA,QAAA,CACE,OAAOG,CAAAA,GAAegB,CAAAA,EAASb,EAAS,YAAY,CAAA,CACtD,KAAA,WAAA,CACE,OAAOH,CAAAA,GAAegB,CAAAA,EAASb,CAAAA,CAAS,gBAAgB,EAC1D,KAAA,UAAA,CACE,OAAOH,CAAAA,CAAagB,CAAAA,EAASb,EAAS,mBAAmB,CAAA,CAC3D,KAAA,gBAAA,CACE,OAAOH,GAAcgB,CAAAA,EAASb,CAAAA,CAAS,+BAA+B,CAAA,CACxE,KAAA,aAAA,CACE,OAAOH,CAAAA,CAAagB,CAAAA,EAASb,EAAS,sBAAsB,CAAA,CAC9D,KAAA,mBAAA,CACE,OAAOH,CAAAA,EAAcgB,CAAAA,EAASb,CAAAA,CAAS,kCAAkC,EAC3E,KAAA,IAAA,CACE,OAAOa,CAAAA,EAAO,QAAA,CAAShB,CAAU,CAAA,EAAKG,CAAAA,CAAS,gBAAgB,EACjE,KAAA,OAAA,CACE,OAAO,CAACa,CAAAA,EAAO,SAAShB,CAAU,CAAA,EAAKG,CAAAA,CAAS,oBAAoB,EACtE,KAAA,UAAA,CACE,OAAOH,CAAAA,EAAY,QAAA,CAASgB,CAAK,CAAA,EAAKb,CAAAA,CAAS,cAAc,EAC/D,KAAA,aAAA,CACE,OAAO,CAACH,CAAAA,EAAY,QAAA,CAASgB,CAAK,CAAA,EAAKb,CAAAA,CAAS,kBAAkB,CAAA,CACpE,KAAA,SAAA,CACE,OAAO,CAAC,CAACH,CAAAA,EAAY,KAAA,CAAMgB,CAAK,GAAKb,CAAAA,CAAS,oBAAoB,CAAA,CACpE,KAAA,YAAA,CACE,OAAO,CAACH,CAAAA,EAAY,KAAA,CAAMgB,CAAK,GAAKb,CAAAA,CAAS,wBAAwB,CAAA,CACvE,KAAA,SAAA,CACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQa,CAAK,CAAA,EAAKA,CAAAA,CAAM,MAAA,GAAW,CAAA,CAC5C,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CACpE,OAAQhB,CAAAA,EAAcgB,CAAAA,CAAM,CAAC,CAAA,EAAKhB,CAAAA,EAAcgB,CAAAA,CAAM,CAAC,CAAA,EAAMb,EAAS,iBAAiB,CAAA,CACzF,KAAA,YAAA,CACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQa,CAAK,CAAA,EAAKA,EAAM,MAAA,GAAW,CAAA,CAC5C,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CACvE,OAAQhB,EAAagB,CAAAA,CAAM,CAAC,CAAA,EAAKhB,CAAAA,CAAagB,CAAAA,CAAM,CAAC,CAAA,EAAMb,CAAAA,CAAS,qBAAqB,CAAA,CAC3F,KAAA,SAAA,CACE,OAAOsB,OAAAA,CAAQzB,CAAU,CAAA,EAAKG,CAAAA,CAAS,eAAe,EACxD,KAAA,UAAA,CACE,OAAO,CAACsB,OAAAA,CAAQzB,CAAU,CAAA,EAAKG,CAAAA,CAAS,mBAAmB,CAAA,CAC7D,cACE,OAAOH,CAAAA,GAAe,MAAA,EAAaG,CAAAA,CAAS,YAAY,CAAA,CAC1D,KAAA,WAAA,CACE,OAAOH,IAAe,MAAA,EAAaG,CAAAA,CAAS,gBAAgB,CAAA,CAC9D,KAAA,YAAA,CACE,OAAOH,CAAAA,EAAY,UAAA,GAAagB,CAAK,CAAA,EAAKb,CAAAA,CAAS,iBAAiB,CAAA,CACtE,KAAA,UAAA,CACE,OAAOH,CAAAA,EAAY,QAAA,GAAWgB,CAAK,CAAA,EAAKb,CAAAA,CAAS,eAAe,CAAA,CAClE,QACE,MAAM,IAAI,KAAA,CAAM,kBAAkB,CACtC,CACF,CAAA,CAEMqB,CAAAA,CAAW,CAAC3B,CAAAA,CAAiBC,CAAAA,CAAWC,CAAAA,GAAsB,CAClE,GAAIF,CAAAA,CAAU,KAAA,GAAU,MAAA,CAAW,OAAOA,CAAAA,CAAU,KAAA,CACpD,GAAIA,CAAAA,CAAU,KAEZ,OAAIA,CAAAA,CAAU,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CACzBI,GAAAA,CAAIH,CAAAA,CAAMD,EAAU,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,EAGvCI,GAAAA,CAAIF,CAAAA,CAASF,CAAAA,CAAU,IAAI,EAEpC,MAAM,IAAI,KAAA,CAAM,4BAA4B,CAC9C,CAAA,CCtEO,IAAM6B,CAAAA,CAAQ,CAACC,CAAAA,CAAuB7B,CAAAA,CAAWC,CAAAA,CAAeD,CAAAA,GACjE,OAAO6B,CAAAA,EAAe,SAAA,CAAkBA,CAAAA,CACxC,KAAA,GAASA,EAAmBC,CAAAA,CAAID,CAAAA,CAAW,GAAA,CAAK7B,CAAAA,CAAMC,CAAAA,CAAS4B,CAAAA,CAAW,KAAK,CAAA,CAC/E,QAASA,CAAAA,CAAmBE,CAAAA,CAAIF,CAAAA,CAAW,GAAA,CAAK7B,EAAMC,CAAAA,CAAS4B,CAAAA,CAAW,KAAK,CAAA,CAC/E,kBAAmBA,CAAAA,CAAmBG,CAAAA,CAAWH,CAAAA,CAAY7B,CAAAA,CAAMC,CAAO,CAAA,CAC1E,cAAA,GAAkB4B,CAAAA,CAAmB/B,EAAU+B,CAAAA,CAAY7B,CAAAA,CAAMC,CAAO,CAAA,CACxE,OAAA,GAAW4B,CAAAA,CAAmBL,CAAAA,CAAWK,CAAAA,CAAY7B,EAAMC,CAAO,CAAA,CAClE,IAAA,GAAQ4B,CAAAA,CAAmBI,CAAAA,CAAgBJ,CAAAA,CAAY7B,CAAAA,CAAMC,CAAO,EAEjE,KAAA,CAGH6B,CAAAA,CAAM,CAACD,CAAAA,CAAyB7B,EAAWC,CAAAA,CAAciC,CAAAA,GAAqC,CAClG,IAAMC,EAAmB,EAAC,CAE1B,IAAA,IAAWpC,CAAAA,IAAa8B,CAAAA,CAAY,CAClC,IAAMO,CAAAA,CAASR,EAAM7B,CAAAA,CAAWC,CAAAA,CAAMC,CAAO,CAAA,CACzCmC,CAAAA,GAAW,IAAA,GAET,OAAOA,CAAAA,EAAW,SACpBD,CAAAA,CAAO,IAAA,CAAKC,CAAM,CAAA,CAGlBD,CAAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAGzB,CAEA,OAAKA,CAAAA,CAAO,MAAA,CACRD,CAAAA,GACAC,EAAO,MAAA,GAAW,CAAA,CAAUA,CAAAA,CAAO,CAAC,EACjC,CAAA,0BAAA,EAA6BA,CAAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAA,CAH7B,IAI7B,CAAA,CAEMJ,EAAM,CAACF,CAAAA,CAAyB7B,CAAAA,CAAWC,CAAAA,CAAciC,CAAAA,GAAqC,CAClG,IAAMC,CAAAA,CAAmB,EAAC,CAE1B,IAAA,IAAWpC,CAAAA,IAAa8B,CAAAA,CAAY,CAClC,IAAMO,CAAAA,CAASR,CAAAA,CAAM7B,EAAWC,CAAAA,CAAMC,CAAO,CAAA,CAC7C,GAAI,OAAOmC,CAAAA,EAAW,QAAA,CAAU,OAAO,KAAA,CACvCD,EAAO,IAAA,CAAKC,CAAM,EACpB,CAEA,OAAIF,CAAAA,GACAC,CAAAA,CAAO,MAAA,GAAW,EAAUA,CAAAA,CAAO,CAAC,CAAA,CACjC,CAAA,kCAAA,EAAqCA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CACjE,EAEMF,CAAAA,CAAkB,CAAClC,CAAAA,CAAgBC,CAAAA,CAAWC,CAAAA,GACjC2B,CAAAA,CAAM7B,CAAAA,CAAU,EAAA,CAAIC,EAAMC,CAAO,CAAA,GAEjC,IAAA,CAAa2B,CAAAA,CAAM7B,EAAU,IAAA,CAAMC,CAAAA,CAAMC,CAAO,CAAA,CAC1DF,EAAU,IAAA,CAAO6B,CAAAA,CAAM7B,CAAAA,CAAU,IAAA,CAAMC,CAAAA,CAAMC,CAAO,CAAA,CAAI,IAAA,CAG3D+B,EAAa,CAACjC,CAAAA,CAAsBC,CAAAA,CAAWC,CAAAA,GAAmC,CACtF,IAAMoC,CAAAA,CAAalC,GAAAA,CAAIF,EAASF,CAAAA,CAAU,KAAK,CAAA,CAE/C,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQsC,CAAU,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,EAAGtC,EAAU,KAAK,CAAA,iBAAA,CAAmB,CAAA,CAErF,IAAMM,EAAYiC,CAAAA,EAAuBvC,CAAAA,CAAU,KAAA,EAAS,CAAA,EAAGA,CAAAA,CAAU,KAAK,CAAA,CAAA,EAAIuC,CAAU,GAGtFC,CAAAA,CAAoB,CAAA,KAAA,CAAA,KAAA,CAAA,MAAA,CAAA,SAAA,CAAA,QAAA,CAAA,SAO1B,CAAA,CAGMC,CAAAA,CAAgB,CAAA,SAAA,CAAA,QAAA,CAAA,SAItB,CAAA,CAEA,GAAID,CAAAA,CAAkB,SAASxC,CAAAA,CAAU,aAAa,CAAA,EAAK,CAACA,CAAAA,CAAU,SAAA,CACpE,MAAM,IAAI,MAAM,CAAA,EAAGA,CAAAA,CAAU,aAAa,CAAA,qDAAA,CAAuD,EAEnG,GAAIyC,CAAAA,CAAc,QAAA,CAASzC,CAAAA,CAAU,aAAa,CAAA,EAAKA,CAAAA,CAAU,KAAA,GAAU,MAAA,CACzE,MAAM,IAAI,KAAA,CAAM,CAAA,EAAGA,EAAU,aAAa,CAAA,iBAAA,CAAmB,CAAA,CAG/D,IAAI0C,CAAAA,CAAU,CAAA,CACVC,CAAAA,CAAW,CAAA,CAEf,GAAIH,CAAAA,CAAkB,QAAA,CAASxC,CAAAA,CAAU,aAAa,CAAA,CAAG,CAEvD,GAAI,CAAC4C,KAAKN,CAAAA,CAAYO,QAAQ,CAAA,CAC5B,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG7C,CAAAA,CAAU,KAAK,mHAAmH,CAAA,CAGvJ,IAAM8C,CAAAA,CAAUR,CAAAA,CAAW,GAAA,CAAIS,CAAAA,EAAQlB,CAAAA,CAAM7B,CAAAA,CAAU,UAAY+C,CAAAA,CAAM7C,CAAO,CAAC,CAAA,CACjFwC,CAAAA,CAAUI,CAAAA,CAAQ,MAAA,CAAOE,CAAAA,EAAKA,IAAM,IAAI,CAAA,CAAE,MAAA,CAC1CL,CAAAA,CAAWG,CAAAA,CAAQ,MAAA,CAAOE,CAAAA,EAAK,OAAOA,GAAM,QAAQ,CAAA,CAAE,OACxD,CAEA,OAAQhD,CAAAA,CAAU,aAAA,EAChB,KAAA,OAAA,CACE,OAAO,CAACsC,CAAAA,CAAW,MAAA,EAAUhC,CAAAA,CAAS,eAAe,CAAA,CAEvD,KAAA,UAAA,CACE,OAAO,CAAC,CAACgC,CAAAA,CAAW,MAAA,EAAUhC,CAAAA,CAAS,mBAAmB,CAAA,CAE5D,KAAA,KAAA,CACE,OAAOoC,IAAYJ,CAAAA,CAAW,MAAA,EAAUhC,CAAAA,CAAS,CAAA,yBAAA,EAA4BqC,CAAQ,CAAA,QAAA,CAAU,CAAA,CAEjG,KAAA,KAAA,CACE,OAAO,CAAC,CAACD,CAAAA,EAAWpC,CAAAA,CAAS,iCAAiC,CAAA,CAEhE,KAAA,MAAA,CACE,OAAO,CAACoC,GAAWpC,CAAAA,CAAS,CAAA,0BAAA,EAA6BoC,CAAO,CAAA,SAAA,CAAW,CAAA,CAE7E,KAAA,SAAA,CACE,OAAOA,CAAAA,EAAW1C,EAAU,KAAA,EAAUM,CAAAA,CAAS,CAAA,SAAA,EAAYN,CAAAA,CAAU,KAAK,CAAA,sBAAA,EAAyB0C,CAAO,CAAA,SAAA,CAAW,EAEvH,KAAA,QAAA,CACE,OAAOA,CAAAA,EAAW1C,CAAAA,CAAU,KAAA,EAAUM,CAAAA,CAAS,CAAA,QAAA,EAAWN,CAAAA,CAAU,KAAK,CAAA,sBAAA,EAAyB0C,CAAO,CAAA,SAAA,CAAW,CAAA,CAEtH,eACE,OAAOA,CAAAA,GAAY1C,CAAAA,CAAU,KAAA,EAAUM,EAAS,CAAA,QAAA,EAAWN,CAAAA,CAAU,KAAK,CAAA,sBAAA,EAAyB0C,CAAO,CAAA,SAAA,CAAW,CAAA,CAEvH,QACE,MAAM,IAAI,KAAA,CAAM,wBAAwB,CAC5C,CACF,ECnIO,IAAMO,CAAAA,CAAY,CAACC,CAAAA,CAAqB/B,CAAAA,IAC7C+B,CAAAA,CAAM,MAAA,CAAO,KAAK/B,CAAK,CAAA,CAChB,CAAA,CAAA,EAAI,EAAE+B,EAAM,UAAU,CAAA,CAAA,CAAA,CAOlBC,CAAAA,CAAqBhC,CAAAA,EACzBA,EACJ,OAAA,CAAQ,KAAA,CAAO,MAAM,CAAA,CACrB,OAAA,CAAQ,IAAA,CAAM,KAAK,CAAA,CACnB,QAAQ,IAAA,CAAM,KAAK,CAAA,CAYXiC,CAAAA,CAAcC,GAA0B,CACnD,IAAMC,CAAAA,CAAQD,CAAAA,CAAM,MAAM,GAAG,CAAA,CAC7B,GAAIC,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,OAAOC,gBAAAA,CAAiBF,CAAK,CAAA,CAErD,GAAM,CAACG,CAAAA,CAAQ,GAAGC,CAAQ,CAAA,CAAIH,CAAAA,CAC9B,GAAIG,EAAS,MAAA,GAAW,CAAA,CAAG,OAAOF,gBAAAA,CAAiBC,CAAM,CAAA,CAIzD,IAAME,CAAAA,CAAiBC,GAAgB,CAAA,CAAA,EAAIA,CAAAA,CAAI,OAAA,CAAQ,IAAA,CAAM,IAAI,CAAC,CAAA,CAAA,CAAA,CAE5DC,CAAAA,CAAYH,EAAS,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAAE,GAAA,CAAIC,CAAa,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAC9DG,CAAAA,CAAOH,CAAAA,CAAcD,CAAAA,CAASA,EAAS,MAAA,CAAS,CAAC,CAAC,CAAA,CAExD,OAAIG,CAAAA,CACK,CAAA,EAAGL,gBAAAA,CAAiBC,CAAM,CAAC,CAAA,EAAA,EAAKI,CAAS,CAAA,GAAA,EAAMC,CAAI,CAAA,CAAA,CAErD,CAAA,EAAGN,gBAAAA,CAAiBC,CAAM,CAAC,CAAA,GAAA,EAAMK,CAAI,CAAA,CAC9C,EAEaC,CAAAA,CAAeC,CAAAA,EAA6B,CACvD,IAAMC,CAAAA,CAAiC,CACrC,MAAA,CAAQ,CAAA,CAAG,OAAQ,CAAA,CAAG,OAAA,CAAS,CAAA,CAAG,SAAA,CAAW,EAC7C,QAAA,CAAU,CAAA,CAAG,MAAA,CAAQ,CAAA,CAAG,SAAU,CACpC,CAAA,CACA,OAAOD,CAAAA,CAAK,GAAA,CAAKjD,CAAAA,EAAM,CACrB,IAAMmD,EAAMD,CAAAA,CAAOlD,CAAAA,CAAE,WAAA,EAAa,CAAA,CAClC,GAAImD,CAAAA,GAAQ,MAAA,CAAW,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqBnD,CAAC,CAAA,CAAE,CAAA,CAC/D,OAAOmD,CACT,CAAC,CACH,CAAA,CCrDO,IAAMC,CAAAA,CAAiB,CAACC,CAAAA,CAAYjB,CAAAA,GAAgC,CACzE,IAAMG,EAAQD,CAAAA,CAAWe,CAAAA,CAAK,KAAK,CAAA,CAEnC,OAAQA,CAAAA,CAAK,QAAA,EACX,cACE,OAAIA,CAAAA,CAAK,KAAA,GAAU,IAAA,CAAa,GAAGd,CAAK,CAAA,QAAA,CAAA,CACjC,CAAA,EAAGA,CAAK,MAAMJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEnD,KAAA,WAAA,CACE,OAAIA,EAAK,KAAA,GAAU,IAAA,CAAa,CAAA,EAAGd,CAAK,eACjC,CAAA,EAAGA,CAAK,CAAA,IAAA,EAAOJ,CAAAA,CAAUC,EAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,UAAA,CACE,OAAO,CAAA,EAAGd,CAAK,MAAMJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEnD,KAAA,gBAAA,CACE,OAAO,GAAGd,CAAK,CAAA,IAAA,EAAOJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,mBACE,OAAO,CAAA,EAAGd,CAAK,CAAA,GAAA,EAAMJ,EAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,GAEnD,KAAA,mBAAA,CACE,OAAO,CAAA,EAAGd,CAAK,CAAA,IAAA,EAAOJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,IAAA,CACE,OAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAM,MAAA,GAAW,CAAA,CAAU,OAAA,CAC3D,CAAA,EAAGd,CAAK,UAAUJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA,CAEvD,KAAA,OAAA,CACE,OAAI,CAAC,MAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAM,MAAA,GAAW,CAAA,CAAU,OAC3D,CAAA,EAAGd,CAAK,CAAA,QAAA,EAAWJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,IAExD,KAAA,UAAA,CACE,OAAO,CAAA,EAAGd,CAAK,CAAA,MAAA,EAASJ,CAAAA,CAAUC,CAAAA,CAAO,CAAA,CAAA,EAAIC,EAAkB,MAAA,CAAOgB,CAAAA,CAAK,KAAK,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAExF,KAAA,aAAA,CACE,OAAO,CAAA,EAAGd,CAAK,CAAA,UAAA,EAAaJ,CAAAA,CAAUC,CAAAA,CAAO,CAAA,CAAA,EAAIC,CAAAA,CAAkB,MAAA,CAAOgB,EAAK,KAAK,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAE5F,KAAA,YAAA,CACE,OAAO,CAAA,EAAGd,CAAK,CAAA,MAAA,EAASJ,CAAAA,CAAUC,CAAAA,CAAO,CAAA,EAAGC,CAAAA,CAAkB,MAAA,CAAOgB,CAAAA,CAAK,KAAK,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAEvF,gBACE,OAAO,CAAA,EAAGd,CAAK,CAAA,MAAA,EAASJ,EAAUC,CAAAA,CAAO,CAAA,CAAA,EAAIC,CAAAA,CAAkB,MAAA,CAAOgB,CAAAA,CAAK,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA,CAAA,CAEvF,KAAA,SAAA,CACE,OAAO,CAAA,EAAGd,CAAK,CAAA,GAAA,EAAMJ,CAAAA,CAAUC,EAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEnD,KAAA,YAAA,CACE,OAAO,CAAA,EAAGd,CAAK,OAAOJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,SAAA,CACE,GAAI,CAAC,MAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAM,MAAA,GAAW,CAAA,CACtD,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAEpE,OAAO,CAAA,EAAGd,CAAK,CAAA,SAAA,EAAYJ,EAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,KAAA,EAAQlB,CAAAA,CAAUC,EAAOiB,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAEnG,KAAA,YAAA,CACE,GAAI,CAAC,MAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,KAAA,CAAM,MAAA,GAAW,CAAA,CACtD,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CAEvE,OAAO,CAAA,EAAGd,CAAK,CAAA,aAAA,EAAgBJ,EAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,KAAA,EAAQlB,CAAAA,CAAUC,EAAOiB,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAEvG,KAAA,SAAA,CACE,OAAO,CAAA,CAAA,EAAId,CAAK,CAAA,YAAA,EAAeA,CAAK,CAAA,MAAA,CAAA,CAEtC,KAAA,UAAA,CACE,OAAO,CAAA,CAAA,EAAIA,CAAK,CAAA,iBAAA,EAAoBA,CAAK,CAAA,OAAA,CAAA,CAE3C,KAAA,QAAA,CACE,OAAO,CAAA,EAAGA,CAAK,CAAA,YAAA,CAAA,CAEjB,KAAA,WAAA,CACE,OAAO,GAAGA,CAAK,CAAA,QAAA,CAAA,CAEjB,QACE,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAsBc,CAAAA,CAAc,QAAQ,CAAA,CAAE,CAClE,CACF,CAAA,CC7EO,IAAMC,CAAAA,CAAgB,CAACD,CAAAA,CAAgBjB,CAAAA,GAAgC,CAC5E,IAAMG,CAAAA,CAAQD,CAAAA,CAAWe,CAAAA,CAAK,KAAK,CAAA,CAEnC,OAAQA,CAAAA,CAAK,cACX,KAAA,QAAA,CACE,OAAO,CAAA,EAAGd,CAAK,CAAA,GAAA,EAAMJ,CAAAA,CAAUC,CAAAA,CAAOiB,EAAK,KAAK,CAAC,CAAA,CAAA,CAEnD,KAAA,OAAA,CACE,OAAO,CAAA,EAAGd,CAAK,CAAA,GAAA,EAAMJ,EAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,GAEnD,KAAA,YAAA,CACE,OAAO,CAAA,EAAGd,CAAK,OAAOJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,KAAA,WAAA,CACE,OAAO,GAAGd,CAAK,CAAA,IAAA,EAAOJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAEpD,eACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,MAAM,MAAA,GAAW,CAAA,CACtD,MAAM,IAAI,MAAM,uDAAuD,CAAA,CAEzE,OAAO,CAAA,EAAGd,CAAK,CAAA,SAAA,EAAYJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,QAAQlB,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAEnG,kBACE,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAK,KAAK,CAAA,EAAKA,CAAAA,CAAK,MAAM,MAAA,GAAW,CAAA,CACtD,MAAM,IAAI,MAAM,0DAA0D,CAAA,CAE5E,OAAO,CAAA,EAAGd,CAAK,CAAA,aAAA,EAAgBJ,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,QAAQlB,CAAAA,CAAUC,CAAAA,CAAOiB,CAAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,CAEvG,KAAA,OAAA,CAAyB,CACvB,IAAMJ,CAAAA,CAAOD,CAAAA,CAAYK,CAAAA,CAAK,KAAK,CAAA,CACnC,OAAO,CAAA,iBAAA,EAAoBd,CAAK,CAAA,QAAA,EAAWJ,CAAAA,CAAUC,CAAAA,CAAOa,CAAI,CAAC,CAAA,CAAA,CACnE,CAEA,KAAA,UAAA,CAA4B,CAC1B,IAAMA,CAAAA,CAAOD,CAAAA,CAAYK,CAAAA,CAAK,KAAK,CAAA,CACnC,OAAO,CAAA,iBAAA,EAAoBd,CAAK,YAAYJ,CAAAA,CAAUC,CAAAA,CAAOa,CAAI,CAAC,CAAA,CAAA,CACpE,CAEA,QACE,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA2BI,CAAAA,CAAkB,YAAY,CAAA,CAAE,CAC/E,CACF,CAAA,CCzCO,IAAME,CAAAA,CAAiB,CAACF,CAAAA,CAAiBjB,CAAAA,GAAgC,CAC9E,IAAMG,CAAAA,CAAQD,CAAAA,CAAWe,CAAAA,CAAK,KAAK,CAAA,CAC7BG,CAAAA,CAAWH,CAAAA,CAAK,SAAA,GAAc,QAAA,CAG9BI,CAAAA,CAAWD,CAAAA,CACb,CAAA,aAAA,EAAgBjB,CAAK,CAAA,IAAA,CAAA,CACrB,CAAA,mBAAA,EAAsBA,CAAK,CAAA,CAAA,CAAA,CAE/B,OAAQc,CAAAA,CAAK,aAAA,EACX,aACE,OAAIG,CAAAA,CAEK,CAAA,CAAA,EAAIjB,CAAK,CAAA,YAAA,EAAekB,CAAQ,CAAA,SAAA,CAAA,CAElC,CAAA,CAAA,EAAIlB,CAAK,CAAA,YAAA,EAAekB,CAAQ,CAAA,KAAA,CAAA,CAEzC,KAAA,UAAA,CACE,OAAID,CAAAA,CACK,CAAA,CAAA,EAAIjB,CAAK,CAAA,iBAAA,EAAoBkB,CAAQ,CAAA,aAAA,CAAA,CAEvC,CAAA,CAAA,EAAIlB,CAAK,CAAA,iBAAA,EAAoBkB,CAAQ,CAAA,KAAA,CAAA,CAE9C,KAAA,KAAA,CACA,KAAA,KAAA,CACA,YACA,KAAA,SAAA,CACA,KAAA,QAAA,CACA,KAAA,SAAA,CACE,MAAM,IAAI,KAAA,CACR,CAAA,gBAAA,EAAmBJ,CAAAA,CAAK,aAAa,CAAA,wGAAA,CAEvC,CAAA,CAEF,QACE,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA4BA,CAAAA,CAAmB,aAAa,CAAA,CAAE,CAClF,CACF,CAAA,CCrCA,IAAIK,CAAAA,CAESC,CAAAA,CAAuBC,CAAAA,EAAyB,CAC3DF,EAAiBE,EACnB,CAAA,CAEaC,CAAAA,CAAW,CAAC5C,CAAAA,CAAUmB,CAAAA,GAC7BnB,CAAAA,CAAI,GAAA,CAAI,SAAW,CAAA,CAAU,MAAA,CAE1B,CAAA,CAAA,EADSA,CAAAA,CAAI,IAAI,GAAA,CAAK6C,CAAAA,EAAMJ,CAAAA,CAAeI,CAAAA,CAAG1B,CAAK,CAAC,CAAA,CACxC,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAA,CAGrB2B,CAAAA,CAAW,CAAC7C,EAAUkB,CAAAA,GAC7BlB,CAAAA,CAAI,GAAA,CAAI,MAAA,GAAW,EAAU,OAAA,CAE1B,CAAA,CAAA,EADSA,CAAAA,CAAI,GAAA,CAAI,IAAK4C,CAAAA,EAAMJ,CAAAA,CAAeI,CAAAA,CAAG1B,CAAK,CAAC,CAAA,CACxC,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CAAA,CAGpB4B,CAAAA,CAAkB,CAACC,CAAAA,CAAkB7B,CAAAA,GAAgC,CAChF,IAAM8B,CAAAA,CAAWR,EAAeO,CAAAA,CAAK,EAAA,CAAI7B,CAAK,CAAA,CACxC+B,CAAAA,CAAaT,CAAAA,CAAeO,CAAAA,CAAK,IAAA,CAAM7B,CAAK,CAAA,CAC5CgC,CAAAA,CAAaH,CAAAA,CAAK,IAAA,CAAOP,EAAeO,CAAAA,CAAK,IAAA,CAAM7B,CAAK,CAAA,CAAI,OAIlE,OAAI6B,CAAAA,CAAK,IAAA,CACA,CAAA,MAAA,EAASC,CAAQ,CAAA,KAAA,EAAQC,CAAU,CAAA,OAAA,EAAUD,CAAQ,CAAA,IAAA,EAAOE,CAAU,CAAA,EAAA,CAAA,CAExE,CAAA,KAAA,EAAQF,CAAQ,CAAA,KAAA,EAAQC,CAAU,CAAA,CAAA,CAC3C,EC3BO,IAAMT,CAAAA,CAAiB,CAACxE,CAAAA,CAAsBkD,CAAAA,GAAgC,CACnF,GAAI,OAAOlD,GAAc,SAAA,CACvB,OAAOA,CAAAA,CAAY,MAAA,CAAS,QAG9B,GAAI,KAAA,GAASA,CAAAA,CAAW,OAAO2E,EAAS3E,CAAAA,CAAWkD,CAAK,CAAA,CACxD,GAAI,KAAA,GAASlD,CAAAA,CAAW,OAAO6E,CAAAA,CAAS7E,EAAWkD,CAAK,CAAA,CACxD,GAAI,IAAA,GAAQlD,CAAAA,CAAW,OAAO8E,CAAAA,CAAgB9E,CAAAA,CAAWkD,CAAK,CAAA,CAC9D,GAAI,eAAA,GAAmBlD,CAAAA,CAAW,OAAOqE,CAAAA,CAAerE,CAAgB,EACxE,GAAI,cAAA,GAAkBA,CAAAA,CAAW,OAAOoE,EAAcpE,CAAAA,CAAWkD,CAAK,CAAA,CACtE,GAAI,UAAWlD,CAAAA,CAAW,OAAOkE,CAAAA,CAAelE,CAAAA,CAAWkD,CAAK,CAAA,CAEhE,MAAM,IAAI,MAAM,wBAAwB,CAC1C,CAAA,CAGAuB,CAAAA,CAAoBD,CAAc,CAAA,CCU3B,IAAMW,EAAAA,CAASnF,CAAAA,EAAoC,CACxD,IAAMkD,CAAAA,CAAsB,CAAE,MAAA,CAAQ,EAAC,CAAG,UAAA,CAAY,CAAE,EAExD,OAAO,CAAE,GAAA,CADGsB,CAAAA,CAAexE,EAAWkD,CAAK,CAAA,CAC7B,MAAA,CAAQA,CAAAA,CAAM,MAAO,CACrC","file":"index.js","sourcesContent":["export enum 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}\n\nexport enum 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}\n\nexport enum DateOperator {\n before = 'before',\n after = 'after',\n onOrBefore = 'onOrBefore',\n onOrAfter = 'onOrAfter',\n between = 'between',\n notBetween = 'notBetween',\n dayIn = 'dayIn', // e.g., ['monday', 'tuesday', 'friday']\n dayNotIn = 'dayNotIn',\n}\n","import { get } from 'lodash';\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport isSameOrBefore from 'dayjs/plugin/isSameOrBefore';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport type { DateRule } from './types';\nimport { DateOperator } from './operator';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(isSameOrBefore);\ndayjs.extend(isSameOrAfter);\n\nexport const checkDate = (condition: DateRule, data: any, context: any): boolean | string => {\n const fieldValue = get(data, condition.field);\n \n if (!fieldValue) throw new Error(`${condition.field} is null or undefined`);\n \n const fieldDate = dayjs(fieldValue);\n \n if (!fieldDate.isValid()) 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 fieldDate.isSameOrBefore(compareDate) || getError(`must be on or before ${compareDate.format()}`);\n \n case DateOperator.onOrAfter:\n return fieldDate.isSameOrAfter(compareDate) || getError(`must be on or after ${compareDate.format()}`);\n \n case DateOperator.between:\n return (fieldDate.isSameOrAfter(compareDate) && fieldDate.isSameOrBefore(endDate!)) || \n getError(`must be between ${compareDate.format()} and ${endDate!.format()}`);\n \n case DateOperator.notBetween:\n return (fieldDate.isBefore(compareDate) || fieldDate.isAfter(endDate!)) || \n getError(`must not be between ${compareDate.format()} and ${endDate!.format()}`);\n \n case DateOperator.dayIn:\n if (!Array.isArray(condition.value)) throw new Error('dayIn operator requires an array of day names');\n const dayName = fieldDate.format('dddd').toLowerCase();\n const allowedDays = condition.value.map(d => d.toLowerCase());\n return allowedDays.includes(dayName) || getError(`must be on ${allowedDays.join(' or ')}`);\n \n case DateOperator.dayNotIn:\n if (!Array.isArray(condition.value)) throw new Error('dayNotIn operator requires an array of day names');\n const day = fieldDate.format('dddd').toLowerCase();\n const excludedDays = condition.value.map(d => d.toLowerCase());\n return !excludedDays.includes(day) || getError(`must not be on ${excludedDays.join(' or ')}`);\n \n default:\n throw new Error('Unknown date operator');\n }\n}\n\nconst parseCompareDates = (condition: DateRule, data: any, context: any, fieldDate: dayjs.Dayjs, fieldValue: string): [dayjs.Dayjs, dayjs.Dayjs | undefined] => {\n const requiresTwoDates = [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 startDate = parseDateWithTimezone(condition.value[0], fieldValue);\n const endDate = parseDateWithTimezone(condition.value[1], fieldValue);\n if (!startDate.isValid()) throw new Error(`Invalid start date: ${condition.value[0]}`);\n if (!endDate.isValid()) throw new Error(`Invalid end date: ${condition.value[1]}`);\n return [startDate, endDate];\n }\n \n const requiresOneDate = [\n DateOperator.before,\n DateOperator.after,\n DateOperator.onOrBefore,\n DateOperator.onOrAfter\n ];\n \n if (requiresOneDate.includes(condition.dateOperator)) {\n let value;\n if (condition.value !== undefined) {\n value = condition.value;\n } else if (condition.path) {\n // Support $.path for current element\n if (condition.path.startsWith('$.')) {\n value = get(data, condition.path.substring(2));\n } else {\n value = get(context, condition.path);\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 = (value: any, fieldValue: string): dayjs.Dayjs => {\n const valueStr = String(value);\n \n // Check if value has explicit timezone information\n const hasTimezone = 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]) * 60 + parseInt(match[3]));\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}","import { get, isEmpty } from 'lodash';\nimport type { Rule } from './types';\nimport { Operator } from './operator';\n\nexport const checkField = (condition: Rule, data: any, context: any): boolean | string => {\n // Use data for field access (current element) but context remains available for path references\n const fieldValue = get(data, condition.field);\n \n // Operators that don't need a value\n const noValueOps = [Operator.isEmpty, Operator.notEmpty, Operator.exists, Operator.notExists];\n const needsValue = !noValueOps.includes(condition.operator);\n const value = needsValue ? getValue(condition, data, context) : undefined;\n \n const getError = (op: string) => 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 fieldValue < value || getError(`must be less than`);\n case Operator.lessThanEquals:\n return fieldValue <= value || getError(`must be less than or equal to`);\n case Operator.greaterThan:\n return fieldValue > value || getError(`must be greater than`);\n case Operator.greaterThanEquals:\n return fieldValue >= value || getError(`must be greater than or equal to`);\n case Operator.in:\n return value?.includes(fieldValue) || getError(`must be one of`);\n case Operator.notIn:\n return !value?.includes(fieldValue) || getError(`must not be one of`);\n case Operator.contains:\n return fieldValue?.includes(value) || getError(`must contain`);\n case Operator.notContains:\n return !fieldValue?.includes(value) || getError(`must not contain`);\n case Operator.matches:\n return !!fieldValue?.match(value) || getError(`must match pattern`);\n case Operator.notMatches:\n return !fieldValue?.match(value) || getError(`must not match pattern`);\n case Operator.between:\n if (!Array.isArray(value) || value.length !== 2) \n throw new Error('between operator requires an array of two values');\n return (fieldValue >= value[0] && fieldValue <= value[1]) || getError(`must be between`);\n case Operator.notBetween:\n if (!Array.isArray(value) || value.length !== 2) \n throw new Error('notBetween operator requires an array of two values');\n return (fieldValue < value[0] || fieldValue > value[1]) || getError(`must not be between`);\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 fieldValue?.startsWith?.(value) || getError(`must start with`);\n case Operator.endsWith:\n return fieldValue?.endsWith?.(value) || getError(`must end with`);\n default:\n throw new Error('Unknown operator');\n }\n};\n\nconst getValue = (condition: Rule, data: any, context: any): any => {\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};","import { get, some, isObject } from 'lodash';\nimport type { Condition, ArrayRule } from './types';\nimport { ArrayOperator } from './operator';\nimport { checkDate } from './date';\nimport { checkField } from './field';\n\nexport const check = (conditions: Condition, data: any, context: any = data): 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 = (conditions: Condition[], data: any, context: any, error?: string): 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 = (conditions: Condition[], data: any, context: any, error?: string): boolean | string => {\n const errors: string[] = [];\n\n for (const condition of conditions) {\n const result = check(condition, data, context);\n if (typeof result !== 'string') return true;\n errors.push(result);\n }\n\n if (error) return error;\n if (errors.length === 1) return errors[0];\n return `At least one condition must pass: ${errors.join(' OR ')}`;\n}\n\nconst checkIfThenElse = (condition: any, data: any, context: any): 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 = (condition: ArrayRule, data: any, context: any): boolean | string => {\n const arrayValue = get(context, 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 = [\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 = [\n ArrayOperator.atLeast,\n ArrayOperator.atMost,\n ArrayOperator.exactly\n ];\n \n if (requiresCondition.includes(condition.arrayOperator) && !condition.condition) \n throw new Error(`${condition.arrayOperator} requires a condition to check against array elements`);\n \n if (requiresCount.includes(condition.arrayOperator) && condition.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 // Check if array contains any objects\n if (!some(arrayValue, isObject)) \n throw new Error(`${condition.field} contains only primitive values. Use 'in' or 'contains' operators instead of array operators for primitive arrays`);\n \n // Pass item as data (for relative field access) but keep original context (for path access)\n const results = arrayValue.map(item => check(condition.condition!, item, context));\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 matches === arrayValue.length || getError(`all elements must match (${failures} failed)`);\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 return matches >= condition.count! || getError(`at least ${condition.count} elements must match (${matches} matched)`);\n \n case ArrayOperator.atMost:\n return matches <= condition.count! || getError(`at most ${condition.count} elements must match (${matches} matched)`);\n \n case ArrayOperator.exactly:\n return matches === condition.count! || getError(`exactly ${condition.count} elements must match (${matches} matched)`);\n \n default:\n throw new Error('Unknown array operator');\n }\n}","import { escapeIdentifier } from 'pg';\nimport type { BuilderState } from './types';\n\nexport const nextParam = (state: BuilderState, value: unknown): string => {\n state.params.push(value);\n return `$${++state.paramIndex}`;\n};\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\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/%/g, '\\\\%')\n .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 // Build JSON path: \"column\"->'path1'->'path2'->>'leaf'\n // JSON keys need single quote escaping ('' for literal ')\n const escapeJsonKey = (key: string) => `'${key.replace(/'/g, \"''\")}'`;\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 `${escapeIdentifier(column)}->${pathParts}->>${leaf}`;\n }\n return `${escapeIdentifier(column)}->>${leaf}`;\n};\n\nexport const mapDayNames = (days: string[]): number[] => {\n const dayMap: Record<string, number> = {\n sunday: 0, monday: 1, tuesday: 2, wednesday: 3,\n thursday: 4, friday: 5, saturday: 6,\n };\n return days.map((d) => {\n const num = dayMap[d.toLowerCase()];\n if (num === undefined) throw new Error(`Unknown day name: ${d}`);\n return num;\n });\n};\n","import type { Rule } from '../types';\nimport { Operator } from '../operator';\nimport type { BuilderState } from './types';\nimport { nextParam, quoteField, escapeLikePattern } from './utils';\n\nexport const buildFieldRule = (rule: Rule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.operator) {\n case Operator.equals:\n if (rule.value === null) return `${field} IS NULL`;\n return `${field} = ${nextParam(state, rule.value)}`;\n\n case Operator.notEquals:\n if (rule.value === null) return `${field} IS NOT NULL`;\n return `${field} <> ${nextParam(state, rule.value)}`;\n\n case Operator.lessThan:\n return `${field} < ${nextParam(state, rule.value)}`;\n\n case Operator.lessThanEquals:\n return `${field} <= ${nextParam(state, rule.value)}`;\n\n case Operator.greaterThan:\n return `${field} > ${nextParam(state, rule.value)}`;\n\n case Operator.greaterThanEquals:\n return `${field} >= ${nextParam(state, rule.value)}`;\n\n case Operator.in:\n if (!Array.isArray(rule.value) || rule.value.length === 0) return 'FALSE';\n return `${field} = ANY(${nextParam(state, rule.value)})`;\n\n case Operator.notIn:\n if (!Array.isArray(rule.value) || rule.value.length === 0) return 'TRUE';\n return `${field} <> ALL(${nextParam(state, rule.value)})`;\n\n case Operator.contains:\n return `${field} LIKE ${nextParam(state, `%${escapeLikePattern(String(rule.value))}%`)}`;\n\n case Operator.notContains:\n return `${field} NOT LIKE ${nextParam(state, `%${escapeLikePattern(String(rule.value))}%`)}`;\n\n case Operator.startsWith:\n return `${field} LIKE ${nextParam(state, `${escapeLikePattern(String(rule.value))}%`)}`;\n\n case Operator.endsWith:\n return `${field} LIKE ${nextParam(state, `%${escapeLikePattern(String(rule.value))}`)}`;\n\n case Operator.matches:\n return `${field} ~ ${nextParam(state, rule.value)}`;\n\n case Operator.notMatches:\n return `${field} !~ ${nextParam(state, rule.value)}`;\n\n case Operator.between:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('between operator requires an array of two values');\n }\n return `${field} BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case Operator.notBetween:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('notBetween operator requires an array of two values');\n }\n return `${field} NOT BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\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","import type { DateRule } from '../types';\nimport { DateOperator } from '../operator';\nimport type { BuilderState } from './types';\nimport { nextParam, quoteField, mapDayNames } from './utils';\n\nexport const buildDateRule = (rule: DateRule, state: BuilderState): string => {\n const field = quoteField(rule.field);\n\n switch (rule.dateOperator) {\n case DateOperator.before:\n return `${field} < ${nextParam(state, rule.value)}`;\n\n case DateOperator.after:\n return `${field} > ${nextParam(state, rule.value)}`;\n\n case DateOperator.onOrBefore:\n return `${field} <= ${nextParam(state, rule.value)}`;\n\n case DateOperator.onOrAfter:\n return `${field} >= ${nextParam(state, rule.value)}`;\n\n case DateOperator.between:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('between date operator requires an array of two values');\n }\n return `${field} BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case DateOperator.notBetween:\n if (!Array.isArray(rule.value) || rule.value.length !== 2) {\n throw new Error('notBetween date operator requires an array of two values');\n }\n return `${field} NOT BETWEEN ${nextParam(state, rule.value[0])} AND ${nextParam(state, rule.value[1])}`;\n\n case DateOperator.dayIn: {\n const days = mapDayNames(rule.value);\n return `EXTRACT(DOW FROM ${field}) = ANY(${nextParam(state, days)})`;\n }\n\n case DateOperator.dayNotIn: {\n const days = mapDayNames(rule.value);\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","import type { ArrayRule } from '../types';\nimport { ArrayOperator } from '../operator';\nimport type { BuilderState } from './types';\nimport { quoteField } from './utils';\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","import type { All, Any, IfThenElse, Condition } 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 type { BuilderState } from './types';\nimport { buildFieldRule } from './field';\nimport { buildDateRule } from './date';\nimport { buildArrayRule } from './array';\nimport { buildAll, buildAny, buildIfThenElse, setConditionBuilder } from './logical';\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 type { SqlResult, BuilderState } from './types';\nimport { buildCondition } from './condition';\n\nexport type { SqlResult } from './types';\n\n/**\n * Convert a json-rules Condition to a PostgreSQL WHERE clause.\n *\n * @param condition - The rule condition to convert\n * @returns Object with `sql` (WHERE clause fragment) and `params` array\n *\n * @example\n * ```typescript\n * import { toSql, Operator } from '@inixiative/json-rules';\n *\n * const rule = { field: 'status', operator: Operator.equals, value: 'active' };\n * const { sql, params } = toSql(rule);\n * // sql: '\"status\" = $1'\n * // params: ['active']\n *\n * // Complex rule\n * const rule2 = {\n * all: [\n * { field: 'deletedAt', operator: Operator.equals, value: null },\n * { field: 'status', operator: Operator.in, value: ['active', 'pending'] }\n * ]\n * };\n * const { sql: sql2, params: params2 } = toSql(rule2);\n * // sql: '(\"deletedAt\" IS NULL AND \"status\" = ANY($1))'\n * // params: [['active', 'pending']]\n * ```\n */\nexport const toSql = (condition: Condition): SqlResult => {\n const state: BuilderState = { params: [], paramIndex: 0 };\n const sql = buildCondition(condition, state);\n return { sql, params: state.params };\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inixiative/json-rules",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "TypeScript-first JSON rules engine with intuitive syntax and detailed error messages",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -35,6 +35,7 @@
35
35
  "@electric-sql/pglite": "^0.3.15",
36
36
  "@types/bun": "latest",
37
37
  "@types/lodash": "^4.17.20",
38
+ "@types/pg": "^8.16.0",
38
39
  "tsup": "^8.5.0",
39
40
  "typescript": "^5.0.0"
40
41
  },
@@ -48,7 +49,8 @@
48
49
  },
49
50
  "dependencies": {
50
51
  "dayjs": "^1.11.13",
51
- "lodash": "^4.17.21"
52
+ "lodash": "^4.17.21",
53
+ "pg": "^8.17.2"
52
54
  },
53
55
  "exports": {
54
56
  ".": {