fig-tree-evaluator 2.23.2 → 3.0.0-preview.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +214 -148
- package/build/authoring/index.d.ts +80 -0
- package/build/authoring/index.js +1 -0
- package/build/chunks/engine.js +1 -0
- package/build/chunks/shared.js +1 -0
- package/build/editor-hints/index.d.ts +35 -0
- package/build/editor-hints/index.js +1 -0
- package/build/format/index.d.ts +104 -0
- package/build/format/index.js +1 -0
- package/build/index.d.ts +915 -237
- package/build/index.js +1 -0
- package/build/migrate/index.d.ts +55 -0
- package/build/migrate/index.js +1 -0
- package/package.json +107 -50
- package/CHANGELOG.md +0 -134
- package/build/index.cjs.js +0 -1
- package/build/index.esm.js +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
declare const ErrorCodes: {
|
|
2
|
+
readonly typeCheck: "type-check";
|
|
3
|
+
readonly operatorFailure: "operator-failure";
|
|
4
|
+
readonly requestTimeout: "request-timeout";
|
|
5
|
+
readonly httpStatus: "http-status";
|
|
6
|
+
readonly invalidResponse: "invalid-response";
|
|
7
|
+
readonly graphQLErrors: "graphql-errors";
|
|
8
|
+
readonly sqlError: "sql-error";
|
|
9
|
+
readonly requestFailure: "request-failure";
|
|
10
|
+
readonly nonFiniteResult: "non-finite-result";
|
|
11
|
+
readonly escapedHandle: "escaped-handle";
|
|
12
|
+
readonly emptyAggregate: "empty-aggregate";
|
|
13
|
+
readonly missingDataPath: "missing-data-path";
|
|
14
|
+
readonly missingRequired: "missing-required";
|
|
15
|
+
readonly timeout: "timeout";
|
|
16
|
+
readonly aborted: "aborted";
|
|
17
|
+
readonly malformedNode: "malformed-node";
|
|
18
|
+
readonly unknownOperator: "unknown-operator";
|
|
19
|
+
readonly unknownFragment: "unknown-fragment";
|
|
20
|
+
readonly unknownNodeKey: "unknown-node-key";
|
|
21
|
+
readonly unrecognizedIdentifier: "unrecognized-identifier";
|
|
22
|
+
readonly positionalArity: "positional-arity";
|
|
23
|
+
readonly invalidVars: "invalid-vars";
|
|
24
|
+
readonly invalidReference: "invalid-reference";
|
|
25
|
+
readonly invalidAs: "invalid-as";
|
|
26
|
+
readonly unresolvedVar: "unresolved-var";
|
|
27
|
+
readonly unresolvedParam: "unresolved-param";
|
|
28
|
+
readonly unresolvedBinding: "unresolved-binding";
|
|
29
|
+
readonly bareVars: "bare-vars";
|
|
30
|
+
readonly varCycle: "var-cycle";
|
|
31
|
+
readonly depthCeiling: "depth-ceiling";
|
|
32
|
+
readonly maxDepthExceeded: "max-depth";
|
|
33
|
+
readonly maxNodesExceeded: "max-nodes";
|
|
34
|
+
readonly returnsMismatch: "returns-mismatch";
|
|
35
|
+
readonly operatorValidate: "operator-validate";
|
|
36
|
+
readonly uselessModifier: "useless-modifier";
|
|
37
|
+
readonly unreferencedVar: "unreferenced-var";
|
|
38
|
+
readonly shadowedVar: "shadowed-var";
|
|
39
|
+
readonly deadBinding: "dead-binding";
|
|
40
|
+
readonly fallbackMismatch: "fallback-mismatch";
|
|
41
|
+
readonly unboundToken: "unbound-token";
|
|
42
|
+
readonly unusedSubstitution: "unused-substitution";
|
|
43
|
+
readonly inertReferenceToken: "inert-reference-token";
|
|
44
|
+
readonly invalidDefinition: "invalid-definition";
|
|
45
|
+
readonly invalidName: "invalid-name";
|
|
46
|
+
readonly reservedName: "reserved-name";
|
|
47
|
+
readonly invalidNullPolicy: "invalid-null-policy";
|
|
48
|
+
readonly duplicateOperator: "duplicate-operator";
|
|
49
|
+
readonly fragmentCycle: "fragment-cycle";
|
|
50
|
+
readonly invalidOptions: "invalid-options";
|
|
51
|
+
};
|
|
52
|
+
type KnownErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];
|
|
53
|
+
type FigTreeErrorCode = KnownErrorCode | (string & {});
|
|
54
|
+
|
|
55
|
+
interface FallbackCoverage {
|
|
56
|
+
uncovered: CoverageFinding[];
|
|
57
|
+
covered: CoveredFinding[];
|
|
58
|
+
}
|
|
59
|
+
interface CoverageFinding {
|
|
60
|
+
path: (string | number)[];
|
|
61
|
+
code: FigTreeErrorCode;
|
|
62
|
+
message: string;
|
|
63
|
+
certainty: 'may' | 'always';
|
|
64
|
+
operator?: string;
|
|
65
|
+
parameter?: string;
|
|
66
|
+
fragment?: string;
|
|
67
|
+
fragmentPath?: (string | number)[];
|
|
68
|
+
}
|
|
69
|
+
interface CoveredFinding extends CoverageFinding {
|
|
70
|
+
coveredBy: (string | number)[];
|
|
71
|
+
coveredByFragmentPath?: (string | number)[];
|
|
72
|
+
givesNull?: true;
|
|
73
|
+
}
|
|
74
|
+
interface FallbackCoverageOptions {
|
|
75
|
+
strictNumbers?: boolean;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
declare const fallbackCoverage: (fig: unknown, expression: unknown, options?: FallbackCoverageOptions) => Promise<FallbackCoverage>;
|
|
79
|
+
|
|
80
|
+
export { fallbackCoverage };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e,c as t,a as n,b as r,i as a,d as o,v as s,e as i,r as c,f as u,s as l,F as p,g as m,h as d}from"../chunks/engine.js";import{i as y,r as f,W as h,a as v,E as g,b,F as w,c as x}from"../chunks/shared.js";const k=e=>"demand"in e,j=(t,n)=>({...t,path:n.path,...void 0===t.fragment?{fragment:n.name,fragmentPath:e(t.path)}:{},order:[n.order,...t.order]}),O=(t,n)=>void 0===t.fragmentPath?{...t,path:n.path,fragmentPath:e(t.path)}:{...t,path:n.path},$=t=>{const{code:n,message:r,certainty:a,operator:o,parameter:s,fragment:i,fragmentPath:c}=t;return{path:e(t.path),code:n,message:r,certainty:a,...void 0!==o?{operator:o}:{},...void 0!==s?{parameter:s}:{},...void 0!==i?{fragment:i,fragmentPath:c}:{}}},A=({path:e,code:t,message:n,operator:r,parameter:a})=>({path:[...e],code:t,message:n,certainty:"always",...void 0!==r?{operator:r}:{},...void 0!==a?{parameter:a}:{}}),N=e=>{const t=new Map;for(const{finding:n}of[...e].sort((e,t)=>((e,t)=>{for(let n=0;n<Math.min(e.length,t.length);n++)if(e[n]!==t[n])return e[n]-t[n];return e.length-t.length})(e.order,t.order))){const e=JSON.stringify({...n,message:void 0,certainty:void 0}),r=t.get(e);void 0===r?t.set(e,n):"always"===n.certainty&&(r.certainty="always")}return[...t.values()]},S=e=>({order:e.order,finding:$(e)}),M=(t,n)=>({order:t.order,finding:{...$(t),coveredBy:e(n.path),...void 0!==n.fragmentPath?{coveredByFragmentPath:n.fragmentPath}:{},...n.givesNull?{givesNull:n.givesNull}:{}}}),P=[],F=[{type:"string"},{type:"number"},{type:"boolean"},{type:"null"},{type:"array"},{type:"object"},{type:"opaque"},{type:"nonFinite"}],E=e=>[{exact:void 0===e?null:e}],z=e=>e.length>0&&e.every(e=>"exact"in e)?e.map(e=>e.exact):void 0,L=e=>"exact"in e?null===e.exact:"null"===e.type,q=e=>{if(y(e))return e.literal.map(e=>({exact:e}));const t="string"==typeof e?[e]:e;return t.includes("any")?F:R(t.map(e=>[{type:e}]))},D=new WeakMap;let J=0;const B=e=>"object"==typeof e&&null!==e||"function"==typeof e?`=#${(e=>{let t=D.get(e);return void 0===t&&D.set(e,t=++J),t})(e)}`:`=${typeof e}:${String(e)}`,I=e=>{if("exact"in e)return B(e.exact);if("array"===e.type)return void 0!==e.items?`a[${e.items.map(C).join(";")}]`:`a${e.length??""}+${e.minLength??""}(${void 0===e.element?"*":C(e.element)})`;if("object"===e.type)return void 0===e.keys?"o":`o{${Object.keys(e.keys).sort().map(t=>`${JSON.stringify(t)}:${C(e.keys[t])}`).join(",")}}`;const{type:t,...n}=e;return`${t}${JSON.stringify(n)}`},C=e=>e.map(I).sort().join("|"),T=e=>{if(null===e)return{type:"null"};if(Array.isArray(e))return{type:"array"};switch(typeof e){case"string":return{type:"string"};case"number":return{type:Number.isInteger(e)?"integer":Number.isFinite(e)?"number":"nonFinite"};case"boolean":return{type:"boolean"};case"object":{const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t?{type:"object"}:{type:"opaque"}}default:return{type:"opaque"}}},R=e=>{const t=new Set,n=[];for(const r of e)for(const e of r){const r=I(e);t.has(r)||(t.add(r),n.push(e))}const r=n.filter(e=>"exact"in e).map(e=>e.exact);return r.length<=16?n:W(n.filter(e=>!("exact"in e)),K(r))},W=(...e)=>R(e),H=e=>"number"==typeof e&&Number.isFinite(e),G=e=>Array.from(e).length,K=e=>{const t=(e,t)=>{if(0===t.length)return P;const n=t.reduce((e,t)=>Math.min(e,t));return[Q({type:e},n)]};return R([...[!0,!1].map(t=>de(pe(e.map(e=>H(e)&&Number.isInteger(e)===t?ue(e):void 0)))),t("string",e.filter(e=>"string"==typeof e).map(G)),t("array",e.filter(Array.isArray).map(e=>e.length)),...e.filter(e=>!H(e)&&"string"!=typeof e&&!Array.isArray(e)).map(e=>[T(e)])])},Q=(e,t)=>t?{...e,minLength:t}:e,U=e=>e.some(L),V=e=>e.length>0&&e.every(L),X=e=>e.filter(e=>!L(e)),Y=e=>je(e.map(e=>{if("exact"in e){const{exact:t}=e;return(Array.isArray(t)?t:v(t)?Object.values(t):[]).includes(null)?"yes":"no"}return"array"===e.type?0!==e.length&&U(e.element??F)?"maybe":"no":"object"===e.type?"maybe":"no"})),Z=(e,t)=>R(e.map(e=>{if("no"===Y([e]))return[e];const n="exact"in e?e.exact:void 0;if(1===t.length&&"exact"in t[0]&&"exact"in e){const e=t[0].exact,r=t=>null===t?e:t;if(Array.isArray(n))return E(n.map(r));const a={};for(const[e,t]of Object.entries(n))a[e]=r(t);return E(a)}if(!(Array.isArray(n)||"type"in e&&"array"===e.type))return[{type:"object"}];const{length:r,minLength:a}=e;return te([X(ee([e])),t],Array.isArray(n)?{length:n.length}:{length:r,minLength:a})})),_=e=>e.flatMap(e=>{const t=Y([e]);if("no"===t)return[e];if("yes"===t)return P;if(!("type"in e))return[e];if("array"!==e.type)return[e];const{items:n,...r}=e;if(void 0===n)return[{...r,element:X(e.element??F)}];const a=n.map(X);return a.some(e=>0===e.length)?P:ne(a)}),ee=e=>R(e.map(e=>"exact"in e?Array.isArray(e.exact)?R(Array.from(e.exact,e=>E(e))):P:"array"===e.type?0===e.length?P:e.element??F:P)),te=(e,t={})=>[{type:"array",element:R(e),...t}],ne=e=>[{type:"array",element:R(e),length:e.length,items:e}],re=e=>W(e.map(e=>"exact"in e?T(e.exact):e)),ae=e=>ke(e.map(e=>"exact"in e?"number"!=typeof e.exact||Number.isFinite(e.exact)?"no":"yes":"nonFinite"===e.type?"maybe":"no")),oe=e=>[{type:"object",keys:e}],se=(e,t)=>{if(0===t.length)return{value:e,found:"yes"};const[n,...r]=t;let a;const o=[],s=je(e.map(e=>{if("exact"in e){const n=f(e.exact,t);return n.found&&o.push(E(n.value)),n.found?"yes":"no"}const s=(e,t)=>{if("no"===t)return"no";const n=(e=>e===F?a??=se(F,r):se(e,r))(e);return o.push(n.value),"yes"===t?n.found:"no"===n.found?"no":"maybe"};if(n===h)return"array"!==e.type?"no":(o.push(0===r.length?[e]:[{type:"array"}]),"yes");switch(e.type){case"array":{const t="number"==typeof n?n:Number(n);if(!Number.isInteger(t)||t<0)return"number"==typeof n?"no":"maybe";const r=void 0!==e.length?t<e.length?"yes":"no":t<(e.minLength??0)?"yes":"maybe";return void 0!==e.items&&"yes"===r?s(e.items[t],"yes"):s(e.element??F,r)}case"object":return void 0===e.keys?s(F,"maybe"):Object.hasOwn(e.keys,String(n))?s(e.keys[String(n)],"yes"):"no";case"opaque":return s(F,"maybe");default:return"no"}}));return{value:R(o),found:0===e.length?"yes":s}},ie={min:0,max:0,integer:!0},ce={min:1,max:1,integer:!0},ue=e=>({min:e,max:e,integer:Number.isInteger(e)}),le=e=>"exact"in e?H(e.exact)?ue(e.exact):void 0:"number"===e.type||"integer"===e.type?{min:e.min??-1/0,max:e.max??1/0,integer:"integer"===e.type}:void 0,pe=e=>e.reduce((e,t)=>void 0===e||void 0===t?e??t:{min:Math.min(e.min,t.min),max:Math.max(e.max,t.max),integer:e.integer&&t.integer},void 0),me=e=>pe(e.map(le)),de=e=>{if(void 0===e)return P;const t=e.integer?Math.ceil(e.min):e.min,n=e.integer?Math.floor(e.max):e.max;return t>n?P:[{type:e.integer?"integer":"number",...t>-1/0?{min:t}:{},...n<1/0?{max:n}:{}}]},ye=e=>e.filter(e=>"exact"in e?"number"!=typeof e.exact:!["number","integer","nonFinite"].includes(e.type)),fe=e=>ee(e).filter(e=>"no"!==ae([e])),he=(e,t,n)=>R(e.map(e=>"exact"in e?Array.isArray(e.exact)?t(Array.from(e.exact,e=>E(e))):P:"array"!==e.type?P:void 0!==e.items?t(e.items):0===e.length?n(P,0):n(e.element??F,e.length??e.minLength??0))),ve=(e,t,n)=>e.reduce((e,t)=>{const r=me(t);return e&&r&&n(e,r)},t),ge=(e,t)=>({min:e.min+t.min,max:e.max+t.max,integer:e.integer&&t.integer}),be=(e,t)=>0===e||0===t?0:e*t,we=(e,t)=>{const n=[be(e.min,t.min),be(e.min,t.max),be(e.max,t.min),be(e.max,t.max)];return{min:Math.min(...n),max:Math.max(...n),integer:e.integer&&t.integer}},xe=(e,t)=>W(ye(ee(e)),fe(e),he(e,e=>{const n=e.map(me);if(e.some(e=>"no"!==ae(e)))return de(pe(n));if(0===n.length||n.includes(void 0))return P;const r="min"===t?Math.min:Math.max;return de({min:n.map(e=>e.min).reduce((e,t)=>r(e,t)),max:n.map(e=>e.max).reduce((e,t)=>r(e,t)),integer:n.every(e=>e.integer)})},e=>de(me(e)))),ke=e=>e.includes("yes")?"yes":e.includes("maybe")?"maybe":"no",je=e=>e.every(e=>"yes"===e)?"yes":e.every(e=>"no"===e)?"no":"maybe",Oe=(e,t)=>"no"===e||"no"===t?"no":"yes"===e&&"yes"===t?"yes":"maybe",$e=(e,t)=>{if("exact"in e)return Ae([e.exact],t);if("object"!==e.type)return"no";if(void 0===e.keys)return"maybe";const n=e.keys;return je(Object.entries(t).map(([e,t])=>{if(!Object.hasOwn(n,e))return!1===t.required?"yes":"no";const r=void 0===t.type?"yes":Ne(n[e],t.type);return void 0===t.constraints?r:Oe(r,Ne(n[e],"any",t.constraints))}))},Ae=(e,t)=>n(e,{elementShape:t},!1).ok?"yes":"no",Ne=(e,r,a,o=!1)=>je(e.map(e=>{if("exact"in e){const s=e.exact;return t(s,r).ok&&(null===s||void 0===a||n(s,a,o).ok)?"yes":"no"}const s=((e,t)=>{if(y(t)){const n=t=>{const n=le(e);return void 0!==n?"number"==typeof t&&(!n.integer||Number.isInteger(t))&&t>=n.min&&t<=n.max:"string"===e.type?"string"==typeof t&&G(t)>=(e.minLength??0):typeof t===e.type};return t.literal.some(n)?"maybe":"no"}const n="string"==typeof t?[t]:t;if(n.includes("any"))return"yes";switch(e.type){case"number":return n.includes("number")?"yes":n.includes("integer")?"maybe":"no";case"integer":return n.includes("integer")||n.includes("number")?"yes":"no";case"opaque":return n.includes("object")?"maybe":"no";case"nonFinite":return n.includes("number")?"yes":"no";default:return n.includes(e.type)?"yes":"no"}})(e,r);return"no"===s||void 0===a||"null"===e.type?s:Oe(s,((e,t,n)=>{if(0===Object.keys(t).filter(e=>void 0!==t[e]).length)return"yes";if("array"!==e.type)return"no";let r="yes";void 0!==t.length&&(r=Oe(r,void 0===e.length?"maybe":e.length===t.length?"yes":"no"));const a=0===e.length?P:e.element??F,o=n?X(a):a;return void 0!==t.homogeneous&&(r=Oe(r,0===o.length||t.homogeneous.some(e=>"yes"===Ne(o,e))?"yes":"maybe")),void 0!==t.elementShape&&(r=Oe(r,o.every(e=>"yes"===$e(e,t.elementShape))?"yes":"maybe")),r})(e,a,o))})),Se=(e,t)=>"yes"===Ne(e,t)?e:R(e.map(e=>"no"===Ne([e],t)?P:"exact"in e?[e]:y(t)?t.literal.filter(t=>"no"!==Ne([e],{literal:[t]})).map(e=>({exact:e})):"number"===e.type?de({...le(e),integer:!0}):[e])),Me=e=>"string"==typeof e?e:Array.isArray(e)?e.join(" | "):`one of ${e.literal.map(e=>JSON.stringify(e)).join(", ")}`,Pe=(e,t,n)=>{const r=e.entry.hostDefaults;return void 0!==r&&Object.hasOwn(r,t)?E(r[t]):"default"in n?"symbol"==typeof n.default?F:E(n.default):void 0},Fe=(e,t)=>"lazyEntries"===e.evaluation?"entries"===t.kind:"elements"===t.kind,Ee=(e,t)=>{const n=e.nullPolicy;if("string"==typeof n)return new Set([n]);const r=t[n.selector]?.known??P,a=r.every(e=>"exact"in e)?n.table.filter(e=>r.some(t=>"exact"in t&&t.exact===e.value)):n.table;return new Set(a.map(e=>e.policy))},ze=(e,t)=>{const{definition:n}=e.entry,{entries:a,whole:o}=n.resolution,s={},i=new Set,c=[],u={},l=new Set,p={},m=new Set;let d,y="no";const f=(t,n,r,a)=>{const o=Ne(r,n.type,n.constraints,void 0!==n.elementNullPolicy);if("yes"===o)return;const s={path:e.path,code:"type-check",message:`${e.name} – parameter '${t}': may receive something other than ${Me(n.type)}${void 0!==n.constraints?", as constrained":""}`,certainty:"no"===o&&a?"always":"may",operator:e.name,parameter:t,order:[e.order]};c.push(s),"no"===o&&a&&(d??=s)};for(const[n,r]of a){const a=e.params[n];switch(r.evaluation){case"eager":void 0!==a&&(u[n]={known:t[n],absent:!1});break;case"structural":"constant"===a?.kind&&(u[n]={known:E(a.value),absent:!1});break;case"lazy":if(void 0!==r.replacesNullAt){const o=void 0!==a?t[n]:Pe(e,n,r);if(void 0!==o)for(const e of r.replacesNullAt)p[e]={name:n,known:o}}else void 0!==a&&(l.add(n),f(n,r,t[n],!1),s[n]=Se(t[n],r.type));break;case"lazyElements":case"lazyEntries":case"race":if(void 0===a)break;Fe(r,a)?(l.add(n),s[n]=t[n]):u[n]={known:t[n],absent:!1}}}for(const[t,n]of o){if(l.has(t))continue;const a=u[t]??{known:P,absent:!0},o=!n.required&&!r(n.type)&&U(a.known);if(!a.absent&&!o)continue;const s=Pe(e,t,n),i=o?X(a.known):a.known;u[t]={known:void 0===s?i:W(i,s),absent:void 0===s}}for(const[e,t]of o){if(l.has(e))continue;let n=u[e]?.known??P;if(0===n.length)continue;u[e].absent&&i.add(e);const a=p[e];if(void 0!==a){(void 0!==t.elementNullPolicy?"no"!==Y(n):U(n))&&(m.add(a.name),n=void 0!==t.elementNullPolicy?Z(n,a.known):W(X(n),a.known))}const o="eager"!==t.evaluation&&"structural"!==t.evaluation;if(U(n)&&r(t.type)&&!o){const e=Ee(t,u);if(e.has("propagate")){const t=1===e.size&&V(n);if(y=t?"yes":"maybe",t){d??="null";break}1===e.size&&(n=X(n))}}if("propagate"===t.elementNullPolicy){const e=Y(n);if("no"!==e){if(y="yes"===e?"yes":"maybe","yes"===e){d??="null";break}n=_(n)}}f(e,t,n,!0),s[e]=De(t,n)}if("no"!==y)for(const e of c)"always"===e.certainty&&(e.certainty="may");return{received:s,absent:i,failures:c,propagates:y,consulted:m,...d?{ends:d}:{}}},Le=e=>{const t="string"==typeof e?[e]:Array.isArray(e)?e:[];return t.length>0&&t.every(e=>"array"===e||"object"===e)},qe=(e,t)=>{if(Le(t)){if(Array.isArray(e))return e.map(a);if(v(e)){const t={};for(const[n,r]of Object.entries(e))t[n]=a(r);return t}}return a(e)},De=(e,t)=>{const n=Se(t,e.type);return e.truthiness?n.length>0&&n.every(e=>"exact"in e)?R(n.map(t=>E(qe(t.exact,e.type)))):Le(e.type)?F:q("boolean"):n},Je=(e,t)=>{const n=!e.required&&!r(e.type)&&U(t),a=n?X(t):t;let o=Ne(a,e.type,e.constraints);"yes"===o&&void 0!==e.constraints&&U(a)&&(o="maybe");const s=n?E(e.default??null):P;return{known:W(Se(a,e.type),s),answer:o}},Be=(e,t,n,r)=>{if("yes"!==Ne(r,n.type,n.constraints))return{path:e.path,code:"type-check",message:`${e.name} – parameter '${t}': an element's result may be other than ${Me(n.type)}`,certainty:"may",operator:e.name,parameter:t,order:[e.order]}},Ie="non-finite-result",Ce="empty-aggregate",Te="operator-failure",Re={code:Ie,overflow:!0},We=e=>({code:"type-check",parameter:"values",when:{expect:e,values:{some:{not:{type:e}}}}}),He={plus:[{code:Ce,parameter:"values",when:{values:{empty:!0},expect:{supplied:!1}}},We("number"),We("string"),We("array"),We("object"),Re],subtract:[Re],multiply:[Re],divide:[{code:Ie,parameter:"by",when:{by:0}},Re],modulo:[{code:Ie,parameter:"mod",when:{mod:0}},Re],power:[{code:Ie,parameter:"base",when:{base:0,exponent:{below:0}}},{code:Ie,parameter:"base",may:!0,when:{base:{below:0},exponent:{not:{type:"integer"}}}},{code:Ie,parameter:"exponent",may:!0,when:{exponent:{not:{below:100}}}},Re],round:[{code:Ie,parameter:"decimals",may:!0,when:{decimals:{not:{below:300}}}},Re],min:[{code:Ce,parameter:"values",when:{values:{empty:!0}}}],max:[{code:Ce,parameter:"values",when:{values:{empty:!0}}}],match:[{code:Te,may:!0,when:{default:{supplied:!1}}}],regex:[{code:Te,parameter:"flags",when:{flags:{invalid:!0}}},{code:Te,parameter:"pattern",when:{pattern:{invalid:!0}}}],get:[{code:Te,parameter:"path",when:{path:{invalid:!0}}},{code:"missing-data-path",may:!0,options:{strictDataPaths:!0},when:{default:{supplied:!1}}}],convert:[{code:Te,when:{to:"number",value:{type:["array","object"]}}},{code:Te,may:!0,when:{to:"number",value:{type:"string"}}},{code:Ie,may:!0,when:{to:"number",value:{type:"string"}}},{code:Te,when:{to:"string",value:{type:["array","object"]}}}]};let Ge;const Ke=e=>{const t=e.analysis;return void 0!==t?t.external?"external":t.failures??[]:(Ge??=new Map(o.map(e=>[e,He[e.name]??[]])),Ge.get(e)??"external")},Qe=e=>"yes"===e?"no":"no"===e?"yes":"maybe",Ue=(e,t)=>{if(null===e||"object"!=typeof e){if("exact"in t)return t.exact===e?"yes":"no";return"no"===Ne([t],null===e?"null":{literal:[e]})?"no":"maybe"}if("type"in e)return Ne([t],e.type);if("not"in e)return Qe(Ue(e.not,t));if("below"in e)return"exact"in t?"number"==typeof t.exact&&t.exact<e.below?"yes":"no":"number"===t.type||"integer"===t.type?(t.max??1/0)<e.below?"yes":(t.min??-1/0)>=e.below?"no":"maybe":"nonFinite"===t.type?"maybe":"no";if("empty"in e){if("exact"in t){const{exact:e}=t;return"string"==typeof e||Array.isArray(e)?0===e.length?"yes":"no":v(e)&&0===Object.keys(e).length?"yes":"no"}switch(t.type){case"array":return void 0!==t.length?0===t.length?"yes":"no":t.minLength?"no":"maybe";case"object":return void 0===t.keys?"maybe":0===Object.keys(t.keys).length?"yes":"no";case"string":return t.minLength?"no":"maybe";default:return"no"}}if("some"in e){if("exact"in t){const{exact:n}=t,r=Array.isArray(n)?Array.from(n):v(n)?Object.values(n):[];return ke(r.map(t=>Ue(e.some,{exact:t??null})))}if("array"===t.type){if(0===t.length)return"no";const n=Ve(e.some,t.element??F);return"yes"!==n||void 0===t.length&&!t.minLength?"no"===n?"no":"maybe":"yes"}return"object"===t.type?void 0===t.keys?"maybe":ke(Object.values(t.keys).map(t=>"no"===Ve(e.some,t)?"no":"maybe")):"no"}return"maybe"},Ve=(e,t)=>0===t.length?"no":je(t.map(t=>Ue(e,t))),Xe=e=>void 0!==e&&1===e.length&&"exact"in e[0]?{value:e[0].exact}:void 0,Ye=(e,t,n,r)=>{const a=r.received[t],o=void 0===a?"no":r.absent.has(t)?"maybe":"yes";return null!==n&&"object"==typeof n&&"supplied"in n?n.supplied?o:Qe(o):"no"===o?"no":null!==n&&"object"==typeof n&&"invalid"in n?((e,t,n)=>{const{validate:r}=e.entry.definition;if(void 0===r)return"no";if(void 0===Xe(n.received[t]))return"maybe";const a={};for(const[e,t]of Object.entries(n.received)){const r=Xe(t);void 0===r||n.absent.has(e)||(a[e]=r.value)}return r(a,s).some(e=>"error"===e.severity&&e.parameter===t)?"yes":"no"})(e,t,r):Ve(n,a)},Ze=e=>null===e||"object"!=typeof e?JSON.stringify(e):"type"in e?"string"==typeof e.type?`a ${e.type}`:`of type ${JSON.stringify(e.type)}`:"not"in e?`not ${Ze(e.not)}`:"below"in e?`below ${e.below}`:"empty"in e?"empty":"supplied"in e?e.supplied?"supplied":"not supplied":"invalid"in e?"refused by its validation":`with some element ${Ze(e.some)}`,_e=(e,t)=>{const n=Object.entries(t.when??{}).map(([e,t])=>null!==t&&"object"==typeof t&&"some"in t?`some element of '${e}' is ${Ze(t.some)}`:`'${e}' is ${Ze(t)}`),r=n.length>0?`when ${n.join(" and ")}`:t.overflow?"on extreme numbers":"whatever its inputs";return`${e} – ${t.code} ${t.may?"possible ":""}${r}`},et=(e,t,n,r)=>{if(t.overflow&&!r.strictNumbers)return"no";for(const[e,n]of Object.entries(t.options??{}))if((r.evaluation[e]??!1)!==n)return"no";const a=Object.entries(t.when??{}).map(([t,r])=>Ye(e,t,r,n));return a.includes("no")?"no":a.every(e=>"yes"===e)?"yes":"maybe"},tt={if:{oneOf:[{param:"then"},{param:"else"}]},match:{oneOf:[{param:"branches"},{param:"default"}]},firstOf:{firstNonNull:"values"},find:{oneOf:[{elementOf:"input"},{param:"noMatchDefault"}]},plus:{oneOf:[{sum:"values"},{typeNamedBy:"expect"}]},subtract:{difference:["value","minus"]},multiply:{product:"values"},abs:{abs:"value"},min:{min:"values"},max:{max:"values"},length:{type:"integer",min:0},filter:{arrayOf:{elementOf:"input"}},map:{arrayOf:{param:"each"}},split:{byParam:"delimiter",cases:{"":{arrayOf:"string"}},otherwise:{arrayOf:"string",minLength:1}},convert:{typeNamedBy:"to"},regex:{byParam:"mode",cases:{test:"boolean",extract:{oneOf:["string",{param:"noMatchDefault"}]},match:{arrayOf:"string"}}}};let nt;const rt=/*#__PURE__*/new Set(["lazyElements","lazyEntries","race"]),at=(e,t)=>{const{inputs:n}=t,r=e=>n.received[e]??P;if((e=>"string"==typeof e||Array.isArray(e)||"literal"in e)(e))return q(e);if("type"in e)return(e=>{const{type:t,min:n=-1/0,max:r=1/0}=e;return"number"===t||"integer"===t?de({min:n,max:r,integer:"integer"===t}):[Q({type:t},e.minLength)]})(e);if("sum"in e)return a=r(e.sum),W(re(ye(ee(a))),fe(a),he(a,e=>de(ve(e,ie,ge)),(e,t)=>{const n=me(e);if(void 0===n)return 0===t?de(ie):P;const r=t>0;return de({min:n.min>=0?r?n.min:0:-1/0,max:n.max<=0?r?n.max:0:1/0,integer:n.integer})}));var a;if("product"in e)return(e=>W(fe(e),he(e,e=>de(ve(e,ce,we)),(e,t)=>{const n=me(e);if(void 0===n)return 0===t?de(ce):P;const r=n.min>=-1&&n.max<=1;return de({min:n.min>=1?1:n.min>=0?0:r?-1:-1/0,max:r?1:1/0,integer:n.integer})})))(r(e.product));if("difference"in e)return((e,t)=>{const n=me(e),r=me(t);return de(n&&r&&{min:n.min-r.max,max:n.max-r.min,integer:n.integer&&r.integer})})(...e.difference.map(r));if("abs"in e)return(e=>{const t=me(e);if(void 0===t)return P;const{min:n,max:r}=t;return de(n>=0?t:r<=0?{...t,min:-r,max:-n}:{...t,min:0,max:Math.max(-n,r)})})(r(e.abs));if("min"in e)return xe(r(e.min),"min");if("max"in e)return xe(r(e.max),"max");if("param"in e){const n=e.param;if(Object.hasOwn(t.elements,n))return t.elements[n];const a=r(n),o=t.definition.parameters[n]?.evaluation??"eager";return rt.has(o)?W(ee(a),(e=>R(e.map(e=>"exact"in e?v(e.exact)?R(Object.values(e.exact).map(e=>E(e))):P:"object"!==e.type?P:void 0===e.keys?F:R(Object.values(e.keys)))))(a)):a}if("elementOf"in e)return ee(r(e.elementOf));if("kindOf"in e)return re(ee(r(e.kindOf)));if("arrayOf"in e){const{arrayOf:n,minLength:r}=e,a="object"==typeof n&&"param"in n?t.items[n.param]:void 0;return void 0!==a?ne(a):te([at(n,t)],r?{minLength:r}:{})}if("oneOf"in e)return R(e.oneOf.map(e=>at(e,t)));if("typeNamedBy"in e){const r=e.typeNamedBy,a=n.received[r];if(void 0===a)return P;const o=z(a)??((e,t)=>{const n=e.definition.parameters[t]?.type;return"object"==typeof n&&"literal"in n?[...n.literal]:void 0})(t,r);return void 0===o?F:R(o.filter(e=>"string"==typeof e).map(e=>q(e)))}if("byParam"in e){const{cases:r,otherwise:a}=e,o=n.received[e.byParam],s=void 0===o?void 0:z(o),i=s?.map(e=>"string"==typeof e&&Object.hasOwn(r,e)?r[e]:a)??[...Object.values(r),a];return R(i.map(e=>void 0===e?P:at(e,t)))}return(e=>R(e.map(e=>{const t="exact"in e?Array.isArray(e.exact)?Array.from(e.exact,e=>E(e)):void 0:"array"===e.type?e.items:void 0;if(void 0===t)return W(X(ee([e])),E(null));const n=[];for(const e of t)if(n.push(X(e)),!U(e))return R(n);return R([...n,E(null)])})))(r(e.firstNonNull))},ot=[{type:"nonFinite"}],st=(e,t,n,r,a={})=>{if("yes"===t.propagates)return{output:E(null)};const{definition:s}=e.entry,i=(e=>void 0!==e.analysis?e.analysis.output:(nt??=new Map(o.filter(e=>Object.hasOwn(tt,e.name)).map(e=>[e,tt[e.name]])),nt.get(e)))(s);let c=void 0!==i?at(i,{definition:s,inputs:t,elements:n,items:a}):q(s.returns);return Object.values(t.received).some(e=>"no"!==ae(e))&&"no"!==Ne(c,"number")&&(c=W(c,ot)),"maybe"===t.propagates&&(c=W(c,E(null))),it(e,c,r,"no"===t.propagates)},it=(e,t,n,r)=>{const a=ae(t),o=n?a:ae(ct(t)),s=t.filter(e=>"exact"in e?"number"!=typeof e.exact||Number.isFinite(e.exact):"nonFinite"!==e.type);return"no"===o?{output:s}:{output:s,boundary:{path:e.path,code:"non-finite-result",message:`${e.name} – non-finite-result possible: a NaN or infinite number may reach its result`,certainty:0===s.length&&r?"always":"may",operator:e.name,order:[e.order]}}},ct=e=>e.filter(e=>!("type"in e&&"nonFinite"===e.type)),ut={unknown:!0},lt={fails:!0},pt=async(e,t,n,r,a=new Set)=>{if(a.has(e.entry.definition))return;const{parameters:o}=e.entry.definition,s=new Set(n.map(e=>e.param)),i=[];for(const[e,n]of Object.entries(t)){if(s.has(e))continue;const t=z(n);if(void 0===t)return;i.push({name:e,outcomes:t.map(e=>({value:e}))})}const c=n.map(e=>{const t=o[e.param],n=((e,t)=>{const{verdict:n,output:r}=e.result,a=void 0!==t.replacesNullAt;if("always"===n)return[a?ut:lt];const o=z(r);if(void 0===o)return[ut];const s=o.map(e=>({value:e}));return"no"===n?s:a?[ut]:[...s,lt]})(e,t);return{child:e,outcomes:"perElement"===t.evaluation&&void 0===e.at&&n.length>1?[ut]:n}}),u=()=>[...i,...c].reduce((e,{outcomes:t})=>e*t.length,1);if(u()>16)for(const e of c)e.outcomes.length>1&&(e.outcomes=[ut]);const l=u();if(l>16)return;const p=new Set,m=new Set,d=[];for(let n=0;n<l;n++){let o=n;const s=e=>{const t=e[o%e.length];return o=Math.floor(o/e.length),t},u={};for(const{name:e,outcomes:t}of i)u[e]=s(t).value;const l=new Map(c.map(({child:e,outcomes:t})=>[e,s(t)])),y=await gt(e,t,u,l,r,p,m,a);if(void 0===y)return;d.push(y)}const y=[],f=new Map,h=new Set,v=new Set;let g=0;for(const e of d)if("value"in e)y.push(E(e.value));else if("passed"in e){const{passed:t}=e;v.add(t),h.add(t),y.push(mt(t,o[t.param]))}else if(g++,"escaped"in e)h.add(e.escaped);else{const t=`${e.failure.code}|${e.failure.parameter??""}`,n=f.get(t)??{failure:e.failure,count:0};n.count++,f.set(t,n)}const b=[...f.values()].map(({failure:e,count:t})=>({...e,certainty:t===d.length?"always":"may"}));return{output:R(y),failures:b,reached:p,awaited:m,escaped:h,passed:v,fails:g===d.length}},mt=(e,t)=>void 0===e.at||"perElement"===t.evaluation?De(t,e.result.output):t.truthiness?q("boolean"):e.result.output,dt=Symbol("stopped"),yt=new Promise(()=>{}),ft=e=>{const t=Promise.reject(e);return t.catch(()=>{}),t},ht={memo:(e,t)=>t()},vt={note:()=>{}},gt=async(e,t,n,r,o,s,c,u)=>{const l=e=>{s.add(e),c.add(e)},{definition:p}=e.entry,{parameters:m}=p,d={...t};for(const[e,t]of Object.entries(n))d[e]=E(t);for(const[e,t]of r)void 0!==m[e.param].replacesNullAt&&"value"in t&&(d[e.param]=E(t.value));const y=ze(e,d);for(const[e,t]of r){if("race"===m[e.param].evaluation&&s.add(e),y.consulted.has(e.param)){if(!("value"in t))return;l(e)}}const f=Ke(p),h=(t,n,r)=>{const a=r??("external"===f?void 0:f.find(n=>n.code===t&&void 0!==n.parameter&&"no"!==et(e,n,y,o))?.parameter);return{failure:{path:e.path,code:t,message:n,certainty:"always",operator:e.name,...void 0!==a?{parameter:a}:{},order:[e.order]}}};if("null"===y.ends)return{value:null};if(void 0!==y.ends)return{failure:y.ends};const v=new Map,x=new Set,k=new Map,j=new Map;let O=!1,$=()=>{};const A=new Promise(e=>{$=()=>e(dt)});let N=!1;const S=()=>{N?$():O=!0},M=e=>{const t=new w({code:g.operatorFailure,message:"",path:[]});return k.set(t,e),t},P=(t,n)=>r=>{const a=void 0!==n.elementNullPolicy;if("yes"!==Ne(E(r),n.type,n.constraints,a)){const n=new w({code:g.typeCheck,message:`${e.name} – parameter '${t}': fails its type check`,path:[]});throw j.set(n,t),n}return n.truthiness?qe(r,n.type):r},F=e=>t=>e.truthiness?a(t):t,L=(e,t)=>{void 0!==e&&l(e);const n=void 0===e?ut:r.get(e);if("unknown"in n){const t=new Promise(()=>{});return void 0!==e&&v.set(t,e),S(),t}if("fails"in n)return ft(M(e));try{return Promise.resolve(t(n.value))}catch(e){return ft(e)}},q=e=>{let t;const n={evaluate:()=>t??=e()};return x.add(n),n},D=(e,t)=>{const n=({index:e,child:n,value:a})=>{if(void 0===n)return{index:e,ok:!0,value:t(a)};l(n);const o=r.get(n);if("fails"in o)return{index:e,ok:!1,error:M(n)};try{return{index:e,ok:!0,value:t(o.value)}}catch(t){return{index:e,ok:!1,error:t}}},a=e=>void 0!==e.child&&"unknown"in r.get(e.child),o={length:e.length,async*[Symbol.asyncIterator](){for(const t of e)a(t)||(yield n(t));e.some(a)&&(S(),await yt)}};return x.add(o),o},J=(e,t)=>{const n=F(t);switch(t.evaluation){case"lazyElements":return e.map(e=>q(()=>Promise.resolve(n(e))));case"race":return D(e.map((e,t)=>({index:t,value:e})),n);case"lazyEntries":{const t={};for(const[r,a]of Object.entries(e))t[r]=q(()=>Promise.resolve(n(a)));return t}case"lazy":return q(()=>Promise.resolve(e));default:return e}},B=new Map;for(const e of r.keys())B.set(e.param,[...B.get(e.param)??[],e]);const I={};for(const[e,t]of Object.entries(m)){if("perElement"===t.evaluation||void 0!==t.replacesNullAt)continue;const n=B.get(e);if(void 0!==n){const r=F(t);if("lazy"===t.evaluation)I[e]=q(()=>L(n[0],P(e,t)));else if("race"===t.evaluation)I[e]=D(n.map((e,t)=>({index:t,child:e})),r);else if("lazyElements"===t.evaluation)I[e]=n.map(e=>q(()=>L(e,r)));else{const t={};for(const e of n)t[String(e.at)]=q(()=>L(e,r));I[e]=t}continue}const r=y.received[e];if(void 0===r)continue;const a=z(r);if(void 0===a||1!==a.length)return;I[e]=J(a[0],t)}for(const[t,n]of p.resolution.perElement){if(void 0===e.params[t]||void 0===n.over)continue;const r=B.get(t)??[],a=I[n.over],o=Array.isArray(a)?a:[],i=1===r.length&&void 0===r[0].at;if(!i&&r.length!==o.length)return;const c=e=>r[i?e>=0&&e<o.length?0:-1:e],u=P(t,n),l=new Map,p={evaluate:e=>{let t=l.get(e);return void 0===t&&l.set(e,t=L(c(e),u)),t},settle:()=>{const e=o.map((e,t)=>({index:t,child:c(t)}));for(const{child:t}of e)s.add(t);return D(e,u)}};x.add(p),I[t]=p}const C={options:o.evaluation,get signal(){return(new AbortController).signal},cache:ht,trace:vt},T=t=>{const n=k.get(t);if(void 0!==n)return{escaped:n};if(b(t))return h(t.code,t.message,j.get(t));const r=`${e.name} – ${t instanceof Error?t.message:String(t)}`;return h((i(t)?t.code:void 0)??g.operatorFailure,r)};let R;try{R=p.evaluate(I,C)}catch(e){return T(e)}if(W=R,"function"==typeof W?.then){const e=v.get(R);if(void 0!==e)return{passed:e};if(O)return;N=!0;const t=setTimeout(()=>{u.add(p),$()},100),n=await Promise.race([Promise.resolve(R).then(e=>({value:e}),e=>({error:e})),A]);if(clearTimeout(t),n===dt)return;if("error"in n)return T(n.error);R=n.value}var W;return void 0===R?{value:null}:"number"!=typeof R||Number.isFinite(R)?x.has(R)?h(g.escapedHandle,`${e.name} – returned a lazy handle instead of evaluating it`):{value:R}:h(g.nonFiniteResult,`${e.name} – produced a non-finite number (${String(R)})`)},bt=(e,t)=>void 0===t?e.scope:{vars:t,at:e,known:new Map},wt={verdict:"no",escapes:[],output:P},xt={result:wt,covered:[]},kt=[{type:"integer",min:0}],jt=E(null),Ot=[{type:"object"}],$t=oe(Object.fromEntries(Object.entries(x).map(([e,t])=>[e,q(t)]))),At=e=>{if(0===e.length)return Ot;const{value:t,found:n}=se($t,e);return"yes"===n?t:W(t,jt)},Nt=({value:e,reads:t=[]},n=0)=>{if(0===t.length)return E(e);const r=t.find(({at:e})=>e.length===n);if(void 0!==r)return At(r.segments);const a=e,o=e=>Nt({value:a[e],reads:t.filter(({at:t})=>t[n]===e)},n+1);return Array.isArray(e)?ne(e.map((e,t)=>o(t))):oe(Object.fromEntries(Object.keys(a).map(e=>[e,o(e)])))},St=(e,t)=>{for(const n of t)e.push(n)},Mt=(e,t,n)=>{const r=[...e];for(const e of t)St(r,e.result.escapes);const a=t.some(e=>e.result.waits);return t.some(e=>e.eager&&"always"===e.result.verdict)||e.some(e=>!k(e)&&"always"===e.certainty)?{verdict:"always",escapes:r,output:P,waits:a}:{verdict:r.length>0?"may":"no",escapes:r,output:n,waits:a}},Pt=e=>`${e.order}|${e.code}|${e.parameter}`,Ft=e=>{const t=e.map(e=>new Set([...e.result.escapes,...e.covered.map(({pending:e})=>e)].filter(e=>!k(e)&&"always"===e.certainty).map(e=>Pt(e)))),n=e=>k(e)||"may"===e.certainty||t.every(t=>t.has(Pt(e)))?e:{...e,certainty:"may"};for(const t of e)t.result={...t.result,escapes:t.result.escapes.map(n)},t.covered=t.covered.map(({pending:e,by:t})=>({pending:n(e),by:t}))};class Et{options;bodies=new Map;stalled=new Set;waiting=new Set;strict;constructor(e){this.options=e,this.strict=!0===e.evaluation.strictDataPaths}root(e,t){return this.walk(e,{scope:null,bindings:null,sink:t,frame:{},walks:1})}async walk(e,t){const n=await this.visit(e,t);return n.waits&&this.waiting.add(e),n}async visit(e,t){switch(e.kind){case"constant":return{...wt,output:E(e.value)};case"invalid":throw zt("an invalid node");case"reference":return this.reference(e,t);case"skeleton":{const n={...t,scope:bt(t,e.vars)},r=[];for(const t of e.holes)r.push({result:await this.walk(t.node,n),eager:!0});const a=((e,t)=>{if(t.every(e=>1===e.length&&"exact"in e[0]))return E(l(e.skeleton,e.holes,t.map(e=>e[0].exact)));const n=e.holes.map((e,n)=>({at:e.at,output:t[n]})),r=(e,t,n)=>{const a=n.find(e=>e.at.length===t);if(void 0!==a)return a.output;if(0===n.length)return E(e);const o=new Map;for(const e of n){const n=o.get(e.at[t]);void 0===n?o.set(e.at[t],[e]):n.push(e)}const s=e=>o.get(e)??[];if(Array.isArray(e))return ne(Array.from(e,(e,n)=>r(e,t+1,s(n))));const i=e,c=new Set([...Object.keys(i),...n.map(e=>String(e.at[t]))]),u={};for(const e of c)u[e]=r(i[e],t+1,s(e));return oe(u)};return r(e.skeleton,0,n)})(e,r.map(e=>e.result.output));return Mt([],r,a)}case"elements":case"entries":{const n=[],r=await this.container("",e,t,n);for(const e of n)St(t.sink,e.covered);const a=n.map(({result:e})=>({result:e,eager:!1}));return Mt([],a,r)}case"operator":return this.operator(e,t);case"fragmentCall":return this.call(e,t)}return e}async operator(e,t){const{definition:n}=e.entry,r={...t,scope:bt(t,e.vars)},a={},o=[],s=[];for(const[t,i]of Object.entries(e.params)){const e=n.parameters[t]?.evaluation;if("perElement"!==e)if("elements"===i.kind||"entries"===i.kind)a[t]=await this.container(t,i,r,s);else if("lazy"===e){const e=await this.apart(t,i,r);a[t]=e.result.output,s.push(e)}else{const e=await this.walk(i,r);a[t]=e.output,o.push({result:e,eager:!0})}}const i=ze(e,a),u=c(e),l={},p={};for(const[a,o]of n.resolution.perElement){const n=e.params[a];if(void 0===n||void 0===o.over)continue;const c=i.received[o.over]??P,m=z(c),d=1===m?.length&&Array.isArray(m[0])?m[0]:void 0,y=t.walks*(d?.length??1/0);if(y<=16){const e=[];for(const[o,i]of Array.from(d).entries()){const c={as:u,element:E(i),index:E(o),parent:t.bindings},l=await this.apart(a,n,{...r,bindings:c,walks:y},o);s.push(l),e.push(l.result.output)}p[a]=e,l[a]=R(e)}else{const e={as:u,element:ee(c),index:kt,parent:t.bindings},o=await this.apart(a,n,{...r,bindings:e});s.push(o),l[a]=o.result.output}}const m=o.some(e=>"always"===e.result.verdict)?{output:P,failures:[],reached:new Set(s.filter(e=>"race"===n.parameters[e.param].evaluation)),awaited:new Set,escaped:new Set,passed:new Set,fails:!0}:"external"===Ke(n)?void 0:await pt(e,a,s,this.options,this.stalled);for(const e of Object.keys(p))Ft(s.filter(t=>t.param===e&&(m?.reached.has(t)??!0)));const d=[];void 0===m?(St(d,i.failures),"yes"!==i.propagates&&St(d,((e,t,n)=>{const r=Ke(e.entry.definition),a={path:e.path,operator:e.name,order:[e.order]};if("external"===r)return[{...a,code:Te,message:`${e.name} – may fail whatever its inputs: nothing describes what it fails on`,certainty:"may"}];const o=[];for(const s of r){const r=et(e,s,t,n);"no"!==r&&o.push({...a,code:s.code,message:_e(e.name,s),certainty:"yes"!==r||s.may||s.overflow||"no"!==t.propagates?"may":"always",...void 0!==s.parameter?{parameter:s.parameter}:{}})}return o})(e,i,this.options))):St(d,m.failures);for(const t of s){if(void 0!==m&&!m.passed.has(t))continue;const r=n.parameters[t.param];if("perElement"===r.evaluation){const n=Be(e,t.param,r,t.result.output);void 0!==n&&d.push(n)}else void 0!==m&&void 0===t.at&&St(d,i.failures.filter(e=>e.parameter===t.param))}const{output:y,boundary:f}=void 0===m?st(e,i,l,this.options.strictNumbers,p):it(e,m.output,this.options.strictNumbers,!1);void 0===f||d.some(e=>!k(e)&&e.code===f.code)||d.push(f);for(const e of s){if(void 0!==m&&!m.reached.has(e))continue;St(t.sink,e.covered);const n=void 0===m||m.escaped.has(e)?e.result.escapes:e.result.escapes.filter(k),r=e.result.waits&&(m?.awaited.has(e)??!0);o.push({result:{...e.result,escapes:n,waits:r},eager:!1})}const h=Mt(d,o,y);return!0===m?.fails&&Object.assign(h,{verdict:"always",output:P}),(e=>void 0!==e.analysis||"external"===Ke(e))(n)&&(h.waits=!0),this.withFallback(e,h,r)}async apart(e,t,n,r){const a=[];return{param:e,...void 0!==r?{at:r}:{},result:await this.walk(t,{...n,sink:a}),covered:a}}async container(e,t,n,r){if("elements"===t.kind){const a=[];for(const[o,s]of t.nodes.entries()){const t=await this.apart(e,s,n,o);r.push(t),a.push(t.result.output)}return ne(a)}const a={...n,scope:bt(n,t.vars)},o={};for(const[n,s]of Object.entries(t.entries)){const t=await this.apart(e,s,a,n);r.push(t),o[n]=t.result.output}return oe(o)}async withFallback(e,t,n){if("no"===t.verdict)return t;const r="operator"===e.kind?e.entry.defaultFallback:void 0;if(void 0===e.fallback&&void 0===r)return t;const a={path:e.path};for(const e of t.escapes)n.sink.push({pending:e,by:a});const{waits:o}=t;if(void 0===e.fallback)return{...wt,output:W(t.output,Nt(r)),waits:o};const s=await this.walk(e.fallback,n);if(e.fallbackReadsError&&"no"!==s.verdict){const r={path:e.path,givesNull:!0};for(const e of s.escapes)n.sink.push({pending:e,by:r});return{...wt,output:W(t.output,s.output,jt),waits:o||s.waits}}return{verdict:"always"===t.verdict||"always"!==s.verdict?s.verdict:"may",escapes:s.escapes,output:W(t.output,s.output),waits:o||s.waits}}async reference(e,t){const{segments:n,namespace:r}=e;switch(r){case"data":return this.drilled(e,F,n,[],[]);case"element":case"index":for(let a=t.bindings;null!==a;a=a.parent)if(u(a.as,r,e.binding))return"index"===r?{...wt,output:a.index}:this.drilled(e,a.element,n,[],[]);throw zt(`an unresolved '${e.raw}'`);case"vars":{const r=await this.varDefinition(n[0],t);if(void 0===r)throw zt(`an unresolved '${e.raw}'`);St(t.sink,r.covered);const a=[{result:r.result,eager:!0}];return this.drilled(e,r.result.output,n.slice(1),a,[])}case"params":{const{entry:r,params:a={}}=t.frame;if(void 0===r)throw zt(`'${e.raw}' outside a fragment body`);const[o,...s]=n;if(void 0===o){const t=Object.keys(r.parameters).map(e=>({demand:e}));return this.drilled(e,oe(a),[],[],t)}const i="string"==typeof o?a[o]??F:F;return this.drilled(e,i,s,[],[{demand:String(o)}])}case"error":return{...wt,output:At(n)}}return r}drilled(e,t,n,r,a){const{value:o,found:s}=se(t,n);if("yes"===s)return Mt(a,r,o);if(!this.strict)return Mt(a,r,W(o,jt));const i={path:e.path,code:"missing-data-path",message:`'${e.raw}' may be absent (strictDataPaths)`,certainty:"no"===s?"always":"may",order:[e.order]};return Mt([...a,i],r,o)}async varDefinition(e,t){for(let n=t.scope;null!==n;n=n.at.scope){if("string"!=typeof e||!Object.hasOwn(n.vars,e))continue;const t=n.known.get(e);if(void 0!==t)return t;n.known.set(e,{result:{...wt,output:F},covered:[]});const r=[],a={result:await this.walk(n.vars[e],{...n.at,scope:n,sink:r}),covered:r};return n.known.set(e,a),a}}async call(e,t){const{entry:n}=e;if(void 0===n)throw zt(`a call to the unknown fragment '${e.name}'`);const r={...t,scope:bt(t,e.vars)},a=[],o=[],s={},i=new Map;if("static"===e.argumentsMode)for(const[t,a]of Object.entries(n.parameters)){const n=await this.argument(e,t,a,r);i.set(t,n),s[t]=n.result.output}else{const t=e.parameters,i=await this.walk(t,r);o.push({result:i,eager:!0}),St(a,qt(e,n,t,s))}let c=!1;const u=e=>{const n=i.get(e)??xt;return St(t.sink,n.covered),c||=!0===n.result.waits,n},l=await this.body(n,s);for(const{pending:n,by:r}of l.covered){const a=O(r,e);if(k(n))for(const e of u(n.demand).result.escapes)t.sink.push({pending:e,by:a});else t.sink.push({pending:j(n,e),by:a})}const p=[];for(const t of l.result.escapes)k(t)?St(p,u(t.demand).result.escapes):p.push(j(t,e));return o.push({result:{...l.result,escapes:[]},eager:!0},{result:{...wt,escapes:p,waits:c},eager:!1}),this.withFallback(e,Mt(a,o,l.result.output),r)}async argument(e,t,n,r){const a=e.parameters?.[t];if(void 0===a)return{result:{...wt,output:E(n.default??null)},covered:[]};const o=[],s=await this.walk(a,{...r,sink:o}),{known:i,answer:c}=Je(n,s.output),u="yes"===c?[]:[Lt(e,t,a.path,a.order)];return{result:Mt(u,[{result:s,eager:!0}],i),covered:o}}async body(e,t){const n=Object.keys(t).map(e=>`${e}=${C(t[e])}`).join(";");let r=this.bodies.get(e);void 0===r&&this.bodies.set(e,r=new Map);const a=r.get(n);if(void 0!==a)return a;r.set(n,{result:{...wt,output:F},covered:[]});const o=[],s={entry:e,params:t},i={result:await this.walk(e.body,{scope:null,bindings:null,sink:o,frame:s,walks:1}),covered:o};return r.set(n,i),i}}const zt=e=>new Error(`[fig-tree internal] ${e} reached the coverage walk — the static gate should have refused it`),Lt=(e,t,n,r)=>({path:n,code:"type-check",message:`fragment '${e.name}' – parameter '${t}': the argument may not fit the declared type`,certainty:"may",parameter:t,order:[r]}),qt=(e,t,n,r)=>{const a=(t,r)=>({path:n.path,code:t,message:`fragment '${e.name}' – ${r}`,certainty:"may",order:[n.order]}),o=Object.entries(t.parameters);for(const[e,t]of o)r[e]=Je(t,F).known;const s=[a("type-check","'parameters' may not match the declared parameters")];return o.some(([,e])=>e.required)&&s.push(a("missing-required","'parameters' may omit a required parameter")),s},Dt=async(e,t,n)=>{if(!(e instanceof p))throw new TypeError("fallbackCoverage() takes a FigTree instance");const r=n?.strictNumbers??!1;if("boolean"!=typeof r)throw new w({code:g.invalidOptions,message:`'strictNumbers' must be a boolean, received ${JSON.stringify(r)}`,path:[]});const{artifact:a,options:o}=m(e.compile(t)),s=d(a,o).filter(e=>"error"===e.severity);if(s.length>0)return{uncovered:s.map(A),covered:[]};const i=new Et({strictNumbers:r,evaluation:o}),c=[],{escapes:u,waits:l}=await i.root(a.root,c),y=u.filter(e=>!k(e)).map(S);if(void 0!==o.timeout&&l)for(const{node:e,timeoutFallback:t}of a.holes){const n={path:e.path,code:"timeout",certainty:"may",order:[e.order]};a.timeoutShielded?i.waiting.has(e)&&c.push({pending:{...n,message:"may be cut off by the timeout, which puts its static fallback in its place"},by:{path:e.path}}):void 0===t&&y.push(S({...n,message:"the timeout may reject the evaluation: something in it can wait, and this value has no static fallback to shield it"}))}const f=c.flatMap(({pending:e,by:t})=>k(e)?[]:[M(e,t)]);return{uncovered:N(y),covered:N(f)}};export{Dt as fallbackCoverage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,i as t,m as r,g as a,e as n,D as o,E as s,h as i,d as l,q as c,u,j as d,S as p,v as f,f as m,p as h,s as v,k as y,o as g,w as b,x as w,l as k,y as $,z as x,r as j,t as O,c as P,n as A,R as N,F as D,A as C,b as S,B as z,C as T,W as E,H as q,I as M,G as F}from"./shared.js";const R={ok:!0},I=e=>null===e?"null":Array.isArray(e)?"array":typeof e,V=(e,t)=>({ok:!1,expected:e,actual:I(t)}),L=(t,r)=>{switch(r){case"any":return!0;case"string":return"string"==typeof t;case"number":return"number"==typeof t;case"integer":return"number"==typeof t&&Number.isInteger(t);case"boolean":return"boolean"==typeof t;case"array":return Array.isArray(t);case"object":return e(t);case"null":return null===t;default:return!1}},W=e=>"null"===e||"any"===e||!!Array.isArray(e)&&(e.includes("null")||e.includes("any")),B=/*#__PURE__*/new Set(["any","string","number","boolean","array","object","null","integer"]),J=t=>{if("string"==typeof t)return B.has(t);if(Array.isArray(t))return t.length>0&&t.every(e=>"string"==typeof e&&B.has(e));if(e(t)&&"literal"in t){const e=t.literal;return Array.isArray(e)&&e.length>0&&e.every(e=>["string","number","boolean"].includes(typeof e))}return!1},U=(e,r)=>{if(t(r)){if(-1!==r.literal.indexOf(e))return R;const t=r.literal.map(e=>JSON.stringify(e)).join(", ");return V(`one of ${t}`,e)}return"string"==typeof r?L(e,r)?R:V(r,e):r.some(t=>L(e,t))?R:V(r.join(" | "),e)},K=(e,t)=>{if(void 0!==t.length){if(!Array.isArray(e))return V("array",e);if(e.length!==t.length)return{ok:!1,expected:`array of length ${t.length}`,actual:`array of length ${e.length}`}}if(t.homogeneous){if(!Array.isArray(e))return V("array",e);const r=t.homogeneous;if(e.length>0){if(void 0===r.find(t=>e.every(e=>L(e,t))))return{ok:!1,expected:`homogeneous array of ${r.join(" | ")}`,actual:G(e)}}}if(t.elementShape){if(!Array.isArray(e))return V("array",e);for(let r=0;r<e.length;r++){const a=Q(e[r],t.elementShape);if(!a.ok)return a}}return R},G=e=>{const t=I(e[0]),r=e.find(e=>I(e)!==t);return void 0===r?`array of ${t}`:`${I(r)} beside ${t}`},_=["length","homogeneous","elementShape"],H=t=>{if(!e(t))return V("a constraints object",t);for(const e of Object.keys(t))if(!_.includes(e))return{ok:!1,expected:`one of ${_.join(", ")}`,actual:e};const{length:r,homogeneous:a,elementShape:n}=t;if(void 0!==r&&(!Number.isInteger(r)||r<0))return V("a non-negative integer length",r);if(!(void 0===a||Array.isArray(a)&&J(a)))return V("a non-empty array of basic types",a);if(void 0!==n){if(!e(n))return V("an object of declarations",n);for(const[t,r]of Object.entries(n)){if(!e(r))return V(`a declaration for "${t}"`,r);if(void 0!==r.type&&!J(r.type))return V(`a vocabulary type for "${t}"`,r.type);if(void 0!==r.required&&"boolean"!=typeof r.required)return V(`a boolean "required" for "${t}"`,r.required);if(void 0!==r.constraints){const e=H(r.constraints);if(!e.ok)return e}}}return R},Q=(t,r)=>{if(!e(t))return V("object",t);const a=Object.keys(r);for(let e=0;e<a.length;e++){const n=a[e],o=r[n],s=Object.prototype.hasOwnProperty.call(t,n),i=!1!==o.required;if(s){if(void 0!==o.type){const e=U(t[n],o.type);if(!e.ok)return e}if(void 0!==o.constraints){const e=K(t[n],o.constraints);if(!e.ok)return e}}else if(i)return{ok:!1,expected:`property "${n}"`,actual:"missing"}}return R},X=(e,t,r)=>{if(!r||!Array.isArray(e))return K(e,t);const{length:a,...n}=t;if(void 0!==a){const t=K(e,{length:a});if(!t.ok)return t}return K(e.filter(e=>null!==e),n)},Y=["logic","comparison","math","string","array","data","io","other"],Z=Symbol("fig-tree:EvaluationData"),ee=Symbol("fig-tree:validated-operator"),te=e=>"object"==typeof e&&null!==e&&!0===e[ee],re=[!1,null,0,""],ae=e=>-1===re.indexOf(e),ne=(e,t)=>"number"==typeof e&&"number"==typeof t?e<t?-1:e>t?1:0:oe(String(e),String(t)),oe=(e,t)=>{const r=Array.from(e),a=Array.from(t),n=Math.min(r.length,a.length);for(let e=0;e<n;e++){const t=r[e].codePointAt(0),n=a[e].codePointAt(0);if(t!==n)return t<n?-1:1}return r.length===a.length?0:r.length<a.length?-1:1},se="<array>",ie="<object>",le=e=>null===e?"":"string"==typeof e?e:"number"==typeof e?String(e):"boolean"==typeof e?e?"true":"false":Array.isArray(e)?se:ie,ce=e=>null!==e&&"object"==typeof e,ue="a composite element renders as a placeholder, never as text — drill in, or join it explicitly",de=e=>e.trim(),pe=/\s+$/,fe=/^\s+/,me=e=>e.replace(pe,""),he=e=>e.replace(fe,""),ve=e=>Array.from(e),ye=(e,t)=>{const[r,a]=String(e).split("e"),n=void 0!==a?Number(a)+t:t;return Number(`${r}e${n}`)},ge=Object.prototype.hasOwnProperty,be=(e,t)=>{for(const r of e.keys())if(we(r,t))return r},we=(e,t)=>{let r,a,n;if(e===t)return!0;if(e&&t&&(r=e.constructor)===t.constructor){if(r===Date)return e.getTime()===t.getTime();if(r===RegExp)return e.toString()===t.toString();if(r===Array){if((a=e.length)===t.length)for(;a--&&we(e[a],t[a]););return-1===a}if(r===Set){if(e.size!==t.size)return!1;for(a of e){if(n=a,n&&"object"==typeof n&&(n=be(t,n),!n))return!1;if(!t.has(n))return!1}return!0}if(r===Map){if(e.size!==t.size)return!1;for(a of e){if(n=a[0],n&&"object"==typeof n&&(n=be(t,n),!n))return!1;if(!we(a[1],t.get(n)))return!1}return!0}if(r===ArrayBuffer)e=new Uint8Array(e),t=new Uint8Array(t);else if(r===DataView){if((a=e.byteLength)===t.byteLength)for(;a--&&e.getInt8(a)===t.getInt8(a););return-1===a}if(ArrayBuffer.isView(e)){if((a=e.byteLength)===t.byteLength)for(;a--&&e[a]===t[a];);return-1===a}if(!r||"object"==typeof e){for(r in a=0,e){if(ge.call(e,r)&&++a&&!ge.call(t,r))return!1;if(!(r in t)||!we(e[r],t[r]))return!1}return Object.keys(t).length===a}}return e!=e&&t!=t},ke=e=>!e.includes("{")&&!e.includes("}")&&(e.startsWith("$")?e.length>1:r(e).ok),$e=e=>{const t=[];let r="";const a=()=>{""!==r&&(t.push({kind:"text",text:r}),r="")};let n=0;for(;n<e.length;){const o=e[n];if("%"===o){let s=n+1;for(;s<e.length&&e[s]>="0"&&e[s]<="9";)s++;if(s>n+1){const r=e.slice(n,s);a(),t.push({kind:"positional",raw:r,index:Number(r.slice(1))}),n=s;continue}r+=o,n++;continue}if("{"===o&&"{"===e[n+1]){const o=e.indexOf("}}",n+2);if(-1!==o){const r=e.slice(n+2,o);if(ke(r)){a(),t.push({kind:"named",raw:e.slice(n,o+2),body:r}),n=o+2;continue}}r+="{{",n+=2;continue}r+=o,n++}return a(),t},xe=e=>{const t={maxDepth:0};return{constant:Oe(t,e,0),depth:t.maxDepth}},je=e=>{const t={maxDepth:0};if(Oe(t,e,0,[]))return void 0===t.reads?{value:e}:{value:e,reads:t.reads}},Oe=(e,t,r,s)=>{if(r>o)return!1;if(r>e.maxDepth&&(e.maxDepth=r),void 0===t)return!1;if("string"==typeof t){const r=a(t);return"reference"===r.kind&&"error"===r.namespace&&void 0!==s?((e.reads??=[]).push({at:s,segments:r.segments}),!0):"plain"===r.kind||"unrecognized"===r.kind}if(Array.isArray(t)){for(let a=0;a<t.length;a++)if(!Oe(e,t[a],r+1,s&&[...s,a]))return!1;return!0}if(n(t)){for(const e in t){if("operator"===e||"fragment"===e||"vars"===e||"//"===e)return!1;if(e.startsWith("$"))return!1}for(const a in t)if(!Oe(e,t[a],r+1,s&&[...s,a]))return!1;return!0}return!0},Pe=(e,t)=>({parent:e,key:t}),Ae=e=>{const t=[];for(let r=e;null!==r;r=r.parent)t.push(r.key);return t.reverse()},Ne=e=>{e.sort((e,t)=>e.order-t.order)},De=e=>e.some(({issue:e})=>"error"===e.severity),Ce=e=>{const t=e.entry.definition.parameters.as;if("structural"!==t?.evaluation)return null;const r=e.params.as;return"constant"===r?.kind&&"string"==typeof r.value?r.value:null},Se=(e,t,r)=>void 0===r?null===e:("element"===t?e:`${e??""}Index`)===r,ze=(e,t,r)=>{"__proto__"===t?Object.defineProperty(e,t,{value:r,writable:!0,enumerable:!0,configurable:!0}):e[t]=r},Te=(e,t,r)=>{const a=new Set;let n=e;return t.forEach((e,t)=>{n=Ee(n,e.at,r[t],a)}),n},Ee=(e,t,r,a)=>{const n=qe(e,a),[o,...s]=t;return ze(n,o,0===s.length?r:Ee(n[o],s,r,a)),n},qe=(e,t)=>{if(t.has(e))return e;const r=Array.isArray(e)?[...e]:{...e};return t.add(r),r},Me=(e,t,r={})=>{const a={registry:t,recognizes:e=>((e,t)=>"literal"===t||void 0!==Gr(e,t)||e.fragments.has(t))(t,e),issues:[],order:0,nodeCount:0,maxDepth:0,dataPaths:new Map,dynamic:!1,operators:new Set,fragmentNames:new Set,fragmentCalls:[],dataReads:[],identityOnly:!1,scope:{bindings:[]},asNames:new Set,unrecognized:[],unknownNodes:0,hasNoCache:!1},n=(r.basePath??[]).reduce(Pe,null),o=Ve(a,e,n,0);Re(a);const s=St(o);Ne(a.issues);const i=De(a.issues),l={nodeCount:a.nodeCount,maxDepth:a.maxDepth,dependencies:{dataPaths:a.dataPaths,dynamic:a.dynamic,operators:[...a.operators],fragments:[...a.fragmentNames]},identityOnly:a.identityOnly};return{root:o,holes:s,issues:a.issues,hasErrors:i,timeoutShielded:s.every(e=>void 0!==e.timeoutFallback),own:l,...Fe(l,a.fragmentCalls,t.fragments),fragmentCalls:a.fragmentCalls,dataReads:a.dataReads,hasNoCache:a.hasNoCache}},Fe=(e,t,r)=>{if(0===t.length)return e;const a=new Map(e.dependencies.dataPaths),n=new Set(e.dependencies.operators),o=new Set(e.dependencies.fragments);let{nodeCount:s,maxDepth:i,identityOnly:l}=e,c=e.dependencies.dynamic;for(const e of t){const t=r.get(e.name);if(void 0!==t){s+=t.nodeCount,i=Math.max(i,e.depth+t.maxDepth),l||=t.identityOnly,c||=t.dependencies.dynamic;for(const[e,r]of t.dependencies.dataPaths)a.set(e,r);for(const e of t.dependencies.operators)n.add(e);for(const e of t.dependencies.fragments)o.add(e)}}return{nodeCount:s,maxDepth:i,identityOnly:l,dependencies:{dataPaths:a,dynamic:c,operators:[...n],fragments:[...o]}}},Re=e=>{if(0!==e.asNames.size)for(const{token:t,issue:r,raw:a}of e.unrecognized)e.asNames.has(t)&&(r.issue={...r.issue,severity:"error",code:s.unresolvedBinding,message:`'${a}' names an iterator binding, but no enclosing iterator binds it here`})},Ie=(e,t,r,a,n,o,s={})=>{const i={severity:t,code:r,message:a,path:Ae(n)};void 0!==s.operator&&(i.operator=s.operator),void 0!==s.parameter&&(i.parameter=s.parameter),void 0!==s.suggestion&&(i.suggestion=s.suggestion);const l={issue:i,order:o};return e.issues.push(l),l},Ve=(e,t,r,a)=>{const n=e.order++;if(a>e.maxDepth&&(e.maxDepth=a),a>o)return Ie(e,"error",s.depthCeiling,`the expression nests deeper than the engine's ceiling of ${o} levels — descent stopped here`,r,n),e.nodeCount++,Be(t,r,n);const i=Le(e,t,r,a,n);return"operator"!==i.kind&&"fragmentCall"!==i.kind&&"reference"!==i.kind&&"invalid"!==i.kind||e.nodeCount++,i},Le=(e,t,r,a,o)=>null==t?We(t??null,r,o):"number"==typeof t||"boolean"==typeof t?We(t,r,o):"string"==typeof t?Je(e,t,r,o):Array.isArray(t)?Ke(e,t,r,a,o):n(t)?Ge(e,t,r,a,o):(e.identityOnly=!0,We(t,r,o)),We=(e,t,r)=>({kind:"constant",value:e,path:t,order:r}),Be=(e,t,r)=>({kind:"invalid",raw:e,path:t,order:r}),Je=(e,t,r,n)=>{const o=a(t,e.scope);switch(o.kind){case"plain":return We(t,r,n);case"unrecognized":{const a=Ie(e,"warning",s.unrecognizedIdentifier,`'${t}' matches no reference namespace and will pass through as data`,r,n),o=i(t);return null!==o&&0===e.unknownNodes&&e.unrecognized.push({token:o.token,issue:a,raw:t}),We(t,r,n)}case"invalid":return Ie(e,"error",o.code??s.invalidReference,`'${t}': ${o.reason}`,r,n),Be(t,r,n);case"reference":{const{namespace:a,segments:s,drill:i,binding:l}=o,c={kind:"reference",namespace:a,segments:s,raw:t,path:r,order:n};return void 0!==l?c.binding=l:"data"===a&&(0===s.length?e.dynamic=!0:st(e,s,i.startsWith(".")?i.slice(1):void 0,r)),e.unknownNodes>0&&Ue(a)&&(c.scopeUnknown=!0),c}}},Ue=e=>"element"===e||"index"===e||"error"===e,Ke=(e,t,r,a,n)=>{const o=Array.from(t,(t,n)=>({key:n,rawChild:t,node:Ve(e,t,Pe(r,n),a+1)}));return Ct(e,t,o,!0,!1,void 0,r,n)},Ge=(e,t,r,a,n)=>{const o=l(t,e.recognizes);switch(o.kind){case"malformed":return Ie(e,"error",s.malformedNode,o.message,r,n),Be(t,r,n);case"operator":return _e(e,t,r,a,n);case"fragment":return $t(e,t,r,a,n);case"shorthand":return ht(e,t,o.key,r,a,n);case"plain":return At(e,t,r,a,n)}},_e=(e,t,r,a,n)=>{const o=t.operator;if("string"!=typeof o)return Ie(e,"error",s.malformedNode,"the 'operator' value must be a literal string",r,n),Be(t,r,n);if("literal"===o)return kt(e,t,t.value,"value"in t,r,n);const i=Gr(e.registry,o);if(void 0===i){const a=f(o,Mt(e));return Ie(e,"error",s.unknownOperator,`'${o}' names no registered operator${a?` — did you mean '${a}'?`:""}`,r,n,{suggestion:a}),Be(t,r,n)}const l=He(e,i,r,n),c=[];for(const o in t){const i=t[o];"operator"!==o&&"//"!==o&&void 0!==i&&(Qe(e,l,o,i,r,a,n)||("parameters"!==o?Ye(e,l,c,o,i,Pe(r,o),n):Ie(e,"error",s.malformedNode,"'parameters' is reserved and unused on operator nodes",Pe(r,o),n,{operator:l.name})))}return Ze(e,l,c,a,n),l},He=(e,t,r,a)=>(e.operators.add(t.definition.name),{kind:"operator",name:t.definition.name,entry:t,params:{},path:r,order:a}),Qe=(e,t,r,a,n,o,s)=>"fallback"===r?(t.fallback=Ve(e,a,Pe(n,"fallback"),o+1),!0):"noCache"===r?(Xe(e,t,a,n,s),!0):"vars"===r&&(t.vars=Pt(e,a,n,o,s),!0),Xe=(e,t,r,a,n)=>{!0===r?(t.noCache=!0,e.hasNoCache=!0):Ie(e,"error",s.malformedNode,"'noCache' takes only the literal true — it is settled before the subtree runs",Pe(a,"noCache"),n,"operator"===t.kind?{operator:t.name}:{})},Ye=(e,t,r,a,n,o,i)=>{if(void 0===t.entry.definition.parameters[a]){const r=f(a,Object.keys(t.entry.definition.parameters));return void Ie(e,"error",s.unknownNodeKey,`'${a}' is not a parameter of '${t.name}'${r?` — did you mean '${r}'?`:""}`,o,i,{operator:t.name,parameter:a,suggestion:r})}r.push({name:a,kind:"value",value:n,path:o})},Ze=(e,t,r,a,n)=>{const o=t.entry.definition,s=o.resolution.perElement.length>0;let i;if("get"===t.name&&et(e,t,r),s){const a=r.find(e=>"as"===e.name&&"structural"===o.parameters.as?.evaluation&&"value"===e.kind);void 0!==a&&"value"===a.kind&&(i=mt(e,t,a.value,a.path,n))}for(const n of r){const r=o.parameters[n.name]?.evaluation;"perElement"!==r&&(t.params[n.name]=lt(e,n,r,a))}if(s){void 0!==i&&e.scope.bindings.push(i);for(const n of r){const r=o.parameters[n.name]?.evaluation;"perElement"===r&&(t.params[n.name]=lt(e,n,r,a))}void 0!==i&&e.scope.bindings.pop()}it(e,t),rt(e,t)},et=(e,t,r)=>{const a=r.findIndex(e=>"from"===e.name),n=r[a];if("value"!==n?.kind||"string"!=typeof n.value)return;const o=y(n.value);if("data"===o&&r.splice(a,1),"vars"!==o&&"params"!==o)return;const i=r.find(e=>"path"===e.name),l="value"===i?.kind?tt(e,i.value):null;if(null===l||"value"!==i?.kind){if("vars"!==o)return;const i=e.order++;return Ie(e,"error",s.bareVars,`'${n.value}': with 'from: ${n.value}' the path's first key names the var, so the path must be written out and start with a key`,n.path,i,{operator:"get",parameter:"from"}),r.splice(a,1),void(t.params.from=Be(n.value,n.path,i))}const[c,...u]=l;n.value=g(o,[c]),i.value=Array.isArray(i.value)?u:d(u)},tt=(e,t)=>{const r=t=>{if("string"!=typeof t)return $(t);const{kind:r}=a(t,e.scope);return"plain"===r||"unrecognized"===r};try{const e=Array.isArray(t)?t.every(r)&&t:"string"==typeof t&&r(t)&&k(t);return e&&"string"==typeof e[0]?e:null}catch{return null}},rt=(e,t)=>{if("buildString"!==t.name)return;((e,t)=>{const r=t.params.substitutions;if(void 0===r)return;const a="constant"===r.kind?r.value:"skeleton"===r.kind?r.skeleton:void 0;(Array.isArray(a)||n(a))&&Object.values(a).some(ce)&&Ie(e,"error",s.operatorValidate,ue,r.path,r.order,{operator:t.name,parameter:"substitutions"})})(e,t);const r=t.params.template;if("constant"!==r?.kind||"string"!=typeof r.value)return;const a=$e(r.value).filter(e=>"text"!==e.kind);if(0===a.length)return;const o=t.params.substitutions,i=(e=>{if(void 0===e)return{mode:"absent"};if("constant"===e.kind)return Array.isArray(e.value)?{mode:"array",length:e.value.length}:n(e.value)?{mode:"object",keys:new Set(Object.keys(e.value))}:{mode:"dynamic"};if("skeleton"===e.kind){const{skeleton:t,holes:r}=e;if(Array.isArray(t))return{mode:"array",length:t.length};if(n(t)){const e=new Set(Object.keys(t));for(const t of r)e.add(String(t.at[0]));return{mode:"object",keys:e}}}return{mode:"dynamic"}})(o);if(nt(e,t,r,a,i),"absent"!==i.mode&&"object"!==i.mode)return;const l=[],c=new Set;for(const t of a){if("named"!==t.kind||!t.body.startsWith("$"))continue;if(c.has(t.body))continue;const a=Je(e,t.body,r.path,e.order++);"reference"===a.kind&&(e.nodeCount++,c.add(t.body),l.push({path:r.path,at:[t.body],node:a}))}0!==l.length&&(t.params.substitutions=at(e,t,o,l))},at=(e,t,r,a)=>{const n="skeleton"===r?.kind?{...r,skeleton:{...r.skeleton},holes:[...r.holes]}:{kind:"skeleton",skeleton:"constant"===r?.kind?{...r.value}:{},holes:[],path:r?.path??Pe(t.path,"substitutions"),order:r?.order??e.order++};return n.holes.push(...a),n},nt=(e,t,r,a,n)=>{const o=(a,n)=>Ie(e,"warning",a,n,r.path,r.order,{operator:t.name}),i=(e,t)=>o(s.unboundToken,`'${e}' binds to nothing and renders as its own text${t}`),l=e=>{for(const t of e)o(s.unusedSubstitution,`substitution ${t} is never named by the template`)};if("array"!==n.mode&&"dynamic"!==n.mode||a.some(e=>"named"===e.kind&&e.body.startsWith("$"))&&o(s.inertReferenceToken,`a reference token needs the named face — beside ${"array"===n.mode?"positional substitutions":"a dynamically supplied map"} it is not recognized and renders as its own text`),"array"===n.mode){const e=new Set,t=[];for(const r of a)"positional"===r.kind&&(r.index>=1&&r.index<=n.length?e.add(r.index):t.push(r));const r=[];for(let t=1;t<=n.length;t++)e.has(t)||r.push(String(t));if(0===t.length)return void l(r);const o=0===n.length?"there are no substitutions":1===n.length?"there is only 1 substitution":`there are only ${n.length} substitutions`;for(const e of t)i(e.raw,` — ${e.index<1?"numbering starts at %1":o}${ot(r)}`);return}if("object"===n.mode){const e=new Set,t=[];for(const r of a)"named"===r.kind&&(n.keys.has(r.body)?e.add(r.body):r.body.startsWith("$")||t.push(r.raw));const r=[...n.keys].filter(t=>!e.has(t)).map(e=>`'${e}'`);0===t.length&&l(r);for(const e of t)i(e,ot(r))}},ot=e=>{if(0===e.length)return"";if(1===e.length)return`, and substitution ${e[0]} is unused`;const t=e[e.length-1];return`, and substitutions ${e.slice(0,-1).join(", ")} and ${t} are unused`},st=(e,t,r,a)=>{let n,o;void 0!==r&&c(r)?(n=r,o=t):(o=u(t),n=d(o)),e.dataPaths.set(n,o),e.dataReads.push({kind:"path",key:n,segments:o,path:a})},it=(e,t)=>{if("get"!==t.name||void 0!==t.params.from)return;const r=t.params.path;if(void 0!==r)if("constant"===r.kind)try{const a="string"==typeof r.value?k(r.value):r.value;if(!Array.isArray(a)||!a.every($))return void(e.dynamic=!0);if(0===a.length)return void(e.dynamic=!0);st(e,a,"string"==typeof r.value?r.value:void 0,t.path)}catch{e.dynamic=!0}else e.dynamic=!0},lt=(e,t,r,a)=>{if("lazyElements"===r||"race"===r){const r=pt(e,t,a);if(null!==r)return r}if("lazyEntries"===r){const r=ft(e,t,a);if(null!==r)return r}return"value"===t.kind?Ve(e,t.value,t.path,a+1):ct(e,t,a)},ct=(e,t,r)=>{const{order:a,containerDepth:n}=ut(e,r),o=dt(e,t.elements,t.basePath,t.offset,n);return Ct(e,t.elements,o,!0,!1,void 0,t.basePath,a)},ut=(e,t)=>{const r=e.order++,a=t+1;return a>e.maxDepth&&(e.maxDepth=a),{order:r,containerDepth:a}},dt=(e,t,r,a,n)=>Array.from(t,(t,o)=>({key:o,rawChild:t,node:Ve(e,t,Pe(r,a+o),n+1)})),pt=(e,t,r)=>{const a="slice"===t.kind?t.elements:t.value;if(!Array.isArray(a))return null;const n="slice"===t.kind?t.basePath:t.path,o="slice"===t.kind?t.offset:0,{order:s,containerDepth:i}=ut(e,r),l=dt(e,a,n,o,i);if(l.every(e=>"constant"===e.node.kind))return Ct(e,a,l,!0,!1,void 0,n,s);return{kind:"elements",nodes:l.map(e=>e.node),path:n,order:s}},ft=(e,t,r)=>{if("value"!==t.kind)return null;const a=t.value;if(!n(a)||m(a,e.recognizes))return null;const{order:o,containerDepth:s}=ut(e,r),{entries:i,vars:l,changed:c}=Nt(e,a,t.path,s,o,!0);if(i.every(e=>"constant"===e.node.kind))return Ct(e,a,i,!1,c,l,t.path,o);const u={};for(const{key:e,node:t}of i)u[String(e)]=t;const d={kind:"entries",entries:u,path:t.path,order:o};return void 0!==l&&(d.vars=l),d},mt=(e,t,n,o,i)=>{const l=r=>{Ie(e,"error",s.invalidAs,r,o,i,{operator:t.name})};if("string"!=typeof n||"plain"!==a(n).kind)return l("'as' must be a literal name — a dynamic value cannot be statically resolved");const c=r(n);if(!c.ok)return l(`'${n}' is not a legal binding name — ${c.reason}`);const u=[n,x(n)];for(const t of u){if(void 0!==b(t))return l(`'${n}' collides with the reserved namespace word '${t}'`);if(null!==w(t,e.scope.bindings))return l(`'${n}' collides with an enclosing 'as' binding ('${t}')`)}for(const t of u)e.asNames.add(t);return n},ht=(e,t,r,a,n,o)=>{const i=r.slice(1),l="literal"===i,c=!l&&e.registry.fragments.has(i);for(const n in t)if(n!==r&&!p.has(n))return Ie(e,"error",s.malformedNode,`'${n}' may not sit beside the shorthand key '${r}' — reserved modifiers only`,Pe(a,n),o),Be(t,a,o);const u=t[r],d=Pe(a,r);if(l){for(const r of["fallback","vars","noCache"])r in t&&Ie(e,"warning",s.uselessModifier,`'${r}' on 'literal' is dead — contents are never evaluated`,Pe(a,r),o);return kt(e,t,u,!0,a,o)}if(c)return xt(e,t,i,u,a,n,o);const f=Gr(e.registry,i),m=He(e,f,a,o);for(const s in t){const i=t[s];s!==r&&"//"!==s&&void 0!==i&&Qe(e,m,s,i,a,n,o)}const h=[];return vt(e,m,h,u,d,o),Ze(e,m,h,n,o),m},vt=(e,t,r,a,o,s)=>{if(Array.isArray(a))gt(e,t,r,a,o,s);else if(!n(a)||m(a,e.recognizes))yt(e,t,r,a,o,s);else for(const n in a){const i=a[n];"//"!==n&&void 0!==i&&Ye(e,t,r,n,i,Pe(o,n),s)}},yt=(e,t,r,a,n,o)=>{const s=v(t.entry.definition);null!==s?r.push({name:s,kind:"value",value:a,path:n}):bt(e,t,n,o)},gt=(e,t,r,a,n,o)=>{const s=t.entry.definition,i=h(s,a.length);if(null===i)return void wt(e,t,a,n,o);const l=s.positionalParams;for(let e=0;e<i.bound;e++)r.push({name:l[e],kind:"value",value:a[e],path:Pe(n,e)});const{restAt:c}=i;null!==c&&r.push({name:s.restParam,kind:"slice",elements:0===c?a:a.slice(c),basePath:n,offset:c})},bt=(e,t,r,a)=>Ie(e,"error",s.positionalArity,`'${t.name}' takes no positional arguments — use the named form`,r,a,{operator:t.name}),wt=(e,t,r,a,n)=>{const o=t.entry.definition.positionalParams;if(void 0===o)return void bt(e,t,a,n);const i=o.length;Ie(e,"error",s.positionalArity,`'${t.name}' takes at most ${i} positional argument${1===i?"":"s"} (${o.join(", ")}), got ${r.length}`,a,n,{operator:t.name})},kt=(e,t,r,a,n,o)=>{if("operator"in t){for(const r in t)"operator"!==r&&"value"!==r&&"//"!==r&&("fallback"!==r&&"vars"!==r&&"noCache"!==r?Ie(e,"error",s.unknownNodeKey,`'${r}' is not a key of 'literal' — content goes in 'value'`,Pe(n,r),o,{operator:"literal"}):Ie(e,"warning",s.uselessModifier,`'${r}' on 'literal' is dead — contents are never evaluated`,Pe(n,r),o));if(!a)return Ie(e,"error",s.malformedNode,"'literal' requires its content in 'value'",n,o,{operator:"literal"}),Be(t,n,o)}return We(r,n,o)},$t=(e,t,r,a,n)=>{const o=t.fragment;if("string"!=typeof o)return Ie(e,"error",s.malformedNode,"the 'fragment' value must be a literal string",r,n),Be(t,r,n);const i={kind:"fragmentCall",name:o,argumentsMode:"static",path:r,order:n};jt(e,i,a);for(const o in t){const l=t[o];"fragment"!==o&&"//"!==o&&void 0!==l&&("parameters"!==o?"fallback"!==o?"vars"!==o?"noCache"!==o?Ie(e,"error",s.unknownNodeKey,`'${o}' is not a key of a fragment call — arguments live only in 'parameters'`,Pe(r,o),n):Xe(e,i,l,r,n):i.vars=Pt(e,l,r,a,n):i.fallback=Ve(e,l,Pe(r,"fallback"),a+1):Ot(e,i,l,Pe(r,"parameters"),a,n))}return i},xt=(e,t,r,a,o,i,l)=>{const c={kind:"fragmentCall",name:r,argumentsMode:"static",path:o,order:l};jt(e,c,i);for(const a in t){const n=t[a];a!==`$${r}`&&"//"!==a&&void 0!==n&&("fallback"===a&&(c.fallback=Ve(e,n,Pe(o,"fallback"),i+1)),"noCache"===a&&Xe(e,c,n,o,l),"vars"===a&&(c.vars=Pt(e,n,o,i,l)))}return n(a)?Ot(e,c,a,Pe(o,`$${r}`),i,l):Ie(e,"error",s.malformedNode,`fragments have no single-value or positional form — '$${r}' takes a named-arguments object`,Pe(o,`$${r}`),l),c},jt=(e,t,r)=>{const{name:a,path:n,order:o}=t;e.fragmentNames.add(a);const i=e.registry.fragments.get(a);if(void 0===i){const t=f(a,e.registry.fragments.keys());return void Ie(e,"error",s.unknownFragment,`'${a}' names no registered fragment${t?` — did you mean '${t}'?`:""}`,n,o,{suggestion:t})}t.entry=i,e.fragmentCalls.push({name:a,depth:r}),e.dataReads.push({kind:"call",fragment:i,path:n})},Ot=(e,t,r,o,i,l)=>{if(void 0!==r){if(m(r,e.recognizes)||"string"==typeof r&&"reference"===a(r).kind)return t.argumentsMode="dynamic",t.parameters=Ve(e,r,o,i+1),void(e.dynamic=!0);if(n(r)){const a={};for(const t in r){const n=r[t];"//"!==t&&void 0!==n&&(a[t]=Ve(e,n,Pe(o,t),i+1))}return void(t.parameters=a)}Ie(e,"error",s.malformedNode,"a fragment's 'parameters' must be a named-arguments object or a node computing one",o,l)}},Pt=(e,t,a,o,i)=>{const l=Pe(a,"vars");if(!n(t))return void Ie(e,"error",s.invalidVars,"a 'vars' block must be an object of name → expression entries",l,i);const c={};for(const a in t){const n=t[a];if("//"===a||void 0===n)continue;const u=Pe(l,a),d=r(a);d.ok?c[a]=Ve(e,n,u,o+1):Ie(e,"error",s.invalidName,`'${a}' is not a legal var name — ${d.reason}`,u,i)}return c},At=(e,t,r,a,n)=>{const{entries:o,vars:s,changed:i}=Nt(e,t,r,a,n);return Ct(e,t,o,!1,i,s,r,n)},Nt=(e,t,r,a,n,o=!1)=>{let i,l=!1;const c=[],u=!o&&Dt(t);u&&e.unknownNodes++;for(const u in t){const d=t[u];if("//"!==u)if("vars"!==u)if(void 0!==d){if(u.startsWith("$")){const t=f(u.slice(1),Mt(e)),a=void 0!==t?` — did you mean '$${t}'?`:o?"":" — data with a '$' key goes inside 'literal'";Ie(e,o?"warning":"error",s.unrecognizedIdentifier,`'${u}' is not a registered operator or fragment${o?", so it is a plain key":""}${a}`,Pe(r,u),n,{suggestion:void 0===t?void 0:`$${t}`})}c.push({key:u,rawChild:d,node:Ve(e,d,Pe(r,u),a+1)})}else l=!0;else i=Pt(e,d,r,a,n),l=!0;else l=!0}return u&&e.unknownNodes--,{entries:c,vars:i,changed:l}},Dt=e=>{for(const t in e)if(t.startsWith("$")&&void 0!==e[t])return!0;return!1},Ct=(e,t,r,a,n,o,i,l)=>{const c=[],u=a?new Array(r.length):{};let d=n;for(const{key:e,rawChild:t,node:a}of r)"constant"!==a.kind?(d=!0,"skeleton"!==a.kind||void 0!==a.vars?c.push({path:a.path,at:[e],node:a}):(ze(u,e,a.skeleton),c.push(...a.holes.map(t=>({...t,at:[e,...t.at]}))))):(ze(u,e,a.value),a.value!==t&&(d=!0));if(0===c.length)return void 0!==o&&Object.keys(o).length>0&&Ie(e,"warning",s.unreferencedVar,"this vars block declares names nothing in its scope references",Pe(i,"vars"),l),We(d||void 0!==o?u:t,i,l);const p={kind:"skeleton",skeleton:u,holes:c,path:i,order:l};return void 0!==o&&(p.vars=o),p},St=(e,t=[])=>{if("skeleton"===e.kind)for(const r of e.holes)St(r.node,t);else if("constant"!==e.kind){const r=zt(e);t.push(void 0===r?{node:e}:{node:e,timeoutFallback:r})}return t},zt=e=>{if("operator"===e.kind||"fragmentCall"===e.kind)return void 0!==e.fallback?Tt(e.fallback):"operator"===e.kind?e.entry.defaultFallback:e.entry?.timeoutFallback},Tt=e=>{if("constant"===e.kind)return{value:e.value};const t=[],r=Et(e,[],t);return void 0===r?void 0:{value:r,reads:t}},Et=(e,t,r)=>{if("reference"===e.kind){if("error"!==e.namespace)return;return r.push({at:t,segments:e.segments}),e.raw}if("skeleton"!==e.kind)return;const a=[];for(const n of e.holes){const e=Et(n.node,[...t,...n.at],r);if(void 0===e)return;a.push(e)}return Te(e.skeleton,e.holes,a)},qt=new WeakMap,Mt=e=>{const t=qt.get(e.registry);if(void 0!==t)return t;const r=[...e.registry.operators.keys(),...e.registry.aliases.keys(),...e.registry.fragments.keys()];return qt.set(e.registry,r),r},Ft=e=>{switch(e.kind){case"operator":return e.entry.definition.returns;case"fragmentCall":return e.entry?.returns??"any";case"skeleton":return Array.isArray(e.skeleton)?"array":"object";case"constant":return Rt(e.value);default:return"any"}},Rt=t=>{if(null===t)return"null";if(Array.isArray(t))return"array";if(e(t))return"object";switch(typeof t){case"string":return"string";case"number":return"number";case"boolean":return"boolean";default:return"any"}},It=/*#__PURE__*/Object.freeze({parsePath:k,resolvePath:j,checkType:U,checkConstraints:K,describeType:I,renderText:le,isTruthy:ae}),Vt=(e,t={})=>{Wt({artifact:e,context:t,varsFrames:[],iteratorFrames:[],fallbackFrames:[]},e.root),Ne(e.issues),e.hasErrors=De(e.issues)},Lt=(e,t,r,a,n,o,s={})=>{const i={severity:t,code:r,message:a,path:Ae(n)};void 0!==s.operator&&(i.operator=s.operator),void 0!==s.fragment&&(i.fragment=s.fragment),void 0!==s.parameter&&(i.parameter=s.parameter),void 0!==s.suggestion&&(i.suggestion=s.suggestion),e.artifact.issues.push({issue:i,order:o})},Wt=(e,t)=>{switch(t.kind){case"constant":case"invalid":return;case"reference":return void or(e,t);case"skeleton":{const r=ur(e,t.vars,t.path);for(const r of t.holes)Wt(e,r.node);return void dr(e,r)}case"fragmentCall":return void ar(e,t);case"elements":for(const r of t.nodes)Wt(e,r);return;case"entries":{const r=ur(e,t.vars,t.path);for(const r in t.entries)Wt(e,t.entries[r]);return void dr(e,r)}case"operator":return void Ut(e,t)}return t},Bt=(e,t,r)=>{const a={referenced:!1};e.fallbackFrames.push(a),Wt(e,r),e.fallbackFrames.pop(),a.referenced&&(t.fallbackReadsError=!0)},Jt=e=>"kind"in e&&"string"==typeof e.kind,Ut=(e,t)=>{const r=ur(e,t.vars,t.path);void 0!==t.fallback&&Bt(e,t,t.fallback);const a=t.entry.definition,n=rr(t);for(const[r,o]of a.resolution.entries){const a=t.params[r];void 0!==a?Gt(e,n,r,o,a,Kt(t,r)):o.required&&Lt(e,"error",s.missingRequired,`'${t.name}' requires '${r}'`,t.path,t.order,{operator:t.name,parameter:r})}nr(e,t);const o=[];for(const r in t.params){const n=t.params[r];"perElement"===a.parameters[r]?.evaluation?o.push([r,n]):Wt(e,n)}if(o.length>0){const r={as:Ce(t),referenced:!1};e.iteratorFrames.push(r);for(const[,t]of o)Wt(e,t);e.iteratorFrames.pop(),r.referenced||Lt(e,"warning",s.deadBinding,`'${t.name}' binds ${null===r.as?"$element / $index":`$${r.as}`} but its 'each' references neither`,t.path,t.order,{operator:t.name})}dr(e,r)},Kt=(e,t)=>{const{definition:r,hostDefaults:a}=e.entry;if(void 0!==r.parameters[t]?.elementNullPolicy)return!1;for(const[n,o]of r.resolution.entries){if(!o.replacesNullAt?.includes(t))continue;const r=e.params[n];if(void 0===r){if(void 0!==a&&Object.hasOwn(a,n)&&null!==a[n])return!0}else if("constant"!==r.kind||null!==r.value)return!0}return!1},Gt=(e,t,r,a,n,o=!1)=>{if("elements"===n.kind){const o=a.constraints?.length;return void(void 0!==o&&n.nodes.length!==o&&Lt(e,"error",s.typeCheck,`'${t.label}.${r}': expected ${o} element${1===o?"":"s"}, received ${n.nodes.length}`,n.path,n.order,{...t.extra,parameter:r}))}if("constant"!==n.kind&&"structural"===a.evaluation&&"as"!==r)return void Lt(e,"error",s.typeCheck,`'${t.label}.${r}' is structural — it requires a literal value`,n.path,n.order,{...t.extra,parameter:r});const i=`'${t.label}.${r}'`,l=Ht(a,n,o);void 0!==l&&Lt(e,"error",l.code,l.code===s.returnsMismatch?`${l.reason} — it can never satisfy ${i}`:`${i}: ${l.reason}`,n.path,n.order,{...t.extra,parameter:r});let c=n;for(;"operator"===c.kind||"fragmentCall"===c.kind;){const n=c.fallback;if(void 0===n)return void("operator"===c.kind&&_t(e,t,r,a,c,o));const l=Ht(a,n,o);void 0!==l&&Lt(e,"warning",s.fallbackMismatch,`this fallback can never satisfy ${i}: ${l.reason}`,n.path,n.order,{...t.extra,parameter:r}),c=n}},_t=(e,t,r,a,n,o)=>{const i=n.entry.defaultFallback;if(void 0===i)return;const l=Qt(a,i,o);void 0!==l&&Lt(e,"warning",s.fallbackMismatch,`'${n.name}' falls back to its operatorDefaults fallback, which can never satisfy '${t.label}.${r}': ${l.reason}`,n.path,n.order,{...t.extra,parameter:r})},Ht=(e,t,r)=>{switch(t.kind){case"constant":return tr(e,t.value,r);case"operator":case"fragmentCall":{if("fragmentCall"===t.kind&&void 0===t.entry)return;const r=Ft(t);if(O(r,e.type))return;const a="operator"===t.kind?`'${t.name}'`:`fragment '${t.name}'`;return{code:s.returnsMismatch,reason:`${a} returns ${JSON.stringify(r)}`}}case"skeleton":return Yt(e,Array.isArray(t.skeleton)?[]:{});case"reference":return"error"===t.namespace?Xt(e,t.segments):void 0;default:return}},Qt=(e,{value:t,reads:r},a)=>void 0===r?tr(e,t,a):0===r[0].at.length?Xt(e,r[0].segments):Yt(e,Array.isArray(t)?[]:{}),Xt=(e,t)=>{const r=er(t);if(void 0!==r&&!O(r,e.type))return Yt(e,Zt[r])},Yt=(e,t)=>{const r=U(t,e.type);if(!r.ok)return{code:s.typeCheck,reason:`expected ${r.expected}, received ${r.actual}`}},Zt={object:{},array:[],string:"",number:0,boolean:!1},er=e=>{const[t,...r]=e;if(void 0===t)return"object";if(r.length>0||!Object.hasOwn(P,t))return;const a=P[t];return"string"==typeof a?a:void 0},tr=(e,t,r)=>{if(null===t&&(r||!e.required&&!W(e.type)))return;const a=U(t,e.type);if(!a.ok)return{code:s.typeCheck,reason:`expected ${a.expected}, received ${a.actual}`};if(void 0===e.constraints)return;const n=X(t,e.constraints,void 0!==e.elementNullPolicy);return n.ok?void 0:{code:s.typeCheck,reason:`expected ${n.expected}, received ${n.actual}`}},rr=e=>({label:e.name,extra:{operator:e.name}}),ar=(e,t)=>{const r=ur(e,t.vars,t.path);void 0!==t.fallback&&Bt(e,t,t.fallback);const a=t.entry?.parameters,n=void 0===t.parameters||Jt(t.parameters)?void 0:t.parameters;if(void 0!==a&&"static"===t.argumentsMode){const r={label:t.name,extra:{fragment:t.name}};for(const o in a){const i=a[o],l=n?.[o];void 0!==l?Gt(e,r,o,i,l):i.required&&Lt(e,"error",s.missingRequired,`fragment '${t.name}' – requires '${o}'`,t.path,t.order,{fragment:t.name,parameter:o})}if(void 0!==n)for(const r in n){const o=n[r];if(void 0===a[r]){const n=f(r,Object.keys(a));Lt(e,"error",s.unknownNodeKey,`fragment '${t.name}' declares no parameter '${r}'${n?` — did you mean '${n}'?`:""}`,o.path,o.order,{parameter:r,suggestion:n})}}}if(void 0!==t.parameters)if(Jt(t.parameters))Wt(e,t.parameters);else for(const r in t.parameters)Wt(e,t.parameters[r]);dr(e,r)},nr=(e,t)=>{const r=t.entry.definition.validate;if(void 0===r)return;const a={};for(const e in t.params){const r=t.params[e];"constant"===r.kind&&(a[e]=r.value)}let n;try{n=r(a,It)}catch(r){return void Lt(e,"error",s.operatorValidate,`'${t.name}' validate hook threw: ${r.message}`,t.path,t.order,{operator:t.name})}for(const r of n){const a=void 0!==r.parameter?t.params[r.parameter]:void 0;Lt(e,r.severity,s.operatorValidate,r.message,a?.path??t.path,t.order,{operator:t.name,...void 0!==r.parameter?{parameter:r.parameter}:{}})}},or=(e,t)=>{const{namespace:r}=t;switch(r){case"data":return;case"vars":return void sr(e,t);case"params":return void ir(e,t);case"element":case"index":return void lr(e,t,r);case"error":return void cr(e,t)}return r},sr=(e,t)=>{const r=t.segments[0],a="string"==typeof r?r:void 0;if(void 0!==a)for(let t=e.varsFrames.length-1;t>=0;t--){const r=e.varsFrames[t],n=r.names.get(a);if(void 0!==n){if(n.referenced=!0,null!==r.currentVar){const e=r.edges.get(r.currentVar)??new Set;e.add(a),r.edges.set(r.currentVar,e)}return}}Lt(e,"error",s.unresolvedVar,`'${t.raw}': no var '${a??""}' is declared in scope`,t.path,t.order)},ir=(e,t)=>{const r=e.context.fragmentParams;if(void 0===r)return void Lt(e,"error",s.unresolvedParam,`'${t.raw}': $params is only available inside a fragment body`,t.path,t.order);if(0===t.segments.length)return;const a=t.segments[0];"string"==typeof a&&r.has(a)||Lt(e,"error",s.unresolvedParam,`'${t.raw}': the fragment declares no parameter '${String(a)}'`,t.path,t.order)},lr=(e,t,r)=>{for(let a=e.iteratorFrames.length-1;a>=0;a--){const n=e.iteratorFrames[a];if(Se(n.as,r,t.binding))return void(n.referenced=!0)}t.scopeUnknown||Lt(e,"error",s.unresolvedBinding,`'${t.raw}' resolves against no enclosing iterator here`,t.path,t.order)},cr=(e,t)=>{const r=e.fallbackFrames.at(-1);void 0===r?t.scopeUnknown||Lt(e,"error",s.unresolvedBinding,`'${t.raw}' is only available inside the fallback of an operator node or fragment call`,t.path,t.order):r.referenced=!0},ur=(e,t,r)=>{if(void 0===t)return null;const a={names:new Map,currentVar:null,edges:new Map},n=Pe(r,"vars");for(const r in t){const o=t[r],i=Pe(n,r);for(const t of e.varsFrames)if(t.names.has(r)){Lt(e,"warning",s.shadowedVar,`'${r}' shadows a var of the same name from an enclosing scope`,i,o.order);break}a.names.set(r,{node:o,declaredAt:i,order:o.order,referenced:!1})}e.varsFrames.push(a);for(const[t,r]of a.names)a.currentVar=t,Wt(e,r.node),a.currentVar=null;return a},dr=(e,t)=>{if(null!==t){e.varsFrames.pop();for(const[r,a]of t.names)a.referenced||Lt(e,"warning",s.unreferencedVar,`'${r}' is declared but never referenced in its scope`,a.declaredAt,a.order);pr(e,t)}},pr=(e,t)=>{const r=new Map([...t.names.keys()].map((e,t)=>[e,t])),a=[],n=new Set,o=new Set,i=new Set,l=c=>{if(!o.has(c))if(n.has(c))(a=>{const n=[...a].sort((e,t)=>r.get(e)-r.get(t)),o=n.join("\0");if(i.has(o))return;i.add(o);const l=n.map(e=>`'${e}'`),c=1===l.length?`${l[0]} depends on itself`:`${l.slice(0,-1).join(", ")} and ${l[l.length-1]} form a vars cycle — a var may not depend on itself`,u=t.names.get(n[0]);Lt(e,"error",s.varCycle,c,u.declaredAt,u.order)})(a.slice(a.indexOf(c)));else{n.add(c),a.push(c);for(const e of t.edges.get(c)??[])l(e);a.pop(),n.delete(c),o.add(c)}};for(const e of t.names.keys())l(e)},fr={capable:!1,effective:!1,disabled:[]},mr={capable:!0,effective:!0,disabled:[]},hr=e=>{const{effective:t}=vr(e,e.root,!1);return Ne(e.issues),t},vr=(e,t,r)=>{switch(t.kind){case"constant":case"reference":return fr;case"invalid":return mr;case"skeleton":return kr(e,[...t.holes.map(e=>e.node),...$r(t.vars)],r);case"elements":return kr(e,t.nodes,r);case"entries":return kr(e,[...Object.values(t.entries),...$r(t.vars)],r);case"operator":return yr(e,t,Br(t.entry),r);case"fragmentCall":return yr(e,t,t.entry?.caches??!0,r)}return t},yr=(e,t,r,a)=>{const n=!0===t.noCache,o=kr(e,wr(t),a||n),s=r||o.capable,i=gr(t),l=void 0===i?o.disabled:[i,...o.disabled];return n&&a?xr(e,t,"'noCache' is redundant — an enclosing node already sets it"):n&&!s&&xr(e,t,l.length>0?`'noCache' is redundant — caching is already disabled for ${br(l)}`:"'noCache' is dead — nothing beneath this node caches"),{capable:s,effective:!n&&(r||o.effective),disabled:l}},gr=e=>"operator"===e.kind&&e.entry.definition.cache&&!Br(e.entry)?e.entry.definition.name:void 0,br=e=>{const t=[...new Set(e)].map(e=>`'${e}'`);return t.length<2?t.join(""):`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`},wr=e=>{const t=[];return"operator"===e.kind?t.push(...Object.values(e.params)):void 0!==e.parameters&&("dynamic"===e.argumentsMode?t.push(e.parameters):t.push(...Object.values(e.parameters))),void 0!==e.fallback&&t.push(e.fallback),t.push(...$r(e.vars)),t},kr=(e,t,r)=>{const a={capable:!1,effective:!1,disabled:[]};for(const n of t){const{capable:t,effective:o,disabled:s}=vr(e,n,r);a.capable||=t,a.effective||=o,a.disabled.push(...s)}return a},$r=e=>void 0===e?[]:Object.values(e),xr=(e,t,r)=>{const a={severity:"warning",code:s.uselessModifier,message:r,path:Ae(Pe(t.path,"noCache"))};"operator"===t.kind?a.operator=t.name:a.fragment=t.name,e.issues.push({issue:a,order:t.order})};class jr{max;entries=new Map;constructor(e){this.max=e,Or(e)}get size(){return this.entries.size}get(e){if(!this.entries.has(e))return;const t=this.entries.get(e);return this.entries.delete(e),this.entries.set(e,t),t}set(e,t){this.entries.delete(e),this.entries.set(e,t),this.entries.size>this.max&&this.evictOldest()}delete(e){this.entries.delete(e)}clear(){this.entries.clear()}resize(e){for(Or(e),this.max=e;this.entries.size>this.max;)this.evictOldest()}evictOldest(){const e=this.entries.keys().next();!0!==e.done&&this.entries.delete(e.value)}}const Or=e=>{if(!Number.isInteger(e)||e<1)throw new RangeError("LRU bound must be a positive integer")},Pr=Symbol("fig-tree:lazy-handle"),Ar="~",Nr=(e,t)=>{if(t>o)return"refused";switch(typeof e){case"boolean":return"json";case"string":return e.length>4096?"serializer":"json";case"number":return Number.isFinite(e)&&!Object.is(e,-0)?"json":"serializer";case"undefined":return"serializer";case"object":break;default:return"refused"}if(null===e)return"json";if(Array.isArray(e)){for(let r=0;r<e.length;r++){const a=Nr(e[r],t+1);if("json"!==a)return a}return"json"}if(!n(e))return"refused";for(const r in e){if(r.length>4096)return"serializer";const a=Nr(e[r],t+1);if("json"!==a)return a}return"json"},Dr=(e,t)=>Cr(e,0,t)?t.join(""):void 0,Cr=(e,t,r)=>{if(t>o)return!1;if(null===e)return zr(r,"n");if(void 0===e)return zr(r,"u");switch(typeof e){case"boolean":return zr(r,e?"t":"f");case"number":return Sr(e,r);case"string":return zr(r,`s${e.length}:${e}`);case"object":break;default:return!1}if(Array.isArray(e)){r.push("[");for(const a of e)if(!Cr(a,t+1,r))return!1;return zr(r,"]")}if(!n(e)||Pr in e)return!1;r.push("{");for(const a in e)if(r.push(`s${a.length}:${a}`),!Cr(e[a],t+1,r))return!1;return zr(r,"}")},Sr=(e,t)=>Number.isNaN(e)?zr(t,"N"):e===1/0?zr(t,"I"):e===-1/0?zr(t,"J"):Object.is(e,-0)?zr(t,"#-0"):zr(t,`#${String(e)}`),zr=(e,t)=>(e.push(t),!0);class Tr{deps;identity=new WeakMap;content=new jr(200);constructor(e){this.deps=e}resolve(e){const t="object"==typeof e&&null!==e?e:void 0;if(void 0!==t){const e=this.identity.get(t);if(void 0!==e)return e}const r=this.deps.probe(e);if(r.constant){const e={kind:"inert",depth:r.depth};return void 0!==t&&this.identity.set(t,e),e}const a=void 0===t?void 0:(e=>{const t=Nr(e,0);return"json"===t?JSON.stringify(e):"serializer"===t?Dr(e,[Ar]):void 0})(e),n=void 0===a?void 0:this.content.get(a),o=n??this.deps.compile(e),s={kind:"artifact",artifact:o};return void 0!==t&&this.identity.set(t,s),void 0!==a&&void 0===n&&!o.identityOnly&&o.holes.length>0&&this.content.set(a,o),s}}const Er=/*#__PURE__*/new Set(["type","required","default","description","metadata","constraints"]),qr=/*#__PURE__*/new Set(["expression","parameters","description","metadata"]),Mr=(t,a,n)=>{const o=(...e)=>["fragments",t,...e],i=r(t);if(!i.ok)return void n(s.invalidName,`'${t}' is not a legal fragment name: ${i.reason}`,o());if(A.has(t))return void n(s.reservedName,`'${t}' is a reserved name and may not name a fragment`,o());if(!e(a))return void n(s.invalidDefinition,`fragment '${t}' must be a wrapper object: { expression, parameters?, description?, metadata? }`,o());if(!("expression"in a))return void n(s.invalidDefinition,`fragment '${t}' has no 'expression'`,o());for(const e of Object.keys(a))qr.has(e)||n(s.invalidDefinition,`'${e}' is not a key of a fragment definition`,o(e));const l={name:t,parameters:{},body:{kind:"constant",value:null,path:null,order:0},returns:"any",warnings:[],nodeCount:0,maxDepth:0,dependencies:{dataPaths:new Map,dynamic:!1,operators:[],fragments:[]},identityOnly:!1,caches:!1};if(void 0!==a.description&&("string"!=typeof a.description?n(s.invalidDefinition,"'description' must be a string",o("description")):l.description=a.description),void 0!==a.metadata&&(e(a.metadata)?l.metadata=a.metadata:n(s.invalidDefinition,"'metadata' must be a plain object",o("metadata"))),void 0!==a.parameters)if(e(a.parameters))for(const[e,t]of Object.entries(a.parameters)){const r=Fr(e,t,o,n);void 0!==r&&(l.parameters[e]=r)}else n(s.invalidDefinition,"'parameters' must be a plain object",o("parameters"));return l},Fr=(t,a,n,o)=>{const i=n("parameters",t),l=r(t);if(!l.ok)return void o(s.invalidName,`'${t}' is not a legal parameter name: ${l.reason}`,i);if(N.has(t))return void o(s.reservedName,`'${t}' is a reserved node key and may not name a parameter`,i);if(!e(a))return void o(s.invalidDefinition,`the declaration of '${t}' must be an object`,i);for(const e of Object.keys(a))Er.has(e)||o(s.invalidDefinition,`'${e}' is not a key of a parameter declaration`,[...i,e]);const c=a.type??"any";if(!J(c))return void o(s.invalidDefinition,`'${t}' declares an unknown type`,[...i,"type"]);if(void 0!==a.required&&"boolean"!=typeof a.required)return void o(s.invalidDefinition,"'required' must be a boolean",[...i,"required"]);let u;if(void 0!==a.constraints){const e=H(a.constraints);if(!e.ok)return void o(s.invalidDefinition,`'${t}' declares invalid constraints: expected ${e.expected}, got ${e.actual}`,[...i,"constraints"]);u=a.constraints}const d="default"in a;if(d&&!0===a.required)return void o(s.invalidDefinition,`'${t}' is declared required and also declares a default — the default could never apply`,[...i,"default"]);if(d){const e=U(a.default,c);if(!e.ok)return void o(s.typeCheck,`the default for '${t}' does not satisfy its declared type: expected ${e.expected}, got ${e.actual}`,[...i,"default"]);if(void 0!==u){const e=K(a.default,u);if(!e.ok)return void o(s.typeCheck,`the default for '${t}' violates its declared constraints: expected ${e.expected}, got ${e.actual}`,[...i,"default"])}}const p={type:c,required:a.required??!d};return d&&(p.default=a.default),"string"==typeof a.description&&(p.description=a.description),e(a.metadata)&&(p.metadata=a.metadata),void 0!==u&&(p.constraints=u),p},Rr=e=>{const t=new Set,r=new Set,a=e=>{if(r.has(e.name)||t.has(e.name))return;t.add(e.name);const n=e.body;"fragmentCall"===n.kind&&void 0!==n.entry&&a(n.entry),e.returns=Ft(n),t.delete(e.name),r.add(e.name)};for(const t of e.fragments.values())a(t)},Ir=(e,t)=>{const r=[],a=new Set,n=new Set,o=i=>{const l=r.indexOf(i);if(-1!==l){const e=[...r.slice(l),i],a=[...e].sort().join("\0");return n.has(a)||t(s.fragmentCycle,`fragment '${i}' reaches itself: ${e.join(" → ")} — recursion is not supported`,["fragments",i]),void n.add(a)}if(!a.has(i)){r.push(i);for(const t of e.get(i)?.fragmentCalls??[])o(t.name);r.pop(),a.add(i)}};for(const t of e.keys())o(t);return 0===n.size},Vr=(e,t)=>{const r=new Set,a=n=>{if(r.has(n))return;r.add(n);const o=e.fragments.get(n),s=t.get(n);if(void 0===o||void 0===s)return;for(const e of s.fragmentCalls)a(e.name);const i=Fe(s.own,s.fragmentCalls,e.fragments);o.nodeCount=i.nodeCount,o.maxDepth=i.maxDepth,o.dependencies=i.dependencies,o.identityOnly=i.identityOnly,o.caches=hr(s),o.timeoutFallback=Lr(n,s,e.fragments)};for(const e of t.keys())a(e)},Lr=(e,t,r)=>{const{root:a,holes:n}=t;if(0===n.length)return;const o=[];for(const e of n){const t=Wr(e,r);if(void 0===t)return;o.push(t)}const s=[];let i=0;const l=(t,r)=>{if("skeleton"===t.kind)return Te(t.skeleton,t.holes,t.holes.map(e=>l(e.node,[...r,...e.at])));const{value:a,reads:n=[]}=o[i++],c={..."operator"===t.kind?{operator:t.name}:{},fragment:e,fragmentPath:Ae(t.path)};for(const e of n)s.push({...e,at:[...r,...e.at],within:e.within??c});return a},c=l(a,[]);return 0===s.length?{value:c}:{value:c,reads:s}},Wr=(e,t)=>{if(void 0!==e.timeoutFallback)return e.timeoutFallback;const{node:r}=e;return"fragmentCall"===r.kind&&void 0===r.fallback?t.get(r.name)?.timeoutFallback:void 0},Br=e=>e.definition.cache&&!0!==e.hostDefaults?.noCache,Jr=["fallback","noCache"],Ur=t=>{const r=[],a=(e,t,a,n)=>{r.push({severity:"error",code:e,message:t,path:a,...void 0!==n?{operator:n}:{}})},n={operators:new Map,aliases:new Map,fragments:new Map},{operators:o,aliases:i}=n,l=new Map,c=(e,t,r)=>{const n=l.get(e);return void 0!==n?(a(s.duplicateOperator,`'${e}' is already registered (by '${n}') — one namespace, no silent precedence`,t,r),!1):(l.set(e,r),!0)},u=(e,t)=>{if("function"==typeof e)return void a(s.invalidOptions,`operators[${t[1]}]${t.length>2?`[${t[2]}]`:""} is a function — factories must be called: httpOperators(client)`,t);if(!te(e))return void a(s.invalidOptions,"every operators entry must be built with defineOperator() — a plain definition object is not accepted",t);const{name:r,alias:n}=e,l=c(r,t,r),u=void 0===n||c(n,t,r);l&&u&&(o.set(r,{definition:e}),void 0!==n&&i.set(n,r))};return Array.isArray(t.operators)?t.operators.forEach((e,t)=>{Array.isArray(e)?e.forEach((e,r)=>{Array.isArray(e)?a(s.invalidOptions,"'operators' is flattened one level only — arrays may not nest deeper",["operators",t,r]):u(e,["operators",t,r])}):u(e,["operators",t])}):a(s.invalidOptions,"'operators' must be an array",["operators"]),void 0!==t.operatorDefaults&&Kr(t.operatorDefaults,o,i,a),((t,r,a,n)=>{if(void 0===t)return;if(!e(t))return void n(s.invalidOptions,"'fragments' must be a plain object",["fragments"]);for(const[e,o]of Object.entries(t)){const t=Mr(e,o,n);void 0!==t&&a(e,["fragments",e])&&r.fragments.set(e,t)}const o=new Map;for(const[e,a]of r.fragments){const n=t[e],s=Me(n.expression,r,{basePath:["expression"]});a.body=s.root,o.set(e,s)}Rr(r);for(const[e,t]of r.fragments){const r=o.get(e);Vt(r,{fragmentParams:new Set(Object.keys(t.parameters))});for(const{issue:t}of r.issues)"error"===t.severity&&n(t.code,`fragment '${e}': ${t.message}`,["fragments",e,...t.path])}Ir(o,n)&&Vr(r,o);for(const[e,t]of r.fragments)for(const{issue:r}of o.get(e).issues)if("error"!==r.severity){const e={...r,path:[...r.path]};Object.freeze(e.path),t.warnings.push(Object.freeze(e))}})(t.fragments,n,(e,t)=>c(e,t,e),a),r.length>0&&(e=>{const[t]=e,r=e.length-1,a=r>0?`${t.message} (+ ${r} more issue${1===r?"":"s"})`:t.message;throw new D({code:s.invalidOptions,message:a,path:t.path,...void 0!==t.operator?{operator:t.operator}:{},issues:e})})(r),n},Kr=(t,r,a,n)=>{if(e(t))for(const[o,i]of Object.entries(t)){const t=["operatorDefaults",o],l=r.get(o);if(void 0===l){const e=a.get(o);void 0!==e?n(s.invalidOptions,`'operatorDefaults' keys are canonical names — use '${e}', not its alias '${o}'`,t,e):n(s.unknownOperator,`'${o}' names no registered operator`,t);continue}if(!e(i)){n(s.invalidOptions,`the defaults for '${o}' must be a plain object`,t,o);continue}let c,u=!0;for(const[e,r]of Object.entries(i)){const a=[...t,e];if(Jr.includes(e)){"fallback"===e&&(c=je(r),void 0===c&&(n(s.invalidOptions,`the default fallback for '${o}' must be static, built only from literals and $error reads — it is never evaluated`,a,o),u=!1)),"noCache"===e&&(!0!==r?(n(s.invalidOptions,"the 'noCache' modifier takes only the literal true",a,o),u=!1):l.definition.cache||(n(s.invalidOptions,`'noCache' on '${o}', which never caches — its definition does not declare 'cache: true'`,a,o),u=!1));continue}const i=l.definition.parameters[e];if(void 0===i){n(s.invalidOptions,`'${e}' names no declared parameter of '${o}' (nor 'fallback'/'noCache')`,a,o),u=!1;continue}if(i.required){n(s.invalidOptions,`'${e}' is a required parameter of '${o}' — operatorDefaults may only target optional parameters`,a,o),u=!1;continue}const d=U(r,i.type);if(d.ok){if(void 0!==i.constraints){const t=K(r,i.constraints);t.ok||(n(s.typeCheck,`the default for '${o}.${e}' violates its declared constraints: expected ${t.expected}, got ${t.actual}`,a,o),u=!1)}}else n(s.typeCheck,`the default for '${o}.${e}' does not satisfy its declared type: expected ${d.expected}, got ${d.actual}`,a,o),u=!1}u&&(l.hostDefaults=Object.freeze({...i}),void 0!==c&&(l.defaultFallback=c))}else n(s.invalidOptions,"'operatorDefaults' must be a plain object",["operatorDefaults"])},Gr=(e,t)=>{const r=e.operators.get(t);if(void 0!==r)return r;const a=e.aliases.get(t);return void 0!==a?e.operators.get(a):void 0},_r="fig-tree:scope-settled",Hr="fig-tree:request-expired",Qr="fig-tree:evaluation-timeout";class Xr{parent;controller;upstream;forward;settled=!1;verified=-1;clock;constructor(e){this.parent=e,this.clock=void 0===e?{epoch:0}:e.clock}get aborted(){return void 0!==this.controller?this.controller.signal.aborted:!!this.settled||this.verified!==this.clock.epoch&&(!(void 0===this.parent||!this.parent.aborted)||(this.verified=this.clock.epoch,!1))}get reason(){return void 0!==this.controller?this.controller.signal.reason:this.settled?_r:this.parent?.reason}get signal(){if(void 0===this.controller){const e=new AbortController;if(this.controller=e,this.settled)e.abort(_r);else if(void 0!==this.parent){const t=this.parent.signal;t.aborted?e.abort(t.reason):(this.upstream=t,this.forward=()=>e.abort(t.reason),t.addEventListener("abort",this.forward,{once:!0}))}}return this.controller.signal}settle(){this.settled||(this.settled=!0,this.clock.epoch+=1,void 0!==this.controller&&(void 0!==this.upstream&&void 0!==this.forward&&this.upstream.removeEventListener("abort",this.forward),this.controller.abort(_r)))}}const Yr=(e,t)=>({get aborted(){return e.aborted},get reason(){return e.reason},signal:e,clock:t.clock,settle:C}),Zr=(e,t,r)=>{const a=void 0===e?(()=>{const e=new AbortController;return{signal:e.signal,abort:t=>e.abort(t),settle:()=>e.abort(_r)}})():(e=>{const t=new AbortController;e.aborted&&t.abort(e.reason);const r=()=>t.abort(e.reason);return e.addEventListener("abort",r,{once:!0}),{signal:t.signal,abort:e=>t.abort(e),settle:()=>{e.removeEventListener("abort",r),t.abort(_r)}}})(e),{signal:n}=a;let o;const s=new Promise((e,t)=>{o=t});s.catch(C);const i=()=>o(n.reason);n.aborted?i():n.addEventListener("abort",i,{once:!0});const l=void 0===t?void 0:setTimeout(()=>a.abort(r),Math.min(t,2147483647));return{signal:n,expiry:s,settle:()=>{void 0!==l&&clearTimeout(l),n.removeEventListener("abort",i),a.settle()}}},ea=(e,t)=>Zr(e,t,Hr),ta=(e,t)=>(r,a)=>{const n=(o=[e.operator,e.fingerprint,r],Dr(o,[]));var o;return void 0===n?a():(async(e,t,r,a)=>{const n=e.generation,o=await e.lookup(t);if(a?.({type:"cache",hit:o.hit}),o.hit)return o.value;const s=await r();return await e.write(t,s,n),s})(t,n,a,e.note)},ra=/*#__PURE__*/Object.freeze({}),aa=(e,t)=>!0!==t||!0===e.noCache?e:{...e,noCache:t};class na{options;cache;trace;#e;constructor(e,t,r,a){this.options=t,this.cache=r,this.trace=a,this.#e=e}get signal(){return this.#e.signal}}const oa={memo:(e,t)=>t()},sa={note:C},ia=Symbol("fig-tree:internal-error"),la=e=>ya(`[fig-tree internal] ${e}`,ia),ca=e=>ba(e,ia),ua=Symbol("fig-tree:cancelled"),da=()=>ya("[fig-tree] evaluation cancelled",ua),pa=e=>ba(e,ua),fa=(e,t,r)=>e.rootScope.aborted?ma(e.rootScope.reason,t,r):e.abortScope.aborted?da():void 0,ma=(e,t,r)=>e===_r?da():ha(e,Ae(t),{operator:r}),ha=(e,t,r={})=>{const{operator:a,ms:n}=r,o=e===Qr,i=void 0===n?"":`${n}ms `;return new D({code:o?s.timeout:s.aborted,message:o?`evaluation exceeded its ${i}timeout`:"evaluation was aborted by the caller",path:t,...void 0!==a?{operator:a}:{}})},va=e=>ca(e)||pa(e)||(e=>S(e)&&(e.code===s.aborted||e.code===s.timeout))(e),ya=(e,t)=>{const r=new Error(e);return ga(r,t),r},ga=(e,t)=>{e[t]=!0},ba=(e,t)=>e instanceof Error&&!0===e[t],wa=()=>performance.now(),ka=e=>{const t=new Map,r=new WeakMap,a=new WeakSet;let n;const o=(e,r,n)=>{const o=t.get(e);if(void 0===o)return;t.delete(e),a.has(e)||("fallback"!==e.status&&(e.status=r),void 0!==n.error&&void 0===e.error&&(e.error=n.error),"failed"!==r&&"cancelled"!==r&&(e.value=n.value),void 0!==n.elapsed&&(e.elapsed=n.elapsed));const s=[...o.children,...$a(o)];s.length>0&&(e.children=s.sort((e,t)=>e.order-t.order||e.index-t.index).map(e=>e.entry))},s=(e,t)=>{(e.events??=[]).push(t)},i=(e,a,o,s)=>{const i=Da(e),l=Ca(e),c={path:Ae(e.path),kind:Aa(e),status:"value",...void 0!==o?{source:o}:{},...void 0!==i?{operator:i}:{},...void 0!==l?{ref:l}:{},...void 0!==s?.var?{var:s.var}:{}};return t.set(c,{node:e,children:[],seen:new Set,started:wa()}),r.set(e,c),((e,r,a)=>{if(void 0===e)return void(n=r.entry);const o=t.get(e);void 0!==o&&(o.children.push(r),o.seen.add(a))})(a,{entry:c,order:e.order,index:s?.index??0},e),c};return{enter:(e,t,r,a)=>i(e,t,void 0!==r?{fragment:r.fragment}:void 0,a),settle:o,markFallback:(e,t)=>{e.status="fallback",e.error=t},note:s,markShielded:(e,n,l)=>{const c=r.get(e),u=void 0===c?void 0:t.get(c);if(void 0===c||void 0===u)return;a.add(c),c.status="fallback",c.error=n,c.value=l,c.elapsed=wa()-u.started,s(c,{type:"shielded-fallback"});const d=Na(e);void 0!==d&&o(i(d,c,c.source,void 0),"value",{value:l})},finish:()=>{for(const e of[...t.keys()].reverse())o(e,"cancelled",{});return void 0!==n&&e.length>0&&(n.warnings=e),n}}},$a=e=>xa(e.node).filter(t=>!e.seen.has(t)).map(e=>({entry:{path:Ae(e.path),kind:Aa(e),status:"skipped"},order:e.order,index:0})),xa=e=>{switch(e.kind){case"operator":return[...Object.values(e.params).flatMap(ja),...void 0!==e.fallback?[e.fallback]:[],...Object.values(e.vars??{})];case"fragmentCall":return[...Oa(e.parameters),...void 0!==e.fallback?[e.fallback]:[],...Object.values(e.vars??{}),...void 0!==e.entry?[e.entry.body]:[]];case"skeleton":return[...e.holes.map(e=>e.node),...Object.values(e.vars??{})];case"elements":return e.nodes;case"entries":return Object.values(e.entries);default:return[]}},ja=e=>"elements"===e.kind||"entries"===e.kind?xa(e):[e],Oa=e=>void 0===e?[]:Pa(e)?[e]:Object.values(e),Pa=e=>"string"==typeof e.kind,Aa=e=>{switch(e.kind){case"operator":return"operator";case"fragmentCall":return"fragment";case"reference":return"reference";case"skeleton":return"skeleton";default:return"literal"}},Na=e=>"operator"===e.kind||"fragmentCall"===e.kind?e.fallback:void 0,Da=e=>"operator"===e.kind||"fragmentCall"===e.kind?e.name:void 0,Ca=e=>"reference"===e.kind?e.raw:void 0,Sa=async(e,t,r,a,n)=>{let o;try{o=await e()}catch(e){if(va(e))throw e;if(!r){const r=a(e);throw S(r)&&r!==t&&void 0===r.cause&&(r.cause=t),r}o=null}return void 0!==n.trace&&void 0!==n.traceParent&&S(t)&&n.trace.markFallback(n.traceParent,t),o},za=(e,t)=>{if(void 0===t)return e;const r={parent:e.scope,vars:new Map},a={...e,scope:r};for(const[e,n]of Object.entries(t))r.vars.set(e,z(()=>On(n,a,{var:e})));return a},Ta=async(e,t,r,a,n)=>{const o={...r,params:"dynamic"===e.argumentsMode?await qa(e,t,a):Ea(e,t,a),frame:n};delete o.scope,delete o.bindings,delete o.caught;const s=await On(t.body,o);return void 0===s?null:s},Ea=(e,t,r)=>{const a=e.parameters??{},n=new Map;for(const[o,s]of Object.entries(t.parameters)){const t=a[o],i=z(async()=>{if(void 0===t)return Ma(e,o,s,r);let a;try{a=await On(t,r)}catch(e){throw La(e,r.frame)}return Fa(e,o,s,a,t.path,r)});n.set(o,()=>{const e=i();return e.catch(C),e})}return n},qa=async(t,r,a)=>{const n=t.parameters;let o;try{o=await On(n,a)}catch(e){throw La(e,a.frame)}if(!e(o))throw La(Ra(t,s.typeCheck,`'parameters' must evaluate to an object, received ${Ia(o)}`,n.path),a.frame);const i=new Map;for(const[e,s]of Object.entries(r.parameters)){const r=Object.hasOwn(o,e)?Fa(t,e,s,o[e],n.path,a):Ma(t,e,s,a,n.path);i.set(e,()=>Promise.resolve(r))}return i},Ma=(e,t,r,a,n=e.path)=>{if(!r.required)return r.default??null;throw La(Ra(e,s.missingRequired,`requires '${t}'`,n),a.frame)},Fa=(e,t,r,a,n,o)=>{const i=void 0===a?null:a;if(null===i&&!r.required&&!W(r.type))return r.default??null;const l=U(i,r.type);if(!l.ok)throw La(Ra(e,s.typeCheck,`parameter '${t}': expected ${l.expected}, received ${l.actual}`,n),o.frame);if(void 0!==r.constraints){const a=K(i,r.constraints);if(!a.ok)throw La(Ra(e,s.typeCheck,`parameter '${t}': expected ${a.expected}, received ${a.actual}`,n),o.frame)}return i},Ra=(e,t,r,a)=>new D({code:t,message:`fragment '${e.name}' – ${r}`,path:Ae(a)}),Ia=e=>null===e?"null":Array.isArray(e)?"array":typeof e,Va=Symbol("fig-tree:anchored"),La=(e,t)=>!S(e)||ba(e,Va)?e:(ga(e,Va),void 0===t?e:Object.assign(e,Wa(e,t))),Wa=(e,t)=>({fragment:t.fragment,fragmentPath:e.path,path:Ae(t.callPath)}),Ba=(e,t)=>{const r=void 0===t||ba(e,Va)?e:Wa(e,t),a={code:e.code,message:e.message,path:r.path};return void 0!==e.operator&&(a.operator=e.operator),void 0!==r.fragment&&(a.fragment=r.fragment),void 0!==r.fragmentPath&&(a.fragmentPath=r.fragmentPath),void 0!==e.errorData&&(a.errorData=e.errorData),a};class Ja extends Error{code;errorData;constructor(e,t={}){super(e),this.name="OperatorFailure",void 0!==t.code&&(this.code=t.code),void 0!==t.errorData&&(this.errorData=t.errorData)}}const Ua=e=>e instanceof Ja,Ka=(e,t,r)=>_a(Array.from({length:e},(e,a)=>Ga(a,()=>t(a),r)),e),Ga=async(e,t,r)=>{try{return{index:e,ok:!0,value:r(await t())}}catch(t){return{index:e,ok:!1,error:t}}},_a=(e,t)=>{const r=new Map(e.map((e,t)=>[t,e]));return{[Pr]:!0,length:t,async*[Symbol.asyncIterator](){for(;r.size>0;){const e=await Promise.race(r.values());r.delete(e.index),yield e}}}},Ha=e=>({[Pr]:!0,evaluate:z(e)}),Qa=e=>({[Pr]:!0,evaluate:()=>Promise.resolve(e)}),Xa=(e,t,r,a,n)=>Ha(async()=>Ya(await On(e,n),t,r,a)),Ya=(e,t,r,a)=>{const n=U(e,a.type);if(!n.ok)throw an(t,r,n);if(null!==e&&void 0!==a.constraints){const n=X(e,a.constraints,void 0!==a.elementNullPolicy);if(!n.ok)throw an(t,r,n)}return a.truthiness?ln(e,a.type):e},Za=(e,t,r,a,n,o)=>{const s=Array.isArray(t)?t:[],i=Ce(r),l=new Map,c=t=>{const c=l.get(t);if(void 0!==c)return c;const u=(async()=>Ya(await On(e,((e,t,r,a)=>({...e,bindings:{parent:e.bindings,as:t,element:r,index:a}}))(o,i,s[t],t),{index:t}),r,a,n))();return u.catch(C),l.set(t,u),u};return{[Pr]:!0,evaluate:c,settle:()=>Ka(s.length,c,e=>e)}},en=(e,t)=>t.truthiness?ae(e):e,tn=(e,t,r)=>{if("lazyElements"===t.evaluation&&"elements"===e.kind)return e.nodes.map((e,a)=>Ha(async()=>en(await On(e,r,{index:a}),t)));if("race"===t.evaluation&&"elements"===e.kind)return((e,t,r)=>Ka(e.length,r=>On(e[r],t,{index:r}),r))(e.nodes,r,e=>en(e,t));if("lazyEntries"===t.evaluation&&"entries"===e.kind){const a=za(r,e.vars),n={};for(const[r,o]of Object.entries(e.entries))n[r]=Ha(async()=>en(await On(o,a),t));return n}},rn=(e,t)=>{switch(t.evaluation){case"lazyElements":return e.map(e=>Qa(en(e,t)));case"race":return((e,t)=>Ka(e.length,t=>Promise.resolve(e[t]),t))(e,e=>en(e,t));case"lazyEntries":{const r={};for(const[a,n]of Object.entries(e))r[a]=Qa(en(n,t));return r}case"lazy":return Qa(e);default:return e}},an=(e,t,r)=>new D({code:s.typeCheck,message:`${e.name} – parameter '${t}': expected ${r.expected}, received ${r.actual}`,path:Ae(e.path),operator:e.name}),nn=(e,t,r)=>{if("string"==typeof t.nullPolicy)return t.nullPolicy;const a=t.nullPolicy,n=e.entry.definition.parameters[a.selector],o=r[a.selector],s=U(o,n.type);if(!s.ok)throw an(e,a.selector,s);const i=a.table.find(e=>e.value===o);if(void 0===i)throw la(`no null-policy row for ${e.name}.${a.selector}`);return i.policy},on=async(t,r,a)=>{if(void 0!==r.elementNullPolicy){if(Array.isArray(t)&&t.includes(null)){const e=await a();return t.map(t=>null===t?e:t)}if(e(t)&&Object.values(t).includes(null)){const e=await a(),r={};for(const[a,n]of Object.entries(t))r[a]=null===n?e:n;return r}return t}return null===t?a():t},sn=t=>Array.isArray(t)?t.includes(null):!!e(t)&&Object.values(t).includes(null),ln=(t,r)=>{if((e=>!("object"==typeof e&&!Array.isArray(e))&&(Array.isArray(e)?e:[e]).every(e=>"array"===e||"object"===e))(r)){if(Array.isArray(t))return t.map(ae);if(e(t)){const e={};for(const[r,a]of Object.entries(t))e[r]=ae(a);return e}}return ae(t)},cn=(e,t)=>0===e.segments.length?t.data:vn(t.data,e.segments,e,t,"is absent from the evaluation data"),un=async(e,t)=>{const[r,...a]=e.segments,n="string"==typeof r?((e,t)=>{for(let r=e;void 0!==r;r=r.parent){const e=r.vars.get(t);if(void 0!==e)return e}})(t.scope,r):void 0;if("string"!=typeof r||void 0===n)throw la(`'${e.raw}': no var named '${String(r)}' is in scope — the static gate should have refused it`);const o=await n();return 0===a.length?yn(o):vn(o,a,e,t,`is absent from the value of '$vars.${r}'`)},dn=async(e,t)=>{const r=t.params;if(void 0===r)throw la(`'${e.raw}': $params outside a fragment body — the static gate should have refused it`);const[a,...n]=e.segments;if(void 0===a){const e={};return await Promise.all([...r].map(async([t,r])=>{e[t]=yn(await r())})),e}const o="string"==typeof a?r.get(a):void 0;if(void 0===o)throw la(`'${e.raw}': the fragment declares no parameter '${String(a)}' — the static gate should have refused it`);const s=await o();return 0===n.length?yn(s):vn(s,n,e,t,`is absent from the value of '$params.${String(a)}'`)},pn=(e,t)=>{const r=e.namespace,a=((e,t,r)=>{for(let a=e;void 0!==a;a=a.parent)if(Se(a.as,t,r))return a})(t.bindings,r,e.binding);if(void 0===a)throw la(`'${e.raw}': no enclosing iterator binds it — the static gate should have refused it`);return"index"===r?a.index:0===e.segments.length?yn(a.element):vn(a.element,e.segments,e,t,`is absent from '${e.raw.split(".")[0]}'`)},fn=(e,t)=>{if(void 0===t.caught)throw la(`'${e.raw}': no enclosing fallback caught a failure — the static gate should have refused it`);return mn(Ba(t.caught,t.frame),e.segments)},mn=(e,t)=>{if(0===t.length)return e;const r=j(e,t);return r.found?yn(r.value):null},hn=(e,t,r)=>{const{value:a,reads:n}=e;if(void 0===n)return a;const o=Ba(t,r),s=n.map(({segments:e,within:t})=>mn(void 0===t?o:{...o,...t},e));return 0===n[0].at.length?s[0]:Te(a,n,s)},vn=(e,t,r,a,n)=>{const o=j(e,t);if(o.found)return yn(o.value);if(!a.strictDataPaths)return null;throw new D({code:s.missingDataPath,message:`'${r.raw}' ${n} (strictDataPaths)`,path:Ae(r.path)})},yn=e=>void 0===e?null:e,gn=async(e,t)=>{const{params:r,propagate:a}=await(async(e,t)=>{const{definition:r,hostDefaults:a}=e.entry,{entries:n,whole:o,perElement:s}=r.resolution,i=[],l=[],c={};let u;const d={};for(const[r,o]of n){const n=e.params[r];switch(o.evaluation){case"eager":void 0!==n&&(i.push(r),l.push(On(n,t)));break;case"structural":"constant"===n?.kind&&(c[r]=n.value);break;case"lazy":if(void 0!==o.replacesNullAt){const e=void 0!==n?z(()=>On(n,t)):void 0!==a&&Object.hasOwn(a,r)?z(()=>a[r]):void 0;if(void 0!==e)for(const t of o.replacesNullAt)(u??={})[t]=e;break}void 0!==n&&(d[r]=Xa(n,e,r,o,t));break;case"lazyElements":case"lazyEntries":case"race":{if(void 0===n)break;const e=tn(n,o,t);if(void 0!==e){d[r]=e;break}i.push(r),l.push(On(n,t));break}case"perElement":break;default:o.evaluation}}if(l.length>0)if(1===l.length){const e=l[0];c[i[0]]=T(e)?await e:e}else{const e=await Promise.all(l);i.forEach((t,r)=>{c[t]=e[r]})}for(const[e,r]of o){if(Object.hasOwn(d,e))continue;const n=c[e];(void 0===n||null===n&&!r.required&&!W(r.type))&&(void 0!==a&&Object.hasOwn(a,e)?c[e]=a[e]:"default"in r?c[e]=r.default===Z?t.data:r.default:delete c[e])}for(const[t,r]of o){if(Object.hasOwn(d,t))continue;let a=c[t];if(void 0===a)continue;const n=u?.[t];void 0!==n&&(a=await on(a,r,n));const o="eager"!==r.evaluation&&"structural"!==r.evaluation;if(null===a&&W(r.type)&&!o&&"propagate"===nn(e,r,c))return{params:d,propagate:!0};if("propagate"===r.elementNullPolicy&&sn(a))return{params:d,propagate:!0};a=Ya(a,e,t,r),d[t]=rn(a,r)}for(const[r,a]of s){if(void 0===a.over)throw la(`parameter '${r}' of '${e.name}' declares perElement without 'over'`);const n=e.params[r];void 0!==n&&(d[r]=Za(n,d[a.over],e,r,a,t))}return{params:d,propagate:!1}})(e,t);if(a)return null;const{definition:n}=e.entry,o=!0!==t.noCache&&Br(e.entry),s=wn(n,r),i=void 0===s?void 0:ea(t.abortScope.signal,s),l=void 0===i?t:{...t,abortScope:Yr(i.signal,t.abortScope)},c=(e=>{const{trace:t,traceParent:r}=e;if(void 0!==t&&void 0!==r)return e=>{t.note(r,e)}})(t),u=((e,t,r,a)=>new na(e.abortScope,e.options,r?{memo:ta({operator:t.name,fingerprint:t.fingerprint,note:a},e.cache)}:oa,void 0===a?sa:{note:a}))(l,n,o,c);try{return await bn(e,t,r,u,i)}catch(r){throw kn(r,e,t,i,s)}finally{i?.settle()}},bn=async(e,t,r,a,n)=>{const o=fa(t,e.path,e.name);if(void 0!==o)throw o;const s=Promise.resolve(e.entry.definition.evaluate(r,a));return void 0===n?xn(await s,e):(s.catch(C),xn(await Promise.race([s,n.expiry]),e))},wn=(e,t)=>{const r=e.timeoutParam;if(null===r)return;const a=t[r];return"number"==typeof a&&a>0?a:void 0},kn=(e,t,r,a,n)=>{if(ca(e)||pa(e))return e;const o=fa(r,t.path,t.name);return void 0!==o?o:a?.signal.reason===Hr?new Ja(`request exceeded its ${String(n)}ms timeout`,{code:s.requestTimeout}):e},$n=(e,t,r)=>{const a=e.fallback;if(void 0!==a)return()=>On(a,{...t,caught:r});const n=e.entry.defaultFallback;return void 0!==n?()=>hn(n,r,t.frame):void 0},xn=(e,t)=>{if(void 0===e)return null;if("number"==typeof e&&!Number.isFinite(e))throw new D({code:s.nonFiniteResult,message:`${t.name} – produced a non-finite number (${String(e)})`,path:Ae(t.path),operator:t.name});if("object"==typeof(r=e)&&null!==r&&!0===r[Pr])throw new D({code:s.escapedHandle,message:`${t.name} – returned a lazy handle instead of evaluating it`,path:Ae(t.path),operator:t.name});var r;return e},jn=(e,t)=>{if(S(e))return e;if(Ua(e))return new D({code:e.code??s.operatorFailure,message:`${t.name} – ${e.message}`,path:Ae(t.path),operator:t.name,...void 0!==e.errorData?{errorData:e.errorData}:{}});const r=e instanceof Error?e.message:String(e);return new D({code:s.operatorFailure,message:`${t.name} – ${r}`,path:Ae(t.path),operator:t.name})},On=(e,t,r)=>void 0!==t.trace?Pn(e,t,t.trace,r):t.abortScope.aborted?Promise.reject(fa(t,e.path)):An(e,t),Pn=async(e,t,r,a)=>{const n=r.enter(e,t.traceParent,t.frame,a),o=wa();try{if(t.abortScope.aborted)throw fa(t,e.path);const a=await An(e,{...t,traceParent:n});return r.settle(n,"value",{value:a,elapsed:wa()-o}),a}catch(e){throw r.settle(n,pa(e)?"cancelled":"failed",{...S(e)?{error:e}:{},elapsed:wa()-o}),e}},An=(e,t)=>{try{switch(e.kind){case"constant":return e.value;case"reference":return((e,t)=>{switch(e.namespace){case"data":return cn(e,t);case"vars":return un(e,t);case"params":return dn(e,t);case"element":case"index":return pn(e,t);case"error":return fn(e,t)}})(e,t);case"skeleton":return Nn(e,t);case"operator":return(async(e,t)=>{const r=za(aa(t,e.noCache),e.vars),a=e.entry.definition.deliversLazily?new Xr(r.abortScope):void 0,n=void 0===a?r:{...r,abortScope:a};try{try{return await gn(e,n)}finally{a?.settle()}}catch(a){if(va(a))throw a;const n=jn(a,e),o=$n(e,r,n);if(void 0===o)throw n;return Sa(o,n,e.fallbackReadsError,t=>jn(t,e),t)}})(e,t);case"fragmentCall":return(async(e,t)=>{const{entry:r}=e;if(void 0===r)throw la(`fragment call '${e.name}' resolved to nothing — the static gate should have refused it`);const a=za(aa(t,e.noCache),e.vars),n=new Xr(a.abortScope),o={fragment:e.name,callPath:t.frame?.callPath??e.path},s={...a,abortScope:n};try{try{return await Ta(e,r,s,a,o)}finally{n.settle()}}catch(r){if(va(r))throw r;const n=La(r,o),{fallback:s}=e;if(void 0===s)throw n;const i=S(n)?{...a,caught:n}:a;return Sa(()=>On(s,i),n,e.fallbackReadsError,e=>La(e,t.frame),t)}})(e,t);case"elements":case"entries":throw la(`a '${e.kind}' parameter value reached the node dispatch — parameter resolution consumes these, and nothing else may hold one`);case"invalid":throw la("an invalid node reached evaluation — the static gate should have refused it")}}catch(e){return Promise.reject(e)}},Nn=async(e,t)=>{const r=t.rootBoundary,a=void 0===r?t:{...t,rootBoundary:void 0},n=za(a,e.vars),o=e.holes.map(({node:e})=>void 0===r?On(e,n):"skeleton"===e.kind?On(e,{...n,rootBoundary:r}):r(()=>On(e,n),e)),s=o.some(T)?await Promise.all(o):o;return Te(e.skeleton,e.holes,s)},Dn=async(e,t,r)=>{const{timeout:a,signal:n}=t,o=e.holes.length>0,s=void 0!==a||void 0!==n?Zr(n,a,Qr):void 0,i=void 0!==s?((e,t)=>{const r={epoch:0};return e.addEventListener("abort",()=>{r.epoch+=1},{once:!0}),{get aborted(){return e.aborted},get reason(){return e.reason},signal:e,clock:r,settle:t}})(s.signal,s.settle):new Xr(void 0),l=void 0!==s&&void 0!==a&&e.timeoutShielded&&o,c=!0===t.trace?ka(e.issues.map(e=>e.issue).filter(e=>"error"!==e.severity)):void 0,u=((e,t,r,a)=>({options:e,data:e.data??ra,abortScope:r,rootScope:r,cache:t,strictDataPaths:e.strictDataPaths??!1,...void 0!==a?{trace:a}:{}}))(t,r,i,c),d=l?Sn(e,s.expiry,a,c):void 0,p=void 0!==d&&"skeleton"!==e.root.kind,f=void 0===d||p?u:{...u,rootBoundary:d};try{if(i.aborted)throw ha(i.reason,[]);const t=()=>p&&void 0!==d?d(()=>On(e.root,f),e.root):On(e.root,f),r=await(l||void 0===s?t():Cn(t,s,a));return void 0!==c?{result:r,trace:c.finish()}:{result:r}}catch(e){throw void 0!==c&&S(e)&&void 0===e.trace&&(e.trace=c.finish()),e}finally{i.settle()}},Cn=(e,t,r)=>Promise.race([e(),t.expiry.catch(e=>{throw ha(e,[],{ms:r})})]),Sn=(e,t,r,a)=>{const n=new Map(e.holes.map(e=>[e.node,e]));return(e,o)=>{const s=n.get(o);if(void 0===s)throw la(`the hole boundary was handed the node at ${JSON.stringify(Ae(o.path))}, which is not one of the artifact's holes`);let i=!1;const l=Promise.resolve(e()).then(e=>(i=!0,e));return Promise.race([l,t.catch(e=>{if(e!==Qr)throw ha(e,[]);if(i)return;const t=zn(s,e,r),n=Tn(s,t);return a?.markShielded(s.node,t,n),n})])}},zn=(e,t,r)=>{const{node:a}=e,n="operator"===a.kind?a.name:void 0;return ha(t,Ae(a.path),{operator:n,ms:r})},Tn=(e,t)=>{if(void 0===e.timeoutFallback)throw la("a shielded artifact has a hole with no static fallback");return hn(e.timeoutFallback,t,void 0)},En={hit:!1},qn=e=>{if(void 0===e)return{maxSize:50,maxTime:1800};if(!n(e))throw Fn("'cache' must be an object");const{store:t,maxSize:r,maxTime:a}=e;if(void 0!==t&&!Mn(t))throw Fn("'cache.store' must provide get, set, delete and clear methods");if(void 0!==r&&(!Number.isInteger(r)||r<1))throw Fn("'cache.maxSize' must be a positive integer");if(void 0!==a&&("number"!=typeof a||a<=0||Number.isNaN(a)))throw Fn("'cache.maxTime' must be a positive number of seconds, or Infinity");return{...void 0!==t?{store:t}:{},maxSize:r??50,maxTime:a??1800}},Mn=e=>"object"==typeof e&&null!==e&&["get","set","delete","clear"].every(t=>"function"==typeof e[t]),Fn=e=>new D({code:s.invalidOptions,message:e,path:[]});class Rn{store;own;maxTime;current=0;constructor(e){void 0===e.store?(this.own=new jr(e.maxSize),this.store=this.own):this.store=e.store,this.maxTime=e.maxTime}get generation(){return this.current}async lookup(e){let t;try{t=await this.store.get(e)}catch{return En}return n(r=t)&&"ft3"===r.fig&&"number"==typeof r.generation?t.generation<this.current||In(t)?(this.drop(e),En):{hit:!0,value:t.value}:En;var r}async write(e,t,r){if(r!==this.current)return;const a={fig:"ft3",value:t,generation:r,...Number.isFinite(this.maxTime)?{expiresAt:Date.now()+1e3*this.maxTime}:{}};try{await this.store.set(e,a)}catch{}}clear(){this.current+=1;try{Promise.resolve(this.store.clear()).catch(C)}catch{}}configure(e){void 0!==e.store&&e.store!==this.store&&(this.store=e.store,this.own=void 0),this.maxTime=e.maxTime,this.own?.resize(e.maxSize)}drop(e){try{Promise.resolve(this.store.delete(e)).catch(C)}catch{}}}const In=e=>void 0!==e.expiresAt&&e.expiresAt<=Date.now(),Vn=e=>e===E?0:"number"==typeof e?1:2,Ln=e=>({data:{paths:[...e.dataPaths].sort(([,e],[,t])=>((e,t)=>{const r=Math.min(e.length,t.length);for(let a=0;a<r;a++){const r=e[a],n=t[a];if(r===n)continue;const o=Vn(r)-Vn(n);return 0!==o?o:"number"==typeof r&&"number"==typeof n?r-n:r<n?-1:1}return e.length-t.length})(e,t)).map(([e])=>e),dynamic:e.dynamic},operators:[...e.operators],fragments:[...e.fragments]}),Wn=(e,t)=>{const r={};for(const[a,n]of Object.entries(e)){const e={...n};void 0!==t&&Object.hasOwn(t,a)&&(e.hostDefault=t[a]),r[a]=e}return r},Bn=(e,t)=>{const r=[];return void 0!==t.maxDepth&&e.maxDepth>t.maxDepth&&r.push(Un(e.maxDepth,t.maxDepth)),void 0!==t.maxNodes&&e.nodeCount>t.maxNodes&&r.push({severity:"error",code:s.maxNodesExceeded,message:`the expression holds ${e.nodeCount} evaluable nodes — maxNodes is ${t.maxNodes}`,path:[]}),r},Jn=(e,t)=>e.hasErrors||void 0!==t.maxDepth||void 0!==t.maxNodes?[...Bn(e,t),...e.issues.map(e=>e.issue)]:[],Un=(e,t)=>({severity:"error",code:s.maxDepthExceeded,message:`the expression nests ${e} levels deep — maxDepth is ${t}`,path:[]}),Kn=(e,t,r)=>{const a=[...Bn(e,t),...e.issues.map(r)];return void 0!==t.data&&a.push(...Gn(e.dataReads,t.data)),a},Gn=(e,t)=>{const r=new Map,a=new Map,n=[],o=(e,o,i,l)=>{let c=r.get(e);if(void 0===c&&(c=j(t,o).found,r.set(e,c)),c)return;let u=a.get(i.path);if(void 0===u&&a.set(i.path,u=new Set),u.has(e))return;u.add(e);const d=void 0===l?"":` (read by fragment '${l}')`;n.push({severity:"warning",code:s.missingDataPath,message:`'${q(o)}' is absent from the supplied sample data${d}`,path:Ae(i.path)})};for(const t of e)if("path"===t.kind)o(t.key,t.segments,t,void 0);else for(const[e,r]of t.fragment.dependencies.dataPaths)o(e,r,t,t.fragment.name);return n},_n="...",Hn=/*#__PURE__*/new Set(["propagate","value"]),Qn=e=>e,Xn=e=>{const t={};for(const[r,a]of Object.entries(e.parameters))t[r]=a.type??"any";const r=Yn(e.parameters,t,(t,r,a)=>{throw new D({code:t,message:r,path:a,operator:e.name})});return Zn(e,r)},Yn=(e,r,a)=>{const n=Object.entries(r).filter(([,e])=>t(e)).map(([e])=>e),o=new Map;for(const[i,l]of Object.entries(e)){if("function"!=typeof l.nullPolicy)continue;const e=["parameters",i,"nullPolicy"];if(1!==n.length){a(s.invalidNullPolicy,`a conditional 'nullPolicy' requires exactly one literal-union parameter in the definition — found ${n.length}`,e,i);continue}const c=n[0],u=r[c];if(!t(u))continue;const d=[];let p=!0;for(const t of u.literal){let r;try{r=l.nullPolicy(t)}catch(r){a(s.invalidNullPolicy,`the conditional 'nullPolicy' threw during compilation for member ${JSON.stringify(t)}: ${String(r)}`,e,i),p=!1;break}if("string"!=typeof r||!Hn.has(r)){a(s.invalidNullPolicy,`the conditional 'nullPolicy' must return 'propagate' or 'value' for every member — got ${JSON.stringify(r)} for ${JSON.stringify(t)}`,e,i),p=!1;break}d.push({value:t,policy:r})}p&&o.set(i,{selector:c,table:d})}return o},Zn=(e,t)=>{const r={};for(const[a,n]of Object.entries(e.parameters)){const e=t.get(a),o="string"==typeof n.nullPolicy?n.nullPolicy:void 0,s=n.type??"any",i=!0===n.truthiness&&W(s)?"value":"propagate",l={type:to(s),required:n.required??!("default"in n),evaluation:n.evaluation??"eager",truthiness:n.truthiness??!1,nullPolicy:e??o??i};"default"in n&&(l.default=n.default),void 0!==n.description&&(l.description=n.description),void 0!==n.metadata&&(l.metadata=n.metadata),void 0!==n.elementNullPolicy&&(l.elementNullPolicy=n.elementNullPolicy),void 0!==n.constraints&&(l.constraints=ro(n.constraints)),void 0!==n.over&&(l.over=n.over),void 0!==n.replacesNullAt&&(l.replacesNullAt=[...n.replacesNullAt]),r[a]=l}const a=e.positionalParams?.at(-1),n=a?.startsWith(_n)?a.slice(3):null,o={[ee]:!0,name:e.name,category:e.category,description:e.description,parameters:r,resolution:ao(r),restParam:n,deliversLazily:Object.values(r).some(e=>"eager"!==e.evaluation&&"structural"!==e.evaluation),timeoutParam:e.timeoutParam??null,cache:!0===e.cache,fingerprint:"",evaluate:e.evaluate,returns:void 0!==e.returns?to(e.returns):"any"};return void 0!==e.alias&&(o.alias=e.alias),void 0!==e.metadata&&(o.metadata=e.metadata),void 0!==e.positionalParams&&(o.positionalParams=[...e.positionalParams]),void 0!==e.validate&&(o.validate=e.validate),void 0!==e.analysis&&(o.analysis=ro(e.analysis)),o.fingerprint=eo(o),no(o)},eo=e=>M(JSON.stringify([e.name,e.parameters,e.positionalParams,e.restParam,e.returns,e.cache,e.timeoutParam,e.evaluate,e.validate],(e,t)=>"function"==typeof t||"symbol"==typeof t||t instanceof RegExp?String(t):t)),to=e=>"string"==typeof e?e:t(e)?{literal:[...e.literal]}:[...e],ro=t=>{if(Array.isArray(t))return t.map(ro);if(e(t)){const e={};for(const[r,a]of Object.entries(t))e[r]=ro(a);return e}return t},ao=e=>{const t=Object.entries(e);return{entries:t,whole:t.filter(([,e])=>void 0===e.replacesNullAt&&"perElement"!==e.evaluation),perElement:t.filter(([,e])=>"perElement"===e.evaluation)}},no=e=>{for(const t of Object.values(e.parameters))"string"!=typeof t.type&&Object.freeze(t.type),"object"==typeof t.type&&"literal"in t.type&&Object.freeze(t.type.literal),"object"==typeof t.nullPolicy&&(t.nullPolicy.table.forEach(e=>Object.freeze(e)),Object.freeze(t.nullPolicy.table),Object.freeze(t.nullPolicy)),void 0!==t.constraints&&oo(t.constraints),void 0!==t.replacesNullAt&&Object.freeze(t.replacesNullAt),Object.freeze(t);Object.freeze(e.parameters);for(const t of Object.values(e.resolution))t.forEach(e=>Object.freeze(e)),Object.freeze(t);return Object.freeze(e.resolution),"string"!=typeof e.returns&&Object.freeze(e.returns),void 0!==e.positionalParams&&Object.freeze(e.positionalParams),Object.freeze(e)},oo=t=>{Array.isArray(t)?(t.forEach(oo),Object.freeze(t)):e(t)&&(Object.values(t).forEach(oo),Object.freeze(t))},so=e=>{if(Array.isArray(e))return e;try{return k(e)}catch(e){throw new Ja(e.message)}},io=(e,t)=>{if("string"!=typeof e)return[];try{return k(e),[]}catch(e){return[{severity:"error",parameter:t,message:e.message}]}},lo=e=>Array.isArray(e.values)&&0===e.values.length?[{severity:"error",parameter:"values",message:"an empty values array has no result — supply at least one value"}]:[],co=e=>t=>{const r=t[e];return Array.isArray(r)&&0===r.length?[{severity:"warning",parameter:e,message:`an empty ${e} array is a dead expression — the result is always the identity`}]:[]},uo=/*#__PURE__*/co("values"),po=/*#__PURE__*/co("input"),fo=/*#__PURE__*/co("entries"),mo=e=>Array.isArray(e.values)&&e.values.length<2?[{severity:"warning",parameter:"values",message:"fewer than two values is a dead comparison — the result never varies"}]:[],ho=(e,t)=>new Ja(`${e} of nothing — the values array is empty${void 0!==t?`; ${t}`:""}`,{code:s.emptyAggregate}),vo=async(e,t)=>{const r=[];for await(const a of e){if(a.ok&&a.value===t)return t;a.ok||r.push(a)}if(r.length>0)throw r.sort((e,t)=>e.index-t.index),yo(r);return!t},yo=e=>{const[t,...r]=e,a=r.map(e=>e.error).filter(S);return a.length>0&&S(t.error)&&void 0===t.error.related&&(t.error.related=a),t.error},go=async e=>{const t=new Array(e.length);let r=0;for await(const a of e){t[a.index]=a;for(let e=t[r];void 0!==e;e=t[r]){if(!e.ok)throw e.error;r+=1}}return t.map(e=>e?.value)},bo=(e,t)=>{const r=e=>t&&"string"==typeof e?e.toLowerCase():e;if(e.length<2)return!0;const a=r(e[0]);return e.every(e=>we(r(e),a))},wo={values:{type:"array",elementNullPolicy:"value",description:"The values compared; null is comparable (null equals null)"},caseInsensitive:{type:"boolean",default:!1,description:"Fold string operands to one case before comparing (shallow)"}},ko={name:"equal",alias:"=",category:"comparison",description:"Are all the values equal? Deep, structural, key-order-insensitive; a cross-type comparison is false",parameters:wo,positionalParams:["...values"],returns:"boolean",validate:mo,evaluate:({values:e,caseInsensitive:t})=>bo(e,t)},$o={name:"notEqual",alias:"!=",category:"comparison",description:'Are the values NOT all equal? The exact negation of equal (never "all distinct")',parameters:wo,positionalParams:["...values"],returns:"boolean",validate:mo,evaluate:({values:e,caseInsensitive:t})=>!bo(e,t)},xo=(e,t,r,a)=>({name:e,alias:t,category:"comparison",description:r,parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{length:2,homogeneous:["number","string"]},description:"Exactly two operands: both numbers, or both strings (codepoint order)"},nullValueDefault:{type:["number","string"],required:!1,evaluation:"lazy",replacesNullAt:["values"],description:"Replaces a null operand before comparing"}},positionalParams:["...values"],returns:"boolean",evaluate:({values:e})=>{const[t,r]=e;return a(ne(t,r))}}),jo=/*#__PURE__*/xo("greaterThan",">","Is the first value strictly greater than the second?",e=>e>0),Oo=/*#__PURE__*/xo("greaterThanOrEqual",">=","Is the first value greater than or equal to the second?",e=>e>=0),Po=/*#__PURE__*/xo("lessThan","<","Is the first value strictly less than the second?",e=>e<0),Ao=/*#__PURE__*/xo("lessThanOrEqual","<=","Is the first value less than or equal to the second?",e=>e<=0),No={number:()=>0,string:()=>"",array:()=>[],object:()=>({})},Do=t=>"number"==typeof t?"number":"string"==typeof t?"string":Array.isArray(t)?"array":e(t)?"object":void 0,Co={name:"plus",alias:"+",category:"math",description:"Add numbers, concatenate strings or arrays, or shallow-merge objects — all operands must share one type",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{homogeneous:["number","string","array","object"]},description:"The operands; homogeneous: all numbers, strings, arrays or objects"},expect:{type:{literal:["number","string","array","object"]},required:!1,description:"Pin the mode: every operand must be this type, and an empty input yields its identity"},nullValueDefault:{type:["number","string","array","object"],required:!1,evaluation:"lazy",replacesNullAt:["values"],description:"Replaces any null operand before the addition"}},positionalParams:["...values"],returns:["number","string","array","object"],validate:({values:e,expect:t})=>void 0!==t?uo({values:e}):lo({values:e}),evaluate:({values:e,expect:t})=>{if(0===e.length){if(void 0===t)throw ho("the sum","pin the mode with 'expect' to get its identity");return No[t]()}const r=t??Do(e[0]),a=e.find(e=>Do(e)!==r);if(void 0!==a)throw n=`all operands must be ${r}s — received ${I(a)}`,new Ja(n,{code:s.typeCheck});var n;switch(r){case"number":return e.reduce((e,t)=>e+t,0);case"string":return e.join("");case"array":return e.flat(1);case"object":return Object.assign({},...e)}}},So={name:"subtract",alias:"-",category:"math",description:"Subtract one number from another",parameters:{value:{type:["number","null"],description:"The main operand"},minus:{type:["number","null"],description:"The amount subtracted from value"}},positionalParams:["value","minus"],returns:"number",evaluate:({value:e,minus:t})=>e-t},zo={name:"divide",alias:"/",category:"math",description:"Divide one number by another — true division; zero divisors fail",parameters:{value:{type:["number","null"],description:"The main operand"},by:{type:["number","null"],description:"The divisor"}},positionalParams:["value","by"],returns:"number",evaluate:({value:e,by:t})=>e/t},To={name:"modulo",category:"math",description:"The floored remainder: the result takes the sign of mod, so modulo(-7, 3) is 2",parameters:{value:{type:["number","null"],description:"The main operand"},mod:{type:["number","null"],description:"The modulus"}},positionalParams:["value","mod"],returns:"number",evaluate:({value:e,mod:t})=>(e%t+t)%t},Eo={name:"multiply",alias:"*",category:"math",description:"Multiply numbers together — an empty input is 1, the empty product",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{homogeneous:["number"]},description:"The factors"},nullValueDefault:{type:"number",required:!1,evaluation:"lazy",replacesNullAt:["values"],description:"Replaces any null factor before multiplying"}},positionalParams:["...values"],returns:"number",validate:uo,evaluate:({values:e})=>e.reduce((e,t)=>e*t,1)},qo={name:"power",alias:"^",category:"math",description:"Raise a base to an exponent — overflow and complex results fail",parameters:{base:{type:["number","null"],description:"The number to raise"},exponent:{type:["number","null"],description:"The power to raise it to"}},positionalParams:["base","exponent"],returns:"number",evaluate:({base:e,exponent:t})=>e**t},Mo={name:"round",category:"math",description:"Round to a number of decimal places — ties go half away from zero; negative decimals round to tens, hundreds, …",parameters:{value:{type:["number","null"],description:"The number to round"},decimals:{type:"integer",default:0,description:"Decimal places to keep; negative values round to powers of ten"}},positionalParams:["value","decimals"],returns:"number",evaluate:({value:e,decimals:t})=>((e,t=0)=>{if(!Number.isFinite(e))return e;const r=e<0?-1:1,a=Math.round(ye(Math.abs(e),t));return r*ye(a,-t)})(e,t)},Fo=(e,t,r,a,n="number")=>({name:e,category:"math",description:t,parameters:{value:{type:["number","null"],description:r}},positionalParams:["value"],returns:n,evaluate:({value:e})=>a(e)}),Ro=/*#__PURE__*/Fo("floor","Round down toward negative infinity","The number to round down",Math.floor,"integer"),Io=/*#__PURE__*/Fo("ceil","Round up toward positive infinity","The number to round up",Math.ceil,"integer"),Vo=/*#__PURE__*/Fo("abs","The absolute value","The number",Math.abs),Lo=(e,t,r,a)=>({name:e,category:"math",description:r,parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{homogeneous:["number","string"]},description:"The candidates: all numbers, or all strings (codepoint order)"},nullValueDefault:{type:["number","string"],required:!1,evaluation:"lazy",replacesNullAt:["values"],description:"Replaces any null candidate before comparing"}},positionalParams:["...values"],returns:["number","string"],validate:lo,evaluate:({values:e})=>{const r=e;if(0===r.length)throw ho(t);return r.reduce((e,t)=>a(ne(t,e))?t:e)}}),Wo=(e,t,r,a)=>({name:e,category:"string",description:t,parameters:{value:{type:["string","null"],description:r}},positionalParams:["value"],returns:"string",evaluate:({value:e})=>a(e)}),Bo={name:"split",category:"string",description:"Divide a string on a delimiter into an array of pieces — empty pieces are kept; an empty delimiter splits into code points",parameters:{value:{type:["string","null"],description:"The string to divide"},delimiter:{type:"string",default:" ",description:'Split on each occurrence; "" splits into code points'},trim:{type:"boolean",default:!0,description:"Trim whitespace from each piece"}},positionalParams:["value","delimiter"],returns:"array",evaluate:({value:e,delimiter:t,trim:r})=>{const a=""===t?ve(e):e.split(t);return r?a.map(de):a}},Jo=e=>Array.isArray(e.values)&&e.values.some(ce)?[{severity:"error",parameter:"values",message:ue}]:[],Uo={name:"join",category:"string",description:"Render array elements to text and concatenate them with a delimiter",parameters:{values:{type:"array",elementNullPolicy:"value",description:'Elements of any type, rendered by the stringification table; a null renders "" and still occupies its slot'},delimiter:{type:"string",default:" ",description:"Placed between each adjacent pair — shares its contract with split"},nullValueDefault:{type:["string","number","boolean"],required:!1,evaluation:"lazy",replacesNullAt:["values"],description:'Rendered in place of a null element, instead of ""'}},positionalParams:["...values"],returns:"string",validate:e=>[...uo(e),...Jo(e)],evaluate:({values:e,delimiter:t},r)=>e.map((e,t)=>{const a=`[${t}]`;return null===e?r.trace.note({type:"render",token:a,rendered:"empty"}):ce(e)&&r.trace.note({type:"render",token:a,rendered:"placeholder"}),le(e)}).join(t)},Ko=e=>{const t=new Set,r=[];for(const a of e)if("imsu".includes(a)){if(t.has(a))return`duplicate regex flag '${a}'`;t.add(a)}else r.includes(a)||r.push(a);if(0===r.length)return;const a=r.includes("g")||r.includes("y")?" — all matches is mode: 'match'":"";return`unknown regex flag${1===r.length?"":"s"}: ${r.join(", ")}${a}`},Go={type:"array",description:"The collection iterated over; a null input is a type error"},_o={type:"string",required:!1,evaluation:"structural",description:"Rename the bindings: as: 'row' binds $row and $rowIndex"},Ho={type:"array",required:!1,evaluation:"lazy",replacesNullAt:["input"],description:"Used as the collection when input evaluates to null — typically []"},Qo={type:"any",evaluation:"perElement",over:"input",description:"The predicate, per element — a truthiness position, so null is falsy",truthiness:!0},Xo={name:"get",category:"data",description:"Read a path out of the evaluation data, or out of a supplied object — the dynamic face of a $data reference",parameters:{path:{type:["string","array","null"],description:"Dot and bracket segments, quoted keys and the [*] projection — or an array of segments, taken verbatim"},from:{type:"any",nullPolicy:"value",default:Z,description:"The source the path reads: a value, or a bare namespace ($data, $vars, $params, $element) whose var or parameter name opens the path — replace, never merge; a null source misses every path"},default:{type:"any",required:!1,evaluation:"lazy",description:"The answer when the path is missing — a stored null passes through unchanged (firstOf replaces one); supplying it also opts out of strictDataPaths"}},positionalParams:F,returns:"any",validate:({path:e})=>io(e,"path"),evaluate:({path:e,from:t,default:r},a)=>{const n=j(t,so(e));if(n.found)return void 0===n.value?null:n.value;if(void 0!==r)return r.evaluate();if(a.options.strictDataPaths)throw new Ja(`'${Yo(e)}' is missing (strictDataPaths)`,{code:s.missingDataPath});return null}},Yo=e=>"string"==typeof e?e:e.map(e=>String(e)).join("."),Zo={name:"buildObject",category:"data",description:"Assemble an object from computed key/value entries — for keys known only at runtime",parameters:{entries:{type:"array",constraints:{elementShape:{key:{type:["string","number","boolean"]},value:{type:"any"}}},description:'Objects with a "key" and a "value"; a null value keeps its key'}},positionalParams:["...entries"],returns:"object",validate:e=>[...fo(e),...es(e)],evaluate:({entries:e},t)=>{const r={};for(const a of e){const e=le(a.key);Object.hasOwn(r,e)&&t.trace.note({type:"key-overwrite",key:e}),r[e]=a.value}return r}},es=e=>{const t=e.entries;if(!Array.isArray(t))return[];const r=new Set,a=new Set,n=[];for(const e of t){const t=e?.key;if("string"!=typeof t&&"number"!=typeof t&&"boolean"!=typeof t)continue;const o=le(t);r.has(o)&&!a.has(o)&&(a.add(o),n.push({severity:"warning",parameter:"entries",message:`duplicate key '${o}' — the last entry wins and the earlier one is dead`})),r.add(o)}return n},ts=(e,t)=>new Ja(`cannot convert ${I(e)} to ${t}`),rs=/*#__PURE__*/[{name:"and",category:"logic",description:"True when every value is truthy — operands run in parallel",parameters:{values:{type:"array",truthiness:!0,evaluation:"race",description:"Operands, judged by FigTree truthiness; null is falsy"}},positionalParams:["...values"],returns:"boolean",validate:uo,evaluate:({values:e})=>vo(e,!1)},{name:"or",category:"logic",description:"True when any value is truthy — operands run in parallel",parameters:{values:{type:"array",truthiness:!0,evaluation:"race",description:"Operands, judged by FigTree truthiness; null is falsy"}},positionalParams:["...values"],returns:"boolean",validate:uo,evaluate:({values:e})=>vo(e,!0)},{name:"not",alias:"!",category:"logic",description:"Negate the truthiness of a value",parameters:{value:{type:"any",truthiness:!0,description:"Judged by FigTree truthiness; null is falsy, so not(null) is true"}},positionalParams:["value"],returns:"boolean",evaluate:({value:e})=>!e},{name:"if",alias:"?",category:"logic",description:"Choose between two branches — only the chosen branch evaluates",parameters:{condition:{type:"any",truthiness:!0,description:"Judged by FigTree truthiness; null is falsy"},then:{type:"any",evaluation:"lazy",description:"The value when the condition holds"},else:{type:"any",evaluation:"lazy",default:null,description:"The value when it does not; omitted means null"}},positionalParams:["condition","then","else"],evaluate:({condition:e,then:t,else:r})=>e?t.evaluate():r.evaluate()},{name:"match",category:"logic",description:"Dispatch on a value — only the matching branch evaluates",parameters:{value:{type:["string","number","boolean","null"],nullPolicy:"value",description:"Matched against branch keys by its canonical string form"},branches:{type:"object",evaluation:"lazyEntries",description:"A literal map of branches, or an expression computing one"},default:{type:"any",required:!1,evaluation:"lazy",description:"The branch taken when none matches; absent means failure"}},positionalParams:["value","branches","default"],evaluate:({value:e,branches:t,default:r})=>{const a=null===e?null:le(e);if(null!==a&&Object.hasOwn(t,a))return t[a].evaluate();if(void 0!==r)return r.evaluate();throw new Ja(`no branch matches ${null===a?"null":`'${a}'`}, and no default was supplied`)}},{name:"firstOf",category:"logic",description:"The first candidate that is not null (SQL COALESCE) — later candidates never evaluate",parameters:{values:{type:"array",evaluation:"lazyElements",description:"Candidates, tried in order; only null is skipped"}},positionalParams:["...values"],validate:uo,evaluate:async({values:e})=>{for(const t of e){const e=await t.evaluate();if(null!==e)return e}return null}},ko,$o,jo,Oo,Po,Ao,Co,So,Eo,zo,To,qo,Mo,Ro,Io,Vo,/*#__PURE__*/Lo("min","the minimum","The smallest of the values — numbers numerically, strings in codepoint order",e=>e<0),/*#__PURE__*/Lo("max","the maximum","The largest of the values — numbers numerically, strings in codepoint order",e=>e>0),{name:"buildString",category:"string",description:"Render a template, filling its tokens — the result is always a string",parameters:{template:{type:["string","null"],description:"The text, with %N or {{name}} tokens; in a literal template, {{$data.x}} is that reference"},substitutions:{type:["array","object"],default:[],elementNullPolicy:"value",description:"An array pairs with %N tokens, an object with {{name}} tokens; the mode dispatches on which arrives"},trim:{type:"boolean",default:!1,description:"Trim whitespace from each rendered value, never from the template text"},closeGaps:{type:"boolean",default:!1,description:"A value that renders empty also takes one run of adjacent template whitespace"},nullValueDefault:{type:["string","number","boolean"],required:!1,evaluation:"lazy",replacesNullAt:["substitutions"],description:'Rendered in place of a null value, instead of ""'}},positionalParams:["template","...substitutions"],returns:"string",evaluate:({template:e,substitutions:t,trim:r,closeGaps:a},n)=>{const o=Array.isArray(t)?t:void 0,s=void 0===o?t:void 0,i=[];for(const t of $e(e)){if("text"===t.kind){i.push({text:t.text,site:!1});continue}if(!("positional"===t.kind?void 0!==o&&t.index>=1&&t.index<=o.length:void 0!==s&&Object.hasOwn(s,t.body))){n.trace.note({type:"render",token:t.raw,rendered:"literal"}),i.push({text:t.raw,site:!1});continue}const e="positional"===t.kind?o[t.index-1]:s[t.body],a=le(e);ce(e)&&n.trace.note({type:"render",token:t.raw,rendered:"placeholder"});const l=r?de(a):a;""===l&&n.trace.note({type:"render",token:t.raw,rendered:"empty"}),i.push({text:l,site:!0,token:t.raw})}if(a)for(const e of(e=>{const t=[];for(let r=0;r<e.length;r++){const a=e[r];if(!a.site||""!==a.text)continue;const n=e[r-1];if(void 0!==n&&!n.site){const e=me(n.text);if(e!==n.text){n.text=e,t.push(a.token);continue}}const o=e[r+1];if(void 0!==o&&!o.site){const e=he(o.text);e!==o.text&&t.push(a.token),o.text=e}}return t})(i))n.trace.note({type:"render",token:e,rendered:"gap-closed"});return i.map(e=>e.text).join("")}},Bo,Uo,/*#__PURE__*/Wo("lower","Lowercase a string — Unicode default case mapping, locale-independent","The string to lowercase",e=>e.toLowerCase()),/*#__PURE__*/Wo("upper","Uppercase a string — Unicode default case mapping, locale-independent","The string to uppercase",e=>e.toUpperCase()),/*#__PURE__*/Wo("trim","Strip whitespace (the JS trim set) from both ends of a string","The string to trim",de),{name:"regex",category:"string",description:"Test, extract or match a string against a regular expression",parameters:{value:{type:["string","null"],description:"The subject string"},pattern:{type:["string","null"],description:"The regular expression source"},flags:{type:"string",default:"",description:"The admitted subset: i, m, s, u"},mode:{type:{literal:["test","extract","match"]},default:"test",description:"test gives a boolean, extract the first matching substring, match every one of them"},noMatchDefault:{type:["string","null"],required:!1,default:null,nullPolicy:"value",evaluation:"lazy",description:"The extract answer when nothing matches — a matched empty string still passes through"}},positionalParams:["value","pattern"],returns:["boolean","string","array","null"],validate:({pattern:e,flags:t})=>{const r=[],a="string"==typeof t?Ko(t):void 0;if(void 0!==a&&r.push({severity:"error",parameter:"flags",message:a}),"string"==typeof e)try{new RegExp(e,"string"==typeof t&&void 0===a?t:"")}catch(e){r.push({severity:"error",parameter:"pattern",message:`pattern does not compile: ${e.message}`})}return r},evaluate:({value:e,pattern:t,flags:r,mode:a,noMatchDefault:n})=>{const o=Ko(r);if(void 0!==o)throw new Ja(o);const s=e=>{try{return new RegExp(t,r+e)}catch(e){throw new Ja(`pattern does not compile: ${e.message}`)}};switch(a){case"test":return s("").test(e);case"extract":{const t=s("").exec(e);return null===t?n.evaluate():t[0]}case"match":return[...e.matchAll(s("g"))].map(e=>e[0])}}},{name:"length",category:"array",description:"An array's element count, or a string's Unicode code-point count",parameters:{value:{type:["string","array","null"],description:"The array or string measured"}},positionalParams:["...value"],returns:"integer",evaluate:({value:e})=>"string"==typeof e?ve(e).length:e.length},{name:"map",category:"array",description:"Transform every element of an array",parameters:{input:Go,as:_o,nullInputDefault:Ho,each:{type:"any",evaluation:"perElement",over:"input",description:"Evaluated per element, with $element and $index bound"}},positionalParams:["input","each"],returns:"array",validate:po,evaluate:({each:e})=>go(e.settle())},{name:"filter",category:"array",description:"Keep the elements of an array whose predicate is truthy",parameters:{input:Go,as:_o,nullInputDefault:Ho,each:Qo},positionalParams:["input","each"],returns:"array",validate:po,evaluate:async({input:e,each:t})=>{const r=await go(t.settle());return e.filter((e,t)=>r[t])}},{name:"find",category:"array",description:"The first element of an array whose predicate is truthy",parameters:{input:Go,as:_o,nullInputDefault:Ho,each:Qo,noMatchDefault:{type:"any",required:!1,default:null,evaluation:"lazy",description:"The answer when nothing matches; a found null passes through unchanged"}},positionalParams:["input","each"],validate:po,evaluate:async({input:e,each:t,noMatchDefault:r})=>{const a=new Array(e.length);let n=0;for await(const r of t.settle()){a[r.index]=r;for(let t=a[n];void 0!==t;t=a[n]){if(!t.ok)throw t.error;if(!0===t.value)return e[n];n+=1}}return r.evaluate()}},{name:"some",category:"array",description:"True when any element satisfies the predicate",parameters:{input:Go,as:_o,nullInputDefault:Ho,each:Qo},positionalParams:["input","each"],returns:"boolean",validate:po,evaluate:({each:e})=>vo(e.settle(),!0)},{name:"every",category:"array",description:"True when every element satisfies the predicate",parameters:{input:Go,as:_o,nullInputDefault:Ho,each:Qo},positionalParams:["input","each"],returns:"boolean",validate:po,evaluate:({each:e})=>vo(e.settle(),!1)},Xo,Zo,{name:"convert",category:"other",description:"Convert a value to a number, string, boolean or array — strict: a failed conversion is an error, never a guess",parameters:{value:{type:"any",nullPolicy:e=>"boolean"===e?"value":"propagate",description:"The value to convert; null propagates except for boolean, where it is false"},to:{type:{literal:["number","string","boolean","array"]},description:"The target type"}},positionalParams:["value","to"],returns:["number","string","boolean","array"],evaluate:({value:t,to:r})=>{switch(r){case"number":if("number"==typeof t)return t;if("boolean"==typeof t)return t?1:0;if("string"==typeof t){const e=t.trim(),r=""===e?NaN:Number(e);if(Number.isNaN(r))throw new Ja(`'${t}' is not a numeric string — use regex to extract a number from text`);return r}throw ts(t,"number");case"string":if(Array.isArray(t)||e(t))throw new Ja(`cannot convert ${I(t)} to string — a cast is not a render; use buildString or join`);if("object"==typeof t)throw ts(t,"string");return le(t);case"boolean":if("string"==typeof t){const e=t.trim().toLowerCase();if("true"===e)return!0;if("false"===e)return!1}return ae(t);case"array":return Array.isArray(t)?t:[t]}}}].map(Xn),as="3.0.0-preview.10",ns=(e,t)=>{const r=((e,t)=>{const r={...e};for(const[e,a]of Object.entries(t)){if(void 0===a)continue;if(null===a){delete r[e];continue}if("data"===e||!n(a)){r[e]=a;continue}const t=r[e],o=n(t)?{...t}:{};for(const[e,t]of Object.entries(a))void 0!==t&&(null===t?delete o[e]:o[e]=t);r[e]=o}return r})(null===e?{}:e.options,t);vs(r);const a=os(r);if(null!==e&&!(e=>void 0!==e.operators||void 0!==e.fragments||void 0!==e.operatorDefaults)(t))return{options:r,evaluation:a,registry:e.registry,compileCache:e.compileCache};const o=Ur({operators:r.operators??[rs],...void 0!==r.operatorDefaults?{operatorDefaults:r.operatorDefaults}:{},...void 0!==r.fragments?{fragments:r.fragments}:{}});return{options:r,evaluation:a,registry:o,compileCache:new Tr({compile:e=>ss(e,o),probe:xe})}},os=e=>{const t={...e};return delete t.operators,delete t.fragments,t},ss=(e,t)=>{const r=Me(e,t);return Vt(r),r.hasNoCache&&hr(r),r};class is{state;results;version=as;constructor(e={}){this.state=ns(null,e),this.results=new Rn(qn(this.state.options.cache))}updateOptions(e={}){const t=ns(this.state,e),r=qn(t.options.cache);this.state=t,this.results.configure(r)}clearCache(){this.results.clear()}getOptions(){return(e=>{const t={};for(const[r,a]of Object.entries(e))t[r]=n(a)?{...a}:a;return t})(this.state.evaluation)}getOperators(){return[...this.state.registry.operators.values()].map(e=>{const{definition:t,hostDefaults:r}=e,a={name:t.name,category:t.category,description:t.description,parameters:Wn(t.parameters,r),restParam:t.restParam,timeoutParam:t.timeoutParam,cache:t.cache,returns:t.returns,hasValidate:void 0!==t.validate};return void 0!==t.alias&&(a.alias=t.alias),void 0!==t.metadata&&(a.metadata=t.metadata),void 0!==t.positionalParams&&(a.positionalParams=t.positionalParams),void 0!==r&&(!0===r.noCache&&(a.hostNoCache=!0),Object.hasOwn(r,"fallback")&&(a.hostFallback=r.fallback)),a})}getFragments(){return[...this.state.registry.fragments.values()].map(e=>{const t={name:e.name,parameters:Object.fromEntries(Object.entries(e.parameters).map(([e,t])=>[e,{...t}])),returns:e.returns,warnings:[...e.warnings],dependencies:Ln(e.dependencies),caches:e.caches};return void 0!==e.description&&(t.description=e.description),void 0!==e.metadata&&(t.metadata=e.metadata),t})}validate(e,t){const r=void 0===t?this.state.evaluation:ms(this.state.evaluation,t),a=ss(e,this.state.registry),n=Kn(a,r,e=>e.issue);return{valid:!n.some(e=>"error"===e.severity),issues:n}}getDependencies(e){return Ln(Me(e,this.state.registry).dependencies)}isEvaluable(e){const t=Me(e,this.state.registry);return t.holes.length>0||t.hasErrors}evaluate(e,t){const{state:r}=this;return ls(r.evaluation,this.results,e,t,()=>r.compileCache.resolve(e),()=>ss(e,r.registry))}compile(e){const{state:t}=this;return ps(e,t.compileCache.resolve(e),t.evaluation,t.registry,this.results)}}const ls=async(e,t,r,a,n,o)=>{const s=void 0===a?e:ms(e,a),i=n(),l="inert"===i.kind&&!0===s.trace?{kind:"artifact",artifact:o()}:i;if("inert"===l.kind){if(void 0!==s.maxDepth&&l.depth>s.maxDepth){const e=Un(l.depth,s.maxDepth);throw gs(e,[e])}return r}const{artifact:c}=l,u=Jn(c,s),d=u.find(e=>"error"===e.severity);if(void 0!==d)throw gs(d,u);const p=await Dn(c,s,t);return!0===s.trace?p:p.result};let cs;const us=(e,t)=>cs?.(e,t);class ds{#t;#r;#a;#n;#o;#s;#i;constructor(e,t,r,a,n){this.#t=e,this.#r=t,this.#a=r,this.#n=a,this.#o=n,cs??=(e,t)=>{if("object"!=typeof e||null===e||!(#r in e))return;const r=void 0===t?e.#a:ms(e.#a,t);return{expression:e.#t,artifact:e.#l(),options:r}}}get expression(){return this.#t}get issues(){return this.#i??=this.#l().issues.map(e=>e.issue)}get hasErrors(){return this.#l().hasErrors}evaluate(e){return ls(this.#a,this.#o,this.#t,e,()=>this.#r,()=>this.#l())}getDependencies(){return Ln(this.#l().dependencies)}#l(){return"artifact"===this.#r.kind?this.#r.artifact:this.#s??=ss(this.#t,this.#n)}}const ps=(e,t,r,a,n)=>new ds(e,t,r,a,n),fs=/*#__PURE__*/new Set(Object.keys({data:0,signal:0,timeout:0,trace:0})),ms=(e,t)=>{let r;for(const a in t){const n=t[a];if(void 0!==n){if(!fs.has(a))throw hs(a);r??={...e},r[a]=n}}return void 0===r?e:(vs(t),r)},hs=e=>new D({code:s.invalidOptions,message:`'${e}' is not a per-call option — a call may supply data, signal, timeout and trace; configure the rest at construction or via updateOptions()`,path:[]}),vs=e=>{const{timeout:t,signal:r}=e;if(void 0!==t&&("number"!=typeof t||!Number.isFinite(t)||t<=0))throw new D({code:s.invalidOptions,message:"'timeout' must be a positive number of milliseconds",path:[]});if(void 0!==r&&!ys(r))throw new D({code:s.invalidOptions,message:"'signal' must be an AbortSignal",path:[]})},ys=e=>"object"==typeof e&&null!==e&&"boolean"==typeof e.aborted&&"function"==typeof e.addEventListener&&"function"==typeof e.removeEventListener,gs=(e,t)=>new D({code:e.code,message:e.message,path:e.path,...void 0!==e.operator?{operator:e.operator}:{},issues:t});export{as as A,Kn as B,se as C,ie as D,Z as E,is as F,ne as G,we as H,Hn as N,Y as O,_n as R,X as a,W as b,U as c,rs as d,Ua as e,Se as f,us as g,Jn as h,ae as i,J as j,te as k,H as l,K as m,Yn as n,Zn as o,Ja as p,so as q,Ce as r,Te as s,Ae as t,le as u,It as v,I as w,Xn as x,Qn as y,io as z};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={code:"string",message:"string",path:"array",operator:["string","null"],fragment:["string","null"],fragmentPath:["array","null"],errorData:["object","null"]};class t extends Error{code;path;operator;fragment;fragmentPath;errorData;related;cause;issues;trace;constructor(e){super(e.message),this.name="FigTreeError",this.code=e.code,this.path=e.path,void 0!==e.operator&&(this.operator=e.operator),void 0!==e.fragment&&(this.fragment=e.fragment),void 0!==e.fragmentPath&&(this.fragmentPath=e.fragmentPath),void 0!==e.errorData&&(this.errorData=e.errorData),void 0!==e.related&&(this.related=e.related),void 0!==e.cause&&(this.cause=e.cause),void 0!==e.issues&&(this.issues=e.issues),void 0!==e.trace&&(this.trace=e.trace)}prettyPrint(){const e=this.operator?` (operator: ${this.operator})`:"",t=this.path.length>0?` at ${n(this.path)}`:"",r=`${this.code}${e}${t}`,a=this.errorData&&Object.keys(this.errorData).length>0?`\n${JSON.stringify(this.errorData,null,2)}`:"";return`${r}\n${this.message}${a}`}}const r=e=>e instanceof t,n=e=>e.map((e,t)=>"number"==typeof e?`[${e}]`:0===t?e:`.${e}`).join(""),a={typeCheck:"type-check",operatorFailure:"operator-failure",requestTimeout:"request-timeout",httpStatus:"http-status",invalidResponse:"invalid-response",graphQLErrors:"graphql-errors",sqlError:"sql-error",requestFailure:"request-failure",nonFiniteResult:"non-finite-result",escapedHandle:"escaped-handle",emptyAggregate:"empty-aggregate",missingDataPath:"missing-data-path",missingRequired:"missing-required",timeout:"timeout",aborted:"aborted",malformedNode:"malformed-node",unknownOperator:"unknown-operator",unknownFragment:"unknown-fragment",unknownNodeKey:"unknown-node-key",unrecognizedIdentifier:"unrecognized-identifier",positionalArity:"positional-arity",invalidVars:"invalid-vars",invalidReference:"invalid-reference",invalidAs:"invalid-as",unresolvedVar:"unresolved-var",unresolvedParam:"unresolved-param",unresolvedBinding:"unresolved-binding",bareVars:"bare-vars",varCycle:"var-cycle",depthCeiling:"depth-ceiling",maxDepthExceeded:"max-depth",maxNodesExceeded:"max-nodes",returnsMismatch:"returns-mismatch",operatorValidate:"operator-validate",uselessModifier:"useless-modifier",unreferencedVar:"unreferenced-var",shadowedVar:"shadowed-var",deadBinding:"dead-binding",fallbackMismatch:"fallback-mismatch",unboundToken:"unbound-token",unusedSubstitution:"unused-substitution",inertReferenceToken:"inert-reference-token",invalidDefinition:"invalid-definition",invalidName:"invalid-name",reservedName:"reserved-name",invalidNullPolicy:"invalid-null-policy",duplicateOperator:"duplicate-operator",fragmentCycle:"fragment-cycle",invalidOptions:"invalid-options"},s=()=>{},i=e=>"object"==typeof e&&null!==e&&"function"==typeof e.then,o=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),l=e=>{if("object"!=typeof e||null===e||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t},d=(e,t,r)=>{if(e===t)return 0;const n=e.length,a=t.length;if(Math.abs(n-a)>r)return r+1;let s=new Array(a+1),i=new Array(a+1);for(let e=0;e<=a;e++)s[e]=e;for(let o=1;o<=n;o++){i[0]=o;let n=o;const l=e.charCodeAt(o-1);for(let e=1;e<=a;e++){const r=s[e-1]+(l===t.charCodeAt(e-1)?0:1),a=Math.min(s[e]+1,i[e-1]+1,r);i[e]=a,a<n&&(n=a)}if(n>r)return r+1;const d=s;s=i,i=d}return s[a]},u=(e,t)=>{let r,n=3;for(const a of t){const t=d(e,a,n-1);if(t<n&&(r=a,n=t,0===t))break}return r},c=e=>{let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,"0")},m=e=>{let t;return()=>(void 0===t&&(t=(async()=>e())()),t)},f=e=>"object"==typeof e&&null!==e&&!Array.isArray(e)&&"literal"in e,p=(e,t)=>{const r=h(e),n=h(t);return!(!r.any&&!n.any)||(void 0!==r.literals&&void 0!==n.literals?r.literals.some(e=>n.literals.includes(e)):void 0!==r.literals?r.literals.some(e=>g(e,n.basics)):void 0!==n.literals?n.literals.some(e=>g(e,r.basics)):r.basics.some(e=>n.basics.includes(e)||"integer"===e&&n.basics.includes("number")||"number"===e&&n.basics.includes("integer")))},h=e=>{if(f(e))return{any:!1,basics:[],literals:e.literal};const t="string"==typeof e?[e]:e;return{any:t.includes("any"),basics:t}},g=(e,t)=>"string"==typeof e?t.includes("string"):"boolean"==typeof e?t.includes("boolean"):t.includes("number")||Number.isInteger(e)&&t.includes("integer"),v=Symbol("figtree.path.wildcard"),y=e=>"string"==typeof e||"number"==typeof e||e===v,b={found:!1,value:void 0},k=e=>{const t=[];let r="",n=!1,a=0;const s=()=>{n&&(t.push(r),r="",n=!1)};for(;a<e.length;){const i=e[a];if("."!==i){if("["===i){s();const{segment:r,next:n}=$(e,a);t.push(r),a=n;continue}r+=i,n=!0,a++}else s(),a++}return s(),t},$=(e,t)=>{let r=t+1;if(r>=e.length)throw w(e,'unterminated "["');const n=e[r];if("*"===n){if("]"!==e[r+1])throw w(e,'expected "]" after "[*"');return{segment:v,next:r+2}}if('"'===n||"'"===n){const t=n;r++;let a="";for(;r<e.length;){const n=e[r];if("\\"===n){const t=e[r+1];if(void 0===t)throw w(e,"trailing escape in quoted key");a+=t,r+=2;continue}if(n===t){if("]"!==e[r+1])throw w(e,'expected "]" after quoted key');return{segment:a,next:r+2}}a+=n,r++}throw w(e,"unterminated quoted key")}let a="";for(;r<e.length&&e[r]>="0"&&e[r]<="9";)a+=e[r],r++;if(a.length>0&&"]"===e[r])return{segment:Number(a),next:r+1};throw w(e,'expected a number, "*", or a quoted key inside "[…]"')},w=(e,t)=>new Error(`Invalid path "${e}": ${t}`),x=(e,t)=>A(e,(e=>Array.isArray(e)?e.slice():k(e))(t),0),A=(e,t,r)=>{if(r>=t.length)return{found:!0,value:e};const n=t[r];if(n===v){if(!Array.isArray(e))return b;const n=r+1;if(n>=t.length)return{found:!0,value:e};return{found:!0,value:e.map(e=>{const r=A(e,t,n);return r.found?r.value:null})}}const a=j(e,n);return a.found?A(a.value,t,r+1):b},j=(e,t)=>{if(null===e||"object"!=typeof e)return b;if(Array.isArray(e)){const r="number"==typeof t?t:q(t);return void 0===r||r<0||r>=e.length?b:{found:!0,value:e[r]}}const r=String(t);return Object.prototype.propertyIsEnumerable.call(e,r)?{found:!0,value:e[r]}:b},q=e=>/^\d+$/.test(e)?Number(e):void 0,P=e=>e.map(e=>"string"==typeof e?q(e)??e:e),D={data:"data",d:"data",vars:"vars",v:"vars",params:"params",p:"params",element:"element",e:"element",index:"index",i:"index",error:"error",err:"error"},O=e=>Object.hasOwn(D,e)?D[e]:void 0,N=e=>{if(!e.startsWith("$"))return null;const t=/^\$([^.[]*)/.exec(e)[1];return{token:t,rest:e.slice(1+t.length)}},S=e=>{const t=N(e);return null===t||""!==t.rest?null:O(t.token)??null},C=e=>""===e?[]:k(e.startsWith(".")?e.slice(1):e),E=e=>`${e}Index`,W=(e,t)=>{for(const r of t){if(e===r)return"element";if(e===E(r))return"index"}return null},M=(e,t)=>{const r=N(e);if(null===r)return{kind:"plain"};const{token:n,rest:s}=r,i=O(n);if(void 0===i){const e=void 0===t?.bindings?null:W(n,t.bindings);return null===e?{kind:"unrecognized"}:V(n,s,e)}if(""===s)return"vars"===i?{kind:"invalid",namespace:i,code:a.bareVars,reason:"'$vars' must name a var — there is no whole-scope value"}:{kind:"reference",namespace:i,segments:[],drill:s};if("index"===i)return{kind:"invalid",namespace:i,reason:"'$index' is bare-only — it cannot be drilled"};try{return{kind:"reference",namespace:i,segments:C(s),drill:s}}catch(e){return{kind:"invalid",namespace:i,reason:e.message}}},V=(e,t,r)=>{if("index"===r)return""!==t?{kind:"invalid",namespace:r,reason:"the index binding is bare-only — it cannot be drilled"}:{kind:"reference",namespace:r,segments:[],drill:t,binding:e};try{return{kind:"reference",namespace:r,segments:C(t),drill:t,binding:e}}catch(e){return{kind:"invalid",namespace:r,reason:e.message}}},z=e=>e.map((e,t)=>"number"==typeof e?`[${e}]`:e===v?"[*]":I(e,0===t)).join(""),F=/[.[\]"\\]/,I=(e,t)=>""===e||F.test(e)?`["${e.replace(/[\\"]/g,e=>`\\${e}`)}"]`:t?e:`.${e}`,R=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/,T=e=>R.test(e),B=(e,t)=>{const r=z(t);return""===r?`$${e}`:r.startsWith("[")?`$${e}${r}`:`$${e}.${r}`},H=e=>B("data",e),Z=/*#__PURE__*/new Set(["operator","fragment","parameters","fallback","noCache","vars","//"]),_=/*#__PURE__*/new Set([...Z,...Object.keys(D),"literal"]),G=e=>"string"!=typeof e?{ok:!1,reason:"a name must be a string"}:""===e?{ok:!1,reason:"a name must be non-empty"}:e.startsWith("$")?{ok:!1,reason:"a name may not start with '$'"}:/[.[\]]/.test(e)?{ok:!1,reason:"a name may not contain '.', '[' or ']'"}:{ok:!0},J=/*#__PURE__*/new Set(["fallback","noCache","vars","//"]),K=500,L={kind:"operator"},Q={kind:"fragment"},U={kind:"plain"},X=e=>({kind:"malformed",message:e}),Y=(e,t)=>{const r="operator"in e,n="fragment"in e,a=[];for(const r in e)r.startsWith("$")&&t(r.slice(1))&&a.push(r);return r&&n?X("'operator' and 'fragment' may not share a node"):(r||n)&&a.length>0?X(`a canonical '${r?"operator":"fragment"}' key may not sit beside the shorthand key '${a[0]}'`):r?L:n?Q:a.length>=2?X(`one node, one invocation: found ${a.map(e=>`'${e}'`).join(" and ")}`):1===a.length?{kind:"shorthand",key:a[0]}:U},ee=(e,t)=>{if(!l(e))return!1;if("operator"in e||"fragment"in e)return!0;for(const r in e)if(r.startsWith("$")&&t(r.slice(1)))return!0;return!1},te=(e,t)=>{const r=e.positionalParams;if(void 0===r)return null;const n=e.restParam,a=null===n?r.length:r.length-1;return t>a&&null===n?null:{bound:Math.min(t,a),restAt:null!==n&&t>=a?a:null}},re=e=>{const t=e.positionalParams?.[0];return void 0===t?null:t.startsWith("...")?e.restParam:t},ne=["path","default"];export{s as A,m as B,i as C,K as D,a as E,t as F,ne as G,H,c as I,D as N,Z as R,J as S,v as W,o as a,r as b,e as c,Y as d,l as e,ee as f,M as g,N as h,f as i,z as j,S as k,k as l,G as m,_ as n,B as o,te as p,T as q,x as r,re as s,p as t,P as u,u as v,O as w,W as x,y,E as z};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
type BasicType = 'any' | 'string' | 'number' | 'boolean' | 'array' | 'object' | 'null' | 'integer';
|
|
2
|
+
|
|
3
|
+
declare const OPERATOR_CATEGORIES: readonly ["logic", "comparison", "math", "string", "array", "data", "io", "other"];
|
|
4
|
+
type OperatorCategory = (typeof OPERATOR_CATEGORIES)[number];
|
|
5
|
+
|
|
6
|
+
interface OperatorHints {
|
|
7
|
+
displayName: string;
|
|
8
|
+
docUrl: string;
|
|
9
|
+
backgroundColor: string;
|
|
10
|
+
textColor: string;
|
|
11
|
+
seeds?: {
|
|
12
|
+
[parameter: string]: unknown;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
interface CategoryHints {
|
|
16
|
+
displayName: string;
|
|
17
|
+
order: number;
|
|
18
|
+
backgroundColor: string;
|
|
19
|
+
textColor: string;
|
|
20
|
+
}
|
|
21
|
+
type OperatorHintMap = {
|
|
22
|
+
[operator: string]: OperatorHints;
|
|
23
|
+
};
|
|
24
|
+
type CategoryHintMap = {
|
|
25
|
+
[category in OperatorCategory]: CategoryHints;
|
|
26
|
+
};
|
|
27
|
+
type TypeSeeds = {
|
|
28
|
+
[type in BasicType]: unknown;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
declare const categoryHints: CategoryHintMap;
|
|
32
|
+
declare const typeSeeds: TypeSeeds;
|
|
33
|
+
declare const operatorHints: OperatorHintMap;
|
|
34
|
+
|
|
35
|
+
export { categoryHints, operatorHints, typeSeeds };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={logic:{displayName:"Logic & control",order:0,backgroundColor:"#632fbc",textColor:"#ffffff"},comparison:{displayName:"Comparison",order:1,backgroundColor:"#247f7c",textColor:"#ffffff"},math:{displayName:"Arithmetic & math",order:2,backgroundColor:"#2b8237",textColor:"#ffffff"},string:{displayName:"Strings",order:3,backgroundColor:"#a1660c",textColor:"#ffffff"},array:{displayName:"Arrays & iteration",order:4,backgroundColor:"#236ac7",textColor:"#ffffff"},data:{displayName:"Data & objects",order:5,backgroundColor:"#b93171",textColor:"#ffffff"},io:{displayName:"I/O",order:6,backgroundColor:"#6e7a24",textColor:"#ffffff"},other:{displayName:"Other",order:7,backgroundColor:"#606e8a",textColor:"#ffffff"}},o={any:"Replace me",string:"Replace me",number:1,integer:1,boolean:!0,array:[],object:{},null:null},a="https://github.com/CarlosNZ/fig-tree-evaluator",l={and:{displayName:"Logical AND",docUrl:a,backgroundColor:"#d6d0f0",textColor:"#26183f",seeds:{values:[!0,!0]}},or:{displayName:"Logical OR",docUrl:a,backgroundColor:"#cabfeb",textColor:"#26183f",seeds:{values:[!0,!1]}},not:{displayName:"Logical NOT (!)",docUrl:a,backgroundColor:"#c0aee5",textColor:"#26183f",seeds:{value:!0}},if:{displayName:"Conditional (?)",docUrl:a,backgroundColor:"#ddd0f0",textColor:"#26183f",seeds:{condition:!0,then:"The condition is true",else:"The condition is false"}},match:{displayName:"Match",docUrl:a,backgroundColor:"#d4bfeb",textColor:"#26183f",seeds:{value:"matchMe",branches:{matchMe:"YES",nonMatch:"NO"},default:"No match"}},firstOf:{displayName:"First non-null",docUrl:a,backgroundColor:"#ccaee5",textColor:"#26183f",seeds:{values:[null,"The first non-null value"]}},equal:{displayName:"Equal (=)",docUrl:a,backgroundColor:"#d2efe9",textColor:"#183f3e",seeds:{values:["These are equal","These are equal"]}},notEqual:{displayName:"Not equal (!=)",docUrl:a,backgroundColor:"#c1e9e3",textColor:"#183f3e",seeds:{values:["These items","don't match"]}},greaterThan:{displayName:"Greater than (>)",docUrl:a,backgroundColor:"#b0e3e0",textColor:"#183f3e",seeds:{values:[10,9]}},greaterThanOrEqual:{displayName:"Greater than or equal (>=)",docUrl:a,backgroundColor:"#d2efef",textColor:"#183f3e",seeds:{values:[10,10]}},lessThan:{displayName:"Less than (<)",docUrl:a,backgroundColor:"#c1e6e9",textColor:"#183f3e",seeds:{values:[9,10]}},lessThanOrEqual:{displayName:"Less than or equal (<=)",docUrl:a,backgroundColor:"#b0dbe3",textColor:"#183f3e",seeds:{values:[9,9]}},plus:{displayName:"Plus (+)",docUrl:a,backgroundColor:"#d7edd4",textColor:"#193e1e",seeds:{values:[1,2,3]}},subtract:{displayName:"Subtract (-)",docUrl:a,backgroundColor:"#bfe4bc",textColor:"#193e1e",seeds:{value:10,minus:5}},multiply:{displayName:"Multiply (*)",docUrl:a,backgroundColor:"#b4e0b3",textColor:"#193e1e",seeds:{values:[5,5]}},divide:{displayName:"Divide (/)",docUrl:a,backgroundColor:"#cceacd",textColor:"#193e1e",seeds:{value:100,by:10}},modulo:{displayName:"Modulo",docUrl:a,backgroundColor:"#c3e7c6",textColor:"#193e1e",seeds:{value:10,mod:3}},power:{displayName:"Power (^)",docUrl:a,backgroundColor:"#acddb1",textColor:"#193e1e",seeds:{base:2,exponent:3}},round:{displayName:"Round",docUrl:a,backgroundColor:"#d4edd8",textColor:"#193e1e",seeds:{value:3.14159,decimals:2}},floor:{displayName:"Round down",docUrl:a,backgroundColor:"#bce4c4",textColor:"#193e1e",seeds:{value:2.7}},ceil:{displayName:"Round up",docUrl:a,backgroundColor:"#b3e0be",textColor:"#193e1e",seeds:{value:2.3}},abs:{displayName:"Absolute value",docUrl:a,backgroundColor:"#ccead5",textColor:"#193e1e",seeds:{value:-5}},min:{displayName:"Minimum",docUrl:a,backgroundColor:"#c3e7cf",textColor:"#193e1e",seeds:{values:[3,1,2]}},max:{displayName:"Maximum",docUrl:a,backgroundColor:"#acddbf",textColor:"#193e1e",seeds:{values:[3,1,2]}},buildString:{displayName:"String builder",docUrl:a,backgroundColor:"#f8d9c9",textColor:"#3f2f18",seeds:{template:"Hello {{$data.name}}"}},split:{displayName:"Split text",docUrl:a,backgroundColor:"#f5cbab",textColor:"#3f2f18",seeds:{value:"Alpha, Bravo, Charlie",delimiter:",",trim:!1}},join:{displayName:"Join text",docUrl:a,backgroundColor:"#f3cba0",textColor:"#3f2f18",seeds:{values:["Alpha","Bravo","Charlie"],delimiter:", "}},lower:{displayName:"Lower case",docUrl:a,backgroundColor:"#f7e1bf",textColor:"#3f2f18",seeds:{value:"Hello World"}},upper:{displayName:"Upper case",docUrl:a,backgroundColor:"#f6e1b4",textColor:"#3f2f18",seeds:{value:"Hello World"}},trim:{displayName:"Trim whitespace",docUrl:a,backgroundColor:"#f2dd97",textColor:"#3f2f18",seeds:{value:" Hello World "}},regex:{displayName:"Regular expression",docUrl:a,backgroundColor:"#f8f1c9",textColor:"#3f2f18",seeds:{value:"test-this",pattern:"^[a-z]{4}-[a-z]{4}$",flags:"i"}},length:{displayName:"Length",docUrl:a,backgroundColor:"#cde5f3",textColor:"#18293f",seeds:{value:[1,2,3,4,5]}},map:{displayName:"Map each",docUrl:a,backgroundColor:"#bbd7ef",textColor:"#18293f",seeds:{input:[1,2,3],each:"$element",as:"item"}},filter:{displayName:"Filter",docUrl:a,backgroundColor:"#a8c7eb",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"}},find:{displayName:"Find first",docUrl:a,backgroundColor:"#cddcf3",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"}},some:{displayName:"Any match",docUrl:a,backgroundColor:"#bbccef",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"}},every:{displayName:"All match",docUrl:a,backgroundColor:"#a8b9eb",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"}},get:{displayName:"Get data",docUrl:a,backgroundColor:"#f0d1e5",textColor:"#3f182a",seeds:{path:"path.to.value",from:{path:{to:{value:"Found it"}}},default:"Not found"}},buildObject:{displayName:"Build object",docUrl:a,backgroundColor:"#eac0cc",textColor:"#3f182a",seeds:{entries:[{key:"firstKey",value:"firstValue"},{key:"secondKey",value:"secondValue"}]}},convert:{displayName:"Convert type",docUrl:a,backgroundColor:"#dddfe3",textColor:"#272a30",seeds:{value:"42"}},http:{displayName:"HTTP request",docUrl:a,backgroundColor:"#eeedd2",textColor:"#3a3f18",seeds:{url:"https://restcountries.com/v3.1/name/zealand",returnPath:"[0].name.common",timeout:5e3}},graphQL:{displayName:"GraphQL query",docUrl:a,backgroundColor:"#e3e8c2",textColor:"#3a3f18",seeds:{query:'query getCountries {\n countries(filter: { continent: { eq: "OC" } }) {\n name\n }\n}',url:"https://countries.trevorblades.com/",returnPath:"countries[0].name",timeout:5e3}},sql:{displayName:"SQL query",docUrl:a,backgroundColor:"#d2e2b1",textColor:"#3a3f18",seeds:{query:"SELECT contact_name FROM customers LIMIT 5",timeout:5e3}},literal:{displayName:"Literal",docUrl:a,backgroundColor:"#d5dae4",textColor:"#272a30",seeds:{value:"No content inside a literal node is evaluated"}}};export{e as categoryHints,l as operatorHints,o as typeSeeds};
|