@ricsam/formula-engine 0.0.1
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 +100 -0
- package/dist/cjs/core/ast-traverser.cjs +124 -0
- package/dist/cjs/core/ast-traverser.cjs.map +10 -0
- package/dist/cjs/core/autofill-utils.cjs +304 -0
- package/dist/cjs/core/autofill-utils.cjs.map +10 -0
- package/dist/cjs/core/engine.cjs +390 -0
- package/dist/cjs/core/engine.cjs.map +10 -0
- package/dist/cjs/core/managers/cache-manager.cjs +58 -0
- package/dist/cjs/core/managers/cache-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/dependency-manager.cjs +620 -0
- package/dist/cjs/core/managers/dependency-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/dependency-node.cjs +24 -0
- package/dist/cjs/core/managers/dependency-node.cjs.map +9 -0
- package/dist/cjs/core/managers/evaluation-manager.cjs +433 -0
- package/dist/cjs/core/managers/evaluation-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/event-manager.cjs +49 -0
- package/dist/cjs/core/managers/event-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/frontier-dependency-manager.cjs +181 -0
- package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/index.cjs +49 -0
- package/dist/cjs/core/managers/index.cjs.map +10 -0
- package/dist/cjs/core/managers/isDependencyNode.cjs +44 -0
- package/dist/cjs/core/managers/isDependencyNode.cjs.map +10 -0
- package/dist/cjs/core/managers/named-expression-manager.cjs +379 -0
- package/dist/cjs/core/managers/named-expression-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/range-eval-order-builder.cjs +644 -0
- package/dist/cjs/core/managers/range-eval-order-builder.cjs.map +10 -0
- package/dist/cjs/core/managers/table-manager.cjs +254 -0
- package/dist/cjs/core/managers/table-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/workbook-manager.cjs +474 -0
- package/dist/cjs/core/managers/workbook-manager.cjs.map +10 -0
- package/dist/cjs/core/map-serializer.cjs +69 -0
- package/dist/cjs/core/map-serializer.cjs.map +10 -0
- package/dist/cjs/core/named-expression-renamer.cjs +88 -0
- package/dist/cjs/core/named-expression-renamer.cjs.map +10 -0
- package/dist/cjs/core/sheet-renamer.cjs +89 -0
- package/dist/cjs/core/sheet-renamer.cjs.map +10 -0
- package/dist/cjs/core/sheet-utils.cjs +39 -0
- package/dist/cjs/core/sheet-utils.cjs.map +10 -0
- package/dist/cjs/core/table-renamer.cjs +88 -0
- package/dist/cjs/core/table-renamer.cjs.map +10 -0
- package/dist/cjs/core/types.cjs +48 -0
- package/dist/cjs/core/types.cjs.map +10 -0
- package/dist/cjs/core/utils/range-serializer.cjs +65 -0
- package/dist/cjs/core/utils/range-serializer.cjs.map +10 -0
- package/dist/cjs/core/utils/spreadsheet-visualizer.cjs +142 -0
- package/dist/cjs/core/utils/spreadsheet-visualizer.cjs.map +10 -0
- package/dist/cjs/core/utils.cjs +434 -0
- package/dist/cjs/core/utils.cjs.map +10 -0
- package/dist/cjs/core/workbook-renamer.cjs +106 -0
- package/dist/cjs/core/workbook-renamer.cjs.map +10 -0
- package/dist/cjs/debug/flags.cjs +47 -0
- package/dist/cjs/debug/flags.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/add/add.cjs +82 -0
- package/dist/cjs/evaluator/arithmetic/add/add.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/divide/divide.cjs +107 -0
- package/dist/cjs/evaluator/arithmetic/divide/divide.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs +93 -0
- package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/power/power.cjs +125 -0
- package/dist/cjs/evaluator/arithmetic/power/power.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs +84 -0
- package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/equals.cjs +64 -0
- package/dist/cjs/evaluator/comparison/equals.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs +61 -0
- package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/greater-than.cjs +61 -0
- package/dist/cjs/evaluator/comparison/greater-than.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs +69 -0
- package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/less-than.cjs +68 -0
- package/dist/cjs/evaluator/comparison/less-than.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/not-equals.cjs +53 -0
- package/dist/cjs/evaluator/comparison/not-equals.cjs.map +10 -0
- package/dist/cjs/evaluator/concatenation/concatenate.cjs +72 -0
- package/dist/cjs/evaluator/concatenation/concatenate.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs +58 -0
- package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs +112 -0
- package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs +54 -0
- package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs +108 -0
- package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs +50 -0
- package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs.map +10 -0
- package/dist/cjs/evaluator/evaluate-scalar-operator.cjs +254 -0
- package/dist/cjs/evaluator/evaluate-scalar-operator.cjs.map +10 -0
- package/dist/cjs/evaluator/evaluation-context.cjs +154 -0
- package/dist/cjs/evaluator/evaluation-context.cjs.map +10 -0
- package/dist/cjs/evaluator/evaluation-error.cjs +75 -0
- package/dist/cjs/evaluator/evaluation-error.cjs.map +10 -0
- package/dist/cjs/evaluator/formula-evaluator.cjs +797 -0
- package/dist/cjs/evaluator/formula-evaluator.cjs.map +10 -0
- package/dist/cjs/evaluator/range-evaluation-node.cjs +88 -0
- package/dist/cjs/evaluator/range-evaluation-node.cjs.map +10 -0
- package/dist/cjs/functions/_template/template.cjs +42 -0
- package/dist/cjs/functions/_template/template.cjs.map +10 -0
- package/dist/cjs/functions/array/sequence/sequence.cjs +315 -0
- package/dist/cjs/functions/array/sequence/sequence.cjs.map +10 -0
- package/dist/cjs/functions/criteria-parser.cjs +217 -0
- package/dist/cjs/functions/criteria-parser.cjs.map +10 -0
- package/dist/cjs/functions/criteria-utils.cjs +291 -0
- package/dist/cjs/functions/criteria-utils.cjs.map +10 -0
- package/dist/cjs/functions/function-utils.cjs +63 -0
- package/dist/cjs/functions/function-utils.cjs.map +10 -0
- package/dist/cjs/functions/index.cjs +125 -0
- package/dist/cjs/functions/index.cjs.map +10 -0
- package/dist/cjs/functions/information/cell/cell.cjs +196 -0
- package/dist/cjs/functions/information/cell/cell.cjs.map +10 -0
- package/dist/cjs/functions/information/column/column.cjs +144 -0
- package/dist/cjs/functions/information/column/column.cjs.map +10 -0
- package/dist/cjs/functions/information/row/row.cjs +150 -0
- package/dist/cjs/functions/information/row/row.cjs.map +10 -0
- package/dist/cjs/functions/logical/and/and.cjs +112 -0
- package/dist/cjs/functions/logical/and/and.cjs.map +10 -0
- package/dist/cjs/functions/logical/if/if.cjs +195 -0
- package/dist/cjs/functions/logical/if/if.cjs.map +10 -0
- package/dist/cjs/functions/logical/iferror/iferror.cjs +126 -0
- package/dist/cjs/functions/logical/iferror/iferror.cjs.map +10 -0
- package/dist/cjs/functions/logical/or/or.cjs +112 -0
- package/dist/cjs/functions/logical/or/or.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/count-utils.cjs +65 -0
- package/dist/cjs/functions/lookup/count/count-utils.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/count.cjs +48 -0
- package/dist/cjs/functions/lookup/count/count.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/countif.cjs +94 -0
- package/dist/cjs/functions/lookup/count/countif.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/countifs.cjs +63 -0
- package/dist/cjs/functions/lookup/count/countifs.cjs.map +10 -0
- package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs +187 -0
- package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs.map +10 -0
- package/dist/cjs/functions/lookup/match/match.cjs +168 -0
- package/dist/cjs/functions/lookup/match/match.cjs.map +10 -0
- package/dist/cjs/functions/lookup/xlookup/xlookup.cjs +410 -0
- package/dist/cjs/functions/lookup/xlookup/xlookup.cjs.map +10 -0
- package/dist/cjs/functions/math/average/average-utils.cjs +72 -0
- package/dist/cjs/functions/math/average/average-utils.cjs.map +10 -0
- package/dist/cjs/functions/math/average/average.cjs +48 -0
- package/dist/cjs/functions/math/average/average.cjs.map +10 -0
- package/dist/cjs/functions/math/average/averageif.cjs +83 -0
- package/dist/cjs/functions/math/average/averageif.cjs.map +10 -0
- package/dist/cjs/functions/math/average/averageifs.cjs +61 -0
- package/dist/cjs/functions/math/average/averageifs.cjs.map +10 -0
- package/dist/cjs/functions/math/ceiling/ceiling.cjs +219 -0
- package/dist/cjs/functions/math/ceiling/ceiling.cjs.map +10 -0
- package/dist/cjs/functions/math/max/max-utils.cjs +71 -0
- package/dist/cjs/functions/math/max/max-utils.cjs.map +10 -0
- package/dist/cjs/functions/math/max/max.cjs +48 -0
- package/dist/cjs/functions/math/max/max.cjs.map +10 -0
- package/dist/cjs/functions/math/max/maxif.cjs +83 -0
- package/dist/cjs/functions/math/max/maxif.cjs.map +10 -0
- package/dist/cjs/functions/math/max/maxifs.cjs +61 -0
- package/dist/cjs/functions/math/max/maxifs.cjs.map +10 -0
- package/dist/cjs/functions/math/min/min-utils.cjs +71 -0
- package/dist/cjs/functions/math/min/min-utils.cjs.map +10 -0
- package/dist/cjs/functions/math/min/min.cjs +48 -0
- package/dist/cjs/functions/math/min/min.cjs.map +10 -0
- package/dist/cjs/functions/math/min/minif.cjs +83 -0
- package/dist/cjs/functions/math/min/minif.cjs.map +10 -0
- package/dist/cjs/functions/math/min/minifs.cjs +61 -0
- package/dist/cjs/functions/math/min/minifs.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/sum.cjs +48 -0
- package/dist/cjs/functions/math/sum/sum.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/sumif.cjs +83 -0
- package/dist/cjs/functions/math/sum/sumif.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/sumifs.cjs +60 -0
- package/dist/cjs/functions/math/sum/sumifs.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/summation-utils.cjs +57 -0
- package/dist/cjs/functions/math/sum/summation-utils.cjs.map +10 -0
- package/dist/cjs/functions/reference/address/address.cjs +163 -0
- package/dist/cjs/functions/reference/address/address.cjs.map +10 -0
- package/dist/cjs/functions/reference/indirect/indirect.cjs +102 -0
- package/dist/cjs/functions/reference/indirect/indirect.cjs.map +10 -0
- package/dist/cjs/functions/reference/offset/offset.cjs +233 -0
- package/dist/cjs/functions/reference/offset/offset.cjs.map +10 -0
- package/dist/cjs/functions/text/concatenate/concatenate.cjs +167 -0
- package/dist/cjs/functions/text/concatenate/concatenate.cjs.map +10 -0
- package/dist/cjs/functions/text/exact/exact.cjs +171 -0
- package/dist/cjs/functions/text/exact/exact.cjs.map +10 -0
- package/dist/cjs/functions/text/find/find.cjs +397 -0
- package/dist/cjs/functions/text/find/find.cjs.map +10 -0
- package/dist/cjs/functions/text/left/left.cjs +109 -0
- package/dist/cjs/functions/text/left/left.cjs.map +10 -0
- package/dist/cjs/functions/text/len/len.cjs +119 -0
- package/dist/cjs/functions/text/len/len.cjs.map +10 -0
- package/dist/cjs/functions/text/mid/mid.cjs +103 -0
- package/dist/cjs/functions/text/mid/mid.cjs.map +10 -0
- package/dist/cjs/functions/text/right/right.cjs +167 -0
- package/dist/cjs/functions/text/right/right.cjs.map +10 -0
- package/dist/cjs/functions/text/text-helpers.cjs +179 -0
- package/dist/cjs/functions/text/text-helpers.cjs.map +10 -0
- package/dist/cjs/functions/text/textjoin/textjoin.cjs +173 -0
- package/dist/cjs/functions/text/textjoin/textjoin.cjs.map +10 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/parser/ast.cjs +175 -0
- package/dist/cjs/parser/ast.cjs.map +10 -0
- package/dist/cjs/parser/formatter.cjs +319 -0
- package/dist/cjs/parser/formatter.cjs.map +10 -0
- package/dist/cjs/parser/grammar.cjs +375 -0
- package/dist/cjs/parser/grammar.cjs.map +10 -0
- package/dist/cjs/parser/lexer.cjs +443 -0
- package/dist/cjs/parser/lexer.cjs.map +10 -0
- package/dist/cjs/parser/parser.cjs +1700 -0
- package/dist/cjs/parser/parser.cjs.map +10 -0
- package/dist/cjs/react/hooks.cjs +59 -0
- package/dist/cjs/react/hooks.cjs.map +10 -0
- package/dist/mjs/core/ast-traverser.mjs +94 -0
- package/dist/mjs/core/ast-traverser.mjs.map +10 -0
- package/dist/mjs/core/autofill-utils.mjs +274 -0
- package/dist/mjs/core/autofill-utils.mjs.map +10 -0
- package/dist/mjs/core/engine.mjs +366 -0
- package/dist/mjs/core/engine.mjs.map +10 -0
- package/dist/mjs/core/managers/cache-manager.mjs +27 -0
- package/dist/mjs/core/managers/cache-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/dependency-manager.mjs +593 -0
- package/dist/mjs/core/managers/dependency-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/dependency-node.mjs +2 -0
- package/dist/mjs/core/managers/dependency-node.mjs.map +9 -0
- package/dist/mjs/core/managers/evaluation-manager.mjs +415 -0
- package/dist/mjs/core/managers/evaluation-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/event-manager.mjs +18 -0
- package/dist/mjs/core/managers/event-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/frontier-dependency-manager.mjs +151 -0
- package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/index.mjs +21 -0
- package/dist/mjs/core/managers/index.mjs.map +10 -0
- package/dist/mjs/core/managers/isDependencyNode.mjs +14 -0
- package/dist/mjs/core/managers/isDependencyNode.mjs.map +10 -0
- package/dist/mjs/core/managers/named-expression-manager.mjs +348 -0
- package/dist/mjs/core/managers/named-expression-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/range-eval-order-builder.mjs +618 -0
- package/dist/mjs/core/managers/range-eval-order-builder.mjs.map +10 -0
- package/dist/mjs/core/managers/table-manager.mjs +224 -0
- package/dist/mjs/core/managers/table-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/workbook-manager.mjs +447 -0
- package/dist/mjs/core/managers/workbook-manager.mjs.map +10 -0
- package/dist/mjs/core/map-serializer.mjs +39 -0
- package/dist/mjs/core/map-serializer.mjs.map +10 -0
- package/dist/mjs/core/named-expression-renamer.mjs +58 -0
- package/dist/mjs/core/named-expression-renamer.mjs.map +10 -0
- package/dist/mjs/core/sheet-renamer.mjs +59 -0
- package/dist/mjs/core/sheet-renamer.mjs.map +10 -0
- package/dist/mjs/core/sheet-utils.mjs +8 -0
- package/dist/mjs/core/sheet-utils.mjs.map +10 -0
- package/dist/mjs/core/table-renamer.mjs +58 -0
- package/dist/mjs/core/table-renamer.mjs.map +10 -0
- package/dist/mjs/core/types.mjs +18 -0
- package/dist/mjs/core/types.mjs.map +10 -0
- package/dist/mjs/core/utils/range-serializer.mjs +35 -0
- package/dist/mjs/core/utils/range-serializer.mjs.map +10 -0
- package/dist/mjs/core/utils/spreadsheet-visualizer.mjs +112 -0
- package/dist/mjs/core/utils/spreadsheet-visualizer.mjs.map +10 -0
- package/dist/mjs/core/utils.mjs +409 -0
- package/dist/mjs/core/utils.mjs.map +10 -0
- package/dist/mjs/core/workbook-renamer.mjs +76 -0
- package/dist/mjs/core/workbook-renamer.mjs.map +10 -0
- package/dist/mjs/debug/flags.mjs +17 -0
- package/dist/mjs/debug/flags.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/add/add.mjs +52 -0
- package/dist/mjs/evaluator/arithmetic/add/add.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/divide/divide.mjs +77 -0
- package/dist/mjs/evaluator/arithmetic/divide/divide.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs +63 -0
- package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/power/power.mjs +95 -0
- package/dist/mjs/evaluator/arithmetic/power/power.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs +54 -0
- package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/equals.mjs +34 -0
- package/dist/mjs/evaluator/comparison/equals.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs +31 -0
- package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/greater-than.mjs +31 -0
- package/dist/mjs/evaluator/comparison/greater-than.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs +39 -0
- package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/less-than.mjs +38 -0
- package/dist/mjs/evaluator/comparison/less-than.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/not-equals.mjs +23 -0
- package/dist/mjs/evaluator/comparison/not-equals.mjs.map +10 -0
- package/dist/mjs/evaluator/concatenation/concatenate.mjs +42 -0
- package/dist/mjs/evaluator/concatenation/concatenate.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs +28 -0
- package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs +81 -0
- package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs +24 -0
- package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs +78 -0
- package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs +20 -0
- package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs.map +10 -0
- package/dist/mjs/evaluator/evaluate-scalar-operator.mjs +226 -0
- package/dist/mjs/evaluator/evaluate-scalar-operator.mjs.map +10 -0
- package/dist/mjs/evaluator/evaluation-context.mjs +123 -0
- package/dist/mjs/evaluator/evaluation-context.mjs.map +10 -0
- package/dist/mjs/evaluator/evaluation-error.mjs +44 -0
- package/dist/mjs/evaluator/evaluation-error.mjs.map +10 -0
- package/dist/mjs/evaluator/formula-evaluator.mjs +780 -0
- package/dist/mjs/evaluator/formula-evaluator.mjs.map +10 -0
- package/dist/mjs/evaluator/range-evaluation-node.mjs +58 -0
- package/dist/mjs/evaluator/range-evaluation-node.mjs.map +10 -0
- package/dist/mjs/functions/_template/template.mjs +12 -0
- package/dist/mjs/functions/_template/template.mjs.map +10 -0
- package/dist/mjs/functions/array/sequence/sequence.mjs +287 -0
- package/dist/mjs/functions/array/sequence/sequence.mjs.map +10 -0
- package/dist/mjs/functions/criteria-parser.mjs +187 -0
- package/dist/mjs/functions/criteria-parser.mjs.map +10 -0
- package/dist/mjs/functions/criteria-utils.mjs +268 -0
- package/dist/mjs/functions/criteria-utils.mjs.map +10 -0
- package/dist/mjs/functions/function-utils.mjs +33 -0
- package/dist/mjs/functions/function-utils.mjs.map +10 -0
- package/dist/mjs/functions/index.mjs +95 -0
- package/dist/mjs/functions/index.mjs.map +10 -0
- package/dist/mjs/functions/information/cell/cell.mjs +168 -0
- package/dist/mjs/functions/information/cell/cell.mjs.map +10 -0
- package/dist/mjs/functions/information/column/column.mjs +120 -0
- package/dist/mjs/functions/information/column/column.mjs.map +10 -0
- package/dist/mjs/functions/information/row/row.mjs +126 -0
- package/dist/mjs/functions/information/row/row.mjs.map +10 -0
- package/dist/mjs/functions/logical/and/and.mjs +84 -0
- package/dist/mjs/functions/logical/and/and.mjs.map +10 -0
- package/dist/mjs/functions/logical/if/if.mjs +167 -0
- package/dist/mjs/functions/logical/if/if.mjs.map +10 -0
- package/dist/mjs/functions/logical/iferror/iferror.mjs +98 -0
- package/dist/mjs/functions/logical/iferror/iferror.mjs.map +10 -0
- package/dist/mjs/functions/logical/or/or.mjs +84 -0
- package/dist/mjs/functions/logical/or/or.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/count-utils.mjs +35 -0
- package/dist/mjs/functions/lookup/count/count-utils.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/count.mjs +18 -0
- package/dist/mjs/functions/lookup/count/count.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/countif.mjs +68 -0
- package/dist/mjs/functions/lookup/count/countif.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/countifs.mjs +37 -0
- package/dist/mjs/functions/lookup/count/countifs.mjs.map +10 -0
- package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs +159 -0
- package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs.map +10 -0
- package/dist/mjs/functions/lookup/match/match.mjs +140 -0
- package/dist/mjs/functions/lookup/match/match.mjs.map +10 -0
- package/dist/mjs/functions/lookup/xlookup/xlookup.mjs +382 -0
- package/dist/mjs/functions/lookup/xlookup/xlookup.mjs.map +10 -0
- package/dist/mjs/functions/math/average/average-utils.mjs +44 -0
- package/dist/mjs/functions/math/average/average-utils.mjs.map +10 -0
- package/dist/mjs/functions/math/average/average.mjs +18 -0
- package/dist/mjs/functions/math/average/average.mjs.map +10 -0
- package/dist/mjs/functions/math/average/averageif.mjs +58 -0
- package/dist/mjs/functions/math/average/averageif.mjs.map +10 -0
- package/dist/mjs/functions/math/average/averageifs.mjs +35 -0
- package/dist/mjs/functions/math/average/averageifs.mjs.map +10 -0
- package/dist/mjs/functions/math/ceiling/ceiling.mjs +191 -0
- package/dist/mjs/functions/math/ceiling/ceiling.mjs.map +10 -0
- package/dist/mjs/functions/math/max/max-utils.mjs +43 -0
- package/dist/mjs/functions/math/max/max-utils.mjs.map +10 -0
- package/dist/mjs/functions/math/max/max.mjs +18 -0
- package/dist/mjs/functions/math/max/max.mjs.map +10 -0
- package/dist/mjs/functions/math/max/maxif.mjs +58 -0
- package/dist/mjs/functions/math/max/maxif.mjs.map +10 -0
- package/dist/mjs/functions/math/max/maxifs.mjs +35 -0
- package/dist/mjs/functions/math/max/maxifs.mjs.map +10 -0
- package/dist/mjs/functions/math/min/min-utils.mjs +43 -0
- package/dist/mjs/functions/math/min/min-utils.mjs.map +10 -0
- package/dist/mjs/functions/math/min/min.mjs +18 -0
- package/dist/mjs/functions/math/min/min.mjs.map +10 -0
- package/dist/mjs/functions/math/min/minif.mjs +58 -0
- package/dist/mjs/functions/math/min/minif.mjs.map +10 -0
- package/dist/mjs/functions/math/min/minifs.mjs +35 -0
- package/dist/mjs/functions/math/min/minifs.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/sum.mjs +18 -0
- package/dist/mjs/functions/math/sum/sum.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/sumif.mjs +58 -0
- package/dist/mjs/functions/math/sum/sumif.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/sumifs.mjs +34 -0
- package/dist/mjs/functions/math/sum/sumifs.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/summation-utils.mjs +27 -0
- package/dist/mjs/functions/math/sum/summation-utils.mjs.map +10 -0
- package/dist/mjs/functions/reference/address/address.mjs +135 -0
- package/dist/mjs/functions/reference/address/address.mjs.map +10 -0
- package/dist/mjs/functions/reference/indirect/indirect.mjs +74 -0
- package/dist/mjs/functions/reference/indirect/indirect.mjs.map +10 -0
- package/dist/mjs/functions/reference/offset/offset.mjs +205 -0
- package/dist/mjs/functions/reference/offset/offset.mjs.map +10 -0
- package/dist/mjs/functions/text/concatenate/concatenate.mjs +139 -0
- package/dist/mjs/functions/text/concatenate/concatenate.mjs.map +10 -0
- package/dist/mjs/functions/text/exact/exact.mjs +143 -0
- package/dist/mjs/functions/text/exact/exact.mjs.map +10 -0
- package/dist/mjs/functions/text/find/find.mjs +369 -0
- package/dist/mjs/functions/text/find/find.mjs.map +10 -0
- package/dist/mjs/functions/text/left/left.mjs +81 -0
- package/dist/mjs/functions/text/left/left.mjs.map +10 -0
- package/dist/mjs/functions/text/len/len.mjs +91 -0
- package/dist/mjs/functions/text/len/len.mjs.map +10 -0
- package/dist/mjs/functions/text/mid/mid.mjs +75 -0
- package/dist/mjs/functions/text/mid/mid.mjs.map +10 -0
- package/dist/mjs/functions/text/right/right.mjs +143 -0
- package/dist/mjs/functions/text/right/right.mjs.map +10 -0
- package/dist/mjs/functions/text/text-helpers.mjs +151 -0
- package/dist/mjs/functions/text/text-helpers.mjs.map +10 -0
- package/dist/mjs/functions/text/textjoin/textjoin.mjs +145 -0
- package/dist/mjs/functions/text/textjoin/textjoin.mjs.map +10 -0
- package/dist/mjs/package.json +5 -0
- package/dist/mjs/parser/ast.mjs +145 -0
- package/dist/mjs/parser/ast.mjs.map +10 -0
- package/dist/mjs/parser/formatter.mjs +289 -0
- package/dist/mjs/parser/formatter.mjs.map +10 -0
- package/dist/mjs/parser/grammar.mjs +345 -0
- package/dist/mjs/parser/grammar.mjs.map +10 -0
- package/dist/mjs/parser/lexer.mjs +412 -0
- package/dist/mjs/parser/lexer.mjs.map +10 -0
- package/dist/mjs/parser/parser.mjs +1692 -0
- package/dist/mjs/parser/parser.mjs.map +10 -0
- package/dist/mjs/react/hooks.mjs +16 -0
- package/dist/mjs/react/hooks.mjs.map +10 -0
- package/dist/types/core/ast-traverser.d.ts +28 -0
- package/dist/types/core/autofill-utils.d.ts +32 -0
- package/dist/types/core/engine.d.ts +184 -0
- package/dist/types/core/managers/cache-manager.d.ts +14 -0
- package/dist/types/core/managers/dependency-manager.d.ts +147 -0
- package/dist/types/core/managers/dependency-node.d.ts +13 -0
- package/dist/types/core/managers/evaluation-manager.d.ts +30 -0
- package/dist/types/core/managers/event-manager.d.ts +8 -0
- package/dist/types/core/managers/frontier-dependency-manager.d.ts +69 -0
- package/dist/types/core/managers/index.d.ts +7 -0
- package/dist/types/core/managers/isDependencyNode.d.ts +2 -0
- package/dist/types/core/managers/named-expression-manager.d.ts +101 -0
- package/dist/types/core/managers/range-eval-order-builder.d.ts +33 -0
- package/dist/types/core/managers/table-manager.d.ts +84 -0
- package/dist/types/core/managers/workbook-manager.d.ts +136 -0
- package/dist/types/core/map-serializer.d.ts +4 -0
- package/dist/types/core/named-expression-renamer.d.ts +21 -0
- package/dist/types/core/sheet-renamer.d.ts +28 -0
- package/dist/types/core/sheet-utils.d.ts +2 -0
- package/dist/types/core/table-renamer.d.ts +21 -0
- package/dist/types/core/types.d.ts +272 -0
- package/dist/types/core/utils/cell-address-parsing.test.d.ts +1 -0
- package/dist/types/core/utils/range-serializer.d.ts +22 -0
- package/dist/types/core/utils/range-serializer.test.d.ts +1 -0
- package/dist/types/core/utils/spreadsheet-visualizer.d.ts +30 -0
- package/dist/types/core/utils.d.ts +48 -0
- package/dist/types/core/workbook-renamer.d.ts +28 -0
- package/dist/types/debug/flags.d.ts +11 -0
- package/dist/types/evaluator/arithmetic/add/add.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/add/add.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/divide/divide.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/divide/divide.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/multiply/multiply.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/multiply/multiply.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/power/power.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/power/power.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/subtract/subtract.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/subtract/subtract.test.d.ts +1 -0
- package/dist/types/evaluator/comparison/comparison-operators.test.d.ts +1 -0
- package/dist/types/evaluator/comparison/equals.d.ts +6 -0
- package/dist/types/evaluator/comparison/greater-than-or-equal.d.ts +6 -0
- package/dist/types/evaluator/comparison/greater-than.d.ts +6 -0
- package/dist/types/evaluator/comparison/less-than-or-equal.d.ts +6 -0
- package/dist/types/evaluator/comparison/less-than.d.ts +6 -0
- package/dist/types/evaluator/comparison/not-equals.d.ts +6 -0
- package/dist/types/evaluator/concatenation/concatenate.d.ts +6 -0
- package/dist/types/evaluator/concatenation/concatenate.test.d.ts +1 -0
- package/dist/types/evaluator/dependency-nodes/ast-evaluation-node.d.ts +12 -0
- package/dist/types/evaluator/dependency-nodes/base-eval-node.d.ts +31 -0
- package/dist/types/evaluator/dependency-nodes/cell-value-node.d.ts +10 -0
- package/dist/types/evaluator/dependency-nodes/empty-cell-evaluation-node.d.ts +17 -0
- package/dist/types/evaluator/dependency-nodes/spill-meta-node.d.ts +7 -0
- package/dist/types/evaluator/evaluate-scalar-operator.d.ts +12 -0
- package/dist/types/evaluator/evaluation-context.d.ts +66 -0
- package/dist/types/evaluator/evaluation-error.d.ts +20 -0
- package/dist/types/evaluator/formula-evaluator.d.ts +67 -0
- package/dist/types/evaluator/open-range-evaluator.test.d.ts +1 -0
- package/dist/types/evaluator/range-evaluation-node.d.ts +16 -0
- package/dist/types/functions/_template/template.d.ts +5 -0
- package/dist/types/functions/_template/template.test.d.ts +1 -0
- package/dist/types/functions/array/sequence/performance-test.d.ts +1 -0
- package/dist/types/functions/array/sequence/sequence.d.ts +14 -0
- package/dist/types/functions/array/sequence/sequence.test.d.ts +1 -0
- package/dist/types/functions/criteria-parser.d.ts +27 -0
- package/dist/types/functions/criteria-utils.d.ts +61 -0
- package/dist/types/functions/function-utils.d.ts +21 -0
- package/dist/types/functions/index.d.ts +2 -0
- package/dist/types/functions/information/cell/cell.d.ts +24 -0
- package/dist/types/functions/information/cell/cell.test.d.ts +1 -0
- package/dist/types/functions/information/column/column.d.ts +14 -0
- package/dist/types/functions/information/column/column.test.d.ts +1 -0
- package/dist/types/functions/information/row/row.d.ts +14 -0
- package/dist/types/functions/information/row/row.test.d.ts +1 -0
- package/dist/types/functions/logical/and/and.d.ts +5 -0
- package/dist/types/functions/logical/and/and.test.d.ts +1 -0
- package/dist/types/functions/logical/if/if.d.ts +5 -0
- package/dist/types/functions/logical/if/if.test.d.ts +1 -0
- package/dist/types/functions/logical/iferror/iferror.d.ts +5 -0
- package/dist/types/functions/logical/iferror/iferror.test.d.ts +1 -0
- package/dist/types/functions/logical/or/or.d.ts +5 -0
- package/dist/types/functions/logical/or/or.test.d.ts +1 -0
- package/dist/types/functions/lookup/count/count-utils.d.ts +14 -0
- package/dist/types/functions/lookup/count/count.d.ts +21 -0
- package/dist/types/functions/lookup/count/count.test.d.ts +1 -0
- package/dist/types/functions/lookup/count/countif.d.ts +26 -0
- package/dist/types/functions/lookup/count/countif.test.d.ts +1 -0
- package/dist/types/functions/lookup/count/countifs.d.ts +21 -0
- package/dist/types/functions/lookup/count/countifs.test.d.ts +1 -0
- package/dist/types/functions/lookup/index-lookup/index-lookup.d.ts +2 -0
- package/dist/types/functions/lookup/index-lookup/index-lookup.test.d.ts +1 -0
- package/dist/types/functions/lookup/match/match.d.ts +2 -0
- package/dist/types/functions/lookup/match/match.test.d.ts +1 -0
- package/dist/types/functions/lookup/xlookup/xlookup.d.ts +2 -0
- package/dist/types/functions/lookup/xlookup/xlookup.test.d.ts +1 -0
- package/dist/types/functions/math/average/average-utils.d.ts +10 -0
- package/dist/types/functions/math/average/average.d.ts +18 -0
- package/dist/types/functions/math/average/average.test.d.ts +1 -0
- package/dist/types/functions/math/average/averageif.d.ts +23 -0
- package/dist/types/functions/math/average/averageif.test.d.ts +1 -0
- package/dist/types/functions/math/average/averageifs.d.ts +21 -0
- package/dist/types/functions/math/average/averageifs.test.d.ts +1 -0
- package/dist/types/functions/math/ceiling/ceiling.d.ts +5 -0
- package/dist/types/functions/math/ceiling/ceiling.test.d.ts +1 -0
- package/dist/types/functions/math/max/max-utils.d.ts +20 -0
- package/dist/types/functions/math/max/max.d.ts +18 -0
- package/dist/types/functions/math/max/max.test.d.ts +1 -0
- package/dist/types/functions/math/max/maxif.d.ts +23 -0
- package/dist/types/functions/math/max/maxif.test.d.ts +1 -0
- package/dist/types/functions/math/max/maxifs.d.ts +21 -0
- package/dist/types/functions/math/max/maxifs.test.d.ts +1 -0
- package/dist/types/functions/math/min/min-utils.d.ts +20 -0
- package/dist/types/functions/math/min/min.d.ts +5 -0
- package/dist/types/functions/math/min/min.test.d.ts +1 -0
- package/dist/types/functions/math/min/minif.d.ts +23 -0
- package/dist/types/functions/math/min/minif.test.d.ts +1 -0
- package/dist/types/functions/math/min/minifs.d.ts +21 -0
- package/dist/types/functions/math/min/minifs.test.d.ts +1 -0
- package/dist/types/functions/math/sum/sum.d.ts +5 -0
- package/dist/types/functions/math/sum/sum.test.d.ts +1 -0
- package/dist/types/functions/math/sum/sumif.d.ts +23 -0
- package/dist/types/functions/math/sum/sumif.test.d.ts +1 -0
- package/dist/types/functions/math/sum/sumifs.d.ts +21 -0
- package/dist/types/functions/math/sum/sumifs.test.d.ts +1 -0
- package/dist/types/functions/math/sum/summation-utils.d.ts +19 -0
- package/dist/types/functions/reference/address/address.d.ts +18 -0
- package/dist/types/functions/reference/address/address.test.d.ts +1 -0
- package/dist/types/functions/reference/indirect/indirect.d.ts +20 -0
- package/dist/types/functions/reference/indirect/indirect.test.d.ts +1 -0
- package/dist/types/functions/reference/offset/offset.d.ts +23 -0
- package/dist/types/functions/reference/offset/offset.test.d.ts +1 -0
- package/dist/types/functions/text/concatenate/concatenate.d.ts +5 -0
- package/dist/types/functions/text/concatenate/concatenate.test.d.ts +1 -0
- package/dist/types/functions/text/exact/exact.d.ts +5 -0
- package/dist/types/functions/text/exact/exact.test.d.ts +1 -0
- package/dist/types/functions/text/find/find.d.ts +20 -0
- package/dist/types/functions/text/find/find.test.d.ts +1 -0
- package/dist/types/functions/text/left/left.d.ts +19 -0
- package/dist/types/functions/text/left/left.test.d.ts +1 -0
- package/dist/types/functions/text/len/len.d.ts +16 -0
- package/dist/types/functions/text/len/len.test.d.ts +1 -0
- package/dist/types/functions/text/mid/mid.d.ts +20 -0
- package/dist/types/functions/text/mid/mid.test.d.ts +1 -0
- package/dist/types/functions/text/right/right.d.ts +2 -0
- package/dist/types/functions/text/right/right.test.d.ts +1 -0
- package/dist/types/functions/text/text-helpers.d.ts +27 -0
- package/dist/types/functions/text/textjoin/textjoin.d.ts +5 -0
- package/dist/types/functions/text/textjoin/textjoin.test.d.ts +1 -0
- package/dist/types/parser/ast.d.ts +275 -0
- package/dist/types/parser/formatter.d.ts +6 -0
- package/dist/types/parser/grammar.d.ts +203 -0
- package/dist/types/parser/lexer.d.ts +144 -0
- package/dist/types/parser/parser.d.ts +159 -0
- package/dist/types/react/hooks.d.ts +5 -0
- package/package.json +41 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/managers/range-eval-order-builder.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { flags } from \"src/debug/flags\";\nimport {\n FormulaError,\n type CellAddress,\n type RangeAddress,\n type SerializedCellValue,\n type Sheet,\n} from \"../types.cjs\";\nimport { getCellReference, parseCellReference } from \"../utils.cjs\";\nimport {\n type WorkbookManager,\n type SheetIndexes,\n IndexEntryBinarySearch,\n} from \"./workbook-manager.cjs\";\nimport { EvaluationError } from \"src/evaluator/evaluation-error\";\n\nexport type LookupOrder = \"row-major\" | \"col-major\";\n\nexport type RangeEvalOrderEntryDict = {\n value: {\n type: \"value\";\n address: CellAddress;\n };\n empty_cell: {\n type: \"empty_cell\";\n address: CellAddress;\n candidates: CellAddress[];\n };\n empty_range: {\n type: \"empty_range\";\n address: RangeAddress;\n candidates: CellAddress[];\n };\n};\n\nexport type RangeEvalOrderEntry =\n | RangeEvalOrderEntryDict[\"value\"]\n | RangeEvalOrderEntryDict[\"empty_cell\"]\n | RangeEvalOrderEntryDict[\"empty_range\"];\n\n/**\n * Build a deterministic, ordered list describing every cell inside a lookup range.\n * This function analyzes the range and classifies each cell/range as either:\n * - A value-like cell (occupied)\n * - An empty cell with 0-2 frontier candidates\n * - An empty range with 0-2 frontier candidates\n *\n * @param this - WorkbookManager instance\n * @param lookupOrder - \"row-major\" or \"col-major\" iteration order\n * @param lookupRange - The range to analyze\n * @returns Ordered array of entries describing the range\n */\nexport function buildRangeEvalOrder(\n this: WorkbookManager,\n lookupOrder: LookupOrder,\n lookupRange: RangeAddress\n): RangeEvalOrderEntry[] {\n const sheet = this.getSheet(lookupRange);\n if (!sheet) {\n throw new EvaluationError(\n FormulaError.REF,\n `Sheet ${lookupRange.sheetName} not found`\n );\n }\n\n const result: RangeEvalOrderEntry[] = [];\n\n // Get range bounds\n const startRow = lookupRange.range.start.row;\n const startCol = lookupRange.range.start.col;\n\n // Build a map of occupied cells within the range\n const occupiedCells = new Map<string, CellAddress>();\n let maxRow = startRow;\n let maxCol = startCol;\n\n for (const cellAddr of this.iterateCellsInRange(lookupRange)) {\n occupiedCells.set(getCellReference(cellAddr), cellAddr);\n maxRow = Math.max(maxRow, cellAddr.rowIndex);\n maxCol = Math.max(maxCol, cellAddr.colIndex);\n }\n\n // For infinite ranges, also consider ALL occupied cells in the sheet\n // (including frontier candidates and their spills) to determine extent\n if (\n lookupRange.range.end.row.type === \"infinity\" ||\n lookupRange.range.end.col.type === \"infinity\"\n ) {\n // Get all cells in the sheet to find the full extent\n const allCells = this.iterateCellsInRange({\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: { row: 0, col: 0 },\n end: {\n row: { type: \"infinity\", sign: \"positive\" },\n col: { type: \"infinity\", sign: \"positive\" },\n },\n },\n });\n\n for (const cellAddr of allCells) {\n // Consider all occupied cells (formulas and values) to determine extent\n maxRow = Math.max(maxRow, cellAddr.rowIndex);\n maxCol = Math.max(maxCol, cellAddr.colIndex);\n }\n }\n\n // Determine the effective end bounds\n // For finite ranges, use the specified end\n // For infinite ranges, use the maximum cell found (including frontier candidates)\n const endRow =\n lookupRange.range.end.row.type === \"number\"\n ? lookupRange.range.end.row.value\n : maxRow;\n const endCol =\n lookupRange.range.end.col.type === \"number\"\n ? lookupRange.range.end.col.value\n : maxCol;\n\n // Optimization: If the lookup range is infinite and has NO occupied cells within it,\n // emit a single infinite range with ALL candidates from the sheet that could affect it\n const isInfinite =\n lookupRange.range.end.row.type === \"infinity\" ||\n lookupRange.range.end.col.type === \"infinity\";\n\n if (isInfinite && occupiedCells.size === 0) {\n // Find all formula candidates that could spill into this range\n // by checking formulas to the left and above of the range\n const leftCandidates = new Map<string, CellAddress>();\n const aboveCandidates = new Map<string, CellAddress>();\n const diagonalCandidates = new Map<string, CellAddress>();\n\n // Iterate all cells in the sheet to find candidates\n // (formulas to the left or above that could spill into the range)\n const allCells = this.iterateCellsInRange({\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: { row: 0, col: 0 },\n end: {\n row: { type: \"infinity\", sign: \"positive\" },\n col: { type: \"infinity\", sign: \"positive\" },\n },\n },\n });\n\n for (const cellAddr of allCells) {\n const cellRef = getCellReference(cellAddr);\n const content = sheet.content.get(cellRef);\n\n // Only consider formula cells\n if (typeof content === \"string\" && content.startsWith(\"=\")) {\n // Check if this formula could spill into the lookup range\n // A formula at (r, c) can spill into a range starting at (startRow, startCol) if:\n // 1. It's directly to the left: c < startCol AND r >= startRow (same row or below)\n // 2. It's directly above: r < startRow AND c >= startCol (same column or to the right)\n // 3. It's diagonal: r < startRow AND c < startCol (can spill down-right)\n\n const isLeftCandidate =\n cellAddr.colIndex < startCol && cellAddr.rowIndex >= startRow;\n const isAboveCandidate =\n cellAddr.rowIndex < startRow && cellAddr.colIndex >= startCol;\n const isDiagonalCandidate =\n cellAddr.rowIndex < startRow && cellAddr.colIndex < startCol;\n\n if (isLeftCandidate) {\n leftCandidates.set(cellRef, cellAddr);\n } else if (isAboveCandidate) {\n aboveCandidates.set(cellRef, cellAddr);\n } else if (isDiagonalCandidate) {\n diagonalCandidates.set(cellRef, cellAddr);\n }\n }\n }\n\n // Only include diagonal candidates if there are NO direct left/above candidates\n const candidateMap = new Map<string, CellAddress>();\n if (leftCandidates.size > 0 || aboveCandidates.size > 0) {\n // Have direct candidates - use only those\n for (const [ref, addr] of leftCandidates) {\n candidateMap.set(ref, addr);\n }\n for (const [ref, addr] of aboveCandidates) {\n candidateMap.set(ref, addr);\n }\n } else {\n // No direct candidates - use diagonals\n for (const [ref, addr] of diagonalCandidates) {\n candidateMap.set(ref, addr);\n }\n }\n\n const candidates = sortCandidates(\n Array.from(candidateMap.values()),\n lookupOrder\n );\n\n result.push({\n type: \"empty_range\",\n address: lookupRange,\n candidates,\n });\n return result;\n }\n\n if (lookupOrder === \"row-major\") {\n // Get indexes for efficient row/column lookups\n const indexes = this.getSheetIndexes({\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n });\n\n // Iterate row by row, left to right\n for (let row = startRow; row <= endRow; row++) {\n // Check if this row has any occupied cells using indexes\n const hasOccupiedInRow = indexes.rowGroups.has(row);\n\n // If the row has no occupied cells and the range is infinite in columns,\n // emit a single infinite range for the entire row\n if (!hasOccupiedInRow && lookupRange.range.end.col.type === \"infinity\") {\n const firstCell: CellAddress = {\n rowIndex: row,\n colIndex: startCol,\n sheetName: lookupRange.sheetName,\n workbookName: lookupRange.workbookName,\n };\n\n const candidates = findCandidatesForCell.call(\n this,\n firstCell,\n sheet,\n lookupOrder\n );\n\n result.push({\n type: \"empty_range\",\n address: {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: {\n row: row,\n col: startCol,\n },\n end: {\n row: { type: \"number\", value: row },\n col: lookupRange.range.end.col,\n },\n },\n },\n candidates,\n });\n continue; // Skip normal processing for this row\n }\n\n processRowMajorRow.call(\n this,\n row,\n startCol,\n endCol,\n lookupRange,\n occupiedCells,\n sheet,\n result,\n indexes\n );\n\n // If the lookup range is infinite in columns, emit a final infinite range for this row ONLY\n if (lookupRange.range.end.col.type === \"infinity\") {\n const nextCol = endCol + 1;\n const firstCellBeyondEnd: CellAddress = {\n rowIndex: row,\n colIndex: nextCol,\n sheetName: lookupRange.sheetName,\n workbookName: lookupRange.workbookName,\n };\n\n const candidates = findCandidatesForCell.call(\n this,\n firstCellBeyondEnd,\n sheet,\n lookupOrder\n );\n\n result.push({\n type: \"empty_range\",\n address: {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: {\n row: row,\n col: nextCol,\n },\n end: {\n // Always constrain to this row only in row-major\n row: { type: \"number\", value: row },\n col: lookupRange.range.end.col,\n },\n },\n },\n candidates,\n });\n }\n }\n\n // If the lookup range is infinite in rows, emit a final infinite range\n if (lookupRange.range.end.row.type === \"infinity\") {\n // Find candidates for cells beyond the last processed row\n const nextRow = endRow + 1;\n const firstCellInNextRow: CellAddress = {\n rowIndex: nextRow,\n colIndex: startCol,\n sheetName: lookupRange.sheetName,\n workbookName: lookupRange.workbookName,\n };\n\n const candidates = findCandidatesForCell.call(\n this,\n firstCellInNextRow,\n sheet,\n lookupOrder\n );\n\n result.push({\n type: \"empty_range\",\n address: {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: {\n row: nextRow,\n col: startCol,\n },\n end: {\n row: lookupRange.range.end.row,\n col: lookupRange.range.end.col,\n },\n },\n },\n candidates,\n });\n }\n } else {\n // Get indexes for efficient row/column lookups\n const indexes = this.getSheetIndexes({\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n });\n\n // col-major: iterate column by column, top to bottom\n for (let col = startCol; col <= endCol; col++) {\n // Check if this column has any occupied cells using indexes\n const hasOccupiedInColumn = indexes.colGroups.has(col);\n\n // If the column has no occupied cells and the range is infinite in rows,\n // emit a single infinite range for the entire column\n if (\n !hasOccupiedInColumn &&\n lookupRange.range.end.row.type === \"infinity\"\n ) {\n const firstCell: CellAddress = {\n rowIndex: startRow,\n colIndex: col,\n sheetName: lookupRange.sheetName,\n workbookName: lookupRange.workbookName,\n };\n\n const candidates = findCandidatesForCell.call(\n this,\n firstCell,\n sheet,\n lookupOrder\n );\n\n result.push({\n type: \"empty_range\",\n address: {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: {\n row: startRow,\n col: col,\n },\n end: {\n row: lookupRange.range.end.row,\n col: { type: \"number\", value: col },\n },\n },\n },\n candidates,\n });\n continue; // Skip normal processing for this column\n }\n\n processColMajorColumn.call(\n this,\n col,\n startRow,\n endRow,\n lookupRange,\n occupiedCells,\n sheet,\n result,\n indexes\n );\n\n // If the lookup range is infinite in rows, emit a final infinite range for this column ONLY\n if (lookupRange.range.end.row.type === \"infinity\") {\n const nextRow = endRow + 1;\n const firstCellBeyondEnd: CellAddress = {\n rowIndex: nextRow,\n colIndex: col,\n sheetName: lookupRange.sheetName,\n workbookName: lookupRange.workbookName,\n };\n\n const candidates = findCandidatesForCell.call(\n this,\n firstCellBeyondEnd,\n sheet,\n lookupOrder\n );\n\n result.push({\n type: \"empty_range\",\n address: {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: {\n row: nextRow,\n col: col,\n },\n end: {\n row: lookupRange.range.end.row,\n // Always constrain to this column only in col-major\n col: { type: \"number\", value: col },\n },\n },\n },\n candidates,\n });\n }\n }\n\n // If the lookup range is infinite in columns, emit a final infinite range\n if (lookupRange.range.end.col.type === \"infinity\") {\n // Find candidates for cells beyond the last processed column\n const nextCol = endCol + 1;\n const firstCellInNextCol: CellAddress = {\n rowIndex: startRow,\n colIndex: nextCol,\n sheetName: lookupRange.sheetName,\n workbookName: lookupRange.workbookName,\n };\n\n const candidates = findCandidatesForCell.call(\n this,\n firstCellInNextCol,\n sheet,\n lookupOrder\n );\n\n result.push({\n type: \"empty_range\",\n address: {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: {\n row: startRow,\n col: nextCol,\n },\n end: {\n row: lookupRange.range.end.row,\n col: lookupRange.range.end.col,\n },\n },\n },\n candidates,\n });\n }\n }\n\n return result;\n}\n\n/**\n * Process a single row in row-major order\n */\nfunction processRowMajorRow(\n this: WorkbookManager,\n row: number,\n startCol: number,\n endCol: number,\n lookupRange: RangeAddress,\n occupiedCells: Map<string, CellAddress>,\n sheet: Sheet,\n result: RangeEvalOrderEntry[],\n indexes: SheetIndexes\n): void {\n let col = startCol;\n\n while (col <= endCol) {\n const cellAddr: CellAddress = {\n rowIndex: row,\n colIndex: col,\n sheetName: lookupRange.sheetName,\n workbookName: lookupRange.workbookName,\n };\n const cellRef = getCellReference(cellAddr);\n\n if (occupiedCells.has(cellRef)) {\n // This cell is occupied (has a value or formula)\n result.push({\n type: \"value\",\n address: cellAddr,\n });\n col++;\n } else {\n // This cell is empty - find the contiguous empty range in this row with same candidates\n const emptyRangeStart = col;\n let emptyRangeEnd = endCol;\n\n // Find next occupied cell in this row using binary search (O(log n))\n const rowGroup = indexes.rowGroups.get(row);\n if (rowGroup) {\n // Binary search for the first cell in this row with colIndex > col\n const nextCellIdx = IndexEntryBinarySearch.findFirstGreaterOrEqual(\n rowGroup,\n col + 1\n );\n if (nextCellIdx !== -1) {\n emptyRangeEnd = rowGroup[nextCellIdx]!.number - 1;\n }\n }\n\n // Find ALL unique candidates across the entire empty range\n const allCandidates = findAllCandidatesForRange(\n this,\n {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: { row, col: emptyRangeStart },\n end: {\n row: { type: \"number\", value: row },\n col: { type: \"number\", value: emptyRangeEnd },\n },\n },\n },\n sheet,\n \"row-major\"\n );\n\n // If the empty range is a single cell, emit as empty_cell\n if (emptyRangeStart === emptyRangeEnd) {\n result.push({\n type: \"empty_cell\",\n address: cellAddr,\n candidates: allCandidates,\n });\n } else {\n // Emit as empty_range\n result.push({\n type: \"empty_range\",\n address: {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: {\n row,\n col: emptyRangeStart,\n },\n end: {\n row: { type: \"number\", value: row },\n col: { type: \"number\", value: emptyRangeEnd },\n },\n },\n },\n candidates: allCandidates,\n });\n }\n\n col = emptyRangeEnd + 1;\n }\n }\n}\n\n/**\n * Process a single column in col-major order\n */\nfunction processColMajorColumn(\n this: WorkbookManager,\n col: number,\n startRow: number,\n endRow: number,\n lookupRange: RangeAddress,\n occupiedCells: Map<string, CellAddress>,\n sheet: Sheet,\n result: RangeEvalOrderEntry[],\n indexes: SheetIndexes\n): void {\n let row = startRow;\n\n while (row <= endRow) {\n const cellAddr: CellAddress = {\n rowIndex: row,\n colIndex: col,\n sheetName: lookupRange.sheetName,\n workbookName: lookupRange.workbookName,\n };\n const cellRef = getCellReference(cellAddr);\n\n if (occupiedCells.has(cellRef)) {\n // This cell is occupied (has a value or formula)\n result.push({\n type: \"value\",\n address: cellAddr,\n });\n row++;\n } else {\n // This cell is empty - find the contiguous empty range in this column with same candidates\n const emptyRangeStart = row;\n let emptyRangeEnd = endRow;\n\n // Find next occupied cell in this column using binary search (O(log n))\n const colGroup = indexes.colGroups.get(col);\n if (colGroup) {\n // Binary search for the first cell in this column with rowIndex > row\n const nextCellIdx = IndexEntryBinarySearch.findFirstGreaterOrEqual(\n colGroup,\n row + 1\n );\n if (nextCellIdx !== -1) {\n emptyRangeEnd = colGroup[nextCellIdx]!.number - 1;\n }\n }\n\n // Find ALL unique candidates across the entire empty range\n const allCandidates = findAllCandidatesForRange(\n this,\n {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: { row: emptyRangeStart, col },\n end: {\n row: { type: \"number\", value: emptyRangeEnd },\n col: { type: \"number\", value: col },\n },\n },\n },\n sheet,\n \"col-major\"\n );\n\n // If the empty range is a single cell, emit as empty_cell\n if (emptyRangeStart === emptyRangeEnd) {\n result.push({\n type: \"empty_cell\",\n address: cellAddr,\n candidates: allCandidates,\n });\n } else {\n // Emit as empty_range\n result.push({\n type: \"empty_range\",\n address: {\n workbookName: lookupRange.workbookName,\n sheetName: lookupRange.sheetName,\n range: {\n start: {\n row: emptyRangeStart,\n col,\n },\n end: {\n row: { type: \"number\", value: emptyRangeEnd },\n col: { type: \"number\", value: col },\n },\n },\n },\n candidates: allCandidates,\n });\n }\n\n row = emptyRangeEnd + 1;\n }\n }\n}\n\n/**\n * Find ALL unique candidates that could affect any cell in the given empty range\n * Returns the union of candidates from all cells in the range, sorted deterministically\n */\nfunction findAllCandidatesForRange(\n manager: WorkbookManager,\n emptyRange: RangeAddress,\n sheet: Sheet,\n lookupOrder: LookupOrder\n): CellAddress[] {\n const candidateMap = new Map<string, CellAddress>();\n\n const startRow = emptyRange.range.start.row;\n const startCol = emptyRange.range.start.col;\n const endRow =\n emptyRange.range.end.row.type === \"number\"\n ? emptyRange.range.end.row.value\n : startRow;\n const endCol =\n emptyRange.range.end.col.type === \"number\"\n ? emptyRange.range.end.col.value\n : startCol;\n\n // We need to check positions that could have different candidates:\n // - Different columns might have different \"above\" candidates\n // - Different rows might have different \"left\" candidates\n const positionsToCheck: Array<{ row: number; col: number }> = [];\n\n // For single-row ranges: check each column (different above candidates)\n // For single-column ranges: sample rows efficiently\n // For rectangular ranges: check corners only\n\n if (startRow === endRow) {\n // Single row: check each column (each column might have different above candidates)\n for (let col = startCol; col <= endCol; col++) {\n positionsToCheck.push({ row: startRow, col });\n }\n } else if (startCol === endCol) {\n // Single column: For large ranges, sample rows instead of checking all\n // We check where occupied cells exist, plus endpoints\n const maxSamples = 100; // Performance limit\n const numRows = endRow - startRow + 1;\n\n if (numRows <= maxSamples) {\n // Small range: check every row\n for (let row = startRow; row <= endRow; row++) {\n positionsToCheck.push({ row, col: startCol });\n }\n } else {\n // Large range: sample at occupied cell rows + endpoints\n positionsToCheck.push({ row: startRow, col: startCol }); // First\n positionsToCheck.push({ row: endRow, col: startCol }); // Last\n\n // Add samples at rows where there are occupied cells to the left\n // (these are the rows that might have different left candidates)\n // Use indexes to efficiently find occupied cells instead of nested loop\n const indexes = manager.getSheetIndexes({\n workbookName: emptyRange.workbookName,\n sheetName: emptyRange.sheetName,\n });\n\n const seenRows = new Set<number>();\n for (let c = 0; c < startCol; c++) {\n const colGroup = indexes.colGroups.get(c);\n if (colGroup) {\n // Use binary search to find cells in this column within the row range\n const startIdx = IndexEntryBinarySearch.findFirstGreaterOrEqual(\n colGroup,\n startRow\n );\n if (startIdx !== -1) {\n for (let i = startIdx; i < colGroup.length; i++) {\n const entry = colGroup[i];\n if (!entry || entry.number > endRow) break;\n if (!seenRows.has(entry.number)) {\n seenRows.add(entry.number);\n positionsToCheck.push({ row: entry.number, col: startCol });\n }\n }\n }\n }\n }\n }\n } else {\n // Rectangular range: check corners only for performance\n positionsToCheck.push({ row: startRow, col: startCol }); // Top-left\n positionsToCheck.push({ row: startRow, col: endCol }); // Top-right\n positionsToCheck.push({ row: endRow, col: startCol }); // Bottom-left\n positionsToCheck.push({ row: endRow, col: endCol }); // Bottom-right\n }\n\n // For each position, find candidates\n for (const pos of positionsToCheck) {\n const candidates = findCandidatesForCell.call(\n manager,\n {\n rowIndex: pos.row,\n colIndex: pos.col,\n sheetName: emptyRange.sheetName,\n workbookName: emptyRange.workbookName,\n },\n sheet,\n lookupOrder\n );\n\n for (const cand of candidates) {\n candidateMap.set(getCellReference(cand), cand);\n }\n }\n\n // Return unique candidates, sorted\n return sortCandidates(Array.from(candidateMap.values()), lookupOrder);\n}\n\n/**\n * Find frontier candidates for a single empty cell\n * Returns candidates that could spill into this cell:\n * - If there's a direct left or above candidate, return those (max 2)\n * - Otherwise, return ALL step-pattern diagonal candidates\n * Candidates are sorted deterministically based on lookup order\n */\nfunction findCandidatesForCell(\n this: WorkbookManager,\n cellAddr: CellAddress,\n sheet: Sheet,\n lookupOrder: LookupOrder\n): CellAddress[] {\n // Find nearest-left anchor (same row)\n const leftCandidate = findNearestLeftAnchor.call(this, cellAddr, sheet);\n\n // Find nearest-above anchor (same column)\n const aboveCandidate = findNearestAboveAnchor.call(this, cellAddr, sheet);\n\n // If we have direct candidates (left and/or above), use those\n if (leftCandidate || aboveCandidate) {\n const candidates: CellAddress[] = [];\n if (leftCandidate) candidates.push(leftCandidate);\n if (aboveCandidate) candidates.push(aboveCandidate);\n\n // Sort candidates deterministically based on lookup order\n return sortCandidates(candidates, lookupOrder);\n }\n\n // No direct candidates - find ALL step-pattern diagonal candidates\n const diagonalCandidates = findAllDiagonalStepCandidates.call(\n this,\n cellAddr,\n sheet\n );\n\n // Sort diagonal candidates\n return sortCandidates(diagonalCandidates, lookupOrder);\n}\n\n/**\n * Sort candidates deterministically based on lookup order\n * - Row-major: sort by col first, then row (left-to-right takes priority)\n * - Col-major: sort by row first, then col (top-to-bottom takes priority)\n */\nfunction sortCandidates(\n candidates: CellAddress[],\n lookupOrder: LookupOrder\n): CellAddress[] {\n return candidates.sort((a, b) => {\n if (lookupOrder === \"row-major\") {\n // Row-major: col first, then row\n if (a.colIndex !== b.colIndex) return a.colIndex - b.colIndex;\n return a.rowIndex - b.rowIndex;\n } else {\n // Col-major: row first, then col\n if (a.rowIndex !== b.rowIndex) return a.rowIndex - b.rowIndex;\n return a.colIndex - b.colIndex;\n }\n });\n}\n\n/**\n * Check if two cell addresses refer to the same cell\n */\nfunction isSameCell(a: CellAddress, b: CellAddress): boolean {\n return (\n a.rowIndex === b.rowIndex &&\n a.colIndex === b.colIndex &&\n a.sheetName === b.sheetName &&\n a.workbookName === b.workbookName\n );\n}\n\n/**\n * Find the nearest anchor (formula cell) to the left of the target cell\n * within the same row\n * Only finds cells with formulas (starting with \"=\")\n * Searches both inside and outside the lookup range boundaries\n * OPTIMIZED: Uses indexes to avoid O(n) scan\n */\nfunction findNearestLeftAnchor(\n this: WorkbookManager,\n targetCell: CellAddress,\n sheet: Sheet\n): CellAddress | null {\n const row = targetCell.rowIndex;\n const targetCol = targetCell.colIndex;\n\n // Use indexes to get cells in this row (O(1) lookup + O(cells_in_row) scan)\n const indexes = this.getSheetIndexes({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n\n const rowGroup = indexes.rowGroups.get(row);\n if (!rowGroup) {\n return null; // No cells in this row\n }\n\n // Search backwards through the sorted array to find nearest left formula\n // rowGroup is sorted by column index\n for (let i = rowGroup.length - 1; i >= 0; i--) {\n const entry = rowGroup[i];\n if (!entry || entry.number >= targetCol) {\n continue; // Skip cells at or right of target\n }\n\n const content = sheet.content.get(entry.key);\n // Only consider formula cells (starting with \"=\")\n if (typeof content === \"string\" && content.startsWith(\"=\")) {\n return {\n rowIndex: row,\n colIndex: entry.number,\n sheetName: targetCell.sheetName,\n workbookName: targetCell.workbookName,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Find the nearest anchor (formula cell) above the target cell\n * within the same column\n * Only finds cells with formulas (starting with \"=\")\n * Searches outside the lookup range boundaries\n * OPTIMIZED: Uses indexes to avoid O(n) scan\n */\nfunction findNearestAboveAnchor(\n this: WorkbookManager,\n targetCell: CellAddress,\n sheet: Sheet\n): CellAddress | null {\n const col = targetCell.colIndex;\n const targetRow = targetCell.rowIndex;\n\n // Use indexes to get cells in this column (O(1) lookup + O(cells_in_col) scan)\n const indexes = this.getSheetIndexes({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n\n const colGroup = indexes.colGroups.get(col);\n if (!colGroup) {\n return null; // No cells in this column\n }\n\n // Search backwards through the sorted array to find nearest above formula\n // colGroup is sorted by row index\n for (let i = colGroup.length - 1; i >= 0; i--) {\n const entry = colGroup[i];\n if (!entry || entry.number >= targetRow) {\n continue; // Skip cells at or below target\n }\n\n const content = sheet.content.get(entry.key);\n // Only consider formula cells (starting with \"=\")\n if (typeof content === \"string\" && content.startsWith(\"=\")) {\n return {\n rowIndex: entry.number,\n colIndex: col,\n sheetName: targetCell.sheetName,\n workbookName: targetCell.workbookName,\n };\n }\n }\n\n return null;\n}\n\n/**\n * Find ALL step-pattern candidates in the top-left diagonal quadrant\n * These are formulas that could spill diagonally to reach the target cell\n * and don't block each other (forming a \"staircase\" pattern)\n * Searches outside the lookup range boundaries (like direct left/above search)\n * OPTIMIZED: Uses indexes to avoid O(n²) scan\n *\n * For example, for target D7, candidates might be A6, B5, C4\n * - A6 at (5,0) could spill right and down to reach D7\n * - B5 at (4,1) could spill right and down to reach D7\n * - C4 at (3,2) could spill right and down to reach D7\n * - None blocks the others because each is further from origin (A1)\n */\nfunction findAllDiagonalStepCandidates(\n this: WorkbookManager,\n targetCell: CellAddress,\n sheet: Sheet\n): CellAddress[] {\n const targetRow = targetCell.rowIndex;\n const targetCol = targetCell.colIndex;\n\n // Use indexes to efficiently find all formula cells in the top-left quadrant\n const allCandidates: CellAddress[] = [];\n\n const indexes = this.getSheetIndexes({\n workbookName: targetCell.workbookName,\n sheetName: targetCell.sheetName,\n });\n\n // Iterate only through columns that exist in the top-left quadrant\n for (let col = 0; col < targetCol; col++) {\n const colGroup = indexes.colGroups.get(col);\n if (!colGroup) {\n continue; // No cells in this column\n }\n\n // For each cell in this column, check if it's above target row and is a formula\n for (const entry of colGroup) {\n if (entry.number >= targetRow) {\n break; // Cells are sorted by row, so we can stop early\n }\n\n const content = sheet.content.get(entry.key);\n // Only consider formula cells (starting with \"=\")\n if (typeof content === \"string\" && content.startsWith(\"=\")) {\n allCandidates.push({\n rowIndex: entry.number,\n colIndex: col,\n sheetName: targetCell.sheetName,\n workbookName: targetCell.workbookName,\n });\n }\n }\n }\n\n // Filter out candidates that are blocked by other candidates\n // OPTIMIZED: O(n log n) instead of O(n²) using sweep-line algorithm\n //\n // A candidate at (r1, c1) is blocked by another at (r2, c2) if:\n // - r2 >= r1 AND c2 >= c1 (other is at same position or down-right)\n // - This is a 2D dominance problem: find Pareto frontier (undominated points)\n //\n // Algorithm:\n // 1. Sort candidates by row DESCENDING, then col DESCENDING\n // 2. Sweep through, tracking MAXIMUM column seen so far\n // 3. A candidate is unblocked if its col > max col seen\n // 4. For same-row candidates, only the first (largest col) can be unblocked\n\n // Sort by row descending, then col descending\n allCandidates.sort((a, b) => {\n if (a.rowIndex !== b.rowIndex) return b.rowIndex - a.rowIndex; // descending\n return b.colIndex - a.colIndex; // descending\n });\n\n const unblockedCandidates: CellAddress[] = [];\n let maxColSeen = -1;\n let prevRow = -1;\n\n for (const candidate of allCandidates) {\n // First candidate in each row: check if undominated by candidates in rows above\n // Subsequent candidates in same row: dominated by first in row (larger col)\n if (candidate.rowIndex !== prevRow) {\n // New row - check if this candidate's col > max col from rows above\n if (candidate.colIndex > maxColSeen) {\n unblockedCandidates.push(candidate);\n maxColSeen = candidate.colIndex;\n }\n prevRow = candidate.rowIndex;\n }\n // Else: same row as previous, dominated by previous (which had larger col)\n }\n\n return unblockedCandidates;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "5275BD56EBC306E164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/core/managers/table-manager.ts
|
|
30
|
+
var exports_table_manager = {};
|
|
31
|
+
__export(exports_table_manager, {
|
|
32
|
+
TableManager: () => TableManager
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(exports_table_manager);
|
|
35
|
+
var import_utils = require("../utils.cjs");
|
|
36
|
+
|
|
37
|
+
class TableManager {
|
|
38
|
+
tables = new Map;
|
|
39
|
+
workbookManager;
|
|
40
|
+
constructor(workbookManager) {
|
|
41
|
+
this.workbookManager = workbookManager;
|
|
42
|
+
}
|
|
43
|
+
getTables(workbookName) {
|
|
44
|
+
return this.tables.get(workbookName) ?? new Map;
|
|
45
|
+
}
|
|
46
|
+
getTable(opts) {
|
|
47
|
+
return this.tables.get(opts.workbookName)?.get(opts.name);
|
|
48
|
+
}
|
|
49
|
+
makeTable({
|
|
50
|
+
tableName,
|
|
51
|
+
sheetName,
|
|
52
|
+
workbookName,
|
|
53
|
+
start,
|
|
54
|
+
numRows,
|
|
55
|
+
numCols,
|
|
56
|
+
getCellValue
|
|
57
|
+
}) {
|
|
58
|
+
const { rowIndex, colIndex } = import_utils.parseCellReference(start);
|
|
59
|
+
const headers = new Map;
|
|
60
|
+
for (let i = 0;i < numCols; i++) {
|
|
61
|
+
const header = getCellValue({
|
|
62
|
+
rowIndex,
|
|
63
|
+
colIndex: colIndex + i,
|
|
64
|
+
sheetName,
|
|
65
|
+
workbookName
|
|
66
|
+
});
|
|
67
|
+
if (header) {
|
|
68
|
+
headers.set(String(header), { name: String(header), index: i });
|
|
69
|
+
} else {
|
|
70
|
+
headers.set(`Column ${i + 1}`, { name: `Column ${i + 1}`, index: i });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const endRow = numRows.type === "number" ? { type: "number", value: rowIndex + numRows.value } : numRows;
|
|
74
|
+
const table = {
|
|
75
|
+
name: tableName,
|
|
76
|
+
sheetName,
|
|
77
|
+
workbookName,
|
|
78
|
+
start: {
|
|
79
|
+
rowIndex,
|
|
80
|
+
colIndex
|
|
81
|
+
},
|
|
82
|
+
headers,
|
|
83
|
+
endRow
|
|
84
|
+
};
|
|
85
|
+
return table;
|
|
86
|
+
}
|
|
87
|
+
copyTable(from, to) {
|
|
88
|
+
const fromTable = this.getTable({
|
|
89
|
+
workbookName: from.workbookName,
|
|
90
|
+
name: from.tableName
|
|
91
|
+
});
|
|
92
|
+
if (!fromTable) {
|
|
93
|
+
throw new Error("Table not found");
|
|
94
|
+
}
|
|
95
|
+
const wb = this.tables.get(to.workbookName);
|
|
96
|
+
if (!wb) {
|
|
97
|
+
throw new Error("Workbook not found");
|
|
98
|
+
}
|
|
99
|
+
const newTable = {
|
|
100
|
+
...fromTable,
|
|
101
|
+
workbookName: to.workbookName
|
|
102
|
+
};
|
|
103
|
+
wb.set(to.tableName, newTable);
|
|
104
|
+
}
|
|
105
|
+
addTable(props) {
|
|
106
|
+
const tableName = props.tableName;
|
|
107
|
+
const table = this.makeTable(props);
|
|
108
|
+
let wb = this.tables.get(props.workbookName);
|
|
109
|
+
if (!wb) {
|
|
110
|
+
wb = new Map;
|
|
111
|
+
this.tables.set(props.workbookName, wb);
|
|
112
|
+
}
|
|
113
|
+
wb.set(tableName, table);
|
|
114
|
+
return table;
|
|
115
|
+
}
|
|
116
|
+
renameTable(workbookName, names) {
|
|
117
|
+
const wb = this.tables.get(workbookName);
|
|
118
|
+
if (!wb) {
|
|
119
|
+
throw new Error("Workbook not found");
|
|
120
|
+
}
|
|
121
|
+
const table = wb.get(names.oldName);
|
|
122
|
+
if (!table) {
|
|
123
|
+
throw new Error("Table not found");
|
|
124
|
+
}
|
|
125
|
+
table.name = names.newName;
|
|
126
|
+
wb.set(names.newName, table);
|
|
127
|
+
wb.delete(names.oldName);
|
|
128
|
+
}
|
|
129
|
+
updateTable({
|
|
130
|
+
tableName,
|
|
131
|
+
sheetName,
|
|
132
|
+
start,
|
|
133
|
+
numRows,
|
|
134
|
+
numCols,
|
|
135
|
+
workbookName,
|
|
136
|
+
getCellValue
|
|
137
|
+
}) {
|
|
138
|
+
const wb = this.tables.get(workbookName);
|
|
139
|
+
if (!wb) {
|
|
140
|
+
throw new Error("Workbook not found");
|
|
141
|
+
}
|
|
142
|
+
const table = wb.get(tableName);
|
|
143
|
+
if (!table) {
|
|
144
|
+
throw new Error("Table not found");
|
|
145
|
+
}
|
|
146
|
+
const newStart = start ? import_utils.parseCellReference(start) : table.start;
|
|
147
|
+
let newNumRows;
|
|
148
|
+
if (numRows) {
|
|
149
|
+
newNumRows = numRows;
|
|
150
|
+
} else {
|
|
151
|
+
if (table.endRow.type === "infinity") {
|
|
152
|
+
newNumRows = table.endRow;
|
|
153
|
+
} else {
|
|
154
|
+
newNumRows = {
|
|
155
|
+
type: "number",
|
|
156
|
+
value: table.endRow.value - newStart.rowIndex
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const newTable = this.makeTable({
|
|
161
|
+
tableName,
|
|
162
|
+
sheetName: sheetName ?? table.sheetName,
|
|
163
|
+
workbookName: workbookName ?? table.workbookName,
|
|
164
|
+
start: import_utils.getCellReference(newStart),
|
|
165
|
+
numRows: newNumRows,
|
|
166
|
+
numCols: numCols ?? table.headers.size,
|
|
167
|
+
getCellValue
|
|
168
|
+
});
|
|
169
|
+
wb.set(tableName, newTable);
|
|
170
|
+
}
|
|
171
|
+
removeTable({
|
|
172
|
+
tableName,
|
|
173
|
+
workbookName
|
|
174
|
+
}) {
|
|
175
|
+
const wb = this.tables.get(workbookName);
|
|
176
|
+
if (!wb) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
const found = wb.delete(tableName);
|
|
180
|
+
return found;
|
|
181
|
+
}
|
|
182
|
+
updateTablesForSheetRename(options) {
|
|
183
|
+
const wb = this.tables.get(options.workbookName);
|
|
184
|
+
if (!wb) {
|
|
185
|
+
throw new Error("Workbook not found");
|
|
186
|
+
}
|
|
187
|
+
wb.forEach((table) => {
|
|
188
|
+
if (table.sheetName === options.sheetName) {
|
|
189
|
+
table.sheetName = options.newSheetName;
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
updateTablesForWorkbookRename(options) {
|
|
194
|
+
const wb = this.tables.get(options.workbookName);
|
|
195
|
+
if (!wb) {
|
|
196
|
+
throw new Error("Workbook not found");
|
|
197
|
+
}
|
|
198
|
+
this.tables.set(options.newWorkbookName, wb);
|
|
199
|
+
this.tables.delete(options.workbookName);
|
|
200
|
+
wb.forEach((table, tableName) => {
|
|
201
|
+
if (table.workbookName === options.workbookName) {
|
|
202
|
+
table.workbookName = options.newWorkbookName;
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
resetTables(newTables) {
|
|
207
|
+
this.tables.clear();
|
|
208
|
+
newTables.forEach((table, workbookName) => {
|
|
209
|
+
table.forEach((table2, tableName) => {
|
|
210
|
+
let wb = this.tables.get(workbookName);
|
|
211
|
+
if (!wb) {
|
|
212
|
+
wb = new Map;
|
|
213
|
+
this.tables.set(workbookName, wb);
|
|
214
|
+
}
|
|
215
|
+
wb.set(tableName, table2);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
addWorkbook(workbookName) {
|
|
220
|
+
this.tables.set(workbookName, new Map);
|
|
221
|
+
}
|
|
222
|
+
removeWorkbook(workbookName) {
|
|
223
|
+
this.tables.delete(workbookName);
|
|
224
|
+
}
|
|
225
|
+
removeSheet(opts) {
|
|
226
|
+
const wb = this.tables.get(opts.workbookName);
|
|
227
|
+
if (!wb) {
|
|
228
|
+
throw new Error("Workbook not found");
|
|
229
|
+
}
|
|
230
|
+
wb.forEach((table, tableName) => {
|
|
231
|
+
if (table.sheetName === opts.sheetName) {
|
|
232
|
+
wb.delete(tableName);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
isCellInTable(cellAddress) {
|
|
237
|
+
const { rowIndex, colIndex } = cellAddress;
|
|
238
|
+
for (const table of this.getTables(cellAddress.workbookName).values()) {
|
|
239
|
+
if (table.sheetName !== cellAddress.sheetName) {
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const { start, endRow, headers } = table;
|
|
243
|
+
const isInRowRange = endRow.type === "infinity" ? rowIndex >= start.rowIndex : rowIndex >= start.rowIndex && rowIndex <= endRow.value;
|
|
244
|
+
const endColIndex = start.colIndex + headers.size - 1;
|
|
245
|
+
const isInColRange = colIndex >= start.colIndex && colIndex <= endColIndex;
|
|
246
|
+
if (isInRowRange && isInColRange) {
|
|
247
|
+
return table;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
//# debugId=5C5A599D56EF171D64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/core/managers/table-manager.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type {\n CellAddress,\n SerializedCellValue,\n SpreadsheetRangeEnd,\n TableDefinition,\n} from \"../types.cjs\";\nimport { getCellReference, parseCellReference } from \"../utils.cjs\";\nimport type { WorkbookManager } from \"./workbook-manager.cjs\";\n\nexport class TableManager {\n tables: Map<\n /**\n * workbook name -> table name -> table definition\n */\n string,\n Map<string, TableDefinition>\n > = new Map();\n private workbookManager: WorkbookManager;\n\n constructor(workbookManager: WorkbookManager) {\n this.workbookManager = workbookManager;\n }\n\n getTables(workbookName: string): Map<string, TableDefinition> {\n return this.tables.get(workbookName) ?? new Map();\n }\n\n getTable(opts: {\n workbookName: string;\n name: string;\n }): TableDefinition | undefined {\n return this.tables.get(opts.workbookName)?.get(opts.name);\n }\n\n makeTable({\n tableName,\n sheetName,\n workbookName,\n start,\n numRows,\n numCols,\n getCellValue,\n }: {\n tableName: string;\n sheetName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n workbookName: string;\n getCellValue: (cellAddress: CellAddress) => SerializedCellValue;\n }): TableDefinition {\n const { rowIndex, colIndex } = parseCellReference(start);\n\n const headers = new Map<string, { name: string; index: number }>();\n for (let i = 0; i < numCols; i++) {\n const header = getCellValue({\n rowIndex,\n colIndex: colIndex + i,\n sheetName,\n workbookName,\n });\n\n if (header) {\n headers.set(String(header), { name: String(header), index: i });\n } else {\n headers.set(`Column ${i + 1}`, { name: `Column ${i + 1}`, index: i });\n }\n }\n\n const endRow: SpreadsheetRangeEnd =\n numRows.type === \"number\"\n ? { type: \"number\", value: rowIndex + numRows.value }\n : numRows;\n\n const table: TableDefinition = {\n name: tableName,\n sheetName,\n workbookName,\n start: {\n rowIndex,\n colIndex,\n },\n headers,\n endRow,\n };\n\n return table;\n }\n\n copyTable(\n from: {\n workbookName: string;\n tableName: string;\n },\n to: {\n workbookName: string;\n tableName: string;\n }\n ): void {\n const fromTable = this.getTable({\n workbookName: from.workbookName,\n name: from.tableName,\n });\n if (!fromTable) {\n throw new Error(\"Table not found\");\n }\n const wb = this.tables.get(to.workbookName);\n if (!wb) {\n throw new Error(\"Workbook not found\");\n }\n const newTable: TableDefinition = {\n ...fromTable,\n workbookName: to.workbookName,\n };\n wb.set(to.tableName, newTable);\n }\n\n addTable(props: {\n tableName: string;\n sheetName: string;\n start: string;\n numRows: SpreadsheetRangeEnd;\n numCols: number;\n workbookName: string;\n getCellValue: (cellAddress: CellAddress) => SerializedCellValue;\n }): TableDefinition {\n const tableName = props.tableName;\n const table = this.makeTable(props);\n\n let wb = this.tables.get(props.workbookName);\n if (!wb) {\n wb = new Map();\n this.tables.set(props.workbookName, wb);\n }\n\n wb.set(tableName, table);\n\n return table;\n }\n\n renameTable(\n workbookName: string,\n names: { oldName: string; newName: string }\n ): void {\n const wb = this.tables.get(workbookName);\n if (!wb) {\n throw new Error(\"Workbook not found\");\n }\n const table = wb.get(names.oldName);\n if (!table) {\n throw new Error(\"Table not found\");\n }\n table.name = names.newName;\n wb.set(names.newName, table);\n wb.delete(names.oldName);\n }\n\n updateTable({\n tableName,\n sheetName,\n start,\n numRows,\n numCols,\n workbookName,\n getCellValue,\n }: {\n tableName: string;\n sheetName?: string;\n start?: string;\n numRows?: SpreadsheetRangeEnd;\n workbookName: string;\n numCols?: number;\n getCellValue: (cellAddress: CellAddress) => SerializedCellValue;\n }): void {\n const wb = this.tables.get(workbookName);\n if (!wb) {\n throw new Error(\"Workbook not found\");\n }\n\n const table = wb.get(tableName);\n if (!table) {\n throw new Error(\"Table not found\");\n }\n\n const newStart = start ? parseCellReference(start) : table.start;\n\n let newNumRows: SpreadsheetRangeEnd;\n if (numRows) {\n newNumRows = numRows;\n } else {\n if (table.endRow.type === \"infinity\") {\n newNumRows = table.endRow;\n } else {\n newNumRows = {\n type: \"number\",\n value: table.endRow.value - newStart.rowIndex,\n };\n }\n }\n\n const newTable = this.makeTable({\n tableName,\n sheetName: sheetName ?? table.sheetName,\n workbookName: workbookName ?? table.workbookName,\n start: getCellReference(newStart),\n numRows: newNumRows,\n numCols: numCols ?? table.headers.size,\n getCellValue,\n });\n\n wb.set(tableName, newTable);\n }\n\n removeTable({\n tableName,\n workbookName,\n }: {\n tableName: string;\n workbookName: string;\n }): boolean {\n const wb = this.tables.get(workbookName);\n if (!wb) {\n return false;\n }\n const found = wb.delete(tableName);\n\n return found;\n }\n\n updateTablesForSheetRename(options: {\n sheetName: string;\n newSheetName: string;\n workbookName: string;\n }): void {\n // Update tables that belong to the renamed sheet\n const wb = this.tables.get(options.workbookName);\n if (!wb) {\n throw new Error(\"Workbook not found\");\n }\n\n wb.forEach((table) => {\n if (table.sheetName === options.sheetName) {\n table.sheetName = options.newSheetName;\n }\n });\n }\n\n updateTablesForWorkbookRename(options: {\n workbookName: string;\n newWorkbookName: string;\n }): void {\n const wb = this.tables.get(options.workbookName);\n if (!wb) {\n throw new Error(\"Workbook not found\");\n }\n this.tables.set(options.newWorkbookName, wb);\n this.tables.delete(options.workbookName);\n // Update tables that belong to the renamed sheet\n wb.forEach((table, tableName) => {\n if (table.workbookName === options.workbookName) {\n table.workbookName = options.newWorkbookName;\n }\n });\n }\n\n resetTables(newTables: Map<string, Map<string, TableDefinition>>): void {\n // Clear existing tables without breaking the Map reference\n this.tables.clear();\n\n // Repopulate with new tables\n newTables.forEach((table, workbookName) => {\n table.forEach((table, tableName) => {\n let wb = this.tables.get(workbookName);\n if (!wb) {\n wb = new Map();\n this.tables.set(workbookName, wb);\n }\n wb.set(tableName, table);\n });\n });\n }\n\n /**\n * When adding a workbook, we need to initialize the new maps\n */\n addWorkbook(workbookName: string) {\n this.tables.set(workbookName, new Map());\n }\n\n /**\n * When removing a workbook, we need to remove the maps\n */\n removeWorkbook(workbookName: string) {\n this.tables.delete(workbookName);\n }\n\n /**\n * When removing a sheet, we need to remove the tables that belong to the sheet\n */\n removeSheet(opts: { sheetName: string; workbookName: string }): void {\n // Remove tables that belong to the removed sheet\n const wb = this.tables.get(opts.workbookName);\n if (!wb) {\n throw new Error(\"Workbook not found\");\n }\n wb.forEach((table, tableName) => {\n if (table.sheetName === opts.sheetName) {\n wb.delete(tableName);\n }\n });\n }\n\n isCellInTable(cellAddress: CellAddress): TableDefinition | undefined {\n const { rowIndex, colIndex } = cellAddress;\n\n // Get all tables for this sheet\n\n for (const table of this.getTables(cellAddress.workbookName).values()) {\n // Check each table to see if the cell is within its bounds\n if (table.sheetName !== cellAddress.sheetName) {\n continue;\n }\n\n const { start, endRow, headers } = table;\n\n // Check row bounds\n const isInRowRange =\n endRow.type === \"infinity\"\n ? rowIndex >= start.rowIndex\n : rowIndex >= start.rowIndex && rowIndex <= endRow.value;\n\n // Check column bounds\n const endColIndex = start.colIndex + headers.size - 1;\n const isInColRange =\n colIndex >= start.colIndex && colIndex <= endColIndex;\n\n if (isInRowRange && isInColRange) {\n return table;\n }\n }\n\n return undefined;\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "5C5A599D56EF171D64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|