@statedelta-libs/expressions 0.1.0 → 0.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 +1 @@
1
- 'use strict';var conditions=require('@statedelta-libs/conditions'),omniAst=require('omni-ast');var en=Object.defineProperty;var tn=(n,e)=>{for(var i in e)en(n,i,{get:e[i],enumerable:true});};var m=n=>n!==null&&typeof n=="object"&&"$"in n&&typeof n.$=="string"&&Object.keys(n).length===1,E=n=>n!==null&&typeof n=="object"&&"$if"in n&&"then"in n,T=n=>n!==null&&typeof n=="object"&&"$fn"in n&&typeof n.$fn=="string",C=n=>n!==null&&typeof n=="object"&&"$pipe"in n&&Array.isArray(n.$pipe),I=new Set(["eq","neq","gt","gte","lt","lte","in","notIn","contains","notContains","exists","notExists","matches","notMatches","startsWith","endsWith"]),g=n=>n!==null&&typeof n=="object"&&"path"in n&&"op"in n&&I.has(n.op)&&!("$"in n)&&!("$if"in n)&&!("$fn"in n),y=n=>n!==null&&typeof n=="object"&&"logic"in n&&"conditions"in n,on=n=>g(n)||y(n),P=n=>{if(n===null)return true;let e=typeof n;if(e==="string"||e==="number"||e==="boolean"||Array.isArray(n))return true;if(e==="object"&&n!==null){let i=n,t="path"in i&&"op"in i&&I.has(i.op);return !("$"in i)&&!("$if"in i)&&!("$fn"in i)&&!("$pipe"in i)&&!t&&!("logic"in i)}return false};var R=new Map;function V(n){let e=[],i=n.length,t=0,o="";for(;t<i;){let s=n[t];if(s===".")o&&(e.push({type:"key",value:o}),o=""),t++;else if(s==="["){o&&(e.push({type:"key",value:o}),o=""),t++;let r=t;for(;t<i&&n[t]!=="]";)t++;let f=n.slice(r,t);if(t++,f==="*")e.push({type:"wildcard",value:"*"});else {let u=parseInt(f,10);e.push({type:"index",value:isNaN(u)?f:u});}}else o+=s,t++;}return o&&e.push({type:"key",value:o}),e}function L(n){return n.includes("[*]")}function O(n){let e=R.get(n);return e||(e=L(n)?sn(n):rn(n),R.set(n,e),e)}function rn(n){if(!n.includes(".")&&!n.includes("["))return o=>o?.[n];let e=V(n),i=e.length;if(i===2){let[o,s]=e,r=o.value,f=s.value;return u=>u?.[r]?.[f]}if(i===3){let[o,s,r]=e,f=o.value,u=s.value,c=r.value;return a=>a?.[f]?.[u]?.[c]}let t=e.map(o=>o.value);return o=>{let s=o;for(let r=0;r<i&&s!=null;r++)s=s[t[r]];return s}}function sn(n){let e=V(n),i=[];for(let t=0;t<e.length;t++)e[t].type==="wildcard"&&i.push(t);return i.length===1?ln(e,i[0]):fn(e,i)}function ln(n,e){let i=n.slice(0,e).map(r=>r.value),t=n.slice(e+1).map(r=>r.value),o=i.length,s=t.length;if(s===0){if(o===1){let r=i[0];return f=>f?.[r]}return r=>{let f=r;for(let u=0;u<o&&f!=null;u++)f=f[i[u]];return f}}if(s===1){let r=t[0];if(o===1){let f=i[0];return u=>{let c=u?.[f];if(Array.isArray(c))return c.map(a=>a?.[r])}}return f=>{let u=f;for(let c=0;c<o&&u!=null;c++)u=u[i[c]];if(Array.isArray(u))return u.map(c=>c?.[r])}}return r=>{let f=r;for(let u=0;u<o&&f!=null;u++)f=f[i[u]];if(Array.isArray(f))return f.map(u=>{let c=u;for(let a=0;a<s&&c!=null;a++)c=c[t[a]];return c})}}function fn(n,e){let i=[],t=0;for(let s=0;s<e.length;s++){let r=e[s],f=s===e.length-1,u=n.slice(t,r).map(c=>c.value);u.length>0&&i.push({type:"access",keys:u}),i.push({type:f?"map":"flatMap",keys:[]}),t=r+1;}let o=n.slice(t).map(s=>s.value);return s=>{let r=s;for(let f of i){if(r==null)return;if(f.type==="access")for(let u of f.keys){if(r==null)return;r=r[u];}else if(f.type==="flatMap"){if(!Array.isArray(r))return;r=r.flatMap(u=>{let c=u;return Array.isArray(c)?c:[c]});}else if(f.type==="map"){if(!Array.isArray(r))return;o.length>0&&(r=r.map(u=>{let c=u;for(let a of o){if(c==null)return;c=c[a];}return c}));}}return r}}function un(n,e){return O(e)(n)}function k(n){let e=n.indexOf("[*]");return e===-1?n:n.slice(0,e)}function cn(){R.clear();}function an(){return R.size}function S(n){let e=new Set;return $(n,e),Array.from(e)}function $(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let o=0;o<n.length;o++)$(n[o],e);return}if(m(n)){e.add(k(n.$));return}if(E(n)){if(typeof n.$if=="string"){let o=n.$if.startsWith("!")?n.$if.slice(1):n.$if;e.add(k(o));}else $(n.$if,e);$(n.then,e),n.else!==void 0&&$(n.else,e);return}if(C(n)){for(let o=0;o<n.$pipe.length;o++)$(n.$pipe[o],e);return}if(T(n)){if(n.args)for(let o=0;o<n.args.length;o++)$(n.args[o],e);return}if(g(n)){e.add(k(n.path)),n.value!==void 0&&conditions.isRef(n.value)&&e.add(k(n.value.$));return}if(y(n)){for(let o=0;o<n.conditions.length;o++)$(n.conditions[o],e);return}let i=n,t=Object.keys(i);for(let o=0;o<t.length;o++)$(i[t[o]],e);}function dn(n){return S(n).length>0}function mn(n){return S(n).length===0}function gn(n){return JSON.stringify(n)}function F(n,e={}){let i=e.scope??{},t=e.accessor,o=A(n,i,t),s=S(n),r=gn(n);return {fn:o,deps:s,hash:r}}function A(n,e,i){if(n===null)return ()=>null;if(typeof n!="object")return ()=>n;if(Array.isArray(n)){let t=n.map(o=>A(o,e,i));return o=>t.map(s=>s(o))}if(m(n))return yn(n,i);if(E(n))return hn(n,e,i);if(C(n))return En(n,e,i);if(T(n))return Tn(n,e,i);if(g(n))return conditions.compile(n,i?{accessor:i}:void 0);if(y(n))return conditions.compile(n,i?{accessor:i}:void 0);if(P(n)){let t=n,o=Object.keys(t),s=o.map(r=>A(t[r],e,i));return r=>{let f={};for(let u=0;u<o.length;u++)f[o[u]]=s[u](r);return f}}return ()=>n}function q(n,e){return e?i=>e(n,i):O(n)}function yn(n,e){return q(n.$,e)}function hn(n,e,i){let t;if(typeof n.$if=="string"){let r=n.$if.startsWith("!")?n.$if.slice(1):n.$if,f=q(r,i);t=n.$if.startsWith("!")?c=>!f(c):c=>!!f(c);}else {let r=A(n.$if,e,i);t=f=>!!r(f);}let o=A(n.then,e,i),s=n.else!==void 0?A(n.else,e,i):()=>{};return r=>t(r)?o(r):s(r)}function En(n,e,i){let t=n.$pipe;if(t.length===0)return ()=>{};if(t.length===1)return A(t[0],e,i);let o=A(t[0],e,i),s=t.slice(1).map(f=>A(f,e,i)),r=s.length;if(r===1){let[f]=s;return u=>{let c=o(u),a=f(u);return typeof a=="function"?a(c):a}}if(r===2){let[f,u]=s;return c=>{let a=o(c),p=f(c);return a=typeof p=="function"?p(a):p,p=u(c),typeof p=="function"?p(a):p}}if(r===3){let[f,u,c]=s;return a=>{let p=o(a),h=f(a);return p=typeof h=="function"?h(p):h,h=u(a),p=typeof h=="function"?h(p):h,h=c(a),typeof h=="function"?h(p):h}}return f=>{let u=o(f);for(let c=0;c<r;c++){let a=s[c](f);u=typeof a=="function"?a(u):a;}return u}}function Tn(n,e,i){let t=n.$fn,o=n.args;if(o===void 0)return ()=>{let f=e[t];if(!f)throw new Error(`Function not found in scope: ${t}`);return f};let s=o.map(f=>A(f,e,i)),r=s.length;if(r===0)return f=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u()};if(r===1){let[f]=s;return u=>{let c=e[t];if(!c)throw new Error(`Function not found in scope: ${t}`);return c(f(u))}}if(r===2){let[f,u]=s;return c=>{let a=e[t];if(!a)throw new Error(`Function not found in scope: ${t}`);return a(f(c),u(c))}}if(r===3){let[f,u,c]=s;return a=>{let p=e[t];if(!p)throw new Error(`Function not found in scope: ${t}`);return p(f(a),u(a),c(a))}}return f=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u(...s.map(c=>c(f)))}}function Cn(n,e,i={}){return F(n,i).fn(e)}var v=class{constructor(e=1e3){this.cache=new Map,this._maxSize=e;}get(e,i={}){let t=JSON.stringify(e),o=this.cache.get(t);if(o)return this.cache.delete(t),this.cache.set(t,o),o;let s=F(e,i);if(this.cache.size>=this._maxSize){let r=this.cache.keys().next().value;r&&this.cache.delete(r);}return this.cache.set(t,s),s}has(e){return this.cache.has(JSON.stringify(e))}delete(e){return this.cache.delete(JSON.stringify(e))}clear(){this.cache.clear();}get size(){return this.cache.size}get maxSize(){return this._maxSize}set maxSize(e){for(this._maxSize=e;this.cache.size>this._maxSize;){let i=this.cache.keys().next().value;i&&this.cache.delete(i);}}},J=new v;function An(n,e={}){return J.get(n,e)}function z(n,e="root",i={}){let t=[];return x(n,e,t,i),{valid:t.length===0,errors:t}}function x(n,e,i,t){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let r=0;r<n.length;r++)x(n[r],`${e}[${r}]`,i,t);return}if(m(n)){(!n.$||typeof n.$!="string")&&i.push(`${e}: invalid reference, $ must be non-empty string`);return}if(E(n)){typeof n.$if=="string"?(n.$if.startsWith("!")?n.$if.slice(1):n.$if)||i.push(`${e}.$if: empty path in string shorthand`):x(n.$if,`${e}.$if`,i,t),x(n.then,`${e}.then`,i,t),n.else!==void 0&&x(n.else,`${e}.else`,i,t);return}if(C(n)){if(!Array.isArray(n.$pipe)){i.push(`${e}.$pipe: must be an array`);return}if(n.$pipe.length===0){i.push(`${e}.$pipe: must have at least one element`);return}for(let r=0;r<n.$pipe.length;r++)x(n.$pipe[r],`${e}.$pipe[${r}]`,i,t);return}if(T(n)){if(!n.$fn||typeof n.$fn!="string"){i.push(`${e}: invalid function, $fn must be non-empty string`);return}if(t.scope&&!(n.$fn in t.scope)&&i.push(`${e}: function "${n.$fn}" not found in scope`),n.args!==void 0)if(!Array.isArray(n.args))i.push(`${e}.args: must be an array`);else for(let r=0;r<n.args.length;r++)x(n.args[r],`${e}.args[${r}]`,i,t);return}if(g(n)){let r=conditions.validate(n,e);r.valid||i.push(...r.errors);return}if(y(n)){let r=conditions.validate(n,e);r.valid||i.push(...r.errors);return}let o=n,s=Object.keys(o);for(let r=0;r<s.length;r++){let f=s[r];x(o[f],`${e}.${f}`,i,t);}}function bn(n,e={}){let i=z(n,"root",e);if(!i.valid)throw new Error(`Invalid expression: ${i.errors.join("; ")}`)}function $n(n,e={}){return z(n,"root",e).valid}var Q={};tn(Q,{$:()=>K,$fn:()=>Y,$if:()=>kn,$pipe:()=>H,fn:()=>Sn,pipe:()=>wn,ref:()=>xn});function K(n){return {$:n}}var xn=K;function Y(n,e){return e===void 0||e.length===0?{$fn:n}:{$fn:n,args:e}}var Sn=Y;function kn(n,e,i){return i===void 0?{$if:n,then:e}:{$if:n,then:e,else:i}}function H(...n){return {$pipe:n}}var wn=H;var D="data",U="scope",Rn={eq:"===",neq:"!==",gt:">",gte:">=",lt:"<",lte:"<="};function j(n,e={}){let{dataParam:i=D,scopeParam:t=U,noPrefixes:o=false}=e;return d(n,i,t,o)}function d(n,e,i,t){if(n===null)return omniAst.builders.literal(null);if(typeof n=="string")return omniAst.builders.literal(n);if(typeof n=="number")return omniAst.builders.literal(n);if(typeof n=="boolean")return omniAst.builders.literal(n);if(Array.isArray(n))return omniAst.builders.arrayExpression(n.map(o=>d(o,e,i,t)));if(m(n))return On(n.$,e,t);if(E(n))return vn(n,e,i,t);if(C(n))return jn(n.$pipe,e,i,t);if(T(n))return Nn(n,e,i,t);if(g(n))return Gn(n,e,i,t);if(y(n))return Wn(n,e,i,t);if(typeof n=="object"){let s=Object.entries(n).map(([r,f])=>omniAst.builders.property(omniAst.builders.identifier(r),d(f,e,i,t)));return omniAst.builders.objectExpression(s)}return omniAst.builders.literal(null)}function On(n,e,i){return n.includes("[*]")?Fn(n,e,i):w(n,e,i)}function w(n,e,i){let t=N(n);if(t.length===0)return i?omniAst.builders.identifier("undefined"):omniAst.builders.identifier(e);let o;if(i){let s=t[0];o=omniAst.builders.identifier(s.value);for(let r=1;r<t.length;r++){let f=t[r];f.type==="key"?o=omniAst.builders.memberExpression(o,omniAst.builders.identifier(f.value),false,true):o=omniAst.builders.memberExpression(o,omniAst.builders.literal(f.value),true,true);}}else {o=omniAst.builders.identifier(e);for(let s of t)s.type==="key"?o=omniAst.builders.memberExpression(o,omniAst.builders.identifier(s.value),false,true):o=omniAst.builders.memberExpression(o,omniAst.builders.literal(s.value),true,true);}return o}function Fn(n,e,i){let t=n.indexOf("[*]"),o=n.slice(0,t),s=n.slice(t+3),r;if(o?r=w(o,e,i):r=i?omniAst.builders.identifier("undefined"):omniAst.builders.identifier(e),!s||s==="")return r;if(s.includes("[*]"))return X(r,s);let f="_i",u=s.startsWith(".")?s.slice(1):s,c=omniAst.builders.identifier(f);if(u){let a=N(u);for(let p of a)p.type==="key"?c=omniAst.builders.memberExpression(c,omniAst.builders.identifier(p.value),false,true):c=omniAst.builders.memberExpression(c,omniAst.builders.literal(p.value),true,true);}return omniAst.builders.callExpression(omniAst.builders.memberExpression(r,omniAst.builders.identifier("map"),false,true),[omniAst.builders.arrowFunctionExpression([omniAst.builders.identifier(f)],c)])}function X(n,e){let i=e.indexOf("[*]"),t=e.slice(0,i),o=e.slice(i+3),s="_i",r=t.startsWith(".")?t.slice(1):t,f=omniAst.builders.identifier(s);if(r){let c=N(r);for(let a of c)a.type==="key"&&(f=omniAst.builders.memberExpression(f,omniAst.builders.identifier(a.value),false,true));}if(o.includes("[*]")){let c=X(f,o);return omniAst.builders.callExpression(omniAst.builders.memberExpression(n,omniAst.builders.identifier("flatMap"),false,true),[omniAst.builders.arrowFunctionExpression([omniAst.builders.identifier(s)],c)])}let u=o.startsWith(".")?o.slice(1):o;if(u){let c=N(u);for(let a of c)a.type==="key"&&(f=omniAst.builders.memberExpression(f,omniAst.builders.identifier(a.value),false,true));}return omniAst.builders.callExpression(omniAst.builders.memberExpression(n,omniAst.builders.identifier("flatMap"),false,true),[omniAst.builders.arrowFunctionExpression([omniAst.builders.identifier(s)],f)])}function vn(n,e,i,t){let o;if(typeof n.$if=="string"){let f=n.$if.startsWith("!"),u=f?n.$if.slice(1):n.$if,c=w(u,e,t);o=f?omniAst.builders.unaryExpression("!",c):c;}else o=d(n.$if,e,i,t);let s=d(n.then,e,i,t),r=n.else!==void 0?d(n.else,e,i,t):omniAst.builders.identifier("undefined");return omniAst.builders.conditionalExpression(o,s,r)}function Nn(n,e,i,t){let o=t?omniAst.builders.identifier(n.$fn):omniAst.builders.memberExpression(omniAst.builders.identifier(i),omniAst.builders.identifier(n.$fn),false,false);if(n.args===void 0)return o;let s=n.args.map(r=>d(r,e,i,t));return omniAst.builders.callExpression(o,s)}function jn(n,e,i,t){if(n.length===0)return omniAst.builders.identifier("undefined");if(n.length===1)return d(n[0],e,i,t);let o=d(n[0],e,i,t);for(let s=1;s<n.length;s++){let r=d(n[s],e,i,t);o=omniAst.builders.callExpression(r,[o]);}return o}function Gn(n,e,i,t){let o=w(n.path,e,t),s=n.value!==void 0?m(n.value)?w(n.value.$,e,t):d(n.value,e,i,t):omniAst.builders.literal(null),r=Rn[n.op];if(r)return omniAst.builders.binaryExpression(r,o,s);switch(n.op){case "in":return omniAst.builders.callExpression(omniAst.builders.memberExpression(s,omniAst.builders.identifier("includes")),[o]);case "notIn":return omniAst.builders.unaryExpression("!",omniAst.builders.callExpression(omniAst.builders.memberExpression(s,omniAst.builders.identifier("includes")),[o]));case "contains":return omniAst.builders.callExpression(omniAst.builders.memberExpression(o,omniAst.builders.identifier("includes"),false,true),[s]);case "notContains":return omniAst.builders.unaryExpression("!",omniAst.builders.callExpression(omniAst.builders.memberExpression(o,omniAst.builders.identifier("includes"),false,true),[s]));case "exists":return omniAst.builders.binaryExpression("!=",o,omniAst.builders.literal(null));case "notExists":return omniAst.builders.binaryExpression("==",o,omniAst.builders.literal(null));case "matches":return omniAst.builders.callExpression(omniAst.builders.memberExpression(omniAst.builders.newExpression(omniAst.builders.identifier("RegExp"),[s]),omniAst.builders.identifier("test")),[o]);case "notMatches":return omniAst.builders.unaryExpression("!",omniAst.builders.callExpression(omniAst.builders.memberExpression(omniAst.builders.newExpression(omniAst.builders.identifier("RegExp"),[s]),omniAst.builders.identifier("test")),[o]));case "startsWith":return omniAst.builders.callExpression(omniAst.builders.memberExpression(o,omniAst.builders.identifier("startsWith"),false,true),[s]);case "endsWith":return omniAst.builders.callExpression(omniAst.builders.memberExpression(o,omniAst.builders.identifier("endsWith"),false,true),[s]);default:return omniAst.builders.binaryExpression("===",o,s)}}function Wn(n,e,i,t){let{logic:o,conditions:s}=n,r=o==="AND"?"&&":"||";if(s.length===0)return omniAst.builders.literal(o==="AND");if(s.length===1)return d(s[0],e,i,t);let f=d(s[0],e,i,t);for(let u=1;u<s.length;u++){let c=d(s[u],e,i,t);f=omniAst.builders.logicalExpression(r,f,c);}return f}function N(n){let e=[],i=n.length,t=0,o="";for(;t<i;){let s=n[t];if(s===".")o&&(e.push({type:"key",value:o}),o=""),t++;else if(s==="["){o&&(e.push({type:"key",value:o}),o=""),t++;let r=t;for(;t<i&&n[t]!=="]";)t++;let f=n.slice(r,t);if(t++,f!=="*"){let u=parseInt(f,10);e.push({type:"index",value:isNaN(u)?f:u});}}else o+=s,t++;}return o&&e.push({type:"key",value:o}),e}function Z(n,e=[D]){return omniAst.builders.arrowFunctionExpression(e.map(i=>omniAst.builders.identifier(i)),n)}function G(n){let e=new Set;return b(n,e),e}function b(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let t of n)b(t,e);return}if(m(n))return;if(E(n)){b(n.$if,e),b(n.then,e),n.else!==void 0&&b(n.else,e);return}if(C(n)){for(let t of n.$pipe)b(t,e);return}if(T(n)){if(e.add(n.$fn),n.args)for(let t of n.args)b(t,e);return}if(g(n)){n.value!==void 0&&typeof n.value=="object"&&b(n.value,e);return}if(y(n)){for(let t of n.conditions)b(t,e);return}let i=n;for(let t of Object.keys(i))b(i[t],e);}function W(n){let e=new Set;for(let i of n){let t=i.indexOf("."),o=i.indexOf("["),s=i.length;t!==-1&&(s=Math.min(s,t)),o!==-1&&(s=Math.min(s,o));let r=i.slice(0,s);r&&e.add(r);}return e}function zn(n){return JSON.stringify(n)}function Dn(n,e,i){let t=j(n,{noPrefixes:true}),o=omniAst.generate(t),s=e.size>0?`const{${[...e].join(",")}}=data??{};`:"",r=i.size>0?`const{${[...i].join(",")}}=scope;`:"";return r?`(function(scope){${r}return function(data){${s}return ${o}}})`:`(function(){return function(data){${s}return ${o}}})`}function M(n,e={}){let{scope:i={},returnCode:t=false}=e,o=S(n),s=W(o),r=G(n),f=zn(n),u=Dn(n,s,r);if(t)return {code:u,deps:o,hash:f,dataRoots:[...s],scopeFns:[...r]};let c;try{c=new Function(`return ${u}`)()(i);}catch(a){throw new Error(`AST compilation failed. If this is due to CSP, use the standard compile() function instead. Error: ${a instanceof Error?a.message:String(a)}`)}return {fn:c,deps:o,hash:f}}function nn(n,e,i={}){let{fn:t}=M(n,i);return t(e)}var ye="0.1.0";exports.ExpressionCache=v;exports.VERSION=ye;exports.assertValid=bn;exports.builders=Q;exports.cache=J;exports.cached=An;exports.clearPathCache=cn;exports.compile=F;exports.compileAST=M;exports.compilePath=O;exports.dslToAST=j;exports.evaluate=Cn;exports.evaluateAST=nn;exports.extractDataRoots=W;exports.extractDeps=S;exports.extractScopeFns=G;exports.get=un;exports.getPathCacheSize=an;exports.hasDeps=dn;exports.hasWildcard=L;exports.isCondition=g;exports.isConditionExpr=on;exports.isConditionGroup=y;exports.isConditional=E;exports.isFn=T;exports.isLiteral=P;exports.isPipe=C;exports.isPure=mn;exports.isRef=m;exports.isValid=$n;exports.normalizePath=k;exports.validate=z;exports.wrapInFunction=Z;
1
+ 'use strict';var conditions=require('@statedelta-libs/conditions'),omniAst=require('omni-ast');var en=Object.defineProperty;var tn=(n,e)=>{for(var i in e)en(n,i,{get:e[i],enumerable:true});};var m=n=>n!==null&&typeof n=="object"&&"$"in n&&typeof n.$=="string"&&Object.keys(n).length===1,E=n=>n!==null&&typeof n=="object"&&"$if"in n&&"then"in n,T=n=>n!==null&&typeof n=="object"&&"$fn"in n&&typeof n.$fn=="string",C=n=>n!==null&&typeof n=="object"&&"$pipe"in n&&Array.isArray(n.$pipe),I=new Set(["eq","neq","gt","gte","lt","lte","in","notIn","contains","notContains","exists","notExists","matches","notMatches","startsWith","endsWith"]),g=n=>n!==null&&typeof n=="object"&&"path"in n&&"op"in n&&I.has(n.op)&&!("$"in n)&&!("$if"in n)&&!("$fn"in n),y=n=>n!==null&&typeof n=="object"&&"logic"in n&&"conditions"in n,on=n=>g(n)||y(n),P=n=>{if(n===null)return true;let e=typeof n;if(e==="string"||e==="number"||e==="boolean"||Array.isArray(n))return true;if(e==="object"&&n!==null){let i=n,t="path"in i&&"op"in i&&I.has(i.op);return !("$"in i)&&!("$if"in i)&&!("$fn"in i)&&!("$pipe"in i)&&!t&&!("logic"in i)}return false};var R=new Map;function V(n){let e=[],i=n.length,t=0,o="";for(;t<i;){let s=n[t];if(s===".")o&&(e.push({type:"key",value:o}),o=""),t++;else if(s==="["){o&&(e.push({type:"key",value:o}),o=""),t++;let r=t;for(;t<i&&n[t]!=="]";)t++;let f=n.slice(r,t);if(t++,f==="*")e.push({type:"wildcard",value:"*"});else {let u=parseInt(f,10);e.push({type:"index",value:isNaN(u)?f:u});}}else o+=s,t++;}return o&&e.push({type:"key",value:o}),e}function L(n){return n.includes("[*]")}function O(n){let e=R.get(n);return e||(e=L(n)?sn(n):rn(n),R.set(n,e),e)}function rn(n){if(!n.includes(".")&&!n.includes("["))return o=>o?.[n];let e=V(n),i=e.length;if(i===2){let[o,s]=e,r=o.value,f=s.value;return u=>u?.[r]?.[f]}if(i===3){let[o,s,r]=e,f=o.value,u=s.value,c=r.value;return a=>a?.[f]?.[u]?.[c]}let t=e.map(o=>o.value);return o=>{let s=o;for(let r=0;r<i&&s!=null;r++)s=s[t[r]];return s}}function sn(n){let e=V(n),i=[];for(let t=0;t<e.length;t++)e[t].type==="wildcard"&&i.push(t);return i.length===1?ln(e,i[0]):fn(e,i)}function ln(n,e){let i=n.slice(0,e).map(r=>r.value),t=n.slice(e+1).map(r=>r.value),o=i.length,s=t.length;if(s===0){if(o===1){let r=i[0];return f=>f?.[r]}return r=>{let f=r;for(let u=0;u<o&&f!=null;u++)f=f[i[u]];return f}}if(s===1){let r=t[0];if(o===1){let f=i[0];return u=>{let c=u?.[f];if(Array.isArray(c))return c.map(a=>a?.[r])}}return f=>{let u=f;for(let c=0;c<o&&u!=null;c++)u=u[i[c]];if(Array.isArray(u))return u.map(c=>c?.[r])}}return r=>{let f=r;for(let u=0;u<o&&f!=null;u++)f=f[i[u]];if(Array.isArray(f))return f.map(u=>{let c=u;for(let a=0;a<s&&c!=null;a++)c=c[t[a]];return c})}}function fn(n,e){let i=[],t=0;for(let s=0;s<e.length;s++){let r=e[s],f=s===e.length-1,u=n.slice(t,r).map(c=>c.value);u.length>0&&i.push({type:"access",keys:u}),i.push({type:f?"map":"flatMap",keys:[]}),t=r+1;}let o=n.slice(t).map(s=>s.value);return s=>{let r=s;for(let f of i){if(r==null)return;if(f.type==="access")for(let u of f.keys){if(r==null)return;r=r[u];}else if(f.type==="flatMap"){if(!Array.isArray(r))return;r=r.flatMap(u=>{let c=u;return Array.isArray(c)?c:[c]});}else if(f.type==="map"){if(!Array.isArray(r))return;o.length>0&&(r=r.map(u=>{let c=u;for(let a of o){if(c==null)return;c=c[a];}return c}));}}return r}}function un(n,e){return O(e)(n)}function k(n){let e=n.indexOf("[*]");return e===-1?n:n.slice(0,e)}function cn(){R.clear();}function an(){return R.size}function S(n){let e=new Set;return $(n,e),Array.from(e)}function $(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let o=0;o<n.length;o++)$(n[o],e);return}if(m(n)){e.add(k(n.$));return}if(E(n)){if(typeof n.$if=="string"){let o=n.$if.startsWith("!")?n.$if.slice(1):n.$if;e.add(k(o));}else $(n.$if,e);$(n.then,e),n.else!==void 0&&$(n.else,e);return}if(C(n)){for(let o=0;o<n.$pipe.length;o++)$(n.$pipe[o],e);return}if(T(n)){if(n.args)for(let o=0;o<n.args.length;o++)$(n.args[o],e);return}if(g(n)){e.add(k(n.path)),n.value!==void 0&&conditions.isRef(n.value)&&e.add(k(n.value.$));return}if(y(n)){for(let o=0;o<n.conditions.length;o++)$(n.conditions[o],e);return}let i=n,t=Object.keys(i);for(let o=0;o<t.length;o++)$(i[t[o]],e);}function dn(n){return S(n).length>0}function mn(n){return S(n).length===0}function gn(n){return JSON.stringify(n)}function F(n,e={}){let i=e.scope??{},t=e.accessor,o=A(n,i,t),s=S(n),r=gn(n);return {fn:o,deps:s,hash:r}}function A(n,e,i){if(n===null)return ()=>null;if(typeof n!="object")return ()=>n;if(Array.isArray(n)){let t=n.map(o=>A(o,e,i));return o=>t.map(s=>s(o))}if(m(n))return yn(n,i);if(E(n))return hn(n,e,i);if(C(n))return En(n,e,i);if(T(n))return Tn(n,e,i);if(g(n))return conditions.compile(n,i?{accessor:i}:void 0);if(y(n))return conditions.compile(n,i?{accessor:i}:void 0);if(P(n)){let t=n,o=Object.keys(t),s=o.map(r=>A(t[r],e,i));return r=>{let f={};for(let u=0;u<o.length;u++)f[o[u]]=s[u](r);return f}}return ()=>n}function q(n,e){return e?i=>e(n,i):O(n)}function yn(n,e){return q(n.$,e)}function hn(n,e,i){let t;if(typeof n.$if=="string"){let r=n.$if.startsWith("!")?n.$if.slice(1):n.$if,f=q(r,i);t=n.$if.startsWith("!")?c=>!f(c):c=>!!f(c);}else {let r=A(n.$if,e,i);t=f=>!!r(f);}let o=A(n.then,e,i),s=n.else!==void 0?A(n.else,e,i):()=>{};return r=>t(r)?o(r):s(r)}function En(n,e,i){let t=n.$pipe;if(t.length===0)return ()=>{};if(t.length===1)return A(t[0],e,i);let o=A(t[0],e,i),s=t.slice(1).map(f=>A(f,e,i)),r=s.length;if(r===1){let[f]=s;return u=>{let c=o(u),a=f(u);return typeof a=="function"?a(c):a}}if(r===2){let[f,u]=s;return c=>{let a=o(c),p=f(c);return a=typeof p=="function"?p(a):p,p=u(c),typeof p=="function"?p(a):p}}if(r===3){let[f,u,c]=s;return a=>{let p=o(a),h=f(a);return p=typeof h=="function"?h(p):h,h=u(a),p=typeof h=="function"?h(p):h,h=c(a),typeof h=="function"?h(p):h}}return f=>{let u=o(f);for(let c=0;c<r;c++){let a=s[c](f);u=typeof a=="function"?a(u):a;}return u}}function Tn(n,e,i){let t=n.$fn,o=n.args;if(o===void 0)return ()=>{let f=e[t];if(!f)throw new Error(`Function not found in scope: ${t}`);return f};let s=o.map(f=>A(f,e,i)),r=s.length;if(r===0)return f=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u()};if(r===1){let[f]=s;return u=>{let c=e[t];if(!c)throw new Error(`Function not found in scope: ${t}`);return c(f(u))}}if(r===2){let[f,u]=s;return c=>{let a=e[t];if(!a)throw new Error(`Function not found in scope: ${t}`);return a(f(c),u(c))}}if(r===3){let[f,u,c]=s;return a=>{let p=e[t];if(!p)throw new Error(`Function not found in scope: ${t}`);return p(f(a),u(a),c(a))}}return f=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u(...s.map(c=>c(f)))}}function Cn(n,e,i={}){return F(n,i).fn(e)}var v=class{constructor(e=1e3){this.cache=new Map,this._maxSize=e;}get(e,i={}){let t=JSON.stringify(e),o=this.cache.get(t);if(o)return this.cache.delete(t),this.cache.set(t,o),o;let s=F(e,i);if(this.cache.size>=this._maxSize){let r=this.cache.keys().next().value;r&&this.cache.delete(r);}return this.cache.set(t,s),s}has(e){return this.cache.has(JSON.stringify(e))}delete(e){return this.cache.delete(JSON.stringify(e))}clear(){this.cache.clear();}get size(){return this.cache.size}get maxSize(){return this._maxSize}set maxSize(e){for(this._maxSize=e;this.cache.size>this._maxSize;){let i=this.cache.keys().next().value;i&&this.cache.delete(i);}}},J=new v;function An(n,e={}){return J.get(n,e)}function z(n,e="root",i={}){let t=[];return x(n,e,t,i),{valid:t.length===0,errors:t}}function x(n,e,i,t){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let r=0;r<n.length;r++)x(n[r],`${e}[${r}]`,i,t);return}if(m(n)){(!n.$||typeof n.$!="string")&&i.push(`${e}: invalid reference, $ must be non-empty string`);return}if(E(n)){typeof n.$if=="string"?(n.$if.startsWith("!")?n.$if.slice(1):n.$if)||i.push(`${e}.$if: empty path in string shorthand`):x(n.$if,`${e}.$if`,i,t),x(n.then,`${e}.then`,i,t),n.else!==void 0&&x(n.else,`${e}.else`,i,t);return}if(C(n)){if(!Array.isArray(n.$pipe)){i.push(`${e}.$pipe: must be an array`);return}if(n.$pipe.length===0){i.push(`${e}.$pipe: must have at least one element`);return}for(let r=0;r<n.$pipe.length;r++)x(n.$pipe[r],`${e}.$pipe[${r}]`,i,t);return}if(T(n)){if(!n.$fn||typeof n.$fn!="string"){i.push(`${e}: invalid function, $fn must be non-empty string`);return}if(t.scope&&!(n.$fn in t.scope)&&i.push(`${e}: function "${n.$fn}" not found in scope`),n.args!==void 0)if(!Array.isArray(n.args))i.push(`${e}.args: must be an array`);else for(let r=0;r<n.args.length;r++)x(n.args[r],`${e}.args[${r}]`,i,t);return}if(g(n)){let r=conditions.validate(n,e);r.valid||i.push(...r.errors);return}if(y(n)){let r=conditions.validate(n,e);r.valid||i.push(...r.errors);return}let o=n,s=Object.keys(o);for(let r=0;r<s.length;r++){let f=s[r];x(o[f],`${e}.${f}`,i,t);}}function bn(n,e={}){let i=z(n,"root",e);if(!i.valid)throw new Error(`Invalid expression: ${i.errors.join("; ")}`)}function $n(n,e={}){return z(n,"root",e).valid}var Q={};tn(Q,{$:()=>K,$fn:()=>Y,$if:()=>kn,$pipe:()=>H,fn:()=>Sn,pipe:()=>wn,ref:()=>xn});function K(n){return {$:n}}var xn=K;function Y(n,e){return e===void 0||e.length===0?{$fn:n}:{$fn:n,args:e}}var Sn=Y;function kn(n,e,i){return i===void 0?{$if:n,then:e}:{$if:n,then:e,else:i}}function H(...n){return {$pipe:n}}var wn=H;var D="data",U="scope",Rn={eq:"===",neq:"!==",gt:">",gte:">=",lt:"<",lte:"<="};function j(n,e={}){let{dataParam:i=D,scopeParam:t=U,noPrefixes:o=false}=e;return d(n,i,t,o)}function d(n,e,i,t){if(n===null)return omniAst.builders.literal(null);if(typeof n=="string")return omniAst.builders.literal(n);if(typeof n=="number")return omniAst.builders.literal(n);if(typeof n=="boolean")return omniAst.builders.literal(n);if(Array.isArray(n))return omniAst.builders.arrayExpression(n.map(o=>d(o,e,i,t)));if(m(n))return On(n.$,e,t);if(E(n))return vn(n,e,i,t);if(C(n))return jn(n.$pipe,e,i,t);if(T(n))return Nn(n,e,i,t);if(g(n))return Gn(n,e,i,t);if(y(n))return Wn(n,e,i,t);if(typeof n=="object"){let s=Object.entries(n).map(([r,f])=>omniAst.builders.property(omniAst.builders.identifier(r),d(f,e,i,t)));return omniAst.builders.objectExpression(s)}return omniAst.builders.literal(null)}function On(n,e,i){return n.includes("[*]")?Fn(n,e,i):w(n,e,i)}function w(n,e,i){let t=N(n);if(t.length===0)return i?omniAst.builders.identifier("undefined"):omniAst.builders.identifier(e);let o;if(i){let s=t[0];o=omniAst.builders.identifier(s.value);for(let r=1;r<t.length;r++){let f=t[r];f.type==="key"?o=omniAst.builders.memberExpression(o,omniAst.builders.identifier(f.value),false,true):o=omniAst.builders.memberExpression(o,omniAst.builders.literal(f.value),true,true);}}else {o=omniAst.builders.identifier(e);for(let s of t)s.type==="key"?o=omniAst.builders.memberExpression(o,omniAst.builders.identifier(s.value),false,true):o=omniAst.builders.memberExpression(o,omniAst.builders.literal(s.value),true,true);}return o}function Fn(n,e,i){let t=n.indexOf("[*]"),o=n.slice(0,t),s=n.slice(t+3),r;if(o?r=w(o,e,i):r=i?omniAst.builders.identifier("undefined"):omniAst.builders.identifier(e),!s||s==="")return r;if(s.includes("[*]"))return X(r,s);let f="_i",u=s.startsWith(".")?s.slice(1):s,c=omniAst.builders.identifier(f);if(u){let a=N(u);for(let p of a)p.type==="key"?c=omniAst.builders.memberExpression(c,omniAst.builders.identifier(p.value),false,true):c=omniAst.builders.memberExpression(c,omniAst.builders.literal(p.value),true,true);}return omniAst.builders.callExpression(omniAst.builders.memberExpression(r,omniAst.builders.identifier("map"),false,true),[omniAst.builders.arrowFunctionExpression([omniAst.builders.identifier(f)],c)])}function X(n,e){let i=e.indexOf("[*]"),t=e.slice(0,i),o=e.slice(i+3),s="_i",r=t.startsWith(".")?t.slice(1):t,f=omniAst.builders.identifier(s);if(r){let c=N(r);for(let a of c)a.type==="key"&&(f=omniAst.builders.memberExpression(f,omniAst.builders.identifier(a.value),false,true));}if(o.includes("[*]")){let c=X(f,o);return omniAst.builders.callExpression(omniAst.builders.memberExpression(n,omniAst.builders.identifier("flatMap"),false,true),[omniAst.builders.arrowFunctionExpression([omniAst.builders.identifier(s)],c)])}let u=o.startsWith(".")?o.slice(1):o;if(u){let c=N(u);for(let a of c)a.type==="key"&&(f=omniAst.builders.memberExpression(f,omniAst.builders.identifier(a.value),false,true));}return omniAst.builders.callExpression(omniAst.builders.memberExpression(n,omniAst.builders.identifier("flatMap"),false,true),[omniAst.builders.arrowFunctionExpression([omniAst.builders.identifier(s)],f)])}function vn(n,e,i,t){let o;if(typeof n.$if=="string"){let f=n.$if.startsWith("!"),u=f?n.$if.slice(1):n.$if,c=w(u,e,t);o=f?omniAst.builders.unaryExpression("!",c):c;}else o=d(n.$if,e,i,t);let s=d(n.then,e,i,t),r=n.else!==void 0?d(n.else,e,i,t):omniAst.builders.identifier("undefined");return omniAst.builders.conditionalExpression(o,s,r)}function Nn(n,e,i,t){let o=t?omniAst.builders.identifier(n.$fn):omniAst.builders.memberExpression(omniAst.builders.identifier(i),omniAst.builders.identifier(n.$fn),false,false);if(n.args===void 0)return o;let s=n.args.map(r=>d(r,e,i,t));return omniAst.builders.callExpression(o,s)}function jn(n,e,i,t){if(n.length===0)return omniAst.builders.identifier("undefined");if(n.length===1)return d(n[0],e,i,t);let o=d(n[0],e,i,t);for(let s=1;s<n.length;s++){let r=d(n[s],e,i,t);o=omniAst.builders.callExpression(r,[o]);}return o}function Gn(n,e,i,t){let o=w(n.path,e,t),s=n.value!==void 0?m(n.value)?w(n.value.$,e,t):d(n.value,e,i,t):omniAst.builders.literal(null),r=Rn[n.op];if(r)return omniAst.builders.binaryExpression(r,o,s);switch(n.op){case "in":return omniAst.builders.callExpression(omniAst.builders.memberExpression(s,omniAst.builders.identifier("includes")),[o]);case "notIn":return omniAst.builders.unaryExpression("!",omniAst.builders.callExpression(omniAst.builders.memberExpression(s,omniAst.builders.identifier("includes")),[o]));case "contains":return omniAst.builders.callExpression(omniAst.builders.memberExpression(o,omniAst.builders.identifier("includes"),false,true),[s]);case "notContains":return omniAst.builders.unaryExpression("!",omniAst.builders.callExpression(omniAst.builders.memberExpression(o,omniAst.builders.identifier("includes"),false,true),[s]));case "exists":return omniAst.builders.binaryExpression("!=",o,omniAst.builders.literal(null));case "notExists":return omniAst.builders.binaryExpression("==",o,omniAst.builders.literal(null));case "matches":return omniAst.builders.callExpression(omniAst.builders.memberExpression(omniAst.builders.newExpression(omniAst.builders.identifier("RegExp"),[s]),omniAst.builders.identifier("test")),[o]);case "notMatches":return omniAst.builders.unaryExpression("!",omniAst.builders.callExpression(omniAst.builders.memberExpression(omniAst.builders.newExpression(omniAst.builders.identifier("RegExp"),[s]),omniAst.builders.identifier("test")),[o]));case "startsWith":return omniAst.builders.callExpression(omniAst.builders.memberExpression(o,omniAst.builders.identifier("startsWith"),false,true),[s]);case "endsWith":return omniAst.builders.callExpression(omniAst.builders.memberExpression(o,omniAst.builders.identifier("endsWith"),false,true),[s]);default:return omniAst.builders.binaryExpression("===",o,s)}}function Wn(n,e,i,t){let{logic:o,conditions:s}=n,r=o==="AND"?"&&":"||";if(s.length===0)return omniAst.builders.literal(o==="AND");if(s.length===1)return d(s[0],e,i,t);let f=d(s[0],e,i,t);for(let u=1;u<s.length;u++){let c=d(s[u],e,i,t);f=omniAst.builders.logicalExpression(r,f,c);}return f}function N(n){let e=[],i=n.length,t=0,o="";for(;t<i;){let s=n[t];if(s===".")o&&(e.push({type:"key",value:o}),o=""),t++;else if(s==="["){o&&(e.push({type:"key",value:o}),o=""),t++;let r=t;for(;t<i&&n[t]!=="]";)t++;let f=n.slice(r,t);if(t++,f!=="*"){let u=parseInt(f,10);e.push({type:"index",value:isNaN(u)?f:u});}}else o+=s,t++;}return o&&e.push({type:"key",value:o}),e}function Z(n,e=[D]){return omniAst.builders.arrowFunctionExpression(e.map(i=>omniAst.builders.identifier(i)),n)}function G(n){let e=new Set;return b(n,e),e}function b(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let t of n)b(t,e);return}if(m(n))return;if(E(n)){b(n.$if,e),b(n.then,e),n.else!==void 0&&b(n.else,e);return}if(C(n)){for(let t of n.$pipe)b(t,e);return}if(T(n)){if(e.add(n.$fn),n.args)for(let t of n.args)b(t,e);return}if(g(n)){n.value!==void 0&&typeof n.value=="object"&&b(n.value,e);return}if(y(n)){for(let t of n.conditions)b(t,e);return}let i=n;for(let t of Object.keys(i))b(i[t],e);}function W(n){let e=new Set;for(let i of n){let t=i.indexOf("."),o=i.indexOf("["),s=i.length;t!==-1&&(s=Math.min(s,t)),o!==-1&&(s=Math.min(s,o));let r=i.slice(0,s);r&&e.add(r);}return e}function zn(n){return JSON.stringify(n)}function Dn(n,e,i){let t=j(n,{noPrefixes:true}),o=omniAst.generate(t),s=e.size>0?`const{${[...e].join(",")}}=data??{};`:"",r=i.size>0?`const{${[...i].join(",")}}=scope;`:"";return r?`(function(scope){${r}return function(data){${s}return ${o}}})`:`(function(){return function(data){${s}return ${o}}})`}function M(n,e={}){let{scope:i={},returnCode:t=false}=e,o=S(n),s=W(o),r=G(n),f=zn(n),u=Dn(n,s,r);if(t)return {code:u,deps:o,hash:f,dataRoots:[...s],scopeFns:[...r]};let c;try{c=new Function(`return ${u}`)()(i);}catch(a){throw new Error(`AST compilation failed. If this is due to CSP, use the standard compile() function instead. Error: ${a instanceof Error?a.message:String(a)}`)}return {fn:c,deps:o,hash:f}}function nn(n,e,i={}){let{fn:t}=M(n,i);return t(e)}var ye="0.1.1";exports.ExpressionCache=v;exports.VERSION=ye;exports.assertValid=bn;exports.builders=Q;exports.cache=J;exports.cached=An;exports.clearPathCache=cn;exports.compile=F;exports.compileAST=M;exports.compilePath=O;exports.dslToAST=j;exports.evaluate=Cn;exports.evaluateAST=nn;exports.extractDataRoots=W;exports.extractDeps=S;exports.extractScopeFns=G;exports.get=un;exports.getPathCacheSize=an;exports.hasDeps=dn;exports.hasWildcard=L;exports.isCondition=g;exports.isConditionExpr=on;exports.isConditionGroup=y;exports.isConditional=E;exports.isFn=T;exports.isLiteral=P;exports.isPipe=C;exports.isPure=mn;exports.isRef=m;exports.isValid=$n;exports.normalizePath=k;exports.validate=z;exports.wrapInFunction=Z;
package/dist/index.d.cts CHANGED
@@ -649,6 +649,6 @@ declare function evaluateAST<T = unknown, R = unknown>(expr: Expression, data: T
649
649
  * ); // 3
650
650
  * ```
651
651
  */
652
- declare const VERSION = "0.1.0";
652
+ declare const VERSION = "0.1.1";
653
653
 
654
654
  export { type AccessorFn, type CallbackFn, type CompileASTCodeResult, type CompileASTOptions, type CompileOptions, type CompiledExpression, type CompiledFn, type ConditionalExpr, type Expression, ExpressionCache, type FnExpr, type Literal, type PathGetter, type PipeExpr, type RefExpr, type Scope, type TransformOptions, VERSION, type ValidateOptions, type ValidationResult, assertValid, builders, cache, cached, clearPathCache, compile, compileAST, compilePath, dslToAST, evaluate, evaluateAST, extractDataRoots, extractDeps, extractScopeFns, get, getPathCacheSize, hasDeps, hasWildcard, isCondition, isConditionExpr, isConditionGroup, isConditional, isFn, isLiteral, isPipe, isPure, isRef, isValid, normalizePath, validate, wrapInFunction };
package/dist/index.d.ts CHANGED
@@ -649,6 +649,6 @@ declare function evaluateAST<T = unknown, R = unknown>(expr: Expression, data: T
649
649
  * ); // 3
650
650
  * ```
651
651
  */
652
- declare const VERSION = "0.1.0";
652
+ declare const VERSION = "0.1.1";
653
653
 
654
654
  export { type AccessorFn, type CallbackFn, type CompileASTCodeResult, type CompileASTOptions, type CompileOptions, type CompiledExpression, type CompiledFn, type ConditionalExpr, type Expression, ExpressionCache, type FnExpr, type Literal, type PathGetter, type PipeExpr, type RefExpr, type Scope, type TransformOptions, VERSION, type ValidateOptions, type ValidationResult, assertValid, builders, cache, cached, clearPathCache, compile, compileAST, compilePath, dslToAST, evaluate, evaluateAST, extractDataRoots, extractDeps, extractScopeFns, get, getPathCacheSize, hasDeps, hasWildcard, isCondition, isConditionExpr, isConditionGroup, isConditional, isFn, isLiteral, isPipe, isPure, isRef, isValid, normalizePath, validate, wrapInFunction };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import {isRef,compile,validate}from'@statedelta-libs/conditions';import {builders,generate}from'omni-ast';var en=Object.defineProperty;var tn=(n,e)=>{for(var i in e)en(n,i,{get:e[i],enumerable:true});};var m=n=>n!==null&&typeof n=="object"&&"$"in n&&typeof n.$=="string"&&Object.keys(n).length===1,E=n=>n!==null&&typeof n=="object"&&"$if"in n&&"then"in n,T=n=>n!==null&&typeof n=="object"&&"$fn"in n&&typeof n.$fn=="string",C=n=>n!==null&&typeof n=="object"&&"$pipe"in n&&Array.isArray(n.$pipe),I=new Set(["eq","neq","gt","gte","lt","lte","in","notIn","contains","notContains","exists","notExists","matches","notMatches","startsWith","endsWith"]),g=n=>n!==null&&typeof n=="object"&&"path"in n&&"op"in n&&I.has(n.op)&&!("$"in n)&&!("$if"in n)&&!("$fn"in n),y=n=>n!==null&&typeof n=="object"&&"logic"in n&&"conditions"in n,on=n=>g(n)||y(n),P=n=>{if(n===null)return true;let e=typeof n;if(e==="string"||e==="number"||e==="boolean"||Array.isArray(n))return true;if(e==="object"&&n!==null){let i=n,t="path"in i&&"op"in i&&I.has(i.op);return !("$"in i)&&!("$if"in i)&&!("$fn"in i)&&!("$pipe"in i)&&!t&&!("logic"in i)}return false};var R=new Map;function V(n){let e=[],i=n.length,t=0,o="";for(;t<i;){let s=n[t];if(s===".")o&&(e.push({type:"key",value:o}),o=""),t++;else if(s==="["){o&&(e.push({type:"key",value:o}),o=""),t++;let r=t;for(;t<i&&n[t]!=="]";)t++;let f=n.slice(r,t);if(t++,f==="*")e.push({type:"wildcard",value:"*"});else {let u=parseInt(f,10);e.push({type:"index",value:isNaN(u)?f:u});}}else o+=s,t++;}return o&&e.push({type:"key",value:o}),e}function L(n){return n.includes("[*]")}function O(n){let e=R.get(n);return e||(e=L(n)?sn(n):rn(n),R.set(n,e),e)}function rn(n){if(!n.includes(".")&&!n.includes("["))return o=>o?.[n];let e=V(n),i=e.length;if(i===2){let[o,s]=e,r=o.value,f=s.value;return u=>u?.[r]?.[f]}if(i===3){let[o,s,r]=e,f=o.value,u=s.value,c=r.value;return a=>a?.[f]?.[u]?.[c]}let t=e.map(o=>o.value);return o=>{let s=o;for(let r=0;r<i&&s!=null;r++)s=s[t[r]];return s}}function sn(n){let e=V(n),i=[];for(let t=0;t<e.length;t++)e[t].type==="wildcard"&&i.push(t);return i.length===1?ln(e,i[0]):fn(e,i)}function ln(n,e){let i=n.slice(0,e).map(r=>r.value),t=n.slice(e+1).map(r=>r.value),o=i.length,s=t.length;if(s===0){if(o===1){let r=i[0];return f=>f?.[r]}return r=>{let f=r;for(let u=0;u<o&&f!=null;u++)f=f[i[u]];return f}}if(s===1){let r=t[0];if(o===1){let f=i[0];return u=>{let c=u?.[f];if(Array.isArray(c))return c.map(a=>a?.[r])}}return f=>{let u=f;for(let c=0;c<o&&u!=null;c++)u=u[i[c]];if(Array.isArray(u))return u.map(c=>c?.[r])}}return r=>{let f=r;for(let u=0;u<o&&f!=null;u++)f=f[i[u]];if(Array.isArray(f))return f.map(u=>{let c=u;for(let a=0;a<s&&c!=null;a++)c=c[t[a]];return c})}}function fn(n,e){let i=[],t=0;for(let s=0;s<e.length;s++){let r=e[s],f=s===e.length-1,u=n.slice(t,r).map(c=>c.value);u.length>0&&i.push({type:"access",keys:u}),i.push({type:f?"map":"flatMap",keys:[]}),t=r+1;}let o=n.slice(t).map(s=>s.value);return s=>{let r=s;for(let f of i){if(r==null)return;if(f.type==="access")for(let u of f.keys){if(r==null)return;r=r[u];}else if(f.type==="flatMap"){if(!Array.isArray(r))return;r=r.flatMap(u=>{let c=u;return Array.isArray(c)?c:[c]});}else if(f.type==="map"){if(!Array.isArray(r))return;o.length>0&&(r=r.map(u=>{let c=u;for(let a of o){if(c==null)return;c=c[a];}return c}));}}return r}}function un(n,e){return O(e)(n)}function k(n){let e=n.indexOf("[*]");return e===-1?n:n.slice(0,e)}function cn(){R.clear();}function an(){return R.size}function S(n){let e=new Set;return $(n,e),Array.from(e)}function $(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let o=0;o<n.length;o++)$(n[o],e);return}if(m(n)){e.add(k(n.$));return}if(E(n)){if(typeof n.$if=="string"){let o=n.$if.startsWith("!")?n.$if.slice(1):n.$if;e.add(k(o));}else $(n.$if,e);$(n.then,e),n.else!==void 0&&$(n.else,e);return}if(C(n)){for(let o=0;o<n.$pipe.length;o++)$(n.$pipe[o],e);return}if(T(n)){if(n.args)for(let o=0;o<n.args.length;o++)$(n.args[o],e);return}if(g(n)){e.add(k(n.path)),n.value!==void 0&&isRef(n.value)&&e.add(k(n.value.$));return}if(y(n)){for(let o=0;o<n.conditions.length;o++)$(n.conditions[o],e);return}let i=n,t=Object.keys(i);for(let o=0;o<t.length;o++)$(i[t[o]],e);}function dn(n){return S(n).length>0}function mn(n){return S(n).length===0}function gn(n){return JSON.stringify(n)}function F(n,e={}){let i=e.scope??{},t=e.accessor,o=A(n,i,t),s=S(n),r=gn(n);return {fn:o,deps:s,hash:r}}function A(n,e,i){if(n===null)return ()=>null;if(typeof n!="object")return ()=>n;if(Array.isArray(n)){let t=n.map(o=>A(o,e,i));return o=>t.map(s=>s(o))}if(m(n))return yn(n,i);if(E(n))return hn(n,e,i);if(C(n))return En(n,e,i);if(T(n))return Tn(n,e,i);if(g(n))return compile(n,i?{accessor:i}:void 0);if(y(n))return compile(n,i?{accessor:i}:void 0);if(P(n)){let t=n,o=Object.keys(t),s=o.map(r=>A(t[r],e,i));return r=>{let f={};for(let u=0;u<o.length;u++)f[o[u]]=s[u](r);return f}}return ()=>n}function q(n,e){return e?i=>e(n,i):O(n)}function yn(n,e){return q(n.$,e)}function hn(n,e,i){let t;if(typeof n.$if=="string"){let r=n.$if.startsWith("!")?n.$if.slice(1):n.$if,f=q(r,i);t=n.$if.startsWith("!")?c=>!f(c):c=>!!f(c);}else {let r=A(n.$if,e,i);t=f=>!!r(f);}let o=A(n.then,e,i),s=n.else!==void 0?A(n.else,e,i):()=>{};return r=>t(r)?o(r):s(r)}function En(n,e,i){let t=n.$pipe;if(t.length===0)return ()=>{};if(t.length===1)return A(t[0],e,i);let o=A(t[0],e,i),s=t.slice(1).map(f=>A(f,e,i)),r=s.length;if(r===1){let[f]=s;return u=>{let c=o(u),a=f(u);return typeof a=="function"?a(c):a}}if(r===2){let[f,u]=s;return c=>{let a=o(c),p=f(c);return a=typeof p=="function"?p(a):p,p=u(c),typeof p=="function"?p(a):p}}if(r===3){let[f,u,c]=s;return a=>{let p=o(a),h=f(a);return p=typeof h=="function"?h(p):h,h=u(a),p=typeof h=="function"?h(p):h,h=c(a),typeof h=="function"?h(p):h}}return f=>{let u=o(f);for(let c=0;c<r;c++){let a=s[c](f);u=typeof a=="function"?a(u):a;}return u}}function Tn(n,e,i){let t=n.$fn,o=n.args;if(o===void 0)return ()=>{let f=e[t];if(!f)throw new Error(`Function not found in scope: ${t}`);return f};let s=o.map(f=>A(f,e,i)),r=s.length;if(r===0)return f=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u()};if(r===1){let[f]=s;return u=>{let c=e[t];if(!c)throw new Error(`Function not found in scope: ${t}`);return c(f(u))}}if(r===2){let[f,u]=s;return c=>{let a=e[t];if(!a)throw new Error(`Function not found in scope: ${t}`);return a(f(c),u(c))}}if(r===3){let[f,u,c]=s;return a=>{let p=e[t];if(!p)throw new Error(`Function not found in scope: ${t}`);return p(f(a),u(a),c(a))}}return f=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u(...s.map(c=>c(f)))}}function Cn(n,e,i={}){return F(n,i).fn(e)}var v=class{constructor(e=1e3){this.cache=new Map,this._maxSize=e;}get(e,i={}){let t=JSON.stringify(e),o=this.cache.get(t);if(o)return this.cache.delete(t),this.cache.set(t,o),o;let s=F(e,i);if(this.cache.size>=this._maxSize){let r=this.cache.keys().next().value;r&&this.cache.delete(r);}return this.cache.set(t,s),s}has(e){return this.cache.has(JSON.stringify(e))}delete(e){return this.cache.delete(JSON.stringify(e))}clear(){this.cache.clear();}get size(){return this.cache.size}get maxSize(){return this._maxSize}set maxSize(e){for(this._maxSize=e;this.cache.size>this._maxSize;){let i=this.cache.keys().next().value;i&&this.cache.delete(i);}}},J=new v;function An(n,e={}){return J.get(n,e)}function z(n,e="root",i={}){let t=[];return x(n,e,t,i),{valid:t.length===0,errors:t}}function x(n,e,i,t){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let r=0;r<n.length;r++)x(n[r],`${e}[${r}]`,i,t);return}if(m(n)){(!n.$||typeof n.$!="string")&&i.push(`${e}: invalid reference, $ must be non-empty string`);return}if(E(n)){typeof n.$if=="string"?(n.$if.startsWith("!")?n.$if.slice(1):n.$if)||i.push(`${e}.$if: empty path in string shorthand`):x(n.$if,`${e}.$if`,i,t),x(n.then,`${e}.then`,i,t),n.else!==void 0&&x(n.else,`${e}.else`,i,t);return}if(C(n)){if(!Array.isArray(n.$pipe)){i.push(`${e}.$pipe: must be an array`);return}if(n.$pipe.length===0){i.push(`${e}.$pipe: must have at least one element`);return}for(let r=0;r<n.$pipe.length;r++)x(n.$pipe[r],`${e}.$pipe[${r}]`,i,t);return}if(T(n)){if(!n.$fn||typeof n.$fn!="string"){i.push(`${e}: invalid function, $fn must be non-empty string`);return}if(t.scope&&!(n.$fn in t.scope)&&i.push(`${e}: function "${n.$fn}" not found in scope`),n.args!==void 0)if(!Array.isArray(n.args))i.push(`${e}.args: must be an array`);else for(let r=0;r<n.args.length;r++)x(n.args[r],`${e}.args[${r}]`,i,t);return}if(g(n)){let r=validate(n,e);r.valid||i.push(...r.errors);return}if(y(n)){let r=validate(n,e);r.valid||i.push(...r.errors);return}let o=n,s=Object.keys(o);for(let r=0;r<s.length;r++){let f=s[r];x(o[f],`${e}.${f}`,i,t);}}function bn(n,e={}){let i=z(n,"root",e);if(!i.valid)throw new Error(`Invalid expression: ${i.errors.join("; ")}`)}function $n(n,e={}){return z(n,"root",e).valid}var Q={};tn(Q,{$:()=>K,$fn:()=>Y,$if:()=>kn,$pipe:()=>H,fn:()=>Sn,pipe:()=>wn,ref:()=>xn});function K(n){return {$:n}}var xn=K;function Y(n,e){return e===void 0||e.length===0?{$fn:n}:{$fn:n,args:e}}var Sn=Y;function kn(n,e,i){return i===void 0?{$if:n,then:e}:{$if:n,then:e,else:i}}function H(...n){return {$pipe:n}}var wn=H;var D="data",U="scope",Rn={eq:"===",neq:"!==",gt:">",gte:">=",lt:"<",lte:"<="};function j(n,e={}){let{dataParam:i=D,scopeParam:t=U,noPrefixes:o=false}=e;return d(n,i,t,o)}function d(n,e,i,t){if(n===null)return builders.literal(null);if(typeof n=="string")return builders.literal(n);if(typeof n=="number")return builders.literal(n);if(typeof n=="boolean")return builders.literal(n);if(Array.isArray(n))return builders.arrayExpression(n.map(o=>d(o,e,i,t)));if(m(n))return On(n.$,e,t);if(E(n))return vn(n,e,i,t);if(C(n))return jn(n.$pipe,e,i,t);if(T(n))return Nn(n,e,i,t);if(g(n))return Gn(n,e,i,t);if(y(n))return Wn(n,e,i,t);if(typeof n=="object"){let s=Object.entries(n).map(([r,f])=>builders.property(builders.identifier(r),d(f,e,i,t)));return builders.objectExpression(s)}return builders.literal(null)}function On(n,e,i){return n.includes("[*]")?Fn(n,e,i):w(n,e,i)}function w(n,e,i){let t=N(n);if(t.length===0)return i?builders.identifier("undefined"):builders.identifier(e);let o;if(i){let s=t[0];o=builders.identifier(s.value);for(let r=1;r<t.length;r++){let f=t[r];f.type==="key"?o=builders.memberExpression(o,builders.identifier(f.value),false,true):o=builders.memberExpression(o,builders.literal(f.value),true,true);}}else {o=builders.identifier(e);for(let s of t)s.type==="key"?o=builders.memberExpression(o,builders.identifier(s.value),false,true):o=builders.memberExpression(o,builders.literal(s.value),true,true);}return o}function Fn(n,e,i){let t=n.indexOf("[*]"),o=n.slice(0,t),s=n.slice(t+3),r;if(o?r=w(o,e,i):r=i?builders.identifier("undefined"):builders.identifier(e),!s||s==="")return r;if(s.includes("[*]"))return X(r,s);let f="_i",u=s.startsWith(".")?s.slice(1):s,c=builders.identifier(f);if(u){let a=N(u);for(let p of a)p.type==="key"?c=builders.memberExpression(c,builders.identifier(p.value),false,true):c=builders.memberExpression(c,builders.literal(p.value),true,true);}return builders.callExpression(builders.memberExpression(r,builders.identifier("map"),false,true),[builders.arrowFunctionExpression([builders.identifier(f)],c)])}function X(n,e){let i=e.indexOf("[*]"),t=e.slice(0,i),o=e.slice(i+3),s="_i",r=t.startsWith(".")?t.slice(1):t,f=builders.identifier(s);if(r){let c=N(r);for(let a of c)a.type==="key"&&(f=builders.memberExpression(f,builders.identifier(a.value),false,true));}if(o.includes("[*]")){let c=X(f,o);return builders.callExpression(builders.memberExpression(n,builders.identifier("flatMap"),false,true),[builders.arrowFunctionExpression([builders.identifier(s)],c)])}let u=o.startsWith(".")?o.slice(1):o;if(u){let c=N(u);for(let a of c)a.type==="key"&&(f=builders.memberExpression(f,builders.identifier(a.value),false,true));}return builders.callExpression(builders.memberExpression(n,builders.identifier("flatMap"),false,true),[builders.arrowFunctionExpression([builders.identifier(s)],f)])}function vn(n,e,i,t){let o;if(typeof n.$if=="string"){let f=n.$if.startsWith("!"),u=f?n.$if.slice(1):n.$if,c=w(u,e,t);o=f?builders.unaryExpression("!",c):c;}else o=d(n.$if,e,i,t);let s=d(n.then,e,i,t),r=n.else!==void 0?d(n.else,e,i,t):builders.identifier("undefined");return builders.conditionalExpression(o,s,r)}function Nn(n,e,i,t){let o=t?builders.identifier(n.$fn):builders.memberExpression(builders.identifier(i),builders.identifier(n.$fn),false,false);if(n.args===void 0)return o;let s=n.args.map(r=>d(r,e,i,t));return builders.callExpression(o,s)}function jn(n,e,i,t){if(n.length===0)return builders.identifier("undefined");if(n.length===1)return d(n[0],e,i,t);let o=d(n[0],e,i,t);for(let s=1;s<n.length;s++){let r=d(n[s],e,i,t);o=builders.callExpression(r,[o]);}return o}function Gn(n,e,i,t){let o=w(n.path,e,t),s=n.value!==void 0?m(n.value)?w(n.value.$,e,t):d(n.value,e,i,t):builders.literal(null),r=Rn[n.op];if(r)return builders.binaryExpression(r,o,s);switch(n.op){case "in":return builders.callExpression(builders.memberExpression(s,builders.identifier("includes")),[o]);case "notIn":return builders.unaryExpression("!",builders.callExpression(builders.memberExpression(s,builders.identifier("includes")),[o]));case "contains":return builders.callExpression(builders.memberExpression(o,builders.identifier("includes"),false,true),[s]);case "notContains":return builders.unaryExpression("!",builders.callExpression(builders.memberExpression(o,builders.identifier("includes"),false,true),[s]));case "exists":return builders.binaryExpression("!=",o,builders.literal(null));case "notExists":return builders.binaryExpression("==",o,builders.literal(null));case "matches":return builders.callExpression(builders.memberExpression(builders.newExpression(builders.identifier("RegExp"),[s]),builders.identifier("test")),[o]);case "notMatches":return builders.unaryExpression("!",builders.callExpression(builders.memberExpression(builders.newExpression(builders.identifier("RegExp"),[s]),builders.identifier("test")),[o]));case "startsWith":return builders.callExpression(builders.memberExpression(o,builders.identifier("startsWith"),false,true),[s]);case "endsWith":return builders.callExpression(builders.memberExpression(o,builders.identifier("endsWith"),false,true),[s]);default:return builders.binaryExpression("===",o,s)}}function Wn(n,e,i,t){let{logic:o,conditions:s}=n,r=o==="AND"?"&&":"||";if(s.length===0)return builders.literal(o==="AND");if(s.length===1)return d(s[0],e,i,t);let f=d(s[0],e,i,t);for(let u=1;u<s.length;u++){let c=d(s[u],e,i,t);f=builders.logicalExpression(r,f,c);}return f}function N(n){let e=[],i=n.length,t=0,o="";for(;t<i;){let s=n[t];if(s===".")o&&(e.push({type:"key",value:o}),o=""),t++;else if(s==="["){o&&(e.push({type:"key",value:o}),o=""),t++;let r=t;for(;t<i&&n[t]!=="]";)t++;let f=n.slice(r,t);if(t++,f!=="*"){let u=parseInt(f,10);e.push({type:"index",value:isNaN(u)?f:u});}}else o+=s,t++;}return o&&e.push({type:"key",value:o}),e}function Z(n,e=[D]){return builders.arrowFunctionExpression(e.map(i=>builders.identifier(i)),n)}function G(n){let e=new Set;return b(n,e),e}function b(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let t of n)b(t,e);return}if(m(n))return;if(E(n)){b(n.$if,e),b(n.then,e),n.else!==void 0&&b(n.else,e);return}if(C(n)){for(let t of n.$pipe)b(t,e);return}if(T(n)){if(e.add(n.$fn),n.args)for(let t of n.args)b(t,e);return}if(g(n)){n.value!==void 0&&typeof n.value=="object"&&b(n.value,e);return}if(y(n)){for(let t of n.conditions)b(t,e);return}let i=n;for(let t of Object.keys(i))b(i[t],e);}function W(n){let e=new Set;for(let i of n){let t=i.indexOf("."),o=i.indexOf("["),s=i.length;t!==-1&&(s=Math.min(s,t)),o!==-1&&(s=Math.min(s,o));let r=i.slice(0,s);r&&e.add(r);}return e}function zn(n){return JSON.stringify(n)}function Dn(n,e,i){let t=j(n,{noPrefixes:true}),o=generate(t),s=e.size>0?`const{${[...e].join(",")}}=data??{};`:"",r=i.size>0?`const{${[...i].join(",")}}=scope;`:"";return r?`(function(scope){${r}return function(data){${s}return ${o}}})`:`(function(){return function(data){${s}return ${o}}})`}function M(n,e={}){let{scope:i={},returnCode:t=false}=e,o=S(n),s=W(o),r=G(n),f=zn(n),u=Dn(n,s,r);if(t)return {code:u,deps:o,hash:f,dataRoots:[...s],scopeFns:[...r]};let c;try{c=new Function(`return ${u}`)()(i);}catch(a){throw new Error(`AST compilation failed. If this is due to CSP, use the standard compile() function instead. Error: ${a instanceof Error?a.message:String(a)}`)}return {fn:c,deps:o,hash:f}}function nn(n,e,i={}){let{fn:t}=M(n,i);return t(e)}var ye="0.1.0";export{v as ExpressionCache,ye as VERSION,bn as assertValid,Q as builders,J as cache,An as cached,cn as clearPathCache,F as compile,M as compileAST,O as compilePath,j as dslToAST,Cn as evaluate,nn as evaluateAST,W as extractDataRoots,S as extractDeps,G as extractScopeFns,un as get,an as getPathCacheSize,dn as hasDeps,L as hasWildcard,g as isCondition,on as isConditionExpr,y as isConditionGroup,E as isConditional,T as isFn,P as isLiteral,C as isPipe,mn as isPure,m as isRef,$n as isValid,k as normalizePath,z as validate,Z as wrapInFunction};
1
+ import {isRef,compile,validate}from'@statedelta-libs/conditions';import {builders,generate}from'omni-ast';var en=Object.defineProperty;var tn=(n,e)=>{for(var i in e)en(n,i,{get:e[i],enumerable:true});};var m=n=>n!==null&&typeof n=="object"&&"$"in n&&typeof n.$=="string"&&Object.keys(n).length===1,E=n=>n!==null&&typeof n=="object"&&"$if"in n&&"then"in n,T=n=>n!==null&&typeof n=="object"&&"$fn"in n&&typeof n.$fn=="string",C=n=>n!==null&&typeof n=="object"&&"$pipe"in n&&Array.isArray(n.$pipe),I=new Set(["eq","neq","gt","gte","lt","lte","in","notIn","contains","notContains","exists","notExists","matches","notMatches","startsWith","endsWith"]),g=n=>n!==null&&typeof n=="object"&&"path"in n&&"op"in n&&I.has(n.op)&&!("$"in n)&&!("$if"in n)&&!("$fn"in n),y=n=>n!==null&&typeof n=="object"&&"logic"in n&&"conditions"in n,on=n=>g(n)||y(n),P=n=>{if(n===null)return true;let e=typeof n;if(e==="string"||e==="number"||e==="boolean"||Array.isArray(n))return true;if(e==="object"&&n!==null){let i=n,t="path"in i&&"op"in i&&I.has(i.op);return !("$"in i)&&!("$if"in i)&&!("$fn"in i)&&!("$pipe"in i)&&!t&&!("logic"in i)}return false};var R=new Map;function V(n){let e=[],i=n.length,t=0,o="";for(;t<i;){let s=n[t];if(s===".")o&&(e.push({type:"key",value:o}),o=""),t++;else if(s==="["){o&&(e.push({type:"key",value:o}),o=""),t++;let r=t;for(;t<i&&n[t]!=="]";)t++;let f=n.slice(r,t);if(t++,f==="*")e.push({type:"wildcard",value:"*"});else {let u=parseInt(f,10);e.push({type:"index",value:isNaN(u)?f:u});}}else o+=s,t++;}return o&&e.push({type:"key",value:o}),e}function L(n){return n.includes("[*]")}function O(n){let e=R.get(n);return e||(e=L(n)?sn(n):rn(n),R.set(n,e),e)}function rn(n){if(!n.includes(".")&&!n.includes("["))return o=>o?.[n];let e=V(n),i=e.length;if(i===2){let[o,s]=e,r=o.value,f=s.value;return u=>u?.[r]?.[f]}if(i===3){let[o,s,r]=e,f=o.value,u=s.value,c=r.value;return a=>a?.[f]?.[u]?.[c]}let t=e.map(o=>o.value);return o=>{let s=o;for(let r=0;r<i&&s!=null;r++)s=s[t[r]];return s}}function sn(n){let e=V(n),i=[];for(let t=0;t<e.length;t++)e[t].type==="wildcard"&&i.push(t);return i.length===1?ln(e,i[0]):fn(e,i)}function ln(n,e){let i=n.slice(0,e).map(r=>r.value),t=n.slice(e+1).map(r=>r.value),o=i.length,s=t.length;if(s===0){if(o===1){let r=i[0];return f=>f?.[r]}return r=>{let f=r;for(let u=0;u<o&&f!=null;u++)f=f[i[u]];return f}}if(s===1){let r=t[0];if(o===1){let f=i[0];return u=>{let c=u?.[f];if(Array.isArray(c))return c.map(a=>a?.[r])}}return f=>{let u=f;for(let c=0;c<o&&u!=null;c++)u=u[i[c]];if(Array.isArray(u))return u.map(c=>c?.[r])}}return r=>{let f=r;for(let u=0;u<o&&f!=null;u++)f=f[i[u]];if(Array.isArray(f))return f.map(u=>{let c=u;for(let a=0;a<s&&c!=null;a++)c=c[t[a]];return c})}}function fn(n,e){let i=[],t=0;for(let s=0;s<e.length;s++){let r=e[s],f=s===e.length-1,u=n.slice(t,r).map(c=>c.value);u.length>0&&i.push({type:"access",keys:u}),i.push({type:f?"map":"flatMap",keys:[]}),t=r+1;}let o=n.slice(t).map(s=>s.value);return s=>{let r=s;for(let f of i){if(r==null)return;if(f.type==="access")for(let u of f.keys){if(r==null)return;r=r[u];}else if(f.type==="flatMap"){if(!Array.isArray(r))return;r=r.flatMap(u=>{let c=u;return Array.isArray(c)?c:[c]});}else if(f.type==="map"){if(!Array.isArray(r))return;o.length>0&&(r=r.map(u=>{let c=u;for(let a of o){if(c==null)return;c=c[a];}return c}));}}return r}}function un(n,e){return O(e)(n)}function k(n){let e=n.indexOf("[*]");return e===-1?n:n.slice(0,e)}function cn(){R.clear();}function an(){return R.size}function S(n){let e=new Set;return $(n,e),Array.from(e)}function $(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let o=0;o<n.length;o++)$(n[o],e);return}if(m(n)){e.add(k(n.$));return}if(E(n)){if(typeof n.$if=="string"){let o=n.$if.startsWith("!")?n.$if.slice(1):n.$if;e.add(k(o));}else $(n.$if,e);$(n.then,e),n.else!==void 0&&$(n.else,e);return}if(C(n)){for(let o=0;o<n.$pipe.length;o++)$(n.$pipe[o],e);return}if(T(n)){if(n.args)for(let o=0;o<n.args.length;o++)$(n.args[o],e);return}if(g(n)){e.add(k(n.path)),n.value!==void 0&&isRef(n.value)&&e.add(k(n.value.$));return}if(y(n)){for(let o=0;o<n.conditions.length;o++)$(n.conditions[o],e);return}let i=n,t=Object.keys(i);for(let o=0;o<t.length;o++)$(i[t[o]],e);}function dn(n){return S(n).length>0}function mn(n){return S(n).length===0}function gn(n){return JSON.stringify(n)}function F(n,e={}){let i=e.scope??{},t=e.accessor,o=A(n,i,t),s=S(n),r=gn(n);return {fn:o,deps:s,hash:r}}function A(n,e,i){if(n===null)return ()=>null;if(typeof n!="object")return ()=>n;if(Array.isArray(n)){let t=n.map(o=>A(o,e,i));return o=>t.map(s=>s(o))}if(m(n))return yn(n,i);if(E(n))return hn(n,e,i);if(C(n))return En(n,e,i);if(T(n))return Tn(n,e,i);if(g(n))return compile(n,i?{accessor:i}:void 0);if(y(n))return compile(n,i?{accessor:i}:void 0);if(P(n)){let t=n,o=Object.keys(t),s=o.map(r=>A(t[r],e,i));return r=>{let f={};for(let u=0;u<o.length;u++)f[o[u]]=s[u](r);return f}}return ()=>n}function q(n,e){return e?i=>e(n,i):O(n)}function yn(n,e){return q(n.$,e)}function hn(n,e,i){let t;if(typeof n.$if=="string"){let r=n.$if.startsWith("!")?n.$if.slice(1):n.$if,f=q(r,i);t=n.$if.startsWith("!")?c=>!f(c):c=>!!f(c);}else {let r=A(n.$if,e,i);t=f=>!!r(f);}let o=A(n.then,e,i),s=n.else!==void 0?A(n.else,e,i):()=>{};return r=>t(r)?o(r):s(r)}function En(n,e,i){let t=n.$pipe;if(t.length===0)return ()=>{};if(t.length===1)return A(t[0],e,i);let o=A(t[0],e,i),s=t.slice(1).map(f=>A(f,e,i)),r=s.length;if(r===1){let[f]=s;return u=>{let c=o(u),a=f(u);return typeof a=="function"?a(c):a}}if(r===2){let[f,u]=s;return c=>{let a=o(c),p=f(c);return a=typeof p=="function"?p(a):p,p=u(c),typeof p=="function"?p(a):p}}if(r===3){let[f,u,c]=s;return a=>{let p=o(a),h=f(a);return p=typeof h=="function"?h(p):h,h=u(a),p=typeof h=="function"?h(p):h,h=c(a),typeof h=="function"?h(p):h}}return f=>{let u=o(f);for(let c=0;c<r;c++){let a=s[c](f);u=typeof a=="function"?a(u):a;}return u}}function Tn(n,e,i){let t=n.$fn,o=n.args;if(o===void 0)return ()=>{let f=e[t];if(!f)throw new Error(`Function not found in scope: ${t}`);return f};let s=o.map(f=>A(f,e,i)),r=s.length;if(r===0)return f=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u()};if(r===1){let[f]=s;return u=>{let c=e[t];if(!c)throw new Error(`Function not found in scope: ${t}`);return c(f(u))}}if(r===2){let[f,u]=s;return c=>{let a=e[t];if(!a)throw new Error(`Function not found in scope: ${t}`);return a(f(c),u(c))}}if(r===3){let[f,u,c]=s;return a=>{let p=e[t];if(!p)throw new Error(`Function not found in scope: ${t}`);return p(f(a),u(a),c(a))}}return f=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u(...s.map(c=>c(f)))}}function Cn(n,e,i={}){return F(n,i).fn(e)}var v=class{constructor(e=1e3){this.cache=new Map,this._maxSize=e;}get(e,i={}){let t=JSON.stringify(e),o=this.cache.get(t);if(o)return this.cache.delete(t),this.cache.set(t,o),o;let s=F(e,i);if(this.cache.size>=this._maxSize){let r=this.cache.keys().next().value;r&&this.cache.delete(r);}return this.cache.set(t,s),s}has(e){return this.cache.has(JSON.stringify(e))}delete(e){return this.cache.delete(JSON.stringify(e))}clear(){this.cache.clear();}get size(){return this.cache.size}get maxSize(){return this._maxSize}set maxSize(e){for(this._maxSize=e;this.cache.size>this._maxSize;){let i=this.cache.keys().next().value;i&&this.cache.delete(i);}}},J=new v;function An(n,e={}){return J.get(n,e)}function z(n,e="root",i={}){let t=[];return x(n,e,t,i),{valid:t.length===0,errors:t}}function x(n,e,i,t){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let r=0;r<n.length;r++)x(n[r],`${e}[${r}]`,i,t);return}if(m(n)){(!n.$||typeof n.$!="string")&&i.push(`${e}: invalid reference, $ must be non-empty string`);return}if(E(n)){typeof n.$if=="string"?(n.$if.startsWith("!")?n.$if.slice(1):n.$if)||i.push(`${e}.$if: empty path in string shorthand`):x(n.$if,`${e}.$if`,i,t),x(n.then,`${e}.then`,i,t),n.else!==void 0&&x(n.else,`${e}.else`,i,t);return}if(C(n)){if(!Array.isArray(n.$pipe)){i.push(`${e}.$pipe: must be an array`);return}if(n.$pipe.length===0){i.push(`${e}.$pipe: must have at least one element`);return}for(let r=0;r<n.$pipe.length;r++)x(n.$pipe[r],`${e}.$pipe[${r}]`,i,t);return}if(T(n)){if(!n.$fn||typeof n.$fn!="string"){i.push(`${e}: invalid function, $fn must be non-empty string`);return}if(t.scope&&!(n.$fn in t.scope)&&i.push(`${e}: function "${n.$fn}" not found in scope`),n.args!==void 0)if(!Array.isArray(n.args))i.push(`${e}.args: must be an array`);else for(let r=0;r<n.args.length;r++)x(n.args[r],`${e}.args[${r}]`,i,t);return}if(g(n)){let r=validate(n,e);r.valid||i.push(...r.errors);return}if(y(n)){let r=validate(n,e);r.valid||i.push(...r.errors);return}let o=n,s=Object.keys(o);for(let r=0;r<s.length;r++){let f=s[r];x(o[f],`${e}.${f}`,i,t);}}function bn(n,e={}){let i=z(n,"root",e);if(!i.valid)throw new Error(`Invalid expression: ${i.errors.join("; ")}`)}function $n(n,e={}){return z(n,"root",e).valid}var Q={};tn(Q,{$:()=>K,$fn:()=>Y,$if:()=>kn,$pipe:()=>H,fn:()=>Sn,pipe:()=>wn,ref:()=>xn});function K(n){return {$:n}}var xn=K;function Y(n,e){return e===void 0||e.length===0?{$fn:n}:{$fn:n,args:e}}var Sn=Y;function kn(n,e,i){return i===void 0?{$if:n,then:e}:{$if:n,then:e,else:i}}function H(...n){return {$pipe:n}}var wn=H;var D="data",U="scope",Rn={eq:"===",neq:"!==",gt:">",gte:">=",lt:"<",lte:"<="};function j(n,e={}){let{dataParam:i=D,scopeParam:t=U,noPrefixes:o=false}=e;return d(n,i,t,o)}function d(n,e,i,t){if(n===null)return builders.literal(null);if(typeof n=="string")return builders.literal(n);if(typeof n=="number")return builders.literal(n);if(typeof n=="boolean")return builders.literal(n);if(Array.isArray(n))return builders.arrayExpression(n.map(o=>d(o,e,i,t)));if(m(n))return On(n.$,e,t);if(E(n))return vn(n,e,i,t);if(C(n))return jn(n.$pipe,e,i,t);if(T(n))return Nn(n,e,i,t);if(g(n))return Gn(n,e,i,t);if(y(n))return Wn(n,e,i,t);if(typeof n=="object"){let s=Object.entries(n).map(([r,f])=>builders.property(builders.identifier(r),d(f,e,i,t)));return builders.objectExpression(s)}return builders.literal(null)}function On(n,e,i){return n.includes("[*]")?Fn(n,e,i):w(n,e,i)}function w(n,e,i){let t=N(n);if(t.length===0)return i?builders.identifier("undefined"):builders.identifier(e);let o;if(i){let s=t[0];o=builders.identifier(s.value);for(let r=1;r<t.length;r++){let f=t[r];f.type==="key"?o=builders.memberExpression(o,builders.identifier(f.value),false,true):o=builders.memberExpression(o,builders.literal(f.value),true,true);}}else {o=builders.identifier(e);for(let s of t)s.type==="key"?o=builders.memberExpression(o,builders.identifier(s.value),false,true):o=builders.memberExpression(o,builders.literal(s.value),true,true);}return o}function Fn(n,e,i){let t=n.indexOf("[*]"),o=n.slice(0,t),s=n.slice(t+3),r;if(o?r=w(o,e,i):r=i?builders.identifier("undefined"):builders.identifier(e),!s||s==="")return r;if(s.includes("[*]"))return X(r,s);let f="_i",u=s.startsWith(".")?s.slice(1):s,c=builders.identifier(f);if(u){let a=N(u);for(let p of a)p.type==="key"?c=builders.memberExpression(c,builders.identifier(p.value),false,true):c=builders.memberExpression(c,builders.literal(p.value),true,true);}return builders.callExpression(builders.memberExpression(r,builders.identifier("map"),false,true),[builders.arrowFunctionExpression([builders.identifier(f)],c)])}function X(n,e){let i=e.indexOf("[*]"),t=e.slice(0,i),o=e.slice(i+3),s="_i",r=t.startsWith(".")?t.slice(1):t,f=builders.identifier(s);if(r){let c=N(r);for(let a of c)a.type==="key"&&(f=builders.memberExpression(f,builders.identifier(a.value),false,true));}if(o.includes("[*]")){let c=X(f,o);return builders.callExpression(builders.memberExpression(n,builders.identifier("flatMap"),false,true),[builders.arrowFunctionExpression([builders.identifier(s)],c)])}let u=o.startsWith(".")?o.slice(1):o;if(u){let c=N(u);for(let a of c)a.type==="key"&&(f=builders.memberExpression(f,builders.identifier(a.value),false,true));}return builders.callExpression(builders.memberExpression(n,builders.identifier("flatMap"),false,true),[builders.arrowFunctionExpression([builders.identifier(s)],f)])}function vn(n,e,i,t){let o;if(typeof n.$if=="string"){let f=n.$if.startsWith("!"),u=f?n.$if.slice(1):n.$if,c=w(u,e,t);o=f?builders.unaryExpression("!",c):c;}else o=d(n.$if,e,i,t);let s=d(n.then,e,i,t),r=n.else!==void 0?d(n.else,e,i,t):builders.identifier("undefined");return builders.conditionalExpression(o,s,r)}function Nn(n,e,i,t){let o=t?builders.identifier(n.$fn):builders.memberExpression(builders.identifier(i),builders.identifier(n.$fn),false,false);if(n.args===void 0)return o;let s=n.args.map(r=>d(r,e,i,t));return builders.callExpression(o,s)}function jn(n,e,i,t){if(n.length===0)return builders.identifier("undefined");if(n.length===1)return d(n[0],e,i,t);let o=d(n[0],e,i,t);for(let s=1;s<n.length;s++){let r=d(n[s],e,i,t);o=builders.callExpression(r,[o]);}return o}function Gn(n,e,i,t){let o=w(n.path,e,t),s=n.value!==void 0?m(n.value)?w(n.value.$,e,t):d(n.value,e,i,t):builders.literal(null),r=Rn[n.op];if(r)return builders.binaryExpression(r,o,s);switch(n.op){case "in":return builders.callExpression(builders.memberExpression(s,builders.identifier("includes")),[o]);case "notIn":return builders.unaryExpression("!",builders.callExpression(builders.memberExpression(s,builders.identifier("includes")),[o]));case "contains":return builders.callExpression(builders.memberExpression(o,builders.identifier("includes"),false,true),[s]);case "notContains":return builders.unaryExpression("!",builders.callExpression(builders.memberExpression(o,builders.identifier("includes"),false,true),[s]));case "exists":return builders.binaryExpression("!=",o,builders.literal(null));case "notExists":return builders.binaryExpression("==",o,builders.literal(null));case "matches":return builders.callExpression(builders.memberExpression(builders.newExpression(builders.identifier("RegExp"),[s]),builders.identifier("test")),[o]);case "notMatches":return builders.unaryExpression("!",builders.callExpression(builders.memberExpression(builders.newExpression(builders.identifier("RegExp"),[s]),builders.identifier("test")),[o]));case "startsWith":return builders.callExpression(builders.memberExpression(o,builders.identifier("startsWith"),false,true),[s]);case "endsWith":return builders.callExpression(builders.memberExpression(o,builders.identifier("endsWith"),false,true),[s]);default:return builders.binaryExpression("===",o,s)}}function Wn(n,e,i,t){let{logic:o,conditions:s}=n,r=o==="AND"?"&&":"||";if(s.length===0)return builders.literal(o==="AND");if(s.length===1)return d(s[0],e,i,t);let f=d(s[0],e,i,t);for(let u=1;u<s.length;u++){let c=d(s[u],e,i,t);f=builders.logicalExpression(r,f,c);}return f}function N(n){let e=[],i=n.length,t=0,o="";for(;t<i;){let s=n[t];if(s===".")o&&(e.push({type:"key",value:o}),o=""),t++;else if(s==="["){o&&(e.push({type:"key",value:o}),o=""),t++;let r=t;for(;t<i&&n[t]!=="]";)t++;let f=n.slice(r,t);if(t++,f!=="*"){let u=parseInt(f,10);e.push({type:"index",value:isNaN(u)?f:u});}}else o+=s,t++;}return o&&e.push({type:"key",value:o}),e}function Z(n,e=[D]){return builders.arrowFunctionExpression(e.map(i=>builders.identifier(i)),n)}function G(n){let e=new Set;return b(n,e),e}function b(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let t of n)b(t,e);return}if(m(n))return;if(E(n)){b(n.$if,e),b(n.then,e),n.else!==void 0&&b(n.else,e);return}if(C(n)){for(let t of n.$pipe)b(t,e);return}if(T(n)){if(e.add(n.$fn),n.args)for(let t of n.args)b(t,e);return}if(g(n)){n.value!==void 0&&typeof n.value=="object"&&b(n.value,e);return}if(y(n)){for(let t of n.conditions)b(t,e);return}let i=n;for(let t of Object.keys(i))b(i[t],e);}function W(n){let e=new Set;for(let i of n){let t=i.indexOf("."),o=i.indexOf("["),s=i.length;t!==-1&&(s=Math.min(s,t)),o!==-1&&(s=Math.min(s,o));let r=i.slice(0,s);r&&e.add(r);}return e}function zn(n){return JSON.stringify(n)}function Dn(n,e,i){let t=j(n,{noPrefixes:true}),o=generate(t),s=e.size>0?`const{${[...e].join(",")}}=data??{};`:"",r=i.size>0?`const{${[...i].join(",")}}=scope;`:"";return r?`(function(scope){${r}return function(data){${s}return ${o}}})`:`(function(){return function(data){${s}return ${o}}})`}function M(n,e={}){let{scope:i={},returnCode:t=false}=e,o=S(n),s=W(o),r=G(n),f=zn(n),u=Dn(n,s,r);if(t)return {code:u,deps:o,hash:f,dataRoots:[...s],scopeFns:[...r]};let c;try{c=new Function(`return ${u}`)()(i);}catch(a){throw new Error(`AST compilation failed. If this is due to CSP, use the standard compile() function instead. Error: ${a instanceof Error?a.message:String(a)}`)}return {fn:c,deps:o,hash:f}}function nn(n,e,i={}){let{fn:t}=M(n,i);return t(e)}var ye="0.1.1";export{v as ExpressionCache,ye as VERSION,bn as assertValid,Q as builders,J as cache,An as cached,cn as clearPathCache,F as compile,M as compileAST,O as compilePath,j as dslToAST,Cn as evaluate,nn as evaluateAST,W as extractDataRoots,S as extractDeps,G as extractScopeFns,un as get,an as getPathCacheSize,dn as hasDeps,L as hasWildcard,g as isCondition,on as isConditionExpr,y as isConditionGroup,E as isConditional,T as isFn,P as isLiteral,C as isPipe,mn as isPure,m as isRef,$n as isValid,k as normalizePath,z as validate,Z as wrapInFunction};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@statedelta-libs/expressions",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "JSON DSL compiler for optimized functions - StateDelta expression engine",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -25,7 +25,7 @@
25
25
  "format:check": "prettier --check \"src/**/*.ts\""
26
26
  },
27
27
  "dependencies": {
28
- "@statedelta-libs/conditions": "workspace:^",
28
+ "@statedelta-libs/conditions": "^0.1.1",
29
29
  "omni-ast": "^2.0.0"
30
30
  },
31
31
  "files": [