@ricsam/formula-engine 0.2.9 → 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.
- package/README.md +40 -0
- package/dist/cjs/core/engine.cjs +37 -1
- package/dist/cjs/core/engine.cjs.map +3 -3
- package/dist/cjs/core/managers/dependency-manager.cjs +151 -67
- package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
- package/dist/cjs/core/managers/workbook-manager.cjs +197 -1
- package/dist/cjs/core/managers/workbook-manager.cjs.map +3 -3
- package/dist/cjs/core/types.cjs.map +2 -2
- package/dist/cjs/core/workbook-renamer.cjs.map +1 -1
- package/dist/cjs/evaluator/formula-evaluator.cjs +22 -48
- package/dist/cjs/evaluator/formula-evaluator.cjs.map +3 -3
- package/dist/cjs/functions/math/sum/summation-utils.cjs +2 -2
- package/dist/cjs/functions/math/sum/summation-utils.cjs.map +2 -2
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/parser/formatter.cjs +3 -4
- package/dist/cjs/parser/formatter.cjs.map +3 -3
- package/dist/cjs/parser/parser.cjs +24 -216
- package/dist/cjs/parser/parser.cjs.map +3 -3
- package/dist/mjs/core/engine.mjs +37 -1
- package/dist/mjs/core/engine.mjs.map +3 -3
- package/dist/mjs/core/managers/dependency-manager.mjs +151 -67
- package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
- package/dist/mjs/core/managers/workbook-manager.mjs +197 -1
- package/dist/mjs/core/managers/workbook-manager.mjs.map +3 -3
- package/dist/mjs/core/types.mjs.map +2 -2
- package/dist/mjs/core/workbook-renamer.mjs.map +1 -1
- package/dist/mjs/evaluator/formula-evaluator.mjs +22 -48
- package/dist/mjs/evaluator/formula-evaluator.mjs.map +3 -3
- package/dist/mjs/functions/math/sum/summation-utils.mjs +2 -2
- package/dist/mjs/functions/math/sum/summation-utils.mjs.map +2 -2
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/parser/formatter.mjs +3 -4
- package/dist/mjs/parser/formatter.mjs.map +3 -3
- package/dist/mjs/parser/parser.mjs +24 -216
- package/dist/mjs/parser/parser.mjs.map +3 -3
- package/dist/types/core/engine.d.ts +15 -1
- package/dist/types/core/managers/dependency-manager.d.ts +4 -0
- package/dist/types/core/managers/workbook-manager.d.ts +23 -1
- package/dist/types/core/types.d.ts +35 -0
- package/dist/types/parser/parser.d.ts +4 -6
- package/package.json +1 -1
|
@@ -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
|
-
}
|
|
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
|
-
}
|
|
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=
|
|
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": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,IARP;AAS6B,IAA7B;AAcO,IATP;AAeO,IALP;AASO,IAHP;AAI0B,IAA1B;AAcoB,IAApB;AACuB,IAAvB;AACyB,IAAzB;AACsB,IAAtB;AACyB,IAAzB;AACuB,IAAvB;AAC4B,IAA5B;AACmC,IAAnC;AACyB,IAAzB;AACgC,IAAhC;AAC0B,IAA1B;AAC4B,IAA5B;AAC8B,IAA9B;AACkC,IAAlC;AAAA;AAEO,MAAM,iBAAiB;AAAA,EAElB;AAAA,EACA;AAAA,EACA;AAAA,EAHV,WAAW,CACD,cACA,mBACA,wBACR;AAAA,IAHQ;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAIV,eAAe,CAIb,SACA,SAC0B;AAAA,IAC1B,MAAM,MAAM,2BAAa,OAAO;AAAA,IAEhC,OAAO,qCAAwB,QAAQ,gBAAgB,MAAM;AAAA,MAC3D,MAAM,SAAS,KAAK,aAAa,KAAK,OAAO;AAAA,MAC7C,OAAO;AAAA,KACR;AAAA;AAAA,EAGH,YAAY,CACV,MACA,SAC0B;AAAA,IAC1B,MAAM,iBAAiB;AAAA,SAClB,QAAQ;AAAA,MACX,WAAW,QAAQ;AAAA,IACrB;AAAA,IAEA,MAAM,UAAU,KAAK,kBAAkB,WAAW,MAAM,cAAc;AAAA,IACtE,QAAQ,eAAe,cAAc,OAAO;AAAA,IAM5C,IAAI,QAAQ,UAAU;AAAA,MACpB,MAAM,wBAAuB,QAAQ,qBAAqB;AAAA,MAC1D,QAAQ,wBAAwB,qBAAoB;AAAA,MACpD,OAAO,QAAQ;AAAA,IACjB;AAAA,IAEA,KAAK,kBAAkB,eAAe,OAAO;AAAA,IAC7C,QAAQ,uBAAuB;AAAA,IAE/B,SAAS,aAAa,CAEpB,UAC0B;AAAA,MAC1B,QAAQ,KAAK;AAAA,aACN;AAAA,UACH,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,KAAK,cAAc,IAAI;AAAA,UACjC;AAAA,aACG;AAAA,UACH,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,aACG;AAAA,UACH,OAAO,KAAK,iBAAiB,MAAM,QAAO;AAAA,aAEvC;AAAA,UACH,OAAO,KAAK,kBAAkB,MAAM,QAAO;AAAA,aAExC;AAAA,UACH,OAAO,KAAK,wBAAwB,MAAM,QAAO;AAAA,aAE9C;AAAA,UACH,OAAO,KAAK,4BAA4B,MAAM,QAAO;AAAA,aAElD;AAAA,UACH,OAAO,KAAK,iBAAiB,MAAM,QAAO;AAAA,aAEvC;AAAA,UACH,OAAO,KAAK,cAAc,MAAM,QAAO;AAAA,aAEpC;AAAA,UACH,OAAO,KAAK,gBAAgB,MAAM,QAAO;AAAA,aAEtC;AAAA,UACH,OAAO,KAAK,gBAAgB,MAAM,QAAO;AAAA,aAEtC;AAAA,UACH,OAAO,KAAK,cAAc,MAAM,QAAO;AAAA;AAAA,UAGvC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK,0BAAa;AAAA,YAClB,SAAS,oCAAoC,KAAK;AAAA,YAClD,YAAY,SAAQ;AAAA,UACtB;AAAA;AAAA;AAAA,IAGN,MAAM,aAAa,IAAI,4CACrB,KAAK,cACL,SACA,QAAQ,WACV;AAAA,IACA,MAAM,SAAS,qCAAwB,SAAS,MAC9C,cAAc,KAAK,MAAM,UAAU,CACrC;AAAA,IACA,QAAQ,oBAAoB,MAAM;AAAA,IAClC,MAAM,uBAAuB,WAAW,qBAAqB;AAAA,IAE7D,QAAQ,qBAAqB,oBAAoB;AAAA,IACjD,KAAK,kBAAkB,aAAa,OAAO;AAAA,IAE3C,QAAQ,wBAAwB,oBAAoB;AAAA,IAEpD,OAAO;AAAA;AAAA,EAGT,2BAA2B,CACzB,MACA,SAC0B;AAAA,IAC1B,MAAM,uBACJ,KAAK,gBAAgB,QAAQ,YAAY;AAAA,IAC3C,IAAI,KAAK,WAAW;AAAA,MAClB,QAAQ,eAAe,cACrB,KAAK,kBAAkB,gBACrB,yCAAoB;AAAA,QAClB,cAAc;AAAA,QACd,WAAW,KAAK;AAAA,MAClB,CAAC,CACH,CACF;AAAA,IACF;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI,KAAK,aAAa,KAAK,cAAc;AAAA,MAEvC,QAAQ,KAAK,aACV,UAAU,KAAK,YAAY,EAC3B,IAAI,KAAK,SAAS;AAAA,IACvB,EAAO,SAAI,KAAK,WAAW;AAAA,MAGzB,QAAQ,qBAAqB,UAAU;AAAA,MACvC,QAAQ,KAAK,aACV,UAAU,QAAQ,YAAY,YAAY,EAC1C,IAAI,KAAK,SAAS;AAAA,IACvB,EAAO;AAAA,MAGL,QAAQ,qBAAqB,YAAY,SAAS,OAAO;AAAA,MACzD,QAAQ,KAAK,aAAa,cAAc,QAAQ,WAAW;AAAA;AAAA,IAG7D,IAAI,KAAK,cAAc;AAAA,MACrB,QAAQ,qBAAqB,KAAK;AAAA,IACpC;AAAA,IAEA,IAAI,CAAC,OAAO;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS,SAAS,KAAK;AAAA,QACvB,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,MAAM,WAAW,QAAQ,YAAY;AAAA,IACrC,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,+BAA+B,CAAC,WAAwC;AAAA,MAC5E,MAAM;AAAA,MACN;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AAAA,QACA,KAAK;AAAA,UACH,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AAAA,MACF;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,IACtB;AAAA,IAGA,IAAI,KAAK,UAAU;AAAA,MACjB,IAAI;AAAA,MACJ,IAAI;AAAA,MAEJ,QAAQ,KAAK;AAAA,aACN;AAAA,UACH,WAAW,MAAM,MAAM;AAAA,UACvB,SAAS,EAAE,MAAM,UAAU,OAAO,MAAM,MAAM,SAAS;AAAA,UACvD;AAAA,aACG;AAAA,UACH,WAAW,MAAM,MAAM,WAAW;AAAA,UAClC,SAAS,MAAM;AAAA,UACf;AAAA,aACG;AAAA,UACH,WAAW,MAAM,MAAM;AAAA,UACvB,SAAS,MAAM;AAAA,UACf;AAAA;AAAA,UAEA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK,0BAAa;AAAA,YAClB,SAAS,2BAA2B,KAAK;AAAA,YACzC,YAAY,QAAQ;AAAA,UACtB;AAAA;AAAA,MAIJ,IAAI,KAAK,MAAM;AAAA,QACb,MAAM,WAAW,MAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ;AAAA,QACrD,MAAM,SAAS,MAAM,QAAQ,IAAI,KAAK,KAAK,MAAM;AAAA,QACjD,IAAI,CAAC,YAAY,CAAC,QAAQ;AAAA,UACxB,OAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK,0BAAa;AAAA,YAClB,SAAS,UAAU,KAAK,KAAK,eAAe,KAAK,KAAK,6BAA6B,MAAM;AAAA,YACzF,YAAY,QAAQ;AAAA,UACtB;AAAA,QACF;AAAA,QACA,MAAM,gBAAgB,WAAW,WAAW,SAAS;AAAA,QACrD,MAAM,cAAc,WAAW,WAAW,OAAO;AAAA,QAEjD,MAAM,QAA0B;AAAA,UAC9B,OAAO;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AAAA,UACA,KAAK;AAAA,YACH,KAAK;AAAA,YACL,KAAK,EAAE,MAAM,UAAU,OAAO,YAAY;AAAA,UAC5C;AAAA,QACF;AAAA,QAEA,OAAO,KAAK,cACV,6BAA6B,KAAK,GAClC,OACF;AAAA,MACF,EAAO;AAAA,QAEL,MAAM,QAA0B;AAAA,UAC9B,OAAO;AAAA,YACL,KAAK;AAAA,YACL,KAAK,WAAW;AAAA,UAClB;AAAA,UACA,KAAK;AAAA,YACH,KAAK;AAAA,YACL,KAAK;AAAA,cACH,MAAM;AAAA,cACN,OAAO,WAAW,WAAW,MAAM,QAAQ,OAAO;AAAA,YACpD;AAAA,UACF;AAAA,QACF;AAAA,QAEA,OAAO,KAAK,cACV,6BAA6B,KAAK,GAClC,OACF;AAAA;AAAA,IAEJ;AAAA,IAGA,IAAI,KAAK,MAAM;AAAA,MACb,MAAM,WAAW,MAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ;AAAA,MACrD,MAAM,SAAS,MAAM,QAAQ,IAAI,KAAK,KAAK,MAAM;AAAA,MACjD,IAAI,CAAC,YAAY,CAAC,QAAQ;AAAA,QACxB,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,0BAAa;AAAA,UAClB,SAAS,UAAU,KAAK,KAAK,eAAe,KAAK,KAAK,6BAA6B,MAAM;AAAA,UACzF,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,MACA,MAAM,gBAAgB,WAAW,WAAW,SAAS;AAAA,MACrD,MAAM,cAAc,WAAW,WAAW,OAAO;AAAA,MACjD,MAAM,QAA0B;AAAA,QAC9B,OAAO;AAAA,UACL,KAAK,KAAK,eAAe,WAAW,MAAM,MAAM,WAAW;AAAA,UAC3D,KAAK;AAAA,QACP;AAAA,QACA,KAAK;AAAA,UACH,KAAK,KAAK,eACN,EAAE,MAAM,UAAU,OAAO,SAAS,IAClC,MAAM;AAAA,UACV,KAAK,EAAE,MAAM,UAAU,OAAO,YAAY;AAAA,QAC5C;AAAA,MACF;AAAA,MAEA,OAAO,KAAK,cACV,6BAA6B,KAAK,GAClC,OACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,0BAAa;AAAA,MAClB,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACtB;AAAA;AAAA,EAMF,aAAa,CAAC,MAA4B;AAAA,IACxC,OAAO,KAAK;AAAA;AAAA,EAGd,eAAe,CACb,MACA,SAC0B;AAAA,IAC1B,MAAM,IAAI,MAAM,kCAAkC;AAAA;AAAA,EAiEpD,aAAa,CACX,MACA,SAC0B;AAAA,IAC1B,IAAI,4BAAe,KAAK,KAAK,GAAG;AAAA,MAC9B,OAAO,KAAK,kBACV;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,UAAU,KAAK,MAAM,MAAM;AAAA,UAC3B,UAAU,KAAK,MAAM,MAAM;AAAA,QAC7B;AAAA,QACA,YAAY;AAAA,UACV,KAAK,KAAK,WAAW,MAAM,OAAO,KAAK,WAAW,IAAI;AAAA,UACtD,KAAK,KAAK,WAAW,MAAM,OAAO,KAAK,WAAW,IAAI;AAAA,QACxD;AAAA,QACA,WAAW,KAAK;AAAA,MAClB,GACA,OACF;AAAA,IACF;AAAA,IAEA,MAAM,aAAa,yBAAY,KAAK,KAAK;AAAA,IAEzC,MAAM,eAA6B;AAAA,MACjC,WAAW,KAAK,aAAa,QAAQ,YAAY;AAAA,MACjD,cAAc,KAAK,gBAAgB,QAAQ,YAAY;AAAA,MACvD,OAAO,KAAK;AAAA,IACd;AAAA,IAEA,IAAI,KAAK,cAAc;AAAA,MACrB,QAAQ,eAAe,cACrB,KAAK,kBAAkB,gBACrB,4CAAuB,KAAK,YAAY,CAC1C,CACF;AAAA,IACF;AAAA,IACA,IAAI,KAAK,WAAW;AAAA,MAClB,QAAQ,eAAe,cACrB,KAAK,kBAAkB,gBACrB,yCAAoB;AAAA,QAClB,cAAc,aAAa;AAAA,QAC3B,WAAW,KAAK;AAAA,MAClB,CAAC,CACH,CACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,CAAC,WAAW,KAAK,aAAa,KAAK,OAAO,MAAM;AAAA,MAC3D,QAAQ,SAAS;AAAA,MACjB,aAAa;AAAA,MACb,UAAU,CAAC,aAAa,aAAY;AAAA,QAClC,IAAI,CAAC,KAAK,aAAa,CAAC,KAAK,cAAc;AAAA,UAEzC,SAAQ,qBAAqB,YAAY,OAAO;AAAA,QAClD,EAAO,SAAI,CAAC,KAAK,WAAW;AAAA,UAE1B,SAAQ,qBAAqB,OAAO;AAAA,QACtC,EAAO,SAAI,CAAC,KAAK,cAAc;AAAA,UAE7B,SAAQ,qBAAqB,UAAU;AAAA,QACzC;AAAA,QAIA,MAAM,kBAAkB,KAAK,aAAa,SAAQ,YAAY;AAAA,QAC9D,MAAM,qBACJ,KAAK,gBAAgB,SAAQ,YAAY;AAAA,QAC3C,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,YAAY;AAAA,QACpD,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,YAAY;AAAA,QAEpD,MAAM,cAA2B;AAAA,UAC/B;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,cAAc;AAAA,QAChB;AAAA,QAEA,MAAM,WAAW,KAAK,kBAAkB,4BACtC,8BAAiB,WAAW,CAC9B;AAAA,QACA,SAAQ,eAAe,cAAc,QAAQ;AAAA,QAE7C,MAAM,SAAS,SAAS;AAAA,QAExB,OAAO;AAAA;AAAA,MAET,kBAAkB,QAAS;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,SACC;AAAA,QACD,IAAI,QAAQ,KAAK;AAAA,QACjB,IAAI,cAAc;AAAA,UAUhB,MAAM,gBAAgB,8BAAiB,cAAc,MAAM;AAAA,UAC3D,MAAM,QAA0B;AAAA,YAC9B,UAAU,KAAK,MAAM,MAAM;AAAA,YAC3B,UAAU,KAAK,MAAM,MAAM;AAAA,UAC7B;AAAA,UACA,MAAM,wBAAwB,8BAAiB,eAAe,KAAK;AAAA,UACnE,MAAM,wBAAwB,kCAC5B,KAAK,OACL,qBACF;AAAA,UACA,IAAI,uBAAuB;AAAA,YACzB,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QAEA,MAAM,UAAwB;AAAA,UAC5B;AAAA,UACA,WAAW,KAAK,aAAa,SAAQ,YAAY;AAAA,UACjD,cAAc,KAAK,gBAAgB,SAAQ,YAAY;AAAA,QACzD;AAAA,QAEA,MAAM,YAAY,KAAK,kBAAkB,aACvC,+BAAkB,OAAO,CAC3B;AAAA,QAEA,SAAQ,eAAe,cAAc,SAAS;AAAA,QAE9C,OAAO,KAAK,kBAAkB,aAAa,+BAAkB,OAAO,CAAC,EAClE;AAAA;AAAA,IAEP;AAAA;AAAA,EAGF,aAAa,CACX,MACA,SAC0B;AAAA,IAC1B,MAAM,WAAW,KAAK,SAAS;AAAA,IAC/B,IAAI,CAAC,UAAU;AAAA,MACb,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,YAAY,SAAS;AAAA,IAC3B,IAAI,CAAC,WAAW;AAAA,MACd,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IACA,MAAM,eAAe,KAAK,aAAa,WAAW,OAAO;AAAA,IACzD,IACE,aAAa,SAAS,WACtB,aAAa,SAAS,uBACtB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,CAAC,YAAY;AAAA,QACtB,OAAO;AAAA,UACL,KAAK,OAAO;AAAA,UACZ,KAAK,OAAO;AAAA,QACd;AAAA,QACA,KAAK;AAAA,UACH,KAAK;AAAA,YACH,MAAM;AAAA,YACN,OAAO,OAAO,WAAW,SAAS,SAAS;AAAA,UAC7C;AAAA,UACA,KAAK;AAAA,YACH,MAAM;AAAA,YACN,OAAO,OAAO,WAAW,KAAK,SAAS,SAAS;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,MACR,UAAU,CAAC,aAAa,aAAY;AAAA,QAClC,MAAM,MAAM,KAAK,SAAS,YAAY;AAAA,QACtC,IAAI,CAAC,KAAK;AAAA,UACR,OAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK,0BAAa;AAAA,YAClB,SAAS;AAAA,YACT,YAAY,SAAQ;AAAA,UACtB;AAAA,QACF;AAAA,QACA,MAAM,OAAO,IAAI,YAAY;AAAA,QAC7B,IAAI,CAAC,MAAM;AAAA,UACT,OAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK,0BAAa;AAAA,YAClB,SAAS;AAAA,YACT,YAAY,SAAQ;AAAA,UACtB;AAAA,QACF;AAAA,QACA,MAAM,SAAS,KAAK,aAAa,MAAM,QAAO;AAAA,QAC9C,IAAI,OAAO,SAAS,kBAAkB;AAAA,UACpC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK,0BAAa;AAAA,YAClB,SAAS;AAAA,YACT,YAAY,SAAQ;AAAA,UACtB;AAAA,QACF;AAAA,QACA,OAAO;AAAA;AAAA,MAET,kBAAkB,CAAC,sBAAsB;AAAA,QACvC,MAAM,IAAI,MAAM,oDAAoD;AAAA;AAAA,IAExE;AAAA;AAAA,EAMF,eAAe,CACb,MACA,SAC0B;AAAA,IAC1B,MAAM,gBAAgB,KAAK,aAAa,KAAK,SAAS,OAAO;AAAA,IAE7D,IACE,cAAc,SAAS,WACvB,cAAc,SAAS,uBACvB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,cAAc,SAAS,kBAAkB;AAAA,MAC3C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,WAAW,cAAc,UAAU,MAAM;AAAA,QACrD,QAAQ,SAAS,KAAK;AAAA,QACtB,UAAU,CAAC,aAAa,aAAY;AAAA,UAClC,MAAM,cAAc,cAAc,SAAS,aAAa,QAAO;AAAA,UAC/D,IACE,CAAC,eACD,YAAY,SAAS,WACrB,YAAY,SAAS,uBACrB;AAAA,YACA,OAAO;AAAA,UACT;AAAA,UACA,IAAI,YAAY,SAAS,SAAS;AAAA,YAChC,OAAO;AAAA,cACL,MAAM;AAAA,cACN,KAAK,0BAAa;AAAA,cAClB,SAAS;AAAA,cACT,YAAY,SAAQ;AAAA,YACtB;AAAA,UACF;AAAA,UACA,OAAO,KAAK,oBACV,KAAK,UACL,YAAY,QACZ,QACF;AAAA;AAAA,QAEF,kBAAkB,QAAS,CAAC,SAAS;AAAA,UACnC,MAAM,aAAa,cAAc,iBAAiB,KAAK,MAAM,OAAO;AAAA,UACpE,IAAI,WAAW,SAAS,UAAU;AAAA,YAChC,OAAO;AAAA,UACT;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,WAAW,OAAO,IAAI,CAAC,cAAc;AAAA,cAC3C,IACE,UAAU,OAAO,SAAS,WAC1B,UAAU,OAAO,SAAS,uBAC1B;AAAA,gBACA,OAAO;AAAA,cACT,EAAO;AAAA,gBACL,OAAO;AAAA,kBACL,QAAQ,KAAK,oBACX,KAAK,UACL,UAAU,OAAO,QACjB,OACF;AAAA,kBACA,aAAa,UAAU;AAAA,gBACzB;AAAA;AAAA,aAEH;AAAA,UACH;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA,IAEA,IAAI,cAAc,SAAS,SAAS;AAAA,MAClC,OAAO,KAAK,oBACV,KAAK,UACL,cAAc,QACd,OACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,0BAAa;AAAA,MAClB,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACtB;AAAA;AAAA,EAMM,mBAAmB,CACzB,UACA,SACA,SACwB;AAAA,IACxB,IAAI,QAAQ,SAAS,YAAY,QAAQ,SAAS,YAAY;AAAA,MAC5D,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS,sBAAsB;AAAA,QAC/B,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IACA,IAAI,QAAQ,SAAS,YAAY;AAAA,MAC/B,IAAI,aAAa,KAAK;AAAA,QACpB,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,0BAAa;AAAA,UAClB,SAAS;AAAA,UACT,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,MAAM,aAAa,MAAM,aAAa;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,WACD;AAAA,QACH,OAAO,EAAE,MAAM,SAAS,QAAQ,QAAQ;AAAA,WAErC;AAAA,QACH,OAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,OAAO,CAAC,QAAQ;AAAA,UAClB;AAAA,QACF;AAAA,WAEG;AAAA,QACH,OAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,EAAE,MAAM,UAAU,OAAO,QAAQ,QAAQ,IAAI;AAAA,QACvD;AAAA;AAAA,QAGA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,0BAAa;AAAA,UAClB,SAAS,2BAA2B;AAAA,UACpC,YAAY,QAAQ;AAAA,QACtB;AAAA;AAAA;AAAA,EAON,gBAAgB,CACd,MACA,SAC0B;AAAA,IAC1B,MAAM,OAAO,KAAK,aAAa,KAAK,MAAM,OAAO;AAAA,IACjD,MAAM,QAAQ,KAAK,aAAa,KAAK,OAAO,OAAO;AAAA,IAEnD,IAAI,KAAK,SAAS,WAAW,KAAK,SAAS,uBAAuB;AAAA,MAChE,OAAO;AAAA,IACT;AAAA,IACA,IAAI,MAAM,SAAS,WAAW,MAAM,SAAS,uBAAuB;AAAA,MAClE,OAAO;AAAA,IACT;AAAA,IAGA,OAAO,KAAK,qBAAqB,KAAK,UAAU,MAAM,OAAO,OAAO;AAAA;AAAA,EAMtE,iBAAiB,CACf,MACA,SAC0B;AAAA,IAC1B,MAAM,cAA2B;AAAA,SAC5B,KAAK;AAAA,MACR,WAAW,KAAK,aAAa,QAAQ,YAAY;AAAA,MACjD,cAAc,KAAK,gBAAgB,QAAQ,YAAY;AAAA,IACzD;AAAA,IAEA,IAAI,KAAK,cAAc;AAAA,MACrB,QAAQ,eAAe,cACrB,KAAK,kBAAkB,gBACrB,4CAAuB,KAAK,YAAY,CAC1C,CACF;AAAA,IACF;AAAA,IACA,IAAI,KAAK,WAAW;AAAA,MAClB,QAAQ,eAAe,cACrB,KAAK,kBAAkB,gBACrB,yCAAoB;AAAA,QAClB,cAAc,YAAY;AAAA,QAC1B,WAAW,KAAK;AAAA,MAClB,CAAC,CACH,CACF;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,8BAAiB,WAAW;AAAA,IACxC,MAAM,WAAW,KAAK,kBAAkB,4BAA4B,GAAG;AAAA,IACvE,QAAQ,eAAe,cAAc,QAAQ;AAAA,IAE7C,IAAI,CAAC,KAAK,aAAa,CAAC,KAAK,cAAc;AAAA,MAEzC,QAAQ,qBAAqB,YAAY,OAAO;AAAA,IAClD,EAAO,SAAI,CAAC,KAAK,WAAW;AAAA,MAE1B,QAAQ,qBAAqB,OAAO;AAAA,IACtC,EAAO,SAAI,CAAC,KAAK,cAAc;AAAA,MAE7B,QAAQ,qBAAqB,UAAU;AAAA,IACzC;AAAA,IAIA,IAAI,oBAAoB,wCAAiB,SAAS,WAAW;AAAA,MAC3D,IAAI,SAAS,UAAU,iBAAiB,SAAS,kBAAkB;AAAA,QACjE,OAAO;AAAA,aACF,SAAS,UAAU;AAAA,UACtB,YAAY;AAAA,UACZ,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO,KAAK,SAAS,kBAAkB,YAAY,YAAY;AAAA;AAAA,EAMjE,uBAAuB,CACrB,MACA,SAC0B;AAAA,IAC1B,MAAM,qBACJ,KAAK,uBAAuB,gCAC1B,MACA,OACF;AAAA,IAEF,IAAI,CAAC,oBAAoB;AAAA,MACvB,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS,oBAAoB,KAAK;AAAA,QAClC,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,QAAQ,eAAe,cACrB,KAAK,kBAAkB,gBACrB,mDAA8B;AAAA,MAC5B,gBAAgB,KAAK;AAAA,MACrB,cACE,mBAAmB,MAAM,SAAS,WAC9B,YACA,mBAAmB,MAAM;AAAA,MAC/B,WACE,mBAAmB,MAAM,SAAS,UAC9B,mBAAmB,MAAM,YACzB;AAAA,IACR,CAAC,CACH,CACF;AAAA,IAEA,OAAO,KAAK,gBAAgB,mBAAmB,YAAY,OAAO;AAAA;AAAA,EAMpE,oBAAoB,CAClB,UACA,MACA,OACA,SAC0B;AAAA,IAC1B,QAAQ;AAAA,WACD;AAAA,QACH,OAAO,KAAK,IAAI,MAAM,OAAO,OAAO;AAAA,WACjC;AAAA,QACH,OAAO,KAAK,SAAS,MAAM,OAAO,OAAO;AAAA,WACtC;AAAA,QACH,OAAO,KAAK,SAAS,MAAM,OAAO,OAAO;AAAA,WACtC;AAAA,QACH,OAAO,KAAK,OAAO,MAAM,OAAO,OAAO;AAAA,WACpC;AAAA,QACH,OAAO,KAAK,MAAM,MAAM,OAAO,OAAO;AAAA,WAEnC;AAAA,QACH,OAAO,KAAK,cAAc,MAAM,OAAO,OAAO;AAAA,WAC3C;AAAA,QACH,OAAO,KAAK,SAAS,MAAM,OAAO,OAAO;AAAA,WACtC;AAAA,QACH,OAAO,KAAK,YAAY,MAAM,OAAO,OAAO;AAAA,WACzC;AAAA,QACH,OAAO,KAAK,WAAW,MAAM,OAAO,OAAO;AAAA,WACxC;AAAA,QACH,OAAO,KAAK,kBAAkB,MAAM,OAAO,OAAO;AAAA,WAC/C;AAAA,QACH,OAAO,KAAK,cAAc,MAAM,OAAO,OAAO;AAAA,WAC3C;AAAA,QACH,OAAO,KAAK,qBAAqB,MAAM,OAAO,OAAO;AAAA;AAAA,QAErD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,0BAAa;AAAA,UAClB,SAAS,4BAA4B;AAAA,UACrC,YAAY,QAAQ;AAAA,QACtB;AAAA;AAAA;AAAA,EAIN,gBAAgB,CACd,MACA,SAC0B;AAAA,IAC1B,MAAM,OAAO,mCAAU,KAAK;AAAA,IAC5B,IAAI,CAAC,MAAM;AAAA,MACT,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS,YAAY,KAAK;AAAA,QAC1B,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IACA,OAAO,KAAK,SAAS,KAAK,MAAM,MAAM,OAAO;AAAA;AAAA,EAI/C,GAAG,CACD,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,QAAQ,CACN,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,MAAM,CACJ,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,sBAAsB,CACpB,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,uDAAuB,KAAK,MAAM,MAAM,OAAO,OAAO;AAAA;AAAA,EAG/D,QAAQ,CACN,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,KAAK,CACH,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAIH,QAAQ,CACN,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,WAAW,CACT,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,UAAU,CACR,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,iBAAiB,CACf,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,aAAa,CACX,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,oBAAoB,CAClB,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAIH,aAAa,CACX,MACA,OACA,SAC0B;AAAA,IAC1B,OAAO,KAAK,uBAAuB,MAAM,OAAO;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA;AAAA,EAGH,YAAY,CACV,OACA,mBACkB;AAAA,IAClB,MAAM,aAAa,kBAAkB,WAAW,MAAM,MAAM;AAAA,IAC5D,MAAM,YAAY,kBAAkB,WAAW,MAAM,MAAM;AAAA,IAC3D,OAAO;AAAA,MACL,OAAO;AAAA,QACL,KAAK,MAAM,MAAM,MAAM;AAAA,QACvB,KAAK,MAAM,MAAM,MAAM;AAAA,MACzB;AAAA,MACA,KAAK;AAAA,QACH,KACE,MAAM,IAAI,IAAI,SAAS,WACnB,EAAE,MAAM,UAAU,OAAO,MAAM,IAAI,IAAI,QAAQ,WAAW,IAC1D,MAAM,IAAI;AAAA,QAChB,KACE,MAAM,IAAI,IAAI,SAAS,WACnB,EAAE,MAAM,UAAU,OAAO,MAAM,IAAI,IAAI,QAAQ,UAAU,IACzD,MAAM,IAAI;AAAA,MAClB;AAAA,IACF;AAAA;AAAA,EAGF,WAAW,CACT,QACA,QACkB;AAAA,IAClB,MAAM,UAAU,MAA2B;AAAA,MACzC,IACE,OAAO,IAAI,IAAI,SAAS,cACxB,OAAO,IAAI,IAAI,SAAS,YACxB;AAAA,QACA,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,MAC9C;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,KAAK,IAAI,OAAO,IAAI,IAAI,OAAO,OAAO,IAAI,IAAI,KAAK;AAAA,MAC5D;AAAA,OACC;AAAA,IAEH,MAAM,UAAU,MAA2B;AAAA,MACzC,IACE,OAAO,IAAI,IAAI,SAAS,cACxB,OAAO,IAAI,IAAI,SAAS,YACxB;AAAA,QACA,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,MAC9C;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,KAAK,IAAI,OAAO,IAAI,IAAI,OAAO,OAAO,IAAI,IAAI,KAAK;AAAA,MAC5D;AAAA,OACC;AAAA,IAEH,OAAO;AAAA,MACL,OAAO;AAAA,QACL,KAAK,KAAK,IAAI,OAAO,MAAM,KAAK,OAAO,MAAM,GAAG;AAAA,QAChD,KAAK,KAAK,IAAI,OAAO,MAAM,KAAK,OAAO,MAAM,GAAG;AAAA,MAClD;AAAA,MACA,KAAK;AAAA,QACH,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF;AAAA;AAEJ;",
|
|
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
|
-
}
|
|
58
|
+
}
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
return {
|
|
@@ -64,4 +64,4 @@ function performSummation(results) {
|
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
//# debugId=
|
|
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
|
|
8
|
-
"debugId": "
|
|
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/package.json
CHANGED
|
@@ -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=
|
|
328
|
+
//# debugId=1755F00DD1DD7AC364756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/parser/formatter.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { indexToColumn } from \"../core/utils.cjs\";\nimport { type CellValue, type SerializedCellValue } from \"../core/types.cjs\";\nimport { parseOpenEndedRange, parseInfiniteRange } from \"./grammar.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 \"./ast.cjs\";\nimport { getOperatorPrecedence, getOperatorAssociativity } from \"./grammar.cjs\";\nimport { parseFormula } from \"./parser.cjs\";\n\nexport function astToString(ast: ASTNode): string {\n switch (ast.type) {\n case \"value\":\n return formatValue(ast.value);\n\n case \"reference\":\n return formatReference(ast);\n\n case \"range\":\n return formatRange(ast);\n\n case \"function\":\n return formatFunction(ast);\n\n case \"unary-op\":\n return formatUnaryOp(ast);\n\n case \"binary-op\":\n return formatBinaryOp(ast);\n\n case \"array\":\n return formatArray(ast);\n\n case \"named-expression\":\n return formatNamedExpression(ast);\n\n case \"error\":\n return ast.error;\n\n case \"empty\":\n return \"\";\n\n case \"3d-range\":\n return formatThreeDRange(ast);\n\n case \"structured-reference\":\n return formatStructuredReference(ast);\n\n case \"infinity\":\n return \"INFINITY\";\n\n default:\n throw new Error(`Unknown AST node type: ${(ast as any).type}`);\n }\n}\n\nfunction formatValue(value: CellValue): string {\n if (value.type === \"string\") {\n // Escape quotes by doubling them and wrap in quotes\n return `\"${value.value.replace(/\"/g, '\"\"')}\"`;\n } else if (value.type === \"boolean\") {\n return value.value ? \"TRUE\" : \"FALSE\";\n } else if (value.type === \"number\") {\n return value.value.toString();\n }\n return String(value);\n}\n\nfunction formatReference(ast: ReferenceNode): string {\n const { address, isAbsolute, sheetName, workbookName } = ast;\n const colLetter = indexToColumn(address.colIndex);\n const rowNumber = address.rowIndex + 1; // Convert from 0-based to 1-based\n\n const colRef = isAbsolute.col ? `$${colLetter}` : colLetter;\n const rowRef = isAbsolute.row ? `$${rowNumber}` : rowNumber.toString();\n\n const cellRef = `${colRef}${rowRef}`;\n\n let result = cellRef;\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${cellRef}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatRange(ast: RangeNode): string {\n const { range, isAbsolute, sheetName, workbookName } = ast;\n\n // Handle infinite ranges\n if (range.end.col.type === \"infinity\" || range.end.row.type === \"infinity\") {\n return formatInfiniteRange(ast);\n }\n\n // Regular range\n const startCol = indexToColumn(range.start.col);\n const startRow = range.start.row + 1;\n const endCol = indexToColumn(range.end.col.value);\n const endRow = range.end.row.value + 1;\n\n const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;\n const startRowRef = isAbsolute.start.row\n ? `$${startRow}`\n : startRow.toString();\n const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;\n const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();\n\n const rangeRef = `${startColRef}${startRowRef}:${endColRef}${endRowRef}`;\n\n let result = rangeRef;\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${rangeRef}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatInfiniteRange(ast: RangeNode): string {\n const { range, isAbsolute, sheetName, workbookName } = ast;\n\n let rangeRef: string;\n\n // Canonical formatting rules:\n // 1. Start is always explicit cell (A5, $A$5, etc.)\n // 2. End varies by openness:\n // - Open→: A5:10 (row-bounded)\n // - Open↓: A5:D (column-bounded)\n // - Open both: A5:INFINITY\n // 3. Excel compatibility: whole rows/columns use canonical cell form\n // - 5:5 → A5:5, A:A → A1:A\n\n const startCol = indexToColumn(range.start.col);\n const startRow = range.start.row + 1;\n\n const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;\n const startRowRef = isAbsolute.start.row\n ? `$${startRow}`\n : startRow.toString();\n\n if (range.end.col.type === \"infinity\" && range.end.row.type === \"infinity\") {\n // Open both: A5:INFINITY\n rangeRef = `${startColRef}${startRowRef}:INFINITY`;\n } else if (range.end.col.type === \"infinity\") {\n // Open→ (row-bounded): A5:10\n if (range.end.row.type !== \"number\") {\n throw new Error(\"Expected finite row for infinite column range\");\n }\n\n const endRow = range.end.row.value + 1;\n const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();\n\n // Always use canonical cell form: A5:10 (not 5:10)\n rangeRef = `${startColRef}${startRowRef}:${endRowRef}`;\n } else if (range.end.row.type === \"infinity\") {\n // Open↓ (column-bounded): A5:D\n if (range.end.col.type !== \"number\") {\n throw new Error(\"Expected finite column for infinite row range\");\n }\n\n const endCol = indexToColumn(range.end.col.value);\n const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;\n\n // Always use canonical cell form: A1:D (not A:D)\n rangeRef = `${startColRef}${startRowRef}:${endColRef}`;\n } else {\n throw new Error(\n \"Expected at least one infinite dimension for infinite range\"\n );\n }\n\n let result = rangeRef;\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${rangeRef}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatFunction(ast: FunctionNode): string {\n const { name, args } = ast;\n const formattedArgs = args.map((arg: ASTNode) => astToString(arg)).join(\",\");\n return `${name}(${formattedArgs})`;\n}\n\nfunction formatUnaryOp(ast: UnaryOpNode): string {\n const { operator, operand } = ast;\n const operandStr = astToString(operand);\n\n if (operator === \"%\") {\n return `${operandStr}%`;\n } else {\n return `${operator}${operandStr}`;\n }\n}\n\nfunction formatBinaryOp(ast: BinaryOpNode): string {\n const { operator, left, right } = ast;\n\n // Determine if we need parentheses for left and right operands\n const leftNeedsParens = needsParentheses(left, ast, \"left\");\n const rightNeedsParens = needsParentheses(right, ast, \"right\");\n\n const leftStr = leftNeedsParens\n ? `(${astToString(left)})`\n : astToString(left);\n const rightStr = rightNeedsParens\n ? `(${astToString(right)})`\n : astToString(right);\n\n return `${leftStr}${operator}${rightStr}`;\n}\n\nfunction needsParentheses(\n child: ASTNode,\n parent: ASTNode,\n position: \"left\" | \"right\"\n): boolean {\n if (child.type !== \"binary-op\") {\n return false;\n }\n\n // Only binary operations need precedence checking\n if (parent.type !== \"binary-op\") {\n return false;\n }\n\n const childPrecedence = getOperatorPrecedence(child.operator);\n const parentPrecedence = getOperatorPrecedence(parent.operator);\n\n // Lower precedence always needs parentheses\n if (childPrecedence < parentPrecedence) {\n return true;\n }\n\n // For same precedence, check associativity\n if (childPrecedence === parentPrecedence) {\n const associativity = getOperatorAssociativity(parent.operator);\n\n // For left-associative operators, right side needs parentheses\n // For right-associative operators, left side needs parentheses\n if (associativity === \"left\" && position === \"right\") {\n return true;\n } else if (associativity === \"right\" && position === \"left\") {\n return true;\n }\n }\n\n return false;\n}\n\nfunction formatArray(ast: ArrayNode): string {\n const { elements } = ast;\n const rows = elements.map((row: ASTNode[]) =>\n row.map((cell: ASTNode) => astToString(cell)).join(\",\")\n );\n return `{${rows.join(\";\")}}`;\n}\n\nfunction formatNamedExpression(ast: NamedExpressionNode): string {\n const { name, sheetName, workbookName } = ast;\n\n let result = name;\n\n if (sheetName !== undefined) {\n // Sheet-scoped named expression\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${name}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatThreeDRange(ast: ThreeDRangeNode): string {\n const { startSheet, endSheet, workbookName, reference } = ast;\n const refStr = astToString(reference);\n\n // Remove sheet name and workbook name from reference if present (since we're adding the 3D range prefix)\n let cleanRef = refStr;\n if (cleanRef.includes(\"!\")) {\n cleanRef = cleanRef.split(\"!\")[1]!;\n }\n // Remove workbook prefix if present\n if (cleanRef.startsWith(\"[\") && cleanRef.includes(\"]\")) {\n const bracketEnd = cleanRef.indexOf(\"]\");\n cleanRef = cleanRef.substring(bracketEnd + 1);\n }\n\n const quotedStartSheet = startSheet.includes(\" \")\n ? `'${startSheet}'`\n : startSheet;\n const quotedEndSheet = endSheet.includes(\" \") ? `'${endSheet}'` : endSheet;\n\n let result = `${quotedStartSheet}:${quotedEndSheet}!${cleanRef}`;\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\n/**\n * Check if a column name contains special characters that require double bracket syntax\n */\nfunction needsColumnBrackets(columnName: string): boolean {\n // Column names need extra brackets if they contain spaces or special characters\n // Note: Colons are NOT included here since they can be part of column names\n // Column ranges must use explicit double-bracket syntax: [[Col1]:[Col2]]\n return /[\\s\\[\\]#@,=/]/.test(columnName);\n}\n\nfunction formatStructuredReference(ast: StructuredReferenceNode): string {\n const { tableName, sheetName, workbookName, cols, selector, isCurrentRow } =\n ast;\n\n if (!tableName && isCurrentRow) {\n // Current row reference like [@Column] or @Column\n if (cols && cols.startCol) {\n return `[@${cols.startCol}]`;\n }\n return \"@\";\n }\n\n if (!tableName && !isCurrentRow) {\n // Bare column reference like [Column] or [#Data]\n if (selector) {\n return `[${selector}]`;\n } else if (cols) {\n const startNeedsBrackets = needsColumnBrackets(cols.startCol);\n\n if (cols.startCol === cols.endCol) {\n // Single column\n if (startNeedsBrackets) {\n return `[[${cols.startCol}]]`;\n } else {\n return `[${cols.startCol}]`;\n }\n } else {\n // Column range - always use double-bracket syntax to avoid ambiguity\n // with column names that contain colons\n return `[[${cols.startCol}]:[${cols.endCol}]]`;\n }\n }\n return \"[]\"; // Empty bare reference (shouldn't happen)\n }\n\n let result = \"\";\n\n if (workbookName) {\n result += `[${workbookName}]`;\n }\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result += `${quotedSheet}!`;\n }\n\n result += tableName;\n\n if (selector && cols) {\n // Complex syntax like Table1[[#Headers],[Column1]] or Table1[[#Headers],[Col1]:[Col2]]\n const colRef =\n cols.startCol === cols.endCol\n ? `[${cols.startCol}]` // Single column: [Column]\n : `[${cols.startCol}]:[${cols.endCol}]`; // Range: [Col1]:[Col2]\n result += `[[${selector}],${colRef}]`;\n } else if (selector) {\n // Simple selector like Table1[#Data]\n result += `[${selector}]`;\n } else if (cols) {\n const startNeedsBrackets = needsColumnBrackets(cols.startCol);\n const endNeedsBrackets =\n cols.startCol !== cols.endCol && needsColumnBrackets(cols.endCol);\n const anyNeedsBrackets = startNeedsBrackets || endNeedsBrackets;\n\n if (isCurrentRow) {\n // Current row references\n if (cols.startCol === cols.endCol) {\n // Single column - always use simple format [@ColumnName]\n // No need for double brackets even if column name has spaces\n result += `[@${cols.startCol}]`;\n } else {\n // Column range - always use double-bracket syntax to avoid ambiguity\n // with column names that contain colons\n result += `[@[${cols.startCol}]:[${cols.endCol}]]`;\n }\n } else {\n // Regular column references\n if (cols.startCol === cols.endCol) {\n // Single column - always use single brackets for table references\n result += `[${cols.startCol}]`;\n } else {\n // Column range - always use double-bracket syntax to avoid ambiguity\n // with column names that contain colons\n result += `[[${cols.startCol}]:[${cols.endCol}]]`;\n }\n }\n }\n\n return result;\n}\n\nexport function formatFormula(formula: string): string {\n return astToString(parseFormula(formula));\n}\n\nexport function normalizeSerializedCellValue(\n value: SerializedCellValue\n): SerializedCellValue {\n if (value === undefined || (typeof value === \"string\" && value === \"\"))\n return \"\";\n\n if (typeof value === \"string\" && value.startsWith(\"=\")) {\n return `=${formatFormula(value.slice(1))}`;\n }\n\n return value;\n}\n\nexport function isSerializedCellValueEqual(\n a: SerializedCellValue,\n b: SerializedCellValue\n): boolean {\n const normalizedA = normalizeSerializedCellValue(a);\n const normalizedB = normalizeSerializedCellValue(b);\n\n return normalizedA === normalizedB;\n}\n"
|
|
5
|
+
"import { indexToColumn } from \"../core/utils.cjs\";\nimport { type CellValue, type SerializedCellValue } from \"../core/types.cjs\";\nimport { parseOpenEndedRange, parseInfiniteRange } from \"./grammar.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 \"./ast.cjs\";\nimport { getOperatorPrecedence, getOperatorAssociativity } from \"./grammar.cjs\";\nimport { parseFormula } from \"./parser.cjs\";\n\nexport function astToString(ast: ASTNode): string {\n switch (ast.type) {\n case \"value\":\n return formatValue(ast.value);\n\n case \"reference\":\n return formatReference(ast);\n\n case \"range\":\n return formatRange(ast);\n\n case \"function\":\n return formatFunction(ast);\n\n case \"unary-op\":\n return formatUnaryOp(ast);\n\n case \"binary-op\":\n return formatBinaryOp(ast);\n\n case \"array\":\n return formatArray(ast);\n\n case \"named-expression\":\n return formatNamedExpression(ast);\n\n case \"error\":\n return ast.error;\n\n case \"empty\":\n return \"\";\n\n case \"3d-range\":\n return formatThreeDRange(ast);\n\n case \"structured-reference\":\n return formatStructuredReference(ast);\n\n case \"infinity\":\n return \"INFINITY\";\n\n default:\n throw new Error(`Unknown AST node type: ${(ast as any).type}`);\n }\n}\n\nfunction formatValue(value: CellValue): string {\n if (value.type === \"string\") {\n // Escape quotes by doubling them and wrap in quotes\n return `\"${value.value.replace(/\"/g, '\"\"')}\"`;\n } else if (value.type === \"boolean\") {\n return value.value ? \"TRUE\" : \"FALSE\";\n } else if (value.type === \"number\") {\n return value.value.toString();\n }\n return String(value);\n}\n\nfunction formatReference(ast: ReferenceNode): string {\n const { address, isAbsolute, sheetName, workbookName } = ast;\n const colLetter = indexToColumn(address.colIndex);\n const rowNumber = address.rowIndex + 1; // Convert from 0-based to 1-based\n\n const colRef = isAbsolute.col ? `$${colLetter}` : colLetter;\n const rowRef = isAbsolute.row ? `$${rowNumber}` : rowNumber.toString();\n\n const cellRef = `${colRef}${rowRef}`;\n\n let result = cellRef;\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${cellRef}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatRange(ast: RangeNode): string {\n const { range, isAbsolute, sheetName, workbookName } = ast;\n\n // Handle infinite ranges\n if (range.end.col.type === \"infinity\" || range.end.row.type === \"infinity\") {\n return formatInfiniteRange(ast);\n }\n\n // Regular range\n const startCol = indexToColumn(range.start.col);\n const startRow = range.start.row + 1;\n const endCol = indexToColumn(range.end.col.value);\n const endRow = range.end.row.value + 1;\n\n const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;\n const startRowRef = isAbsolute.start.row\n ? `$${startRow}`\n : startRow.toString();\n const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;\n const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();\n\n const rangeRef = `${startColRef}${startRowRef}:${endColRef}${endRowRef}`;\n\n let result = rangeRef;\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${rangeRef}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatInfiniteRange(ast: RangeNode): string {\n const { range, isAbsolute, sheetName, workbookName } = ast;\n\n let rangeRef: string;\n\n // Canonical formatting rules:\n // 1. Start is always explicit cell (A5, $A$5, etc.)\n // 2. End varies by openness:\n // - Open→: A5:10 (row-bounded)\n // - Open↓: A5:D (column-bounded)\n // - Open both: A5:INFINITY\n // 3. Excel compatibility: whole rows/columns use canonical cell form\n // - 5:5 → A5:5, A:A → A1:A\n\n const startCol = indexToColumn(range.start.col);\n const startRow = range.start.row + 1;\n\n const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;\n const startRowRef = isAbsolute.start.row\n ? `$${startRow}`\n : startRow.toString();\n\n if (range.end.col.type === \"infinity\" && range.end.row.type === \"infinity\") {\n // Open both: A5:INFINITY\n rangeRef = `${startColRef}${startRowRef}:INFINITY`;\n } else if (range.end.col.type === \"infinity\") {\n // Open→ (row-bounded): A5:10\n if (range.end.row.type !== \"number\") {\n throw new Error(\"Expected finite row for infinite column range\");\n }\n\n const endRow = range.end.row.value + 1;\n const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();\n\n // Always use canonical cell form: A5:10 (not 5:10)\n rangeRef = `${startColRef}${startRowRef}:${endRowRef}`;\n } else if (range.end.row.type === \"infinity\") {\n // Open↓ (column-bounded): A5:D\n if (range.end.col.type !== \"number\") {\n throw new Error(\"Expected finite column for infinite row range\");\n }\n\n const endCol = indexToColumn(range.end.col.value);\n const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;\n\n // Always use canonical cell form: A1:D (not A:D)\n rangeRef = `${startColRef}${startRowRef}:${endColRef}`;\n } else {\n throw new Error(\n \"Expected at least one infinite dimension for infinite range\"\n );\n }\n\n let result = rangeRef;\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${rangeRef}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatFunction(ast: FunctionNode): string {\n const { name, args } = ast;\n const formattedArgs = args.map((arg: ASTNode) => astToString(arg)).join(\",\");\n return `${name}(${formattedArgs})`;\n}\n\nfunction formatUnaryOp(ast: UnaryOpNode): string {\n const { operator, operand } = ast;\n const operandStr = astToString(operand);\n\n if (operator === \"%\") {\n return `${operandStr}%`;\n } else {\n return `${operator}${operandStr}`;\n }\n}\n\nfunction formatBinaryOp(ast: BinaryOpNode): string {\n const { operator, left, right } = ast;\n\n // Determine if we need parentheses for left and right operands\n const leftNeedsParens = needsParentheses(left, ast, \"left\");\n const rightNeedsParens = needsParentheses(right, ast, \"right\");\n\n const leftStr = leftNeedsParens\n ? `(${astToString(left)})`\n : astToString(left);\n const rightStr = rightNeedsParens\n ? `(${astToString(right)})`\n : astToString(right);\n\n return `${leftStr}${operator}${rightStr}`;\n}\n\nfunction needsParentheses(\n child: ASTNode,\n parent: ASTNode,\n position: \"left\" | \"right\"\n): boolean {\n if (child.type !== \"binary-op\") {\n return false;\n }\n\n // Only binary operations need precedence checking\n if (parent.type !== \"binary-op\") {\n return false;\n }\n\n const childPrecedence = getOperatorPrecedence(child.operator);\n const parentPrecedence = getOperatorPrecedence(parent.operator);\n\n // Lower precedence always needs parentheses\n if (childPrecedence < parentPrecedence) {\n return true;\n }\n\n // For same precedence, check associativity\n if (childPrecedence === parentPrecedence) {\n const associativity = getOperatorAssociativity(parent.operator);\n\n // For left-associative operators, right side needs parentheses\n // For right-associative operators, left side needs parentheses\n if (associativity === \"left\" && position === \"right\") {\n return true;\n } else if (associativity === \"right\" && position === \"left\") {\n return true;\n }\n }\n\n return false;\n}\n\nfunction formatArray(ast: ArrayNode): string {\n const { elements } = ast;\n const rows = elements.map((row: ASTNode[]) =>\n row.map((cell: ASTNode) => astToString(cell)).join(\",\")\n );\n return `{${rows.join(\";\")}}`;\n}\n\nfunction formatNamedExpression(ast: NamedExpressionNode): string {\n const { name, sheetName, workbookName } = ast;\n\n let result = name;\n\n if (sheetName !== undefined) {\n // Sheet-scoped named expression\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${name}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatThreeDRange(ast: ThreeDRangeNode): string {\n const { startSheet, endSheet, workbookName, reference } = ast;\n const refStr = astToString(reference);\n\n // Remove sheet name and workbook name from reference if present (since we're adding the 3D range prefix)\n let cleanRef = refStr;\n if (cleanRef.includes(\"!\")) {\n cleanRef = cleanRef.split(\"!\")[1]!;\n }\n // Remove workbook prefix if present\n if (cleanRef.startsWith(\"[\") && cleanRef.includes(\"]\")) {\n const bracketEnd = cleanRef.indexOf(\"]\");\n cleanRef = cleanRef.substring(bracketEnd + 1);\n }\n\n const quotedStartSheet = startSheet.includes(\" \")\n ? `'${startSheet}'`\n : startSheet;\n const quotedEndSheet = endSheet.includes(\" \") ? `'${endSheet}'` : endSheet;\n\n let result = `${quotedStartSheet}:${quotedEndSheet}!${cleanRef}`;\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\n/**\n * Check if a column name contains special characters that require double bracket syntax\n */\nfunction needsColumnBrackets(columnName: string): boolean {\n // Column names need extra brackets if they contain spaces or special characters\n // Note: Colons are NOT included here since they can be part of column names\n // Column ranges must use explicit double-bracket syntax: [[Col1]:[Col2]]\n return /[\\s\\[\\]#@,=/]/.test(columnName);\n}\n\nfunction formatStructuredReference(ast: StructuredReferenceNode): string {\n const { tableName, sheetName, workbookName, cols, selector, isCurrentRow } =\n ast;\n\n if (!tableName && isCurrentRow) {\n // Current row reference like [@Column] or @Column\n if (cols && cols.startCol) {\n return `[@${cols.startCol}]`;\n }\n return \"@\";\n }\n\n if (!tableName && !isCurrentRow) {\n // Bare column reference like [Column] or [#Data]\n if (selector) {\n return `[${selector}]`;\n } else if (cols) {\n const startNeedsBrackets = needsColumnBrackets(cols.startCol);\n\n if (cols.startCol === cols.endCol) {\n // Single column\n if (startNeedsBrackets) {\n return `[[${cols.startCol}]]`;\n } else {\n return `[${cols.startCol}]`;\n }\n } else {\n // Column range - always use double-bracket syntax to avoid ambiguity\n // with column names that contain colons\n return `[[${cols.startCol}]:[${cols.endCol}]]`;\n }\n }\n return \"[]\"; // Empty bare reference (shouldn't happen)\n }\n\n let result = \"\";\n\n if (workbookName) {\n result += `[${workbookName}]!`;\n } else if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result += `${quotedSheet}!`;\n }\n\n result += tableName;\n\n if (selector && cols) {\n // Complex syntax like Table1[[#Headers],[Column1]] or Table1[[#Headers],[Col1]:[Col2]]\n const colRef =\n cols.startCol === cols.endCol\n ? `[${cols.startCol}]` // Single column: [Column]\n : `[${cols.startCol}]:[${cols.endCol}]`; // Range: [Col1]:[Col2]\n result += `[[${selector}],${colRef}]`;\n } else if (selector) {\n // Simple selector like Table1[#Data]\n result += `[${selector}]`;\n } else if (cols) {\n const startNeedsBrackets = needsColumnBrackets(cols.startCol);\n const endNeedsBrackets =\n cols.startCol !== cols.endCol && needsColumnBrackets(cols.endCol);\n const anyNeedsBrackets = startNeedsBrackets || endNeedsBrackets;\n\n if (isCurrentRow) {\n // Current row references\n if (cols.startCol === cols.endCol) {\n // Single column - always use simple format [@ColumnName]\n // No need for double brackets even if column name has spaces\n result += `[@${cols.startCol}]`;\n } else {\n // Column range - always use double-bracket syntax to avoid ambiguity\n // with column names that contain colons\n result += `[@[${cols.startCol}]:[${cols.endCol}]]`;\n }\n } else {\n // Regular column references\n if (cols.startCol === cols.endCol) {\n // Single column - always use single brackets for table references\n result += `[${cols.startCol}]`;\n } else {\n // Column range - always use double-bracket syntax to avoid ambiguity\n // with column names that contain colons\n result += `[[${cols.startCol}]:[${cols.endCol}]]`;\n }\n }\n }\n\n return result;\n}\n\nexport function formatFormula(formula: string): string {\n return astToString(parseFormula(formula));\n}\n\nexport function normalizeSerializedCellValue(\n value: SerializedCellValue\n): SerializedCellValue {\n if (value === undefined || (typeof value === \"string\" && value === \"\"))\n return \"\";\n\n if (typeof value === \"string\" && value.startsWith(\"=\")) {\n return `=${formatFormula(value.slice(1))}`;\n }\n\n return value;\n}\n\nexport function isSerializedCellValueEqual(\n a: SerializedCellValue,\n b: SerializedCellValue\n): boolean {\n const normalizedA = normalizeSerializedCellValue(a);\n const normalizedB = normalizeSerializedCellValue(b);\n\n return normalizedA === normalizedB;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "1755F00DD1DD7AC364756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|