@ricsam/formula-engine 0.2.8 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +41 -3
  2. package/dist/cjs/core/engine.cjs +551 -166
  3. package/dist/cjs/core/engine.cjs.map +3 -3
  4. package/dist/cjs/core/managers/dependency-manager.cjs +151 -67
  5. package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
  6. package/dist/cjs/core/managers/evaluation-manager.cjs.map +1 -1
  7. package/dist/cjs/core/managers/workbook-manager.cjs +197 -1
  8. package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
  9. package/dist/cjs/core/mutation-invalidation.cjs +241 -0
  10. package/dist/cjs/core/mutation-invalidation.cjs.map +10 -0
  11. package/dist/cjs/core/types.cjs.map +2 -2
  12. package/dist/cjs/core/workbook-renamer.cjs.map +1 -1
  13. package/dist/cjs/evaluator/formula-evaluator.cjs +22 -48
  14. package/dist/cjs/evaluator/formula-evaluator.cjs.map +3 -3
  15. package/dist/cjs/functions/math/sum/summation-utils.cjs +2 -2
  16. package/dist/cjs/functions/math/sum/summation-utils.cjs.map +2 -2
  17. package/dist/cjs/lib.cjs +2 -13
  18. package/dist/cjs/lib.cjs.map +3 -3
  19. package/dist/cjs/package.json +1 -1
  20. package/dist/cjs/parser/formatter.cjs +3 -4
  21. package/dist/cjs/parser/formatter.cjs.map +3 -3
  22. package/dist/cjs/parser/parser.cjs +24 -216
  23. package/dist/cjs/parser/parser.cjs.map +3 -3
  24. package/dist/mjs/core/engine.mjs +565 -207
  25. package/dist/mjs/core/engine.mjs.map +3 -3
  26. package/dist/mjs/core/managers/dependency-manager.mjs +151 -67
  27. package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
  28. package/dist/mjs/core/managers/evaluation-manager.mjs.map +1 -1
  29. package/dist/mjs/core/managers/workbook-manager.mjs +197 -1
  30. package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
  31. package/dist/mjs/core/mutation-invalidation.mjs +201 -0
  32. package/dist/mjs/core/mutation-invalidation.mjs.map +10 -0
  33. package/dist/mjs/core/types.mjs.map +2 -2
  34. package/dist/mjs/core/workbook-renamer.mjs.map +1 -1
  35. package/dist/mjs/evaluator/formula-evaluator.mjs +22 -48
  36. package/dist/mjs/evaluator/formula-evaluator.mjs.map +3 -3
  37. package/dist/mjs/functions/math/sum/summation-utils.mjs +2 -2
  38. package/dist/mjs/functions/math/sum/summation-utils.mjs.map +2 -2
  39. package/dist/mjs/lib.mjs +2 -13
  40. package/dist/mjs/lib.mjs.map +3 -3
  41. package/dist/mjs/package.json +1 -1
  42. package/dist/mjs/parser/formatter.mjs +3 -4
  43. package/dist/mjs/parser/formatter.mjs.map +3 -3
  44. package/dist/mjs/parser/parser.mjs +24 -216
  45. package/dist/mjs/parser/parser.mjs.map +3 -3
  46. package/dist/types/core/engine.d.ts +31 -135
  47. package/dist/types/core/managers/dependency-manager.d.ts +5 -1
  48. package/dist/types/core/managers/evaluation-manager.d.ts +1 -1
  49. package/dist/types/core/managers/workbook-manager.d.ts +23 -1
  50. package/dist/types/core/mutation-invalidation.d.ts +46 -0
  51. package/dist/types/core/types.d.ts +35 -0
  52. package/dist/types/lib.d.ts +0 -8
  53. package/dist/types/parser/parser.d.ts +4 -6
  54. package/package.json +1 -1
  55. package/dist/cjs/core/commands/command-executor.cjs +0 -149
  56. package/dist/cjs/core/commands/command-executor.cjs.map +0 -10
  57. package/dist/cjs/core/commands/content-commands.cjs +0 -857
  58. package/dist/cjs/core/commands/content-commands.cjs.map +0 -10
  59. package/dist/cjs/core/commands/metadata-commands.cjs +0 -160
  60. package/dist/cjs/core/commands/metadata-commands.cjs.map +0 -10
  61. package/dist/cjs/core/commands/named-expression-commands.cjs +0 -363
  62. package/dist/cjs/core/commands/named-expression-commands.cjs.map +0 -10
  63. package/dist/cjs/core/commands/structure-commands.cjs +0 -696
  64. package/dist/cjs/core/commands/structure-commands.cjs.map +0 -10
  65. package/dist/cjs/core/commands/style-commands.cjs +0 -229
  66. package/dist/cjs/core/commands/style-commands.cjs.map +0 -10
  67. package/dist/cjs/core/commands/table-commands.cjs +0 -495
  68. package/dist/cjs/core/commands/table-commands.cjs.map +0 -10
  69. package/dist/cjs/core/commands/types.cjs +0 -99
  70. package/dist/cjs/core/commands/types.cjs.map +0 -10
  71. package/dist/cjs/core/managers/schema-manager.cjs +0 -374
  72. package/dist/cjs/core/managers/schema-manager.cjs.map +0 -10
  73. package/dist/cjs/core/schema/cell-orm.cjs +0 -76
  74. package/dist/cjs/core/schema/cell-orm.cjs.map +0 -10
  75. package/dist/cjs/core/schema/grid-orm.cjs +0 -125
  76. package/dist/cjs/core/schema/grid-orm.cjs.map +0 -10
  77. package/dist/cjs/core/schema/schema-builder.cjs +0 -74
  78. package/dist/cjs/core/schema/schema-builder.cjs.map +0 -10
  79. package/dist/cjs/core/schema/schema-helpers.cjs +0 -200
  80. package/dist/cjs/core/schema/schema-helpers.cjs.map +0 -10
  81. package/dist/cjs/core/schema/schema.cjs +0 -91
  82. package/dist/cjs/core/schema/schema.cjs.map +0 -10
  83. package/dist/cjs/core/schema/table-orm.cjs +0 -189
  84. package/dist/cjs/core/schema/table-orm.cjs.map +0 -10
  85. package/dist/mjs/core/commands/command-executor.mjs +0 -109
  86. package/dist/mjs/core/commands/command-executor.mjs.map +0 -10
  87. package/dist/mjs/core/commands/content-commands.mjs +0 -821
  88. package/dist/mjs/core/commands/content-commands.mjs.map +0 -10
  89. package/dist/mjs/core/commands/metadata-commands.mjs +0 -120
  90. package/dist/mjs/core/commands/metadata-commands.mjs.map +0 -10
  91. package/dist/mjs/core/commands/named-expression-commands.mjs +0 -323
  92. package/dist/mjs/core/commands/named-expression-commands.mjs.map +0 -10
  93. package/dist/mjs/core/commands/structure-commands.mjs +0 -661
  94. package/dist/mjs/core/commands/structure-commands.mjs.map +0 -10
  95. package/dist/mjs/core/commands/style-commands.mjs +0 -189
  96. package/dist/mjs/core/commands/style-commands.mjs.map +0 -10
  97. package/dist/mjs/core/commands/table-commands.mjs +0 -459
  98. package/dist/mjs/core/commands/table-commands.mjs.map +0 -10
  99. package/dist/mjs/core/commands/types.mjs +0 -59
  100. package/dist/mjs/core/commands/types.mjs.map +0 -10
  101. package/dist/mjs/core/managers/schema-manager.mjs +0 -334
  102. package/dist/mjs/core/managers/schema-manager.mjs.map +0 -10
  103. package/dist/mjs/core/schema/cell-orm.mjs +0 -35
  104. package/dist/mjs/core/schema/cell-orm.mjs.map +0 -10
  105. package/dist/mjs/core/schema/grid-orm.mjs +0 -84
  106. package/dist/mjs/core/schema/grid-orm.mjs.map +0 -10
  107. package/dist/mjs/core/schema/schema-builder.mjs +0 -34
  108. package/dist/mjs/core/schema/schema-builder.mjs.map +0 -10
  109. package/dist/mjs/core/schema/schema-helpers.mjs +0 -160
  110. package/dist/mjs/core/schema/schema-helpers.mjs.map +0 -10
  111. package/dist/mjs/core/schema/schema.mjs +0 -51
  112. package/dist/mjs/core/schema/schema.mjs.map +0 -10
  113. package/dist/mjs/core/schema/table-orm.mjs +0 -156
  114. package/dist/mjs/core/schema/table-orm.mjs.map +0 -10
  115. package/dist/types/core/commands/command-executor.d.ts +0 -81
  116. package/dist/types/core/commands/content-commands.d.ts +0 -172
  117. package/dist/types/core/commands/metadata-commands.d.ts +0 -55
  118. package/dist/types/core/commands/named-expression-commands.d.ts +0 -130
  119. package/dist/types/core/commands/structure-commands.d.ts +0 -155
  120. package/dist/types/core/commands/style-commands.d.ts +0 -76
  121. package/dist/types/core/commands/table-commands.d.ts +0 -119
  122. package/dist/types/core/commands/types.d.ts +0 -143
  123. package/dist/types/core/managers/schema-manager.d.ts +0 -142
  124. package/dist/types/core/schema/cell-orm.d.ts +0 -33
  125. package/dist/types/core/schema/grid-orm.d.ts +0 -63
  126. package/dist/types/core/schema/schema-builder.d.ts +0 -16
  127. package/dist/types/core/schema/schema-helpers.d.ts +0 -49
  128. package/dist/types/core/schema/schema.d.ts +0 -167
  129. package/dist/types/core/schema/schema.type-test.d.ts +0 -1
  130. package/dist/types/core/schema/table-orm.d.ts +0 -46
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/core/workbook-renamer.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * Workbook renamer utility for updating cross-workbook references in formulas\n */\n\nimport { parseFormula } from \"../parser/parser.cjs\";\nimport { astToString } from \"../parser/formatter.cjs\";\nimport { transformAST } from \"./ast-traverser.cjs\";\nimport type { ASTNode } from \"../parser/ast.cjs\";\n\n/**\n * Renames workbook references in a formula string\n * @param formula The formula string (without the leading =)\n * @param oldWorkbookName The old workbook name to replace\n * @param newWorkbookName The new workbook name to use\n * @returns The updated formula string\n */\nexport function renameWorkbookInFormula(options: {\n formula: string;\n oldWorkbookName: string;\n newWorkbookName: string;\n}): string {\n const { formula, oldWorkbookName, newWorkbookName } = options;\n try {\n const ast = parseFormula(formula);\n \n const updatedAst = transformAST(ast, (node) => {\n // Handle cross-workbook references (e.g., [MyWorkbook]Sheet1!A1)\n if (node.type === \"reference\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n // Handle range references with workbook names (e.g., [MyWorkbook]Sheet1!A1:B2)\n if (node.type === \"range\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n // Handle named expressions with workbook names\n if (node.type === \"named-expression\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n // Handle structured references with workbook names (e.g., [MyWorkbook]Sheet1!Table1[Column1])\n if (node.type === \"structured-reference\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n // Handle 3D ranges with workbook names (e.g., [MyWorkbook]Sheet1:Sheet3!A1:C5)\n if (node.type === \"3d-range\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n return node;\n });\n \n return astToString(updatedAst);\n } catch (error) {\n // If parsing fails, return the original formula\n return formula;\n }\n}\n\n/**\n * Checks if a formula references a specific workbook\n * @param formula The formula string (without the leading =)\n * @param workbookName The workbook name to check for\n * @returns True if the formula references the workbook\n */\nexport function formulaReferencesWorkbook(formula: string, workbookName: string): boolean {\n try {\n const referencedWorkbooks = getReferencedWorkbookNames(formula);\n return referencedWorkbooks.includes(workbookName);\n } catch (error) {\n // If parsing fails, assume no reference\n return false;\n }\n}\n\n/**\n * Gets all workbook names referenced in a formula\n * @param formula The formula string (without the leading =)\n * @returns Array of unique workbook names referenced in the formula\n */\nexport function getReferencedWorkbookNames(formula: string): string[] {\n try {\n const ast = parseFormula(formula);\n const workbookNames = new Set<string>();\n\n transformAST(ast, (node) => {\n // Handle cross-workbook references\n if ((node.type === \"reference\" || \n node.type === \"range\" || \n node.type === \"named-expression\" || \n node.type === \"structured-reference\" ||\n node.type === \"3d-range\") && \n node.workbookName) {\n workbookNames.add(node.workbookName);\n }\n \n return node;\n });\n\n return Array.from(workbookNames);\n } catch (error) {\n // If parsing fails, return empty array\n return [];\n }\n}\n"
5
+ "/**\n * Workbook renamer utility for updating cross-workbook references in formulas\n */\n\nimport { parseFormula } from \"../parser/parser.cjs\";\nimport { astToString } from \"../parser/formatter.cjs\";\nimport { transformAST } from \"./ast-traverser.cjs\";\nimport type { ASTNode } from \"../parser/ast.cjs\";\n\n/**\n * Renames workbook references in a formula string\n * @param formula The formula string (without the leading =)\n * @param oldWorkbookName The old workbook name to replace\n * @param newWorkbookName The new workbook name to use\n * @returns The updated formula string\n */\nexport function renameWorkbookInFormula(options: {\n formula: string;\n oldWorkbookName: string;\n newWorkbookName: string;\n}): string {\n const { formula, oldWorkbookName, newWorkbookName } = options;\n try {\n const ast = parseFormula(formula);\n \n const updatedAst = transformAST(ast, (node) => {\n // Handle cross-workbook references (e.g., [MyWorkbook]Sheet1!A1)\n if (node.type === \"reference\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n // Handle range references with workbook names (e.g., [MyWorkbook]Sheet1!A1:B2)\n if (node.type === \"range\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n // Handle named expressions with workbook names\n if (node.type === \"named-expression\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n // Handle structured references with workbook names (e.g., [MyWorkbook]!Table1[Column1])\n if (node.type === \"structured-reference\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n // Handle 3D ranges with workbook names (e.g., [MyWorkbook]Sheet1:Sheet3!A1:C5)\n if (node.type === \"3d-range\" && node.workbookName === oldWorkbookName) {\n return {\n ...node,\n workbookName: newWorkbookName,\n };\n }\n \n return node;\n });\n \n return astToString(updatedAst);\n } catch (error) {\n // If parsing fails, return the original formula\n return formula;\n }\n}\n\n/**\n * Checks if a formula references a specific workbook\n * @param formula The formula string (without the leading =)\n * @param workbookName The workbook name to check for\n * @returns True if the formula references the workbook\n */\nexport function formulaReferencesWorkbook(formula: string, workbookName: string): boolean {\n try {\n const referencedWorkbooks = getReferencedWorkbookNames(formula);\n return referencedWorkbooks.includes(workbookName);\n } catch (error) {\n // If parsing fails, assume no reference\n return false;\n }\n}\n\n/**\n * Gets all workbook names referenced in a formula\n * @param formula The formula string (without the leading =)\n * @returns Array of unique workbook names referenced in the formula\n */\nexport function getReferencedWorkbookNames(formula: string): string[] {\n try {\n const ast = parseFormula(formula);\n const workbookNames = new Set<string>();\n\n transformAST(ast, (node) => {\n // Handle cross-workbook references\n if ((node.type === \"reference\" || \n node.type === \"range\" || \n node.type === \"named-expression\" || \n node.type === \"structured-reference\" ||\n node.type === \"3d-range\") && \n node.workbookName) {\n workbookNames.add(node.workbookName);\n }\n \n return node;\n });\n\n return Array.from(workbookNames);\n } catch (error) {\n // If parsing fails, return empty array\n return [];\n }\n}\n"
6
6
  ],
7
7
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAI6B,IAA7B;AAC4B,IAA5B;AAC6B,IAA7B;AAUO,SAAS,uBAAuB,CAAC,SAI7B;AAAA,EACT,QAAQ,SAAS,iBAAiB,oBAAoB;AAAA,EACtD,IAAI;AAAA,IACF,MAAM,MAAM,2BAAa,OAAO;AAAA,IAEhC,MAAM,aAAa,kCAAa,KAAK,CAAC,SAAS;AAAA,MAE7C,IAAI,KAAK,SAAS,eAAe,KAAK,iBAAiB,iBAAiB;AAAA,QACtE,OAAO;AAAA,aACF;AAAA,UACH,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MAGA,IAAI,KAAK,SAAS,WAAW,KAAK,iBAAiB,iBAAiB;AAAA,QAClE,OAAO;AAAA,aACF;AAAA,UACH,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MAGA,IAAI,KAAK,SAAS,sBAAsB,KAAK,iBAAiB,iBAAiB;AAAA,QAC7E,OAAO;AAAA,aACF;AAAA,UACH,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MAGA,IAAI,KAAK,SAAS,0BAA0B,KAAK,iBAAiB,iBAAiB;AAAA,QACjF,OAAO;AAAA,aACF;AAAA,UACH,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MAGA,IAAI,KAAK,SAAS,cAAc,KAAK,iBAAiB,iBAAiB;AAAA,QACrE,OAAO;AAAA,aACF;AAAA,UACH,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,KACR;AAAA,IAED,OAAO,6BAAY,UAAU;AAAA,IAC7B,OAAO,OAAO;AAAA,IAEd,OAAO;AAAA;AAAA;AAUJ,SAAS,yBAAyB,CAAC,SAAiB,cAA+B;AAAA,EACxF,IAAI;AAAA,IACF,MAAM,sBAAsB,2BAA2B,OAAO;AAAA,IAC9D,OAAO,oBAAoB,SAAS,YAAY;AAAA,IAChD,OAAO,OAAO;AAAA,IAEd,OAAO;AAAA;AAAA;AASJ,SAAS,0BAA0B,CAAC,SAA2B;AAAA,EACpE,IAAI;AAAA,IACF,MAAM,MAAM,2BAAa,OAAO;AAAA,IAChC,MAAM,gBAAgB,IAAI;AAAA,IAE1B,kCAAa,KAAK,CAAC,SAAS;AAAA,MAE1B,KAAK,KAAK,SAAS,eACd,KAAK,SAAS,WACd,KAAK,SAAS,sBACd,KAAK,SAAS,0BACd,KAAK,SAAS,eACf,KAAK,cAAc;AAAA,QACrB,cAAc,IAAI,KAAK,YAAY;AAAA,MACrC;AAAA,MAEA,OAAO;AAAA,KACR;AAAA,IAED,OAAO,MAAM,KAAK,aAAa;AAAA,IAC/B,OAAO,OAAO;AAAA,IAEd,OAAO,CAAC;AAAA;AAAA;",
8
8
  "debugId": "19CD3826FBA48AA364756E2164756E21",
@@ -175,6 +175,22 @@ class FormulaEvaluator {
175
175
  }
176
176
  const rowIndex = context.cellAddress.rowIndex;
177
177
  const tableStart = table.start;
178
+ const createResolvedTableRangeNode = (range) => ({
179
+ type: "range",
180
+ range,
181
+ isAbsolute: {
182
+ start: {
183
+ col: true,
184
+ row: true
185
+ },
186
+ end: {
187
+ col: true,
188
+ row: true
189
+ }
190
+ },
191
+ sheetName: table.sheetName,
192
+ workbookName: table.workbookName
193
+ });
178
194
  if (node.selector) {
179
195
  let startRow;
180
196
  let endRow;
@@ -222,21 +238,7 @@ class FormulaEvaluator {
222
238
  col: { type: "number", value: endColIndex }
223
239
  }
224
240
  };
225
- return this.evaluateRange({
226
- type: "range",
227
- range,
228
- isAbsolute: {
229
- start: {
230
- col: true,
231
- row: true
232
- },
233
- end: {
234
- col: true,
235
- row: true
236
- }
237
- },
238
- sheetName: table.sheetName
239
- }, context);
241
+ return this.evaluateRange(createResolvedTableRangeNode(range), context);
240
242
  } else {
241
243
  const range = {
242
244
  start: {
@@ -251,21 +253,7 @@ class FormulaEvaluator {
251
253
  }
252
254
  }
253
255
  };
254
- return this.evaluateRange({
255
- type: "range",
256
- range,
257
- isAbsolute: {
258
- start: {
259
- col: true,
260
- row: true
261
- },
262
- end: {
263
- col: true,
264
- row: true
265
- }
266
- },
267
- sheetName: table.sheetName
268
- }, context);
256
+ return this.evaluateRange(createResolvedTableRangeNode(range), context);
269
257
  }
270
258
  }
271
259
  if (node.cols) {
@@ -291,21 +279,7 @@ class FormulaEvaluator {
291
279
  col: { type: "number", value: endColIndex }
292
280
  }
293
281
  };
294
- return this.evaluateRange({
295
- type: "range",
296
- range,
297
- isAbsolute: {
298
- start: {
299
- col: true,
300
- row: true
301
- },
302
- end: {
303
- col: true,
304
- row: true
305
- }
306
- },
307
- sheetName: table.sheetName
308
- }, context);
282
+ return this.evaluateRange(createResolvedTableRangeNode(range), context);
309
283
  }
310
284
  return {
311
285
  type: "error",
@@ -362,7 +336,7 @@ class FormulaEvaluator {
362
336
  context2.addContextDependency("sheet");
363
337
  } else if (!node.workbookName) {
364
338
  context2.addContextDependency("workbook");
365
- } else {}
339
+ }
366
340
  const originSheetName = node.sheetName ?? context2.cellAddress.sheetName;
367
341
  const originWorkbookName = node.workbookName ?? context2.cellAddress.workbookName;
368
342
  const colIndex = node.range.start.col + spillOffset.x;
@@ -628,7 +602,7 @@ class FormulaEvaluator {
628
602
  context.addContextDependency("sheet");
629
603
  } else if (!node.workbookName) {
630
604
  context.addContextDependency("workbook");
631
- } else {}
605
+ }
632
606
  if (evalNode instanceof import_cell_value_node.CellValueNode && evalNode.spillMeta) {
633
607
  if (evalNode.spillMeta.evaluationResult.type === "spilled-values") {
634
608
  return {
@@ -837,4 +811,4 @@ class FormulaEvaluator {
837
811
  }
838
812
  }
839
813
 
840
- //# debugId=B36B15FC774F83C164756E2164756E21
814
+ //# debugId=3D1653EF8566F26E64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/evaluator/formula-evaluator.ts"],
4
4
  "sourcesContent": [
5
- "import type {\n LocalCellAddress,\n RangeAddress,\n SingleEvaluationResult,\n} from \"../core/types.cjs\";\nimport {\n FormulaError,\n type CellAddress,\n type CellValue,\n type FunctionEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"../core/types.cjs\";\nimport { parseFormula } from \"../parser/parser.cjs\";\n\nimport type { DependencyManager } from \"../core/managers/dependency-manager.cjs\";\nimport type { NamedExpressionManager } from \"../core/managers/named-expression-manager.cjs\";\nimport type { TableManager } from \"../core/managers/table-manager.cjs\";\nimport {\n captureEvaluationErrors,\n cellAddressToKey,\n getAbsoluteRange,\n getRangeIntersection,\n getRangeKey,\n getRelativeRange,\n isRangeOneCell,\n rangeAddressToKey,\n} from \"../core/utils.cjs\";\nimport {\n getNamedExpressionResourceKey,\n getSheetResourceKey,\n getTableResourceKey,\n getWorkbookResourceKey,\n} from \"../core/resource-keys.cjs\";\nimport {\n evaluateScalarOperator,\n type EvaluateScalarOperatorOptions,\n} from \"../evaluator/evaluate-scalar-operator.cjs\";\nimport { functions } from \"../functions/function-registry.cjs\";\nimport type {\n ArrayNode,\n ASTNode,\n BinaryOpNode,\n FunctionNode,\n NamedExpressionNode,\n RangeNode,\n ReferenceNode,\n StructuredReferenceNode,\n ThreeDRangeNode,\n UnaryOpNode,\n ValueNode,\n} from \"../parser/ast.cjs\";\nimport { add } from \"./arithmetic/add/add.cjs\";\nimport { divide } from \"./arithmetic/divide/divide.cjs\";\nimport { multiply } from \"./arithmetic/multiply/multiply.cjs\";\nimport { power } from \"./arithmetic/power/power.cjs\";\nimport { subtract } from \"./arithmetic/subtract/subtract.cjs\";\nimport { equals } from \"./comparison/equals.cjs\";\nimport { greaterThan } from \"./comparison/greater-than.cjs\";\nimport { greaterThanOrEqual } from \"./comparison/greater-than-or-equal.cjs\";\nimport { lessThan } from \"./comparison/less-than.cjs\";\nimport { lessThanOrEqual } from \"./comparison/less-than-or-equal.cjs\";\nimport { notEquals } from \"./comparison/not-equals.cjs\";\nimport { concatenate } from \"./concatenation/concatenate.cjs\";\nimport { CellValueNode } from \"./dependency-nodes/cell-value-node.cjs\";\nimport { EvaluationContext } from \"./evaluation-context.cjs\";\n\nexport class FormulaEvaluator {\n constructor(\n private tableManager: TableManager,\n private dependencyManager: DependencyManager,\n private namedExpressionManager: NamedExpressionManager\n ) {}\n\n // evaluator methods\n evaluateFormula(\n /**\n * formula is the formula to evaluate, without the leading =\n */\n formula: string,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const ast = parseFormula(formula);\n\n return captureEvaluationErrors(context.dependencyNode, () => {\n const result = this.evaluateNode(ast, context);\n return result;\n });\n }\n\n evaluateNode(\n node: ASTNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const currentContext = {\n ...context.cellAddress,\n tableName: context.cacheTableName,\n };\n\n const astNode = this.dependencyManager.getAstNode(node, currentContext);\n context.dependencyNode.addDependency(astNode);\n\n // if (astNode.evaluationResult.type !== \"awaiting-evaluation\") {\n // return astNode.evaluationResult;\n // }\n\n if (astNode.resolved) {\n const astContextDependency = astNode.getContextDependency();\n context.appendContextDependency(astContextDependency);\n return astNode.evaluationResult;\n }\n\n this.dependencyManager.unregisterNode(astNode);\n astNode.resetDirectDepsUpdated();\n\n function runEvaluation(\n this: FormulaEvaluator,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n switch (node.type) {\n case \"value\":\n return {\n type: \"value\",\n result: this.evaluateValue(node),\n };\n case \"infinity\":\n return {\n type: \"value\",\n result: {\n type: \"infinity\",\n sign: \"positive\",\n },\n };\n case \"binary-op\":\n return this.evaluateBinaryOp(node, context);\n\n case \"reference\":\n return this.evaluateReference(node, context);\n\n case \"named-expression\":\n return this.evaluateNamedExpression(node, context);\n\n case \"structured-reference\":\n return this.evaluateStructuredReference(node, context);\n\n case \"function\":\n return this.evaluateFunction(node, context);\n\n case \"range\":\n return this.evaluateRange(node, context);\n\n case \"unary-op\":\n return this.evaluateUnaryOp(node, context);\n\n case \"3d-range\":\n return this.evaluate3DRange(node, context);\n\n case \"array\":\n return this.evaluateArray(node, context);\n\n default:\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"WIP: unimplemented support for \" + node.type,\n errAddress: context.dependencyNode,\n };\n }\n }\n const newContext = new EvaluationContext(\n this.tableManager,\n astNode,\n context.cellAddress\n );\n const result = captureEvaluationErrors(astNode, () =>\n runEvaluation.call(this, newContext)\n );\n astNode.setEvaluationResult(result);\n const astContextDependency = newContext.getContextDependency();\n\n astNode.setContextDependency(astContextDependency);\n this.dependencyManager.registerNode(astNode);\n\n context.appendContextDependency(astContextDependency);\n\n return result;\n }\n\n evaluateStructuredReference(\n node: StructuredReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const resourceWorkbookName =\n node.workbookName ?? context.cellAddress.workbookName;\n if (node.tableName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getTableResourceKey({\n workbookName: resourceWorkbookName,\n tableName: node.tableName,\n })\n )\n );\n }\n\n // the tables are never dependent on the sheet, interesetingly enough\n let table: TableDefinition | undefined;\n if (node.tableName && node.workbookName) {\n // this expression will evaluate to the same value regardless of where in the workbooks we are evaluating it in\n table = this.tableManager\n .getTables(node.workbookName)\n .get(node.tableName);\n } else if (node.tableName) {\n // different workbooks could have different tables with the same name\n // so it can differ based on the workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n table = this.tableManager\n .getTables(context.cellAddress.workbookName)\n .get(node.tableName);\n } else {\n // If no table nor workbook name is provided, the current cell's table\n // membership determines the result.\n context.addContextDependency(\"workbook\", \"sheet\", \"table\");\n table = this.tableManager.isCellInTable(context.cellAddress);\n }\n\n if (node.isCurrentRow) {\n context.addContextDependency(\"row\");\n }\n\n if (!table) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Table ${node.tableName} not found`,\n errAddress: context.dependencyNode,\n };\n }\n\n const rowIndex = context.cellAddress.rowIndex;\n const tableStart = table.start;\n\n // Handle selector-based references\n if (node.selector) {\n let startRow: number;\n let endRow: SpreadsheetRangeEnd;\n\n switch (node.selector) {\n case \"#Headers\":\n startRow = table.start.rowIndex;\n endRow = { type: \"number\", value: table.start.rowIndex };\n break;\n case \"#Data\":\n startRow = table.start.rowIndex + 1;\n endRow = table.endRow;\n break;\n case \"#All\":\n startRow = table.start.rowIndex;\n endRow = table.endRow;\n break;\n default:\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Unknown table selector: ${node.selector}`,\n errAddress: context.dependencyNode,\n };\n }\n\n // If we also have column specification, use those columns\n if (node.cols) {\n const startCol = table.headers.get(node.cols.startCol);\n const endCol = table.headers.get(node.cols.endCol);\n if (!startCol || !endCol) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Column ${node.cols.startCol} or ${node.cols.endCol} not found in table ${table.name}`,\n errAddress: context.dependencyNode,\n };\n }\n const startColIndex = tableStart.colIndex + startCol.index;\n const endColIndex = tableStart.colIndex + endCol.index;\n\n const range: SpreadsheetRange = {\n start: {\n row: startRow,\n col: startColIndex,\n },\n end: {\n row: endRow,\n col: { type: \"number\", value: endColIndex },\n },\n };\n\n return this.evaluateRange(\n {\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n },\n context\n );\n } else {\n // No column specification, return entire row(s) for the selector\n const range: SpreadsheetRange = {\n start: {\n row: startRow,\n col: tableStart.colIndex,\n },\n end: {\n row: endRow,\n col: {\n type: \"number\",\n value: tableStart.colIndex + table.headers.size - 1,\n },\n },\n };\n\n return this.evaluateRange(\n {\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n },\n context\n );\n }\n }\n\n // Handle column-only references (no selector)\n if (node.cols) {\n const startCol = table.headers.get(node.cols.startCol);\n const endCol = table.headers.get(node.cols.endCol);\n if (!startCol || !endCol) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Column ${node.cols.startCol} or ${node.cols.endCol} not found in table ${table.name}`,\n errAddress: context.dependencyNode,\n };\n }\n const startColIndex = tableStart.colIndex + startCol.index;\n const endColIndex = tableStart.colIndex + endCol.index;\n const range: SpreadsheetRange = {\n start: {\n row: node.isCurrentRow ? rowIndex : table.start.rowIndex + 1,\n col: startColIndex,\n },\n end: {\n row: node.isCurrentRow\n ? { type: \"number\", value: rowIndex }\n : table.endRow,\n col: { type: \"number\", value: endColIndex },\n },\n };\n\n return this.evaluateRange(\n {\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n },\n context\n );\n }\n\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Structured reference must specify either a selector or columns\",\n errAddress: context.dependencyNode,\n };\n }\n\n /**\n * Evaluates a value node\n */\n evaluateValue(node: ValueNode): CellValue {\n return node.value;\n }\n\n evaluate3DRange(\n node: ThreeDRangeNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n throw new Error(\"WIP: 3d range is not implemented\");\n /*\n const startSheet = this.sheets.get(node.startSheet);\n const endSheet = this.sheets.get(node.endSheet);\n if (!startSheet || !endSheet) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Sheet ${node.startSheet} or ${node.endSheet} not found`,\n };\n }\n\n let numCols = 0;\n let numRows = 0;\n for (let i = startSheet.index; i <= endSheet.index; i++) {\n if (node.reference.type === \"reference\") {\n numCols += 1;\n } else {\n numCols += node.reference.range.end.col.value - node.reference.range.start.col.value + 1;\n }\n\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Sheet ${i} not found`,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => ({\n start: {\n col: origin.colIndex,\n row: origin.rowIndex,\n },\n end: {\n col: { type: \"number\", value: origin.colIndex },\n row: {\n type: \"number\",\n value: origin.rowIndex + numSheets - 1,\n },\n },\n }),\n source: `range`,\n originResult:\n originResult.type === \"value\"\n ? originResult.result\n : originResult.originResult,\n evaluate: (spilledCell, context) => {\n const colIndex = range.start.col + spilledCell.spillOffset.x;\n const rowIndex = range.start.row + spilledCell.spillOffset.y;\n const sheetName = node.sheetName ?? context.currentSheet;\n return this.evalTimeSafeEvaluateCell(\n {\n colIndex,\n rowIndex,\n sheetName,\n },\n context\n );\n },\n };\n */\n }\n\n evaluateRange(\n node: RangeNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n if (isRangeOneCell(node.range)) {\n return this.evaluateReference(\n {\n type: \"reference\",\n address: {\n colIndex: node.range.start.col,\n rowIndex: node.range.start.row,\n },\n isAbsolute: {\n col: node.isAbsolute.start.col || node.isAbsolute.end.col,\n row: node.isAbsolute.start.row || node.isAbsolute.end.row,\n },\n sheetName: node.sheetName,\n },\n context\n );\n }\n\n const debugRange = getRangeKey(node.range);\n\n const rangeAddress: RangeAddress = {\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n range: node.range,\n };\n\n if (node.workbookName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getWorkbookResourceKey(node.workbookName)\n )\n );\n }\n if (node.sheetName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getSheetResourceKey({\n workbookName: rangeAddress.workbookName,\n sheetName: node.sheetName,\n })\n )\n );\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin) => this.projectRange(node.range, origin),\n source: `range ${debugRange}`,\n sourceRange: rangeAddress,\n evaluate: (spillOffset, context) => {\n if (!node.sheetName && !node.workbookName) {\n // e.g. the result from A4:A9 will depend in which sheet and workbook we are evaluating it in\n context.addContextDependency(\"workbook\", \"sheet\");\n } else if (!node.sheetName) {\n // e.g. the result from [Workbook1]A4:A9 will depend in which sheet we are evaluating it in\n context.addContextDependency(\"sheet\");\n } else if (!node.workbookName) {\n // e.g. the result from Sheet1!A4:A9 will depend in which workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n } else {\n // if we have both sheetName and workbookName, we don't need to add any context dependencies\n }\n\n const originSheetName = node.sheetName ?? context.cellAddress.sheetName;\n const originWorkbookName =\n node.workbookName ?? context.cellAddress.workbookName;\n const colIndex = node.range.start.col + spillOffset.x;\n const rowIndex = node.range.start.row + spillOffset.y;\n\n const cellAddress: CellAddress = {\n colIndex,\n rowIndex,\n sheetName: originSheetName,\n workbookName: originWorkbookName,\n };\n\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(\n cellAddressToKey(cellAddress)\n );\n context.dependencyNode.addDependency(evalNode);\n\n const result = evalNode.evaluationResult;\n\n return result;\n },\n evaluateAllCells: function ({\n evaluate,\n intersection,\n context,\n origin,\n lookupOrder,\n }) {\n let range = node.range;\n if (intersection) {\n // When we have an intersection, it's defined relative to where the spilled range\n // will appear (the origin). However, we need to evaluate cells from the source\n // range (node.range). So we must translate the intersection coordinates back\n // to the source range's coordinate system.\n //\n // Example: If source range A1:C3 spills to D5:F7, and we want intersection E6:F7,\n // we need to translate E6:F7 (relative to D5) to B2:C3 (relative to A1).\n\n // Calculate the offset of the intersection from the spill origin\n const relativeRange = getRelativeRange(intersection, origin);\n const start: LocalCellAddress = {\n colIndex: node.range.start.col,\n rowIndex: node.range.start.row,\n };\n const projectedIntersection = getAbsoluteRange(relativeRange, start);\n const calculateIntersection = getRangeIntersection(\n node.range,\n projectedIntersection\n );\n if (calculateIntersection) {\n range = calculateIntersection;\n }\n }\n\n const address: RangeAddress = {\n range,\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n };\n\n const rangeNode = this.dependencyManager.getRangeNode(\n rangeAddressToKey(address)\n );\n\n context.dependencyNode.addDependency(rangeNode);\n\n return this.dependencyManager.getRangeNode(rangeAddressToKey(address))\n .result;\n },\n };\n }\n\n evaluateArray(\n node: ArrayNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const firstRow = node.elements[0];\n if (!firstRow) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const firstCell = firstRow[0];\n if (!firstCell) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const originResult = this.evaluateNode(firstCell, context);\n if (\n originResult.type === \"error\" ||\n originResult.type === \"awaiting-evaluation\"\n ) {\n return originResult;\n }\n return {\n type: \"spilled-values\",\n spillArea: (origin) => ({\n start: {\n col: origin.colIndex,\n row: origin.rowIndex,\n },\n end: {\n col: {\n type: \"number\",\n value: origin.colIndex + firstRow.length - 1,\n },\n row: {\n type: \"number\",\n value: origin.rowIndex + node.elements.length - 1,\n },\n },\n }),\n source: `array`,\n evaluate: (spillOffset, context) => {\n const row = node.elements[spillOffset.y];\n if (!row) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const cell = row[spillOffset.x];\n if (!cell) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const result = this.evaluateNode(cell, context);\n if (result.type === \"spilled-values\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Arrays cannot contain spilled values\",\n errAddress: context.dependencyNode,\n };\n }\n return result;\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for array is not implemented\");\n },\n };\n }\n\n /**\n * Evaluates a unary operation\n */\n evaluateUnaryOp(\n node: UnaryOpNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const operandResult = this.evaluateNode(node.operand, context);\n\n if (\n operandResult.type === \"error\" ||\n operandResult.type === \"awaiting-evaluation\"\n ) {\n return operandResult;\n }\n\n if (operandResult.type === \"spilled-values\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin) => operandResult.spillArea(origin),\n source: `unary ${node.operator} operation`,\n evaluate: (spilledCell, context) => {\n const spillResult = operandResult.evaluate(spilledCell, context);\n if (\n !spillResult ||\n spillResult.type === \"error\" ||\n spillResult.type === \"awaiting-evaluation\"\n ) {\n return spillResult;\n }\n if (spillResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid spilled result for unary operation\",\n errAddress: context.dependencyNode,\n };\n }\n return this.evaluateUnaryScalar(\n node.operator,\n spillResult.result,\n context\n );\n },\n evaluateAllCells: function (options) {\n const cellValues = operandResult.evaluateAllCells.call(this, options);\n if (cellValues.type !== \"values\") {\n return cellValues;\n }\n return {\n type: \"values\",\n values: cellValues.values.map((cellValue) => {\n if (\n cellValue.result.type === \"error\" ||\n cellValue.result.type === \"awaiting-evaluation\"\n ) {\n return cellValue;\n } else {\n return {\n result: this.evaluateUnaryScalar(\n node.operator,\n cellValue.result.result,\n context\n ),\n relativePos: cellValue.relativePos,\n };\n }\n }),\n };\n },\n };\n }\n\n if (operandResult.type === \"value\") {\n return this.evaluateUnaryScalar(\n node.operator,\n operandResult.result,\n context\n );\n }\n\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid operand for unary operation\",\n errAddress: context.dependencyNode,\n };\n }\n\n /**\n * Evaluates a unary scalar operation\n */\n private evaluateUnaryScalar(\n operator: \"+\" | \"-\" | \"%\",\n operand: CellValue,\n context: EvaluationContext\n ): SingleEvaluationResult {\n if (operand.type !== \"number\" && operand.type !== \"infinity\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Cannot apply unary ${operator} to non-number`,\n errAddress: context.dependencyNode,\n };\n }\n if (operand.type === \"infinity\") {\n if (operator === \"%\") {\n return {\n type: \"error\",\n err: FormulaError.NUM,\n message: \"Cannot apply % to infinity\",\n errAddress: context.dependencyNode,\n };\n }\n return {\n type: \"value\",\n result: {\n type: \"infinity\",\n sign: operator === \"+\" ? \"positive\" : \"negative\",\n },\n };\n }\n switch (operator) {\n case \"+\":\n return { type: \"value\", result: operand };\n\n case \"-\":\n return {\n type: \"value\",\n result: {\n type: \"number\",\n value: -operand.value,\n },\n };\n\n case \"%\":\n return {\n type: \"value\",\n result: { type: \"number\", value: operand.value / 100 },\n };\n\n default:\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Unknown unary operator: ${operator}`,\n errAddress: context.dependencyNode,\n };\n }\n }\n\n /**\n * Evaluates a binary operation\n */\n evaluateBinaryOp(\n node: BinaryOpNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const left = this.evaluateNode(node.left, context);\n const right = this.evaluateNode(node.right, context);\n\n if (left.type === \"error\" || left.type === \"awaiting-evaluation\") {\n return left;\n }\n if (right.type === \"error\" || right.type === \"awaiting-evaluation\") {\n return right;\n }\n\n // Scalar operation\n return this.evaluateBinaryScalar(node.operator, left, right, context);\n }\n\n /**\n * Evaluates a reference node\n */\n evaluateReference(\n node: ReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const cellAddress: CellAddress = {\n ...node.address,\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n };\n\n if (node.workbookName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getWorkbookResourceKey(node.workbookName)\n )\n );\n }\n if (node.sheetName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getSheetResourceKey({\n workbookName: cellAddress.workbookName,\n sheetName: node.sheetName,\n })\n )\n );\n }\n\n const key = cellAddressToKey(cellAddress);\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(key);\n context.dependencyNode.addDependency(evalNode);\n\n if (!node.sheetName && !node.workbookName) {\n // e.g. the result from A4:A9 will depend in which sheet and workbook we are evaluating it in\n context.addContextDependency(\"workbook\", \"sheet\");\n } else if (!node.sheetName) {\n // e.g. the result from [Workbook1]A4:A9 will depend in which sheet we are evaluating it in\n context.addContextDependency(\"sheet\");\n } else if (!node.workbookName) {\n // e.g. the result from Sheet1!A4:A9 will depend in which workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n } else {\n // if we have both sheetName and workbookName, we don't need to add any context dependencies\n }\n\n if (evalNode instanceof CellValueNode && evalNode.spillMeta) {\n if (evalNode.spillMeta.evaluationResult.type === \"spilled-values\") {\n return {\n ...evalNode.spillMeta.evaluationResult,\n sourceCell: cellAddress,\n sourceRange: undefined,\n };\n }\n }\n\n return { ...evalNode.evaluationResult, sourceCell: cellAddress };\n }\n\n /**\n * Evaluates a named expression node\n */\n evaluateNamedExpression(\n node: NamedExpressionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const resolvedExpression =\n this.namedExpressionManager.resolveNamedExpressionWithScope(\n node,\n context\n );\n\n if (!resolvedExpression) {\n return {\n type: \"error\",\n err: FormulaError.NAME,\n message: `Named expression ${node.name} not found`,\n errAddress: context.dependencyNode,\n };\n }\n\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getNamedExpressionResourceKey({\n expressionName: node.name,\n workbookName:\n resolvedExpression.scope.type === \"global\"\n ? undefined\n : resolvedExpression.scope.workbookName,\n sheetName:\n resolvedExpression.scope.type === \"sheet\"\n ? resolvedExpression.scope.sheetName\n : undefined,\n })\n )\n );\n\n return this.evaluateFormula(resolvedExpression.expression, context);\n }\n\n /**\n * Binary scalar operations\n */\n evaluateBinaryScalar(\n operator: string,\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n switch (operator) {\n case \"+\":\n return this.add(left, right, context);\n case \"-\":\n return this.subtract(left, right, context);\n case \"*\":\n return this.multiply(left, right, context);\n case \"/\":\n return this.divide(left, right, context);\n case \"^\":\n return this.power(left, right, context);\n\n case \"&\":\n return this.concatenateOp(left, right, context);\n case \"=\":\n return this.equalsOp(left, right, context);\n case \"<>\":\n return this.notEqualsOp(left, right, context);\n case \"<\":\n return this.lessThanOp(left, right, context);\n case \"<=\":\n return this.lessThanOrEqualOp(left, right, context);\n case \">\":\n return this.greaterThanOp(left, right, context);\n case \">=\":\n return this.greaterThanOrEqualOp(left, right, context);\n default:\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: `Unknown binary operator: ${operator}`,\n errAddress: context.dependencyNode,\n };\n }\n }\n\n evaluateFunction(\n node: FunctionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const func = functions[node.name];\n if (!func) {\n return {\n type: \"error\",\n err: FormulaError.NAME,\n message: `Function ${node.name} not found`,\n errAddress: context.dependencyNode,\n };\n }\n return func.evaluate.call(this, node, context);\n }\n\n // Arithmetic operations\n add(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: add,\n context,\n name: \"add\",\n });\n }\n\n multiply(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: multiply,\n context,\n name: \"multiply\",\n });\n }\n\n divide(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: divide,\n context,\n name: \"divide\",\n });\n }\n\n evaluateScalarOperator(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n options: EvaluateScalarOperatorOptions\n ): FunctionEvaluationResult {\n return evaluateScalarOperator.call(this, left, right, options);\n }\n\n subtract(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: subtract,\n context,\n name: \"subtract\",\n });\n }\n\n power(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: power,\n context,\n name: \"power\",\n });\n }\n\n // Comparison operations\n equalsOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: equals,\n context,\n name: \"equals\",\n });\n }\n\n notEqualsOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: notEquals,\n context,\n name: \"notEquals\",\n });\n }\n\n lessThanOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: lessThan,\n context,\n name: \"lessThan\",\n });\n }\n\n lessThanOrEqualOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: lessThanOrEqual,\n context,\n name: \"lessThanOrEqual\",\n });\n }\n\n greaterThanOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: greaterThan,\n context,\n name: \"greaterThan\",\n });\n }\n\n greaterThanOrEqualOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: greaterThanOrEqual,\n context,\n name: \"greaterThanOrEqual\",\n });\n }\n\n // Concatenation operation\n concatenateOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: concatenate,\n context,\n name: \"concatenate\",\n });\n }\n\n projectRange(\n range: SpreadsheetRange,\n originCellAddress: CellAddress\n ): SpreadsheetRange {\n const offsetLeft = originCellAddress.colIndex - range.start.col;\n const offsetTop = originCellAddress.rowIndex - range.start.row;\n return {\n start: {\n col: range.start.col + offsetLeft,\n row: range.start.row + offsetTop,\n },\n end: {\n col:\n range.end.col.type === \"number\"\n ? { type: \"number\", value: range.end.col.value + offsetLeft }\n : range.end.col,\n row:\n range.end.row.type === \"number\"\n ? { type: \"number\", value: range.end.row.value + offsetTop }\n : range.end.row,\n },\n };\n }\n\n unionRanges(\n range1: SpreadsheetRange,\n range2: SpreadsheetRange\n ): SpreadsheetRange {\n const endCol = ((): SpreadsheetRangeEnd => {\n if (\n range1.end.col.type === \"infinity\" ||\n range2.end.col.type === \"infinity\"\n ) {\n return { type: \"infinity\", sign: \"positive\" };\n }\n return {\n type: \"number\",\n value: Math.max(range1.end.col.value, range2.end.col.value),\n };\n })();\n\n const endRow = ((): SpreadsheetRangeEnd => {\n if (\n range1.end.row.type === \"infinity\" ||\n range2.end.row.type === \"infinity\"\n ) {\n return { type: \"infinity\", sign: \"positive\" };\n }\n return {\n type: \"number\",\n value: Math.max(range1.end.row.value, range2.end.row.value),\n };\n })();\n\n return {\n start: {\n col: Math.min(range1.start.col, range2.start.col),\n row: Math.min(range1.start.row, range2.start.row),\n },\n end: {\n col: endCol,\n row: endRow,\n },\n };\n }\n}\n"
5
+ "import type {\n LocalCellAddress,\n RangeAddress,\n SingleEvaluationResult,\n} from \"../core/types.cjs\";\nimport {\n FormulaError,\n type CellAddress,\n type CellValue,\n type FunctionEvaluationResult,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n type TableDefinition,\n} from \"../core/types.cjs\";\nimport { parseFormula } from \"../parser/parser.cjs\";\n\nimport type { DependencyManager } from \"../core/managers/dependency-manager.cjs\";\nimport type { NamedExpressionManager } from \"../core/managers/named-expression-manager.cjs\";\nimport type { TableManager } from \"../core/managers/table-manager.cjs\";\nimport {\n captureEvaluationErrors,\n cellAddressToKey,\n getAbsoluteRange,\n getRangeIntersection,\n getRangeKey,\n getRelativeRange,\n isRangeOneCell,\n rangeAddressToKey,\n} from \"../core/utils.cjs\";\nimport {\n getNamedExpressionResourceKey,\n getSheetResourceKey,\n getTableResourceKey,\n getWorkbookResourceKey,\n} from \"../core/resource-keys.cjs\";\nimport {\n evaluateScalarOperator,\n type EvaluateScalarOperatorOptions,\n} from \"../evaluator/evaluate-scalar-operator.cjs\";\nimport { functions } from \"../functions/function-registry.cjs\";\nimport type {\n ArrayNode,\n ASTNode,\n BinaryOpNode,\n FunctionNode,\n NamedExpressionNode,\n RangeNode,\n ReferenceNode,\n StructuredReferenceNode,\n ThreeDRangeNode,\n UnaryOpNode,\n ValueNode,\n} from \"../parser/ast.cjs\";\nimport { add } from \"./arithmetic/add/add.cjs\";\nimport { divide } from \"./arithmetic/divide/divide.cjs\";\nimport { multiply } from \"./arithmetic/multiply/multiply.cjs\";\nimport { power } from \"./arithmetic/power/power.cjs\";\nimport { subtract } from \"./arithmetic/subtract/subtract.cjs\";\nimport { equals } from \"./comparison/equals.cjs\";\nimport { greaterThan } from \"./comparison/greater-than.cjs\";\nimport { greaterThanOrEqual } from \"./comparison/greater-than-or-equal.cjs\";\nimport { lessThan } from \"./comparison/less-than.cjs\";\nimport { lessThanOrEqual } from \"./comparison/less-than-or-equal.cjs\";\nimport { notEquals } from \"./comparison/not-equals.cjs\";\nimport { concatenate } from \"./concatenation/concatenate.cjs\";\nimport { CellValueNode } from \"./dependency-nodes/cell-value-node.cjs\";\nimport { EvaluationContext } from \"./evaluation-context.cjs\";\n\nexport class FormulaEvaluator {\n constructor(\n private tableManager: TableManager,\n private dependencyManager: DependencyManager,\n private namedExpressionManager: NamedExpressionManager\n ) {}\n\n // evaluator methods\n evaluateFormula(\n /**\n * formula is the formula to evaluate, without the leading =\n */\n formula: string,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const ast = parseFormula(formula);\n\n return captureEvaluationErrors(context.dependencyNode, () => {\n const result = this.evaluateNode(ast, context);\n return result;\n });\n }\n\n evaluateNode(\n node: ASTNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const currentContext = {\n ...context.cellAddress,\n tableName: context.cacheTableName,\n };\n\n const astNode = this.dependencyManager.getAstNode(node, currentContext);\n context.dependencyNode.addDependency(astNode);\n\n // if (astNode.evaluationResult.type !== \"awaiting-evaluation\") {\n // return astNode.evaluationResult;\n // }\n\n if (astNode.resolved) {\n const astContextDependency = astNode.getContextDependency();\n context.appendContextDependency(astContextDependency);\n return astNode.evaluationResult;\n }\n\n this.dependencyManager.unregisterNode(astNode);\n astNode.resetDirectDepsUpdated();\n\n function runEvaluation(\n this: FormulaEvaluator,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n switch (node.type) {\n case \"value\":\n return {\n type: \"value\",\n result: this.evaluateValue(node),\n };\n case \"infinity\":\n return {\n type: \"value\",\n result: {\n type: \"infinity\",\n sign: \"positive\",\n },\n };\n case \"binary-op\":\n return this.evaluateBinaryOp(node, context);\n\n case \"reference\":\n return this.evaluateReference(node, context);\n\n case \"named-expression\":\n return this.evaluateNamedExpression(node, context);\n\n case \"structured-reference\":\n return this.evaluateStructuredReference(node, context);\n\n case \"function\":\n return this.evaluateFunction(node, context);\n\n case \"range\":\n return this.evaluateRange(node, context);\n\n case \"unary-op\":\n return this.evaluateUnaryOp(node, context);\n\n case \"3d-range\":\n return this.evaluate3DRange(node, context);\n\n case \"array\":\n return this.evaluateArray(node, context);\n\n default:\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"WIP: unimplemented support for \" + node.type,\n errAddress: context.dependencyNode,\n };\n }\n }\n const newContext = new EvaluationContext(\n this.tableManager,\n astNode,\n context.cellAddress\n );\n const result = captureEvaluationErrors(astNode, () =>\n runEvaluation.call(this, newContext)\n );\n astNode.setEvaluationResult(result);\n const astContextDependency = newContext.getContextDependency();\n\n astNode.setContextDependency(astContextDependency);\n this.dependencyManager.registerNode(astNode);\n\n context.appendContextDependency(astContextDependency);\n\n return result;\n }\n\n evaluateStructuredReference(\n node: StructuredReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const resourceWorkbookName =\n node.workbookName ?? context.cellAddress.workbookName;\n if (node.tableName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getTableResourceKey({\n workbookName: resourceWorkbookName,\n tableName: node.tableName,\n })\n )\n );\n }\n\n // the tables are never dependent on the sheet, interesetingly enough\n let table: TableDefinition | undefined;\n if (node.tableName && node.workbookName) {\n // this expression will evaluate to the same value regardless of where in the workbooks we are evaluating it in\n table = this.tableManager\n .getTables(node.workbookName)\n .get(node.tableName);\n } else if (node.tableName) {\n // different workbooks could have different tables with the same name\n // so it can differ based on the workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n table = this.tableManager\n .getTables(context.cellAddress.workbookName)\n .get(node.tableName);\n } else {\n // If no table nor workbook name is provided, the current cell's table\n // membership determines the result.\n context.addContextDependency(\"workbook\", \"sheet\", \"table\");\n table = this.tableManager.isCellInTable(context.cellAddress);\n }\n\n if (node.isCurrentRow) {\n context.addContextDependency(\"row\");\n }\n\n if (!table) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Table ${node.tableName} not found`,\n errAddress: context.dependencyNode,\n };\n }\n\n const rowIndex = context.cellAddress.rowIndex;\n const tableStart = table.start;\n const createResolvedTableRangeNode = (range: SpreadsheetRange): RangeNode => ({\n type: \"range\",\n range,\n isAbsolute: {\n start: {\n col: true,\n row: true,\n },\n end: {\n col: true,\n row: true,\n },\n },\n sheetName: table.sheetName,\n workbookName: table.workbookName,\n });\n\n // Handle selector-based references\n if (node.selector) {\n let startRow: number;\n let endRow: SpreadsheetRangeEnd;\n\n switch (node.selector) {\n case \"#Headers\":\n startRow = table.start.rowIndex;\n endRow = { type: \"number\", value: table.start.rowIndex };\n break;\n case \"#Data\":\n startRow = table.start.rowIndex + 1;\n endRow = table.endRow;\n break;\n case \"#All\":\n startRow = table.start.rowIndex;\n endRow = table.endRow;\n break;\n default:\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Unknown table selector: ${node.selector}`,\n errAddress: context.dependencyNode,\n };\n }\n\n // If we also have column specification, use those columns\n if (node.cols) {\n const startCol = table.headers.get(node.cols.startCol);\n const endCol = table.headers.get(node.cols.endCol);\n if (!startCol || !endCol) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Column ${node.cols.startCol} or ${node.cols.endCol} not found in table ${table.name}`,\n errAddress: context.dependencyNode,\n };\n }\n const startColIndex = tableStart.colIndex + startCol.index;\n const endColIndex = tableStart.colIndex + endCol.index;\n\n const range: SpreadsheetRange = {\n start: {\n row: startRow,\n col: startColIndex,\n },\n end: {\n row: endRow,\n col: { type: \"number\", value: endColIndex },\n },\n };\n\n return this.evaluateRange(\n createResolvedTableRangeNode(range),\n context\n );\n } else {\n // No column specification, return entire row(s) for the selector\n const range: SpreadsheetRange = {\n start: {\n row: startRow,\n col: tableStart.colIndex,\n },\n end: {\n row: endRow,\n col: {\n type: \"number\",\n value: tableStart.colIndex + table.headers.size - 1,\n },\n },\n };\n\n return this.evaluateRange(\n createResolvedTableRangeNode(range),\n context\n );\n }\n }\n\n // Handle column-only references (no selector)\n if (node.cols) {\n const startCol = table.headers.get(node.cols.startCol);\n const endCol = table.headers.get(node.cols.endCol);\n if (!startCol || !endCol) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Column ${node.cols.startCol} or ${node.cols.endCol} not found in table ${table.name}`,\n errAddress: context.dependencyNode,\n };\n }\n const startColIndex = tableStart.colIndex + startCol.index;\n const endColIndex = tableStart.colIndex + endCol.index;\n const range: SpreadsheetRange = {\n start: {\n row: node.isCurrentRow ? rowIndex : table.start.rowIndex + 1,\n col: startColIndex,\n },\n end: {\n row: node.isCurrentRow\n ? { type: \"number\", value: rowIndex }\n : table.endRow,\n col: { type: \"number\", value: endColIndex },\n },\n };\n\n return this.evaluateRange(\n createResolvedTableRangeNode(range),\n context\n );\n }\n\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Structured reference must specify either a selector or columns\",\n errAddress: context.dependencyNode,\n };\n }\n\n /**\n * Evaluates a value node\n */\n evaluateValue(node: ValueNode): CellValue {\n return node.value;\n }\n\n evaluate3DRange(\n node: ThreeDRangeNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n throw new Error(\"WIP: 3d range is not implemented\");\n /*\n const startSheet = this.sheets.get(node.startSheet);\n const endSheet = this.sheets.get(node.endSheet);\n if (!startSheet || !endSheet) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Sheet ${node.startSheet} or ${node.endSheet} not found`,\n };\n }\n\n let numCols = 0;\n let numRows = 0;\n for (let i = startSheet.index; i <= endSheet.index; i++) {\n if (node.reference.type === \"reference\") {\n numCols += 1;\n } else {\n numCols += node.reference.range.end.col.value - node.reference.range.start.col.value + 1;\n }\n\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `Sheet ${i} not found`,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => ({\n start: {\n col: origin.colIndex,\n row: origin.rowIndex,\n },\n end: {\n col: { type: \"number\", value: origin.colIndex },\n row: {\n type: \"number\",\n value: origin.rowIndex + numSheets - 1,\n },\n },\n }),\n source: `range`,\n originResult:\n originResult.type === \"value\"\n ? originResult.result\n : originResult.originResult,\n evaluate: (spilledCell, context) => {\n const colIndex = range.start.col + spilledCell.spillOffset.x;\n const rowIndex = range.start.row + spilledCell.spillOffset.y;\n const sheetName = node.sheetName ?? context.currentSheet;\n return this.evalTimeSafeEvaluateCell(\n {\n colIndex,\n rowIndex,\n sheetName,\n },\n context\n );\n },\n };\n */\n }\n\n evaluateRange(\n node: RangeNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n if (isRangeOneCell(node.range)) {\n return this.evaluateReference(\n {\n type: \"reference\",\n address: {\n colIndex: node.range.start.col,\n rowIndex: node.range.start.row,\n },\n isAbsolute: {\n col: node.isAbsolute.start.col || node.isAbsolute.end.col,\n row: node.isAbsolute.start.row || node.isAbsolute.end.row,\n },\n sheetName: node.sheetName,\n },\n context\n );\n }\n\n const debugRange = getRangeKey(node.range);\n\n const rangeAddress: RangeAddress = {\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n range: node.range,\n };\n\n if (node.workbookName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getWorkbookResourceKey(node.workbookName)\n )\n );\n }\n if (node.sheetName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getSheetResourceKey({\n workbookName: rangeAddress.workbookName,\n sheetName: node.sheetName,\n })\n )\n );\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin) => this.projectRange(node.range, origin),\n source: `range ${debugRange}`,\n sourceRange: rangeAddress,\n evaluate: (spillOffset, context) => {\n if (!node.sheetName && !node.workbookName) {\n // e.g. the result from A4:A9 will depend in which sheet and workbook we are evaluating it in\n context.addContextDependency(\"workbook\", \"sheet\");\n } else if (!node.sheetName) {\n // e.g. the result from [Workbook1]A4:A9 will depend in which sheet we are evaluating it in\n context.addContextDependency(\"sheet\");\n } else if (!node.workbookName) {\n // e.g. the result from Sheet1!A4:A9 will depend in which workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n } else {\n // if we have both sheetName and workbookName, we don't need to add any context dependencies\n }\n\n const originSheetName = node.sheetName ?? context.cellAddress.sheetName;\n const originWorkbookName =\n node.workbookName ?? context.cellAddress.workbookName;\n const colIndex = node.range.start.col + spillOffset.x;\n const rowIndex = node.range.start.row + spillOffset.y;\n\n const cellAddress: CellAddress = {\n colIndex,\n rowIndex,\n sheetName: originSheetName,\n workbookName: originWorkbookName,\n };\n\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(\n cellAddressToKey(cellAddress)\n );\n context.dependencyNode.addDependency(evalNode);\n\n const result = evalNode.evaluationResult;\n\n return result;\n },\n evaluateAllCells: function ({\n evaluate,\n intersection,\n context,\n origin,\n lookupOrder,\n }) {\n let range = node.range;\n if (intersection) {\n // When we have an intersection, it's defined relative to where the spilled range\n // will appear (the origin). However, we need to evaluate cells from the source\n // range (node.range). So we must translate the intersection coordinates back\n // to the source range's coordinate system.\n //\n // Example: If source range A1:C3 spills to D5:F7, and we want intersection E6:F7,\n // we need to translate E6:F7 (relative to D5) to B2:C3 (relative to A1).\n\n // Calculate the offset of the intersection from the spill origin\n const relativeRange = getRelativeRange(intersection, origin);\n const start: LocalCellAddress = {\n colIndex: node.range.start.col,\n rowIndex: node.range.start.row,\n };\n const projectedIntersection = getAbsoluteRange(relativeRange, start);\n const calculateIntersection = getRangeIntersection(\n node.range,\n projectedIntersection\n );\n if (calculateIntersection) {\n range = calculateIntersection;\n }\n }\n\n const address: RangeAddress = {\n range,\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n };\n\n const rangeNode = this.dependencyManager.getRangeNode(\n rangeAddressToKey(address)\n );\n\n context.dependencyNode.addDependency(rangeNode);\n\n return this.dependencyManager.getRangeNode(rangeAddressToKey(address))\n .result;\n },\n };\n }\n\n evaluateArray(\n node: ArrayNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const firstRow = node.elements[0];\n if (!firstRow) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const firstCell = firstRow[0];\n if (!firstCell) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const originResult = this.evaluateNode(firstCell, context);\n if (\n originResult.type === \"error\" ||\n originResult.type === \"awaiting-evaluation\"\n ) {\n return originResult;\n }\n return {\n type: \"spilled-values\",\n spillArea: (origin) => ({\n start: {\n col: origin.colIndex,\n row: origin.rowIndex,\n },\n end: {\n col: {\n type: \"number\",\n value: origin.colIndex + firstRow.length - 1,\n },\n row: {\n type: \"number\",\n value: origin.rowIndex + node.elements.length - 1,\n },\n },\n }),\n source: `array`,\n evaluate: (spillOffset, context) => {\n const row = node.elements[spillOffset.y];\n if (!row) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const cell = row[spillOffset.x];\n if (!cell) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"Array is empty\",\n errAddress: context.dependencyNode,\n };\n }\n const result = this.evaluateNode(cell, context);\n if (result.type === \"spilled-values\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Arrays cannot contain spilled values\",\n errAddress: context.dependencyNode,\n };\n }\n return result;\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for array is not implemented\");\n },\n };\n }\n\n /**\n * Evaluates a unary operation\n */\n evaluateUnaryOp(\n node: UnaryOpNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const operandResult = this.evaluateNode(node.operand, context);\n\n if (\n operandResult.type === \"error\" ||\n operandResult.type === \"awaiting-evaluation\"\n ) {\n return operandResult;\n }\n\n if (operandResult.type === \"spilled-values\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin) => operandResult.spillArea(origin),\n source: `unary ${node.operator} operation`,\n evaluate: (spilledCell, context) => {\n const spillResult = operandResult.evaluate(spilledCell, context);\n if (\n !spillResult ||\n spillResult.type === \"error\" ||\n spillResult.type === \"awaiting-evaluation\"\n ) {\n return spillResult;\n }\n if (spillResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid spilled result for unary operation\",\n errAddress: context.dependencyNode,\n };\n }\n return this.evaluateUnaryScalar(\n node.operator,\n spillResult.result,\n context\n );\n },\n evaluateAllCells: function (options) {\n const cellValues = operandResult.evaluateAllCells.call(this, options);\n if (cellValues.type !== \"values\") {\n return cellValues;\n }\n return {\n type: \"values\",\n values: cellValues.values.map((cellValue) => {\n if (\n cellValue.result.type === \"error\" ||\n cellValue.result.type === \"awaiting-evaluation\"\n ) {\n return cellValue;\n } else {\n return {\n result: this.evaluateUnaryScalar(\n node.operator,\n cellValue.result.result,\n context\n ),\n relativePos: cellValue.relativePos,\n };\n }\n }),\n };\n },\n };\n }\n\n if (operandResult.type === \"value\") {\n return this.evaluateUnaryScalar(\n node.operator,\n operandResult.result,\n context\n );\n }\n\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid operand for unary operation\",\n errAddress: context.dependencyNode,\n };\n }\n\n /**\n * Evaluates a unary scalar operation\n */\n private evaluateUnaryScalar(\n operator: \"+\" | \"-\" | \"%\",\n operand: CellValue,\n context: EvaluationContext\n ): SingleEvaluationResult {\n if (operand.type !== \"number\" && operand.type !== \"infinity\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Cannot apply unary ${operator} to non-number`,\n errAddress: context.dependencyNode,\n };\n }\n if (operand.type === \"infinity\") {\n if (operator === \"%\") {\n return {\n type: \"error\",\n err: FormulaError.NUM,\n message: \"Cannot apply % to infinity\",\n errAddress: context.dependencyNode,\n };\n }\n return {\n type: \"value\",\n result: {\n type: \"infinity\",\n sign: operator === \"+\" ? \"positive\" : \"negative\",\n },\n };\n }\n switch (operator) {\n case \"+\":\n return { type: \"value\", result: operand };\n\n case \"-\":\n return {\n type: \"value\",\n result: {\n type: \"number\",\n value: -operand.value,\n },\n };\n\n case \"%\":\n return {\n type: \"value\",\n result: { type: \"number\", value: operand.value / 100 },\n };\n\n default:\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Unknown unary operator: ${operator}`,\n errAddress: context.dependencyNode,\n };\n }\n }\n\n /**\n * Evaluates a binary operation\n */\n evaluateBinaryOp(\n node: BinaryOpNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const left = this.evaluateNode(node.left, context);\n const right = this.evaluateNode(node.right, context);\n\n if (left.type === \"error\" || left.type === \"awaiting-evaluation\") {\n return left;\n }\n if (right.type === \"error\" || right.type === \"awaiting-evaluation\") {\n return right;\n }\n\n // Scalar operation\n return this.evaluateBinaryScalar(node.operator, left, right, context);\n }\n\n /**\n * Evaluates a reference node\n */\n evaluateReference(\n node: ReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const cellAddress: CellAddress = {\n ...node.address,\n sheetName: node.sheetName ?? context.cellAddress.sheetName,\n workbookName: node.workbookName ?? context.cellAddress.workbookName,\n };\n\n if (node.workbookName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getWorkbookResourceKey(node.workbookName)\n )\n );\n }\n if (node.sheetName) {\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getSheetResourceKey({\n workbookName: cellAddress.workbookName,\n sheetName: node.sheetName,\n })\n )\n );\n }\n\n const key = cellAddressToKey(cellAddress);\n const evalNode = this.dependencyManager.getCellValueOrEmptyCellNode(key);\n context.dependencyNode.addDependency(evalNode);\n\n if (!node.sheetName && !node.workbookName) {\n // e.g. the result from A4:A9 will depend in which sheet and workbook we are evaluating it in\n context.addContextDependency(\"workbook\", \"sheet\");\n } else if (!node.sheetName) {\n // e.g. the result from [Workbook1]A4:A9 will depend in which sheet we are evaluating it in\n context.addContextDependency(\"sheet\");\n } else if (!node.workbookName) {\n // e.g. the result from Sheet1!A4:A9 will depend in which workbook we are evaluating it in\n context.addContextDependency(\"workbook\");\n } else {\n // if we have both sheetName and workbookName, we don't need to add any context dependencies\n }\n\n if (evalNode instanceof CellValueNode && evalNode.spillMeta) {\n if (evalNode.spillMeta.evaluationResult.type === \"spilled-values\") {\n return {\n ...evalNode.spillMeta.evaluationResult,\n sourceCell: cellAddress,\n sourceRange: undefined,\n };\n }\n }\n\n return { ...evalNode.evaluationResult, sourceCell: cellAddress };\n }\n\n /**\n * Evaluates a named expression node\n */\n evaluateNamedExpression(\n node: NamedExpressionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const resolvedExpression =\n this.namedExpressionManager.resolveNamedExpressionWithScope(\n node,\n context\n );\n\n if (!resolvedExpression) {\n return {\n type: \"error\",\n err: FormulaError.NAME,\n message: `Named expression ${node.name} not found`,\n errAddress: context.dependencyNode,\n };\n }\n\n context.dependencyNode.addDependency(\n this.dependencyManager.getResourceNode(\n getNamedExpressionResourceKey({\n expressionName: node.name,\n workbookName:\n resolvedExpression.scope.type === \"global\"\n ? undefined\n : resolvedExpression.scope.workbookName,\n sheetName:\n resolvedExpression.scope.type === \"sheet\"\n ? resolvedExpression.scope.sheetName\n : undefined,\n })\n )\n );\n\n return this.evaluateFormula(resolvedExpression.expression, context);\n }\n\n /**\n * Binary scalar operations\n */\n evaluateBinaryScalar(\n operator: string,\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n switch (operator) {\n case \"+\":\n return this.add(left, right, context);\n case \"-\":\n return this.subtract(left, right, context);\n case \"*\":\n return this.multiply(left, right, context);\n case \"/\":\n return this.divide(left, right, context);\n case \"^\":\n return this.power(left, right, context);\n\n case \"&\":\n return this.concatenateOp(left, right, context);\n case \"=\":\n return this.equalsOp(left, right, context);\n case \"<>\":\n return this.notEqualsOp(left, right, context);\n case \"<\":\n return this.lessThanOp(left, right, context);\n case \"<=\":\n return this.lessThanOrEqualOp(left, right, context);\n case \">\":\n return this.greaterThanOp(left, right, context);\n case \">=\":\n return this.greaterThanOrEqualOp(left, right, context);\n default:\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: `Unknown binary operator: ${operator}`,\n errAddress: context.dependencyNode,\n };\n }\n }\n\n evaluateFunction(\n node: FunctionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n const func = functions[node.name];\n if (!func) {\n return {\n type: \"error\",\n err: FormulaError.NAME,\n message: `Function ${node.name} not found`,\n errAddress: context.dependencyNode,\n };\n }\n return func.evaluate.call(this, node, context);\n }\n\n // Arithmetic operations\n add(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: add,\n context,\n name: \"add\",\n });\n }\n\n multiply(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: multiply,\n context,\n name: \"multiply\",\n });\n }\n\n divide(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: divide,\n context,\n name: \"divide\",\n });\n }\n\n evaluateScalarOperator(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n options: EvaluateScalarOperatorOptions\n ): FunctionEvaluationResult {\n return evaluateScalarOperator.call(this, left, right, options);\n }\n\n subtract(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: subtract,\n context,\n name: \"subtract\",\n });\n }\n\n power(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: power,\n context,\n name: \"power\",\n });\n }\n\n // Comparison operations\n equalsOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: equals,\n context,\n name: \"equals\",\n });\n }\n\n notEqualsOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: notEquals,\n context,\n name: \"notEquals\",\n });\n }\n\n lessThanOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: lessThan,\n context,\n name: \"lessThan\",\n });\n }\n\n lessThanOrEqualOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: lessThanOrEqual,\n context,\n name: \"lessThanOrEqual\",\n });\n }\n\n greaterThanOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: greaterThan,\n context,\n name: \"greaterThan\",\n });\n }\n\n greaterThanOrEqualOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: greaterThanOrEqual,\n context,\n name: \"greaterThanOrEqual\",\n });\n }\n\n // Concatenation operation\n concatenateOp(\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n return this.evaluateScalarOperator(left, right, {\n evaluateScalar: concatenate,\n context,\n name: \"concatenate\",\n });\n }\n\n projectRange(\n range: SpreadsheetRange,\n originCellAddress: CellAddress\n ): SpreadsheetRange {\n const offsetLeft = originCellAddress.colIndex - range.start.col;\n const offsetTop = originCellAddress.rowIndex - range.start.row;\n return {\n start: {\n col: range.start.col + offsetLeft,\n row: range.start.row + offsetTop,\n },\n end: {\n col:\n range.end.col.type === \"number\"\n ? { type: \"number\", value: range.end.col.value + offsetLeft }\n : range.end.col,\n row:\n range.end.row.type === \"number\"\n ? { type: \"number\", value: range.end.row.value + offsetTop }\n : range.end.row,\n },\n };\n }\n\n unionRanges(\n range1: SpreadsheetRange,\n range2: SpreadsheetRange\n ): SpreadsheetRange {\n const endCol = ((): SpreadsheetRangeEnd => {\n if (\n range1.end.col.type === \"infinity\" ||\n range2.end.col.type === \"infinity\"\n ) {\n return { type: \"infinity\", sign: \"positive\" };\n }\n return {\n type: \"number\",\n value: Math.max(range1.end.col.value, range2.end.col.value),\n };\n })();\n\n const endRow = ((): SpreadsheetRangeEnd => {\n if (\n range1.end.row.type === \"infinity\" ||\n range2.end.row.type === \"infinity\"\n ) {\n return { type: \"infinity\", sign: \"positive\" };\n }\n return {\n type: \"number\",\n value: Math.max(range1.end.row.value, range2.end.row.value),\n };\n })();\n\n return {\n start: {\n col: Math.min(range1.start.col, range2.start.col),\n row: Math.min(range1.start.row, range2.start.row),\n },\n end: {\n col: endCol,\n row: endRow,\n },\n };\n }\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "B36B15FC774F83C164756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "3D1653EF8566F26E64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -55,7 +55,7 @@ function performSummation(results) {
55
55
  type: "value",
56
56
  result: result.result
57
57
  };
58
- } else {}
58
+ }
59
59
  }
60
60
  }
61
61
  return {
@@ -64,4 +64,4 @@ function performSummation(results) {
64
64
  };
65
65
  }
66
66
 
67
- //# debugId=7C56A64EF8A4C19464756E2164756E21
67
+ //# debugId=32045F11E65F066364756E2164756E21
@@ -4,7 +4,7 @@
4
4
  "sourcesContent": [
5
5
  "import {\n FormulaError,\n type FunctionEvaluationResult,\n type SingleEvaluationResult,\n type CellInfinity,\n} from \"../../../core/types.cjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.cjs\";\nimport type { FormulaEvaluator } from \"../../../evaluator/formula-evaluator.cjs\";\nimport type { FunctionNode } from \"../../../parser/ast.cjs\";\n\n/**\n * Result type for processInfinity in sum functions\n */\nexport type ProcessInfinityResult<T> =\n | { type: \"infinity\"; infinity: CellInfinity }\n | { type: \"state\"; state: T };\n\n/**\n * Perform summation with error propagation\n * Used when errors should be propagated instead of skipped (e.g., SUM with direct error arguments)\n *\n * @param results - Iterator of SingleEvaluationResults to sum\n * @returns FunctionEvaluationResult with the sum, infinity, or first error encountered\n */\nexport function performSummation(\n results: Iterable<SingleEvaluationResult>\n): FunctionEvaluationResult {\n let sum = 0;\n let hasValues = false;\n\n for (const result of results) {\n if (result.type === \"value\") {\n if (result.result.type === \"number\") {\n sum += result.result.value;\n hasValues = true;\n } else if (result.result.type === \"infinity\") {\n // Infinity dominates - return immediately\n return {\n type: \"value\",\n result: result.result,\n };\n } else {\n // Non-numeric values (strings, booleans) are ignored in summation\n }\n }\n }\n\n return {\n type: \"value\",\n result: { type: \"number\", value: sum },\n };\n}\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBO,SAAS,gBAAgB,CAC9B,SAC0B;AAAA,EAC1B,IAAI,MAAM;AAAA,EACV,IAAI,YAAY;AAAA,EAEhB,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,OAAO,SAAS,SAAS;AAAA,MAC3B,IAAI,OAAO,OAAO,SAAS,UAAU;AAAA,QACnC,OAAO,OAAO,OAAO;AAAA,QACrB,YAAY;AAAA,MACd,EAAO,SAAI,OAAO,OAAO,SAAS,YAAY;AAAA,QAE5C,OAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF,EAAO;AAAA,IAGT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,EACvC;AAAA;",
8
- "debugId": "7C56A64EF8A4C19464756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBO,SAAS,gBAAgB,CAC9B,SAC0B;AAAA,EAC1B,IAAI,MAAM;AAAA,EACV,IAAI,YAAY;AAAA,EAEhB,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,OAAO,SAAS,SAAS;AAAA,MAC3B,IAAI,OAAO,OAAO,SAAS,UAAU;AAAA,QACnC,OAAO,OAAO,OAAO;AAAA,QACrB,YAAY;AAAA,MACd,EAAO,SAAI,OAAO,OAAO,SAAS,YAAY;AAAA,QAE5C,OAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IAGF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,EACvC;AAAA;",
8
+ "debugId": "32045F11E65F066364756E2164756E21",
9
9
  "names": []
10
10
  }
package/dist/cjs/lib.cjs CHANGED
@@ -57,23 +57,12 @@ var __export = (target, all) => {
57
57
  // src/lib.ts
58
58
  var exports_lib = {};
59
59
  __export(exports_lib, {
60
- defineSchema: () => import_schema.defineSchema,
61
- defineHeader: () => import_schema.defineHeader,
62
- TableOrm: () => import_table_orm.TableOrm,
63
- SchemaValidationError: () => import_schema_manager.SchemaValidationError,
64
- SchemaIntegrityError: () => import_command_executor.SchemaIntegrityError,
65
- FormulaEngine: () => import_engine.FormulaEngine,
66
- CellOrm: () => import_cell_orm.CellOrm
60
+ FormulaEngine: () => import_engine.FormulaEngine
67
61
  });
68
62
  module.exports = __toCommonJS(exports_lib);
69
63
  var import_engine = require("./core/engine.cjs");
70
64
  __reExport(exports_lib, require("./core/types.cjs"), module.exports);
71
65
  __reExport(exports_lib, require("./core/utils.cjs"), module.exports);
72
66
  __reExport(exports_lib, require("./core/utils/color-utils.cjs"), module.exports);
73
- var import_schema = require("./core/schema/schema.cjs");
74
- var import_table_orm = require("./core/schema/table-orm.cjs");
75
- var import_cell_orm = require("./core/schema/cell-orm.cjs");
76
- var import_schema_manager = require("./core/managers/schema-manager.cjs");
77
- var import_command_executor = require("./core/commands/command-executor.cjs");
78
67
 
79
- //# debugId=838957A8257084BD64756E2164756E21
68
+ //# debugId=6355AD13D59013B464756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib.ts"],
4
4
  "sourcesContent": [
5
- "export { FormulaEngine } from \"./core/engine.cjs\";\nexport * from \"./core/types.cjs\";\nexport * from \"./core/utils.cjs\";\nexport * from \"./core/utils/color-utils.cjs\";\n\n// Schema exports\nexport { defineSchema, defineHeader } from \"./core/schema/schema.cjs\";\nexport type { CreateSchema, SchemaDeclaration, Schema, TableSchemaDefinition, CellSchemaDefinition, TableOrmSchema, CellOrmSchema } from \"./core/schema/schema.cjs\";\nexport { TableOrm } from \"./core/schema/table-orm.cjs\";\nexport { CellOrm } from \"./core/schema/cell-orm.cjs\";\nexport { SchemaValidationError } from \"./core/managers/schema-manager.cjs\";\nexport type { ValidationResult } from \"./core/managers/schema-manager.cjs\";\n\n// Command Pattern exports\nexport { SchemaIntegrityError } from \"./core/commands/command-executor.cjs\";\nexport type { EngineAction, EngineCommand } from \"./core/commands/types.cjs\";\n"
5
+ "export { FormulaEngine } from \"./core/engine.cjs\";\nexport * from \"./core/types.cjs\";\nexport * from \"./core/utils.cjs\";\nexport * from \"./core/utils/color-utils.cjs\";\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA8B,IAA9B;AACA;AACA;AACA;AAG2C,IAA3C;AAEyB,IAAzB;AACwB,IAAxB;AACsC,IAAtC;AAIqC,IAArC;",
8
- "debugId": "838957A8257084BD64756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA8B,IAA9B;AACA;AACA;AACA;",
8
+ "debugId": "6355AD13D59013B464756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@ricsam/formula-engine",
3
- "version": "0.2.8",
3
+ "version": "0.2.10",
4
4
  "type": "commonjs"
5
5
  }
@@ -277,9 +277,8 @@ function formatStructuredReference(ast) {
277
277
  }
278
278
  let result = "";
279
279
  if (workbookName) {
280
- result += `[${workbookName}]`;
281
- }
282
- if (sheetName) {
280
+ result += `[${workbookName}]!`;
281
+ } else if (sheetName) {
283
282
  const quotedSheet = sheetName.includes(" ") ? `'${sheetName}'` : sheetName;
284
283
  result += `${quotedSheet}!`;
285
284
  }
@@ -326,4 +325,4 @@ function isSerializedCellValueEqual(a, b) {
326
325
  return normalizedA === normalizedB;
327
326
  }
328
327
 
329
- //# debugId=DEDFCFE61428B68064756E2164756E21
328
+ //# debugId=1755F00DD1DD7AC364756E2164756E21