fig-tree-evaluator 3.0.0-preview.11 → 3.0.0-preview.12

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.
@@ -123,7 +123,7 @@ interface FragmentInfo {
123
123
  declare class FigTree<InstanceOpts extends FigTreeOptions = NoOptions> {
124
124
  private state;
125
125
  private readonly results;
126
- readonly version = "3.0.0-preview.11";
126
+ readonly version = "3.0.0-preview.12";
127
127
  constructor(options?: InstanceOpts);
128
128
  updateOptions(options?: OptionsUpdate): void;
129
129
  clearCache(): void;
@@ -1 +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"}},a={any:"Replace me",string:"Replace me",number:1,integer:1,boolean:!0,array:[],object:{},null:null},r="https://github.com/CarlosNZ/fig-tree-evaluator",t={and:{displayName:"Logical AND",description:"True when every value is truthy — operands run in parallel",docUrl:r,backgroundColor:"#d6d0f0",textColor:"#26183f",seeds:{values:[!0,!0]},parameterDescriptions:{values:"Operands, judged by FigTree truthiness; null is falsy"}},or:{displayName:"Logical OR",description:"True when any value is truthy — operands run in parallel",docUrl:r,backgroundColor:"#cabfeb",textColor:"#26183f",seeds:{values:[!0,!1]},parameterDescriptions:{values:"Operands, judged by FigTree truthiness; null is falsy"}},not:{displayName:"Logical NOT (!)",description:"Negate the truthiness of a value",docUrl:r,backgroundColor:"#c0aee5",textColor:"#26183f",seeds:{value:!0},parameterDescriptions:{value:"Judged by FigTree truthiness; null is falsy, so not(null) is true"}},if:{displayName:"Conditional (?)",description:"Choose between two branches — only the chosen branch evaluates",docUrl:r,backgroundColor:"#ddd0f0",textColor:"#26183f",seeds:{condition:!0,then:"The condition is true",else:"The condition is false"},parameterDescriptions:{condition:"Judged by FigTree truthiness; null is falsy",then:"The value when the condition holds",else:"The value when it does not; omitted means null"}},match:{displayName:"Match",description:"Dispatch on a value — only the matching branch evaluates",docUrl:r,backgroundColor:"#d4bfeb",textColor:"#26183f",seeds:{value:"matchMe",branches:{matchMe:"YES",nonMatch:"NO"},default:"No match"},parameterDescriptions:{value:"Matched against branch keys by its canonical string form",branches:"A literal map of branches, or an expression computing one",default:"The branch taken when none matches; absent means failure"}},firstOf:{displayName:"First non-null",description:"The first candidate that is not null (SQL COALESCE) — later candidates never evaluate",docUrl:r,backgroundColor:"#ccaee5",textColor:"#26183f",seeds:{values:[null,"The first non-null value"]},parameterDescriptions:{values:"Candidates, tried in order; only null is skipped"}},equal:{displayName:"Equal (=)",description:"Are all the values equal? Deep, structural, key-order-insensitive; a cross-type comparison is false",docUrl:r,backgroundColor:"#d2efe9",textColor:"#183f3e",seeds:{values:["These are equal","These are equal"]},parameterDescriptions:{values:"The values compared; null is comparable (null equals null)",caseInsensitive:"Fold string operands to one case before comparing (shallow)"}},notEqual:{displayName:"Not equal (!=)",description:'Are the values NOT all equal? The exact negation of equal (never "all distinct")',docUrl:r,backgroundColor:"#c1e9e3",textColor:"#183f3e",seeds:{values:["These items","don't match"]},parameterDescriptions:{values:"The values compared; null is comparable (null equals null)",caseInsensitive:"Fold string operands to one case before comparing (shallow)"}},greaterThan:{displayName:"Greater than (>)",description:"Is the first value strictly greater than the second?",docUrl:r,backgroundColor:"#b0e3e0",textColor:"#183f3e",seeds:{values:[10,9]},parameterDescriptions:{values:"Exactly two operands: both numbers, or both strings (codepoint order)",nullValueDefault:"Replaces a null operand before comparing"}},greaterThanOrEqual:{displayName:"Greater than or equal (>=)",description:"Is the first value greater than or equal to the second?",docUrl:r,backgroundColor:"#d2efef",textColor:"#183f3e",seeds:{values:[10,10]},parameterDescriptions:{values:"Exactly two operands: both numbers, or both strings (codepoint order)",nullValueDefault:"Replaces a null operand before comparing"}},lessThan:{displayName:"Less than (<)",description:"Is the first value strictly less than the second?",docUrl:r,backgroundColor:"#c1e6e9",textColor:"#183f3e",seeds:{values:[9,10]},parameterDescriptions:{values:"Exactly two operands: both numbers, or both strings (codepoint order)",nullValueDefault:"Replaces a null operand before comparing"}},lessThanOrEqual:{displayName:"Less than or equal (<=)",description:"Is the first value less than or equal to the second?",docUrl:r,backgroundColor:"#b0dbe3",textColor:"#183f3e",seeds:{values:[9,9]},parameterDescriptions:{values:"Exactly two operands: both numbers, or both strings (codepoint order)",nullValueDefault:"Replaces a null operand before comparing"}},plus:{displayName:"Plus (+)",description:"Add numbers, concatenate strings or arrays, or shallow-merge objects — all operands must share one type",docUrl:r,backgroundColor:"#d7edd4",textColor:"#193e1e",seeds:{values:[1,2,3]},parameterDescriptions:{values:"The operands; homogeneous: all numbers, strings, arrays or objects",expect:"Pin the mode: every operand must be this type, and an empty input yields its identity",nullValueDefault:"Replaces any null operand before the addition"}},subtract:{displayName:"Subtract (-)",description:"Subtract one number from another",docUrl:r,backgroundColor:"#bfe4bc",textColor:"#193e1e",seeds:{value:10,minus:5},parameterDescriptions:{value:"The main operand",minus:"The amount subtracted from value"}},multiply:{displayName:"Multiply (*)",description:"Multiply numbers together — an empty input is 1, the empty product",docUrl:r,backgroundColor:"#b4e0b3",textColor:"#193e1e",seeds:{values:[5,5]},parameterDescriptions:{values:"The factors",nullValueDefault:"Replaces any null factor before multiplying"}},divide:{displayName:"Divide (/)",description:"Divide one number by another — true division; zero divisors fail",docUrl:r,backgroundColor:"#cceacd",textColor:"#193e1e",seeds:{value:100,by:10},parameterDescriptions:{value:"The main operand",by:"The divisor"}},modulo:{displayName:"Modulo",description:"The floored remainder: the result takes the sign of mod, so modulo(-7, 3) is 2",docUrl:r,backgroundColor:"#c3e7c6",textColor:"#193e1e",seeds:{value:10,mod:3},parameterDescriptions:{value:"The main operand",mod:"The modulus"}},power:{displayName:"Power (^)",description:"Raise a base to an exponent — overflow and complex results fail",docUrl:r,backgroundColor:"#acddb1",textColor:"#193e1e",seeds:{base:2,exponent:3},parameterDescriptions:{base:"The number to raise",exponent:"The power to raise it to"}},round:{displayName:"Round",description:"Round to a number of decimal places — ties go half away from zero; negative decimals round to tens, hundreds, …",docUrl:r,backgroundColor:"#d4edd8",textColor:"#193e1e",seeds:{value:3.14159,decimals:2},parameterDescriptions:{value:"The number to round",decimals:"Decimal places to keep; negative values round to powers of ten"}},floor:{displayName:"Round down",description:"Round down toward negative infinity",docUrl:r,backgroundColor:"#bce4c4",textColor:"#193e1e",seeds:{value:2.7},parameterDescriptions:{value:"The number to round down"}},ceil:{displayName:"Round up",description:"Round up toward positive infinity",docUrl:r,backgroundColor:"#b3e0be",textColor:"#193e1e",seeds:{value:2.3},parameterDescriptions:{value:"The number to round up"}},abs:{displayName:"Absolute value",description:"The absolute value",docUrl:r,backgroundColor:"#ccead5",textColor:"#193e1e",seeds:{value:-5},parameterDescriptions:{value:"The number"}},min:{displayName:"Minimum",description:"The smallest of the values — numbers numerically, strings in codepoint order",docUrl:r,backgroundColor:"#c3e7cf",textColor:"#193e1e",seeds:{values:[3,1,2]},parameterDescriptions:{values:"The candidates: all numbers, or all strings (codepoint order)",nullValueDefault:"Replaces any null candidate before comparing"}},max:{displayName:"Maximum",description:"The largest of the values — numbers numerically, strings in codepoint order",docUrl:r,backgroundColor:"#acddbf",textColor:"#193e1e",seeds:{values:[3,1,2]},parameterDescriptions:{values:"The candidates: all numbers, or all strings (codepoint order)",nullValueDefault:"Replaces any null candidate before comparing"}},buildString:{displayName:"String builder",description:"Render a template, filling its tokens — the result is always a string",docUrl:r,backgroundColor:"#f8d9c9",textColor:"#3f2f18",seeds:{template:"Hello {{$data.name}}"},parameterDescriptions:{template:"The text, with %N or {{name}} tokens; in a literal template, {{$data.x}} is that reference",substitutions:"An array pairs with %N tokens, an object with {{name}} tokens; the mode dispatches on which arrives",trim:"Trim whitespace from each rendered value, never from the template text",closeGaps:"A value that renders empty also takes one run of adjacent template whitespace",nullValueDefault:'Rendered in place of a null value, instead of ""'}},split:{displayName:"Split text",description:"Divide a string on a delimiter into an array of pieces — empty pieces are kept; an empty delimiter splits into code points",docUrl:r,backgroundColor:"#f5cbab",textColor:"#3f2f18",seeds:{value:"Alpha, Bravo, Charlie",delimiter:",",trim:!1},parameterDescriptions:{value:"The string to divide",delimiter:'Split on each occurrence; "" splits into code points',trim:"Trim whitespace from each piece"}},join:{displayName:"Join text",description:"Render array elements to text and concatenate them with a delimiter",docUrl:r,backgroundColor:"#f3cba0",textColor:"#3f2f18",seeds:{values:["Alpha","Bravo","Charlie"],delimiter:", "},parameterDescriptions:{values:'Elements of any type, rendered by the stringification table; a null renders "" and still occupies its slot',delimiter:"Placed between each adjacent pair — shares its contract with split",nullValueDefault:'Rendered in place of a null element, instead of ""'}},lower:{displayName:"Lower case",description:"Lowercase a string — Unicode default case mapping, locale-independent",docUrl:r,backgroundColor:"#f7e1bf",textColor:"#3f2f18",seeds:{value:"Hello World"},parameterDescriptions:{value:"The string to lowercase"}},upper:{displayName:"Upper case",description:"Uppercase a string — Unicode default case mapping, locale-independent",docUrl:r,backgroundColor:"#f6e1b4",textColor:"#3f2f18",seeds:{value:"Hello World"},parameterDescriptions:{value:"The string to uppercase"}},trim:{displayName:"Trim whitespace",description:"Strip whitespace (the JS trim set) from both ends of a string",docUrl:r,backgroundColor:"#f2dd97",textColor:"#3f2f18",seeds:{value:" Hello World "},parameterDescriptions:{value:"The string to trim"}},regex:{displayName:"Regular expression",description:"Test, extract or match a string against a regular expression",docUrl:r,backgroundColor:"#f8f1c9",textColor:"#3f2f18",seeds:{value:"test-this",pattern:"^[a-z]{4}-[a-z]{4}$",flags:"i"},parameterDescriptions:{value:"The subject string",pattern:"The regular expression source",flags:"The admitted subset: i, m, s, u",mode:"test gives a boolean, extract the first matching substring, match every one of them",noMatchDefault:"The extract answer when nothing matches — a matched empty string still passes through"}},length:{displayName:"Length",description:"An array's element count, or a string's Unicode code-point count",docUrl:r,backgroundColor:"#cde5f3",textColor:"#18293f",seeds:{value:[1,2,3,4,5]},parameterDescriptions:{value:"The array or string measured"}},map:{displayName:"Map each",description:"Transform every element of an array",docUrl:r,backgroundColor:"#bbd7ef",textColor:"#18293f",seeds:{input:[1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"Evaluated per element, with $element and $index bound"}},filter:{displayName:"Filter",description:"Keep the elements of an array whose predicate is truthy",docUrl:r,backgroundColor:"#a8c7eb",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"The predicate, per element — a truthiness position, so null is falsy"}},find:{displayName:"Find first",description:"The first element of an array whose predicate is truthy",docUrl:r,backgroundColor:"#cddcf3",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"The predicate, per element — a truthiness position, so null is falsy",noMatchDefault:"The answer when nothing matches; a found null passes through unchanged"}},some:{displayName:"Any match",description:"True when any element satisfies the predicate",docUrl:r,backgroundColor:"#bbccef",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"The predicate, per element — a truthiness position, so null is falsy"}},every:{displayName:"All match",description:"True when every element satisfies the predicate",docUrl:r,backgroundColor:"#a8b9eb",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"The predicate, per element — a truthiness position, so null is falsy"}},get:{displayName:"Get data",description:"Read a path out of the evaluation data, or out of a supplied object — the dynamic face of a $data reference",docUrl:r,backgroundColor:"#f0d1e5",textColor:"#3f182a",seeds:{path:"path.to.value",from:{path:{to:{value:"Found it"}}},default:"Not found"},parameterDescriptions:{path:"Dot and bracket segments, quoted keys and the [*] projection — or an array of segments, taken verbatim",from:"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:"The answer when the path is missing — a stored null passes through unchanged (firstOf replaces one); supplying it also opts out of strictDataPaths"}},buildObject:{displayName:"Build object",description:"Assemble an object from computed key/value entries — for keys known only at runtime",docUrl:r,backgroundColor:"#eac0cc",textColor:"#3f182a",seeds:{entries:[{key:"firstKey",value:"firstValue"},{key:"secondKey",value:"secondValue"}]},parameterDescriptions:{entries:'Objects with a "key" and a "value"; a null value keeps its key'}},convert:{displayName:"Convert type",description:"Convert a value to a number, string, boolean or array — strict: a failed conversion is an error, never a guess",docUrl:r,backgroundColor:"#dddfe3",textColor:"#272a30",seeds:{value:"42"},parameterDescriptions:{value:"The value to convert; null propagates except for boolean, where it is false",to:"The target type"}},http:{displayName:"HTTP request",description:"One HTTP request — GET or POST — returning the parsed JSON response",docUrl:r,backgroundColor:"#eeedd2",textColor:"#3a3f18",seeds:{url:"https://restcountries.com/v3.1/name/zealand",returnPath:"[0].name.common",timeout:5e3},parameterDescriptions:{url:"A full http(s) URL is used verbatim; anything else — including an empty string — joins http.baseEndpoint",method:"Lowercase; the mutating verbs are deliberately absent — an expression is a read",query:"Query-string pairs; a null value omits its pair, a composite one is an error",body:"The JSON payload; a whole-null body means NO body, while nulls inside one are JSON nulls",headers:"Merged over the http.headers option per key; a null value removes an inherited pair",returnPath:"Dot/bracket path or segments array applied to the response; a miss is null",timeout:"Per-request deadline in ms; expiry is an ordinary failure this node’s fallback catches"}},graphQL:{displayName:"GraphQL query",description:"One GraphQL query — a POST of { query, variables } — returning the data field",docUrl:r,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},parameterDescriptions:{query:"The GraphQL document — the protocol’s own word, as sql.query is",variables:"Query variables; a null value is CARRIED as JSON null, a nullable argument being meaningful GraphQL",url:"Per-node endpoint override; unset means the graphQL.endpoint option",headers:"Merged over http.headers then graphQL.headers; a null value removes a pair",returnPath:"Dot/bracket path or segments array applied to the response; a miss is null",timeout:"Per-request deadline in ms; expiry is an ordinary failure this node’s fallback catches"}},sql:{displayName:"SQL query",description:"One SQL query against the registered connection. Expressions are READS — give the connection a read-only role and run mutations host-side",docUrl:r,backgroundColor:"#d2e2b1",textColor:"#3a3f18",seeds:{query:"SELECT contact_name FROM customers LIMIT 5",timeout:5e3},parameterDescriptions:{query:"SQL text with the driver’s own placeholders — FigTree never parses SQL",values:"Bind values — positional as an array, named as an object; a null binds SQL NULL",shape:"rows: every row object; firstRow: the first; column: one column’s values; firstValue: one scalar",noRowDefault:"The answer when firstRow / firstValue find no row — never for rows / column, never on failure",timeout:"Per-request deadline in ms; expiry is an ordinary failure this node’s fallback catches"}},literal:{displayName:"Literal",docUrl:r,backgroundColor:"#d5dae4",textColor:"#272a30",seeds:{value:"No content inside a literal node is evaluated"}}},o=(e,a)=>void 0!==e&&Object.hasOwn(e,a)?e[a]:void 0,s=e=>void 0!==e.backgroundColor&&void 0!==e.textColor?{backgroundColor:e.backgroundColor,textColor:e.textColor}:void 0,n=(e,r,t)=>void 0!==e.seeds&&Object.hasOwn(e.seeds,r)?e.seeds[r]:"string"==typeof t?a[t]:"literal"in t?t.literal[0]:a[t.find(e=>"null"!==e)??"null"],l=(a,...r)=>({categories:Object.entries(e).map(([e,a])=>({name:e,...a})).sort((e,a)=>e.order-a.order),operators:a.getOperators().map(({name:a,parameters:l,...i})=>{const d=(e=>{for(let a=r.length-1;a>=0;a--){const t=o(r[a],e);if(void 0!==t)return t}return o(t,e)??{}})(a),c={name:a,displayName:d.displayName??a,...i,...s(d)??s(e[i.category]),parameters:{}};void 0!==d.description&&(c.description=d.description),void 0!==d.docUrl&&(c.docUrl=d.docUrl);for(const[e,a]of Object.entries(l)){const r={...a,seed:n(d,e,a.type)},t=o(d.parameterDescriptions,e);void 0!==t&&(r.description=t),c.parameters[e]=r}return c}),fragments:a.getFragments().map(({name:e,parameters:a,...r})=>{const t=r.metadata??{},o={name:e,displayName:t.displayName??e,...r,...s(t),parameters:{}};void 0!==t.docUrl&&(o.docUrl=t.docUrl);for(const[e,r]of Object.entries(a))o.parameters[e]={...r,seed:n(t,e,r.type)};return o})});export{e as categoryListings,l as getCatalog,t as operatorListings,a as typeSeeds};
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"}},a={any:"Replace me",string:"Replace me",number:1,integer:1,boolean:!0,array:[],object:{},null:null},r="https://github.com/CarlosNZ/fig-tree-evaluator",t={and:{displayName:"Logical AND",description:"True when every value is truthy — operands run in parallel",docUrl:r,backgroundColor:"#d6d0f0",textColor:"#26183f",seeds:{values:[!0,!0]},parameterDescriptions:{values:"Operands, judged by FigTree truthiness; null is falsy"}},or:{displayName:"Logical OR",description:"True when any value is truthy — operands run in parallel",docUrl:r,backgroundColor:"#cabfeb",textColor:"#26183f",seeds:{values:[!0,!1]},parameterDescriptions:{values:"Operands, judged by FigTree truthiness; null is falsy"}},not:{displayName:"Logical NOT (!)",description:"Negate the truthiness of a value",docUrl:r,backgroundColor:"#c0aee5",textColor:"#26183f",seeds:{value:!0},parameterDescriptions:{value:"Judged by FigTree truthiness; null is falsy, so not(null) is true"}},if:{displayName:"Conditional (?)",description:"Choose between two branches — only the chosen branch evaluates",docUrl:r,backgroundColor:"#ddd0f0",textColor:"#26183f",seeds:{condition:!0,then:"The condition is true",else:"The condition is false"},parameterDescriptions:{condition:"Judged by FigTree truthiness; null is falsy",then:"The value when the condition holds",else:"The value when it does not; omitted means null"}},match:{displayName:"Match",description:"Dispatch on a value — only the matching branch evaluates",docUrl:r,backgroundColor:"#d4bfeb",textColor:"#26183f",seeds:{value:"matchMe",branches:{matchMe:"YES",nonMatch:"NO"},default:"No match"},parameterDescriptions:{value:"Matched against branch keys by its canonical string form",branches:"A literal map of branches, or an expression computing one",default:"The branch taken when none matches; absent means failure"}},firstOf:{displayName:"First non-null",description:"The first candidate that is not null (SQL COALESCE) — later candidates never evaluate",docUrl:r,backgroundColor:"#ccaee5",textColor:"#26183f",seeds:{values:[null,"The first non-null value"]},parameterDescriptions:{values:"Candidates, tried in order; only null is skipped"}},equal:{displayName:"Equal (=)",description:"Are all the values equal? Deep, structural, key-order-insensitive; a cross-type comparison is false",docUrl:r,backgroundColor:"#d2efe9",textColor:"#183f3e",seeds:{values:["These are equal","These are equal"]},parameterDescriptions:{values:"The values compared; null is comparable (null equals null)",caseInsensitive:"Fold string operands to one case before comparing (shallow)"}},notEqual:{displayName:"Not equal (!=)",description:'Are the values NOT all equal? The exact negation of equal (never "all distinct")',docUrl:r,backgroundColor:"#c1e9e3",textColor:"#183f3e",seeds:{values:["These items","don't match"]},parameterDescriptions:{values:"The values compared; null is comparable (null equals null)",caseInsensitive:"Fold string operands to one case before comparing (shallow)"}},greaterThan:{displayName:"Greater than (>)",description:"Is the first value strictly greater than the second?",docUrl:r,backgroundColor:"#b0e3e0",textColor:"#183f3e",seeds:{values:[10,9]},parameterDescriptions:{values:"Exactly two operands: both numbers, or both strings (codepoint order)",nullValueDefault:"Replaces a null operand before comparing"}},greaterThanOrEqual:{displayName:"Greater than or equal (>=)",description:"Is the first value greater than or equal to the second?",docUrl:r,backgroundColor:"#d2efef",textColor:"#183f3e",seeds:{values:[10,10]},parameterDescriptions:{values:"Exactly two operands: both numbers, or both strings (codepoint order)",nullValueDefault:"Replaces a null operand before comparing"}},lessThan:{displayName:"Less than (<)",description:"Is the first value strictly less than the second?",docUrl:r,backgroundColor:"#c1e6e9",textColor:"#183f3e",seeds:{values:[9,10]},parameterDescriptions:{values:"Exactly two operands: both numbers, or both strings (codepoint order)",nullValueDefault:"Replaces a null operand before comparing"}},lessThanOrEqual:{displayName:"Less than or equal (<=)",description:"Is the first value less than or equal to the second?",docUrl:r,backgroundColor:"#b0dbe3",textColor:"#183f3e",seeds:{values:[9,9]},parameterDescriptions:{values:"Exactly two operands: both numbers, or both strings (codepoint order)",nullValueDefault:"Replaces a null operand before comparing"}},plus:{displayName:"Plus (+)",description:"Add numbers, concatenate strings or arrays, or shallow-merge objects — all operands must share one type",docUrl:r,backgroundColor:"#d7edd4",textColor:"#193e1e",seeds:{values:[1,2,3]},parameterDescriptions:{values:"The operands; homogeneous: all numbers, strings, arrays or objects",expect:"Pin the mode: every operand must be this type, and an empty input yields its identity",nullValueDefault:"Replaces any null operand before the addition"}},subtract:{displayName:"Subtract (-)",description:"Subtract one number from another",docUrl:r,backgroundColor:"#bfe4bc",textColor:"#193e1e",seeds:{value:10,minus:5},parameterDescriptions:{value:"The main operand",minus:"The amount subtracted from value"}},multiply:{displayName:"Multiply (*)",description:"Multiply numbers together — an empty input is 1, the empty product",docUrl:r,backgroundColor:"#b4e0b3",textColor:"#193e1e",seeds:{values:[5,5]},parameterDescriptions:{values:"The factors",nullValueDefault:"Replaces any null factor before multiplying"}},divide:{displayName:"Divide (/)",description:"Divide one number by another — true division; zero divisors fail",docUrl:r,backgroundColor:"#cceacd",textColor:"#193e1e",seeds:{value:100,by:10},parameterDescriptions:{value:"The main operand",by:"The divisor"}},modulo:{displayName:"Modulo",description:"The floored remainder: the result takes the sign of mod, so modulo(-7, 3) is 2",docUrl:r,backgroundColor:"#c3e7c6",textColor:"#193e1e",seeds:{value:10,mod:3},parameterDescriptions:{value:"The main operand",mod:"The modulus"}},power:{displayName:"Power (^)",description:"Raise a base to an exponent — overflow and complex results fail",docUrl:r,backgroundColor:"#acddb1",textColor:"#193e1e",seeds:{base:2,exponent:3},parameterDescriptions:{base:"The number to raise",exponent:"The power to raise it to"}},round:{displayName:"Round",description:"Round to a number of decimal places — ties go half away from zero; negative decimals round to tens, hundreds, …",docUrl:r,backgroundColor:"#d4edd8",textColor:"#193e1e",seeds:{value:3.14159,decimals:2},parameterDescriptions:{value:"The number to round",decimals:"Decimal places to keep; negative values round to powers of ten"}},floor:{displayName:"Round down",description:"Round down toward negative infinity",docUrl:r,backgroundColor:"#bce4c4",textColor:"#193e1e",seeds:{value:2.7},parameterDescriptions:{value:"The number to round down"}},ceil:{displayName:"Round up",description:"Round up toward positive infinity",docUrl:r,backgroundColor:"#b3e0be",textColor:"#193e1e",seeds:{value:2.3},parameterDescriptions:{value:"The number to round up"}},abs:{displayName:"Absolute value",description:"The absolute value",docUrl:r,backgroundColor:"#ccead5",textColor:"#193e1e",seeds:{value:-5},parameterDescriptions:{value:"The number"}},min:{displayName:"Minimum",description:"The smallest of the values — numbers numerically, strings in codepoint order",docUrl:r,backgroundColor:"#c3e7cf",textColor:"#193e1e",seeds:{values:[3,1,2]},parameterDescriptions:{values:"The candidates: all numbers, or all strings (codepoint order)",nullValueDefault:"Replaces any null candidate before comparing"}},max:{displayName:"Maximum",description:"The largest of the values — numbers numerically, strings in codepoint order",docUrl:r,backgroundColor:"#acddbf",textColor:"#193e1e",seeds:{values:[3,1,2]},parameterDescriptions:{values:"The candidates: all numbers, or all strings (codepoint order)",nullValueDefault:"Replaces any null candidate before comparing"}},buildString:{displayName:"String builder",description:"Render a template, filling its tokens — the result is always a string",docUrl:r,backgroundColor:"#f8d9c9",textColor:"#3f2f18",seeds:{template:"Hello {{$data.name}}"},parameterDescriptions:{template:"The text, with %N or {{name}} tokens; in a literal template, {{$data.x}} is that reference",substitutions:"An array pairs with %N tokens, an object with {{name}} tokens; the mode dispatches on which arrives",trim:"Trim whitespace from each rendered value, never from the template text",closeGaps:"A value that renders empty also takes one run of adjacent template whitespace",nullValueDefault:'Rendered in place of a null value, instead of ""'}},split:{displayName:"Split text",description:"Divide a string on a delimiter into an array of pieces — empty pieces are kept; an empty delimiter splits into code points",docUrl:r,backgroundColor:"#f5cbab",textColor:"#3f2f18",seeds:{value:"Alpha, Bravo, Charlie",delimiter:",",trim:!1},parameterDescriptions:{value:"The string to divide",delimiter:'Split on each occurrence; "" splits into code points',trim:"Trim whitespace from each piece"}},join:{displayName:"Join text",description:"Render array elements to text and concatenate them with a delimiter",docUrl:r,backgroundColor:"#f3cba0",textColor:"#3f2f18",seeds:{values:["Alpha","Bravo","Charlie"],delimiter:", "},parameterDescriptions:{values:'Elements of any type, rendered by the stringification table; a null renders "" and still occupies its slot',delimiter:"Placed between each adjacent pair — shares its contract with split",nullValueDefault:'Rendered in place of a null element, instead of ""'}},lower:{displayName:"Lower case",description:"Lowercase a string — Unicode default case mapping, locale-independent",docUrl:r,backgroundColor:"#f7e1bf",textColor:"#3f2f18",seeds:{value:"Hello World"},parameterDescriptions:{value:"The string to lowercase"}},upper:{displayName:"Upper case",description:"Uppercase a string — Unicode default case mapping, locale-independent",docUrl:r,backgroundColor:"#f6e1b4",textColor:"#3f2f18",seeds:{value:"Hello World"},parameterDescriptions:{value:"The string to uppercase"}},trim:{displayName:"Trim whitespace",description:"Strip whitespace (the JS trim set) from both ends of a string",docUrl:r,backgroundColor:"#f2dd97",textColor:"#3f2f18",seeds:{value:" Hello World "},parameterDescriptions:{value:"The string to trim"}},regex:{displayName:"Regular expression",description:"Test, extract or match a string against a regular expression",docUrl:r,backgroundColor:"#f8f1c9",textColor:"#3f2f18",seeds:{value:"test-this",pattern:"^[a-z]{4}-[a-z]{4}$",flags:"i"},parameterDescriptions:{value:"The subject string",pattern:"The regular expression source",flags:"The admitted subset: i, m, s, u",mode:"test gives a boolean, extract the first matching substring, match every one of them",noMatchDefault:"The extract answer when nothing matches — a matched empty string still passes through"}},length:{displayName:"Length",description:"An array's element count, or a string's Unicode code-point count",docUrl:r,backgroundColor:"#cde5f3",textColor:"#18293f",seeds:{value:[1,2,3,4,5]},parameterDescriptions:{value:"The array or string measured"}},map:{displayName:"Map each",description:"Transform every element of an array",docUrl:r,backgroundColor:"#bbd7ef",textColor:"#18293f",seeds:{input:[1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"Evaluated per element, with $element and $index bound"}},filter:{displayName:"Filter",description:"Keep the elements of an array whose predicate is truthy",docUrl:r,backgroundColor:"#a8c7eb",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"The predicate, per element — a truthiness position, so null is falsy"}},find:{displayName:"Find first",description:"The first element of an array whose predicate is truthy",docUrl:r,backgroundColor:"#cddcf3",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"The predicate, per element — a truthiness position, so null is falsy",noMatchDefault:"The answer when nothing matches; a found null passes through unchanged"}},some:{displayName:"Any match",description:"True when any element satisfies the predicate",docUrl:r,backgroundColor:"#bbccef",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"The predicate, per element — a truthiness position, so null is falsy"}},every:{displayName:"All match",description:"True when every element satisfies the predicate",docUrl:r,backgroundColor:"#a8b9eb",textColor:"#18293f",seeds:{input:[0,1,2,3],each:"$element",as:"item"},parameterDescriptions:{input:"The collection iterated over; a null input is a type error",as:"Rename the bindings: as: 'row' binds $row and $rowIndex",nullInputDefault:"Used as the collection when input evaluates to null — typically []",each:"The predicate, per element — a truthiness position, so null is falsy"}},get:{displayName:"Get data",description:"Read a path out of the evaluation data, or out of a supplied object — the dynamic face of a $data reference",docUrl:r,backgroundColor:"#f0d1e5",textColor:"#3f182a",seeds:{path:"path.to.value",from:{path:{to:{value:"Found it"}}},default:"Not found"},parameterDescriptions:{path:"Dot and bracket segments, quoted keys and the [*] projection — or an array of segments, taken verbatim",from:"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:"The answer when the path is missing — a stored null passes through unchanged (firstOf replaces one); supplying it also opts out of strictDataPaths"}},buildObject:{displayName:"Build object",description:"Assemble an object from computed key/value entries — for keys known only at runtime",docUrl:r,backgroundColor:"#eac0cc",textColor:"#3f182a",seeds:{entries:[{key:"firstKey",value:"firstValue"},{key:"secondKey",value:"secondValue"}]},parameterDescriptions:{entries:'Objects with a "key" and a "value"; a null value keeps its key'}},convert:{displayName:"Convert type",description:"Convert a value to a number, string, boolean or array — strict: a failed conversion is an error, never a guess",docUrl:r,backgroundColor:"#dddfe3",textColor:"#272a30",seeds:{value:"42"},parameterDescriptions:{value:"The value to convert; null propagates except for boolean, where it is false",to:"The target type"}},http:{displayName:"HTTP request",description:"One HTTP request — GET or POST — returning the parsed JSON response",docUrl:r,backgroundColor:"#eeedd2",textColor:"#3a3f18",seeds:{url:"https://restcountries.com/v3.1/name/zealand",returnPath:"[0].name.common",timeout:5e3},parameterDescriptions:{url:"A full http(s) URL is used verbatim; anything else — including an empty string — joins http.baseEndpoint",method:"Lowercase; the mutating verbs are deliberately absent — an expression is a read",query:"Query-string pairs; a null value omits its pair, a composite one is an error",body:"The JSON payload; a whole-null body means NO body, while nulls inside one are JSON nulls",headers:"Merged over the http.headers option per key; a null value removes an inherited pair",returnPath:"Dot/bracket path or segments array applied to the response; a miss is null",timeout:"Per-request deadline in ms; expiry is an ordinary failure this node’s fallback catches"}},graphQL:{displayName:"GraphQL query",description:"One GraphQL query — a POST of { query, variables } — returning the data field",docUrl:r,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},parameterDescriptions:{query:"The GraphQL document — the protocol’s own word, as sql.query is",variables:"Query variables; a null value is CARRIED as JSON null, a nullable argument being meaningful GraphQL",url:"Per-node endpoint override; unset means the graphQL.endpoint option",headers:"Merged over http.headers then graphQL.headers; a null value removes a pair",returnPath:"Dot/bracket path or segments array applied to the response; a miss is null",timeout:"Per-request deadline in ms; expiry is an ordinary failure this node’s fallback catches"}},sql:{displayName:"SQL query",description:"One SQL query against the registered connection. Expressions are READS — give the connection a read-only role and run mutations host-side",docUrl:r,backgroundColor:"#d2e2b1",textColor:"#3a3f18",seeds:{query:"SELECT contact_name FROM customers LIMIT 5",timeout:5e3},parameterDescriptions:{query:"SQL text with the driver’s own placeholders — FigTree never parses SQL",values:"Bind values — positional as an array, named as an object; a null binds SQL NULL",shape:"rows: every row object; firstRow: the first; column: one column’s values; firstValue: one scalar",noRowDefault:"The answer when firstRow / firstValue find no row — never for rows / column, never on failure",timeout:"Per-request deadline in ms; expiry is an ordinary failure this node’s fallback catches"}},literal:{displayName:"Literal",docUrl:r,backgroundColor:"#d5dae4",textColor:"#272a30",seeds:{value:"No content inside a literal node is evaluated"}}},o=(e,a)=>void 0!==e&&Object.hasOwn(e,a)?e[a]:void 0,s=e=>void 0!==e.backgroundColor&&void 0!==e.textColor?{backgroundColor:e.backgroundColor,textColor:e.textColor}:void 0,n=(e,r,t)=>void 0!==e.seeds&&Object.hasOwn(e.seeds,r)?e.seeds[r]:"string"==typeof t?a[t]:"literal"in t?t.literal[0]:a[t.find(e=>"null"!==e)??"null"],l=(e,a)=>{for(const[r,t]of Object.entries(a??{}))void 0!==t&&(e[r]=t)},i=(a,...r)=>({categories:Object.entries(e).map(([e,a])=>({name:e,...a})).sort((e,a)=>e.order-a.order),operators:a.getOperators().map(({name:a,parameters:i,...d})=>{const c=(e=>{const a={seeds:{},parameterDescriptions:{}};for(const n of[t,...r]){const r=o(n,e);if(void 0!==r){for(const e of["displayName","description","docUrl"]){const t=r[e];void 0!==t&&(a[e]=t)}Object.assign(a,s(r)),l(a.seeds,r.seeds),l(a.parameterDescriptions,r.parameterDescriptions)}}return a})(a),u={name:a,displayName:c.displayName??a,...d,...s(c)??s(e[d.category]),parameters:{}};void 0!==c.description&&(u.description=c.description),void 0!==c.docUrl&&(u.docUrl=c.docUrl);for(const[e,a]of Object.entries(i)){const r={...a,seed:n(c,e,a.type)},t=o(c.parameterDescriptions,e);void 0!==t&&(r.description=t),u.parameters[e]=r}return u}),fragments:a.getFragments().map(({name:e,parameters:a,...r})=>{const t=r.metadata??{},o={name:e,displayName:t.displayName??e,...r,...s(t),parameters:{}};void 0!==t.docUrl&&(o.docUrl=t.docUrl);for(const[e,r]of Object.entries(a))o.parameters[e]={...r,seed:n(t,e,r.type)};return o})});export{e as categoryListings,i as getCatalog,t as operatorListings,a as typeSeeds};
@@ -1 +1 @@
1
- import{F as e,i as t,l as r,f as a,d as n,D as o,E as s,g as i,c as l,o as c,q as u,h as d,S as f,e as p,p as m,s as h,j as v,n as y,u as g,v as b,k,w,x as $,r as x,t as j,b as O,m as A,R as P,a as D,W as C,y as N,G as S}from"./shared.js";const z=(t,r,a)=>{const[n]=r,o=r.length-1;return new e({code:t,message:o>0?`${n.message} (+ ${o} more issue${1===o?"":"s"})`:n.message,path:n.path,operator:a,issues:r})},E=()=>{},M=e=>"object"==typeof e&&null!==e&&"function"==typeof e.then,q=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),F=(e,t,r)=>{if(e===t)return 0;const a=e.length,n=t.length;if(Math.abs(a-n)>r)return r+1;let o=new Array(n+1),s=new Array(n+1);for(let e=0;e<=n;e++)o[e]=e;for(let i=1;i<=a;i++){s[0]=i;let a=i;const l=e.charCodeAt(i-1);for(let e=1;e<=n;e++){const r=o[e-1]+(l===t.charCodeAt(e-1)?0:1),n=Math.min(o[e]+1,s[e-1]+1,r);s[e]=n,n<a&&(a=n)}if(a>r)return r+1;const c=o;o=s,s=c}return o[n]},T=(e,t)=>{let r,a=3;for(const n of t){const t=F(e,n,a-1);if(t<a&&(r=n,a=t,0===t))break}return r},V=e=>e?` — did you mean '${e}'?`:"",I=e=>e.length<2?e.join(""):`${e.slice(0,-1).join(", ")} and ${e[e.length-1]}`,R=e=>{let t;return()=>(void 0===t&&(t=(async()=>e())()),t)},L=(e,t,r)=>{const a=[],n=new Set,o=new Set,s=e=>{const i=a.indexOf(e);if(-1!==i){const e=a.slice(i),t=[...e].sort().join("\0");return void(o.has(t)||(o.add(t),r(e)))}if(!n.has(e)){a.push(e);for(const r of t(e)??[])s(r);a.pop(),n.add(e)}};for(const t of e)s(t);return 0===o.size},W={ok:!0},B=e=>null===e?"null":Array.isArray(e)?"array":typeof e,J=(e,t)=>({ok:!1,expected:e,actual:B(t)}),U=(e,t)=>{switch(t){case"any":return!0;case"string":return"string"==typeof e;case"number":return"number"==typeof e;case"integer":return"number"==typeof e&&Number.isInteger(e);case"boolean":return"boolean"==typeof e;case"array":return Array.isArray(e);case"object":return q(e);case"null":return null===e;default:return!1}},G=e=>"null"===e||"any"===e||!!Array.isArray(e)&&(e.includes("null")||e.includes("any")),K=e=>!e.required&&!G(e.type),_=/*#__PURE__*/new Set(["any","string","number","boolean","array","object","null","integer"]),H=e=>{if("string"==typeof e)return _.has(e);if(Array.isArray(e))return e.length>0&&e.every(e=>"string"==typeof e&&_.has(e));if(q(e)&&"literal"in e){const t=e.literal;return Array.isArray(t)&&t.length>0&&t.every(e=>["string","number","boolean"].includes(typeof e))}return!1},Q=(e,r)=>{if(t(r)){if(-1!==r.literal.indexOf(e))return W;const t=r.literal.map(e=>JSON.stringify(e)).join(", ");return J(`one of ${t}`,e)}return"string"==typeof r?U(e,r)?W:J(r,e):r.some(t=>U(e,t))?W:J(r.join(" | "),e)},X=(e,t)=>{if(void 0!==t.length){if(!Array.isArray(e))return J("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 J("array",e);const r=t.homogeneous;if(e.length>0){if(void 0===r.find(t=>e.every(e=>U(e,t))))return{ok:!1,expected:`homogeneous array of ${r.join(" | ")}`,actual:Y(e)}}}if(t.elementShape){if(!Array.isArray(e))return J("array",e);for(let r=0;r<e.length;r++){const a=te(e[r],t.elementShape);if(!a.ok)return a}}return W},Y=e=>{const t=B(e[0]),r=e.find(e=>B(e)!==t);return void 0===r?`array of ${t}`:`${B(r)} beside ${t}`},Z=["length","homogeneous","elementShape"],ee=e=>{if(!q(e))return J("a constraints object",e);for(const t of Object.keys(e))if(!Z.includes(t))return{ok:!1,expected:`one of ${Z.join(", ")}`,actual:t};const{length:t,homogeneous:r,elementShape:a}=e;if(void 0!==t&&(!Number.isInteger(t)||t<0))return J("a non-negative integer length",t);if(!(void 0===r||Array.isArray(r)&&H(r)))return J("a non-empty array of basic types",r);if(void 0!==a){if(!q(a))return J("an object of declarations",a);for(const[e,t]of Object.entries(a)){if(!q(t))return J(`a declaration for "${e}"`,t);if(void 0!==t.type&&!H(t.type))return J(`a vocabulary type for "${e}"`,t.type);if(void 0!==t.required&&"boolean"!=typeof t.required)return J(`a boolean "required" for "${e}"`,t.required);if(void 0!==t.constraints){const e=ee(t.constraints);if(!e.ok)return e}}}return W},te=(e,t)=>{if(!q(e))return J("object",e);const r=Object.keys(t);for(let a=0;a<r.length;a++){const n=r[a],o=t[n],s=Object.prototype.hasOwnProperty.call(e,n),i=!1!==o.required;if(!s){if(i)return{ok:!1,expected:`property "${n}"`,actual:"missing"};continue}const l=ne(e[n],o);if(!l.ok)return l}return W},re=(e,t,r)=>{if(!r||!Array.isArray(e))return X(e,t);const{length:a,...n}=t;if(void 0!==a){const t=X(e,{length:a});if(!t.ok)return t}return X(e.filter(e=>null!==e),n)},ae=(e,t)=>null===e||void 0===t.constraints?W:re(e,t.constraints,void 0!==t.elementNullPolicy),ne=(e,t)=>{if(void 0!==t.type){const r=Q(e,t.type);if(!r.ok)return r}return ae(e,t)},oe=["logic","comparison","math","string","array","data","io","other"],se=Symbol("fig-tree:EvaluationData"),ie=Symbol("fig-tree:validated-operator"),le=e=>"object"==typeof e&&null!==e&&!0===e[ie],ce=[!1,null,0,""],ue=e=>-1===ce.indexOf(e),de=(e,t)=>"number"==typeof e&&"number"==typeof t?e<t?-1:e>t?1:0:fe(String(e),String(t)),fe=(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},pe="<array>",me="<object>",he=e=>null===e?"":"string"==typeof e?e:"number"==typeof e?String(e):"boolean"==typeof e?e?"true":"false":Array.isArray(e)?pe:me,ve=e=>null!==e&&"object"==typeof e,ye="a composite element renders as a placeholder, never as text — drill in, or join it explicitly",ge=e=>e.trim(),be=/\s+$/,ke=/^\s+/,we=e=>e.replace(be,""),$e=e=>e.replace(ke,""),xe=e=>Array.from(e),je=(e,t)=>{const[r,a]=String(e).split("e"),n=void 0!==a?Number(a)+t:t;return Number(`${r}e${n}`)},Oe=Object.prototype.hasOwnProperty,Ae=(e,t)=>{for(const r of e.keys())if(Pe(r,t))return r},Pe=(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--&&Pe(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=Ae(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=Ae(t,n),!n))return!1;if(!Pe(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(Oe.call(e,r)&&++a&&!Oe.call(t,r))return!1;if(!(r in t)||!Pe(e[r],t[r]))return!1}return Object.keys(t).length===a}}return e!=e&&t!=t},De=e=>!e.includes("{")&&!e.includes("}")&&(e.startsWith("$")?e.length>1:r(e).ok),Ce=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(De(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},Ne=e=>{const t={maxDepth:0};return{constant:ze(t,e,0),depth:t.maxDepth}},Se=e=>{const t={maxDepth:0};if(ze(t,e,0,[]))return void 0===t.reads?{value:e}:{value:e,reads:t.reads}},ze=(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(!ze(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(!ze(e,t[a],r+1,s&&[...s,a]))return!1;return!0}return!0},Ee=(e,t)=>({parent:e,key:t}),Me=e=>{const t=[];for(let r=e;null!==r;r=r.parent)t.push(r.key);return t.reverse()},qe=e=>{switch(e.kind){case"constant":case"reference":case"invalid":return[];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),...Object.values(e.vars??{})];case"operator":case"fragmentCall":{const t="operator"===e.kind?Object.values(e.params):void 0===e.parameters?[]:"dynamic"===e.argumentsMode?[e.parameters]:Object.values(e.parameters);return void 0!==e.fallback&&t.push(e.fallback),[...t,...Object.values(e.vars??{})]}}return e},Fe=e=>{e.sort((e,t)=>e.order-t.order)},Te=(e,t,r,a,n,o,s={})=>{const i={severity:t,code:r,message:a,path:Me(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);const l={issue:i,order:o};return e.push(l),l},Ve=e=>e.some(({issue:e})=>"error"===e.severity),Ie=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},Re=(e,t,r)=>void 0===r?null===e:("element"===t?e:`${e??""}Index`)===r,Le=(e,t,r)=>{"__proto__"===t?Object.defineProperty(e,t,{value:r,writable:!0,enumerable:!0,configurable:!0}):e[t]=r},We=(e,t,r)=>{const a=new Set;let n=e;return t.forEach((e,t)=>{n=Be(n,e.at,r[t],a)}),n},Be=(e,t,r,a)=>{const n=Je(e,a),[o,...s]=t;return Le(n,o,0===s.length?r:Be(n[o],s,r,a)),n},Je=(e,t)=>{if(t.has(e))return e;const r=Array.isArray(e)?[...e]:{...e};return t.add(r),r},Ue=(e,t,r={})=>{const a={registry:t,recognizes:e=>((e,t)=>"literal"===t||void 0!==Yr(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(Ee,null),o=He(a,e,n,0);Ke(a);const s=Rt(o);Fe(a.issues);const i=Ve(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,...Ge(l,a.fragmentCalls,t.fragments),fragmentCalls:a.fragmentCalls,dataReads:a.dataReads,hasNoCache:a.hasNoCache}},Ge=(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]}}},Ke=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`})},_e=(e,t,r,a,n,o,s)=>Te(e.issues,t,r,a,n,o,s),He=(e,t,r,a)=>{const n=e.order++;if(a>e.maxDepth&&(e.maxDepth=a),a>o)return _e(e,"error",s.depthCeiling,`the expression nests deeper than the engine's ceiling of ${o} levels — descent stopped here`,r,n),e.nodeCount++,Ye(t,r,n);const i=Qe(e,t,r,a,n);return"operator"!==i.kind&&"fragmentCall"!==i.kind&&"reference"!==i.kind&&"invalid"!==i.kind||e.nodeCount++,i},Qe=(e,t,r,a,o)=>null==t?Xe(t??null,r,o):"number"==typeof t||"boolean"==typeof t?Xe(t,r,o):"string"==typeof t?Ze(e,t,r,o):Array.isArray(t)?tt(e,t,r,a,o):n(t)?rt(e,t,r,a,o):(e.identityOnly=!0,Xe(t,r,o)),Xe=(e,t,r)=>({kind:"constant",value:e,path:t,order:r}),Ye=(e,t,r)=>({kind:"invalid",raw:e,path:t,order:r}),Ze=(e,t,r,n)=>{const o=a(t,e.scope);switch(o.kind){case"plain":return Xe(t,r,n);case"unrecognized":{const a=_e(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}),Xe(t,r,n)}case"invalid":return _e(e,"error",o.code??s.invalidReference,`'${t}': ${o.reason}`,r,n),Ye(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:vt(e,s,i.startsWith(".")?i.slice(1):void 0,r)),e.unknownNodes>0&&et(a)&&(c.scopeUnknown=!0),c}}},et=e=>"element"===e||"index"===e||"error"===e,tt=(e,t,r,a,n)=>{const o=kt(e,t,r,0,a);return It(e,t,o,!0,!1,void 0,r,n)},rt=(e,t,r,a,n)=>{const o=l(t,e.recognizes);switch(o.kind){case"malformed":return _e(e,"error",s.malformedNode,o.message,r,n),Ye(t,r,n);case"operator":return at(e,t,r,a,n);case"fragment":return St(e,t,r,a,n);case"shorthand":return jt(e,t,o.key,r,a,n);case"plain":return Ft(e,t,r,a,n)}},at=(e,t,r,a,n)=>{const o=t.operator;if("string"!=typeof o)return nt(e,t,"operator",r,n);if("literal"===o)return Nt(e,t,t.value,"value"in t,r,n);const i=Yr(e.registry,o);if(void 0===i){const a=T(o,Ut(e));return _e(e,"error",s.unknownOperator,`'${o}' names no registered operator${V(a)}`,r,n,{suggestion:a}),Ye(t,r,n)}const l=ot(e,i,r,n),c=[];return st(e,l,t,"operator",a,(t,a)=>{"parameters"===t?_e(e,"error",s.malformedNode,"'parameters' is reserved and unused on operator nodes",Ee(r,t),n,{operator:l.name}):lt(e,l,c,t,a,Ee(r,t),n)}),ct(e,l,c,a,n),l},nt=(e,t,r,a,n)=>(_e(e,"error",s.malformedNode,`the '${r}' value must be a literal string`,a,n),Ye(t,a,n)),ot=(e,t,r,a)=>(e.operators.add(t.definition.name),{kind:"operator",name:t.definition.name,entry:t,params:{},path:r,order:a}),st=(e,t,r,a,n,o)=>{const{path:s,order:i}=t;for(const l in r){const c=r[l];l!==a&&"//"!==l&&void 0!==c&&("fallback"===l?t.fallback=He(e,c,Ee(s,l),n+1):"noCache"===l?it(e,t,c,s,i):"vars"===l?t.vars=qt(e,c,s,n,i):o?.(l,c))}},it=(e,t,r,a,n)=>{!0===r?(t.noCache=!0,e.hasNoCache=!0):_e(e,"error",s.malformedNode,"'noCache' takes only the literal true — it is settled before the subtree runs",Ee(a,"noCache"),n,"operator"===t.kind?{operator:t.name}:{})},lt=(e,t,r,a,n,o,i)=>{if(void 0===t.entry.definition.parameters[a]){const r=T(a,Object.keys(t.entry.definition.parameters));return void _e(e,"error",s.unknownNodeKey,`'${a}' is not a parameter of '${t.name}'${V(r)}`,o,i,{operator:t.name,parameter:a,suggestion:r})}r.push({name:a,kind:"value",value:n,path:o})},ct=(e,t,r,a,n)=>{const o=t.entry.definition,s=o.resolution.perElement.length>0;let i;if("get"===t.name&&ut(e,t,r),s&&"structural"===o.parameters.as?.evaluation){const a=r.find(e=>"as"===e.name);"value"===a?.kind&&(i=xt(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]=gt(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]=gt(e,n,r,a))}void 0!==i&&e.scope.bindings.pop()}yt(e,t),ft(e,t)},ut=(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=v(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?dt(e,i.value):null;if(null===l||"value"!==i?.kind){if("vars"!==o)return;const i=e.order++;return _e(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=Ye(n.value,n.path,i))}const[c,...u]=l;n.value=y(o,[c]),i.value=Array.isArray(i.value)?u:d(u)},dt=(e,t)=>{const r=t=>{if("string"!=typeof t)return w(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}},ft=(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(ve)&&_e(e,"error",s.operatorValidate,ye,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=>Ce(e).filter(e=>"text"!==e.kind))(r.value);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};const a=new Set(Object.keys(t));for(const e of r)a.add(String(e.at[0]));return{mode:"object",keys:a}}return{mode:"dynamic"}})(o);if(mt(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=Ze(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=pt(e,t,o,l))},pt=(e,t,r,a)=>"skeleton"===r?.kind?(r.holes.push(...a),r):{kind:"skeleton",skeleton:"constant"===r?.kind?r.value:{},holes:a,path:r?.path??Ee(t.path,"substitutions"),order:r?.order??e.order++},mt=(e,t,r,a,n)=>{const o=(a,n)=>_e(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}${ht(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,ht(r))}},ht=e=>0===e.length?"":1===e.length?`, and substitution ${e[0]} is unused`:`, and substitutions ${I(e)} are unused`,vt=(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})},yt=(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(w))return void(e.dynamic=!0);if(0===a.length)return void(e.dynamic=!0);vt(e,a,"string"==typeof r.value?r.value:void 0,t.path)}catch{e.dynamic=!0}else e.dynamic=!0},gt=(e,t,r,a)=>{const n="lazyElements"===r||"race"===r;if("slice"===t.kind)return wt(e,t.elements,t.basePath,t.offset,a,n);if(n&&Array.isArray(t.value))return wt(e,t.value,t.path,0,a,!0);if("lazyEntries"===r){const r=$t(e,t,a);if(null!==r)return r}return He(e,t.value,t.path,a+1)},bt=(e,t)=>{const r=e.order++,a=t+1;return a>e.maxDepth&&(e.maxDepth=a),{order:r,containerDepth:a}},kt=(e,t,r,a,n)=>Array.from(t,(t,o)=>({key:o,rawChild:t,node:He(e,t,Ee(r,a+o),n+1)})),wt=(e,t,r,a,n,o)=>{const{order:s,containerDepth:i}=bt(e,n),l=kt(e,t,r,a,i);if(o&&!l.every(e=>"constant"===e.node.kind)){return{kind:"elements",nodes:l.map(e=>e.node),path:r,order:s}}return It(e,t,l,!0,!1,void 0,r,s)},$t=(e,t,r)=>{const a=t.value;if(!n(a)||p(a,e.recognizes))return null;const{order:o,containerDepth:s}=bt(e,r),{entries:i,vars:l,changed:c}=Tt(e,a,t.path,s,o,!0);if(i.every(e=>"constant"===e.node.kind))return It(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},xt=(e,t,n,o,i)=>{const l=r=>{_e(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,$(n)];for(const t of u){if(void 0!==g(t))return l(`'${n}' collides with the reserved namespace word '${t}'`);if(null!==b(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},jt=(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&&!f.has(n))return _e(e,"error",s.malformedNode,`'${n}' may not sit beside the shorthand key '${r}' — reserved modifiers only`,Ee(a,n),o),Ye(t,a,o);const u=t[r],d=Ee(a,r);if(l)return Nt(e,t,u,!0,a,o);if(c)return zt(e,t,i,u,a,n,o);const p=Yr(e.registry,i),m=ot(e,p,a,o);st(e,m,t,r,n);const h=[];return Ot(e,m,h,u,d,o),ct(e,m,h,n,o),m},Ot=(e,t,r,a,o,s)=>{if(Array.isArray(a))Pt(e,t,r,a,o,s);else if(!n(a)||p(a,e.recognizes))At(e,t,r,a,o,s);else for(const n in a){const i=a[n];"//"!==n&&void 0!==i&&lt(e,t,r,n,i,Ee(o,n),s)}},At=(e,t,r,a,n,o)=>{const s=h(t.entry.definition);null!==s?r.push({name:s,kind:"value",value:a,path:n}):Dt(e,t,n,o)},Pt=(e,t,r,a,n,o)=>{const s=t.entry.definition,i=m(s,a.length);if(null===i)return void Ct(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:Ee(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})},Dt=(e,t,r,a)=>_e(e,"error",s.positionalArity,`'${t.name}' takes no positional arguments — use the named form`,r,a,{operator:t.name}),Ct=(e,t,r,a,n)=>{const o=t.entry.definition.positionalParams;if(void 0===o)return void Dt(e,t,a,n);const i=o.length;_e(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})},Nt=(e,t,r,a,n,o)=>{for(const r in t)"operator"!==r&&"value"!==r&&"//"!==r&&"$literal"!==r&&("fallback"===r||"vars"===r||"noCache"===r?_e(e,"warning",s.uselessModifier,`'${r}' on 'literal' is dead — contents are never evaluated`,Ee(n,r),o):_e(e,"error",s.unknownNodeKey,`'${r}' is not a key of 'literal' — content goes in 'value'`,Ee(n,r),o,{operator:"literal"}));return a?Xe(r,n,o):(_e(e,"error",s.malformedNode,"'literal' requires its content in 'value'",n,o,{operator:"literal"}),Ye(t,n,o))},St=(e,t,r,a,n)=>{const o=t.fragment;if("string"!=typeof o)return nt(e,t,"fragment",r,n);const i=Et(e,o,r,a,n);return st(e,i,t,"fragment",a,(t,o)=>{"parameters"===t?Mt(e,i,o,Ee(r,t),a,n):_e(e,"error",s.unknownNodeKey,`'${t}' is not a key of a fragment call — arguments live only in 'parameters'`,Ee(r,t),n)}),i},zt=(e,t,r,a,o,i,l)=>{const c=Et(e,r,o,i,l);return st(e,c,t,`$${r}`,i),n(a)?Mt(e,c,a,Ee(o,`$${r}`),i,l):_e(e,"error",s.malformedNode,`fragments have no single-value or positional form — '$${r}' takes a named-arguments object`,Ee(o,`$${r}`),l),c},Et=(e,t,r,a,n)=>{const o={kind:"fragmentCall",name:t,argumentsMode:"static",path:r,order:n};e.fragmentNames.add(t);const i=e.registry.fragments.get(t);if(void 0===i){const a=T(t,e.registry.fragments.keys());return _e(e,"error",s.unknownFragment,`'${t}' names no registered fragment${V(a)}`,r,n,{suggestion:a}),o}return o.entry=i,e.fragmentCalls.push({name:t,depth:a}),e.dataReads.push({kind:"call",fragment:i,path:r}),o},Mt=(e,t,r,o,i,l)=>{if(p(r,e.recognizes)||"string"==typeof r&&"reference"===a(r,e.scope).kind)return t.argumentsMode="dynamic",t.parameters=He(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]=He(e,n,Ee(o,t),i+1))}return void(t.parameters=a)}_e(e,"error",s.malformedNode,"a fragment's 'parameters' must be a named-arguments object or a node computing one",o,l)},qt=(e,t,a,o,i)=>{const l=Ee(a,"vars");if(!n(t))return void _e(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=Ee(l,a),d=r(a);d.ok?c[a]=He(e,n,u,o+1):_e(e,"error",s.invalidName,`'${a}' is not a legal var name — ${d.reason}`,u,i)}return c},Ft=(e,t,r,a,n)=>{const{entries:o,vars:s,changed:i}=Tt(e,t,r,a,n);return It(e,t,o,!1,i,s,r,n)},Tt=(e,t,r,a,n,o=!1)=>{let i,l=!1;const c=[],u=!o&&Vt(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=T(u.slice(1),Ut(e)),a=void 0!==t?V(`$${t}`):o?"":" — data with a '$' key goes inside 'literal'";_e(e,o?"warning":"error",s.unrecognizedIdentifier,`'${u}' is not a registered operator or fragment${o?", so it is a plain key":""}${a}`,Ee(r,u),n,{suggestion:void 0===t?void 0:`$${t}`})}c.push({key:u,rawChild:d,node:He(e,d,Ee(r,u),a+1)})}else l=!0;else i=qt(e,d,r,a,n),l=!0;else l=!0}return u&&e.unknownNodes--,{entries:c,vars:i,changed:l}},Vt=e=>{for(const t in e)if(t.startsWith("$")&&void 0!==e[t])return!0;return!1},It=(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}):(Le(u,e,a.skeleton),c.push(...a.holes.map(t=>({...t,at:[e,...t.at]}))))):(Le(u,e,a.value),a.value!==t&&(d=!0));if(0===c.length)return void 0!==o&&Object.keys(o).length>0&&_e(e,"warning",s.unreferencedVar,"this vars block declares names nothing in its scope references",Ee(i,"vars"),l),Xe(d||void 0!==o?u:t,i,l);const f={kind:"skeleton",skeleton:u,holes:c,path:i,order:l};return void 0!==o&&(f.vars=o),f},Rt=(e,t=[])=>{if("skeleton"===e.kind)for(const r of e.holes)Rt(r.node,t);else if("constant"!==e.kind){const r=Lt(e);t.push(void 0===r?{node:e}:{node:e,timeoutFallback:r})}return t},Lt=e=>{if("operator"===e.kind||"fragmentCall"===e.kind)return void 0!==e.fallback?Wt(e.fallback):"operator"===e.kind?e.entry.defaultFallback:e.entry?.timeoutFallback},Wt=e=>{if("constant"===e.kind)return{value:e.value};const t=[],r=Bt(e,[],t);return void 0===r?void 0:{value:r,reads:t}},Bt=(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=Bt(n.node,[...t,...n.at],r);if(void 0===e)return;a.push(e)}return We(e.skeleton,e.holes,a)},Jt=new WeakMap,Ut=e=>{const t=Jt.get(e.registry);if(void 0!==t)return t;const r=[...e.registry.operators.keys(),...e.registry.aliases.keys(),...e.registry.fragments.keys()];return Jt.set(e.registry,r),r},Gt=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 Kt(e.value);default:return"any"}},Kt=e=>{if(null===e)return"null";if(Array.isArray(e))return"array";if(q(e))return"object";switch(typeof e){case"string":return"string";case"number":return"number";case"boolean":return"boolean";default:return"any"}},_t=/*#__PURE__*/Object.freeze({parsePath:k,resolvePath:x,checkType:Q,checkConstraints:X,describeType:B,renderText:he,isTruthy:ue}),Ht=(e,t={})=>{Xt({artifact:e,context:t,varsFrames:[],iteratorFrames:[],fallbackFrames:[]},e.root),Fe(e.issues),e.hasErrors=Ve(e.issues)},Qt=(e,t,r,a,n,o,s)=>{Te(e.artifact.issues,t,r,a,n,o,s)},Xt=(e,t)=>{switch(t.kind){case"constant":case"invalid":return;case"reference":return void pr(e,t);case"skeleton":{const r=gr(e,t.vars,t.path);for(const r of t.holes)Xt(e,r.node);return void br(e,r)}case"fragmentCall":return void dr(e,t);case"elements":for(const r of t.nodes)Xt(e,r);return;case"entries":{const r=gr(e,t.vars,t.path);for(const r in t.entries)Xt(e,t.entries[r]);return void br(e,r)}case"operator":return void Zt(e,t)}return t},Yt=(e,t,r)=>{const a={referenced:!1};e.fallbackFrames.push(a),Xt(e,r),e.fallbackFrames.pop(),a.referenced&&(t.fallbackReadsError=!0)},Zt=(e,t)=>{const r=gr(e,t.vars,t.path);void 0!==t.fallback&&Yt(e,t,t.fallback);const a=t.entry.definition,n=ur(t);for(const[r,o]of a.resolution.entries){const a=t.params[r];void 0!==a?tr(e,n,r,o,a,er(t,r)):o.required&&Qt(e,"error",s.missingRequired,`'${t.name}' requires '${r}'`,t.path,t.order,{operator:t.name,parameter:r})}fr(e,t);const o=[];for(const r in t.params){const n=t.params[r];"perElement"===a.parameters[r]?.evaluation?o.push([r,n]):Xt(e,n)}if(o.length>0){const r={as:Ie(t),referenced:!1};e.iteratorFrames.push(r);for(const[,t]of o)Xt(e,t);e.iteratorFrames.pop(),r.referenced||Qt(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})}br(e,r)},er=(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},tr=(e,t,r,a,n,o=!1)=>{const i={...t.extra,parameter:r};if("elements"===n.kind){const o=a.constraints?.length;return void(void 0!==o&&n.nodes.length!==o&&Qt(e,"error",s.typeCheck,`'${t.label}.${r}': expected ${o} element${1===o?"":"s"}, received ${n.nodes.length}`,n.path,n.order,i))}if("constant"!==n.kind&&"structural"===a.evaluation&&"as"!==r)return void Qt(e,"error",s.typeCheck,`'${t.label}.${r}' is structural — it requires a literal value`,n.path,n.order,i);const l=`'${t.label}.${r}'`,c=ar(a,n,o);void 0!==c&&Qt(e,"error",c.code,c.code===s.returnsMismatch?`${c.reason} — it can never satisfy ${l}`:`${l}: ${c.reason}`,n.path,n.order,i);let u=n;for(;"operator"===u.kind||"fragmentCall"===u.kind;){const n=u.fallback;if(void 0===n)return void("operator"===u.kind&&rr(e,t,r,a,u,o));const c=ar(a,n,o);void 0!==c&&Qt(e,"warning",s.fallbackMismatch,`this fallback can never satisfy ${l}: ${c.reason}`,n.path,n.order,i),u=n}},rr=(e,t,r,a,n,o)=>{const i=n.entry.defaultFallback;if(void 0===i)return;const l=nr(a,i,o);void 0!==l&&Qt(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})},ar=(e,t,r)=>{switch(t.kind){case"constant":return cr(e,t.value,r);case"operator":case"fragmentCall":{if("fragmentCall"===t.kind&&void 0===t.entry)return;const r=Gt(t);if(j(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 sr(e,Array.isArray(t.skeleton)?[]:{});case"reference":return"error"===t.namespace?or(e,t.segments):void 0;default:return}},nr=(e,{value:t,reads:r},a)=>void 0===r?cr(e,t,a):0===r[0].at.length?or(e,r[0].segments):sr(e,Array.isArray(t)?[]:{}),or=(e,t)=>{const r=lr(t);if(void 0!==r&&!j(r,e.type))return sr(e,ir[r])},sr=(e,t)=>{const r=Q(t,e.type);if(!r.ok)return{code:s.typeCheck,reason:`expected ${r.expected}, received ${r.actual}`}},ir={object:{},array:[],string:"",number:0,boolean:!1},lr=e=>{const[t,...r]=e;if(void 0===t)return"object";if(r.length>0||!Object.hasOwn(O,t))return;const a=O[t];return"string"==typeof a?a:void 0},cr=(e,t,r)=>{if(null===t&&(r||K(e)))return;const a=ne(t,e);return a.ok?void 0:{code:s.typeCheck,reason:`expected ${a.expected}, received ${a.actual}`}},ur=e=>({label:e.name,extra:{operator:e.name}}),dr=(e,t)=>{const r=gr(e,t.vars,t.path);void 0!==t.fallback&&Yt(e,t,t.fallback);const a=t.entry?.parameters,n="static"===t.argumentsMode?t.parameters:void 0;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?tr(e,r,o,i,l):i.required&&Qt(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=T(r,Object.keys(a));Qt(e,"error",s.unknownNodeKey,`fragment '${t.name}' declares no parameter '${r}'${V(n)}`,o.path,o.order,{parameter:r,suggestion:n})}}}if(void 0!==n)for(const t in n)Xt(e,n[t]);else void 0!==t.parameters&&Xt(e,t.parameters);br(e,r)},fr=(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,_t)}catch(r){return void Qt(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;Qt(e,r.severity,s.operatorValidate,r.message,a?.path??t.path,t.order,{operator:t.name,parameter:r.parameter})}},pr=(e,t)=>{const{namespace:r}=t;switch(r){case"data":return;case"vars":return void mr(e,t);case"params":return void hr(e,t);case"element":case"index":return void vr(e,t,r);case"error":return void yr(e,t)}return r},mr=(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}}Qt(e,"error",s.unresolvedVar,`'${t.raw}': no var '${a??""}' is declared in scope`,t.path,t.order)},hr=(e,t)=>{const r=e.context.fragmentParams;if(void 0===r)return void Qt(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)||Qt(e,"error",s.unresolvedParam,`'${t.raw}': the fragment declares no parameter '${String(a)}'`,t.path,t.order)},vr=(e,t,r)=>{for(let a=e.iteratorFrames.length-1;a>=0;a--){const n=e.iteratorFrames[a];if(Re(n.as,r,t.binding))return void(n.referenced=!0)}t.scopeUnknown||Qt(e,"error",s.unresolvedBinding,`'${t.raw}' resolves against no enclosing iterator here`,t.path,t.order)},yr=(e,t)=>{const r=e.fallbackFrames.at(-1);void 0===r?t.scopeUnknown||Qt(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},gr=(e,t,r)=>{if(void 0===t)return null;const a={names:new Map,currentVar:null,edges:new Map},n=Ee(r,"vars");for(const r in t){const o=t[r],i=Ee(n,r);for(const t of e.varsFrames)if(t.names.has(r)){Qt(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,Xt(e,r.node),a.currentVar=null;return a},br=(e,t)=>{if(null!==t){e.varsFrames.pop();for(const[r,a]of t.names)a.referenced||Qt(e,"warning",s.unreferencedVar,`'${r}' is declared but never referenced in its scope`,a.declaredAt,a.order);kr(e,t)}},kr=(e,t)=>{const r=new Map([...t.names.keys()].map((e,t)=>[e,t]));L(t.names.keys(),e=>t.edges.get(e),a=>{const n=a.sort((e,t)=>r.get(e)-r.get(t)),o=n.map(e=>`'${e}'`),i=1===o.length?`${o[0]} depends on itself`:`${I(o)} form a vars cycle — a var may not depend on itself`,l=t.names.get(n[0]);Qt(e,"error",s.varCycle,i,l.declaredAt,l.order)})},wr={capable:!1,effective:!1,disabled:[]},$r={capable:!0,effective:!0,disabled:[]},xr=e=>{const{effective:t}=jr(e,e.root,!1);return Fe(e.issues),t},jr=(e,t,r)=>{switch(t.kind){case"constant":case"reference":return wr;case"invalid":return $r;case"skeleton":case"elements":case"entries":return Dr(e,qe(t),r);case"operator":return Or(e,t,_r(t.entry),r);case"fragmentCall":return Or(e,t,t.entry?.caches??!0,r)}return t},Or=(e,t,r,a)=>{const n=!0===t.noCache,o=Dr(e,qe(t),a||n),s=r||o.capable,i=Ar(t),l=void 0===i?o.disabled:[i,...o.disabled];return n&&a?Cr(e,t,"'noCache' is redundant — an enclosing node already sets it"):n&&!s&&Cr(e,t,l.length>0?`'noCache' is redundant — caching is already disabled for ${Pr(l)}`:"'noCache' is dead — nothing beneath this node caches"),{capable:s,effective:!n&&(r||o.effective),disabled:l}},Ar=e=>"operator"===e.kind&&e.entry.definition.cache&&!_r(e.entry)?e.entry.definition.name:void 0,Pr=e=>I([...new Set(e)].map(e=>`'${e}'`)),Dr=(e,t,r)=>{const a={capable:!1,effective:!1,disabled:[]};for(const n of t){const{capable:t,effective:o,disabled:s}=jr(e,n,r);a.capable||=t,a.effective||=o,a.disabled.push(...s)}return a},Cr=(e,t,r)=>{Te(e.issues,"warning",s.uselessModifier,r,Ee(t.path,"noCache"),t.order,"operator"===t.kind?{operator:t.name}:{fragment:t.name})};class Nr{max;entries=new Map;constructor(e){this.max=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(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 Sr=Symbol("fig-tree:lazy-handle"),zr="~",Er=(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=Er(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=Er(e[r],t+1);if("json"!==a)return a}return"json"},Mr=(e,t)=>qr(e,0,t)?t.join(""):void 0,qr=(e,t,r)=>{if(t>o)return!1;if(null===e)return Tr(r,"n");if(void 0===e)return Tr(r,"u");switch(typeof e){case"boolean":return Tr(r,e?"t":"f");case"number":return Fr(e,r);case"string":return Tr(r,`s${e.length}:${e}`);case"object":break;default:return!1}if(Array.isArray(e)){r.push("[");for(const a of e)if(!qr(a,t+1,r))return!1;return Tr(r,"]")}if(!n(e)||Sr in e)return!1;r.push("{");for(const a in e)if(r.push(`s${a.length}:${a}`),!qr(e[a],t+1,r))return!1;return Tr(r,"}")},Fr=(e,t)=>Number.isNaN(e)?Tr(t,"N"):e===1/0?Tr(t,"I"):e===-1/0?Tr(t,"J"):Object.is(e,-0)?Tr(t,"#-0"):Tr(t,`#${String(e)}`),Tr=(e,t)=>(e.push(t),!0);class Vr{deps;identity=new WeakMap;content=new Nr(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=Er(e,0);return"json"===t?JSON.stringify(e):"serializer"===t?Mr(e,[zr]):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 Ir=/*#__PURE__*/new Set(["type","required","default","description","metadata","constraints"]),Rr=/*#__PURE__*/new Set(["expression","parameters","description","metadata"]),Lr=(e,t,a)=>{const n=(...t)=>["fragments",e,...t],o=r(e);if(!o.ok)return void a(s.invalidName,`'${e}' is not a legal fragment name: ${o.reason}`,n());if(A(e))return void a(s.reservedName,`'${e}' is a reserved name and may not name a fragment`,n());if(!q(t))return void a(s.invalidDefinition,`fragment '${e}' must be a wrapper object: { expression, parameters?, description?, metadata? }`,n());if(!("expression"in t))return void a(s.invalidDefinition,`fragment '${e}' has no 'expression'`,n());for(const e of Object.keys(t))Rr.has(e)||a(s.invalidDefinition,`'${e}' is not a key of a fragment definition`,n(e));const i={name:e,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!==t.description&&("string"!=typeof t.description?a(s.invalidDefinition,"'description' must be a string",n("description")):i.description=t.description),void 0!==t.metadata&&(q(t.metadata)?i.metadata=t.metadata:a(s.invalidDefinition,"'metadata' must be a plain object",n("metadata"))),void 0!==t.parameters)if(q(t.parameters))for(const[e,r]of Object.entries(t.parameters)){const t=Wr(e,r,n,a);void 0!==t&&(i.parameters[e]=t)}else a(s.invalidDefinition,"'parameters' must be a plain object",n("parameters"));return i},Wr=(e,t,a,n)=>{const o=a("parameters",e),i=r(e);if(!i.ok)return void n(s.invalidName,`'${e}' is not a legal parameter name: ${i.reason}`,o);if(P.has(e))return void n(s.reservedName,`'${e}' is a reserved node key and may not name a parameter`,o);if(!q(t))return void n(s.invalidDefinition,`the declaration of '${e}' must be an object`,o);for(const e of Object.keys(t))Ir.has(e)||n(s.invalidDefinition,`'${e}' is not a key of a parameter declaration`,[...o,e]);const l=t.type??"any";if(!H(l))return void n(s.invalidDefinition,`'${e}' declares an unknown type`,[...o,"type"]);if(void 0!==t.required&&"boolean"!=typeof t.required)return void n(s.invalidDefinition,"'required' must be a boolean",[...o,"required"]);let c;if(void 0!==t.constraints){const r=ee(t.constraints);if(!r.ok)return void n(s.invalidDefinition,`'${e}' declares invalid constraints: expected ${r.expected}, got ${r.actual}`,[...o,"constraints"]);c=t.constraints}const u="default"in t;if(u&&!0===t.required)return void n(s.invalidDefinition,`'${e}' is declared required and also declares a default — the default could never apply`,[...o,"default"]);if(u){const r=Q(t.default,l);if(!r.ok)return void n(s.typeCheck,`the default for '${e}' does not satisfy its declared type: expected ${r.expected}, got ${r.actual}`,[...o,"default"]);const a=ae(t.default,{constraints:c});if(!a.ok)return void n(s.typeCheck,`the default for '${e}' violates its declared constraints: expected ${a.expected}, got ${a.actual}`,[...o,"default"])}const d={type:l,required:t.required??!u};return u&&(d.default=t.default),"string"==typeof t.description&&(d.description=t.description),q(t.metadata)&&(d.metadata=t.metadata),void 0!==c&&(d.constraints=c),d},Br=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=Gt(n),t.delete(e.name),r.add(e.name)};for(const t of e.fragments.values())a(t)},Jr=(e,t)=>L(e.keys(),t=>e.get(t)?.fragmentCalls.map(e=>e.name),([e,...r])=>t(s.fragmentCycle,`fragment '${e}' reaches itself: ${[e,...r,e].join(" → ")} — recursion is not supported`,["fragments",e])),Ur=(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=Ge(s.own,s.fragmentCalls,e.fragments);o.nodeCount=i.nodeCount,o.maxDepth=i.maxDepth,o.dependencies=i.dependencies,o.identityOnly=i.identityOnly,o.caches=xr(s),o.timeoutFallback=Gr(n,s,e.fragments)};for(const e of t.keys())a(e)},Gr=(e,t,r)=>{const{root:a,holes:n}=t;if(0===n.length)return;const o=[];for(const e of n){const t=Kr(e,r);if(void 0===t)return;o.push(t)}const s=[];let i=0;const l=(t,r)=>{if("skeleton"===t.kind)return We(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:Me(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}},Kr=(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},_r=e=>e.definition.cache&&!0!==e.hostDefaults?.noCache,Hr=["fallback","noCache"],Qr=e=>{const t=[],r=(e,r,a,n)=>{t.push({severity:"error",code:e,message:r,path:a,...void 0!==n?{operator:n}:{}})},a={operators:new Map,aliases:new Map,fragments:new Map},{operators:n,aliases:o}=a,i=new Map,l=(e,t,a)=>{const n=i.get(e);return void 0!==n?(r(s.duplicateOperator,`'${e}' is already registered (by '${n}') — one namespace, no silent precedence`,t,a),!1):(i.set(e,a),!0)},c=(e,t)=>{if("function"==typeof e)return void r(s.invalidOptions,`operators[${t[1]}]${t.length>2?`[${t[2]}]`:""} is a function — factories must be called: httpOperators(client)`,t);if(!le(e))return void r(s.invalidOptions,"every operators entry must be built with defineOperator() — a plain definition object is not accepted",t);const{name:a,alias:i}=e,c=l(a,t,a),u=void 0===i||l(i,t,a);c&&u&&(n.set(a,{definition:e}),void 0!==i&&o.set(i,a))};if(Array.isArray(e.operators)?e.operators.forEach((e,t)=>{Array.isArray(e)?e.forEach((e,a)=>{Array.isArray(e)?r(s.invalidOptions,"'operators' is flattened one level only — arrays may not nest deeper",["operators",t,a]):c(e,["operators",t,a])}):c(e,["operators",t])}):r(s.invalidOptions,"'operators' must be an array",["operators"]),void 0!==e.operatorDefaults&&Xr(e.operatorDefaults,n,o,r),((e,t,r,a)=>{if(void 0===e)return;if(!q(e))return void a(s.invalidOptions,"'fragments' must be a plain object",["fragments"]);for(const[n,o]of Object.entries(e)){const e=Lr(n,o,a);void 0!==e&&r(n,["fragments",n])&&t.fragments.set(n,e)}const n=new Map;for(const[r,a]of t.fragments){const o=e[r],s=Ue(o.expression,t,{basePath:["expression"]});a.body=s.root,n.set(r,s)}Br(t);for(const[e,r]of t.fragments){const t=n.get(e);Ht(t,{fragmentParams:new Set(Object.keys(r.parameters))});for(const{issue:r}of t.issues)"error"===r.severity&&a(r.code,`fragment '${e}': ${r.message}`,["fragments",e,...r.path])}Jr(n,a)&&Ur(t,n);for(const[e,r]of t.fragments)for(const{issue:t}of n.get(e).issues)if("error"!==t.severity){const e={...t,path:[...t.path]};Object.freeze(e.path),r.warnings.push(Object.freeze(e))}})(e.fragments,a,(e,t)=>l(e,t,e),r),t.length>0)throw z(s.invalidOptions,t,t[0].operator);return a},Xr=(e,t,r,a)=>{if(q(e))for(const[n,o]of Object.entries(e)){const e=["operatorDefaults",n],i=t.get(n);if(void 0===i){const t=r.get(n);void 0!==t?a(s.invalidOptions,`'operatorDefaults' keys are canonical names — use '${t}', not its alias '${n}'`,e,t):a(s.unknownOperator,`'${n}' names no registered operator`,e);continue}if(!q(o)){a(s.invalidOptions,`the defaults for '${n}' must be a plain object`,e,n);continue}let l,c=!0;for(const[t,r]of Object.entries(o)){const o=[...e,t];if(Hr.includes(t)){"fallback"===t&&(l=Se(r),void 0===l&&(a(s.invalidOptions,`the default fallback for '${n}' must be static, built only from literals and $error reads — it is never evaluated`,o,n),c=!1)),"noCache"===t&&(!0!==r?(a(s.invalidOptions,"the 'noCache' modifier takes only the literal true",o,n),c=!1):i.definition.cache||(a(s.invalidOptions,`'noCache' on '${n}', which never caches — its definition does not declare 'cache: true'`,o,n),c=!1));continue}const u=i.definition.parameters[t];if(void 0===u){a(s.invalidOptions,`'${t}' names no declared parameter of '${n}' (nor 'fallback'/'noCache')`,o,n),c=!1;continue}if(u.required){a(s.invalidOptions,`'${t}' is a required parameter of '${n}' — operatorDefaults may only target optional parameters`,o,n),c=!1;continue}const d=Q(r,u.type);if(!d.ok){a(s.typeCheck,`the default for '${n}.${t}' does not satisfy its declared type: expected ${d.expected}, got ${d.actual}`,o,n),c=!1;continue}const f=ae(r,u);f.ok||(a(s.typeCheck,`the default for '${n}.${t}' violates its declared constraints: expected ${f.expected}, got ${f.actual}`,o,n),c=!1)}c&&(i.hostDefaults=Object.freeze({...o}),void 0!==l&&(i.defaultFallback=l))}else a(s.invalidOptions,"'operatorDefaults' must be a plain object",["operatorDefaults"])},Yr=(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},Zr="fig-tree:scope-settled",ea="fig-tree:request-expired",ta="fig-tree:evaluation-timeout";class ra{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?Zr:this.parent?.reason}get signal(){if(void 0===this.controller){const e=new AbortController;if(this.controller=e,this.settled)e.abort(Zr);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(Zr)))}}const aa=(e,t,r=E)=>({get aborted(){return e.aborted},get reason(){return e.reason},signal:e,clock:t,settle:r}),na=(e,t,r)=>{const a=new AbortController,{signal:n}=a,o=()=>a.abort(e?.reason);let s;e?.aborted?o():e?.addEventListener("abort",o,{once:!0});const i=new Promise((e,t)=>{s=t});i.catch(E);const l=()=>s(n.reason);n.aborted?l():n.addEventListener("abort",l,{once:!0});const c=void 0===t?void 0:setTimeout(()=>a.abort(r),Math.min(t,2147483647));return{signal:n,expiry:i,settle:()=>{void 0!==c&&clearTimeout(c),n.removeEventListener("abort",l),e?.removeEventListener("abort",o),a.abort(Zr)}}},oa=(e,t)=>na(e,t,ea),sa=(e,t)=>(r,a)=>{const n=(o=[e.operator,e.fingerprint,r],Mr(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)},ia=/*#__PURE__*/Object.freeze({}),la=(e,t)=>!0!==t||!0===e.noCache?e:{...e,noCache:t};class ca{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 ua={memo:(e,t)=>t()},da={note:E},fa=Symbol("fig-tree:internal-error"),pa=e=>ja(`[fig-tree internal] ${e}`,fa),ma=e=>pa(`${e} reached evaluation — the static gate should have refused it`),ha=(t,r,a,n)=>new e({code:r,message:`${t.name} – ${a}`,path:Me(t.path),operator:t.name,errorData:n}),va=e=>Aa(e,fa),ya=Symbol("fig-tree:cancelled"),ga=()=>ja("[fig-tree] evaluation cancelled",ya),ba=e=>Aa(e,ya),ka=(e,t,r)=>e.rootScope.aborted?wa(e.rootScope.reason,t,r):e.abortScope.aborted?ga():void 0,wa=(e,t,r)=>e===Zr?ga():$a(e,Me(t),{operator:r}),$a=(t,r,a={})=>{const{operator:n,ms:o}=a,i=t===ta,l=void 0===o?"":`${o}ms `;return new e({code:i?s.timeout:s.aborted,message:i?`evaluation exceeded its ${l}timeout`:"evaluation was aborted by the caller",path:r,...void 0!==n?{operator:n}:{}})},xa=e=>va(e)||ba(e)||(e=>D(e)&&(e.code===s.aborted||e.code===s.timeout))(e),ja=(e,t)=>{const r=new Error(e);return Oa(r,t),r},Oa=(e,t)=>{e[t]=!0},Aa=(e,t)=>e instanceof Error&&!0===e[t],Pa=()=>performance.now(),Da=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,...Ca(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=Ma(e),l=qa(e),c={path:Me(e.path),kind:za(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:Pa()}),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=Pa()-u.started,s(c,{type:"shielded-fallback"});const d=Ea(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}}},Ca=e=>Na(e.node).filter(t=>!e.seen.has(t)).map(e=>({entry:{path:Me(e.path),kind:za(e),status:"skipped"},order:e.order,index:0})),Na=e=>{const t=qe(e).flatMap(Sa);return"fragmentCall"===e.kind&&void 0!==e.entry&&t.push(e.entry.body),t},Sa=e=>"elements"===e.kind||"entries"===e.kind?Na(e):[e],za=e=>{switch(e.kind){case"operator":return"operator";case"fragmentCall":return"fragment";case"reference":return"reference";case"skeleton":return"skeleton";default:return"literal"}},Ea=e=>"operator"===e.kind||"fragmentCall"===e.kind?e.fallback:void 0,Ma=e=>"operator"===e.kind||"fragmentCall"===e.kind?e.name:void 0,qa=e=>"reference"===e.kind?e.raw:void 0,Fa=async(e,t,r,a,n)=>{let o;try{o=await e()}catch(e){if(xa(e))throw e;if(!r){const r=a(e);throw D(r)&&r!==t&&void 0===r.cause&&(r.cause=t),r}o=null}return void 0!==n.trace&&void 0!==n.traceParent&&D(t)&&n.trace.markFallback(n.traceParent,t),o},Ta=(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,R(()=>Cn(n,a,{var:e})));return a},Va=async(e,t,r,a,n)=>{const o={...r,params:"dynamic"===e.argumentsMode?await Ra(e,t,a):Ia(e,t,a),frame:n};delete o.scope,delete o.bindings,delete o.caught;const s=await Cn(t.body,o);return void 0===s?null:s},Ia=(e,t,r)=>{const a=e.parameters??{},n=new Map;for(const[o,s]of Object.entries(t.parameters)){const t=a[o],i=R(async()=>{if(void 0===t)return La(e,o,s,r);let a;try{a=await Cn(t,r)}catch(e){throw Ua(e,r.frame)}return Wa(e,o,s,a,t.path,r)});n.set(o,()=>{const e=i();return e.catch(E),e})}return n},Ra=async(e,t,r)=>{const a=e.parameters;let n;try{n=await Cn(a,r)}catch(e){throw Ua(e,r.frame)}if(!q(n))throw Ua(Ba(e,s.typeCheck,`'parameters' must evaluate to an object, received ${B(n)}`,a.path),r.frame);const o=new Map;for(const[s,i]of Object.entries(t.parameters)){const t=Object.hasOwn(n,s)?Wa(e,s,i,n[s],a.path,r):La(e,s,i,r,a.path);o.set(s,()=>Promise.resolve(t))}return o},La=(e,t,r,a,n=e.path)=>{if(!r.required)return r.default??null;throw Ua(Ba(e,s.missingRequired,`requires '${t}'`,n),a.frame)},Wa=(e,t,r,a,n,o)=>{const i=void 0===a?null:a;if(null===i&&K(r))return r.default??null;const l=ne(i,r);if(!l.ok)throw Ua(Ba(e,s.typeCheck,`parameter '${t}': expected ${l.expected}, received ${l.actual}`,n),o.frame);return i},Ba=(t,r,a,n)=>new e({code:r,message:`fragment '${t.name}' – ${a}`,path:Me(n)}),Ja=Symbol("fig-tree:anchored"),Ua=(e,t)=>!D(e)||Aa(e,Ja)?e:(Oa(e,Ja),void 0===t?e:Object.assign(e,Ga(e,t))),Ga=(e,t)=>({fragment:t.fragment,fragmentPath:e.path,path:Me(t.callPath)}),Ka=(e,t)=>{const r=void 0===t||Aa(e,Ja)?e:Ga(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 _a extends Error{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 Ha=e=>e instanceof _a,Qa=(e,t,r)=>Ya(Array.from({length:e},(e,a)=>Xa(a,()=>t(a),r)),e),Xa=async(e,t,r)=>{try{return{index:e,ok:!0,value:r(await t())}}catch(t){return{index:e,ok:!1,error:t}}},Ya=(e,t)=>{const r=new Map(e.map((e,t)=>[t,e]));return{[Sr]:!0,length:t,async*[Symbol.asyncIterator](){for(;r.size>0;){const e=await Promise.race(r.values());r.delete(e.index),yield e}}}},Za=e=>({[Sr]:!0,evaluate:R(e)}),en=e=>({[Sr]:!0,evaluate:()=>Promise.resolve(e)}),tn=(e,t,r,a,n)=>Za(async()=>rn(await Cn(e,n),t,r,a)),rn=(e,t,r,a)=>{const n=ne(e,a);if(!n.ok)throw ln(t,r,n);return a.truthiness?fn(e,a.type):e},an=(e,t,r,a,n,o)=>{const s=Array.isArray(t)?t:[],i=Ie(r),l=new Map,c=t=>{const c=l.get(t);if(void 0!==c)return c;const u=(async()=>rn(await Cn(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(E),l.set(t,u),u};return{[Sr]:!0,evaluate:c,settle:()=>Qa(s.length,c,e=>e)}},nn=(e,t)=>t.truthiness?ue(e):e,on=(e,t,r)=>{if("lazyElements"===t.evaluation&&"elements"===e.kind)return e.nodes.map((e,a)=>Za(async()=>nn(await Cn(e,r,{index:a}),t)));if("race"===t.evaluation&&"elements"===e.kind)return((e,t,r)=>Qa(e.length,r=>Cn(e[r],t,{index:r}),r))(e.nodes,r,e=>nn(e,t));if("lazyEntries"===t.evaluation&&"entries"===e.kind){const a=Ta(r,e.vars),n={};for(const[r,o]of Object.entries(e.entries))n[r]=Za(async()=>nn(await Cn(o,a),t));return n}},sn=(e,t)=>{switch(t.evaluation){case"lazyElements":return e.map(e=>en(nn(e,t)));case"race":return((e,t)=>Qa(e.length,t=>Promise.resolve(e[t]),t))(e,e=>nn(e,t));case"lazyEntries":{const r={};for(const[a,n]of Object.entries(e))r[a]=en(nn(n,t));return r}case"lazy":return en(e);default:return e}},ln=(e,t,r)=>ha(e,s.typeCheck,`parameter '${t}': expected ${r.expected}, received ${r.actual}`),cn=(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=Q(o,n.type);if(!s.ok)throw ln(e,a.selector,s);return a.table.find(e=>e.value===o).policy},un=async(e,t,r)=>{if(void 0!==t.elementNullPolicy){if(Array.isArray(e)&&e.includes(null)){const t=await r();return e.map(e=>null===e?t:e)}if(q(e)&&Object.values(e).includes(null)){const t=await r(),a={};for(const[r,n]of Object.entries(e))a[r]=null===n?t:n;return a}return e}return null===e?r():e},dn=e=>Array.isArray(e)?e.includes(null):!!q(e)&&Object.values(e).includes(null),fn=(e,t)=>{if((e=>!("object"==typeof e&&!Array.isArray(e))&&(Array.isArray(e)?e:[e]).every(e=>"array"===e||"object"===e))(t)){if(Array.isArray(e))return e.map(ue);if(q(e)){const t={};for(const[r,a]of Object.entries(e))t[r]=ue(a);return t}}return ue(e)},pn=(e,t)=>0===e.segments.length?t.data:kn(t.data,e.segments,e,t,"is absent from the evaluation data"),mn=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 ma(`'${e.raw}'`);const o=await n();return 0===a.length?wn(o):kn(o,a,e,t,`is absent from the value of '$vars.${r}'`)},hn=async(e,t)=>{const r=t.params;if(void 0===r)throw ma(`'${e.raw}'`);const[a,...n]=e.segments;if(void 0===a){const e={};return await Promise.all([...r].map(async([t,r])=>{e[t]=wn(await r())})),e}const o="string"==typeof a?r.get(a):void 0;if(void 0===o)throw ma(`'${e.raw}'`);const s=await o();return 0===n.length?wn(s):kn(s,n,e,t,`is absent from the value of '$params.${String(a)}'`)},vn=(e,t)=>{const r=e.namespace,a=((e,t,r)=>{for(let a=e;void 0!==a;a=a.parent)if(Re(a.as,t,r))return a})(t.bindings,r,e.binding);if(void 0===a)throw ma(`'${e.raw}'`);return"index"===r?a.index:0===e.segments.length?wn(a.element):kn(a.element,e.segments,e,t,`is absent from '${e.raw.split(".")[0]}'`)},yn=(e,t)=>{if(void 0===t.caught)throw ma(`'${e.raw}'`);return gn(Ka(t.caught,t.frame),e.segments)},gn=(e,t)=>{if(0===t.length)return e;const r=x(e,t);return r.found?wn(r.value):null},bn=(e,t,r)=>{const{value:a,reads:n}=e;if(void 0===n)return a;const o=Ka(t,r),s=n.map(({segments:e,within:t})=>gn(void 0===t?o:{...o,...t},e));return 0===n[0].at.length?s[0]:We(a,n,s)},kn=(t,r,a,n,o)=>{const i=x(t,r);if(i.found)return wn(i.value);if(!n.strictDataPaths)return null;throw new e({code:s.missingDataPath,message:`'${a.raw}' ${o} (strictDataPaths)`,path:Me(a.path)})},wn=e=>void 0===e?null:e,$n=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(Cn(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?R(()=>Cn(n,t)):void 0!==a&&Object.hasOwn(a,r)?R(()=>a[r]):void 0;if(void 0!==e)for(const t of o.replacesNullAt)(u??={})[t]=e;break}void 0!==n&&(d[r]=tn(n,e,r,o,t));break;case"lazyElements":case"lazyEntries":case"race":{if(void 0===n)break;const e=on(n,o,t);if(void 0!==e){d[r]=e;break}i.push(r),l.push(Cn(n,t));break}case"perElement":break;default:o.evaluation}}if(l.length>0)if(1===l.length){const e=l[0];c[i[0]]=M(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&&K(r))&&(void 0!==a&&Object.hasOwn(a,e)?c[e]=a[e]:"default"in r?c[e]=r.default===se?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 un(a,r,n));const o="eager"!==r.evaluation&&"structural"!==r.evaluation;if(null===a&&G(r.type)&&!o&&"propagate"===cn(e,r,c))return{params:d,propagate:!0};if("propagate"===r.elementNullPolicy&&dn(a))return{params:d,propagate:!0};a=rn(a,e,t,r),d[t]=sn(a,r)}for(const[r,a]of s){const n=e.params[r];void 0!==n&&(d[r]=an(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&&_r(e.entry),s=jn(n,r),i=void 0===s?void 0:oa(t.abortScope.signal,s),l=void 0===i?t:{...t,abortScope:aa(i.signal,t.abortScope.clock)},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 ca(e.abortScope,e.options,r?{memo:sa({operator:t.name,fingerprint:t.fingerprint,note:a},e.cache)}:ua,void 0===a?da:{note:a}))(l,n,o,c);try{return await xn(e,t,r,u,i)}catch(r){throw On(r,e,t,i,s)}finally{i?.settle()}},xn=async(e,t,r,a,n)=>{const o=ka(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?Pn(await s,e):(s.catch(E),Pn(await Promise.race([s,n.expiry]),e))},jn=(e,t)=>{const r=e.timeoutParam;if(null===r)return;const a=t[r];return"number"==typeof a&&a>0?a:void 0},On=(e,t,r,a,n)=>{if(va(e)||ba(e))return e;const o=ka(r,t.path,t.name);return void 0!==o?o:a?.signal.reason===ea?new _a(`request exceeded its ${String(n)}ms timeout`,{code:s.requestTimeout}):e},An=(e,t,r)=>{const a=e.fallback;if(void 0!==a)return()=>Cn(a,{...t,caught:r});const n=e.entry.defaultFallback;return void 0!==n?()=>bn(n,r,t.frame):void 0},Pn=(e,t)=>{if(void 0===e)return null;if("number"==typeof e&&!Number.isFinite(e))throw ha(t,s.nonFiniteResult,`produced a non-finite number (${String(e)})`);if("object"==typeof(r=e)&&null!==r&&!0===r[Sr])throw ha(t,s.escapedHandle,"returned a lazy handle instead of evaluating it");var r;return e},Dn=(e,t)=>{if(D(e))return e;const r=Ha(e)?e:void 0;return ha(t,r?.code??s.operatorFailure,e instanceof Error?e.message:String(e),r?.errorData)},Cn=(e,t,r)=>void 0!==t.trace?Nn(e,t,t.trace,r):t.abortScope.aborted?Promise.reject(ka(t,e.path)):Sn(e,t),Nn=async(e,t,r,a)=>{const n=r.enter(e,t.traceParent,t.frame,a),o=Pa();try{if(t.abortScope.aborted)throw ka(t,e.path);const a=await Sn(e,{...t,traceParent:n});return r.settle(n,"value",{value:a,elapsed:Pa()-o}),a}catch(e){throw r.settle(n,ba(e)?"cancelled":"failed",{...D(e)?{error:e}:{},elapsed:Pa()-o}),e}},Sn=(e,t)=>{try{switch(e.kind){case"constant":return e.value;case"reference":return((e,t)=>{switch(e.namespace){case"data":return pn(e,t);case"vars":return mn(e,t);case"params":return hn(e,t);case"element":case"index":return vn(e,t);case"error":return yn(e,t)}})(e,t);case"skeleton":return zn(e,t);case"operator":return(async(e,t)=>{const r=Ta(la(t,e.noCache),e.vars),a=e.entry.definition.deliversLazily?new ra(r.abortScope):void 0,n=void 0===a?r:{...r,abortScope:a};try{try{return await $n(e,n)}finally{a?.settle()}}catch(a){if(xa(a))throw a;const n=Dn(a,e),o=An(e,r,n);if(void 0===o)throw n;return Fa(o,n,e.fallbackReadsError,t=>Dn(t,e),t)}})(e,t);case"fragmentCall":return(async(e,t)=>{const{entry:r}=e;if(void 0===r)throw ma(`fragment call '${e.name}'`);const a=Ta(la(t,e.noCache),e.vars),n=new ra(a.abortScope),o={fragment:e.name,callPath:t.frame?.callPath??e.path},s={...a,abortScope:n};try{try{return await Va(e,r,s,a,o)}finally{n.settle()}}catch(r){if(xa(r))throw r;const n=Ua(r,o),{fallback:s}=e;if(void 0===s)throw n;const i=D(n)?{...a,caught:n}:a;return Fa(()=>Cn(s,i),n,e.fallbackReadsError,e=>Ua(e,t.frame),t)}})(e,t);default:throw pa(`a '${e.kind}' node reached the node dispatch`)}}catch(e){return Promise.reject(e)}},zn=async(e,t)=>{const r=t.rootBoundary,a=void 0===r?t:{...t,rootBoundary:void 0},n=Ta(a,e.vars),o=e.holes.map(({node:e})=>void 0===r?Cn(e,n):"skeleton"===e.kind?Cn(e,{...n,rootBoundary:r}):r(()=>Cn(e,n),e)),s=o.some(M)?await Promise.all(o):o;return We(e.skeleton,e.holes,s)},En=async(e,t,r)=>{const{timeout:a,signal:n}=t,o=e.holes.length>0,s=void 0!==a||void 0!==n?na(n,a,ta):void 0,i=void 0!==s?((e,t)=>{const r={epoch:0};return e.addEventListener("abort",()=>{r.epoch+=1},{once:!0}),aa(e,r,t)})(s.signal,s.settle):new ra(void 0),l=void 0!==s&&void 0!==a&&e.timeoutShielded&&o,c=!0===t.trace?Da(e.issues.map(e=>e.issue).filter(e=>"error"!==e.severity)):void 0,u=((e,t,r,a)=>({options:e,data:e.data??ia,abortScope:r,rootScope:r,cache:t,strictDataPaths:e.strictDataPaths??!1,...void 0!==a?{trace:a}:{}}))(t,r,i,c),d=l?qn(e,s.expiry,a,c):void 0,f=void 0!==d&&"skeleton"!==e.root.kind,p=void 0===d||f?u:{...u,rootBoundary:d};try{if(i.aborted)throw $a(i.reason,[]);const t=()=>f&&void 0!==d?d(()=>Cn(e.root,p),e.root):Cn(e.root,p),r=await(l||void 0===s?t():Mn(t,s,a));return void 0!==c?{result:r,trace:c.finish()}:{result:r}}catch(e){throw void 0!==c&&D(e)&&void 0===e.trace&&(e.trace=c.finish()),e}finally{i.settle()}},Mn=(e,t,r)=>Promise.race([e(),t.expiry.catch(e=>{throw $a(e,[],{ms:r})})]),qn=(e,t,r,a)=>{const n=new Map(e.holes.map(e=>[e.node,e]));return(e,o)=>{const s=n.get(o);let i=!1;const l=Promise.resolve(e()).then(e=>(i=!0,e));return Promise.race([l,t.catch(e=>{if(e!==ta)throw $a(e,[]);if(i)return;const t=Fn(s,e,r),n=Tn(s,t);return a?.markShielded(s.node,t,n),n})])}},Fn=(e,t,r)=>{const{node:a}=e,n="operator"===a.kind?a.name:void 0;return $a(t,Me(a.path),{operator:n,ms:r})},Tn=(e,t)=>bn(e.timeoutFallback,t,void 0),Vn={hit:!1},In=e=>{if(void 0===e)return{maxSize:50,maxTime:1800};if(!n(e))throw Ln("'cache' must be an object");const{store:t,maxSize:r,maxTime:a}=e;if(void 0!==t&&!Rn(t))throw Ln("'cache.store' must provide get, set, delete and clear methods");if(void 0!==r&&(!Number.isInteger(r)||r<1))throw Ln("'cache.maxSize' must be a positive integer");if(void 0!==a&&("number"!=typeof a||a<=0||Number.isNaN(a)))throw Ln("'cache.maxTime' must be a positive number of seconds, or Infinity");return{...void 0!==t?{store:t}:{},maxSize:r??50,maxTime:a??1800}},Rn=e=>"object"==typeof e&&null!==e&&["get","set","delete","clear"].every(t=>"function"==typeof e[t]),Ln=t=>new e({code:s.invalidOptions,message:t,path:[]});class Wn{store;own;maxTime;current=0;constructor(e){void 0===e.store?(this.own=new Nr(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 Vn}return n(r=t)&&"ft3"===r.fig&&"number"==typeof r.generation?t.generation<this.current||Bn(t)?(this.drop(e),Vn):{hit:!0,value:t.value}:Vn;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(E)}catch{}}configure(e){void 0===e.store?(this.own??=new Nr(e.maxSize),this.store=this.own):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(E)}catch{}}}const Bn=e=>void 0!==e.expiresAt&&e.expiresAt<=Date.now(),Jn=e=>e===C?0:"number"==typeof e?1:2,Un=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=Jn(r)-Jn(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]}),Gn=(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},Kn=(e,t)=>{const r=[];return void 0!==t.maxDepth&&e.maxDepth>t.maxDepth&&r.push(Hn(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},_n=(e,t)=>e.hasErrors||void 0!==t.maxDepth||void 0!==t.maxNodes?[...Kn(e,t),...e.issues.map(e=>e.issue)]:[],Hn=(e,t)=>({severity:"error",code:s.maxDepthExceeded,message:`the expression nests ${e} levels deep — maxDepth is ${t}`,path:[]}),Qn=(e,t,r)=>{const a=[...Kn(e,t),...e.issues.map(r)];return void 0!==t.data&&a.push(...Xn(e.dataReads,t.data)),a},Xn=(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=x(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:`'${N(o)}' is absent from the supplied sample data${d}`,path:Me(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},Yn="...",Zn=e=>e,eo=e=>{const r=Object.entries(e.parameters),a=new Map;for(const[e,{nullPolicy:n}]of r){if("function"!=typeof n)continue;const[o,{type:s}]=r.find(([,e])=>void 0!==e.type&&t(e.type)),{literal:i}=s;a.set(e,{selector:o,table:i.map(e=>({value:e,policy:n(e)}))})}return to(e,a)},to=(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&&G(s)?"value":"propagate",l={type:no(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.metadata&&(l.metadata=n.metadata),void 0!==n.elementNullPolicy&&(l.elementNullPolicy=n.elementNullPolicy),void 0!==n.constraints&&(l.constraints=oo(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(Yn)?a.slice(3):null,o={[ie]:!0,name:e.name,category:e.category,parameters:r,resolution:so(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?no(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=oo(e.analysis)),o.fingerprint=ro(o),io(o)},ro=e=>(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")})(JSON.stringify([e.name,Object.entries(e.parameters).map(([e,t])=>[e,ao(t)]),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)),ao=e=>{const t={...e};return delete t.metadata,t},no=e=>"string"==typeof e?e:t(e)?{literal:[...e.literal]}:[...e],oo=e=>{if(Array.isArray(e))return e.map(oo);if(q(e)){const t={};for(const[r,a]of Object.entries(e))t[r]=oo(a);return t}return e},so=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)}},io=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&&lo(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)},lo=e=>{Array.isArray(e)?(e.forEach(lo),Object.freeze(e)):q(e)&&(Object.values(e).forEach(lo),Object.freeze(e))},co=e=>{if(Array.isArray(e))return e;try{return k(e)}catch(e){throw new _a(e.message)}},uo=(e,t)=>{if("string"!=typeof e)return[];try{return k(e),[]}catch(e){return[{severity:"error",parameter:t,message:e.message}]}},fo=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"}]:[],po=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`}]:[]},mo=/*#__PURE__*/po("values"),ho=/*#__PURE__*/po("input"),vo=/*#__PURE__*/po("entries"),yo=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"}]:[],go=(e,t)=>new _a(`${e} of nothing — the values array is empty${void 0!==t?`; ${t}`:""}`,{code:s.emptyAggregate}),bo=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),ko(r);return!t},ko=e=>{const[t,...r]=e,a=r.map(e=>e.error).filter(D);return a.length>0&&D(t.error)&&void 0===t.error.related&&(t.error.related=a),t.error},wo=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)},$o=(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=>Pe(r(e),a))},xo={values:{type:"array",elementNullPolicy:"value"},caseInsensitive:{type:"boolean",default:!1}},jo={name:"equal",alias:"=",category:"comparison",parameters:xo,positionalParams:["...values"],returns:"boolean",validate:yo,evaluate:({values:e,caseInsensitive:t})=>$o(e,t)},Oo={name:"notEqual",alias:"!=",category:"comparison",parameters:xo,positionalParams:["...values"],returns:"boolean",validate:yo,evaluate:({values:e,caseInsensitive:t})=>!$o(e,t)},Ao=(e,t,r)=>({name:e,alias:t,category:"comparison",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{length:2,homogeneous:["number","string"]}},nullValueDefault:{type:["number","string"],required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:"boolean",evaluate:({values:e})=>{const[t,a]=e;return r(de(t,a))}}),Po=/*#__PURE__*/Ao("greaterThan",">",e=>e>0),Do=/*#__PURE__*/Ao("greaterThanOrEqual",">=",e=>e>=0),Co=/*#__PURE__*/Ao("lessThan","<",e=>e<0),No=/*#__PURE__*/Ao("lessThanOrEqual","<=",e=>e<=0),So={number:()=>0,string:()=>"",array:()=>[],object:()=>({})},zo={name:"plus",alias:"+",category:"math",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{homogeneous:["number","string","array","object"]}},expect:{type:{literal:["number","string","array","object"]},required:!1},nullValueDefault:{type:["number","string","array","object"],required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:["number","string","array","object"],validate:({values:e,expect:t})=>void 0!==t?mo({values:e}):fo({values:e}),evaluate:({values:e,expect:t})=>{if(0===e.length){if(void 0===t)throw go("the sum","pin the mode with 'expect' to get its identity");return So[t]()}const r=B(e[0]);if(void 0!==t&&r!==t)throw new _a(`all operands must be ${t}s — received ${r}`,{code:s.typeCheck});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)}}},Eo={name:"subtract",alias:"-",category:"math",parameters:{value:{type:["number","null"]},minus:{type:["number","null"]}},positionalParams:["value","minus"],returns:"number",evaluate:({value:e,minus:t})=>e-t},Mo={name:"divide",alias:"/",category:"math",parameters:{value:{type:["number","null"]},by:{type:["number","null"]}},positionalParams:["value","by"],returns:"number",evaluate:({value:e,by:t})=>e/t},qo={name:"modulo",category:"math",parameters:{value:{type:["number","null"]},mod:{type:["number","null"]}},positionalParams:["value","mod"],returns:"number",evaluate:({value:e,mod:t})=>(e%t+t)%t},Fo={name:"multiply",alias:"*",category:"math",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{homogeneous:["number"]}},nullValueDefault:{type:"number",required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:"number",validate:mo,evaluate:({values:e})=>e.reduce((e,t)=>e*t,1)},To={name:"power",alias:"^",category:"math",parameters:{base:{type:["number","null"]},exponent:{type:["number","null"]}},positionalParams:["base","exponent"],returns:"number",evaluate:({base:e,exponent:t})=>e**t},Vo={name:"round",category:"math",parameters:{value:{type:["number","null"]},decimals:{type:"integer",default:0}},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(je(Math.abs(e),t));return r*je(a,-t)})(e,t)},Io=(e,t,r="number")=>({name:e,category:"math",parameters:{value:{type:["number","null"]}},positionalParams:["value"],returns:r,evaluate:({value:e})=>t(e)}),Ro=/*#__PURE__*/Io("floor",Math.floor,"integer"),Lo=/*#__PURE__*/Io("ceil",Math.ceil,"integer"),Wo=/*#__PURE__*/Io("abs",Math.abs),Bo=(e,t,r)=>({name:e,category:"math",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{homogeneous:["number","string"]}},nullValueDefault:{type:["number","string"],required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:["number","string"],validate:fo,evaluate:({values:e})=>{const a=e;if(0===a.length)throw go(t);return a.reduce((e,t)=>r(de(t,e))?t:e)}}),Jo=(e,t)=>({name:e,category:"string",parameters:{value:{type:["string","null"]}},positionalParams:["value"],returns:"string",evaluate:({value:e})=>t(e)}),Uo={name:"split",category:"string",parameters:{value:{type:["string","null"]},delimiter:{type:"string",default:" "},trim:{type:"boolean",default:!0}},positionalParams:["value","delimiter"],returns:"array",evaluate:({value:e,delimiter:t,trim:r})=>{const a=""===t?xe(e):e.split(t);return r?a.map(ge):a}},Go=e=>Array.isArray(e.values)&&e.values.some(ve)?[{severity:"error",parameter:"values",message:ye}]:[],Ko={name:"join",category:"string",parameters:{values:{type:"array",elementNullPolicy:"value"},delimiter:{type:"string",default:" "},nullValueDefault:{type:["string","number","boolean"],required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:"string",validate:e=>[...mo(e),...Go(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"}):ve(e)&&r.trace.note({type:"render",token:a,rendered:"placeholder"}),he(e)}).join(t)},_o=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}`},Ho={type:"array"},Qo={type:"string",required:!1,evaluation:"structural"},Xo={type:"array",required:!1,evaluation:"lazy",replacesNullAt:["input"]},Yo={type:"any",evaluation:"perElement",over:"input",truthiness:!0},Zo={name:"get",category:"data",parameters:{path:{type:["string","array","null"]},from:{type:"any",nullPolicy:"value",default:se},default:{type:"any",required:!1,evaluation:"lazy"}},positionalParams:S,returns:"any",validate:({path:e})=>uo(e,"path"),evaluate:({path:e,from:t,default:r},a)=>{const n=x(t,co(e));if(n.found)return n.value;if(void 0!==r)return r.evaluate();if(a.options.strictDataPaths)throw new _a(`'${es(e)}' is missing (strictDataPaths)`,{code:s.missingDataPath});return null}},es=e=>"string"==typeof e?e:e.map(e=>String(e)).join("."),ts={name:"buildObject",category:"data",parameters:{entries:{type:"array",constraints:{elementShape:{key:{type:["string","number","boolean"]},value:{type:"any"}}}}},positionalParams:["...entries"],returns:"object",validate:e=>[...vo(e),...rs(e)],evaluate:({entries:e},t)=>{const r={};for(const a of e){const e=he(a.key);Object.hasOwn(r,e)&&t.trace.note({type:"key-overwrite",key:e}),r[e]=a.value}return r}},rs=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=he(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},as=(e,t)=>new _a(`cannot convert ${B(e)} to ${t}`),ns=/*#__PURE__*/[{name:"and",category:"logic",parameters:{values:{type:"array",truthiness:!0,evaluation:"race"}},positionalParams:["...values"],returns:"boolean",validate:mo,evaluate:({values:e})=>bo(e,!1)},{name:"or",category:"logic",parameters:{values:{type:"array",truthiness:!0,evaluation:"race"}},positionalParams:["...values"],returns:"boolean",validate:mo,evaluate:({values:e})=>bo(e,!0)},{name:"not",alias:"!",category:"logic",parameters:{value:{type:"any",truthiness:!0}},positionalParams:["value"],returns:"boolean",evaluate:({value:e})=>!e},{name:"if",alias:"?",category:"logic",parameters:{condition:{type:"any",truthiness:!0},then:{type:"any",evaluation:"lazy"},else:{type:"any",evaluation:"lazy",default:null}},positionalParams:["condition","then","else"],evaluate:({condition:e,then:t,else:r})=>e?t.evaluate():r.evaluate()},{name:"match",category:"logic",parameters:{value:{type:["string","number","boolean","null"],nullPolicy:"value"},branches:{type:"object",evaluation:"lazyEntries"},default:{type:"any",required:!1,evaluation:"lazy"}},positionalParams:["value","branches","default"],evaluate:({value:e,branches:t,default:r})=>{const a=null===e?null:he(e);if(null!==a&&Object.hasOwn(t,a))return t[a].evaluate();if(void 0!==r)return r.evaluate();throw new _a(`no branch matches ${null===a?"null":`'${a}'`}, and no default was supplied`)}},{name:"firstOf",category:"logic",parameters:{values:{type:"array",evaluation:"lazyElements"}},positionalParams:["...values"],validate:mo,evaluate:async({values:e})=>{for(const t of e){const e=await t.evaluate();if(null!==e)return e}return null}},jo,Oo,Po,Do,Co,No,zo,Eo,Fo,Mo,qo,To,Vo,Ro,Lo,Wo,/*#__PURE__*/Bo("min","the minimum",e=>e<0),/*#__PURE__*/Bo("max","the maximum",e=>e>0),{name:"buildString",category:"string",parameters:{template:{type:["string","null"]},substitutions:{type:["array","object"],default:[],elementNullPolicy:"value"},trim:{type:"boolean",default:!1},closeGaps:{type:"boolean",default:!1},nullValueDefault:{type:["string","number","boolean"],required:!1,evaluation:"lazy",replacesNullAt:["substitutions"]}},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 Ce(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=he(e);ve(e)&&n.trace.note({type:"render",token:t.raw,rendered:"placeholder"});const l=r?ge(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=we(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=$e(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("")}},Uo,Ko,/*#__PURE__*/Jo("lower",e=>e.toLowerCase()),/*#__PURE__*/Jo("upper",e=>e.toUpperCase()),/*#__PURE__*/Jo("trim",ge),{name:"regex",category:"string",parameters:{value:{type:["string","null"]},pattern:{type:["string","null"]},flags:{type:"string",default:""},mode:{type:{literal:["test","extract","match"]},default:"test"},noMatchDefault:{type:["string","null"],default:null,nullPolicy:"value",evaluation:"lazy"}},positionalParams:["value","pattern"],returns:["boolean","string","array","null"],validate:({pattern:e,flags:t})=>{const r=[],a="string"==typeof t?_o(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=_o(r);if(void 0!==o)throw new _a(o);const s=e=>{try{return new RegExp(t,r+e)}catch(e){throw new _a(`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",parameters:{value:{type:["string","array","null"]}},positionalParams:["...value"],returns:"integer",evaluate:({value:e})=>"string"==typeof e?xe(e).length:e.length},{name:"map",category:"array",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:{type:"any",evaluation:"perElement",over:"input"}},positionalParams:["input","each"],returns:"array",validate:ho,evaluate:({each:e})=>wo(e.settle())},{name:"filter",category:"array",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:Yo},positionalParams:["input","each"],returns:"array",validate:ho,evaluate:async({input:e,each:t})=>{const r=await wo(t.settle());return e.filter((e,t)=>r[t])}},{name:"find",category:"array",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:Yo,noMatchDefault:{type:"any",default:null,evaluation:"lazy"}},positionalParams:["input","each"],validate:ho,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",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:Yo},positionalParams:["input","each"],returns:"boolean",validate:ho,evaluate:({each:e})=>bo(e.settle(),!0)},{name:"every",category:"array",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:Yo},positionalParams:["input","each"],returns:"boolean",validate:ho,evaluate:({each:e})=>bo(e.settle(),!1)},Zo,ts,{name:"convert",category:"other",parameters:{value:{type:"any",nullPolicy:e=>"boolean"===e?"value":"propagate"},to:{type:{literal:["number","string","boolean","array"]}}},positionalParams:["value","to"],returns:["number","string","boolean","array"],evaluate:({value:e,to:t})=>{switch(t){case"number":if("number"==typeof e)return e;if("boolean"==typeof e)return e?1:0;if("string"==typeof e){const t=e.trim(),r=""===t?NaN:Number(t);if(Number.isNaN(r))throw new _a(`'${e}' is not a numeric string — use regex to extract a number from text`);return r}throw as(e,"number");case"string":if(Array.isArray(e)||q(e))throw new _a(`cannot convert ${B(e)} to string — a cast is not a render; use buildString or join`);if("object"==typeof e)throw as(e,"string");return he(e);case"boolean":if("string"==typeof e){const t=e.trim().toLowerCase();if("true"===t)return!0;if("false"===t)return!1}return ue(e);case"array":return Array.isArray(e)?e:[e]}}}].map(eo),os="3.0.0-preview.11",ss=(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);gs(r);const a=is(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=Qr({operators:r.operators??[ns],...void 0!==r.operatorDefaults?{operatorDefaults:r.operatorDefaults}:{},...void 0!==r.fragments?{fragments:r.fragments}:{}});return{options:r,evaluation:a,registry:o,compileCache:new Vr({compile:e=>ls(e,o),probe:Ne})}},is=e=>{const t={...e};return delete t.operators,delete t.fragments,t},ls=(e,t)=>{const r=Ue(e,t);return Ht(r),r.hasNoCache&&xr(r),r};class cs{state;results;version=os;constructor(e={}){this.state=ss(null,e),this.results=new Wn(In(this.state.options.cache))}updateOptions(e={}){const t=ss(this.state,e),r=In(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,parameters:Gn(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:Un(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:vs(this.state.evaluation,t),a=ls(e,this.state.registry),n=Qn(a,r,e=>e.issue);return{valid:!n.some(e=>"error"===e.severity),issues:n}}getDependencies(e){return Un(Ue(e,this.state.registry).dependencies)}isEvaluable(e){const t=Ue(e,this.state.registry);return t.holes.length>0||t.hasErrors}evaluate(e,t){const{state:r}=this;return us(r.evaluation,this.results,e,t,()=>r.compileCache.resolve(e),()=>ls(e,r.registry))}compile(e){const{state:t}=this;return ms(e,t.compileCache.resolve(e),t.evaluation,t.registry,this.results)}}const us=async(e,t,r,a,n,o)=>{const s=void 0===a?e:vs(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=Hn(l.depth,s.maxDepth);throw ks(e,[e])}return r}const{artifact:c}=l,u=_n(c,s),d=u.find(e=>"error"===e.severity);if(void 0!==d)throw ks(d,u);const f=await En(c,s,t);return!0===s.trace?f:f.result};let ds;const fs=(e,t)=>ds?.(e,t);class ps{#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,ds??=(e,t)=>{if("object"!=typeof e||null===e||!(#r in e))return;const r=void 0===t?e.#a:vs(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 us(this.#a,this.#o,this.#t,e,()=>this.#r,()=>this.#l())}getDependencies(){return Un(this.#l().dependencies)}#l(){return"artifact"===this.#r.kind?this.#r.artifact:this.#s??=ls(this.#t,this.#n)}}const ms=(e,t,r,a,n)=>new ps(e,t,r,a,n),hs={data:0,signal:0,timeout:0,trace:0},vs=(e,t)=>{let r;for(const a in t){const n=t[a];if(void 0!==n){if(!Object.hasOwn(hs,a))throw ys(a);r??={...e},r[a]=n}}return void 0===r?e:(gs(t),r)},ys=t=>new e({code:s.invalidOptions,message:`'${t}' is not a per-call option — a call may supply data, signal, timeout and trace; configure the rest at construction or via updateOptions()`,path:[]}),gs=t=>{const{timeout:r,signal:a}=t;if(void 0!==r&&("number"!=typeof r||!Number.isFinite(r)||r<=0))throw new e({code:s.invalidOptions,message:"'timeout' must be a positive number of milliseconds",path:[]});if(void 0!==a&&!bs(a))throw new e({code:s.invalidOptions,message:"'signal' must be an AbortSignal",path:[]})},bs=e=>"object"==typeof e&&null!==e&&"boolean"==typeof e.aborted&&"function"==typeof e.addEventListener&&"function"==typeof e.removeEventListener,ks=(t,r)=>new e({code:t.code,message:t.message,path:t.path,...void 0!==t.operator?{operator:t.operator}:{},issues:r});export{Zn as A,uo as B,os as C,Qn as D,se as E,cs as F,pe as G,me as H,de as I,Pe as J,oe as O,Yn as R,re as a,G as b,Q as c,ue as d,ns as e,Ha as f,Re as g,fs as h,q as i,_n as j,H as k,le as l,z as m,K as n,ee as o,ae as p,to as q,Ie as r,We as s,Me as t,_a as u,_t as v,co as w,he as x,B as y,eo as z};
1
+ import{F as e,i as t,l as r,f as a,d as n,D as o,E as s,g as i,c as l,o as c,q as u,h as d,S as f,e as p,p as m,s as h,j as v,n as y,u as g,v as b,k,w,x as $,r as x,t as j,b as O,m as A,R as P,a as D,W as C,y as N,G as S}from"./shared.js";const z=(t,r,a)=>{const[n]=r,o=r.length-1;return new e({code:t,message:o>0?`${n.message} (+ ${o} more issue${1===o?"":"s"})`:n.message,path:n.path,operator:a,issues:r})},E=()=>{},M=e=>"object"==typeof e&&null!==e&&"function"==typeof e.then,q=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),F=(e,t,r)=>{if(e===t)return 0;const a=e.length,n=t.length;if(Math.abs(a-n)>r)return r+1;let o=new Array(n+1),s=new Array(n+1);for(let e=0;e<=n;e++)o[e]=e;for(let i=1;i<=a;i++){s[0]=i;let a=i;const l=e.charCodeAt(i-1);for(let e=1;e<=n;e++){const r=o[e-1]+(l===t.charCodeAt(e-1)?0:1),n=Math.min(o[e]+1,s[e-1]+1,r);s[e]=n,n<a&&(a=n)}if(a>r)return r+1;const c=o;o=s,s=c}return o[n]},T=(e,t)=>{let r,a=3;for(const n of t){const t=F(e,n,a-1);if(t<a&&(r=n,a=t,0===t))break}return r},V=e=>e?` — did you mean '${e}'?`:"",I=e=>e.length<2?e.join(""):`${e.slice(0,-1).join(", ")} and ${e[e.length-1]}`,R=e=>{let t;return()=>(void 0===t&&(t=(async()=>e())()),t)},L=(e,t,r)=>{const a=[],n=new Set,o=new Set,s=e=>{const i=a.indexOf(e);if(-1!==i){const e=a.slice(i),t=[...e].sort().join("\0");return void(o.has(t)||(o.add(t),r(e)))}if(!n.has(e)){a.push(e);for(const r of t(e)??[])s(r);a.pop(),n.add(e)}};for(const t of e)s(t);return 0===o.size},W={ok:!0},B=e=>null===e?"null":Array.isArray(e)?"array":typeof e,J=(e,t)=>({ok:!1,expected:e,actual:B(t)}),U=(e,t)=>{switch(t){case"any":return!0;case"string":return"string"==typeof e;case"number":return"number"==typeof e;case"integer":return"number"==typeof e&&Number.isInteger(e);case"boolean":return"boolean"==typeof e;case"array":return Array.isArray(e);case"object":return q(e);case"null":return null===e;default:return!1}},G=e=>"null"===e||"any"===e||!!Array.isArray(e)&&(e.includes("null")||e.includes("any")),K=e=>!e.required&&!G(e.type),_=/*#__PURE__*/new Set(["any","string","number","boolean","array","object","null","integer"]),H=e=>{if("string"==typeof e)return _.has(e);if(Array.isArray(e))return e.length>0&&e.every(e=>"string"==typeof e&&_.has(e));if(q(e)&&"literal"in e){const t=e.literal;return Array.isArray(t)&&t.length>0&&t.every(e=>["string","number","boolean"].includes(typeof e))}return!1},Q=(e,r)=>{if(t(r)){if(-1!==r.literal.indexOf(e))return W;const t=r.literal.map(e=>JSON.stringify(e)).join(", ");return J(`one of ${t}`,e)}return"string"==typeof r?U(e,r)?W:J(r,e):r.some(t=>U(e,t))?W:J(r.join(" | "),e)},X=(e,t)=>{if(void 0!==t.length){if(!Array.isArray(e))return J("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 J("array",e);const r=t.homogeneous;if(e.length>0){if(void 0===r.find(t=>e.every(e=>U(e,t))))return{ok:!1,expected:`homogeneous array of ${r.join(" | ")}`,actual:Y(e)}}}if(t.elementShape){if(!Array.isArray(e))return J("array",e);for(let r=0;r<e.length;r++){const a=te(e[r],t.elementShape);if(!a.ok)return a}}return W},Y=e=>{const t=B(e[0]),r=e.find(e=>B(e)!==t);return void 0===r?`array of ${t}`:`${B(r)} beside ${t}`},Z=["length","homogeneous","elementShape"],ee=e=>{if(!q(e))return J("a constraints object",e);for(const t of Object.keys(e))if(!Z.includes(t))return{ok:!1,expected:`one of ${Z.join(", ")}`,actual:t};const{length:t,homogeneous:r,elementShape:a}=e;if(void 0!==t&&(!Number.isInteger(t)||t<0))return J("a non-negative integer length",t);if(!(void 0===r||Array.isArray(r)&&H(r)))return J("a non-empty array of basic types",r);if(void 0!==a){if(!q(a))return J("an object of declarations",a);for(const[e,t]of Object.entries(a)){if(!q(t))return J(`a declaration for "${e}"`,t);if(void 0!==t.type&&!H(t.type))return J(`a vocabulary type for "${e}"`,t.type);if(void 0!==t.required&&"boolean"!=typeof t.required)return J(`a boolean "required" for "${e}"`,t.required);if(void 0!==t.constraints){const e=ee(t.constraints);if(!e.ok)return e}}}return W},te=(e,t)=>{if(!q(e))return J("object",e);const r=Object.keys(t);for(let a=0;a<r.length;a++){const n=r[a],o=t[n],s=Object.prototype.hasOwnProperty.call(e,n),i=!1!==o.required;if(!s){if(i)return{ok:!1,expected:`property "${n}"`,actual:"missing"};continue}const l=ne(e[n],o);if(!l.ok)return l}return W},re=(e,t,r)=>{if(!r||!Array.isArray(e))return X(e,t);const{length:a,...n}=t;if(void 0!==a){const t=X(e,{length:a});if(!t.ok)return t}return X(e.filter(e=>null!==e),n)},ae=(e,t)=>null===e||void 0===t.constraints?W:re(e,t.constraints,void 0!==t.elementNullPolicy),ne=(e,t)=>{if(void 0!==t.type){const r=Q(e,t.type);if(!r.ok)return r}return ae(e,t)},oe=["logic","comparison","math","string","array","data","io","other"],se=Symbol("fig-tree:EvaluationData"),ie=Symbol("fig-tree:validated-operator"),le=e=>"object"==typeof e&&null!==e&&!0===e[ie],ce=[!1,null,0,""],ue=e=>-1===ce.indexOf(e),de=(e,t)=>"number"==typeof e&&"number"==typeof t?e<t?-1:e>t?1:0:fe(String(e),String(t)),fe=(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},pe="<array>",me="<object>",he=e=>null===e?"":"string"==typeof e?e:"number"==typeof e?String(e):"boolean"==typeof e?e?"true":"false":Array.isArray(e)?pe:me,ve=e=>null!==e&&"object"==typeof e,ye="a composite element renders as a placeholder, never as text — drill in, or join it explicitly",ge=e=>e.trim(),be=/\s+$/,ke=/^\s+/,we=e=>e.replace(be,""),$e=e=>e.replace(ke,""),xe=e=>Array.from(e),je=(e,t)=>{const[r,a]=String(e).split("e"),n=void 0!==a?Number(a)+t:t;return Number(`${r}e${n}`)},Oe=Object.prototype.hasOwnProperty,Ae=(e,t)=>{for(const r of e.keys())if(Pe(r,t))return r},Pe=(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--&&Pe(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=Ae(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=Ae(t,n),!n))return!1;if(!Pe(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(Oe.call(e,r)&&++a&&!Oe.call(t,r))return!1;if(!(r in t)||!Pe(e[r],t[r]))return!1}return Object.keys(t).length===a}}return e!=e&&t!=t},De=e=>!e.includes("{")&&!e.includes("}")&&(e.startsWith("$")?e.length>1:r(e).ok),Ce=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(De(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},Ne=e=>{const t={maxDepth:0};return{constant:ze(t,e,0),depth:t.maxDepth}},Se=e=>{const t={maxDepth:0};if(ze(t,e,0,[]))return void 0===t.reads?{value:e}:{value:e,reads:t.reads}},ze=(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(!ze(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(!ze(e,t[a],r+1,s&&[...s,a]))return!1;return!0}return!0},Ee=(e,t)=>({parent:e,key:t}),Me=e=>{const t=[];for(let r=e;null!==r;r=r.parent)t.push(r.key);return t.reverse()},qe=e=>{switch(e.kind){case"constant":case"reference":case"invalid":return[];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),...Object.values(e.vars??{})];case"operator":case"fragmentCall":{const t="operator"===e.kind?Object.values(e.params):void 0===e.parameters?[]:"dynamic"===e.argumentsMode?[e.parameters]:Object.values(e.parameters);return void 0!==e.fallback&&t.push(e.fallback),[...t,...Object.values(e.vars??{})]}}return e},Fe=e=>{e.sort((e,t)=>e.order-t.order)},Te=(e,t,r,a,n,o,s={})=>{const i={severity:t,code:r,message:a,path:Me(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);const l={issue:i,order:o};return e.push(l),l},Ve=e=>e.some(({issue:e})=>"error"===e.severity),Ie=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},Re=(e,t,r)=>void 0===r?null===e:("element"===t?e:`${e??""}Index`)===r,Le=(e,t,r)=>{"__proto__"===t?Object.defineProperty(e,t,{value:r,writable:!0,enumerable:!0,configurable:!0}):e[t]=r},We=(e,t,r)=>{const a=new Set;let n=e;return t.forEach((e,t)=>{n=Be(n,e.at,r[t],a)}),n},Be=(e,t,r,a)=>{const n=Je(e,a),[o,...s]=t;return Le(n,o,0===s.length?r:Be(n[o],s,r,a)),n},Je=(e,t)=>{if(t.has(e))return e;const r=Array.isArray(e)?[...e]:{...e};return t.add(r),r},Ue=(e,t,r={})=>{const a={registry:t,recognizes:e=>((e,t)=>"literal"===t||void 0!==Yr(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(Ee,null),o=He(a,e,n,0);Ke(a);const s=Rt(o);Fe(a.issues);const i=Ve(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,...Ge(l,a.fragmentCalls,t.fragments),fragmentCalls:a.fragmentCalls,dataReads:a.dataReads,hasNoCache:a.hasNoCache}},Ge=(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]}}},Ke=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`})},_e=(e,t,r,a,n,o,s)=>Te(e.issues,t,r,a,n,o,s),He=(e,t,r,a)=>{const n=e.order++;if(a>e.maxDepth&&(e.maxDepth=a),a>o)return _e(e,"error",s.depthCeiling,`the expression nests deeper than the engine's ceiling of ${o} levels — descent stopped here`,r,n),e.nodeCount++,Ye(t,r,n);const i=Qe(e,t,r,a,n);return"operator"!==i.kind&&"fragmentCall"!==i.kind&&"reference"!==i.kind&&"invalid"!==i.kind||e.nodeCount++,i},Qe=(e,t,r,a,o)=>null==t?Xe(t??null,r,o):"number"==typeof t||"boolean"==typeof t?Xe(t,r,o):"string"==typeof t?Ze(e,t,r,o):Array.isArray(t)?tt(e,t,r,a,o):n(t)?rt(e,t,r,a,o):(e.identityOnly=!0,Xe(t,r,o)),Xe=(e,t,r)=>({kind:"constant",value:e,path:t,order:r}),Ye=(e,t,r)=>({kind:"invalid",raw:e,path:t,order:r}),Ze=(e,t,r,n)=>{const o=a(t,e.scope);switch(o.kind){case"plain":return Xe(t,r,n);case"unrecognized":{const a=_e(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}),Xe(t,r,n)}case"invalid":return _e(e,"error",o.code??s.invalidReference,`'${t}': ${o.reason}`,r,n),Ye(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:vt(e,s,i.startsWith(".")?i.slice(1):void 0,r)),e.unknownNodes>0&&et(a)&&(c.scopeUnknown=!0),c}}},et=e=>"element"===e||"index"===e||"error"===e,tt=(e,t,r,a,n)=>{const o=kt(e,t,r,0,a);return It(e,t,o,!0,!1,void 0,r,n)},rt=(e,t,r,a,n)=>{const o=l(t,e.recognizes);switch(o.kind){case"malformed":return _e(e,"error",s.malformedNode,o.message,r,n),Ye(t,r,n);case"operator":return at(e,t,r,a,n);case"fragment":return St(e,t,r,a,n);case"shorthand":return jt(e,t,o.key,r,a,n);case"plain":return Ft(e,t,r,a,n)}},at=(e,t,r,a,n)=>{const o=t.operator;if("string"!=typeof o)return nt(e,t,"operator",r,n);if("literal"===o)return Nt(e,t,t.value,"value"in t,r,n);const i=Yr(e.registry,o);if(void 0===i){const a=T(o,Ut(e));return _e(e,"error",s.unknownOperator,`'${o}' names no registered operator${V(a)}`,r,n,{suggestion:a}),Ye(t,r,n)}const l=ot(e,i,r,n),c=[];return st(e,l,t,"operator",a,(t,a)=>{"parameters"===t?_e(e,"error",s.malformedNode,"'parameters' is reserved and unused on operator nodes",Ee(r,t),n,{operator:l.name}):lt(e,l,c,t,a,Ee(r,t),n)}),ct(e,l,c,a,n),l},nt=(e,t,r,a,n)=>(_e(e,"error",s.malformedNode,`the '${r}' value must be a literal string`,a,n),Ye(t,a,n)),ot=(e,t,r,a)=>(e.operators.add(t.definition.name),{kind:"operator",name:t.definition.name,entry:t,params:{},path:r,order:a}),st=(e,t,r,a,n,o)=>{const{path:s,order:i}=t;for(const l in r){const c=r[l];l!==a&&"//"!==l&&void 0!==c&&("fallback"===l?t.fallback=He(e,c,Ee(s,l),n+1):"noCache"===l?it(e,t,c,s,i):"vars"===l?t.vars=qt(e,c,s,n,i):o?.(l,c))}},it=(e,t,r,a,n)=>{!0===r?(t.noCache=!0,e.hasNoCache=!0):_e(e,"error",s.malformedNode,"'noCache' takes only the literal true — it is settled before the subtree runs",Ee(a,"noCache"),n,"operator"===t.kind?{operator:t.name}:{})},lt=(e,t,r,a,n,o,i)=>{if(void 0===t.entry.definition.parameters[a]){const r=T(a,Object.keys(t.entry.definition.parameters));return void _e(e,"error",s.unknownNodeKey,`'${a}' is not a parameter of '${t.name}'${V(r)}`,o,i,{operator:t.name,parameter:a,suggestion:r})}r.push({name:a,kind:"value",value:n,path:o})},ct=(e,t,r,a,n)=>{const o=t.entry.definition,s=o.resolution.perElement.length>0;let i;if("get"===t.name&&ut(e,t,r),s&&"structural"===o.parameters.as?.evaluation){const a=r.find(e=>"as"===e.name);"value"===a?.kind&&(i=xt(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]=gt(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]=gt(e,n,r,a))}void 0!==i&&e.scope.bindings.pop()}yt(e,t),ft(e,t)},ut=(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=v(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?dt(e,i.value):null;if(null===l||"value"!==i?.kind){if("vars"!==o)return;const i=e.order++;return _e(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=Ye(n.value,n.path,i))}const[c,...u]=l;n.value=y(o,[c]),i.value=Array.isArray(i.value)?u:d(u)},dt=(e,t)=>{const r=t=>{if("string"!=typeof t)return w(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}},ft=(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(ve)&&_e(e,"error",s.operatorValidate,ye,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=>Ce(e).filter(e=>"text"!==e.kind))(r.value);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};const a=new Set(Object.keys(t));for(const e of r)a.add(String(e.at[0]));return{mode:"object",keys:a}}return{mode:"dynamic"}})(o);if(mt(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=Ze(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=pt(e,t,o,l))},pt=(e,t,r,a)=>"skeleton"===r?.kind?(r.holes.push(...a),r):{kind:"skeleton",skeleton:"constant"===r?.kind?r.value:{},holes:a,path:r?.path??Ee(t.path,"substitutions"),order:r?.order??e.order++},mt=(e,t,r,a,n)=>{const o=(a,n)=>_e(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}${ht(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,ht(r))}},ht=e=>0===e.length?"":1===e.length?`, and substitution ${e[0]} is unused`:`, and substitutions ${I(e)} are unused`,vt=(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})},yt=(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(w))return void(e.dynamic=!0);if(0===a.length)return void(e.dynamic=!0);vt(e,a,"string"==typeof r.value?r.value:void 0,t.path)}catch{e.dynamic=!0}else e.dynamic=!0},gt=(e,t,r,a)=>{const n="lazyElements"===r||"race"===r;if("slice"===t.kind)return wt(e,t.elements,t.basePath,t.offset,a,n);if(n&&Array.isArray(t.value))return wt(e,t.value,t.path,0,a,!0);if("lazyEntries"===r){const r=$t(e,t,a);if(null!==r)return r}return He(e,t.value,t.path,a+1)},bt=(e,t)=>{const r=e.order++,a=t+1;return a>e.maxDepth&&(e.maxDepth=a),{order:r,containerDepth:a}},kt=(e,t,r,a,n)=>Array.from(t,(t,o)=>({key:o,rawChild:t,node:He(e,t,Ee(r,a+o),n+1)})),wt=(e,t,r,a,n,o)=>{const{order:s,containerDepth:i}=bt(e,n),l=kt(e,t,r,a,i);if(o&&!l.every(e=>"constant"===e.node.kind)){return{kind:"elements",nodes:l.map(e=>e.node),path:r,order:s}}return It(e,t,l,!0,!1,void 0,r,s)},$t=(e,t,r)=>{const a=t.value;if(!n(a)||p(a,e.recognizes))return null;const{order:o,containerDepth:s}=bt(e,r),{entries:i,vars:l,changed:c}=Tt(e,a,t.path,s,o,!0);if(i.every(e=>"constant"===e.node.kind))return It(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},xt=(e,t,n,o,i)=>{const l=r=>{_e(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,$(n)];for(const t of u){if(void 0!==g(t))return l(`'${n}' collides with the reserved namespace word '${t}'`);if(null!==b(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},jt=(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&&!f.has(n))return _e(e,"error",s.malformedNode,`'${n}' may not sit beside the shorthand key '${r}' — reserved modifiers only`,Ee(a,n),o),Ye(t,a,o);const u=t[r],d=Ee(a,r);if(l)return Nt(e,t,u,!0,a,o);if(c)return zt(e,t,i,u,a,n,o);const p=Yr(e.registry,i),m=ot(e,p,a,o);st(e,m,t,r,n);const h=[];return Ot(e,m,h,u,d,o),ct(e,m,h,n,o),m},Ot=(e,t,r,a,o,s)=>{if(Array.isArray(a))Pt(e,t,r,a,o,s);else if(!n(a)||p(a,e.recognizes))At(e,t,r,a,o,s);else for(const n in a){const i=a[n];"//"!==n&&void 0!==i&&lt(e,t,r,n,i,Ee(o,n),s)}},At=(e,t,r,a,n,o)=>{const s=h(t.entry.definition);null!==s?r.push({name:s,kind:"value",value:a,path:n}):Dt(e,t,n,o)},Pt=(e,t,r,a,n,o)=>{const s=t.entry.definition,i=m(s,a.length);if(null===i)return void Ct(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:Ee(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})},Dt=(e,t,r,a)=>_e(e,"error",s.positionalArity,`'${t.name}' takes no positional arguments — use the named form`,r,a,{operator:t.name}),Ct=(e,t,r,a,n)=>{const o=t.entry.definition.positionalParams;if(void 0===o)return void Dt(e,t,a,n);const i=o.length;_e(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})},Nt=(e,t,r,a,n,o)=>{for(const r in t)"operator"!==r&&"value"!==r&&"//"!==r&&"$literal"!==r&&("fallback"===r||"vars"===r||"noCache"===r?_e(e,"warning",s.uselessModifier,`'${r}' on 'literal' is dead — contents are never evaluated`,Ee(n,r),o):_e(e,"error",s.unknownNodeKey,`'${r}' is not a key of 'literal' — content goes in 'value'`,Ee(n,r),o,{operator:"literal"}));return a?Xe(r,n,o):(_e(e,"error",s.malformedNode,"'literal' requires its content in 'value'",n,o,{operator:"literal"}),Ye(t,n,o))},St=(e,t,r,a,n)=>{const o=t.fragment;if("string"!=typeof o)return nt(e,t,"fragment",r,n);const i=Et(e,o,r,a,n);return st(e,i,t,"fragment",a,(t,o)=>{"parameters"===t?Mt(e,i,o,Ee(r,t),a,n):_e(e,"error",s.unknownNodeKey,`'${t}' is not a key of a fragment call — arguments live only in 'parameters'`,Ee(r,t),n)}),i},zt=(e,t,r,a,o,i,l)=>{const c=Et(e,r,o,i,l);return st(e,c,t,`$${r}`,i),n(a)?Mt(e,c,a,Ee(o,`$${r}`),i,l):_e(e,"error",s.malformedNode,`fragments have no single-value or positional form — '$${r}' takes a named-arguments object`,Ee(o,`$${r}`),l),c},Et=(e,t,r,a,n)=>{const o={kind:"fragmentCall",name:t,argumentsMode:"static",path:r,order:n};e.fragmentNames.add(t);const i=e.registry.fragments.get(t);if(void 0===i){const a=T(t,e.registry.fragments.keys());return _e(e,"error",s.unknownFragment,`'${t}' names no registered fragment${V(a)}`,r,n,{suggestion:a}),o}return o.entry=i,e.fragmentCalls.push({name:t,depth:a}),e.dataReads.push({kind:"call",fragment:i,path:r}),o},Mt=(e,t,r,o,i,l)=>{if(p(r,e.recognizes)||"string"==typeof r&&"reference"===a(r,e.scope).kind)return t.argumentsMode="dynamic",t.parameters=He(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]=He(e,n,Ee(o,t),i+1))}return void(t.parameters=a)}_e(e,"error",s.malformedNode,"a fragment's 'parameters' must be a named-arguments object or a node computing one",o,l)},qt=(e,t,a,o,i)=>{const l=Ee(a,"vars");if(!n(t))return void _e(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=Ee(l,a),d=r(a);d.ok?c[a]=He(e,n,u,o+1):_e(e,"error",s.invalidName,`'${a}' is not a legal var name — ${d.reason}`,u,i)}return c},Ft=(e,t,r,a,n)=>{const{entries:o,vars:s,changed:i}=Tt(e,t,r,a,n);return It(e,t,o,!1,i,s,r,n)},Tt=(e,t,r,a,n,o=!1)=>{let i,l=!1;const c=[],u=!o&&Vt(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=T(u.slice(1),Ut(e)),a=void 0!==t?V(`$${t}`):o?"":" — data with a '$' key goes inside 'literal'";_e(e,o?"warning":"error",s.unrecognizedIdentifier,`'${u}' is not a registered operator or fragment${o?", so it is a plain key":""}${a}`,Ee(r,u),n,{suggestion:void 0===t?void 0:`$${t}`})}c.push({key:u,rawChild:d,node:He(e,d,Ee(r,u),a+1)})}else l=!0;else i=qt(e,d,r,a,n),l=!0;else l=!0}return u&&e.unknownNodes--,{entries:c,vars:i,changed:l}},Vt=e=>{for(const t in e)if(t.startsWith("$")&&void 0!==e[t])return!0;return!1},It=(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}):(Le(u,e,a.skeleton),c.push(...a.holes.map(t=>({...t,at:[e,...t.at]}))))):(Le(u,e,a.value),a.value!==t&&(d=!0));if(0===c.length)return void 0!==o&&Object.keys(o).length>0&&_e(e,"warning",s.unreferencedVar,"this vars block declares names nothing in its scope references",Ee(i,"vars"),l),Xe(d||void 0!==o?u:t,i,l);const f={kind:"skeleton",skeleton:u,holes:c,path:i,order:l};return void 0!==o&&(f.vars=o),f},Rt=(e,t=[])=>{if("skeleton"===e.kind)for(const r of e.holes)Rt(r.node,t);else if("constant"!==e.kind){const r=Lt(e);t.push(void 0===r?{node:e}:{node:e,timeoutFallback:r})}return t},Lt=e=>{if("operator"===e.kind||"fragmentCall"===e.kind)return void 0!==e.fallback?Wt(e.fallback):"operator"===e.kind?e.entry.defaultFallback:e.entry?.timeoutFallback},Wt=e=>{if("constant"===e.kind)return{value:e.value};const t=[],r=Bt(e,[],t);return void 0===r?void 0:{value:r,reads:t}},Bt=(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=Bt(n.node,[...t,...n.at],r);if(void 0===e)return;a.push(e)}return We(e.skeleton,e.holes,a)},Jt=new WeakMap,Ut=e=>{const t=Jt.get(e.registry);if(void 0!==t)return t;const r=[...e.registry.operators.keys(),...e.registry.aliases.keys(),...e.registry.fragments.keys()];return Jt.set(e.registry,r),r},Gt=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 Kt(e.value);default:return"any"}},Kt=e=>{if(null===e)return"null";if(Array.isArray(e))return"array";if(q(e))return"object";switch(typeof e){case"string":return"string";case"number":return"number";case"boolean":return"boolean";default:return"any"}},_t=/*#__PURE__*/Object.freeze({parsePath:k,resolvePath:x,checkType:Q,checkConstraints:X,describeType:B,renderText:he,isTruthy:ue}),Ht=(e,t={})=>{Xt({artifact:e,context:t,varsFrames:[],iteratorFrames:[],fallbackFrames:[]},e.root),Fe(e.issues),e.hasErrors=Ve(e.issues)},Qt=(e,t,r,a,n,o,s)=>{Te(e.artifact.issues,t,r,a,n,o,s)},Xt=(e,t)=>{switch(t.kind){case"constant":case"invalid":return;case"reference":return void pr(e,t);case"skeleton":{const r=gr(e,t.vars,t.path);for(const r of t.holes)Xt(e,r.node);return void br(e,r)}case"fragmentCall":return void dr(e,t);case"elements":for(const r of t.nodes)Xt(e,r);return;case"entries":{const r=gr(e,t.vars,t.path);for(const r in t.entries)Xt(e,t.entries[r]);return void br(e,r)}case"operator":return void Zt(e,t)}return t},Yt=(e,t,r)=>{const a={referenced:!1};e.fallbackFrames.push(a),Xt(e,r),e.fallbackFrames.pop(),a.referenced&&(t.fallbackReadsError=!0)},Zt=(e,t)=>{const r=gr(e,t.vars,t.path);void 0!==t.fallback&&Yt(e,t,t.fallback);const a=t.entry.definition,n=ur(t);for(const[r,o]of a.resolution.entries){const a=t.params[r];void 0!==a?tr(e,n,r,o,a,er(t,r)):o.required&&Qt(e,"error",s.missingRequired,`'${t.name}' requires '${r}'`,t.path,t.order,{operator:t.name,parameter:r})}fr(e,t);const o=[];for(const r in t.params){const n=t.params[r];"perElement"===a.parameters[r]?.evaluation?o.push([r,n]):Xt(e,n)}if(o.length>0){const r={as:Ie(t),referenced:!1};e.iteratorFrames.push(r);for(const[,t]of o)Xt(e,t);e.iteratorFrames.pop(),r.referenced||Qt(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})}br(e,r)},er=(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},tr=(e,t,r,a,n,o=!1)=>{const i={...t.extra,parameter:r};if("elements"===n.kind){const o=a.constraints?.length;return void(void 0!==o&&n.nodes.length!==o&&Qt(e,"error",s.typeCheck,`'${t.label}.${r}': expected ${o} element${1===o?"":"s"}, received ${n.nodes.length}`,n.path,n.order,i))}if("constant"!==n.kind&&"structural"===a.evaluation&&"as"!==r)return void Qt(e,"error",s.typeCheck,`'${t.label}.${r}' is structural — it requires a literal value`,n.path,n.order,i);const l=`'${t.label}.${r}'`,c=ar(a,n,o);void 0!==c&&Qt(e,"error",c.code,c.code===s.returnsMismatch?`${c.reason} — it can never satisfy ${l}`:`${l}: ${c.reason}`,n.path,n.order,i);let u=n;for(;"operator"===u.kind||"fragmentCall"===u.kind;){const n=u.fallback;if(void 0===n)return void("operator"===u.kind&&rr(e,t,r,a,u,o));const c=ar(a,n,o);void 0!==c&&Qt(e,"warning",s.fallbackMismatch,`this fallback can never satisfy ${l}: ${c.reason}`,n.path,n.order,i),u=n}},rr=(e,t,r,a,n,o)=>{const i=n.entry.defaultFallback;if(void 0===i)return;const l=nr(a,i,o);void 0!==l&&Qt(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})},ar=(e,t,r)=>{switch(t.kind){case"constant":return cr(e,t.value,r);case"operator":case"fragmentCall":{if("fragmentCall"===t.kind&&void 0===t.entry)return;const r=Gt(t);if(j(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 sr(e,Array.isArray(t.skeleton)?[]:{});case"reference":return"error"===t.namespace?or(e,t.segments):void 0;default:return}},nr=(e,{value:t,reads:r},a)=>void 0===r?cr(e,t,a):0===r[0].at.length?or(e,r[0].segments):sr(e,Array.isArray(t)?[]:{}),or=(e,t)=>{const r=lr(t);if(void 0!==r&&!j(r,e.type))return sr(e,ir[r])},sr=(e,t)=>{const r=Q(t,e.type);if(!r.ok)return{code:s.typeCheck,reason:`expected ${r.expected}, received ${r.actual}`}},ir={object:{},array:[],string:"",number:0,boolean:!1},lr=e=>{const[t,...r]=e;if(void 0===t)return"object";if(r.length>0||!Object.hasOwn(O,t))return;const a=O[t];return"string"==typeof a?a:void 0},cr=(e,t,r)=>{if(null===t&&(r||K(e)))return;const a=ne(t,e);return a.ok?void 0:{code:s.typeCheck,reason:`expected ${a.expected}, received ${a.actual}`}},ur=e=>({label:e.name,extra:{operator:e.name}}),dr=(e,t)=>{const r=gr(e,t.vars,t.path);void 0!==t.fallback&&Yt(e,t,t.fallback);const a=t.entry?.parameters,n="static"===t.argumentsMode?t.parameters:void 0;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?tr(e,r,o,i,l):i.required&&Qt(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=T(r,Object.keys(a));Qt(e,"error",s.unknownNodeKey,`fragment '${t.name}' declares no parameter '${r}'${V(n)}`,o.path,o.order,{parameter:r,suggestion:n})}}}if(void 0!==n)for(const t in n)Xt(e,n[t]);else void 0!==t.parameters&&Xt(e,t.parameters);br(e,r)},fr=(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,_t)}catch(r){return void Qt(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;Qt(e,r.severity,s.operatorValidate,r.message,a?.path??t.path,t.order,{operator:t.name,parameter:r.parameter})}},pr=(e,t)=>{const{namespace:r}=t;switch(r){case"data":return;case"vars":return void mr(e,t);case"params":return void hr(e,t);case"element":case"index":return void vr(e,t,r);case"error":return void yr(e,t)}return r},mr=(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}}Qt(e,"error",s.unresolvedVar,`'${t.raw}': no var '${a??""}' is declared in scope`,t.path,t.order)},hr=(e,t)=>{const r=e.context.fragmentParams;if(void 0===r)return void Qt(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)||Qt(e,"error",s.unresolvedParam,`'${t.raw}': the fragment declares no parameter '${String(a)}'`,t.path,t.order)},vr=(e,t,r)=>{for(let a=e.iteratorFrames.length-1;a>=0;a--){const n=e.iteratorFrames[a];if(Re(n.as,r,t.binding))return void(n.referenced=!0)}t.scopeUnknown||Qt(e,"error",s.unresolvedBinding,`'${t.raw}' resolves against no enclosing iterator here`,t.path,t.order)},yr=(e,t)=>{const r=e.fallbackFrames.at(-1);void 0===r?t.scopeUnknown||Qt(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},gr=(e,t,r)=>{if(void 0===t)return null;const a={names:new Map,currentVar:null,edges:new Map},n=Ee(r,"vars");for(const r in t){const o=t[r],i=Ee(n,r);for(const t of e.varsFrames)if(t.names.has(r)){Qt(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,Xt(e,r.node),a.currentVar=null;return a},br=(e,t)=>{if(null!==t){e.varsFrames.pop();for(const[r,a]of t.names)a.referenced||Qt(e,"warning",s.unreferencedVar,`'${r}' is declared but never referenced in its scope`,a.declaredAt,a.order);kr(e,t)}},kr=(e,t)=>{const r=new Map([...t.names.keys()].map((e,t)=>[e,t]));L(t.names.keys(),e=>t.edges.get(e),a=>{const n=a.sort((e,t)=>r.get(e)-r.get(t)),o=n.map(e=>`'${e}'`),i=1===o.length?`${o[0]} depends on itself`:`${I(o)} form a vars cycle — a var may not depend on itself`,l=t.names.get(n[0]);Qt(e,"error",s.varCycle,i,l.declaredAt,l.order)})},wr={capable:!1,effective:!1,disabled:[]},$r={capable:!0,effective:!0,disabled:[]},xr=e=>{const{effective:t}=jr(e,e.root,!1);return Fe(e.issues),t},jr=(e,t,r)=>{switch(t.kind){case"constant":case"reference":return wr;case"invalid":return $r;case"skeleton":case"elements":case"entries":return Dr(e,qe(t),r);case"operator":return Or(e,t,_r(t.entry),r);case"fragmentCall":return Or(e,t,t.entry?.caches??!0,r)}return t},Or=(e,t,r,a)=>{const n=!0===t.noCache,o=Dr(e,qe(t),a||n),s=r||o.capable,i=Ar(t),l=void 0===i?o.disabled:[i,...o.disabled];return n&&a?Cr(e,t,"'noCache' is redundant — an enclosing node already sets it"):n&&!s&&Cr(e,t,l.length>0?`'noCache' is redundant — caching is already disabled for ${Pr(l)}`:"'noCache' is dead — nothing beneath this node caches"),{capable:s,effective:!n&&(r||o.effective),disabled:l}},Ar=e=>"operator"===e.kind&&e.entry.definition.cache&&!_r(e.entry)?e.entry.definition.name:void 0,Pr=e=>I([...new Set(e)].map(e=>`'${e}'`)),Dr=(e,t,r)=>{const a={capable:!1,effective:!1,disabled:[]};for(const n of t){const{capable:t,effective:o,disabled:s}=jr(e,n,r);a.capable||=t,a.effective||=o,a.disabled.push(...s)}return a},Cr=(e,t,r)=>{Te(e.issues,"warning",s.uselessModifier,r,Ee(t.path,"noCache"),t.order,"operator"===t.kind?{operator:t.name}:{fragment:t.name})};class Nr{max;entries=new Map;constructor(e){this.max=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(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 Sr=Symbol("fig-tree:lazy-handle"),zr="~",Er=(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=Er(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=Er(e[r],t+1);if("json"!==a)return a}return"json"},Mr=(e,t)=>qr(e,0,t)?t.join(""):void 0,qr=(e,t,r)=>{if(t>o)return!1;if(null===e)return Tr(r,"n");if(void 0===e)return Tr(r,"u");switch(typeof e){case"boolean":return Tr(r,e?"t":"f");case"number":return Fr(e,r);case"string":return Tr(r,`s${e.length}:${e}`);case"object":break;default:return!1}if(Array.isArray(e)){r.push("[");for(const a of e)if(!qr(a,t+1,r))return!1;return Tr(r,"]")}if(!n(e)||Sr in e)return!1;r.push("{");for(const a in e)if(r.push(`s${a.length}:${a}`),!qr(e[a],t+1,r))return!1;return Tr(r,"}")},Fr=(e,t)=>Number.isNaN(e)?Tr(t,"N"):e===1/0?Tr(t,"I"):e===-1/0?Tr(t,"J"):Object.is(e,-0)?Tr(t,"#-0"):Tr(t,`#${String(e)}`),Tr=(e,t)=>(e.push(t),!0);class Vr{deps;identity=new WeakMap;content=new Nr(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=Er(e,0);return"json"===t?JSON.stringify(e):"serializer"===t?Mr(e,[zr]):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 Ir=/*#__PURE__*/new Set(["type","required","default","description","metadata","constraints"]),Rr=/*#__PURE__*/new Set(["expression","parameters","description","metadata"]),Lr=(e,t,a)=>{const n=(...t)=>["fragments",e,...t],o=r(e);if(!o.ok)return void a(s.invalidName,`'${e}' is not a legal fragment name: ${o.reason}`,n());if(A(e))return void a(s.reservedName,`'${e}' is a reserved name and may not name a fragment`,n());if(!q(t))return void a(s.invalidDefinition,`fragment '${e}' must be a wrapper object: { expression, parameters?, description?, metadata? }`,n());if(!("expression"in t))return void a(s.invalidDefinition,`fragment '${e}' has no 'expression'`,n());for(const e of Object.keys(t))Rr.has(e)||a(s.invalidDefinition,`'${e}' is not a key of a fragment definition`,n(e));const i={name:e,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!==t.description&&("string"!=typeof t.description?a(s.invalidDefinition,"'description' must be a string",n("description")):i.description=t.description),void 0!==t.metadata&&(q(t.metadata)?i.metadata=t.metadata:a(s.invalidDefinition,"'metadata' must be a plain object",n("metadata"))),void 0!==t.parameters)if(q(t.parameters))for(const[e,r]of Object.entries(t.parameters)){const t=Wr(e,r,n,a);void 0!==t&&(i.parameters[e]=t)}else a(s.invalidDefinition,"'parameters' must be a plain object",n("parameters"));return i},Wr=(e,t,a,n)=>{const o=a("parameters",e),i=r(e);if(!i.ok)return void n(s.invalidName,`'${e}' is not a legal parameter name: ${i.reason}`,o);if(P.has(e))return void n(s.reservedName,`'${e}' is a reserved node key and may not name a parameter`,o);if(!q(t))return void n(s.invalidDefinition,`the declaration of '${e}' must be an object`,o);for(const e of Object.keys(t))Ir.has(e)||n(s.invalidDefinition,`'${e}' is not a key of a parameter declaration`,[...o,e]);const l=t.type??"any";if(!H(l))return void n(s.invalidDefinition,`'${e}' declares an unknown type`,[...o,"type"]);if(void 0!==t.required&&"boolean"!=typeof t.required)return void n(s.invalidDefinition,"'required' must be a boolean",[...o,"required"]);let c;if(void 0!==t.constraints){const r=ee(t.constraints);if(!r.ok)return void n(s.invalidDefinition,`'${e}' declares invalid constraints: expected ${r.expected}, got ${r.actual}`,[...o,"constraints"]);c=t.constraints}const u="default"in t;if(u&&!0===t.required)return void n(s.invalidDefinition,`'${e}' is declared required and also declares a default — the default could never apply`,[...o,"default"]);if(u){const r=Q(t.default,l);if(!r.ok)return void n(s.typeCheck,`the default for '${e}' does not satisfy its declared type: expected ${r.expected}, got ${r.actual}`,[...o,"default"]);const a=ae(t.default,{constraints:c});if(!a.ok)return void n(s.typeCheck,`the default for '${e}' violates its declared constraints: expected ${a.expected}, got ${a.actual}`,[...o,"default"])}const d={type:l,required:t.required??!u};return u&&(d.default=t.default),"string"==typeof t.description&&(d.description=t.description),q(t.metadata)&&(d.metadata=t.metadata),void 0!==c&&(d.constraints=c),d},Br=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=Gt(n),t.delete(e.name),r.add(e.name)};for(const t of e.fragments.values())a(t)},Jr=(e,t)=>L(e.keys(),t=>e.get(t)?.fragmentCalls.map(e=>e.name),([e,...r])=>t(s.fragmentCycle,`fragment '${e}' reaches itself: ${[e,...r,e].join(" → ")} — recursion is not supported`,["fragments",e])),Ur=(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=Ge(s.own,s.fragmentCalls,e.fragments);o.nodeCount=i.nodeCount,o.maxDepth=i.maxDepth,o.dependencies=i.dependencies,o.identityOnly=i.identityOnly,o.caches=xr(s),o.timeoutFallback=Gr(n,s,e.fragments)};for(const e of t.keys())a(e)},Gr=(e,t,r)=>{const{root:a,holes:n}=t;if(0===n.length)return;const o=[];for(const e of n){const t=Kr(e,r);if(void 0===t)return;o.push(t)}const s=[];let i=0;const l=(t,r)=>{if("skeleton"===t.kind)return We(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:Me(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}},Kr=(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},_r=e=>e.definition.cache&&!0!==e.hostDefaults?.noCache,Hr=["fallback","noCache"],Qr=e=>{const t=[],r=(e,r,a,n)=>{t.push({severity:"error",code:e,message:r,path:a,...void 0!==n?{operator:n}:{}})},a={operators:new Map,aliases:new Map,fragments:new Map},{operators:n,aliases:o}=a,i=new Map,l=(e,t,a)=>{const n=i.get(e);return void 0!==n?(r(s.duplicateOperator,`'${e}' is already registered (by '${n}') — one namespace, no silent precedence`,t,a),!1):(i.set(e,a),!0)},c=(e,t)=>{if("function"==typeof e)return void r(s.invalidOptions,`operators[${t[1]}]${t.length>2?`[${t[2]}]`:""} is a function — factories must be called: httpOperators(client)`,t);if(!le(e))return void r(s.invalidOptions,"every operators entry must be built with defineOperator() — a plain definition object is not accepted",t);const{name:a,alias:i}=e,c=l(a,t,a),u=void 0===i||l(i,t,a);c&&u&&(n.set(a,{definition:e}),void 0!==i&&o.set(i,a))};if(Array.isArray(e.operators)?e.operators.forEach((e,t)=>{Array.isArray(e)?e.forEach((e,a)=>{Array.isArray(e)?r(s.invalidOptions,"'operators' is flattened one level only — arrays may not nest deeper",["operators",t,a]):c(e,["operators",t,a])}):c(e,["operators",t])}):r(s.invalidOptions,"'operators' must be an array",["operators"]),void 0!==e.operatorDefaults&&Xr(e.operatorDefaults,n,o,r),((e,t,r,a)=>{if(void 0===e)return;if(!q(e))return void a(s.invalidOptions,"'fragments' must be a plain object",["fragments"]);for(const[n,o]of Object.entries(e)){const e=Lr(n,o,a);void 0!==e&&r(n,["fragments",n])&&t.fragments.set(n,e)}const n=new Map;for(const[r,a]of t.fragments){const o=e[r],s=Ue(o.expression,t,{basePath:["expression"]});a.body=s.root,n.set(r,s)}Br(t);for(const[e,r]of t.fragments){const t=n.get(e);Ht(t,{fragmentParams:new Set(Object.keys(r.parameters))});for(const{issue:r}of t.issues)"error"===r.severity&&a(r.code,`fragment '${e}': ${r.message}`,["fragments",e,...r.path])}Jr(n,a)&&Ur(t,n);for(const[e,r]of t.fragments)for(const{issue:t}of n.get(e).issues)if("error"!==t.severity){const e={...t,path:[...t.path]};Object.freeze(e.path),r.warnings.push(Object.freeze(e))}})(e.fragments,a,(e,t)=>l(e,t,e),r),t.length>0)throw z(s.invalidOptions,t,t[0].operator);return a},Xr=(e,t,r,a)=>{if(q(e))for(const[n,o]of Object.entries(e)){const e=["operatorDefaults",n],i=t.get(n);if(void 0===i){const t=r.get(n);void 0!==t?a(s.invalidOptions,`'operatorDefaults' keys are canonical names — use '${t}', not its alias '${n}'`,e,t):a(s.unknownOperator,`'${n}' names no registered operator`,e);continue}if(!q(o)){a(s.invalidOptions,`the defaults for '${n}' must be a plain object`,e,n);continue}let l,c=!0;for(const[t,r]of Object.entries(o)){const o=[...e,t];if(Hr.includes(t)){"fallback"===t&&(l=Se(r),void 0===l&&(a(s.invalidOptions,`the default fallback for '${n}' must be static, built only from literals and $error reads — it is never evaluated`,o,n),c=!1)),"noCache"===t&&(!0!==r?(a(s.invalidOptions,"the 'noCache' modifier takes only the literal true",o,n),c=!1):i.definition.cache||(a(s.invalidOptions,`'noCache' on '${n}', which never caches — its definition does not declare 'cache: true'`,o,n),c=!1));continue}const u=i.definition.parameters[t];if(void 0===u){a(s.invalidOptions,`'${t}' names no declared parameter of '${n}' (nor 'fallback'/'noCache')`,o,n),c=!1;continue}if(u.required){a(s.invalidOptions,`'${t}' is a required parameter of '${n}' — operatorDefaults may only target optional parameters`,o,n),c=!1;continue}const d=Q(r,u.type);if(!d.ok){a(s.typeCheck,`the default for '${n}.${t}' does not satisfy its declared type: expected ${d.expected}, got ${d.actual}`,o,n),c=!1;continue}const f=ae(r,u);f.ok||(a(s.typeCheck,`the default for '${n}.${t}' violates its declared constraints: expected ${f.expected}, got ${f.actual}`,o,n),c=!1)}c&&(i.hostDefaults=Object.freeze({...o}),void 0!==l&&(i.defaultFallback=l))}else a(s.invalidOptions,"'operatorDefaults' must be a plain object",["operatorDefaults"])},Yr=(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},Zr="fig-tree:scope-settled",ea="fig-tree:request-expired",ta="fig-tree:evaluation-timeout";class ra{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?Zr:this.parent?.reason}get signal(){if(void 0===this.controller){const e=new AbortController;if(this.controller=e,this.settled)e.abort(Zr);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(Zr)))}}const aa=(e,t,r=E)=>({get aborted(){return e.aborted},get reason(){return e.reason},signal:e,clock:t,settle:r}),na=(e,t,r)=>{const a=new AbortController,{signal:n}=a,o=()=>a.abort(e?.reason);let s;e?.aborted?o():e?.addEventListener("abort",o,{once:!0});const i=new Promise((e,t)=>{s=t});i.catch(E);const l=()=>s(n.reason);n.aborted?l():n.addEventListener("abort",l,{once:!0});const c=void 0===t?void 0:setTimeout(()=>a.abort(r),Math.min(t,2147483647));return{signal:n,expiry:i,settle:()=>{void 0!==c&&clearTimeout(c),n.removeEventListener("abort",l),e?.removeEventListener("abort",o),a.abort(Zr)}}},oa=(e,t)=>na(e,t,ea),sa=(e,t)=>(r,a)=>{const n=(o=[e.operator,e.fingerprint,r],Mr(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)},ia=/*#__PURE__*/Object.freeze({}),la=(e,t)=>!0!==t||!0===e.noCache?e:{...e,noCache:t};class ca{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 ua={memo:(e,t)=>t()},da={note:E},fa=Symbol("fig-tree:internal-error"),pa=e=>ja(`[fig-tree internal] ${e}`,fa),ma=e=>pa(`${e} reached evaluation — the static gate should have refused it`),ha=(t,r,a,n)=>new e({code:r,message:`${t.name} – ${a}`,path:Me(t.path),operator:t.name,errorData:n}),va=e=>Aa(e,fa),ya=Symbol("fig-tree:cancelled"),ga=()=>ja("[fig-tree] evaluation cancelled",ya),ba=e=>Aa(e,ya),ka=(e,t,r)=>e.rootScope.aborted?wa(e.rootScope.reason,t,r):e.abortScope.aborted?ga():void 0,wa=(e,t,r)=>e===Zr?ga():$a(e,Me(t),{operator:r}),$a=(t,r,a={})=>{const{operator:n,ms:o}=a,i=t===ta,l=void 0===o?"":`${o}ms `;return new e({code:i?s.timeout:s.aborted,message:i?`evaluation exceeded its ${l}timeout`:"evaluation was aborted by the caller",path:r,...void 0!==n?{operator:n}:{}})},xa=e=>va(e)||ba(e)||(e=>D(e)&&(e.code===s.aborted||e.code===s.timeout))(e),ja=(e,t)=>{const r=new Error(e);return Oa(r,t),r},Oa=(e,t)=>{e[t]=!0},Aa=(e,t)=>e instanceof Error&&!0===e[t],Pa=()=>performance.now(),Da=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,...Ca(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=Ma(e),l=qa(e),c={path:Me(e.path),kind:za(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:Pa()}),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=Pa()-u.started,s(c,{type:"shielded-fallback"});const d=Ea(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}}},Ca=e=>Na(e.node).filter(t=>!e.seen.has(t)).map(e=>({entry:{path:Me(e.path),kind:za(e),status:"skipped"},order:e.order,index:0})),Na=e=>{const t=qe(e).flatMap(Sa);return"fragmentCall"===e.kind&&void 0!==e.entry&&t.push(e.entry.body),t},Sa=e=>"elements"===e.kind||"entries"===e.kind?Na(e):[e],za=e=>{switch(e.kind){case"operator":return"operator";case"fragmentCall":return"fragment";case"reference":return"reference";case"skeleton":return"skeleton";default:return"literal"}},Ea=e=>"operator"===e.kind||"fragmentCall"===e.kind?e.fallback:void 0,Ma=e=>"operator"===e.kind||"fragmentCall"===e.kind?e.name:void 0,qa=e=>"reference"===e.kind?e.raw:void 0,Fa=async(e,t,r,a,n)=>{let o;try{o=await e()}catch(e){if(xa(e))throw e;if(!r){const r=a(e);throw D(r)&&r!==t&&void 0===r.cause&&(r.cause=t),r}o=null}return void 0!==n.trace&&void 0!==n.traceParent&&D(t)&&n.trace.markFallback(n.traceParent,t),o},Ta=(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,R(()=>Cn(n,a,{var:e})));return a},Va=async(e,t,r,a,n)=>{const o={...r,params:"dynamic"===e.argumentsMode?await Ra(e,t,a):Ia(e,t,a),frame:n};delete o.scope,delete o.bindings,delete o.caught;const s=await Cn(t.body,o);return void 0===s?null:s},Ia=(e,t,r)=>{const a=e.parameters??{},n=new Map;for(const[o,s]of Object.entries(t.parameters)){const t=a[o],i=R(async()=>{if(void 0===t)return La(e,o,s,r);let a;try{a=await Cn(t,r)}catch(e){throw Ua(e,r.frame)}return Wa(e,o,s,a,t.path,r)});n.set(o,()=>{const e=i();return e.catch(E),e})}return n},Ra=async(e,t,r)=>{const a=e.parameters;let n;try{n=await Cn(a,r)}catch(e){throw Ua(e,r.frame)}if(!q(n))throw Ua(Ba(e,s.typeCheck,`'parameters' must evaluate to an object, received ${B(n)}`,a.path),r.frame);const o=new Map;for(const[s,i]of Object.entries(t.parameters)){const t=Object.hasOwn(n,s)?Wa(e,s,i,n[s],a.path,r):La(e,s,i,r,a.path);o.set(s,()=>Promise.resolve(t))}return o},La=(e,t,r,a,n=e.path)=>{if(!r.required)return r.default??null;throw Ua(Ba(e,s.missingRequired,`requires '${t}'`,n),a.frame)},Wa=(e,t,r,a,n,o)=>{const i=void 0===a?null:a;if(null===i&&K(r))return r.default??null;const l=ne(i,r);if(!l.ok)throw Ua(Ba(e,s.typeCheck,`parameter '${t}': expected ${l.expected}, received ${l.actual}`,n),o.frame);return i},Ba=(t,r,a,n)=>new e({code:r,message:`fragment '${t.name}' – ${a}`,path:Me(n)}),Ja=Symbol("fig-tree:anchored"),Ua=(e,t)=>!D(e)||Aa(e,Ja)?e:(Oa(e,Ja),void 0===t?e:Object.assign(e,Ga(e,t))),Ga=(e,t)=>({fragment:t.fragment,fragmentPath:e.path,path:Me(t.callPath)}),Ka=(e,t)=>{const r=void 0===t||Aa(e,Ja)?e:Ga(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 _a extends Error{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 Ha=e=>e instanceof _a,Qa=(e,t,r)=>Ya(Array.from({length:e},(e,a)=>Xa(a,()=>t(a),r)),e),Xa=async(e,t,r)=>{try{return{index:e,ok:!0,value:r(await t())}}catch(t){return{index:e,ok:!1,error:t}}},Ya=(e,t)=>{const r=new Map(e.map((e,t)=>[t,e]));return{[Sr]:!0,length:t,async*[Symbol.asyncIterator](){for(;r.size>0;){const e=await Promise.race(r.values());r.delete(e.index),yield e}}}},Za=e=>({[Sr]:!0,evaluate:R(e)}),en=e=>({[Sr]:!0,evaluate:()=>Promise.resolve(e)}),tn=(e,t,r,a,n)=>Za(async()=>rn(await Cn(e,n),t,r,a)),rn=(e,t,r,a)=>{const n=ne(e,a);if(!n.ok)throw ln(t,r,n);return a.truthiness?fn(e,a.type):e},an=(e,t,r,a,n,o)=>{const s=Array.isArray(t)?t:[],i=Ie(r),l=new Map,c=t=>{const c=l.get(t);if(void 0!==c)return c;const u=(async()=>rn(await Cn(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(E),l.set(t,u),u};return{[Sr]:!0,evaluate:c,settle:()=>Qa(s.length,c,e=>e)}},nn=(e,t)=>t.truthiness?ue(e):e,on=(e,t,r)=>{if("lazyElements"===t.evaluation&&"elements"===e.kind)return e.nodes.map((e,a)=>Za(async()=>nn(await Cn(e,r,{index:a}),t)));if("race"===t.evaluation&&"elements"===e.kind)return((e,t,r)=>Qa(e.length,r=>Cn(e[r],t,{index:r}),r))(e.nodes,r,e=>nn(e,t));if("lazyEntries"===t.evaluation&&"entries"===e.kind){const a=Ta(r,e.vars),n={};for(const[r,o]of Object.entries(e.entries))n[r]=Za(async()=>nn(await Cn(o,a),t));return n}},sn=(e,t)=>{switch(t.evaluation){case"lazyElements":return e.map(e=>en(nn(e,t)));case"race":return((e,t)=>Qa(e.length,t=>Promise.resolve(e[t]),t))(e,e=>nn(e,t));case"lazyEntries":{const r={};for(const[a,n]of Object.entries(e))r[a]=en(nn(n,t));return r}case"lazy":return en(e);default:return e}},ln=(e,t,r)=>ha(e,s.typeCheck,`parameter '${t}': expected ${r.expected}, received ${r.actual}`),cn=(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=Q(o,n.type);if(!s.ok)throw ln(e,a.selector,s);return a.table.find(e=>e.value===o).policy},un=async(e,t,r)=>{if(void 0!==t.elementNullPolicy){if(Array.isArray(e)&&e.includes(null)){const t=await r();return e.map(e=>null===e?t:e)}if(q(e)&&Object.values(e).includes(null)){const t=await r(),a={};for(const[r,n]of Object.entries(e))a[r]=null===n?t:n;return a}return e}return null===e?r():e},dn=e=>Array.isArray(e)?e.includes(null):!!q(e)&&Object.values(e).includes(null),fn=(e,t)=>{if((e=>!("object"==typeof e&&!Array.isArray(e))&&(Array.isArray(e)?e:[e]).every(e=>"array"===e||"object"===e))(t)){if(Array.isArray(e))return e.map(ue);if(q(e)){const t={};for(const[r,a]of Object.entries(e))t[r]=ue(a);return t}}return ue(e)},pn=(e,t)=>0===e.segments.length?t.data:kn(t.data,e.segments,e,t,"is absent from the evaluation data"),mn=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 ma(`'${e.raw}'`);const o=await n();return 0===a.length?wn(o):kn(o,a,e,t,`is absent from the value of '$vars.${r}'`)},hn=async(e,t)=>{const r=t.params;if(void 0===r)throw ma(`'${e.raw}'`);const[a,...n]=e.segments;if(void 0===a){const e={};return await Promise.all([...r].map(async([t,r])=>{e[t]=wn(await r())})),e}const o="string"==typeof a?r.get(a):void 0;if(void 0===o)throw ma(`'${e.raw}'`);const s=await o();return 0===n.length?wn(s):kn(s,n,e,t,`is absent from the value of '$params.${String(a)}'`)},vn=(e,t)=>{const r=e.namespace,a=((e,t,r)=>{for(let a=e;void 0!==a;a=a.parent)if(Re(a.as,t,r))return a})(t.bindings,r,e.binding);if(void 0===a)throw ma(`'${e.raw}'`);return"index"===r?a.index:0===e.segments.length?wn(a.element):kn(a.element,e.segments,e,t,`is absent from '${e.raw.split(".")[0]}'`)},yn=(e,t)=>{if(void 0===t.caught)throw ma(`'${e.raw}'`);return gn(Ka(t.caught,t.frame),e.segments)},gn=(e,t)=>{if(0===t.length)return e;const r=x(e,t);return r.found?wn(r.value):null},bn=(e,t,r)=>{const{value:a,reads:n}=e;if(void 0===n)return a;const o=Ka(t,r),s=n.map(({segments:e,within:t})=>gn(void 0===t?o:{...o,...t},e));return 0===n[0].at.length?s[0]:We(a,n,s)},kn=(t,r,a,n,o)=>{const i=x(t,r);if(i.found)return wn(i.value);if(!n.strictDataPaths)return null;throw new e({code:s.missingDataPath,message:`'${a.raw}' ${o} (strictDataPaths)`,path:Me(a.path)})},wn=e=>void 0===e?null:e,$n=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(Cn(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?R(()=>Cn(n,t)):void 0!==a&&Object.hasOwn(a,r)?R(()=>a[r]):void 0;if(void 0!==e)for(const t of o.replacesNullAt)(u??={})[t]=e;break}void 0!==n&&(d[r]=tn(n,e,r,o,t));break;case"lazyElements":case"lazyEntries":case"race":{if(void 0===n)break;const e=on(n,o,t);if(void 0!==e){d[r]=e;break}i.push(r),l.push(Cn(n,t));break}case"perElement":break;default:o.evaluation}}if(l.length>0)if(1===l.length){const e=l[0];c[i[0]]=M(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&&K(r))&&(void 0!==a&&Object.hasOwn(a,e)?c[e]=a[e]:"default"in r?c[e]=r.default===se?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 un(a,r,n));const o="eager"!==r.evaluation&&"structural"!==r.evaluation;if(null===a&&G(r.type)&&!o&&"propagate"===cn(e,r,c))return{params:d,propagate:!0};if("propagate"===r.elementNullPolicy&&dn(a))return{params:d,propagate:!0};a=rn(a,e,t,r),d[t]=sn(a,r)}for(const[r,a]of s){const n=e.params[r];void 0!==n&&(d[r]=an(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&&_r(e.entry),s=jn(n,r),i=void 0===s?void 0:oa(t.abortScope.signal,s),l=void 0===i?t:{...t,abortScope:aa(i.signal,t.abortScope.clock)},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 ca(e.abortScope,e.options,r?{memo:sa({operator:t.name,fingerprint:t.fingerprint,note:a},e.cache)}:ua,void 0===a?da:{note:a}))(l,n,o,c);try{return await xn(e,t,r,u,i)}catch(r){throw On(r,e,t,i,s)}finally{i?.settle()}},xn=async(e,t,r,a,n)=>{const o=ka(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?Pn(await s,e):(s.catch(E),Pn(await Promise.race([s,n.expiry]),e))},jn=(e,t)=>{const r=e.timeoutParam;if(null===r)return;const a=t[r];return"number"==typeof a&&a>0?a:void 0},On=(e,t,r,a,n)=>{if(va(e)||ba(e))return e;const o=ka(r,t.path,t.name);return void 0!==o?o:a?.signal.reason===ea?new _a(`request exceeded its ${String(n)}ms timeout`,{code:s.requestTimeout}):e},An=(e,t,r)=>{const a=e.fallback;if(void 0!==a)return()=>Cn(a,{...t,caught:r});const n=e.entry.defaultFallback;return void 0!==n?()=>bn(n,r,t.frame):void 0},Pn=(e,t)=>{if(void 0===e)return null;if("number"==typeof e&&!Number.isFinite(e))throw ha(t,s.nonFiniteResult,`produced a non-finite number (${String(e)})`);if("object"==typeof(r=e)&&null!==r&&!0===r[Sr])throw ha(t,s.escapedHandle,"returned a lazy handle instead of evaluating it");var r;return e},Dn=(e,t)=>{if(D(e))return e;const r=Ha(e)?e:void 0;return ha(t,r?.code??s.operatorFailure,e instanceof Error?e.message:String(e),r?.errorData)},Cn=(e,t,r)=>void 0!==t.trace?Nn(e,t,t.trace,r):t.abortScope.aborted?Promise.reject(ka(t,e.path)):Sn(e,t),Nn=async(e,t,r,a)=>{const n=r.enter(e,t.traceParent,t.frame,a),o=Pa();try{if(t.abortScope.aborted)throw ka(t,e.path);const a=await Sn(e,{...t,traceParent:n});return r.settle(n,"value",{value:a,elapsed:Pa()-o}),a}catch(e){throw r.settle(n,ba(e)?"cancelled":"failed",{...D(e)?{error:e}:{},elapsed:Pa()-o}),e}},Sn=(e,t)=>{try{switch(e.kind){case"constant":return e.value;case"reference":return((e,t)=>{switch(e.namespace){case"data":return pn(e,t);case"vars":return mn(e,t);case"params":return hn(e,t);case"element":case"index":return vn(e,t);case"error":return yn(e,t)}})(e,t);case"skeleton":return zn(e,t);case"operator":return(async(e,t)=>{const r=Ta(la(t,e.noCache),e.vars),a=e.entry.definition.deliversLazily?new ra(r.abortScope):void 0,n=void 0===a?r:{...r,abortScope:a};try{try{return await $n(e,n)}finally{a?.settle()}}catch(a){if(xa(a))throw a;const n=Dn(a,e),o=An(e,r,n);if(void 0===o)throw n;return Fa(o,n,e.fallbackReadsError,t=>Dn(t,e),t)}})(e,t);case"fragmentCall":return(async(e,t)=>{const{entry:r}=e;if(void 0===r)throw ma(`fragment call '${e.name}'`);const a=Ta(la(t,e.noCache),e.vars),n=new ra(a.abortScope),o={fragment:e.name,callPath:t.frame?.callPath??e.path},s={...a,abortScope:n};try{try{return await Va(e,r,s,a,o)}finally{n.settle()}}catch(r){if(xa(r))throw r;const n=Ua(r,o),{fallback:s}=e;if(void 0===s)throw n;const i=D(n)?{...a,caught:n}:a;return Fa(()=>Cn(s,i),n,e.fallbackReadsError,e=>Ua(e,t.frame),t)}})(e,t);default:throw pa(`a '${e.kind}' node reached the node dispatch`)}}catch(e){return Promise.reject(e)}},zn=async(e,t)=>{const r=t.rootBoundary,a=void 0===r?t:{...t,rootBoundary:void 0},n=Ta(a,e.vars),o=e.holes.map(({node:e})=>void 0===r?Cn(e,n):"skeleton"===e.kind?Cn(e,{...n,rootBoundary:r}):r(()=>Cn(e,n),e)),s=o.some(M)?await Promise.all(o):o;return We(e.skeleton,e.holes,s)},En=async(e,t,r)=>{const{timeout:a,signal:n}=t,o=e.holes.length>0,s=void 0!==a||void 0!==n?na(n,a,ta):void 0,i=void 0!==s?((e,t)=>{const r={epoch:0};return e.addEventListener("abort",()=>{r.epoch+=1},{once:!0}),aa(e,r,t)})(s.signal,s.settle):new ra(void 0),l=void 0!==s&&void 0!==a&&e.timeoutShielded&&o,c=!0===t.trace?Da(e.issues.map(e=>e.issue).filter(e=>"error"!==e.severity)):void 0,u=((e,t,r,a)=>({options:e,data:e.data??ia,abortScope:r,rootScope:r,cache:t,strictDataPaths:e.strictDataPaths??!1,...void 0!==a?{trace:a}:{}}))(t,r,i,c),d=l?qn(e,s.expiry,a,c):void 0,f=void 0!==d&&"skeleton"!==e.root.kind,p=void 0===d||f?u:{...u,rootBoundary:d};try{if(i.aborted)throw $a(i.reason,[]);const t=()=>f&&void 0!==d?d(()=>Cn(e.root,p),e.root):Cn(e.root,p),r=await(l||void 0===s?t():Mn(t,s,a));return void 0!==c?{result:r,trace:c.finish()}:{result:r}}catch(e){throw void 0!==c&&D(e)&&void 0===e.trace&&(e.trace=c.finish()),e}finally{i.settle()}},Mn=(e,t,r)=>Promise.race([e(),t.expiry.catch(e=>{throw $a(e,[],{ms:r})})]),qn=(e,t,r,a)=>{const n=new Map(e.holes.map(e=>[e.node,e]));return(e,o)=>{const s=n.get(o);let i=!1;const l=Promise.resolve(e()).then(e=>(i=!0,e));return Promise.race([l,t.catch(e=>{if(e!==ta)throw $a(e,[]);if(i)return;const t=Fn(s,e,r),n=Tn(s,t);return a?.markShielded(s.node,t,n),n})])}},Fn=(e,t,r)=>{const{node:a}=e,n="operator"===a.kind?a.name:void 0;return $a(t,Me(a.path),{operator:n,ms:r})},Tn=(e,t)=>bn(e.timeoutFallback,t,void 0),Vn={hit:!1},In=e=>{if(void 0===e)return{maxSize:50,maxTime:1800};if(!n(e))throw Ln("'cache' must be an object");const{store:t,maxSize:r,maxTime:a}=e;if(void 0!==t&&!Rn(t))throw Ln("'cache.store' must provide get, set, delete and clear methods");if(void 0!==r&&(!Number.isInteger(r)||r<1))throw Ln("'cache.maxSize' must be a positive integer");if(void 0!==a&&("number"!=typeof a||a<=0||Number.isNaN(a)))throw Ln("'cache.maxTime' must be a positive number of seconds, or Infinity");return{...void 0!==t?{store:t}:{},maxSize:r??50,maxTime:a??1800}},Rn=e=>"object"==typeof e&&null!==e&&["get","set","delete","clear"].every(t=>"function"==typeof e[t]),Ln=t=>new e({code:s.invalidOptions,message:t,path:[]});class Wn{store;own;maxTime;current=0;constructor(e){void 0===e.store?(this.own=new Nr(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 Vn}return n(r=t)&&"ft3"===r.fig&&"number"==typeof r.generation?t.generation<this.current||Bn(t)?(this.drop(e),Vn):{hit:!0,value:t.value}:Vn;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(E)}catch{}}configure(e){void 0===e.store?(this.own??=new Nr(e.maxSize),this.store=this.own):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(E)}catch{}}}const Bn=e=>void 0!==e.expiresAt&&e.expiresAt<=Date.now(),Jn=e=>e===C?0:"number"==typeof e?1:2,Un=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=Jn(r)-Jn(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]}),Gn=(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},Kn=(e,t)=>{const r=[];return void 0!==t.maxDepth&&e.maxDepth>t.maxDepth&&r.push(Hn(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},_n=(e,t)=>e.hasErrors||void 0!==t.maxDepth||void 0!==t.maxNodes?[...Kn(e,t),...e.issues.map(e=>e.issue)]:[],Hn=(e,t)=>({severity:"error",code:s.maxDepthExceeded,message:`the expression nests ${e} levels deep — maxDepth is ${t}`,path:[]}),Qn=(e,t,r)=>{const a=[...Kn(e,t),...e.issues.map(r)];return void 0!==t.data&&a.push(...Xn(e.dataReads,t.data)),a},Xn=(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=x(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:`'${N(o)}' is absent from the supplied sample data${d}`,path:Me(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},Yn="...",Zn=e=>e,eo=e=>{const r=Object.entries(e.parameters),a=new Map;for(const[e,{nullPolicy:n}]of r){if("function"!=typeof n)continue;const[o,{type:s}]=r.find(([,e])=>void 0!==e.type&&t(e.type)),{literal:i}=s;a.set(e,{selector:o,table:i.map(e=>({value:e,policy:n(e)}))})}return to(e,a)},to=(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&&G(s)?"value":"propagate",l={type:no(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.metadata&&(l.metadata=n.metadata),void 0!==n.elementNullPolicy&&(l.elementNullPolicy=n.elementNullPolicy),void 0!==n.constraints&&(l.constraints=oo(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(Yn)?a.slice(3):null,o={[ie]:!0,name:e.name,category:e.category,parameters:r,resolution:so(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?no(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=oo(e.analysis)),o.fingerprint=ro(o),io(o)},ro=e=>(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")})(JSON.stringify([e.name,Object.entries(e.parameters).map(([e,t])=>[e,ao(t)]),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)),ao=e=>{const t={...e};return delete t.metadata,t},no=e=>"string"==typeof e?e:t(e)?{literal:[...e.literal]}:[...e],oo=e=>{if(Array.isArray(e))return e.map(oo);if(q(e)){const t={};for(const[r,a]of Object.entries(e))t[r]=oo(a);return t}return e},so=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)}},io=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&&lo(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)},lo=e=>{Array.isArray(e)?(e.forEach(lo),Object.freeze(e)):q(e)&&(Object.values(e).forEach(lo),Object.freeze(e))},co=e=>{if(Array.isArray(e))return e;try{return k(e)}catch(e){throw new _a(e.message)}},uo=(e,t)=>{if("string"!=typeof e)return[];try{return k(e),[]}catch(e){return[{severity:"error",parameter:t,message:e.message}]}},fo=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"}]:[],po=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`}]:[]},mo=/*#__PURE__*/po("values"),ho=/*#__PURE__*/po("input"),vo=/*#__PURE__*/po("entries"),yo=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"}]:[],go=(e,t)=>new _a(`${e} of nothing — the values array is empty${void 0!==t?`; ${t}`:""}`,{code:s.emptyAggregate}),bo=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),ko(r);return!t},ko=e=>{const[t,...r]=e,a=r.map(e=>e.error).filter(D);return a.length>0&&D(t.error)&&void 0===t.error.related&&(t.error.related=a),t.error},wo=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)},$o=(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=>Pe(r(e),a))},xo={values:{type:"array",elementNullPolicy:"value"},caseInsensitive:{type:"boolean",default:!1}},jo={name:"equal",alias:"=",category:"comparison",parameters:xo,positionalParams:["...values"],returns:"boolean",validate:yo,evaluate:({values:e,caseInsensitive:t})=>$o(e,t)},Oo={name:"notEqual",alias:"!=",category:"comparison",parameters:xo,positionalParams:["...values"],returns:"boolean",validate:yo,evaluate:({values:e,caseInsensitive:t})=>!$o(e,t)},Ao=(e,t,r)=>({name:e,alias:t,category:"comparison",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{length:2,homogeneous:["number","string"]}},nullValueDefault:{type:["number","string"],required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:"boolean",evaluate:({values:e})=>{const[t,a]=e;return r(de(t,a))}}),Po=/*#__PURE__*/Ao("greaterThan",">",e=>e>0),Do=/*#__PURE__*/Ao("greaterThanOrEqual",">=",e=>e>=0),Co=/*#__PURE__*/Ao("lessThan","<",e=>e<0),No=/*#__PURE__*/Ao("lessThanOrEqual","<=",e=>e<=0),So={number:()=>0,string:()=>"",array:()=>[],object:()=>({})},zo={name:"plus",alias:"+",category:"math",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{homogeneous:["number","string","array","object"]}},expect:{type:{literal:["number","string","array","object"]},required:!1},nullValueDefault:{type:["number","string","array","object"],required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:["number","string","array","object"],validate:({values:e,expect:t})=>void 0!==t?mo({values:e}):fo({values:e}),evaluate:({values:e,expect:t})=>{if(0===e.length){if(void 0===t)throw go("the sum","pin the mode with 'expect' to get its identity");return So[t]()}const r=B(e[0]);if(void 0!==t&&r!==t)throw new _a(`all operands must be ${t}s — received ${r}`,{code:s.typeCheck});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)}}},Eo={name:"subtract",alias:"-",category:"math",parameters:{value:{type:["number","null"]},minus:{type:["number","null"]}},positionalParams:["value","minus"],returns:"number",evaluate:({value:e,minus:t})=>e-t},Mo={name:"divide",alias:"/",category:"math",parameters:{value:{type:["number","null"]},by:{type:["number","null"]}},positionalParams:["value","by"],returns:"number",evaluate:({value:e,by:t})=>e/t},qo={name:"modulo",category:"math",parameters:{value:{type:["number","null"]},mod:{type:["number","null"]}},positionalParams:["value","mod"],returns:"number",evaluate:({value:e,mod:t})=>(e%t+t)%t},Fo={name:"multiply",alias:"*",category:"math",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{homogeneous:["number"]}},nullValueDefault:{type:"number",required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:"number",validate:mo,evaluate:({values:e})=>e.reduce((e,t)=>e*t,1)},To={name:"power",alias:"^",category:"math",parameters:{base:{type:["number","null"]},exponent:{type:["number","null"]}},positionalParams:["base","exponent"],returns:"number",evaluate:({base:e,exponent:t})=>e**t},Vo={name:"round",category:"math",parameters:{value:{type:["number","null"]},decimals:{type:"integer",default:0}},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(je(Math.abs(e),t));return r*je(a,-t)})(e,t)},Io=(e,t,r="number")=>({name:e,category:"math",parameters:{value:{type:["number","null"]}},positionalParams:["value"],returns:r,evaluate:({value:e})=>t(e)}),Ro=/*#__PURE__*/Io("floor",Math.floor,"integer"),Lo=/*#__PURE__*/Io("ceil",Math.ceil,"integer"),Wo=/*#__PURE__*/Io("abs",Math.abs),Bo=(e,t,r)=>({name:e,category:"math",parameters:{values:{type:"array",elementNullPolicy:"propagate",constraints:{homogeneous:["number","string"]}},nullValueDefault:{type:["number","string"],required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:["number","string"],validate:fo,evaluate:({values:e})=>{const a=e;if(0===a.length)throw go(t);return a.reduce((e,t)=>r(de(t,e))?t:e)}}),Jo=(e,t)=>({name:e,category:"string",parameters:{value:{type:["string","null"]}},positionalParams:["value"],returns:"string",evaluate:({value:e})=>t(e)}),Uo={name:"split",category:"string",parameters:{value:{type:["string","null"]},delimiter:{type:"string",default:" "},trim:{type:"boolean",default:!0}},positionalParams:["value","delimiter"],returns:"array",evaluate:({value:e,delimiter:t,trim:r})=>{const a=""===t?xe(e):e.split(t);return r?a.map(ge):a}},Go=e=>Array.isArray(e.values)&&e.values.some(ve)?[{severity:"error",parameter:"values",message:ye}]:[],Ko={name:"join",category:"string",parameters:{values:{type:"array",elementNullPolicy:"value"},delimiter:{type:"string",default:" "},nullValueDefault:{type:["string","number","boolean"],required:!1,evaluation:"lazy",replacesNullAt:["values"]}},positionalParams:["...values"],returns:"string",validate:e=>[...mo(e),...Go(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"}):ve(e)&&r.trace.note({type:"render",token:a,rendered:"placeholder"}),he(e)}).join(t)},_o=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}`},Ho={type:"array"},Qo={type:"string",required:!1,evaluation:"structural"},Xo={type:"array",required:!1,evaluation:"lazy",replacesNullAt:["input"]},Yo={type:"any",evaluation:"perElement",over:"input",truthiness:!0},Zo={name:"get",category:"data",parameters:{path:{type:["string","array","null"]},from:{type:"any",nullPolicy:"value",default:se},default:{type:"any",required:!1,evaluation:"lazy"}},positionalParams:S,returns:"any",validate:({path:e})=>uo(e,"path"),evaluate:({path:e,from:t,default:r},a)=>{const n=x(t,co(e));if(n.found)return n.value;if(void 0!==r)return r.evaluate();if(a.options.strictDataPaths)throw new _a(`'${es(e)}' is missing (strictDataPaths)`,{code:s.missingDataPath});return null}},es=e=>"string"==typeof e?e:e.map(e=>String(e)).join("."),ts={name:"buildObject",category:"data",parameters:{entries:{type:"array",constraints:{elementShape:{key:{type:["string","number","boolean"]},value:{type:"any"}}}}},positionalParams:["...entries"],returns:"object",validate:e=>[...vo(e),...rs(e)],evaluate:({entries:e},t)=>{const r={};for(const a of e){const e=he(a.key);Object.hasOwn(r,e)&&t.trace.note({type:"key-overwrite",key:e}),r[e]=a.value}return r}},rs=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=he(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},as=(e,t)=>new _a(`cannot convert ${B(e)} to ${t}`),ns=/*#__PURE__*/[{name:"and",category:"logic",parameters:{values:{type:"array",truthiness:!0,evaluation:"race"}},positionalParams:["...values"],returns:"boolean",validate:mo,evaluate:({values:e})=>bo(e,!1)},{name:"or",category:"logic",parameters:{values:{type:"array",truthiness:!0,evaluation:"race"}},positionalParams:["...values"],returns:"boolean",validate:mo,evaluate:({values:e})=>bo(e,!0)},{name:"not",alias:"!",category:"logic",parameters:{value:{type:"any",truthiness:!0}},positionalParams:["value"],returns:"boolean",evaluate:({value:e})=>!e},{name:"if",alias:"?",category:"logic",parameters:{condition:{type:"any",truthiness:!0},then:{type:"any",evaluation:"lazy"},else:{type:"any",evaluation:"lazy",default:null}},positionalParams:["condition","then","else"],evaluate:({condition:e,then:t,else:r})=>e?t.evaluate():r.evaluate()},{name:"match",category:"logic",parameters:{value:{type:["string","number","boolean","null"],nullPolicy:"value"},branches:{type:"object",evaluation:"lazyEntries"},default:{type:"any",required:!1,evaluation:"lazy"}},positionalParams:["value","branches","default"],evaluate:({value:e,branches:t,default:r})=>{const a=null===e?null:he(e);if(null!==a&&Object.hasOwn(t,a))return t[a].evaluate();if(void 0!==r)return r.evaluate();throw new _a(`no branch matches ${null===a?"null":`'${a}'`}, and no default was supplied`)}},{name:"firstOf",category:"logic",parameters:{values:{type:"array",evaluation:"lazyElements"}},positionalParams:["...values"],validate:mo,evaluate:async({values:e})=>{for(const t of e){const e=await t.evaluate();if(null!==e)return e}return null}},jo,Oo,Po,Do,Co,No,zo,Eo,Fo,Mo,qo,To,Vo,Ro,Lo,Wo,/*#__PURE__*/Bo("min","the minimum",e=>e<0),/*#__PURE__*/Bo("max","the maximum",e=>e>0),{name:"buildString",category:"string",parameters:{template:{type:["string","null"]},substitutions:{type:["array","object"],default:[],elementNullPolicy:"value"},trim:{type:"boolean",default:!1},closeGaps:{type:"boolean",default:!1},nullValueDefault:{type:["string","number","boolean"],required:!1,evaluation:"lazy",replacesNullAt:["substitutions"]}},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 Ce(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=he(e);ve(e)&&n.trace.note({type:"render",token:t.raw,rendered:"placeholder"});const l=r?ge(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=we(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=$e(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("")}},Uo,Ko,/*#__PURE__*/Jo("lower",e=>e.toLowerCase()),/*#__PURE__*/Jo("upper",e=>e.toUpperCase()),/*#__PURE__*/Jo("trim",ge),{name:"regex",category:"string",parameters:{value:{type:["string","null"]},pattern:{type:["string","null"]},flags:{type:"string",default:""},mode:{type:{literal:["test","extract","match"]},default:"test"},noMatchDefault:{type:["string","null"],default:null,nullPolicy:"value",evaluation:"lazy"}},positionalParams:["value","pattern"],returns:["boolean","string","array","null"],validate:({pattern:e,flags:t})=>{const r=[],a="string"==typeof t?_o(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=_o(r);if(void 0!==o)throw new _a(o);const s=e=>{try{return new RegExp(t,r+e)}catch(e){throw new _a(`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",parameters:{value:{type:["string","array","null"]}},positionalParams:["...value"],returns:"integer",evaluate:({value:e})=>"string"==typeof e?xe(e).length:e.length},{name:"map",category:"array",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:{type:"any",evaluation:"perElement",over:"input"}},positionalParams:["input","each"],returns:"array",validate:ho,evaluate:({each:e})=>wo(e.settle())},{name:"filter",category:"array",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:Yo},positionalParams:["input","each"],returns:"array",validate:ho,evaluate:async({input:e,each:t})=>{const r=await wo(t.settle());return e.filter((e,t)=>r[t])}},{name:"find",category:"array",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:Yo,noMatchDefault:{type:"any",default:null,evaluation:"lazy"}},positionalParams:["input","each"],validate:ho,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",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:Yo},positionalParams:["input","each"],returns:"boolean",validate:ho,evaluate:({each:e})=>bo(e.settle(),!0)},{name:"every",category:"array",parameters:{input:Ho,as:Qo,nullInputDefault:Xo,each:Yo},positionalParams:["input","each"],returns:"boolean",validate:ho,evaluate:({each:e})=>bo(e.settle(),!1)},Zo,ts,{name:"convert",category:"other",parameters:{value:{type:"any",nullPolicy:e=>"boolean"===e?"value":"propagate"},to:{type:{literal:["number","string","boolean","array"]}}},positionalParams:["value","to"],returns:["number","string","boolean","array"],evaluate:({value:e,to:t})=>{switch(t){case"number":if("number"==typeof e)return e;if("boolean"==typeof e)return e?1:0;if("string"==typeof e){const t=e.trim(),r=""===t?NaN:Number(t);if(Number.isNaN(r))throw new _a(`'${e}' is not a numeric string — use regex to extract a number from text`);return r}throw as(e,"number");case"string":if(Array.isArray(e)||q(e))throw new _a(`cannot convert ${B(e)} to string — a cast is not a render; use buildString or join`);if("object"==typeof e)throw as(e,"string");return he(e);case"boolean":if("string"==typeof e){const t=e.trim().toLowerCase();if("true"===t)return!0;if("false"===t)return!1}return ue(e);case"array":return Array.isArray(e)?e:[e]}}}].map(eo),os="3.0.0-preview.12",ss=(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);gs(r);const a=is(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=Qr({operators:r.operators??[ns],...void 0!==r.operatorDefaults?{operatorDefaults:r.operatorDefaults}:{},...void 0!==r.fragments?{fragments:r.fragments}:{}});return{options:r,evaluation:a,registry:o,compileCache:new Vr({compile:e=>ls(e,o),probe:Ne})}},is=e=>{const t={...e};return delete t.operators,delete t.fragments,t},ls=(e,t)=>{const r=Ue(e,t);return Ht(r),r.hasNoCache&&xr(r),r};class cs{state;results;version=os;constructor(e={}){this.state=ss(null,e),this.results=new Wn(In(this.state.options.cache))}updateOptions(e={}){const t=ss(this.state,e),r=In(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,parameters:Gn(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:Un(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:vs(this.state.evaluation,t),a=ls(e,this.state.registry),n=Qn(a,r,e=>e.issue);return{valid:!n.some(e=>"error"===e.severity),issues:n}}getDependencies(e){return Un(Ue(e,this.state.registry).dependencies)}isEvaluable(e){const t=Ue(e,this.state.registry);return t.holes.length>0||t.hasErrors}evaluate(e,t){const{state:r}=this;return us(r.evaluation,this.results,e,t,()=>r.compileCache.resolve(e),()=>ls(e,r.registry))}compile(e){const{state:t}=this;return ms(e,t.compileCache.resolve(e),t.evaluation,t.registry,this.results)}}const us=async(e,t,r,a,n,o)=>{const s=void 0===a?e:vs(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=Hn(l.depth,s.maxDepth);throw ks(e,[e])}return r}const{artifact:c}=l,u=_n(c,s),d=u.find(e=>"error"===e.severity);if(void 0!==d)throw ks(d,u);const f=await En(c,s,t);return!0===s.trace?f:f.result};let ds;const fs=(e,t)=>ds?.(e,t);class ps{#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,ds??=(e,t)=>{if("object"!=typeof e||null===e||!(#r in e))return;const r=void 0===t?e.#a:vs(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 us(this.#a,this.#o,this.#t,e,()=>this.#r,()=>this.#l())}getDependencies(){return Un(this.#l().dependencies)}#l(){return"artifact"===this.#r.kind?this.#r.artifact:this.#s??=ls(this.#t,this.#n)}}const ms=(e,t,r,a,n)=>new ps(e,t,r,a,n),hs={data:0,signal:0,timeout:0,trace:0},vs=(e,t)=>{let r;for(const a in t){const n=t[a];if(void 0!==n){if(!Object.hasOwn(hs,a))throw ys(a);r??={...e},r[a]=n}}return void 0===r?e:(gs(t),r)},ys=t=>new e({code:s.invalidOptions,message:`'${t}' is not a per-call option — a call may supply data, signal, timeout and trace; configure the rest at construction or via updateOptions()`,path:[]}),gs=t=>{const{timeout:r,signal:a}=t;if(void 0!==r&&("number"!=typeof r||!Number.isFinite(r)||r<=0))throw new e({code:s.invalidOptions,message:"'timeout' must be a positive number of milliseconds",path:[]});if(void 0!==a&&!bs(a))throw new e({code:s.invalidOptions,message:"'signal' must be an AbortSignal",path:[]})},bs=e=>"object"==typeof e&&null!==e&&"boolean"==typeof e.aborted&&"function"==typeof e.addEventListener&&"function"==typeof e.removeEventListener,ks=(t,r)=>new e({code:t.code,message:t.message,path:t.path,...void 0!==t.operator?{operator:t.operator}:{},issues:r});export{Zn as A,uo as B,os as C,Qn as D,se as E,cs as F,pe as G,me as H,de as I,Pe as J,oe as O,Yn as R,re as a,G as b,Q as c,ue as d,ns as e,Ha as f,Re as g,fs as h,q as i,_n as j,H as k,le as l,z as m,K as n,ee as o,ae as p,to as q,Ie as r,We as s,Me as t,_a as u,_t as v,co as w,he as x,B as y,eo as z};
package/build/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- declare const version = "3.0.0-preview.11";
1
+ declare const version = "3.0.0-preview.12";
2
2
 
3
3
  interface HttpRequest {
4
4
  url: string;
@@ -668,7 +668,7 @@ interface FragmentInfo {
668
668
  declare class FigTree<InstanceOpts extends FigTreeOptions = NoOptions> {
669
669
  private state;
670
670
  private readonly results;
671
- readonly version = "3.0.0-preview.11";
671
+ readonly version = "3.0.0-preview.12";
672
672
  constructor(options?: InstanceOpts);
673
673
  updateOptions(options?: OptionsUpdate): void;
674
674
  clearCache(): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fig-tree-evaluator",
3
- "version": "3.0.0-preview.11",
3
+ "version": "3.0.0-preview.12",
4
4
  "description": "Module to evaluate JSON-structured expression trees",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",