@bilig/formula 0.1.82 → 0.1.84

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.
Files changed (167) hide show
  1. package/dist/addressing.d.ts +6 -6
  2. package/dist/addressing.js +16 -16
  3. package/dist/addressing.js.map +1 -1
  4. package/dist/ast.d.ts +18 -18
  5. package/dist/binder-wasm-rules.d.ts +2 -2
  6. package/dist/binder-wasm-rules.js +677 -724
  7. package/dist/binder-wasm-rules.js.map +1 -1
  8. package/dist/binder.d.ts +2 -2
  9. package/dist/binder.js +133 -137
  10. package/dist/binder.js.map +1 -1
  11. package/dist/builtin-capabilities.d.ts +4 -4
  12. package/dist/builtin-capabilities.js +777 -816
  13. package/dist/builtin-capabilities.js.map +1 -1
  14. package/dist/builtins/complex.d.ts +3 -3
  15. package/dist/builtins/complex.js +20 -48
  16. package/dist/builtins/complex.js.map +1 -1
  17. package/dist/builtins/convert.d.ts +1 -1
  18. package/dist/builtins/convert.js +180 -181
  19. package/dist/builtins/convert.js.map +1 -1
  20. package/dist/builtins/datetime.d.ts +1 -1
  21. package/dist/builtins/datetime.js +60 -72
  22. package/dist/builtins/datetime.js.map +1 -1
  23. package/dist/builtins/distribution-builtins.d.ts +2 -2
  24. package/dist/builtins/distribution-builtins.js +62 -112
  25. package/dist/builtins/distribution-builtins.js.map +1 -1
  26. package/dist/builtins/distributions.js +17 -54
  27. package/dist/builtins/distributions.js.map +1 -1
  28. package/dist/builtins/financial-builtins.d.ts +2 -2
  29. package/dist/builtins/financial-builtins.js +9 -42
  30. package/dist/builtins/financial-builtins.js.map +1 -1
  31. package/dist/builtins/financial.js +4 -18
  32. package/dist/builtins/financial.js.map +1 -1
  33. package/dist/builtins/fixed-income-builtins.d.ts +2 -2
  34. package/dist/builtins/fixed-income-builtins.js +18 -60
  35. package/dist/builtins/fixed-income-builtins.js.map +1 -1
  36. package/dist/builtins/fixed-income.js +25 -96
  37. package/dist/builtins/fixed-income.js.map +1 -1
  38. package/dist/builtins/formatting.js +9 -9
  39. package/dist/builtins/formatting.js.map +1 -1
  40. package/dist/builtins/logical.d.ts +1 -1
  41. package/dist/builtins/logical.js +5 -5
  42. package/dist/builtins/logical.js.map +1 -1
  43. package/dist/builtins/lookup-array-shape-builtins.d.ts +3 -3
  44. package/dist/builtins/lookup-array-shape-builtins.js +8 -15
  45. package/dist/builtins/lookup-array-shape-builtins.js.map +1 -1
  46. package/dist/builtins/lookup-criteria-builtins.d.ts +2 -2
  47. package/dist/builtins/lookup-criteria-builtins.js +1 -1
  48. package/dist/builtins/lookup-criteria-builtins.js.map +1 -1
  49. package/dist/builtins/lookup-database-builtins.d.ts +2 -2
  50. package/dist/builtins/lookup-database-builtins.js +20 -24
  51. package/dist/builtins/lookup-database-builtins.js.map +1 -1
  52. package/dist/builtins/lookup-financial-builtins.d.ts +3 -3
  53. package/dist/builtins/lookup-financial-builtins.js +14 -30
  54. package/dist/builtins/lookup-financial-builtins.js.map +1 -1
  55. package/dist/builtins/lookup-hypothesis-builtins.d.ts +2 -2
  56. package/dist/builtins/lookup-hypothesis-builtins.js +23 -58
  57. package/dist/builtins/lookup-hypothesis-builtins.js.map +1 -1
  58. package/dist/builtins/lookup-matrix-builtins.d.ts +3 -3
  59. package/dist/builtins/lookup-matrix-builtins.js +5 -3
  60. package/dist/builtins/lookup-matrix-builtins.js.map +1 -1
  61. package/dist/builtins/lookup-order-statistics-builtins.d.ts +3 -3
  62. package/dist/builtins/lookup-order-statistics-builtins.js +18 -30
  63. package/dist/builtins/lookup-order-statistics-builtins.js.map +1 -1
  64. package/dist/builtins/lookup-reference-builtins.d.ts +2 -2
  65. package/dist/builtins/lookup-reference-builtins.js +10 -26
  66. package/dist/builtins/lookup-reference-builtins.js.map +1 -1
  67. package/dist/builtins/lookup-regression-builtins.d.ts +2 -2
  68. package/dist/builtins/lookup-regression-builtins.js +52 -69
  69. package/dist/builtins/lookup-regression-builtins.js.map +1 -1
  70. package/dist/builtins/lookup-sort-filter-builtins.d.ts +3 -3
  71. package/dist/builtins/lookup-sort-filter-builtins.js +5 -13
  72. package/dist/builtins/lookup-sort-filter-builtins.js.map +1 -1
  73. package/dist/builtins/lookup.d.ts +5 -5
  74. package/dist/builtins/lookup.js +61 -73
  75. package/dist/builtins/lookup.js.map +1 -1
  76. package/dist/builtins/math-builtins.d.ts +2 -2
  77. package/dist/builtins/math-builtins.js +11 -17
  78. package/dist/builtins/math-builtins.js.map +1 -1
  79. package/dist/builtins/numeric.d.ts +2 -2
  80. package/dist/builtins/numeric.js +2 -2
  81. package/dist/builtins/numeric.js.map +1 -1
  82. package/dist/builtins/placeholder.d.ts +1 -1
  83. package/dist/builtins/placeholder.js +505 -505
  84. package/dist/builtins/placeholder.js.map +1 -1
  85. package/dist/builtins/radix.d.ts +2 -2
  86. package/dist/builtins/radix.js +33 -39
  87. package/dist/builtins/radix.js.map +1 -1
  88. package/dist/builtins/statistical-builtins.d.ts +2 -2
  89. package/dist/builtins/statistical-builtins.js +29 -56
  90. package/dist/builtins/statistical-builtins.js.map +1 -1
  91. package/dist/builtins/statistics.d.ts +1 -1
  92. package/dist/builtins/statistics.js +3 -7
  93. package/dist/builtins/statistics.js.map +1 -1
  94. package/dist/builtins/text-core-builtins.d.ts +2 -2
  95. package/dist/builtins/text-core-builtins.js +110 -110
  96. package/dist/builtins/text-core-builtins.js.map +1 -1
  97. package/dist/builtins/text-format-builtins.d.ts +2 -2
  98. package/dist/builtins/text-format-builtins.js +109 -141
  99. package/dist/builtins/text-format-builtins.js.map +1 -1
  100. package/dist/builtins/text-search-builtins.d.ts +2 -2
  101. package/dist/builtins/text-search-builtins.js +37 -44
  102. package/dist/builtins/text-search-builtins.js.map +1 -1
  103. package/dist/builtins/text.d.ts +2 -2
  104. package/dist/builtins/text.js +19 -29
  105. package/dist/builtins/text.js.map +1 -1
  106. package/dist/builtins.d.ts +3 -3
  107. package/dist/builtins.js +55 -75
  108. package/dist/builtins.js.map +1 -1
  109. package/dist/compatibility.js +425 -430
  110. package/dist/compatibility.js.map +1 -1
  111. package/dist/compiler.d.ts +7 -7
  112. package/dist/compiler.js +212 -228
  113. package/dist/compiler.js.map +1 -1
  114. package/dist/external-function-adapter.d.ts +6 -6
  115. package/dist/external-function-adapter.js +3 -3
  116. package/dist/external-function-adapter.js.map +1 -1
  117. package/dist/formula-template-key.js +25 -26
  118. package/dist/formula-template-key.js.map +1 -1
  119. package/dist/generated/formula-inventory.js +3567 -3567
  120. package/dist/generated/formula-inventory.js.map +1 -1
  121. package/dist/group-pivot-evaluator.d.ts +2 -2
  122. package/dist/group-pivot-evaluator.js +27 -32
  123. package/dist/group-pivot-evaluator.js.map +1 -1
  124. package/dist/index.d.ts +20 -20
  125. package/dist/index.js +20 -20
  126. package/dist/index.js.map +1 -1
  127. package/dist/js-evaluator-array-special-calls.d.ts +3 -3
  128. package/dist/js-evaluator-array-special-calls.js +25 -34
  129. package/dist/js-evaluator-array-special-calls.js.map +1 -1
  130. package/dist/js-evaluator-context-special-calls.d.ts +2 -2
  131. package/dist/js-evaluator-context-special-calls.js +23 -27
  132. package/dist/js-evaluator-context-special-calls.js.map +1 -1
  133. package/dist/js-evaluator-reference-context.d.ts +2 -2
  134. package/dist/js-evaluator-reference-context.js +22 -24
  135. package/dist/js-evaluator-reference-context.js.map +1 -1
  136. package/dist/js-evaluator-workbook-special-calls.d.ts +2 -2
  137. package/dist/js-evaluator-workbook-special-calls.js +18 -24
  138. package/dist/js-evaluator-workbook-special-calls.js.map +1 -1
  139. package/dist/js-evaluator.d.ts +40 -40
  140. package/dist/js-evaluator.js +135 -147
  141. package/dist/js-evaluator.js.map +1 -1
  142. package/dist/js-plan-lowering.d.ts +2 -2
  143. package/dist/js-plan-lowering.js +103 -108
  144. package/dist/js-plan-lowering.js.map +1 -1
  145. package/dist/lexer.d.ts +1 -1
  146. package/dist/lexer.js +34 -43
  147. package/dist/lexer.js.map +1 -1
  148. package/dist/optimizer.d.ts +1 -1
  149. package/dist/optimizer.js +99 -108
  150. package/dist/optimizer.js.map +1 -1
  151. package/dist/parser.d.ts +1 -1
  152. package/dist/parser.js +129 -136
  153. package/dist/parser.js.map +1 -1
  154. package/dist/program-arena.js.map +1 -1
  155. package/dist/runtime-inventory.d.ts +2 -2
  156. package/dist/runtime-inventory.js +14 -20
  157. package/dist/runtime-inventory.js.map +1 -1
  158. package/dist/runtime-values.d.ts +4 -4
  159. package/dist/runtime-values.js +2 -2
  160. package/dist/runtime-values.js.map +1 -1
  161. package/dist/special-call-rewrites.d.ts +1 -1
  162. package/dist/special-call-rewrites.js +14 -18
  163. package/dist/special-call-rewrites.js.map +1 -1
  164. package/dist/translation.d.ts +7 -7
  165. package/dist/translation.js +323 -366
  166. package/dist/translation.js.map +1 -1
  167. package/package.json +2 -2
@@ -1,84 +1,79 @@
1
1
  export const compatibilityStatuses = [
2
- "unsupported",
3
- "seeded",
4
- "implemented-js",
5
- "implemented-js-and-wasm-shadow",
6
- "implemented-wasm-production",
7
- "blocked",
8
- ];
9
- export const compatibilityScopes = ["canonical", "extended"];
10
- export const wasmCompatibilityStatuses = [
11
- "not-started",
12
- "shadow",
13
- "production",
14
- "blocked",
2
+ 'unsupported',
3
+ 'seeded',
4
+ 'implemented-js',
5
+ 'implemented-js-and-wasm-shadow',
6
+ 'implemented-wasm-production',
7
+ 'blocked',
15
8
  ];
9
+ export const compatibilityScopes = ['canonical', 'extended'];
10
+ export const wasmCompatibilityStatuses = ['not-started', 'shadow', 'production', 'blocked'];
16
11
  export const compatibilityFamilies = [
17
- "arithmetic",
18
- "comparison",
19
- "logical",
20
- "aggregation",
21
- "math",
22
- "text",
23
- "date-time",
24
- "lookup-reference",
25
- "statistical",
26
- "information",
27
- "dynamic-array",
28
- "names",
29
- "tables",
30
- "structured-reference",
31
- "volatile",
32
- "lambda",
12
+ 'arithmetic',
13
+ 'comparison',
14
+ 'logical',
15
+ 'aggregation',
16
+ 'math',
17
+ 'text',
18
+ 'date-time',
19
+ 'lookup-reference',
20
+ 'statistical',
21
+ 'information',
22
+ 'dynamic-array',
23
+ 'names',
24
+ 'tables',
25
+ 'structured-reference',
26
+ 'volatile',
27
+ 'lambda',
33
28
  ];
34
29
  const familyOwners = {
35
- arithmetic: "lane-a-arithmetic-aggregation",
36
- comparison: "backbone-value-model",
37
- logical: "lane-b-logical-information",
38
- aggregation: "lane-a-arithmetic-aggregation",
39
- math: "lane-a-arithmetic-aggregation",
40
- text: "lane-c-text",
41
- "date-time": "lane-d-date-time",
42
- "lookup-reference": "lane-e-lookup-reference",
43
- statistical: "lane-f-statistical-financial",
44
- information: "lane-b-logical-information",
45
- "dynamic-array": "lane-g-dynamic-array-metadata",
46
- names: "lane-g-dynamic-array-metadata",
47
- tables: "lane-g-dynamic-array-metadata",
48
- "structured-reference": "lane-g-dynamic-array-metadata",
49
- volatile: "lane-d-date-time",
50
- lambda: "lane-h-lambda",
30
+ arithmetic: 'lane-a-arithmetic-aggregation',
31
+ comparison: 'backbone-value-model',
32
+ logical: 'lane-b-logical-information',
33
+ aggregation: 'lane-a-arithmetic-aggregation',
34
+ math: 'lane-a-arithmetic-aggregation',
35
+ text: 'lane-c-text',
36
+ 'date-time': 'lane-d-date-time',
37
+ 'lookup-reference': 'lane-e-lookup-reference',
38
+ statistical: 'lane-f-statistical-financial',
39
+ information: 'lane-b-logical-information',
40
+ 'dynamic-array': 'lane-g-dynamic-array-metadata',
41
+ names: 'lane-g-dynamic-array-metadata',
42
+ tables: 'lane-g-dynamic-array-metadata',
43
+ 'structured-reference': 'lane-g-dynamic-array-metadata',
44
+ volatile: 'lane-d-date-time',
45
+ lambda: 'lane-h-lambda',
51
46
  };
52
47
  const familyPrerequisites = {
53
- arithmetic: ["core:value-model"],
54
- comparison: ["core:value-model", "core:comparison-model"],
55
- logical: ["core:value-model", "core:error-model"],
56
- aggregation: ["core:value-model", "core:range-iterators"],
57
- math: ["core:value-model"],
58
- text: ["core:value-model", "core:string-coercion"],
59
- "date-time": ["core:value-model", "core:date-serial-model"],
60
- "lookup-reference": ["core:reference-model", "core:comparison-model"],
61
- statistical: ["core:value-model", "core:criteria-model"],
62
- information: ["core:value-model", "core:error-model"],
63
- "dynamic-array": ["core:shape-model", "core:spill-model"],
64
- names: ["core:names-model"],
65
- tables: ["core:tables-model"],
66
- "structured-reference": ["core:tables-model", "core:structured-reference-model"],
67
- volatile: ["core:volatile-context"],
68
- lambda: ["core:lambda-runtime", "core:shape-model"],
48
+ arithmetic: ['core:value-model'],
49
+ comparison: ['core:value-model', 'core:comparison-model'],
50
+ logical: ['core:value-model', 'core:error-model'],
51
+ aggregation: ['core:value-model', 'core:range-iterators'],
52
+ math: ['core:value-model'],
53
+ text: ['core:value-model', 'core:string-coercion'],
54
+ 'date-time': ['core:value-model', 'core:date-serial-model'],
55
+ 'lookup-reference': ['core:reference-model', 'core:comparison-model'],
56
+ statistical: ['core:value-model', 'core:criteria-model'],
57
+ information: ['core:value-model', 'core:error-model'],
58
+ 'dynamic-array': ['core:shape-model', 'core:spill-model'],
59
+ names: ['core:names-model'],
60
+ tables: ['core:tables-model'],
61
+ 'structured-reference': ['core:tables-model', 'core:structured-reference-model'],
62
+ volatile: ['core:volatile-context'],
63
+ lambda: ['core:lambda-runtime', 'core:shape-model'],
69
64
  };
70
65
  export function deriveWasmStatus(status) {
71
66
  switch (status) {
72
- case "unsupported":
73
- case "seeded":
74
- case "implemented-js":
75
- return "not-started";
76
- case "implemented-js-and-wasm-shadow":
77
- return "shadow";
78
- case "implemented-wasm-production":
79
- return "production";
80
- case "blocked":
81
- return "blocked";
67
+ case 'unsupported':
68
+ case 'seeded':
69
+ case 'implemented-js':
70
+ return 'not-started';
71
+ case 'implemented-js-and-wasm-shadow':
72
+ return 'shadow';
73
+ case 'implemented-wasm-production':
74
+ return 'production';
75
+ case 'blocked':
76
+ return 'blocked';
82
77
  }
83
78
  }
84
79
  function entry(id, family, formula, status, options = {}) {
@@ -87,7 +82,7 @@ function entry(id, family, formula, status, options = {}) {
87
82
  family,
88
83
  formula,
89
84
  status,
90
- scope: options.scope ?? "canonical",
85
+ scope: options.scope ?? 'canonical',
91
86
  fixtureIds: options.fixtureIds ?? [id],
92
87
  owner: options.owner ?? familyOwners[family],
93
88
  prerequisites: options.prerequisites ?? familyPrerequisites[family],
@@ -96,394 +91,394 @@ function entry(id, family, formula, status, options = {}) {
96
91
  return options.notes === undefined ? base : { ...base, notes: options.notes };
97
92
  }
98
93
  export const formulaCompatibilityRegistry = [
99
- entry("arithmetic:add-basic", "arithmetic", "=A1+A2", "implemented-wasm-production"),
100
- entry("arithmetic:precedence-basic", "arithmetic", "=A1+A2*A3", "implemented-wasm-production"),
101
- entry("arithmetic:unary-negation", "arithmetic", "=-A1", "implemented-wasm-production"),
102
- entry("arithmetic:division-basic", "arithmetic", "=A1/A2", "implemented-wasm-production"),
103
- entry("arithmetic:power-basic", "arithmetic", "=A1^A2", "implemented-wasm-production"),
104
- entry("arithmetic:percent-operator", "arithmetic", "=A1*10%", "implemented-wasm-production", {
105
- notes: "Postfix percent is in the canonical formula corpus and tracked as part of the arithmetic lane.",
94
+ entry('arithmetic:add-basic', 'arithmetic', '=A1+A2', 'implemented-wasm-production'),
95
+ entry('arithmetic:precedence-basic', 'arithmetic', '=A1+A2*A3', 'implemented-wasm-production'),
96
+ entry('arithmetic:unary-negation', 'arithmetic', '=-A1', 'implemented-wasm-production'),
97
+ entry('arithmetic:division-basic', 'arithmetic', '=A1/A2', 'implemented-wasm-production'),
98
+ entry('arithmetic:power-basic', 'arithmetic', '=A1^A2', 'implemented-wasm-production'),
99
+ entry('arithmetic:percent-operator', 'arithmetic', '=A1*10%', 'implemented-wasm-production', {
100
+ notes: 'Postfix percent is in the canonical formula corpus and tracked as part of the arithmetic lane.',
106
101
  }),
107
- entry("comparison:equality-number", "comparison", "=A1=A2", "implemented-wasm-production"),
108
- entry("comparison:equality-text", "comparison", '="hello"="HELLO"', "implemented-wasm-production"),
109
- entry("comparison:greater-than", "comparison", "=A1>A2", "implemented-wasm-production"),
110
- entry("comparison:less-than-or-equal", "comparison", "=A1<=A2", "implemented-wasm-production"),
111
- entry("logical:if-basic", "logical", '=IF(A1>0,"yes","no")', "implemented-wasm-production"),
112
- entry("logical:ifs-basic", "logical", '=IFS(A1>1,"big",TRUE(),"small")', "implemented-wasm-production"),
113
- entry("logical:and-basic", "logical", "=AND(A1,A2)", "implemented-wasm-production"),
114
- entry("logical:or-basic", "logical", "=OR(A1,A2)", "implemented-wasm-production"),
115
- entry("logical:not-basic", "logical", "=NOT(A1)", "implemented-wasm-production"),
116
- entry("logical:switch-basic", "logical", '=SWITCH(A1,1,"one","other")', "implemented-wasm-production"),
117
- entry("logical:xor-basic", "logical", "=XOR(TRUE(),FALSE(),TRUE())", "implemented-wasm-production"),
118
- entry("aggregation:sum-range", "aggregation", "=SUM(A1:A3)", "implemented-wasm-production"),
119
- entry("aggregation:avg-range", "aggregation", "=AVG(A1:A3)", "implemented-wasm-production"),
120
- entry("aggregation:min-range", "aggregation", "=MIN(A1:A3)", "implemented-wasm-production"),
121
- entry("aggregation:max-range", "aggregation", "=MAX(A1:A3)", "implemented-wasm-production"),
122
- entry("aggregation:count-range", "aggregation", "=COUNT(A1:A4)", "implemented-wasm-production"),
123
- entry("aggregation:counta-range", "aggregation", "=COUNTA(A1:A4)", "implemented-wasm-production"),
124
- entry("aggregation:countblank-range", "aggregation", "=COUNTBLANK(A1:A4)", "implemented-wasm-production"),
125
- entry("math:abs-basic", "math", "=ABS(A1)", "implemented-wasm-production"),
126
- entry("math:round-basic", "math", "=ROUND(A1,1)", "implemented-wasm-production"),
127
- entry("math:trunc-basic", "math", "=TRUNC(A1,1)", "implemented-wasm-production"),
128
- entry("math:floor-basic", "math", "=FLOOR(A1,2)", "implemented-wasm-production"),
129
- entry("math:floor-math-basic", "math", "=FLOOR.MATH(A1,2)", "implemented-wasm-production"),
130
- entry("math:floor-precise-basic", "math", "=FLOOR.PRECISE(A1,2)", "implemented-wasm-production"),
131
- entry("math:ceiling-basic", "math", "=CEILING(A1,2)", "implemented-wasm-production"),
132
- entry("math:ceiling-math-basic", "math", "=CEILING.MATH(A1,2)", "implemented-wasm-production"),
133
- entry("math:ceiling-precise-basic", "math", "=CEILING.PRECISE(A1,2)", "implemented-wasm-production"),
134
- entry("math:iso-ceiling-basic", "math", "=ISO.CEILING(A1,2)", "implemented-wasm-production"),
135
- entry("math:mod-basic", "math", "=MOD(A1,A2)", "implemented-wasm-production"),
136
- entry("math:bitand-basic", "math", "=BITAND(6,3)", "implemented-wasm-production"),
137
- entry("math:base-basic", "math", "=BASE(255,16,4)", "implemented-wasm-production"),
138
- entry("math:decimal-basic", "math", '=DECIMAL("00FF",16)', "implemented-wasm-production"),
139
- entry("math:bin2dec-basic", "math", '=BIN2DEC("1111111111")', "implemented-wasm-production"),
140
- entry("math:dec2bin-basic", "math", "=DEC2BIN(10,8)", "implemented-wasm-production"),
141
- entry("math:oct2hex-basic", "math", '=OCT2HEX("17",4)', "implemented-wasm-production"),
142
- entry("math:besseli-basic", "math", "=BESSELI(1.5,1)", "implemented-wasm-production"),
143
- entry("math:besselj-basic", "math", "=BESSELJ(1.9,2)", "implemented-wasm-production"),
144
- entry("math:besselk-basic", "math", "=BESSELK(1.5,1)", "implemented-wasm-production"),
145
- entry("math:bessely-basic", "math", "=BESSELY(2.5,1)", "implemented-wasm-production"),
146
- entry("math:convert-basic", "math", '=CONVERT(6,"mi","km")', "implemented-wasm-production"),
147
- entry("math:euroconvert-basic", "math", '=EUROCONVERT(1,"FRF","DEM",TRUE,3)', "implemented-wasm-production"),
148
- entry("math:acosh-basic", "math", "=ACOSH(1)", "implemented-wasm-production"),
149
- entry("math:fact-basic", "math", "=FACT(5)", "implemented-wasm-production"),
150
- entry("math:combin-basic", "math", "=COMBIN(8,3)", "implemented-wasm-production"),
151
- entry("math:permut-basic", "math", "=PERMUT(5,3)", "implemented-wasm-production"),
152
- entry("math:permutationa-basic", "math", "=PERMUTATIONA(2,3)", "implemented-wasm-production"),
153
- entry("math:mround-basic", "math", "=MROUND(A1,4)", "implemented-wasm-production"),
154
- entry("math:seriessum-basic", "math", "=SERIESSUM(2,1,2,1,2)", "implemented-wasm-production"),
155
- entry("math:gcd-basic", "math", "=GCD(A1:A3)", "implemented-wasm-production"),
156
- entry("math:product-basic", "math", "=PRODUCT(A1:A3)", "implemented-wasm-production"),
157
- entry("math:geomean-basic", "math", "=GEOMEAN(A1:A3)", "implemented-wasm-production"),
158
- entry("math:harmean-basic", "math", "=HARMEAN(A1:A3)", "implemented-wasm-production"),
159
- entry("math:sqrtpi-basic", "math", "=SQRTPI(A1)", "implemented-wasm-production"),
160
- entry("math:sumsq-basic", "math", "=SUMSQ(A1:A3)", "implemented-wasm-production"),
161
- entry("text:concat-operator", "text", '="bi"&"lig"', "implemented-wasm-production"),
162
- entry("text:concat-function", "text", '=CONCAT("bi","lig")', "implemented-wasm-production"),
163
- entry("text:len-basic", "text", '=LEN("bilig")', "implemented-wasm-production", {
164
- notes: "LEN now executes through the string-aware native runtime for scalar inputs.",
102
+ entry('comparison:equality-number', 'comparison', '=A1=A2', 'implemented-wasm-production'),
103
+ entry('comparison:equality-text', 'comparison', '="hello"="HELLO"', 'implemented-wasm-production'),
104
+ entry('comparison:greater-than', 'comparison', '=A1>A2', 'implemented-wasm-production'),
105
+ entry('comparison:less-than-or-equal', 'comparison', '=A1<=A2', 'implemented-wasm-production'),
106
+ entry('logical:if-basic', 'logical', '=IF(A1>0,"yes","no")', 'implemented-wasm-production'),
107
+ entry('logical:ifs-basic', 'logical', '=IFS(A1>1,"big",TRUE(),"small")', 'implemented-wasm-production'),
108
+ entry('logical:and-basic', 'logical', '=AND(A1,A2)', 'implemented-wasm-production'),
109
+ entry('logical:or-basic', 'logical', '=OR(A1,A2)', 'implemented-wasm-production'),
110
+ entry('logical:not-basic', 'logical', '=NOT(A1)', 'implemented-wasm-production'),
111
+ entry('logical:switch-basic', 'logical', '=SWITCH(A1,1,"one","other")', 'implemented-wasm-production'),
112
+ entry('logical:xor-basic', 'logical', '=XOR(TRUE(),FALSE(),TRUE())', 'implemented-wasm-production'),
113
+ entry('aggregation:sum-range', 'aggregation', '=SUM(A1:A3)', 'implemented-wasm-production'),
114
+ entry('aggregation:avg-range', 'aggregation', '=AVG(A1:A3)', 'implemented-wasm-production'),
115
+ entry('aggregation:min-range', 'aggregation', '=MIN(A1:A3)', 'implemented-wasm-production'),
116
+ entry('aggregation:max-range', 'aggregation', '=MAX(A1:A3)', 'implemented-wasm-production'),
117
+ entry('aggregation:count-range', 'aggregation', '=COUNT(A1:A4)', 'implemented-wasm-production'),
118
+ entry('aggregation:counta-range', 'aggregation', '=COUNTA(A1:A4)', 'implemented-wasm-production'),
119
+ entry('aggregation:countblank-range', 'aggregation', '=COUNTBLANK(A1:A4)', 'implemented-wasm-production'),
120
+ entry('math:abs-basic', 'math', '=ABS(A1)', 'implemented-wasm-production'),
121
+ entry('math:round-basic', 'math', '=ROUND(A1,1)', 'implemented-wasm-production'),
122
+ entry('math:trunc-basic', 'math', '=TRUNC(A1,1)', 'implemented-wasm-production'),
123
+ entry('math:floor-basic', 'math', '=FLOOR(A1,2)', 'implemented-wasm-production'),
124
+ entry('math:floor-math-basic', 'math', '=FLOOR.MATH(A1,2)', 'implemented-wasm-production'),
125
+ entry('math:floor-precise-basic', 'math', '=FLOOR.PRECISE(A1,2)', 'implemented-wasm-production'),
126
+ entry('math:ceiling-basic', 'math', '=CEILING(A1,2)', 'implemented-wasm-production'),
127
+ entry('math:ceiling-math-basic', 'math', '=CEILING.MATH(A1,2)', 'implemented-wasm-production'),
128
+ entry('math:ceiling-precise-basic', 'math', '=CEILING.PRECISE(A1,2)', 'implemented-wasm-production'),
129
+ entry('math:iso-ceiling-basic', 'math', '=ISO.CEILING(A1,2)', 'implemented-wasm-production'),
130
+ entry('math:mod-basic', 'math', '=MOD(A1,A2)', 'implemented-wasm-production'),
131
+ entry('math:bitand-basic', 'math', '=BITAND(6,3)', 'implemented-wasm-production'),
132
+ entry('math:base-basic', 'math', '=BASE(255,16,4)', 'implemented-wasm-production'),
133
+ entry('math:decimal-basic', 'math', '=DECIMAL("00FF",16)', 'implemented-wasm-production'),
134
+ entry('math:bin2dec-basic', 'math', '=BIN2DEC("1111111111")', 'implemented-wasm-production'),
135
+ entry('math:dec2bin-basic', 'math', '=DEC2BIN(10,8)', 'implemented-wasm-production'),
136
+ entry('math:oct2hex-basic', 'math', '=OCT2HEX("17",4)', 'implemented-wasm-production'),
137
+ entry('math:besseli-basic', 'math', '=BESSELI(1.5,1)', 'implemented-wasm-production'),
138
+ entry('math:besselj-basic', 'math', '=BESSELJ(1.9,2)', 'implemented-wasm-production'),
139
+ entry('math:besselk-basic', 'math', '=BESSELK(1.5,1)', 'implemented-wasm-production'),
140
+ entry('math:bessely-basic', 'math', '=BESSELY(2.5,1)', 'implemented-wasm-production'),
141
+ entry('math:convert-basic', 'math', '=CONVERT(6,"mi","km")', 'implemented-wasm-production'),
142
+ entry('math:euroconvert-basic', 'math', '=EUROCONVERT(1,"FRF","DEM",TRUE,3)', 'implemented-wasm-production'),
143
+ entry('math:acosh-basic', 'math', '=ACOSH(1)', 'implemented-wasm-production'),
144
+ entry('math:fact-basic', 'math', '=FACT(5)', 'implemented-wasm-production'),
145
+ entry('math:combin-basic', 'math', '=COMBIN(8,3)', 'implemented-wasm-production'),
146
+ entry('math:permut-basic', 'math', '=PERMUT(5,3)', 'implemented-wasm-production'),
147
+ entry('math:permutationa-basic', 'math', '=PERMUTATIONA(2,3)', 'implemented-wasm-production'),
148
+ entry('math:mround-basic', 'math', '=MROUND(A1,4)', 'implemented-wasm-production'),
149
+ entry('math:seriessum-basic', 'math', '=SERIESSUM(2,1,2,1,2)', 'implemented-wasm-production'),
150
+ entry('math:gcd-basic', 'math', '=GCD(A1:A3)', 'implemented-wasm-production'),
151
+ entry('math:product-basic', 'math', '=PRODUCT(A1:A3)', 'implemented-wasm-production'),
152
+ entry('math:geomean-basic', 'math', '=GEOMEAN(A1:A3)', 'implemented-wasm-production'),
153
+ entry('math:harmean-basic', 'math', '=HARMEAN(A1:A3)', 'implemented-wasm-production'),
154
+ entry('math:sqrtpi-basic', 'math', '=SQRTPI(A1)', 'implemented-wasm-production'),
155
+ entry('math:sumsq-basic', 'math', '=SUMSQ(A1:A3)', 'implemented-wasm-production'),
156
+ entry('text:concat-operator', 'text', '="bi"&"lig"', 'implemented-wasm-production'),
157
+ entry('text:concat-function', 'text', '=CONCAT("bi","lig")', 'implemented-wasm-production'),
158
+ entry('text:len-basic', 'text', '=LEN("bilig")', 'implemented-wasm-production', {
159
+ notes: 'LEN now executes through the string-aware native runtime for scalar inputs.',
165
160
  }),
166
- entry("text:char-basic", "text", "=CHAR(65)", "implemented-wasm-production"),
167
- entry("text:code-basic", "text", '=CODE("A")', "implemented-wasm-production"),
168
- entry("text:clean-basic", "text", "=CLEAN(CHAR(97)&CHAR(1)&CHAR(98))", "implemented-wasm-production"),
169
- entry("text:asc-basic", "text", '=ASC("ABC 123")', "implemented-wasm-production"),
170
- entry("text:jis-basic", "text", '=JIS("ABC 123")', "implemented-wasm-production"),
171
- entry("text:dbcs-basic", "text", '=DBCS("ABC 123")', "implemented-wasm-production"),
172
- entry("text:unichar-basic", "text", "=UNICHAR(66)", "implemented-wasm-production"),
173
- entry("text:dollar-basic", "text", "=DOLLAR(-1234.5,1)", "implemented-wasm-production"),
174
- entry("text:text-basic", "text", '=TEXT(1234.567,"#,##0.00")', "implemented-wasm-production"),
175
- entry("text:text-date-basic", "text", '=TEXT(DATE(2024,3,5),"yyyy-mm-dd")', "implemented-wasm-production"),
176
- entry("text:phonetic-basic", "text", '=PHONETIC("カタカナ")', "implemented-wasm-production"),
177
- entry("text:bahttext-basic", "text", "=BAHTTEXT(1234)", "implemented-wasm-production"),
178
- entry("information:t-basic", "information", '=T("alpha")', "implemented-wasm-production"),
179
- entry("information:n-basic", "information", "=N(TRUE())", "implemented-wasm-production"),
180
- entry("information:type-basic", "information", '=TYPE("alpha")', "implemented-wasm-production"),
181
- entry("math:delta-basic", "math", "=DELTA(4,4)", "implemented-wasm-production"),
182
- entry("math:gestep-basic", "math", "=GESTEP(-1)", "implemented-wasm-production"),
183
- entry("statistical:gauss-basic", "statistical", "=GAUSS(0)", "implemented-wasm-production"),
184
- entry("statistical:phi-basic", "statistical", "=PHI(0)", "implemented-wasm-production"),
185
- entry("statistical:standardize-basic", "statistical", "=STANDARDIZE(1,0,1)", "implemented-wasm-production"),
186
- entry("statistical:confidence-norm-basic", "statistical", "=CONFIDENCE.NORM(0.05,1,100)", "implemented-wasm-production"),
187
- entry("statistical:mode-basic", "statistical", "=MODE(A1:A6)", "implemented-wasm-production"),
188
- entry("statistical:mode-sngl-basic", "statistical", "=MODE.SNGL(A1:A6)", "implemented-wasm-production"),
189
- entry("statistical:stdev-basic", "statistical", "=STDEV(A1:A4)", "implemented-wasm-production"),
190
- entry("statistical:stdeva-basic", "statistical", '=STDEVA(2,TRUE(),"skip")', "implemented-wasm-production"),
191
- entry("statistical:var-basic", "statistical", "=VAR(A1:A4)", "implemented-wasm-production"),
192
- entry("statistical:vara-basic", "statistical", '=VARA(2,TRUE(),"skip")', "implemented-wasm-production"),
193
- entry("statistical:skew-basic", "statistical", "=SKEW(A1:A5)", "implemented-wasm-production"),
194
- entry("statistical:kurt-basic", "statistical", "=KURT(A1:A5)", "implemented-wasm-production"),
195
- entry("statistical:normdist-basic", "statistical", "=NORMDIST(1,0,1,TRUE)", "implemented-wasm-production"),
196
- entry("statistical:norminv-basic", "statistical", "=NORMINV(0.8413447460685429,0,1)", "implemented-wasm-production"),
197
- entry("statistical:normsdist-basic", "statistical", "=NORMSDIST(1)", "implemented-wasm-production"),
198
- entry("statistical:normsinv-basic", "statistical", "=NORMSINV(0.001)", "implemented-wasm-production"),
199
- entry("statistical:loginv-basic", "statistical", "=LOGINV(0.5,0,1)", "implemented-wasm-production"),
200
- entry("statistical:lognormdist-basic", "statistical", "=LOGNORMDIST(1,0,1)", "implemented-wasm-production"),
201
- entry("date-time:serial-addition", "date-time", "=A1+7", "implemented-wasm-production"),
202
- entry("date-time:date-constructor", "date-time", "=DATE(2026,3,15)", "implemented-wasm-production"),
203
- entry("date-time:today-volatile", "date-time", "=TODAY()", "implemented-wasm-production", {
204
- prerequisites: ["core:value-model", "core:date-serial-model", "core:volatile-context"],
161
+ entry('text:char-basic', 'text', '=CHAR(65)', 'implemented-wasm-production'),
162
+ entry('text:code-basic', 'text', '=CODE("A")', 'implemented-wasm-production'),
163
+ entry('text:clean-basic', 'text', '=CLEAN(CHAR(97)&CHAR(1)&CHAR(98))', 'implemented-wasm-production'),
164
+ entry('text:asc-basic', 'text', '=ASC("ABC 123")', 'implemented-wasm-production'),
165
+ entry('text:jis-basic', 'text', '=JIS("ABC 123")', 'implemented-wasm-production'),
166
+ entry('text:dbcs-basic', 'text', '=DBCS("ABC 123")', 'implemented-wasm-production'),
167
+ entry('text:unichar-basic', 'text', '=UNICHAR(66)', 'implemented-wasm-production'),
168
+ entry('text:dollar-basic', 'text', '=DOLLAR(-1234.5,1)', 'implemented-wasm-production'),
169
+ entry('text:text-basic', 'text', '=TEXT(1234.567,"#,##0.00")', 'implemented-wasm-production'),
170
+ entry('text:text-date-basic', 'text', '=TEXT(DATE(2024,3,5),"yyyy-mm-dd")', 'implemented-wasm-production'),
171
+ entry('text:phonetic-basic', 'text', '=PHONETIC("カタカナ")', 'implemented-wasm-production'),
172
+ entry('text:bahttext-basic', 'text', '=BAHTTEXT(1234)', 'implemented-wasm-production'),
173
+ entry('information:t-basic', 'information', '=T("alpha")', 'implemented-wasm-production'),
174
+ entry('information:n-basic', 'information', '=N(TRUE())', 'implemented-wasm-production'),
175
+ entry('information:type-basic', 'information', '=TYPE("alpha")', 'implemented-wasm-production'),
176
+ entry('math:delta-basic', 'math', '=DELTA(4,4)', 'implemented-wasm-production'),
177
+ entry('math:gestep-basic', 'math', '=GESTEP(-1)', 'implemented-wasm-production'),
178
+ entry('statistical:gauss-basic', 'statistical', '=GAUSS(0)', 'implemented-wasm-production'),
179
+ entry('statistical:phi-basic', 'statistical', '=PHI(0)', 'implemented-wasm-production'),
180
+ entry('statistical:standardize-basic', 'statistical', '=STANDARDIZE(1,0,1)', 'implemented-wasm-production'),
181
+ entry('statistical:confidence-norm-basic', 'statistical', '=CONFIDENCE.NORM(0.05,1,100)', 'implemented-wasm-production'),
182
+ entry('statistical:mode-basic', 'statistical', '=MODE(A1:A6)', 'implemented-wasm-production'),
183
+ entry('statistical:mode-sngl-basic', 'statistical', '=MODE.SNGL(A1:A6)', 'implemented-wasm-production'),
184
+ entry('statistical:stdev-basic', 'statistical', '=STDEV(A1:A4)', 'implemented-wasm-production'),
185
+ entry('statistical:stdeva-basic', 'statistical', '=STDEVA(2,TRUE(),"skip")', 'implemented-wasm-production'),
186
+ entry('statistical:var-basic', 'statistical', '=VAR(A1:A4)', 'implemented-wasm-production'),
187
+ entry('statistical:vara-basic', 'statistical', '=VARA(2,TRUE(),"skip")', 'implemented-wasm-production'),
188
+ entry('statistical:skew-basic', 'statistical', '=SKEW(A1:A5)', 'implemented-wasm-production'),
189
+ entry('statistical:kurt-basic', 'statistical', '=KURT(A1:A5)', 'implemented-wasm-production'),
190
+ entry('statistical:normdist-basic', 'statistical', '=NORMDIST(1,0,1,TRUE)', 'implemented-wasm-production'),
191
+ entry('statistical:norminv-basic', 'statistical', '=NORMINV(0.8413447460685429,0,1)', 'implemented-wasm-production'),
192
+ entry('statistical:normsdist-basic', 'statistical', '=NORMSDIST(1)', 'implemented-wasm-production'),
193
+ entry('statistical:normsinv-basic', 'statistical', '=NORMSINV(0.001)', 'implemented-wasm-production'),
194
+ entry('statistical:loginv-basic', 'statistical', '=LOGINV(0.5,0,1)', 'implemented-wasm-production'),
195
+ entry('statistical:lognormdist-basic', 'statistical', '=LOGNORMDIST(1,0,1)', 'implemented-wasm-production'),
196
+ entry('date-time:serial-addition', 'date-time', '=A1+7', 'implemented-wasm-production'),
197
+ entry('date-time:date-constructor', 'date-time', '=DATE(2026,3,15)', 'implemented-wasm-production'),
198
+ entry('date-time:today-volatile', 'date-time', '=TODAY()', 'implemented-wasm-production', {
199
+ prerequisites: ['core:value-model', 'core:date-serial-model', 'core:volatile-context'],
205
200
  }),
206
- entry("lookup-reference:address-basic", "lookup-reference", "=ADDRESS(12,3)", "implemented-wasm-production"),
207
- entry("lookup-reference:index-basic", "lookup-reference", "=INDEX(A1:B2,2,1)", "implemented-wasm-production"),
208
- entry("lookup-reference:match-exact", "lookup-reference", '=MATCH("pear",A1:A3,0)', "implemented-wasm-production"),
209
- entry("lookup-reference:vlookup-exact", "lookup-reference", '=VLOOKUP("pear",A1:B3,2,FALSE)', "implemented-wasm-production"),
210
- entry("lookup-reference:xlookup-exact", "lookup-reference", '=XLOOKUP("pear",A1:A3,B1:B3)', "implemented-wasm-production"),
211
- entry("statistical:averageif-basic", "statistical", '=AVERAGEIF(A1:A4,">0")', "implemented-wasm-production"),
212
- entry("statistical:countif-basic", "statistical", '=COUNTIF(A1:A4,">0")', "implemented-wasm-production"),
213
- entry("statistical:chisqdist-basic", "statistical", "=CHISQDIST(18.307,10)", "implemented-wasm-production"),
214
- entry("statistical:chiinv-basic", "statistical", "=CHIINV(0.050001,10)", "implemented-wasm-production"),
215
- entry("statistical:chisq-inv-rt-basic", "statistical", "=CHISQ.INV.RT(0.050001,10)", "implemented-wasm-production"),
216
- entry("statistical:chisqinv-basic", "statistical", "=CHISQINV(0.050001,10)", "implemented-wasm-production"),
217
- entry("statistical:chisq-inv-basic", "statistical", "=CHISQ.INV(0.93,1)", "implemented-wasm-production"),
218
- entry("statistical:chisq-test-basic", "statistical", "=CHISQ.TEST(A1:B3,D1:E3)", "implemented-wasm-production"),
219
- entry("statistical:beta-dist-basic", "statistical", "=BETA.DIST(2,8,10,TRUE,1,3)", "implemented-wasm-production"),
220
- entry("statistical:beta-inv-basic", "statistical", "=BETA.INV(0.6854705810117458,8,10,1,3)", "implemented-wasm-production"),
221
- entry("statistical:f-dist-rt-basic", "statistical", "=F.DIST.RT(15.2068649,6,4)", "implemented-wasm-production"),
222
- entry("statistical:fdist-basic", "statistical", "=FDIST(15.2068649,6,4)", "implemented-wasm-production"),
223
- entry("statistical:f-inv-basic", "statistical", "=F.INV(0.01,6,4)", "implemented-wasm-production"),
224
- entry("statistical:f-inv-rt-basic", "statistical", "=F.INV.RT(0.01,6,4)", "implemented-wasm-production"),
225
- entry("statistical:f-test-basic", "statistical", "=F.TEST(A1:A5,B1:B5)", "implemented-wasm-production"),
226
- entry("statistical:z-test-basic", "statistical", "=Z.TEST(D1:D5,2,1)", "implemented-wasm-production"),
227
- entry("statistical:correl-basic", "statistical", "=CORREL(A1:A3,B1:B3)", "implemented-wasm-production"),
228
- entry("statistical:covar-basic", "statistical", "=COVAR(A1:A3,B1:B3)", "implemented-wasm-production"),
229
- entry("statistical:covariance-p-basic", "statistical", "=COVARIANCE.P(A1:A3,B1:B3)", "implemented-wasm-production"),
230
- entry("statistical:covariance-s-basic", "statistical", "=COVARIANCE.S(A1:A3,B1:B3)", "implemented-wasm-production"),
231
- entry("statistical:pearson-basic", "statistical", "=PEARSON(A1:A3,B1:B3)", "implemented-wasm-production"),
232
- entry("statistical:intercept-basic", "statistical", "=INTERCEPT(A1:A3,B1:B3)", "implemented-wasm-production"),
233
- entry("statistical:slope-basic", "statistical", "=SLOPE(A1:A3,B1:B3)", "implemented-wasm-production"),
234
- entry("statistical:rsq-basic", "statistical", "=RSQ(A1:A3,B1:B3)", "implemented-wasm-production"),
235
- entry("statistical:steyx-basic", "statistical", "=STEYX(A1:A3,B1:B3)", "implemented-wasm-production"),
236
- entry("statistical:rank-basic", "statistical", "=RANK(20,A1:A4)", "implemented-wasm-production"),
237
- entry("statistical:rank-eq-basic", "statistical", "=RANK.EQ(20,A1:A4)", "implemented-wasm-production"),
238
- entry("statistical:rank-avg-basic", "statistical", "=RANK.AVG(20,A1:A4)", "implemented-wasm-production"),
239
- entry("statistical:median-basic", "statistical", "=MEDIAN(A1:A8)", "implemented-wasm-production"),
240
- entry("statistical:small-basic", "statistical", "=SMALL(A1:A8,3)", "implemented-wasm-production"),
241
- entry("statistical:large-basic", "statistical", "=LARGE(A1:A8,2)", "implemented-wasm-production"),
242
- entry("statistical:percentile-basic", "statistical", "=PERCENTILE(A1:A8,0.25)", "implemented-wasm-production"),
243
- entry("statistical:percentile-inc-basic", "statistical", "=PERCENTILE.INC(A1:A8,0.25)", "implemented-wasm-production"),
244
- entry("statistical:percentile-exc-basic", "statistical", "=PERCENTILE.EXC(A1:A8,0.25)", "implemented-wasm-production"),
245
- entry("statistical:percentrank-basic", "statistical", "=PERCENTRANK(A1:A8,8)", "implemented-wasm-production"),
246
- entry("statistical:percentrank-inc-basic", "statistical", "=PERCENTRANK.INC(A1:A8,8)", "implemented-wasm-production"),
247
- entry("statistical:percentrank-exc-basic", "statistical", "=PERCENTRANK.EXC(A1:A8,8)", "implemented-wasm-production"),
248
- entry("statistical:quartile-basic", "statistical", "=QUARTILE(A1:A8,1)", "implemented-wasm-production"),
249
- entry("statistical:quartile-inc-basic", "statistical", "=QUARTILE.INC(A1:A8,1)", "implemented-wasm-production"),
250
- entry("statistical:quartile-exc-basic", "statistical", "=QUARTILE.EXC(A1:A8,1)", "implemented-wasm-production"),
251
- entry("statistical:mode-mult-basic", "statistical", "=MODE.MULT(A1:A6)", "implemented-wasm-production"),
252
- entry("statistical:frequency-basic", "statistical", "=FREQUENCY(A1:A6,B1:B3)", "implemented-wasm-production"),
253
- entry("statistical:t-dist-basic", "statistical", "=T.DIST(1,1,TRUE)", "implemented-wasm-production"),
254
- entry("statistical:t-inv-2t-basic", "statistical", "=T.INV.2T(0.5,1)", "implemented-wasm-production"),
255
- entry("statistical:confidence-t-basic", "statistical", "=CONFIDENCE.T(0.5,2,4)", "implemented-wasm-production"),
256
- entry("statistical:gamma-inv-basic", "statistical", "=GAMMA.INV(0.08030139707139418,3,2)", "implemented-wasm-production"),
257
- entry("statistical:t-test-basic", "statistical", "=T.TEST(A1:A3,B1:B3,2,1)", "implemented-wasm-production"),
258
- entry("statistical:forecast-basic", "statistical", "=FORECAST(4,A1:A3,B1:B3)", "implemented-wasm-production"),
259
- entry("statistical:forecast-linear-basic", "statistical", "=FORECAST.LINEAR(4,A1:A3,B1:B3)", "implemented-wasm-production"),
260
- entry("statistical:trend-basic", "statistical", "=TREND(A1:A3,B1:B3,D1:D2)", "implemented-wasm-production"),
261
- entry("statistical:growth-basic", "statistical", "=GROWTH(A1:A3,B1:B3,D1:D2)", "implemented-wasm-production"),
262
- entry("statistical:linest-basic", "statistical", "=LINEST(A1:A3,B1:B3)", "implemented-wasm-production"),
263
- entry("statistical:logest-basic", "statistical", "=LOGEST(A1:A3,B1:B3)", "implemented-wasm-production"),
264
- entry("statistical:prob-basic", "statistical", "=PROB(A1:A4,B1:B4,2,3)", "implemented-wasm-production"),
265
- entry("statistical:trimmean-basic", "statistical", "=TRIMMEAN(A1:A8,0.25)", "implemented-wasm-production"),
266
- entry("statistical:daverage-basic", "statistical", '=DAVERAGE(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
267
- entry("statistical:dcount-basic", "statistical", '=DCOUNT(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
268
- entry("statistical:dcounta-basic", "statistical", '=DCOUNTA(A1:C5,"Height",E1:E2)', "implemented-wasm-production"),
269
- entry("statistical:dget-basic", "statistical", '=DGET(A1:C5,"Height",F1:F2)', "implemented-wasm-production"),
270
- entry("statistical:dmax-basic", "statistical", '=DMAX(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
271
- entry("statistical:dmin-basic", "statistical", '=DMIN(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
272
- entry("statistical:dproduct-basic", "statistical", '=DPRODUCT(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
273
- entry("statistical:dstdev-basic", "statistical", '=DSTDEV(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
274
- entry("statistical:dstdevp-basic", "statistical", '=DSTDEVP(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
275
- entry("statistical:dsum-basic", "statistical", '=DSUM(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
276
- entry("statistical:dvar-basic", "statistical", '=DVAR(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
277
- entry("statistical:dvarp-basic", "statistical", '=DVARP(A1:C5,"Yield",E1:E2)', "implemented-wasm-production"),
278
- entry("information:isblank-basic", "information", "=ISBLANK(A1)", "implemented-wasm-production"),
279
- entry("information:isnumber-basic", "information", "=ISNUMBER(A1)", "implemented-wasm-production"),
280
- entry("information:istext-basic", "information", "=ISTEXT(A1)", "implemented-wasm-production"),
281
- entry("dynamic-array:sequence-spill", "dynamic-array", "=SEQUENCE(3,1,1,1)", "implemented-wasm-production", {
282
- notes: "Top-level SEQUENCE spills now execute on the AssemblyScript path and reuse the existing workbook spill metadata contract; broader array families remain blocked.",
201
+ entry('lookup-reference:address-basic', 'lookup-reference', '=ADDRESS(12,3)', 'implemented-wasm-production'),
202
+ entry('lookup-reference:index-basic', 'lookup-reference', '=INDEX(A1:B2,2,1)', 'implemented-wasm-production'),
203
+ entry('lookup-reference:match-exact', 'lookup-reference', '=MATCH("pear",A1:A3,0)', 'implemented-wasm-production'),
204
+ entry('lookup-reference:vlookup-exact', 'lookup-reference', '=VLOOKUP("pear",A1:B3,2,FALSE)', 'implemented-wasm-production'),
205
+ entry('lookup-reference:xlookup-exact', 'lookup-reference', '=XLOOKUP("pear",A1:A3,B1:B3)', 'implemented-wasm-production'),
206
+ entry('statistical:averageif-basic', 'statistical', '=AVERAGEIF(A1:A4,">0")', 'implemented-wasm-production'),
207
+ entry('statistical:countif-basic', 'statistical', '=COUNTIF(A1:A4,">0")', 'implemented-wasm-production'),
208
+ entry('statistical:chisqdist-basic', 'statistical', '=CHISQDIST(18.307,10)', 'implemented-wasm-production'),
209
+ entry('statistical:chiinv-basic', 'statistical', '=CHIINV(0.050001,10)', 'implemented-wasm-production'),
210
+ entry('statistical:chisq-inv-rt-basic', 'statistical', '=CHISQ.INV.RT(0.050001,10)', 'implemented-wasm-production'),
211
+ entry('statistical:chisqinv-basic', 'statistical', '=CHISQINV(0.050001,10)', 'implemented-wasm-production'),
212
+ entry('statistical:chisq-inv-basic', 'statistical', '=CHISQ.INV(0.93,1)', 'implemented-wasm-production'),
213
+ entry('statistical:chisq-test-basic', 'statistical', '=CHISQ.TEST(A1:B3,D1:E3)', 'implemented-wasm-production'),
214
+ entry('statistical:beta-dist-basic', 'statistical', '=BETA.DIST(2,8,10,TRUE,1,3)', 'implemented-wasm-production'),
215
+ entry('statistical:beta-inv-basic', 'statistical', '=BETA.INV(0.6854705810117458,8,10,1,3)', 'implemented-wasm-production'),
216
+ entry('statistical:f-dist-rt-basic', 'statistical', '=F.DIST.RT(15.2068649,6,4)', 'implemented-wasm-production'),
217
+ entry('statistical:fdist-basic', 'statistical', '=FDIST(15.2068649,6,4)', 'implemented-wasm-production'),
218
+ entry('statistical:f-inv-basic', 'statistical', '=F.INV(0.01,6,4)', 'implemented-wasm-production'),
219
+ entry('statistical:f-inv-rt-basic', 'statistical', '=F.INV.RT(0.01,6,4)', 'implemented-wasm-production'),
220
+ entry('statistical:f-test-basic', 'statistical', '=F.TEST(A1:A5,B1:B5)', 'implemented-wasm-production'),
221
+ entry('statistical:z-test-basic', 'statistical', '=Z.TEST(D1:D5,2,1)', 'implemented-wasm-production'),
222
+ entry('statistical:correl-basic', 'statistical', '=CORREL(A1:A3,B1:B3)', 'implemented-wasm-production'),
223
+ entry('statistical:covar-basic', 'statistical', '=COVAR(A1:A3,B1:B3)', 'implemented-wasm-production'),
224
+ entry('statistical:covariance-p-basic', 'statistical', '=COVARIANCE.P(A1:A3,B1:B3)', 'implemented-wasm-production'),
225
+ entry('statistical:covariance-s-basic', 'statistical', '=COVARIANCE.S(A1:A3,B1:B3)', 'implemented-wasm-production'),
226
+ entry('statistical:pearson-basic', 'statistical', '=PEARSON(A1:A3,B1:B3)', 'implemented-wasm-production'),
227
+ entry('statistical:intercept-basic', 'statistical', '=INTERCEPT(A1:A3,B1:B3)', 'implemented-wasm-production'),
228
+ entry('statistical:slope-basic', 'statistical', '=SLOPE(A1:A3,B1:B3)', 'implemented-wasm-production'),
229
+ entry('statistical:rsq-basic', 'statistical', '=RSQ(A1:A3,B1:B3)', 'implemented-wasm-production'),
230
+ entry('statistical:steyx-basic', 'statistical', '=STEYX(A1:A3,B1:B3)', 'implemented-wasm-production'),
231
+ entry('statistical:rank-basic', 'statistical', '=RANK(20,A1:A4)', 'implemented-wasm-production'),
232
+ entry('statistical:rank-eq-basic', 'statistical', '=RANK.EQ(20,A1:A4)', 'implemented-wasm-production'),
233
+ entry('statistical:rank-avg-basic', 'statistical', '=RANK.AVG(20,A1:A4)', 'implemented-wasm-production'),
234
+ entry('statistical:median-basic', 'statistical', '=MEDIAN(A1:A8)', 'implemented-wasm-production'),
235
+ entry('statistical:small-basic', 'statistical', '=SMALL(A1:A8,3)', 'implemented-wasm-production'),
236
+ entry('statistical:large-basic', 'statistical', '=LARGE(A1:A8,2)', 'implemented-wasm-production'),
237
+ entry('statistical:percentile-basic', 'statistical', '=PERCENTILE(A1:A8,0.25)', 'implemented-wasm-production'),
238
+ entry('statistical:percentile-inc-basic', 'statistical', '=PERCENTILE.INC(A1:A8,0.25)', 'implemented-wasm-production'),
239
+ entry('statistical:percentile-exc-basic', 'statistical', '=PERCENTILE.EXC(A1:A8,0.25)', 'implemented-wasm-production'),
240
+ entry('statistical:percentrank-basic', 'statistical', '=PERCENTRANK(A1:A8,8)', 'implemented-wasm-production'),
241
+ entry('statistical:percentrank-inc-basic', 'statistical', '=PERCENTRANK.INC(A1:A8,8)', 'implemented-wasm-production'),
242
+ entry('statistical:percentrank-exc-basic', 'statistical', '=PERCENTRANK.EXC(A1:A8,8)', 'implemented-wasm-production'),
243
+ entry('statistical:quartile-basic', 'statistical', '=QUARTILE(A1:A8,1)', 'implemented-wasm-production'),
244
+ entry('statistical:quartile-inc-basic', 'statistical', '=QUARTILE.INC(A1:A8,1)', 'implemented-wasm-production'),
245
+ entry('statistical:quartile-exc-basic', 'statistical', '=QUARTILE.EXC(A1:A8,1)', 'implemented-wasm-production'),
246
+ entry('statistical:mode-mult-basic', 'statistical', '=MODE.MULT(A1:A6)', 'implemented-wasm-production'),
247
+ entry('statistical:frequency-basic', 'statistical', '=FREQUENCY(A1:A6,B1:B3)', 'implemented-wasm-production'),
248
+ entry('statistical:t-dist-basic', 'statistical', '=T.DIST(1,1,TRUE)', 'implemented-wasm-production'),
249
+ entry('statistical:t-inv-2t-basic', 'statistical', '=T.INV.2T(0.5,1)', 'implemented-wasm-production'),
250
+ entry('statistical:confidence-t-basic', 'statistical', '=CONFIDENCE.T(0.5,2,4)', 'implemented-wasm-production'),
251
+ entry('statistical:gamma-inv-basic', 'statistical', '=GAMMA.INV(0.08030139707139418,3,2)', 'implemented-wasm-production'),
252
+ entry('statistical:t-test-basic', 'statistical', '=T.TEST(A1:A3,B1:B3,2,1)', 'implemented-wasm-production'),
253
+ entry('statistical:forecast-basic', 'statistical', '=FORECAST(4,A1:A3,B1:B3)', 'implemented-wasm-production'),
254
+ entry('statistical:forecast-linear-basic', 'statistical', '=FORECAST.LINEAR(4,A1:A3,B1:B3)', 'implemented-wasm-production'),
255
+ entry('statistical:trend-basic', 'statistical', '=TREND(A1:A3,B1:B3,D1:D2)', 'implemented-wasm-production'),
256
+ entry('statistical:growth-basic', 'statistical', '=GROWTH(A1:A3,B1:B3,D1:D2)', 'implemented-wasm-production'),
257
+ entry('statistical:linest-basic', 'statistical', '=LINEST(A1:A3,B1:B3)', 'implemented-wasm-production'),
258
+ entry('statistical:logest-basic', 'statistical', '=LOGEST(A1:A3,B1:B3)', 'implemented-wasm-production'),
259
+ entry('statistical:prob-basic', 'statistical', '=PROB(A1:A4,B1:B4,2,3)', 'implemented-wasm-production'),
260
+ entry('statistical:trimmean-basic', 'statistical', '=TRIMMEAN(A1:A8,0.25)', 'implemented-wasm-production'),
261
+ entry('statistical:daverage-basic', 'statistical', '=DAVERAGE(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
262
+ entry('statistical:dcount-basic', 'statistical', '=DCOUNT(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
263
+ entry('statistical:dcounta-basic', 'statistical', '=DCOUNTA(A1:C5,"Height",E1:E2)', 'implemented-wasm-production'),
264
+ entry('statistical:dget-basic', 'statistical', '=DGET(A1:C5,"Height",F1:F2)', 'implemented-wasm-production'),
265
+ entry('statistical:dmax-basic', 'statistical', '=DMAX(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
266
+ entry('statistical:dmin-basic', 'statistical', '=DMIN(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
267
+ entry('statistical:dproduct-basic', 'statistical', '=DPRODUCT(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
268
+ entry('statistical:dstdev-basic', 'statistical', '=DSTDEV(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
269
+ entry('statistical:dstdevp-basic', 'statistical', '=DSTDEVP(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
270
+ entry('statistical:dsum-basic', 'statistical', '=DSUM(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
271
+ entry('statistical:dvar-basic', 'statistical', '=DVAR(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
272
+ entry('statistical:dvarp-basic', 'statistical', '=DVARP(A1:C5,"Yield",E1:E2)', 'implemented-wasm-production'),
273
+ entry('information:isblank-basic', 'information', '=ISBLANK(A1)', 'implemented-wasm-production'),
274
+ entry('information:isnumber-basic', 'information', '=ISNUMBER(A1)', 'implemented-wasm-production'),
275
+ entry('information:istext-basic', 'information', '=ISTEXT(A1)', 'implemented-wasm-production'),
276
+ entry('dynamic-array:sequence-spill', 'dynamic-array', '=SEQUENCE(3,1,1,1)', 'implemented-wasm-production', {
277
+ notes: 'Top-level SEQUENCE spills now execute on the AssemblyScript path and reuse the existing workbook spill metadata contract; broader array families remain blocked.',
283
278
  }),
284
- entry("dynamic-array:sequence-aggregate", "dynamic-array", "=SUM(SEQUENCE(A1,1,1,1))", "implemented-wasm-production", {
285
- notes: "Numeric aggregate consumers can now read transient native SEQUENCE arrays directly on the AssemblyScript path without reviving the removed JS runtime fallback.",
279
+ entry('dynamic-array:sequence-aggregate', 'dynamic-array', '=SUM(SEQUENCE(A1,1,1,1))', 'implemented-wasm-production', {
280
+ notes: 'Numeric aggregate consumers can now read transient native SEQUENCE arrays directly on the AssemblyScript path without reviving the removed JS runtime fallback.',
286
281
  }),
287
- entry("dynamic-array:filter-basic", "dynamic-array", "=FILTER(A1:A4,A1:A4>2)", "implemented-wasm-production"),
288
- entry("dynamic-array:unique-basic", "dynamic-array", "=UNIQUE(A1:A4)", "implemented-wasm-production"),
289
- entry("dynamic-array:groupby-basic", "dynamic-array", "=GROUPBY(A1:A5,C1:C5,SUM,3,1)", "implemented-wasm-production", {
290
- notes: "The canonical SUM-form GROUPBY case now lowers onto an internal native grouped-array builtin, so the canonical spill executes on the wasm path with oracle coverage.",
282
+ entry('dynamic-array:filter-basic', 'dynamic-array', '=FILTER(A1:A4,A1:A4>2)', 'implemented-wasm-production'),
283
+ entry('dynamic-array:unique-basic', 'dynamic-array', '=UNIQUE(A1:A4)', 'implemented-wasm-production'),
284
+ entry('dynamic-array:groupby-basic', 'dynamic-array', '=GROUPBY(A1:A5,C1:C5,SUM,3,1)', 'implemented-wasm-production', {
285
+ notes: 'The canonical SUM-form GROUPBY case now lowers onto an internal native grouped-array builtin, so the canonical spill executes on the wasm path with oracle coverage.',
291
286
  }),
292
- entry("dynamic-array:pivotby-basic", "dynamic-array", "=PIVOTBY(A1:A5,B1:B5,C1:C5,SUM,3,1,0,1)", "implemented-wasm-production", {
293
- notes: "The canonical SUM-form PIVOTBY case now lowers onto an internal native grouped-array builtin, so the canonical pivot spill executes on the wasm path with oracle coverage.",
287
+ entry('dynamic-array:pivotby-basic', 'dynamic-array', '=PIVOTBY(A1:A5,B1:B5,C1:C5,SUM,3,1,0,1)', 'implemented-wasm-production', {
288
+ notes: 'The canonical SUM-form PIVOTBY case now lowers onto an internal native grouped-array builtin, so the canonical pivot spill executes on the wasm path with oracle coverage.',
294
289
  }),
295
- entry("names:defined-name-scalar", "names", "=TaxRate*A1", "implemented-wasm-production", {
296
- notes: "Scalar workbook names rebind onto the AssemblyScript path once the engine has concrete scalar metadata; reference-valued names remain blocked.",
290
+ entry('names:defined-name-scalar', 'names', '=TaxRate*A1', 'implemented-wasm-production', {
291
+ notes: 'Scalar workbook names rebind onto the AssemblyScript path once the engine has concrete scalar metadata; reference-valued names remain blocked.',
297
292
  }),
298
- entry("names:defined-name-case-insensitive", "names", "=taxrate*A1", "implemented-wasm-production", {
299
- scope: "extended",
300
- notes: "Case-insensitive scalar workbook names rebind onto the AssemblyScript path after metadata normalization.",
293
+ entry('names:defined-name-case-insensitive', 'names', '=taxrate*A1', 'implemented-wasm-production', {
294
+ scope: 'extended',
295
+ notes: 'Case-insensitive scalar workbook names rebind onto the AssemblyScript path after metadata normalization.',
301
296
  }),
302
- entry("names:defined-name-multi-scalar-pack", "names", "=TaxRate+FeeRate", "implemented-wasm-production", {
303
- scope: "extended",
304
- notes: "Multiple scalar workbook names can participate in one AssemblyScript-routed scalar expression without widening onto reference-valued metadata.",
297
+ entry('names:defined-name-multi-scalar-pack', 'names', '=TaxRate+FeeRate', 'implemented-wasm-production', {
298
+ scope: 'extended',
299
+ notes: 'Multiple scalar workbook names can participate in one AssemblyScript-routed scalar expression without widening onto reference-valued metadata.',
305
300
  }),
306
- entry("names:defined-name-missing", "names", "=MissingRate*A1", "implemented-wasm-production", {
307
- scope: "extended",
308
- notes: "Missing workbook-level names now stay on the AssemblyScript path, surface #NAME?, and rebind natively once the name appears.",
301
+ entry('names:defined-name-missing', 'names', '=MissingRate*A1', 'implemented-wasm-production', {
302
+ scope: 'extended',
303
+ notes: 'Missing workbook-level names now stay on the AssemblyScript path, surface #NAME?, and rebind natively once the name appears.',
309
304
  }),
310
- entry("lookup-reference:multiple-operations-basic", "lookup-reference", "=MULTIPLE.OPERATIONS(B5,B3,C4,B2,D2)", "implemented-js", {
311
- scope: "extended",
312
- notes: "MULTIPLE.OPERATIONS now routes through the workbook-aware JS what-if contract and is covered by both fixture-harness and engine integration tests.",
305
+ entry('lookup-reference:multiple-operations-basic', 'lookup-reference', '=MULTIPLE.OPERATIONS(B5,B3,C4,B2,D2)', 'implemented-js', {
306
+ scope: 'extended',
307
+ notes: 'MULTIPLE.OPERATIONS now routes through the workbook-aware JS what-if contract and is covered by both fixture-harness and engine integration tests.',
313
308
  }),
314
- entry("tables:table-total-row-sum", "tables", "=SUM(Sales[Amount])", "implemented-wasm-production", {
315
- notes: "Table-backed aggregate formulas now compile through metadata substitution and route onto the native aggregate path once the table exists.",
309
+ entry('tables:table-total-row-sum', 'tables', '=SUM(Sales[Amount])', 'implemented-wasm-production', {
310
+ notes: 'Table-backed aggregate formulas now compile through metadata substitution and route onto the native aggregate path once the table exists.',
316
311
  }),
317
- entry("structured-reference:table-column-ref", "structured-reference", "=SUM(Sales[Amount])", "implemented-wasm-production", {
318
- notes: "Structured column references now compile through metadata substitution and route onto the native aggregate path once the table exists.",
312
+ entry('structured-reference:table-column-ref', 'structured-reference', '=SUM(Sales[Amount])', 'implemented-wasm-production', {
313
+ notes: 'Structured column references now compile through metadata substitution and route onto the native aggregate path once the table exists.',
319
314
  }),
320
- entry("volatile:rand-basic", "volatile", "=RAND()", "implemented-wasm-production", {
321
- prerequisites: ["core:volatile-context", "core:value-model"],
315
+ entry('volatile:rand-basic', 'volatile', '=RAND()', 'implemented-wasm-production', {
316
+ prerequisites: ['core:volatile-context', 'core:value-model'],
322
317
  }),
323
- entry("lambda:let-basic", "lambda", "=LET(x,2,x+3)", "implemented-wasm-production", {
324
- notes: "LET formulas with rewrite-safe bindings now lower to ordinary scalar AST before binding, which lets deterministic cases route through the native fast path without a general closure VM.",
318
+ entry('lambda:let-basic', 'lambda', '=LET(x,2,x+3)', 'implemented-wasm-production', {
319
+ notes: 'LET formulas with rewrite-safe bindings now lower to ordinary scalar AST before binding, which lets deterministic cases route through the native fast path without a general closure VM.',
325
320
  }),
326
- entry("lambda:lambda-invoke", "lambda", "=LAMBDA(x,x+1)(4)", "implemented-wasm-production", {
327
- notes: "Immediate LAMBDA invocation now rewrites to the invoked body with argument substitution before binding, so scalar deterministic cases compile onto the native path.",
321
+ entry('lambda:lambda-invoke', 'lambda', '=LAMBDA(x,x+1)(4)', 'implemented-wasm-production', {
322
+ notes: 'Immediate LAMBDA invocation now rewrites to the invoked body with argument substitution before binding, so scalar deterministic cases compile onto the native path.',
328
323
  }),
329
- entry("lambda:map-basic", "lambda", "=MAP(A1:A3,LAMBDA(x,x*2))", "implemented-wasm-production", {
330
- notes: "MAP calls whose lambda body rewrites to an ordinary broadcasted array expression now lower before binding and execute on the native spill path.",
324
+ entry('lambda:map-basic', 'lambda', '=MAP(A1:A3,LAMBDA(x,x*2))', 'implemented-wasm-production', {
325
+ notes: 'MAP calls whose lambda body rewrites to an ordinary broadcasted array expression now lower before binding and execute on the native spill path.',
331
326
  }),
332
- entry("logical:if-true-branch", "logical", "=IF(A1,A2,A3)", "implemented-wasm-production"),
333
- entry("logical:if-condition-error", "logical", "=IF(1/0,1,2)", "implemented-wasm-production", {
334
- notes: "The native branch VM now propagates IF condition errors before either branch executes.",
327
+ entry('logical:if-true-branch', 'logical', '=IF(A1,A2,A3)', 'implemented-wasm-production'),
328
+ entry('logical:if-condition-error', 'logical', '=IF(1/0,1,2)', 'implemented-wasm-production', {
329
+ notes: 'The native branch VM now propagates IF condition errors before either branch executes.',
335
330
  }),
336
- entry("logical:iferror-catches-any-error", "logical", '=IFERROR(1/0,"fallback")', "implemented-wasm-production"),
337
- entry("logical:ifna-catches-na-only", "logical", '=IFNA(NA(),"missing")', "implemented-wasm-production"),
338
- entry("logical:and-false-on-empty", "logical", "=AND(TRUE,A1)", "implemented-wasm-production"),
339
- entry("logical:or-true-branch", "logical", "=OR(A1,TRUE)", "implemented-wasm-production"),
340
- entry("logical:not-number", "logical", "=NOT(2)", "implemented-wasm-production"),
341
- entry("information:isblank-empty", "information", "=ISBLANK(A1)", "implemented-wasm-production"),
342
- entry("information:isnumber-number", "information", "=ISNUMBER(42)", "implemented-wasm-production"),
343
- entry("information:istext-string", "information", '=ISTEXT("hello")', "implemented-wasm-production"),
344
- entry("text:len-counts-plain-string-length", "text", '=LEN("hello")', "implemented-wasm-production"),
345
- entry("text:exact-basic", "text", '=EXACT("Alpha","alpha")', "implemented-wasm-production", {
346
- notes: "EXACT now routes through the string-aware WASM runtime.",
331
+ entry('logical:iferror-catches-any-error', 'logical', '=IFERROR(1/0,"fallback")', 'implemented-wasm-production'),
332
+ entry('logical:ifna-catches-na-only', 'logical', '=IFNA(NA(),"missing")', 'implemented-wasm-production'),
333
+ entry('logical:and-false-on-empty', 'logical', '=AND(TRUE,A1)', 'implemented-wasm-production'),
334
+ entry('logical:or-true-branch', 'logical', '=OR(A1,TRUE)', 'implemented-wasm-production'),
335
+ entry('logical:not-number', 'logical', '=NOT(2)', 'implemented-wasm-production'),
336
+ entry('information:isblank-empty', 'information', '=ISBLANK(A1)', 'implemented-wasm-production'),
337
+ entry('information:isnumber-number', 'information', '=ISNUMBER(42)', 'implemented-wasm-production'),
338
+ entry('information:istext-string', 'information', '=ISTEXT("hello")', 'implemented-wasm-production'),
339
+ entry('text:len-counts-plain-string-length', 'text', '=LEN("hello")', 'implemented-wasm-production'),
340
+ entry('text:exact-basic', 'text', '=EXACT("Alpha","alpha")', 'implemented-wasm-production', {
341
+ notes: 'EXACT now routes through the string-aware WASM runtime.',
347
342
  }),
348
- entry("text:left-basic", "text", '=LEFT("alpha",3)', "implemented-wasm-production"),
349
- entry("text:right-basic", "text", '=RIGHT("alpha",2)', "implemented-wasm-production"),
350
- entry("text:mid-basic", "text", '=MID("alphabet",2,3)', "implemented-wasm-production"),
351
- entry("text:trim-basic", "text", '=TRIM(" alpha beta ")', "implemented-wasm-production"),
352
- entry("text:upper-basic", "text", '=UPPER("Alpha beta")', "implemented-wasm-production"),
353
- entry("text:lower-basic", "text", '=LOWER("Alpha BETA")', "implemented-wasm-production"),
354
- entry("text:find-basic", "text", '=FIND("ph","alphabet")', "implemented-wasm-production"),
355
- entry("text:search-basic", "text", '=SEARCH("PH","alphabet")', "implemented-wasm-production"),
356
- entry("text:textbefore-basic", "text", '=TEXTBEFORE("alpha-beta","-")', "implemented-wasm-production"),
357
- entry("text:textafter-basic", "text", '=TEXTAFTER("alpha-beta","-")', "implemented-wasm-production"),
358
- entry("text:textjoin-basic", "text", '=TEXTJOIN("-",TRUE,A1:A3)', "implemented-wasm-production"),
359
- entry("text:textsplit-basic", "text", '=TEXTSPLIT(A1,",","|")', "implemented-wasm-production"),
360
- entry("text:value-basic", "text", '=VALUE("42")', "implemented-wasm-production", {
361
- notes: "VALUE now coerces scalar text inputs on the AssemblyScript path, including trimmed decimals and exponent forms.",
343
+ entry('text:left-basic', 'text', '=LEFT("alpha",3)', 'implemented-wasm-production'),
344
+ entry('text:right-basic', 'text', '=RIGHT("alpha",2)', 'implemented-wasm-production'),
345
+ entry('text:mid-basic', 'text', '=MID("alphabet",2,3)', 'implemented-wasm-production'),
346
+ entry('text:trim-basic', 'text', '=TRIM(" alpha beta ")', 'implemented-wasm-production'),
347
+ entry('text:upper-basic', 'text', '=UPPER("Alpha beta")', 'implemented-wasm-production'),
348
+ entry('text:lower-basic', 'text', '=LOWER("Alpha BETA")', 'implemented-wasm-production'),
349
+ entry('text:find-basic', 'text', '=FIND("ph","alphabet")', 'implemented-wasm-production'),
350
+ entry('text:search-basic', 'text', '=SEARCH("PH","alphabet")', 'implemented-wasm-production'),
351
+ entry('text:textbefore-basic', 'text', '=TEXTBEFORE("alpha-beta","-")', 'implemented-wasm-production'),
352
+ entry('text:textafter-basic', 'text', '=TEXTAFTER("alpha-beta","-")', 'implemented-wasm-production'),
353
+ entry('text:textjoin-basic', 'text', '=TEXTJOIN("-",TRUE,A1:A3)', 'implemented-wasm-production'),
354
+ entry('text:textsplit-basic', 'text', '=TEXTSPLIT(A1,",","|")', 'implemented-wasm-production'),
355
+ entry('text:value-basic', 'text', '=VALUE("42")', 'implemented-wasm-production', {
356
+ notes: 'VALUE now coerces scalar text inputs on the AssemblyScript path, including trimmed decimals and exponent forms.',
362
357
  }),
363
- entry("lookup-reference:choose-basic", "lookup-reference", '=CHOOSE(2,"red","blue","green")', "implemented-wasm-production"),
364
- entry("lookup-reference:xmatch-basic", "lookup-reference", '=XMATCH("pear",A1:A3,0)', "implemented-wasm-production"),
365
- entry("lookup-reference:hlookup-basic", "lookup-reference", '=HLOOKUP("pear",A1:C2,2,FALSE)', "implemented-wasm-production"),
366
- entry("lookup-reference:offset-basic", "lookup-reference", "=OFFSET(A1,1,1)", "implemented-wasm-production", {
367
- notes: "OFFSET now executes on the AssemblyScript path for numeric inputs, including simple in-bounds offset ranges.",
358
+ entry('lookup-reference:choose-basic', 'lookup-reference', '=CHOOSE(2,"red","blue","green")', 'implemented-wasm-production'),
359
+ entry('lookup-reference:xmatch-basic', 'lookup-reference', '=XMATCH("pear",A1:A3,0)', 'implemented-wasm-production'),
360
+ entry('lookup-reference:hlookup-basic', 'lookup-reference', '=HLOOKUP("pear",A1:C2,2,FALSE)', 'implemented-wasm-production'),
361
+ entry('lookup-reference:offset-basic', 'lookup-reference', '=OFFSET(A1,1,1)', 'implemented-wasm-production', {
362
+ notes: 'OFFSET now executes on the AssemblyScript path for numeric inputs, including simple in-bounds offset ranges.',
368
363
  }),
369
- entry("dynamic-array:take-basic", "dynamic-array", "=TAKE(A1:A4,2)", "implemented-wasm-production"),
370
- entry("dynamic-array:drop-basic", "dynamic-array", "=DROP(A1:A4,2)", "implemented-wasm-production"),
371
- entry("dynamic-array:choosecols-basic", "dynamic-array", "=CHOOSECOLS(A1:C2,1,3)", "implemented-wasm-production"),
372
- entry("dynamic-array:chooserows-basic", "dynamic-array", "=CHOOSEROWS(A1:B3,1,3)", "implemented-wasm-production"),
373
- entry("statistical:sumif-basic", "statistical", '=SUMIF(A1:A4,">0",B1:B4)', "implemented-wasm-production"),
374
- entry("statistical:sumifs-basic", "statistical", '=SUMIFS(C1:C4,A1:A4,">0",B1:B4,"x")', "implemented-wasm-production"),
375
- entry("statistical:averageifs-basic", "statistical", '=AVERAGEIFS(C1:C4,A1:A4,">0",B1:B4,"x")', "implemented-wasm-production"),
376
- entry("statistical:countifs-basic", "statistical", '=COUNTIFS(A1:A4,">0",B1:B4,"x")', "implemented-wasm-production"),
377
- entry("math:sumproduct-basic", "math", "=SUMPRODUCT(A1:A3,B1:B3)", "implemented-wasm-production"),
378
- entry("math:int-basic", "math", "=INT(-3.1)", "implemented-wasm-production"),
379
- entry("math:roundup-basic", "math", "=ROUNDUP(12.341,2)", "implemented-wasm-production"),
380
- entry("math:rounddown-basic", "math", "=ROUNDDOWN(12.349,2)", "implemented-wasm-production"),
381
- entry("arithmetic:cross-sheet-multiply", "arithmetic", "=Sheet2!B1*3", "implemented-wasm-production", {
382
- scope: "extended",
383
- prerequisites: ["core:value-model", "core:reference-model"],
384
- notes: "Qualified scalar references stay on the native arithmetic path once the target sheet is present.",
364
+ entry('dynamic-array:take-basic', 'dynamic-array', '=TAKE(A1:A4,2)', 'implemented-wasm-production'),
365
+ entry('dynamic-array:drop-basic', 'dynamic-array', '=DROP(A1:A4,2)', 'implemented-wasm-production'),
366
+ entry('dynamic-array:choosecols-basic', 'dynamic-array', '=CHOOSECOLS(A1:C2,1,3)', 'implemented-wasm-production'),
367
+ entry('dynamic-array:chooserows-basic', 'dynamic-array', '=CHOOSEROWS(A1:B3,1,3)', 'implemented-wasm-production'),
368
+ entry('statistical:sumif-basic', 'statistical', '=SUMIF(A1:A4,">0",B1:B4)', 'implemented-wasm-production'),
369
+ entry('statistical:sumifs-basic', 'statistical', '=SUMIFS(C1:C4,A1:A4,">0",B1:B4,"x")', 'implemented-wasm-production'),
370
+ entry('statistical:averageifs-basic', 'statistical', '=AVERAGEIFS(C1:C4,A1:A4,">0",B1:B4,"x")', 'implemented-wasm-production'),
371
+ entry('statistical:countifs-basic', 'statistical', '=COUNTIFS(A1:A4,">0",B1:B4,"x")', 'implemented-wasm-production'),
372
+ entry('math:sumproduct-basic', 'math', '=SUMPRODUCT(A1:A3,B1:B3)', 'implemented-wasm-production'),
373
+ entry('math:int-basic', 'math', '=INT(-3.1)', 'implemented-wasm-production'),
374
+ entry('math:roundup-basic', 'math', '=ROUNDUP(12.341,2)', 'implemented-wasm-production'),
375
+ entry('math:rounddown-basic', 'math', '=ROUNDDOWN(12.349,2)', 'implemented-wasm-production'),
376
+ entry('arithmetic:cross-sheet-multiply', 'arithmetic', '=Sheet2!B1*3', 'implemented-wasm-production', {
377
+ scope: 'extended',
378
+ prerequisites: ['core:value-model', 'core:reference-model'],
379
+ notes: 'Qualified scalar references stay on the native arithmetic path once the target sheet is present.',
385
380
  }),
386
- entry("arithmetic:cross-sheet-empty-cell-zero", "arithmetic", "=Sheet2!B1*3", "implemented-wasm-production", {
387
- scope: "extended",
388
- prerequisites: ["core:value-model", "core:reference-model"],
389
- notes: "Existing blank cells on another sheet coerce through the usual arithmetic empty-cell semantics.",
381
+ entry('arithmetic:cross-sheet-empty-cell-zero', 'arithmetic', '=Sheet2!B1*3', 'implemented-wasm-production', {
382
+ scope: 'extended',
383
+ prerequisites: ['core:value-model', 'core:reference-model'],
384
+ notes: 'Existing blank cells on another sheet coerce through the usual arithmetic empty-cell semantics.',
390
385
  }),
391
- entry("arithmetic:missing-sheet-ref-error", "arithmetic", "=Sheet2!B1*3", "implemented-wasm-production", {
392
- scope: "extended",
393
- prerequisites: ["core:value-model", "core:reference-model"],
394
- notes: "Unresolved qualified cells now stay on the native path via explicit unresolved-ref operands that emit #REF! until rebinding can occur.",
386
+ entry('arithmetic:missing-sheet-ref-error', 'arithmetic', '=Sheet2!B1*3', 'implemented-wasm-production', {
387
+ scope: 'extended',
388
+ prerequisites: ['core:value-model', 'core:reference-model'],
389
+ notes: 'Unresolved qualified cells now stay on the native path via explicit unresolved-ref operands that emit #REF! until rebinding can occur.',
395
390
  }),
396
- entry("date-time:now-volatile", "date-time", "=NOW()", "implemented-wasm-production", {
397
- prerequisites: ["core:value-model", "core:date-serial-model", "core:volatile-context"],
398
- notes: "NOW now captures a single recalc-epoch serial on the host and executes on the AssemblyScript path.",
391
+ entry('date-time:now-volatile', 'date-time', '=NOW()', 'implemented-wasm-production', {
392
+ prerequisites: ['core:value-model', 'core:date-serial-model', 'core:volatile-context'],
393
+ notes: 'NOW now captures a single recalc-epoch serial on the host and executes on the AssemblyScript path.',
399
394
  }),
400
- entry("date-time:time-basic", "date-time", "=TIME(12,30,0)", "implemented-wasm-production"),
401
- entry("date-time:hour-basic", "date-time", "=HOUR(A1)", "implemented-wasm-production"),
402
- entry("date-time:minute-basic", "date-time", "=MINUTE(A1)", "implemented-wasm-production"),
403
- entry("date-time:second-basic", "date-time", "=SECOND(A1)", "implemented-wasm-production"),
404
- entry("date-time:datedif-ym", "date-time", '=DATEDIF(DATE(2020,1,15),DATE(2021,3,20),"YM")', "implemented-wasm-production"),
405
- entry("date-time:days360-basic", "date-time", "=DAYS360(DATE(2024,1,29),DATE(2024,3,31))", "implemented-wasm-production"),
406
- entry("date-time:isoweeknum-basic", "date-time", "=ISOWEEKNUM(DATE(2024,1,1))", "implemented-wasm-production"),
407
- entry("date-time:workday-intl-basic", "date-time", "=WORKDAY.INTL(A1,2,7,B1)", "implemented-wasm-production"),
408
- entry("date-time:timevalue-basic", "date-time", '=TIMEVALUE("1:30 PM")', "implemented-wasm-production"),
409
- entry("date-time:yearfrac-basic", "date-time", "=YEARFRAC(DATE(2024,1,1),DATE(2024,7,1),3)", "implemented-wasm-production"),
410
- entry("date-time:fvschedule-basic", "date-time", "=FVSCHEDULE(1000,0.09,0.11,0.1)", "implemented-wasm-production"),
411
- entry("date-time:effect-basic", "date-time", "=EFFECT(12%,12)", "implemented-wasm-production"),
412
- entry("date-time:nominal-basic", "date-time", "=NOMINAL(0.12682503013196977,12)", "implemented-wasm-production"),
413
- entry("date-time:pduration-basic", "date-time", "=PDURATION(10%,100,121)", "implemented-wasm-production"),
414
- entry("date-time:rri-basic", "date-time", "=RRI(2,100,121)", "implemented-wasm-production"),
415
- entry("date-time:fv-basic", "date-time", "=FV(10%,2,-100,-1000)", "implemented-wasm-production"),
416
- entry("date-time:pv-basic", "date-time", "=PV(10%,2,-576.1904761904761)", "implemented-wasm-production"),
417
- entry("date-time:pmt-basic", "date-time", "=PMT(10%,2,1000)", "implemented-wasm-production"),
418
- entry("date-time:nper-basic", "date-time", "=NPER(10%,-576.1904761904761,1000)", "implemented-wasm-production"),
419
- entry("date-time:npv-basic", "date-time", "=NPV(10%,100,200,300)", "implemented-wasm-production"),
420
- entry("date-time:rate-basic", "date-time", "=RATE(48,-200,8000)", "implemented-wasm-production"),
421
- entry("date-time:irr-basic", "date-time", "=IRR(A1:A6)", "implemented-wasm-production"),
422
- entry("date-time:mirr-basic", "date-time", "=MIRR(A1:A6,10%,12%)", "implemented-wasm-production"),
423
- entry("date-time:xnpv-basic", "date-time", "=XNPV(0.09,A1:A5,B1:B5)", "implemented-wasm-production"),
424
- entry("date-time:xirr-basic", "date-time", "=XIRR(A1:A5,B1:B5)", "implemented-wasm-production"),
425
- entry("date-time:ipmt-basic", "date-time", "=IPMT(10%,1,2,1000)", "implemented-wasm-production"),
426
- entry("date-time:ppmt-basic", "date-time", "=PPMT(10%,1,2,1000)", "implemented-wasm-production"),
427
- entry("date-time:ispmt-basic", "date-time", "=ISPMT(10%,1,2,1000)", "implemented-wasm-production"),
428
- entry("date-time:cumipmt-basic", "date-time", "=CUMIPMT(9%/12,30*12,125000,13,24,0)", "implemented-wasm-production"),
429
- entry("date-time:cumprinc-basic", "date-time", "=CUMPRINC(9%/12,30*12,125000,13,24,0)", "implemented-wasm-production"),
430
- entry("date-time:db-basic", "date-time", "=DB(10000,1000,5,1)", "implemented-wasm-production"),
431
- entry("date-time:ddb-basic", "date-time", "=DDB(2400,300,10,2)", "implemented-wasm-production"),
432
- entry("date-time:vdb-basic", "date-time", "=VDB(2400,300,10,1,3)", "implemented-wasm-production"),
433
- entry("date-time:sln-basic", "date-time", "=SLN(10000,1000,9)", "implemented-wasm-production"),
434
- entry("date-time:syd-basic", "date-time", "=SYD(10000,1000,9,1)", "implemented-wasm-production"),
435
- entry("date-time:disc-basic", "date-time", "=DISC(DATE(2023,1,1),DATE(2023,4,1),97,100,2)", "implemented-wasm-production"),
436
- entry("date-time:intrate-basic", "date-time", "=INTRATE(DATE(2023,1,1),DATE(2023,4,1),1000,1030,2)", "implemented-wasm-production"),
437
- entry("date-time:received-basic", "date-time", "=RECEIVED(DATE(2023,1,1),DATE(2023,4,1),1000,0.12,2)", "implemented-wasm-production"),
438
- entry("date-time:pricedisc-basic", "date-time", "=PRICEDISC(DATE(2008,2,16),DATE(2008,3,1),0.0525,100,2)", "implemented-wasm-production"),
439
- entry("date-time:yielddisc-basic", "date-time", "=YIELDDISC(DATE(2008,2,16),DATE(2008,3,1),99.795,100,2)", "implemented-wasm-production"),
440
- entry("date-time:pricemat-basic", "date-time", "=PRICEMAT(DATE(2008,2,15),DATE(2008,4,13),DATE(2007,11,11),0.061,0.061,0)", "implemented-wasm-production"),
441
- entry("date-time:yieldmat-basic", "date-time", "=YIELDMAT(DATE(2008,3,15),DATE(2008,11,3),DATE(2007,11,8),0.0625,100.0123,0)", "implemented-wasm-production"),
442
- entry("date-time:oddfprice-basic", "date-time", "=ODDFPRICE(DATE(2008,11,11),DATE(2021,3,1),DATE(2008,10,15),DATE(2009,3,1),0.0785,0.0625,100,2,1)", "implemented-wasm-production"),
443
- entry("date-time:oddfyield-basic", "date-time", "=ODDFYIELD(DATE(2008,11,11),DATE(2021,3,1),DATE(2008,10,15),DATE(2009,3,1),0.0575,84.5,100,2,0)", "implemented-wasm-production"),
444
- entry("date-time:oddlprice-basic", "date-time", "=ODDLPRICE(DATE(2008,2,7),DATE(2008,6,15),DATE(2007,10,15),0.0375,0.0405,100,2,0)", "implemented-wasm-production"),
445
- entry("date-time:oddlyield-basic", "date-time", "=ODDLYIELD(DATE(2008,4,20),DATE(2008,6,15),DATE(2007,12,24),0.0375,99.875,100,2,0)", "implemented-wasm-production"),
446
- entry("date-time:coupdaybs-basic", "date-time", "=COUPDAYBS(DATE(2007,1,25),DATE(2009,11,15),2,4)", "implemented-wasm-production"),
447
- entry("date-time:coupdays-basic", "date-time", "=COUPDAYS(DATE(2007,1,25),DATE(2009,11,15),2,4)", "implemented-wasm-production"),
448
- entry("date-time:coupdaysnc-basic", "date-time", "=COUPDAYSNC(DATE(2007,1,25),DATE(2009,11,15),2,4)", "implemented-wasm-production"),
449
- entry("date-time:coupncd-basic", "date-time", "=COUPNCD(DATE(2007,1,25),DATE(2009,11,15),2,4)", "implemented-wasm-production"),
450
- entry("date-time:coupnum-basic", "date-time", "=COUPNUM(DATE(2007,1,25),DATE(2009,11,15),2,4)", "implemented-wasm-production"),
451
- entry("date-time:couppcd-basic", "date-time", "=COUPPCD(DATE(2007,1,25),DATE(2009,11,15),2,4)", "implemented-wasm-production"),
452
- entry("date-time:price-basic", "date-time", "=PRICE(DATE(2008,2,15),DATE(2017,11,15),0.0575,0.065,100,2,0)", "implemented-wasm-production"),
453
- entry("date-time:yield-basic", "date-time", "=YIELD(DATE(2008,2,15),DATE(2016,11,15),0.0575,95.04287,100,2,0)", "implemented-wasm-production"),
454
- entry("date-time:duration-basic", "date-time", "=DURATION(DATE(2018,7,1),DATE(2048,1,1),0.08,0.09,2,1)", "implemented-wasm-production"),
455
- entry("date-time:mduration-basic", "date-time", "=MDURATION(DATE(2008,1,1),DATE(2016,1,1),0.08,0.09,2,1)", "implemented-wasm-production"),
456
- entry("date-time:tbillprice-basic", "date-time", "=TBILLPRICE(DATE(2008,3,31),DATE(2008,6,1),0.09)", "implemented-wasm-production"),
457
- entry("date-time:tbillyield-basic", "date-time", "=TBILLYIELD(DATE(2008,3,31),DATE(2008,6,1),98.45)", "implemented-wasm-production"),
458
- entry("date-time:tbilleq-basic", "date-time", "=TBILLEQ(DATE(2008,3,31),DATE(2008,6,1),0.0914)", "implemented-wasm-production"),
459
- entry("date-time:networkdays-intl-basic", "date-time", "=NETWORKDAYS.INTL(A1,A2,7,B1)", "implemented-wasm-production"),
460
- entry("date-time:weekday-basic", "date-time", "=WEEKDAY(DATE(2026,3,15))", "implemented-wasm-production"),
461
- entry("aggregation:cross-sheet-range-sum", "aggregation", "=SUM(Sheet2!A1:A2)", "implemented-wasm-production", {
462
- scope: "extended",
463
- prerequisites: ["core:value-model", "core:range-iterators", "core:reference-model"],
464
- notes: "Resolved qualified ranges now stay on the native aggregation path.",
395
+ entry('date-time:time-basic', 'date-time', '=TIME(12,30,0)', 'implemented-wasm-production'),
396
+ entry('date-time:hour-basic', 'date-time', '=HOUR(A1)', 'implemented-wasm-production'),
397
+ entry('date-time:minute-basic', 'date-time', '=MINUTE(A1)', 'implemented-wasm-production'),
398
+ entry('date-time:second-basic', 'date-time', '=SECOND(A1)', 'implemented-wasm-production'),
399
+ entry('date-time:datedif-ym', 'date-time', '=DATEDIF(DATE(2020,1,15),DATE(2021,3,20),"YM")', 'implemented-wasm-production'),
400
+ entry('date-time:days360-basic', 'date-time', '=DAYS360(DATE(2024,1,29),DATE(2024,3,31))', 'implemented-wasm-production'),
401
+ entry('date-time:isoweeknum-basic', 'date-time', '=ISOWEEKNUM(DATE(2024,1,1))', 'implemented-wasm-production'),
402
+ entry('date-time:workday-intl-basic', 'date-time', '=WORKDAY.INTL(A1,2,7,B1)', 'implemented-wasm-production'),
403
+ entry('date-time:timevalue-basic', 'date-time', '=TIMEVALUE("1:30 PM")', 'implemented-wasm-production'),
404
+ entry('date-time:yearfrac-basic', 'date-time', '=YEARFRAC(DATE(2024,1,1),DATE(2024,7,1),3)', 'implemented-wasm-production'),
405
+ entry('date-time:fvschedule-basic', 'date-time', '=FVSCHEDULE(1000,0.09,0.11,0.1)', 'implemented-wasm-production'),
406
+ entry('date-time:effect-basic', 'date-time', '=EFFECT(12%,12)', 'implemented-wasm-production'),
407
+ entry('date-time:nominal-basic', 'date-time', '=NOMINAL(0.12682503013196977,12)', 'implemented-wasm-production'),
408
+ entry('date-time:pduration-basic', 'date-time', '=PDURATION(10%,100,121)', 'implemented-wasm-production'),
409
+ entry('date-time:rri-basic', 'date-time', '=RRI(2,100,121)', 'implemented-wasm-production'),
410
+ entry('date-time:fv-basic', 'date-time', '=FV(10%,2,-100,-1000)', 'implemented-wasm-production'),
411
+ entry('date-time:pv-basic', 'date-time', '=PV(10%,2,-576.1904761904761)', 'implemented-wasm-production'),
412
+ entry('date-time:pmt-basic', 'date-time', '=PMT(10%,2,1000)', 'implemented-wasm-production'),
413
+ entry('date-time:nper-basic', 'date-time', '=NPER(10%,-576.1904761904761,1000)', 'implemented-wasm-production'),
414
+ entry('date-time:npv-basic', 'date-time', '=NPV(10%,100,200,300)', 'implemented-wasm-production'),
415
+ entry('date-time:rate-basic', 'date-time', '=RATE(48,-200,8000)', 'implemented-wasm-production'),
416
+ entry('date-time:irr-basic', 'date-time', '=IRR(A1:A6)', 'implemented-wasm-production'),
417
+ entry('date-time:mirr-basic', 'date-time', '=MIRR(A1:A6,10%,12%)', 'implemented-wasm-production'),
418
+ entry('date-time:xnpv-basic', 'date-time', '=XNPV(0.09,A1:A5,B1:B5)', 'implemented-wasm-production'),
419
+ entry('date-time:xirr-basic', 'date-time', '=XIRR(A1:A5,B1:B5)', 'implemented-wasm-production'),
420
+ entry('date-time:ipmt-basic', 'date-time', '=IPMT(10%,1,2,1000)', 'implemented-wasm-production'),
421
+ entry('date-time:ppmt-basic', 'date-time', '=PPMT(10%,1,2,1000)', 'implemented-wasm-production'),
422
+ entry('date-time:ispmt-basic', 'date-time', '=ISPMT(10%,1,2,1000)', 'implemented-wasm-production'),
423
+ entry('date-time:cumipmt-basic', 'date-time', '=CUMIPMT(9%/12,30*12,125000,13,24,0)', 'implemented-wasm-production'),
424
+ entry('date-time:cumprinc-basic', 'date-time', '=CUMPRINC(9%/12,30*12,125000,13,24,0)', 'implemented-wasm-production'),
425
+ entry('date-time:db-basic', 'date-time', '=DB(10000,1000,5,1)', 'implemented-wasm-production'),
426
+ entry('date-time:ddb-basic', 'date-time', '=DDB(2400,300,10,2)', 'implemented-wasm-production'),
427
+ entry('date-time:vdb-basic', 'date-time', '=VDB(2400,300,10,1,3)', 'implemented-wasm-production'),
428
+ entry('date-time:sln-basic', 'date-time', '=SLN(10000,1000,9)', 'implemented-wasm-production'),
429
+ entry('date-time:syd-basic', 'date-time', '=SYD(10000,1000,9,1)', 'implemented-wasm-production'),
430
+ entry('date-time:disc-basic', 'date-time', '=DISC(DATE(2023,1,1),DATE(2023,4,1),97,100,2)', 'implemented-wasm-production'),
431
+ entry('date-time:intrate-basic', 'date-time', '=INTRATE(DATE(2023,1,1),DATE(2023,4,1),1000,1030,2)', 'implemented-wasm-production'),
432
+ entry('date-time:received-basic', 'date-time', '=RECEIVED(DATE(2023,1,1),DATE(2023,4,1),1000,0.12,2)', 'implemented-wasm-production'),
433
+ entry('date-time:pricedisc-basic', 'date-time', '=PRICEDISC(DATE(2008,2,16),DATE(2008,3,1),0.0525,100,2)', 'implemented-wasm-production'),
434
+ entry('date-time:yielddisc-basic', 'date-time', '=YIELDDISC(DATE(2008,2,16),DATE(2008,3,1),99.795,100,2)', 'implemented-wasm-production'),
435
+ entry('date-time:pricemat-basic', 'date-time', '=PRICEMAT(DATE(2008,2,15),DATE(2008,4,13),DATE(2007,11,11),0.061,0.061,0)', 'implemented-wasm-production'),
436
+ entry('date-time:yieldmat-basic', 'date-time', '=YIELDMAT(DATE(2008,3,15),DATE(2008,11,3),DATE(2007,11,8),0.0625,100.0123,0)', 'implemented-wasm-production'),
437
+ entry('date-time:oddfprice-basic', 'date-time', '=ODDFPRICE(DATE(2008,11,11),DATE(2021,3,1),DATE(2008,10,15),DATE(2009,3,1),0.0785,0.0625,100,2,1)', 'implemented-wasm-production'),
438
+ entry('date-time:oddfyield-basic', 'date-time', '=ODDFYIELD(DATE(2008,11,11),DATE(2021,3,1),DATE(2008,10,15),DATE(2009,3,1),0.0575,84.5,100,2,0)', 'implemented-wasm-production'),
439
+ entry('date-time:oddlprice-basic', 'date-time', '=ODDLPRICE(DATE(2008,2,7),DATE(2008,6,15),DATE(2007,10,15),0.0375,0.0405,100,2,0)', 'implemented-wasm-production'),
440
+ entry('date-time:oddlyield-basic', 'date-time', '=ODDLYIELD(DATE(2008,4,20),DATE(2008,6,15),DATE(2007,12,24),0.0375,99.875,100,2,0)', 'implemented-wasm-production'),
441
+ entry('date-time:coupdaybs-basic', 'date-time', '=COUPDAYBS(DATE(2007,1,25),DATE(2009,11,15),2,4)', 'implemented-wasm-production'),
442
+ entry('date-time:coupdays-basic', 'date-time', '=COUPDAYS(DATE(2007,1,25),DATE(2009,11,15),2,4)', 'implemented-wasm-production'),
443
+ entry('date-time:coupdaysnc-basic', 'date-time', '=COUPDAYSNC(DATE(2007,1,25),DATE(2009,11,15),2,4)', 'implemented-wasm-production'),
444
+ entry('date-time:coupncd-basic', 'date-time', '=COUPNCD(DATE(2007,1,25),DATE(2009,11,15),2,4)', 'implemented-wasm-production'),
445
+ entry('date-time:coupnum-basic', 'date-time', '=COUPNUM(DATE(2007,1,25),DATE(2009,11,15),2,4)', 'implemented-wasm-production'),
446
+ entry('date-time:couppcd-basic', 'date-time', '=COUPPCD(DATE(2007,1,25),DATE(2009,11,15),2,4)', 'implemented-wasm-production'),
447
+ entry('date-time:price-basic', 'date-time', '=PRICE(DATE(2008,2,15),DATE(2017,11,15),0.0575,0.065,100,2,0)', 'implemented-wasm-production'),
448
+ entry('date-time:yield-basic', 'date-time', '=YIELD(DATE(2008,2,15),DATE(2016,11,15),0.0575,95.04287,100,2,0)', 'implemented-wasm-production'),
449
+ entry('date-time:duration-basic', 'date-time', '=DURATION(DATE(2018,7,1),DATE(2048,1,1),0.08,0.09,2,1)', 'implemented-wasm-production'),
450
+ entry('date-time:mduration-basic', 'date-time', '=MDURATION(DATE(2008,1,1),DATE(2016,1,1),0.08,0.09,2,1)', 'implemented-wasm-production'),
451
+ entry('date-time:tbillprice-basic', 'date-time', '=TBILLPRICE(DATE(2008,3,31),DATE(2008,6,1),0.09)', 'implemented-wasm-production'),
452
+ entry('date-time:tbillyield-basic', 'date-time', '=TBILLYIELD(DATE(2008,3,31),DATE(2008,6,1),98.45)', 'implemented-wasm-production'),
453
+ entry('date-time:tbilleq-basic', 'date-time', '=TBILLEQ(DATE(2008,3,31),DATE(2008,6,1),0.0914)', 'implemented-wasm-production'),
454
+ entry('date-time:networkdays-intl-basic', 'date-time', '=NETWORKDAYS.INTL(A1,A2,7,B1)', 'implemented-wasm-production'),
455
+ entry('date-time:weekday-basic', 'date-time', '=WEEKDAY(DATE(2026,3,15))', 'implemented-wasm-production'),
456
+ entry('aggregation:cross-sheet-range-sum', 'aggregation', '=SUM(Sheet2!A1:A2)', 'implemented-wasm-production', {
457
+ scope: 'extended',
458
+ prerequisites: ['core:value-model', 'core:range-iterators', 'core:reference-model'],
459
+ notes: 'Resolved qualified ranges now stay on the native aggregation path.',
465
460
  }),
466
- entry("aggregation:cross-sheet-empty-range-zero", "aggregation", "=SUM(Sheet2!A1:A2)", "implemented-wasm-production", {
467
- scope: "extended",
468
- prerequisites: ["core:value-model", "core:range-iterators", "core:reference-model"],
469
- notes: "Existing blank ranges on another sheet aggregate as zero once the referenced sheet exists.",
461
+ entry('aggregation:cross-sheet-empty-range-zero', 'aggregation', '=SUM(Sheet2!A1:A2)', 'implemented-wasm-production', {
462
+ scope: 'extended',
463
+ prerequisites: ['core:value-model', 'core:range-iterators', 'core:reference-model'],
464
+ notes: 'Existing blank ranges on another sheet aggregate as zero once the referenced sheet exists.',
470
465
  }),
471
- entry("aggregation:missing-sheet-range-ref-error", "aggregation", "=SUM(Sheet2!A1:A2)", "implemented-wasm-production", {
472
- scope: "extended",
473
- prerequisites: ["core:value-model", "core:range-iterators", "core:reference-model"],
474
- notes: "Missing qualified ranges now stay on the native path via explicit unresolved-range operands that emit #REF! until later rebinding.",
466
+ entry('aggregation:missing-sheet-range-ref-error', 'aggregation', '=SUM(Sheet2!A1:A2)', 'implemented-wasm-production', {
467
+ scope: 'extended',
468
+ prerequisites: ['core:value-model', 'core:range-iterators', 'core:reference-model'],
469
+ notes: 'Missing qualified ranges now stay on the native path via explicit unresolved-range operands that emit #REF! until later rebinding.',
475
470
  }),
476
- entry("dynamic-array:sort-basic", "dynamic-array", "=SORT(A1:A4)", "implemented-wasm-production"),
477
- entry("dynamic-array:sortby-basic", "dynamic-array", "=SORTBY(A1:A3,B1:B3)", "implemented-wasm-production"),
478
- entry("dynamic-array:tocol-basic", "dynamic-array", "=TOCOL(A1:B2)", "implemented-wasm-production"),
479
- entry("dynamic-array:torow-basic", "dynamic-array", "=TOROW(A1:B2)", "implemented-wasm-production"),
480
- entry("dynamic-array:wraprows-basic", "dynamic-array", "=WRAPROWS(A1:A4,2)", "implemented-wasm-production"),
481
- entry("dynamic-array:wrapcols-basic", "dynamic-array", "=WRAPCOLS(A1:A4,2)", "implemented-wasm-production"),
482
- entry("names:defined-name-range", "names", "=SUM(MyRange)", "implemented-wasm-production", {
483
- notes: "Range-valued workbook names now compile through metadata substitution and route onto the native aggregate path once the name resolves.",
471
+ entry('dynamic-array:sort-basic', 'dynamic-array', '=SORT(A1:A4)', 'implemented-wasm-production'),
472
+ entry('dynamic-array:sortby-basic', 'dynamic-array', '=SORTBY(A1:A3,B1:B3)', 'implemented-wasm-production'),
473
+ entry('dynamic-array:tocol-basic', 'dynamic-array', '=TOCOL(A1:B2)', 'implemented-wasm-production'),
474
+ entry('dynamic-array:torow-basic', 'dynamic-array', '=TOROW(A1:B2)', 'implemented-wasm-production'),
475
+ entry('dynamic-array:wraprows-basic', 'dynamic-array', '=WRAPROWS(A1:A4,2)', 'implemented-wasm-production'),
476
+ entry('dynamic-array:wrapcols-basic', 'dynamic-array', '=WRAPCOLS(A1:A4,2)', 'implemented-wasm-production'),
477
+ entry('names:defined-name-range', 'names', '=SUM(MyRange)', 'implemented-wasm-production', {
478
+ notes: 'Range-valued workbook names now compile through metadata substitution and route onto the native aggregate path once the name resolves.',
484
479
  }),
485
- entry("lambda:byrow-basic", "lambda", "=BYROW(A1:B2,LAMBDA(r,SUM(r)))", "implemented-wasm-production", {
486
- notes: "BYROW aggregate lambdas in the canonical SUM form now lower onto an internal native row-sum builtin, so the canonical spill case executes on the wasm path.",
480
+ entry('lambda:byrow-basic', 'lambda', '=BYROW(A1:B2,LAMBDA(r,SUM(r)))', 'implemented-wasm-production', {
481
+ notes: 'BYROW aggregate lambdas in the canonical SUM form now lower onto an internal native row-sum builtin, so the canonical spill case executes on the wasm path.',
487
482
  }),
488
483
  ];
489
484
  export function getCompatibilityEntry(id) {