@statedelta-libs/expressions 0.1.1 → 0.2.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/LICENSE +21 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +23 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +1 -1
- package/package.json +13 -13
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Anderson D. Rosa
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
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.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;
|
|
1
|
+
'use strict';var conditions=require('@statedelta-libs/conditions'),omniAst=require('omni-ast');var on=Object.defineProperty;var rn=(n,e)=>{for(var i in e)on(n,i,{get:e[i],enumerable:true});};var g=n=>n!==null&&typeof n=="object"&&"$"in n&&typeof n.$=="string"&&Object.keys(n).length===1,h=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",b=n=>n!==null&&typeof n=="object"&&"$pipe"in n&&Array.isArray(n.$pipe),_=new Set(["eq","neq","gt","gte","lt","lte","in","notIn","contains","notContains","exists","notExists","matches","notMatches","startsWith","endsWith"]),y=n=>n!==null&&typeof n=="object"&&"path"in n&&"op"in n&&_.has(n.op)&&!("$"in n)&&!("$if"in n)&&!("$fn"in n),E=n=>n!==null&&typeof n=="object"&&"logic"in n&&"conditions"in n,sn=n=>y(n)||E(n),D=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&&_.has(i.op);return !("$"in i)&&!("$if"in i)&&!("$fn"in i)&&!("$pipe"in i)&&!t&&!("logic"in i)}return false};var x=new Map;function q(n){let e=[],i=n.length,t=0,r="";for(;t<i;){let f=n[t];if(f===".")r&&(e.push({type:"key",value:r}),r=""),t++;else if(f==="["){r&&(e.push({type:"key",value:r}),r=""),t++;let o=t;for(;t<i&&n[t]!=="]";)t++;let s=n.slice(o,t);if(t++,s==="*")e.push({type:"wildcard",value:"*"});else {let u=parseInt(s,10);e.push({type:"index",value:isNaN(u)?s:u});}}else r+=f,t++;}return r&&e.push({type:"key",value:r}),e}function J(n){return n.includes("[*]")}function O(n){let e=x.get(n);return e||(e=J(n)?fn(n):ln(n),x.set(n,e),e)}function ln(n){if(!n.includes(".")&&!n.includes("["))return r=>r?.[n];let e=q(n),i=e.length;if(i===2){let[r,f]=e,o=r.value,s=f.value;return u=>u?.[o]?.[s]}if(i===3){let[r,f,o]=e,s=r.value,u=f.value,a=o.value;return c=>c?.[s]?.[u]?.[a]}let t=e.map(r=>r.value);return r=>{let f=r;for(let o=0;o<i&&f!=null;o++)f=f[t[o]];return f}}function fn(n){let e=q(n),i=[];for(let t=0;t<e.length;t++)e[t].type==="wildcard"&&i.push(t);return i.length===1?un(e,i[0]):an(e,i)}function un(n,e){let i=n.slice(0,e).map(o=>o.value),t=n.slice(e+1).map(o=>o.value),r=i.length,f=t.length;if(f===0){if(r===1){let o=i[0];return s=>s?.[o]}return o=>{let s=o;for(let u=0;u<r&&s!=null;u++)s=s[i[u]];return s}}if(f===1){let o=t[0];if(r===1){let s=i[0];return u=>{let a=u?.[s];if(Array.isArray(a))return a.map(c=>c?.[o])}}return s=>{let u=s;for(let a=0;a<r&&u!=null;a++)u=u[i[a]];if(Array.isArray(u))return u.map(a=>a?.[o])}}return o=>{let s=o;for(let u=0;u<r&&s!=null;u++)s=s[i[u]];if(Array.isArray(s))return s.map(u=>{let a=u;for(let c=0;c<f&&a!=null;c++)a=a[t[c]];return a})}}function an(n,e){let i=[],t=0;for(let f=0;f<e.length;f++){let o=e[f],s=f===e.length-1,u=n.slice(t,o).map(a=>a.value);u.length>0&&i.push({type:"access",keys:u}),i.push({type:s?"map":"flatMap",keys:[]}),t=o+1;}let r=n.slice(t).map(f=>f.value);return f=>{let o=f;for(let s of i){if(o==null)return;if(s.type==="access")for(let u of s.keys){if(o==null)return;o=o[u];}else if(s.type==="flatMap"){if(!Array.isArray(o))return;o=o.flatMap(u=>{let a=u;return Array.isArray(a)?a:[a]});}else if(s.type==="map"){if(!Array.isArray(o))return;r.length>0&&(o=o.map(u=>{let a=u;for(let c of r){if(a==null)return;a=a[c];}return a}));}}return o}}function cn(n,e){return O(e)(n)}function R(n){let e=n.indexOf("[*]");return e===-1?n:n.slice(0,e)}function pn(){x.clear();}function dn(){return x.size}function w(n){let e=new Set;return S(n,e),Array.from(e)}function S(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let r=0;r<n.length;r++)S(n[r],e);return}if(g(n)){e.add(R(n.$));return}if(h(n)){if(typeof n.$if=="string"){let r=n.$if.startsWith("!")?n.$if.slice(1):n.$if;e.add(R(r));}else S(n.$if,e);S(n.then,e),n.else!==void 0&&S(n.else,e);return}if(b(n)){for(let r=0;r<n.$pipe.length;r++)S(n.$pipe[r],e);return}if(T(n)){if(n.args)for(let r=0;r<n.args.length;r++)S(n.args[r],e);return}if(y(n)){e.add(R(n.path)),n.value!==void 0&&conditions.isRef(n.value)&&e.add(R(n.value.$));return}if(E(n)){for(let r=0;r<n.conditions.length;r++)S(n.conditions[r],e);return}let i=n,t=Object.keys(i);for(let r=0;r<t.length;r++)S(i[t[r]],e);}function gn(n){return w(n).length>0}function yn(n){return w(n).length===0}function En(n){return JSON.stringify(n)}function F(n,e={}){let i=e.scope??{},t=e.accessor,r=C(n,i,t),f=w(n),o=En(n);return {fn:r,deps:f,hash:o}}function C(n,e,i){if(n===null)return ()=>null;if(typeof n!="object")return ()=>n;if(Array.isArray(n)){let t=n.map(r=>C(r,e,i));return r=>t.map(f=>f(r))}if(g(n))return hn(n,i);if(h(n))return Tn(n,e,i);if(b(n))return bn(n,e,i);if(T(n))return Cn(n,e,i);if(y(n))return conditions.compile(n,i?{accessor:i}:void 0);if(E(n))return conditions.compile(n,i?{accessor:i}:void 0);if(D(n)){let t=n,r=Object.keys(t),f=r.map(o=>C(t[o],e,i));return o=>{let s={};for(let u=0;u<r.length;u++)s[r[u]]=f[u](o);return s}}return ()=>n}function K(n,e){return e?i=>e(n,i):O(n)}function hn(n,e){return K(n.$,e)}function Tn(n,e,i){let t;if(typeof n.$if=="string"){let o=n.$if.startsWith("!")?n.$if.slice(1):n.$if,s=K(o,i);t=n.$if.startsWith("!")?a=>!s(a):a=>!!s(a);}else {let o=C(n.$if,e,i);t=s=>!!o(s);}let r=C(n.then,e,i),f=n.else!==void 0?C(n.else,e,i):()=>{};return o=>t(o)?r(o):f(o)}function bn(n,e,i){let t=n.$pipe;if(t.length===0)return ()=>{};if(t.length===1)return C(t[0],e,i);let r=C(t[0],e,i),f=t.slice(1).map(s=>C(s,e,i)),o=f.length;if(o===1){let[s]=f;return u=>{let a=r(u),c=s(u);return typeof c=="function"?c(a):c}}if(o===2){let[s,u]=f;return a=>{let c=r(a),p=s(a);return c=typeof p=="function"?p(c):p,p=u(a),typeof p=="function"?p(c):p}}if(o===3){let[s,u,a]=f;return c=>{let p=r(c),d=s(c);return p=typeof d=="function"?d(p):d,d=u(c),p=typeof d=="function"?d(p):d,d=a(c),typeof d=="function"?d(p):d}}return s=>{let u=r(s);for(let a=0;a<o;a++){let c=f[a](s);u=typeof c=="function"?c(u):c;}return u}}function Cn(n,e,i){let t=n.$fn,r=n.args;if(r===void 0)return ()=>{let s=e[t];if(!s)throw new Error(`Function not found in scope: ${t}`);return s};let f=r.map(s=>C(s,e,i)),o=f.length;if(o===0)return s=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u()};if(o===1){let[s]=f;return u=>{let a=e[t];if(!a)throw new Error(`Function not found in scope: ${t}`);return a(s(u))}}if(o===2){let[s,u]=f;return a=>{let c=e[t];if(!c)throw new Error(`Function not found in scope: ${t}`);return c(s(a),u(a))}}if(o===3){let[s,u,a]=f;return c=>{let p=e[t];if(!p)throw new Error(`Function not found in scope: ${t}`);return p(s(c),u(c),a(c))}}return s=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u(...f.map(a=>a(s)))}}function $n(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),r=this.cache.get(t);if(r)return this.cache.delete(t),this.cache.set(t,r),r;let f=F(e,i);if(this.cache.size>=this._maxSize){let o=this.cache.keys().next().value;o&&this.cache.delete(o);}return this.cache.set(t,f),f}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);}}},Y=new v;function Sn(n,e={}){return Y.get(n,e)}function I(n,e="root",i={}){let t=[];return k(n,e,t,i),{valid:t.length===0,errors:t}}function k(n,e,i,t){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let o=0;o<n.length;o++)k(n[o],`${e}[${o}]`,i,t);return}if(g(n)){(!n.$||typeof n.$!="string")&&i.push(`${e}: invalid reference, $ must be non-empty string`);return}if(h(n)){typeof n.$if=="string"?(n.$if.startsWith("!")?n.$if.slice(1):n.$if)||i.push(`${e}.$if: empty path in string shorthand`):k(n.$if,`${e}.$if`,i,t),k(n.then,`${e}.then`,i,t),n.else!==void 0&&k(n.else,`${e}.else`,i,t);return}if(b(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 o=0;o<n.$pipe.length;o++)k(n.$pipe[o],`${e}.$pipe[${o}]`,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 o=0;o<n.args.length;o++)k(n.args[o],`${e}.args[${o}]`,i,t);return}if(y(n)){let o=conditions.validate(n,e);o.valid||i.push(...o.errors);return}if(E(n)){let o=conditions.validate(n,e);o.valid||i.push(...o.errors);return}let r=n,f=Object.keys(r);for(let o=0;o<f.length;o++){let s=f[o];k(r[s],`${e}.${s}`,i,t);}}function An(n,e={}){let i=I(n,"root",e);if(!i.valid)throw new Error(`Invalid expression: ${i.errors.join("; ")}`)}function kn(n,e={}){return I(n,"root",e).valid}var Z={};rn(Z,{$:()=>Q,$fn:()=>U,$if:()=>xn,$pipe:()=>X,fn:()=>Rn,pipe:()=>On,ref:()=>wn});function Q(n){return {$:n}}var wn=Q;function U(n,e){return e===void 0||e.length===0?{$fn:n}:{$fn:n,args:e}}var Rn=U;function xn(n,e,i){return i===void 0?{$if:n,then:e}:{$if:n,then:e,else:i}}function X(...n){return {$pipe:n}}var On=X;var L="data",P="scope",Fn={eq:"===",neq:"!==",gt:">",gte:">=",lt:"<",lte:"<="};function W(n,e={}){let{dataParam:i=L,scopeParam:t=P,noPrefixes:r=false,useAccessor:f=false,lexicalPrefix:o}=e;return m(n,i,t,r,f,o)}function m(n,e,i,t,r,f){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=>m(o,e,i,t,r,f)));if(g(n))return vn(n.$,e,t,r,f);if(h(n))return jn(n,e,i,t,r,f);if(b(n))return Wn(n.$pipe,e,i,t,r,f);if(T(n))return Gn(n,e,i,t,r,f);if(y(n))return zn(n,e,i,t,r,f);if(E(n))return Mn(n,e,i,t,r,f);if(typeof n=="object"){let s=Object.entries(n).map(([u,a])=>omniAst.builders.property(omniAst.builders.identifier(u),m(a,e,i,t,r,f)));return omniAst.builders.objectExpression(s)}return omniAst.builders.literal(null)}var N="accessor";function j(n,e){return e?n===e||n.startsWith(e+"."):false}function vn(n,e,i,t,r){return t?j(n,r)?A(n,e,true):omniAst.builders.callExpression(omniAst.builders.identifier(N),[omniAst.builders.literal(n),omniAst.builders.identifier(e)]):n.includes("[*]")?Nn(n,e,i):A(n,e,i)}function A(n,e,i){let t=G(n);if(t.length===0)return i?omniAst.builders.identifier("undefined"):omniAst.builders.identifier(e);let r;if(i){let f=t[0];r=omniAst.builders.identifier(f.value);for(let o=1;o<t.length;o++){let s=t[o];s.type==="key"?r=omniAst.builders.memberExpression(r,omniAst.builders.identifier(s.value),false,true):r=omniAst.builders.memberExpression(r,omniAst.builders.literal(s.value),true,true);}}else {r=omniAst.builders.identifier(e);for(let f of t)f.type==="key"?r=omniAst.builders.memberExpression(r,omniAst.builders.identifier(f.value),false,true):r=omniAst.builders.memberExpression(r,omniAst.builders.literal(f.value),true,true);}return r}function Nn(n,e,i){let t=n.indexOf("[*]"),r=n.slice(0,t),f=n.slice(t+3),o;if(r?o=A(r,e,i):o=i?omniAst.builders.identifier("undefined"):omniAst.builders.identifier(e),!f||f==="")return o;if(f.includes("[*]"))return nn(o,f);let s="_i",u=f.startsWith(".")?f.slice(1):f,a=omniAst.builders.identifier(s);if(u){let c=G(u);for(let p of c)p.type==="key"?a=omniAst.builders.memberExpression(a,omniAst.builders.identifier(p.value),false,true):a=omniAst.builders.memberExpression(a,omniAst.builders.literal(p.value),true,true);}return omniAst.builders.callExpression(omniAst.builders.memberExpression(o,omniAst.builders.identifier("map"),false,true),[omniAst.builders.arrowFunctionExpression([omniAst.builders.identifier(s)],a)])}function nn(n,e){let i=e.indexOf("[*]"),t=e.slice(0,i),r=e.slice(i+3),f="_i",o=t.startsWith(".")?t.slice(1):t,s=omniAst.builders.identifier(f);if(o){let a=G(o);for(let c of a)c.type==="key"&&(s=omniAst.builders.memberExpression(s,omniAst.builders.identifier(c.value),false,true));}if(r.includes("[*]")){let a=nn(s,r);return omniAst.builders.callExpression(omniAst.builders.memberExpression(n,omniAst.builders.identifier("flatMap"),false,true),[omniAst.builders.arrowFunctionExpression([omniAst.builders.identifier(f)],a)])}let u=r.startsWith(".")?r.slice(1):r;if(u){let a=G(u);for(let c of a)c.type==="key"&&(s=omniAst.builders.memberExpression(s,omniAst.builders.identifier(c.value),false,true));}return omniAst.builders.callExpression(omniAst.builders.memberExpression(n,omniAst.builders.identifier("flatMap"),false,true),[omniAst.builders.arrowFunctionExpression([omniAst.builders.identifier(f)],s)])}function jn(n,e,i,t,r,f){let o;if(typeof n.$if=="string"){let a=n.$if.startsWith("!"),c=a?n.$if.slice(1):n.$if,p;r?j(c,f)?p=A(c,e,true):p=omniAst.builders.callExpression(omniAst.builders.identifier(N),[omniAst.builders.literal(c),omniAst.builders.identifier(e)]):p=A(c,e,t),o=a?omniAst.builders.unaryExpression("!",p):p;}else o=m(n.$if,e,i,t,r,f);let s=m(n.then,e,i,t,r,f),u=n.else!==void 0?m(n.else,e,i,t,r,f):omniAst.builders.identifier("undefined");return omniAst.builders.conditionalExpression(o,s,u)}function Gn(n,e,i,t,r,f){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(u=>m(u,e,i,t,r,f));return omniAst.builders.callExpression(o,s)}function Wn(n,e,i,t,r,f){if(n.length===0)return omniAst.builders.identifier("undefined");if(n.length===1)return m(n[0],e,i,t,r,f);let o=m(n[0],e,i,t,r,f);for(let s=1;s<n.length;s++){let u=m(n[s],e,i,t,r,f);o=omniAst.builders.callExpression(u,[o]);}return o}function zn(n,e,i,t,r,f){let o;r?j(n.path,f)?o=A(n.path,e,true):o=omniAst.builders.callExpression(omniAst.builders.identifier(N),[omniAst.builders.literal(n.path),omniAst.builders.identifier(e)]):o=A(n.path,e,t);let s=n.value!==void 0?g(n.value)?r?j(n.value.$,f)?A(n.value.$,e,true):omniAst.builders.callExpression(omniAst.builders.identifier(N),[omniAst.builders.literal(n.value.$),omniAst.builders.identifier(e)]):A(n.value.$,e,t):m(n.value,e,i,t,r,f):omniAst.builders.literal(null),u=Fn[n.op];if(u)return omniAst.builders.binaryExpression(u,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 Mn(n,e,i,t,r,f){let{logic:o,conditions:s}=n,u=o==="AND"?"&&":"||";if(s.length===0)return omniAst.builders.literal(o==="AND");if(s.length===1)return m(s[0],e,i,t,r,f);let a=m(s[0],e,i,t,r,f);for(let c=1;c<s.length;c++){let p=m(s[c],e,i,t,r,f);a=omniAst.builders.logicalExpression(u,a,p);}return a}function G(n){let e=[],i=n.length,t=0,r="";for(;t<i;){let f=n[t];if(f===".")r&&(e.push({type:"key",value:r}),r=""),t++;else if(f==="["){r&&(e.push({type:"key",value:r}),r=""),t++;let o=t;for(;t<i&&n[t]!=="]";)t++;let s=n.slice(o,t);if(t++,s!=="*"){let u=parseInt(s,10);e.push({type:"index",value:isNaN(u)?s:u});}}else r+=f,t++;}return r&&e.push({type:"key",value:r}),e}function en(n,e=[L]){return omniAst.builders.arrowFunctionExpression(e.map(i=>omniAst.builders.identifier(i)),n)}function z(n){let e=new Set;return $(n,e),e}function $(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let t of n)$(t,e);return}if(g(n))return;if(h(n)){$(n.$if,e),$(n.then,e),n.else!==void 0&&$(n.else,e);return}if(b(n)){for(let t of n.$pipe)$(t,e);return}if(T(n)){if(e.add(n.$fn),n.args)for(let t of n.args)$(t,e);return}if(y(n)){n.value!==void 0&&typeof n.value=="object"&&$(n.value,e);return}if(E(n)){for(let t of n.conditions)$(t,e);return}let i=n;for(let t of Object.keys(i))$(i[t],e);}function M(n){let e=new Set;for(let i of n){let t=i.indexOf("."),r=i.indexOf("["),f=i.length;t!==-1&&(f=Math.min(f,t)),r!==-1&&(f=Math.min(f,r));let o=i.slice(0,f);o&&e.add(o);}return e}function In(n){return JSON.stringify(n)}function Ln(n,e,i,t,r){let f=W(n,{noPrefixes:true,useAccessor:t,lexicalPrefix:r}),o=omniAst.generate(f),s="";t?r&&(s=`const{${r}}=data??{};`):e.size>0&&(s=`const{${[...e].join(",")}}=data??{};`);let u=t?new Set([...i,"accessor"]):i,a=u.size>0?`const{${[...u].join(",")}}=scope;`:"";return a?`(function(scope){${a}return function(data){${s}return ${o}}})`:`(function(){return function(data){${s}return ${o}}})`}function V(n,e={}){let{scope:i={},returnCode:t=false,useAccessor:r=false,lexicalPrefix:f}=e,o=w(n),s=M(o),u=z(n),a=In(n),c=Ln(n,s,u,r,f);if(t)return {code:c,deps:o,hash:a,dataRoots:[...s],scopeFns:[...u]};let p;try{p=new Function(`return ${c}`)()(i);}catch(d){throw new Error(`AST compilation failed. If this is due to CSP, use the standard compile() function instead. Error: ${d instanceof Error?d.message:String(d)}`)}return {fn:p,deps:o,hash:a}}function tn(n,e,i={}){let{fn:t}=V(n,i);return t(e)}var he="0.1.1";exports.ExpressionCache=v;exports.VERSION=he;exports.assertValid=An;exports.builders=Z;exports.cache=Y;exports.cached=Sn;exports.clearPathCache=pn;exports.compile=F;exports.compileAST=V;exports.compilePath=O;exports.dslToAST=W;exports.evaluate=$n;exports.evaluateAST=tn;exports.extractDataRoots=M;exports.extractDeps=w;exports.extractScopeFns=z;exports.get=cn;exports.getPathCacheSize=dn;exports.hasDeps=gn;exports.hasWildcard=J;exports.isCondition=y;exports.isConditionExpr=sn;exports.isConditionGroup=E;exports.isConditional=h;exports.isFn=T;exports.isLiteral=D;exports.isPipe=b;exports.isPure=yn;exports.isRef=g;exports.isValid=kn;exports.normalizePath=R;exports.validate=I;exports.wrapInFunction=en;
|
package/dist/index.d.cts
CHANGED
|
@@ -483,6 +483,18 @@ interface TransformOptions {
|
|
|
483
483
|
* - `add(a, b)` instead of `scope.add(data?.a, data?.b)`
|
|
484
484
|
*/
|
|
485
485
|
noPrefixes?: boolean;
|
|
486
|
+
/**
|
|
487
|
+
* When true, generates accessor("path", data) instead of property access.
|
|
488
|
+
* Requires `accessor` function in scope.
|
|
489
|
+
* - `accessor("user.name", data)` instead of `user?.name`
|
|
490
|
+
*/
|
|
491
|
+
useAccessor?: boolean;
|
|
492
|
+
/**
|
|
493
|
+
* Path prefix that should use direct property access instead of accessor.
|
|
494
|
+
* Only used when useAccessor is true.
|
|
495
|
+
* - `lexicalPrefix: "params"` → `params?.foo` instead of `accessor("params.foo", data)`
|
|
496
|
+
*/
|
|
497
|
+
lexicalPrefix?: string;
|
|
486
498
|
}
|
|
487
499
|
/**
|
|
488
500
|
* Transform DSL expression to AST node
|
|
@@ -567,6 +579,17 @@ interface CompileASTOptions {
|
|
|
567
579
|
scope?: Scope;
|
|
568
580
|
/** Return generated code instead of function (for debugging) */
|
|
569
581
|
returnCode?: boolean;
|
|
582
|
+
/**
|
|
583
|
+
* When true, generates accessor("path", data) instead of property access.
|
|
584
|
+
* Requires `accessor` function in scope.
|
|
585
|
+
*/
|
|
586
|
+
useAccessor?: boolean;
|
|
587
|
+
/**
|
|
588
|
+
* Path prefix that should use direct property access instead of accessor.
|
|
589
|
+
* Only used when useAccessor is true.
|
|
590
|
+
* - `lexicalPrefix: "params"` → `params?.foo` instead of `accessor("params.foo", data)`
|
|
591
|
+
*/
|
|
592
|
+
lexicalPrefix?: string;
|
|
570
593
|
}
|
|
571
594
|
/** Result when returnCode is true */
|
|
572
595
|
interface CompileASTCodeResult {
|
package/dist/index.d.ts
CHANGED
|
@@ -483,6 +483,18 @@ interface TransformOptions {
|
|
|
483
483
|
* - `add(a, b)` instead of `scope.add(data?.a, data?.b)`
|
|
484
484
|
*/
|
|
485
485
|
noPrefixes?: boolean;
|
|
486
|
+
/**
|
|
487
|
+
* When true, generates accessor("path", data) instead of property access.
|
|
488
|
+
* Requires `accessor` function in scope.
|
|
489
|
+
* - `accessor("user.name", data)` instead of `user?.name`
|
|
490
|
+
*/
|
|
491
|
+
useAccessor?: boolean;
|
|
492
|
+
/**
|
|
493
|
+
* Path prefix that should use direct property access instead of accessor.
|
|
494
|
+
* Only used when useAccessor is true.
|
|
495
|
+
* - `lexicalPrefix: "params"` → `params?.foo` instead of `accessor("params.foo", data)`
|
|
496
|
+
*/
|
|
497
|
+
lexicalPrefix?: string;
|
|
486
498
|
}
|
|
487
499
|
/**
|
|
488
500
|
* Transform DSL expression to AST node
|
|
@@ -567,6 +579,17 @@ interface CompileASTOptions {
|
|
|
567
579
|
scope?: Scope;
|
|
568
580
|
/** Return generated code instead of function (for debugging) */
|
|
569
581
|
returnCode?: boolean;
|
|
582
|
+
/**
|
|
583
|
+
* When true, generates accessor("path", data) instead of property access.
|
|
584
|
+
* Requires `accessor` function in scope.
|
|
585
|
+
*/
|
|
586
|
+
useAccessor?: boolean;
|
|
587
|
+
/**
|
|
588
|
+
* Path prefix that should use direct property access instead of accessor.
|
|
589
|
+
* Only used when useAccessor is true.
|
|
590
|
+
* - `lexicalPrefix: "params"` → `params?.foo` instead of `accessor("params.foo", data)`
|
|
591
|
+
*/
|
|
592
|
+
lexicalPrefix?: string;
|
|
570
593
|
}
|
|
571
594
|
/** Result when returnCode is true */
|
|
572
595
|
interface CompileASTCodeResult {
|
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.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};
|
|
1
|
+
import {isRef,compile,validate}from'@statedelta-libs/conditions';import {builders,generate}from'omni-ast';var on=Object.defineProperty;var rn=(n,e)=>{for(var i in e)on(n,i,{get:e[i],enumerable:true});};var g=n=>n!==null&&typeof n=="object"&&"$"in n&&typeof n.$=="string"&&Object.keys(n).length===1,h=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",b=n=>n!==null&&typeof n=="object"&&"$pipe"in n&&Array.isArray(n.$pipe),_=new Set(["eq","neq","gt","gte","lt","lte","in","notIn","contains","notContains","exists","notExists","matches","notMatches","startsWith","endsWith"]),y=n=>n!==null&&typeof n=="object"&&"path"in n&&"op"in n&&_.has(n.op)&&!("$"in n)&&!("$if"in n)&&!("$fn"in n),E=n=>n!==null&&typeof n=="object"&&"logic"in n&&"conditions"in n,sn=n=>y(n)||E(n),D=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&&_.has(i.op);return !("$"in i)&&!("$if"in i)&&!("$fn"in i)&&!("$pipe"in i)&&!t&&!("logic"in i)}return false};var x=new Map;function q(n){let e=[],i=n.length,t=0,r="";for(;t<i;){let f=n[t];if(f===".")r&&(e.push({type:"key",value:r}),r=""),t++;else if(f==="["){r&&(e.push({type:"key",value:r}),r=""),t++;let o=t;for(;t<i&&n[t]!=="]";)t++;let s=n.slice(o,t);if(t++,s==="*")e.push({type:"wildcard",value:"*"});else {let u=parseInt(s,10);e.push({type:"index",value:isNaN(u)?s:u});}}else r+=f,t++;}return r&&e.push({type:"key",value:r}),e}function J(n){return n.includes("[*]")}function O(n){let e=x.get(n);return e||(e=J(n)?fn(n):ln(n),x.set(n,e),e)}function ln(n){if(!n.includes(".")&&!n.includes("["))return r=>r?.[n];let e=q(n),i=e.length;if(i===2){let[r,f]=e,o=r.value,s=f.value;return u=>u?.[o]?.[s]}if(i===3){let[r,f,o]=e,s=r.value,u=f.value,a=o.value;return c=>c?.[s]?.[u]?.[a]}let t=e.map(r=>r.value);return r=>{let f=r;for(let o=0;o<i&&f!=null;o++)f=f[t[o]];return f}}function fn(n){let e=q(n),i=[];for(let t=0;t<e.length;t++)e[t].type==="wildcard"&&i.push(t);return i.length===1?un(e,i[0]):an(e,i)}function un(n,e){let i=n.slice(0,e).map(o=>o.value),t=n.slice(e+1).map(o=>o.value),r=i.length,f=t.length;if(f===0){if(r===1){let o=i[0];return s=>s?.[o]}return o=>{let s=o;for(let u=0;u<r&&s!=null;u++)s=s[i[u]];return s}}if(f===1){let o=t[0];if(r===1){let s=i[0];return u=>{let a=u?.[s];if(Array.isArray(a))return a.map(c=>c?.[o])}}return s=>{let u=s;for(let a=0;a<r&&u!=null;a++)u=u[i[a]];if(Array.isArray(u))return u.map(a=>a?.[o])}}return o=>{let s=o;for(let u=0;u<r&&s!=null;u++)s=s[i[u]];if(Array.isArray(s))return s.map(u=>{let a=u;for(let c=0;c<f&&a!=null;c++)a=a[t[c]];return a})}}function an(n,e){let i=[],t=0;for(let f=0;f<e.length;f++){let o=e[f],s=f===e.length-1,u=n.slice(t,o).map(a=>a.value);u.length>0&&i.push({type:"access",keys:u}),i.push({type:s?"map":"flatMap",keys:[]}),t=o+1;}let r=n.slice(t).map(f=>f.value);return f=>{let o=f;for(let s of i){if(o==null)return;if(s.type==="access")for(let u of s.keys){if(o==null)return;o=o[u];}else if(s.type==="flatMap"){if(!Array.isArray(o))return;o=o.flatMap(u=>{let a=u;return Array.isArray(a)?a:[a]});}else if(s.type==="map"){if(!Array.isArray(o))return;r.length>0&&(o=o.map(u=>{let a=u;for(let c of r){if(a==null)return;a=a[c];}return a}));}}return o}}function cn(n,e){return O(e)(n)}function R(n){let e=n.indexOf("[*]");return e===-1?n:n.slice(0,e)}function pn(){x.clear();}function dn(){return x.size}function w(n){let e=new Set;return S(n,e),Array.from(e)}function S(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let r=0;r<n.length;r++)S(n[r],e);return}if(g(n)){e.add(R(n.$));return}if(h(n)){if(typeof n.$if=="string"){let r=n.$if.startsWith("!")?n.$if.slice(1):n.$if;e.add(R(r));}else S(n.$if,e);S(n.then,e),n.else!==void 0&&S(n.else,e);return}if(b(n)){for(let r=0;r<n.$pipe.length;r++)S(n.$pipe[r],e);return}if(T(n)){if(n.args)for(let r=0;r<n.args.length;r++)S(n.args[r],e);return}if(y(n)){e.add(R(n.path)),n.value!==void 0&&isRef(n.value)&&e.add(R(n.value.$));return}if(E(n)){for(let r=0;r<n.conditions.length;r++)S(n.conditions[r],e);return}let i=n,t=Object.keys(i);for(let r=0;r<t.length;r++)S(i[t[r]],e);}function gn(n){return w(n).length>0}function yn(n){return w(n).length===0}function En(n){return JSON.stringify(n)}function F(n,e={}){let i=e.scope??{},t=e.accessor,r=C(n,i,t),f=w(n),o=En(n);return {fn:r,deps:f,hash:o}}function C(n,e,i){if(n===null)return ()=>null;if(typeof n!="object")return ()=>n;if(Array.isArray(n)){let t=n.map(r=>C(r,e,i));return r=>t.map(f=>f(r))}if(g(n))return hn(n,i);if(h(n))return Tn(n,e,i);if(b(n))return bn(n,e,i);if(T(n))return Cn(n,e,i);if(y(n))return compile(n,i?{accessor:i}:void 0);if(E(n))return compile(n,i?{accessor:i}:void 0);if(D(n)){let t=n,r=Object.keys(t),f=r.map(o=>C(t[o],e,i));return o=>{let s={};for(let u=0;u<r.length;u++)s[r[u]]=f[u](o);return s}}return ()=>n}function K(n,e){return e?i=>e(n,i):O(n)}function hn(n,e){return K(n.$,e)}function Tn(n,e,i){let t;if(typeof n.$if=="string"){let o=n.$if.startsWith("!")?n.$if.slice(1):n.$if,s=K(o,i);t=n.$if.startsWith("!")?a=>!s(a):a=>!!s(a);}else {let o=C(n.$if,e,i);t=s=>!!o(s);}let r=C(n.then,e,i),f=n.else!==void 0?C(n.else,e,i):()=>{};return o=>t(o)?r(o):f(o)}function bn(n,e,i){let t=n.$pipe;if(t.length===0)return ()=>{};if(t.length===1)return C(t[0],e,i);let r=C(t[0],e,i),f=t.slice(1).map(s=>C(s,e,i)),o=f.length;if(o===1){let[s]=f;return u=>{let a=r(u),c=s(u);return typeof c=="function"?c(a):c}}if(o===2){let[s,u]=f;return a=>{let c=r(a),p=s(a);return c=typeof p=="function"?p(c):p,p=u(a),typeof p=="function"?p(c):p}}if(o===3){let[s,u,a]=f;return c=>{let p=r(c),d=s(c);return p=typeof d=="function"?d(p):d,d=u(c),p=typeof d=="function"?d(p):d,d=a(c),typeof d=="function"?d(p):d}}return s=>{let u=r(s);for(let a=0;a<o;a++){let c=f[a](s);u=typeof c=="function"?c(u):c;}return u}}function Cn(n,e,i){let t=n.$fn,r=n.args;if(r===void 0)return ()=>{let s=e[t];if(!s)throw new Error(`Function not found in scope: ${t}`);return s};let f=r.map(s=>C(s,e,i)),o=f.length;if(o===0)return s=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u()};if(o===1){let[s]=f;return u=>{let a=e[t];if(!a)throw new Error(`Function not found in scope: ${t}`);return a(s(u))}}if(o===2){let[s,u]=f;return a=>{let c=e[t];if(!c)throw new Error(`Function not found in scope: ${t}`);return c(s(a),u(a))}}if(o===3){let[s,u,a]=f;return c=>{let p=e[t];if(!p)throw new Error(`Function not found in scope: ${t}`);return p(s(c),u(c),a(c))}}return s=>{let u=e[t];if(!u)throw new Error(`Function not found in scope: ${t}`);return u(...f.map(a=>a(s)))}}function $n(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),r=this.cache.get(t);if(r)return this.cache.delete(t),this.cache.set(t,r),r;let f=F(e,i);if(this.cache.size>=this._maxSize){let o=this.cache.keys().next().value;o&&this.cache.delete(o);}return this.cache.set(t,f),f}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);}}},Y=new v;function Sn(n,e={}){return Y.get(n,e)}function I(n,e="root",i={}){let t=[];return k(n,e,t,i),{valid:t.length===0,errors:t}}function k(n,e,i,t){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let o=0;o<n.length;o++)k(n[o],`${e}[${o}]`,i,t);return}if(g(n)){(!n.$||typeof n.$!="string")&&i.push(`${e}: invalid reference, $ must be non-empty string`);return}if(h(n)){typeof n.$if=="string"?(n.$if.startsWith("!")?n.$if.slice(1):n.$if)||i.push(`${e}.$if: empty path in string shorthand`):k(n.$if,`${e}.$if`,i,t),k(n.then,`${e}.then`,i,t),n.else!==void 0&&k(n.else,`${e}.else`,i,t);return}if(b(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 o=0;o<n.$pipe.length;o++)k(n.$pipe[o],`${e}.$pipe[${o}]`,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 o=0;o<n.args.length;o++)k(n.args[o],`${e}.args[${o}]`,i,t);return}if(y(n)){let o=validate(n,e);o.valid||i.push(...o.errors);return}if(E(n)){let o=validate(n,e);o.valid||i.push(...o.errors);return}let r=n,f=Object.keys(r);for(let o=0;o<f.length;o++){let s=f[o];k(r[s],`${e}.${s}`,i,t);}}function An(n,e={}){let i=I(n,"root",e);if(!i.valid)throw new Error(`Invalid expression: ${i.errors.join("; ")}`)}function kn(n,e={}){return I(n,"root",e).valid}var Z={};rn(Z,{$:()=>Q,$fn:()=>U,$if:()=>xn,$pipe:()=>X,fn:()=>Rn,pipe:()=>On,ref:()=>wn});function Q(n){return {$:n}}var wn=Q;function U(n,e){return e===void 0||e.length===0?{$fn:n}:{$fn:n,args:e}}var Rn=U;function xn(n,e,i){return i===void 0?{$if:n,then:e}:{$if:n,then:e,else:i}}function X(...n){return {$pipe:n}}var On=X;var L="data",P="scope",Fn={eq:"===",neq:"!==",gt:">",gte:">=",lt:"<",lte:"<="};function W(n,e={}){let{dataParam:i=L,scopeParam:t=P,noPrefixes:r=false,useAccessor:f=false,lexicalPrefix:o}=e;return m(n,i,t,r,f,o)}function m(n,e,i,t,r,f){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=>m(o,e,i,t,r,f)));if(g(n))return vn(n.$,e,t,r,f);if(h(n))return jn(n,e,i,t,r,f);if(b(n))return Wn(n.$pipe,e,i,t,r,f);if(T(n))return Gn(n,e,i,t,r,f);if(y(n))return zn(n,e,i,t,r,f);if(E(n))return Mn(n,e,i,t,r,f);if(typeof n=="object"){let s=Object.entries(n).map(([u,a])=>builders.property(builders.identifier(u),m(a,e,i,t,r,f)));return builders.objectExpression(s)}return builders.literal(null)}var N="accessor";function j(n,e){return e?n===e||n.startsWith(e+"."):false}function vn(n,e,i,t,r){return t?j(n,r)?A(n,e,true):builders.callExpression(builders.identifier(N),[builders.literal(n),builders.identifier(e)]):n.includes("[*]")?Nn(n,e,i):A(n,e,i)}function A(n,e,i){let t=G(n);if(t.length===0)return i?builders.identifier("undefined"):builders.identifier(e);let r;if(i){let f=t[0];r=builders.identifier(f.value);for(let o=1;o<t.length;o++){let s=t[o];s.type==="key"?r=builders.memberExpression(r,builders.identifier(s.value),false,true):r=builders.memberExpression(r,builders.literal(s.value),true,true);}}else {r=builders.identifier(e);for(let f of t)f.type==="key"?r=builders.memberExpression(r,builders.identifier(f.value),false,true):r=builders.memberExpression(r,builders.literal(f.value),true,true);}return r}function Nn(n,e,i){let t=n.indexOf("[*]"),r=n.slice(0,t),f=n.slice(t+3),o;if(r?o=A(r,e,i):o=i?builders.identifier("undefined"):builders.identifier(e),!f||f==="")return o;if(f.includes("[*]"))return nn(o,f);let s="_i",u=f.startsWith(".")?f.slice(1):f,a=builders.identifier(s);if(u){let c=G(u);for(let p of c)p.type==="key"?a=builders.memberExpression(a,builders.identifier(p.value),false,true):a=builders.memberExpression(a,builders.literal(p.value),true,true);}return builders.callExpression(builders.memberExpression(o,builders.identifier("map"),false,true),[builders.arrowFunctionExpression([builders.identifier(s)],a)])}function nn(n,e){let i=e.indexOf("[*]"),t=e.slice(0,i),r=e.slice(i+3),f="_i",o=t.startsWith(".")?t.slice(1):t,s=builders.identifier(f);if(o){let a=G(o);for(let c of a)c.type==="key"&&(s=builders.memberExpression(s,builders.identifier(c.value),false,true));}if(r.includes("[*]")){let a=nn(s,r);return builders.callExpression(builders.memberExpression(n,builders.identifier("flatMap"),false,true),[builders.arrowFunctionExpression([builders.identifier(f)],a)])}let u=r.startsWith(".")?r.slice(1):r;if(u){let a=G(u);for(let c of a)c.type==="key"&&(s=builders.memberExpression(s,builders.identifier(c.value),false,true));}return builders.callExpression(builders.memberExpression(n,builders.identifier("flatMap"),false,true),[builders.arrowFunctionExpression([builders.identifier(f)],s)])}function jn(n,e,i,t,r,f){let o;if(typeof n.$if=="string"){let a=n.$if.startsWith("!"),c=a?n.$if.slice(1):n.$if,p;r?j(c,f)?p=A(c,e,true):p=builders.callExpression(builders.identifier(N),[builders.literal(c),builders.identifier(e)]):p=A(c,e,t),o=a?builders.unaryExpression("!",p):p;}else o=m(n.$if,e,i,t,r,f);let s=m(n.then,e,i,t,r,f),u=n.else!==void 0?m(n.else,e,i,t,r,f):builders.identifier("undefined");return builders.conditionalExpression(o,s,u)}function Gn(n,e,i,t,r,f){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(u=>m(u,e,i,t,r,f));return builders.callExpression(o,s)}function Wn(n,e,i,t,r,f){if(n.length===0)return builders.identifier("undefined");if(n.length===1)return m(n[0],e,i,t,r,f);let o=m(n[0],e,i,t,r,f);for(let s=1;s<n.length;s++){let u=m(n[s],e,i,t,r,f);o=builders.callExpression(u,[o]);}return o}function zn(n,e,i,t,r,f){let o;r?j(n.path,f)?o=A(n.path,e,true):o=builders.callExpression(builders.identifier(N),[builders.literal(n.path),builders.identifier(e)]):o=A(n.path,e,t);let s=n.value!==void 0?g(n.value)?r?j(n.value.$,f)?A(n.value.$,e,true):builders.callExpression(builders.identifier(N),[builders.literal(n.value.$),builders.identifier(e)]):A(n.value.$,e,t):m(n.value,e,i,t,r,f):builders.literal(null),u=Fn[n.op];if(u)return builders.binaryExpression(u,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 Mn(n,e,i,t,r,f){let{logic:o,conditions:s}=n,u=o==="AND"?"&&":"||";if(s.length===0)return builders.literal(o==="AND");if(s.length===1)return m(s[0],e,i,t,r,f);let a=m(s[0],e,i,t,r,f);for(let c=1;c<s.length;c++){let p=m(s[c],e,i,t,r,f);a=builders.logicalExpression(u,a,p);}return a}function G(n){let e=[],i=n.length,t=0,r="";for(;t<i;){let f=n[t];if(f===".")r&&(e.push({type:"key",value:r}),r=""),t++;else if(f==="["){r&&(e.push({type:"key",value:r}),r=""),t++;let o=t;for(;t<i&&n[t]!=="]";)t++;let s=n.slice(o,t);if(t++,s!=="*"){let u=parseInt(s,10);e.push({type:"index",value:isNaN(u)?s:u});}}else r+=f,t++;}return r&&e.push({type:"key",value:r}),e}function en(n,e=[L]){return builders.arrowFunctionExpression(e.map(i=>builders.identifier(i)),n)}function z(n){let e=new Set;return $(n,e),e}function $(n,e){if(n===null||typeof n!="object")return;if(Array.isArray(n)){for(let t of n)$(t,e);return}if(g(n))return;if(h(n)){$(n.$if,e),$(n.then,e),n.else!==void 0&&$(n.else,e);return}if(b(n)){for(let t of n.$pipe)$(t,e);return}if(T(n)){if(e.add(n.$fn),n.args)for(let t of n.args)$(t,e);return}if(y(n)){n.value!==void 0&&typeof n.value=="object"&&$(n.value,e);return}if(E(n)){for(let t of n.conditions)$(t,e);return}let i=n;for(let t of Object.keys(i))$(i[t],e);}function M(n){let e=new Set;for(let i of n){let t=i.indexOf("."),r=i.indexOf("["),f=i.length;t!==-1&&(f=Math.min(f,t)),r!==-1&&(f=Math.min(f,r));let o=i.slice(0,f);o&&e.add(o);}return e}function In(n){return JSON.stringify(n)}function Ln(n,e,i,t,r){let f=W(n,{noPrefixes:true,useAccessor:t,lexicalPrefix:r}),o=generate(f),s="";t?r&&(s=`const{${r}}=data??{};`):e.size>0&&(s=`const{${[...e].join(",")}}=data??{};`);let u=t?new Set([...i,"accessor"]):i,a=u.size>0?`const{${[...u].join(",")}}=scope;`:"";return a?`(function(scope){${a}return function(data){${s}return ${o}}})`:`(function(){return function(data){${s}return ${o}}})`}function V(n,e={}){let{scope:i={},returnCode:t=false,useAccessor:r=false,lexicalPrefix:f}=e,o=w(n),s=M(o),u=z(n),a=In(n),c=Ln(n,s,u,r,f);if(t)return {code:c,deps:o,hash:a,dataRoots:[...s],scopeFns:[...u]};let p;try{p=new Function(`return ${c}`)()(i);}catch(d){throw new Error(`AST compilation failed. If this is due to CSP, use the standard compile() function instead. Error: ${d instanceof Error?d.message:String(d)}`)}return {fn:p,deps:o,hash:a}}function tn(n,e,i={}){let{fn:t}=V(n,i);return t(e)}var he="0.1.1";export{v as ExpressionCache,he as VERSION,An as assertValid,Z as builders,Y as cache,Sn as cached,pn as clearPathCache,F as compile,V as compileAST,O as compilePath,W as dslToAST,$n as evaluate,tn as evaluateAST,M as extractDataRoots,w as extractDeps,z as extractScopeFns,cn as get,dn as getPathCacheSize,gn as hasDeps,J as hasWildcard,y as isCondition,sn as isConditionExpr,E as isConditionGroup,h as isConditional,T as isFn,D as isLiteral,b as isPipe,yn as isPure,g as isRef,kn as isValid,R as normalizePath,I as validate,en as wrapInFunction};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@statedelta-libs/expressions",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "JSON DSL compiler for optimized functions - StateDelta expression engine",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -13,17 +13,6 @@
|
|
|
13
13
|
"require": "./dist/index.cjs"
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
|
-
"scripts": {
|
|
17
|
-
"build": "tsup",
|
|
18
|
-
"dev": "tsup --watch",
|
|
19
|
-
"test": "vitest run",
|
|
20
|
-
"test:watch": "vitest",
|
|
21
|
-
"test:coverage": "vitest run --coverage",
|
|
22
|
-
"typecheck": "tsc --noEmit",
|
|
23
|
-
"clean": "rm -rf dist",
|
|
24
|
-
"format": "prettier --write \"src/**/*.ts\"",
|
|
25
|
-
"format:check": "prettier --check \"src/**/*.ts\""
|
|
26
|
-
},
|
|
27
16
|
"dependencies": {
|
|
28
17
|
"@statedelta-libs/conditions": "^0.1.1",
|
|
29
18
|
"omni-ast": "^2.0.0"
|
|
@@ -57,5 +46,16 @@
|
|
|
57
46
|
},
|
|
58
47
|
"devDependencies": {
|
|
59
48
|
"@vitest/coverage-v8": "^4.0.16"
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsup",
|
|
52
|
+
"dev": "tsup --watch",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"test:watch": "vitest",
|
|
55
|
+
"test:coverage": "vitest run --coverage",
|
|
56
|
+
"typecheck": "tsc --noEmit",
|
|
57
|
+
"clean": "rm -rf dist",
|
|
58
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
59
|
+
"format:check": "prettier --check \"src/**/*.ts\""
|
|
60
60
|
}
|
|
61
|
-
}
|
|
61
|
+
}
|