@ricsam/formula-engine 0.0.3 → 0.0.5
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/dist/cjs/core/engine.cjs +12 -8
- package/dist/cjs/core/engine.cjs.map +3 -3
- package/dist/cjs/core/managers/dependency-manager.cjs +8 -8
- package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
- package/dist/cjs/core/managers/evaluation-manager.cjs +10 -10
- package/dist/cjs/core/managers/evaluation-manager.cjs.map +2 -2
- package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +1 -1
- package/dist/cjs/core/managers/isDependencyNode.cjs +6 -6
- package/dist/cjs/core/managers/isDependencyNode.cjs.map +2 -2
- package/dist/cjs/core/managers/named-expression-manager.cjs.map +1 -1
- package/dist/cjs/core/managers/range-eval-order-builder.cjs +2 -2
- package/dist/cjs/core/managers/range-eval-order-builder.cjs.map +3 -3
- package/dist/cjs/core/managers/workbook-manager.cjs +3 -3
- package/dist/cjs/core/managers/workbook-manager.cjs.map +2 -2
- package/dist/cjs/core/types.cjs.map +2 -2
- package/dist/cjs/core/utils.cjs +2 -2
- package/dist/cjs/core/utils.cjs.map +2 -2
- package/dist/cjs/evaluator/arithmetic/add/add.cjs +2 -2
- package/dist/cjs/evaluator/arithmetic/add/add.cjs.map +2 -2
- package/dist/cjs/evaluator/arithmetic/divide/divide.cjs +2 -2
- package/dist/cjs/evaluator/arithmetic/divide/divide.cjs.map +2 -2
- package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs +2 -2
- package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs.map +2 -2
- package/dist/cjs/evaluator/arithmetic/power/power.cjs +2 -2
- package/dist/cjs/evaluator/arithmetic/power/power.cjs.map +2 -2
- package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs +2 -2
- package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs.map +2 -2
- package/dist/cjs/evaluator/comparison/equals.cjs.map +1 -1
- package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs +2 -2
- package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs.map +2 -2
- package/dist/cjs/evaluator/comparison/greater-than.cjs +2 -2
- package/dist/cjs/evaluator/comparison/greater-than.cjs.map +2 -2
- package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs +2 -2
- package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs.map +2 -2
- package/dist/cjs/evaluator/comparison/less-than.cjs +2 -2
- package/dist/cjs/evaluator/comparison/less-than.cjs.map +2 -2
- package/dist/cjs/evaluator/comparison/not-equals.cjs +2 -2
- package/dist/cjs/evaluator/comparison/not-equals.cjs.map +2 -2
- package/dist/cjs/evaluator/concatenation/concatenate.cjs +2 -2
- package/dist/cjs/evaluator/concatenation/concatenate.cjs.map +2 -2
- package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs +2 -2
- package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs.map +2 -2
- package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs.map +2 -2
- package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs +2 -2
- package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs.map +2 -2
- package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs +3 -3
- package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs.map +2 -2
- package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs +2 -2
- package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs.map +2 -2
- package/dist/cjs/evaluator/evaluate-scalar-operator.cjs.map +1 -1
- package/dist/cjs/evaluator/evaluation-context.cjs.map +2 -2
- package/dist/cjs/evaluator/evaluation-error.cjs.map +1 -1
- package/dist/cjs/evaluator/formula-evaluator.cjs +6 -6
- package/dist/cjs/evaluator/formula-evaluator.cjs.map +3 -3
- package/dist/cjs/evaluator/range-evaluation-node.cjs +3 -3
- package/dist/cjs/evaluator/range-evaluation-node.cjs.map +2 -2
- package/dist/cjs/functions/_template/template.cjs.map +1 -1
- package/dist/cjs/functions/array/sequence/sequence.cjs +4 -4
- package/dist/cjs/functions/array/sequence/sequence.cjs.map +2 -2
- package/dist/cjs/functions/criteria-parser.cjs.map +1 -1
- package/dist/cjs/functions/criteria-utils.cjs +4 -4
- package/dist/cjs/functions/criteria-utils.cjs.map +3 -3
- package/dist/cjs/functions/{index.cjs → function-registry.cjs} +5 -5
- package/dist/cjs/functions/function-registry.cjs.map +10 -0
- package/dist/cjs/functions/function-utils.cjs.map +1 -1
- package/dist/cjs/functions/information/cell/cell.cjs +3 -3
- package/dist/cjs/functions/information/cell/cell.cjs.map +2 -2
- package/dist/cjs/functions/information/column/column.cjs +4 -4
- package/dist/cjs/functions/information/column/column.cjs.map +2 -2
- package/dist/cjs/functions/information/row/row.cjs +4 -4
- package/dist/cjs/functions/information/row/row.cjs.map +2 -2
- package/dist/cjs/functions/logical/and/and.cjs +2 -2
- package/dist/cjs/functions/logical/and/and.cjs.map +2 -2
- package/dist/cjs/functions/logical/if/if.cjs +2 -2
- package/dist/cjs/functions/logical/if/if.cjs.map +3 -3
- package/dist/cjs/functions/logical/iferror/iferror.cjs +3 -3
- package/dist/cjs/functions/logical/iferror/iferror.cjs.map +2 -2
- package/dist/cjs/functions/logical/or/or.cjs +2 -2
- package/dist/cjs/functions/logical/or/or.cjs.map +2 -2
- package/dist/cjs/functions/lookup/count/count-utils.cjs.map +1 -1
- package/dist/cjs/functions/lookup/count/count.cjs +2 -2
- package/dist/cjs/functions/lookup/count/count.cjs.map +2 -2
- package/dist/cjs/functions/lookup/count/countif.cjs +2 -2
- package/dist/cjs/functions/lookup/count/countif.cjs.map +2 -2
- package/dist/cjs/functions/lookup/count/countifs.cjs.map +1 -1
- package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs +2 -2
- package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs.map +2 -2
- package/dist/cjs/functions/lookup/match/match.cjs +2 -2
- package/dist/cjs/functions/lookup/match/match.cjs.map +2 -2
- package/dist/cjs/functions/lookup/xlookup/xlookup.cjs +2 -2
- package/dist/cjs/functions/lookup/xlookup/xlookup.cjs.map +2 -2
- package/dist/cjs/functions/math/average/average-utils.cjs +2 -2
- package/dist/cjs/functions/math/average/average-utils.cjs.map +2 -2
- package/dist/cjs/functions/math/average/average.cjs +2 -2
- package/dist/cjs/functions/math/average/average.cjs.map +2 -2
- package/dist/cjs/functions/math/average/averageif.cjs +3 -3
- package/dist/cjs/functions/math/average/averageif.cjs.map +3 -3
- package/dist/cjs/functions/math/average/averageifs.cjs.map +2 -2
- package/dist/cjs/functions/math/ceiling/ceiling.cjs +2 -2
- package/dist/cjs/functions/math/ceiling/ceiling.cjs.map +3 -3
- package/dist/cjs/functions/math/max/max-utils.cjs +2 -2
- package/dist/cjs/functions/math/max/max-utils.cjs.map +2 -2
- package/dist/cjs/functions/math/max/max.cjs +2 -2
- package/dist/cjs/functions/math/max/max.cjs.map +2 -2
- package/dist/cjs/functions/math/max/maxif.cjs +2 -2
- package/dist/cjs/functions/math/max/maxif.cjs.map +2 -2
- package/dist/cjs/functions/math/max/maxifs.cjs.map +2 -2
- package/dist/cjs/functions/math/min/min-utils.cjs +2 -2
- package/dist/cjs/functions/math/min/min-utils.cjs.map +2 -2
- package/dist/cjs/functions/math/min/min.cjs +2 -2
- package/dist/cjs/functions/math/min/min.cjs.map +3 -3
- package/dist/cjs/functions/math/min/minif.cjs +2 -2
- package/dist/cjs/functions/math/min/minif.cjs.map +2 -2
- package/dist/cjs/functions/math/min/minifs.cjs.map +2 -2
- package/dist/cjs/functions/math/sum/sum.cjs +2 -2
- package/dist/cjs/functions/math/sum/sum.cjs.map +2 -2
- package/dist/cjs/functions/math/sum/sumif.cjs +2 -2
- package/dist/cjs/functions/math/sum/sumif.cjs.map +2 -2
- package/dist/cjs/functions/math/sum/sumifs.cjs.map +2 -2
- package/dist/cjs/functions/math/sum/summation-utils.cjs.map +1 -1
- package/dist/cjs/functions/reference/address/address.cjs +2 -2
- package/dist/cjs/functions/reference/address/address.cjs.map +2 -2
- package/dist/cjs/functions/reference/indirect/indirect.cjs +3 -3
- package/dist/cjs/functions/reference/indirect/indirect.cjs.map +3 -3
- package/dist/cjs/functions/reference/offset/offset.cjs +3 -3
- package/dist/cjs/functions/reference/offset/offset.cjs.map +2 -2
- package/dist/cjs/functions/text/concatenate/concatenate.cjs +2 -2
- package/dist/cjs/functions/text/concatenate/concatenate.cjs.map +2 -2
- package/dist/cjs/functions/text/exact/exact.cjs +2 -2
- package/dist/cjs/functions/text/exact/exact.cjs.map +2 -2
- package/dist/cjs/functions/text/find/find.cjs +2 -2
- package/dist/cjs/functions/text/find/find.cjs.map +3 -3
- package/dist/cjs/functions/text/left/left.cjs +2 -2
- package/dist/cjs/functions/text/left/left.cjs.map +2 -2
- package/dist/cjs/functions/text/len/len.cjs +2 -2
- package/dist/cjs/functions/text/len/len.cjs.map +3 -3
- package/dist/cjs/functions/text/mid/mid.cjs +2 -2
- package/dist/cjs/functions/text/mid/mid.cjs.map +2 -2
- package/dist/cjs/functions/text/right/right.cjs +2 -2
- package/dist/cjs/functions/text/right/right.cjs.map +3 -3
- package/dist/cjs/functions/text/text-helpers.cjs +2 -2
- package/dist/cjs/functions/text/text-helpers.cjs.map +2 -2
- package/dist/cjs/functions/text/textjoin/textjoin.cjs +2 -2
- package/dist/cjs/functions/text/textjoin/textjoin.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/parser/formatter.cjs +2 -2
- package/dist/cjs/parser/formatter.cjs.map +2 -2
- package/dist/mjs/core/engine.mjs +7 -9
- package/dist/mjs/core/engine.mjs.map +3 -3
- package/dist/mjs/core/managers/dependency-manager.mjs +8 -8
- package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
- package/dist/mjs/core/managers/evaluation-manager.mjs +10 -10
- package/dist/mjs/core/managers/evaluation-manager.mjs.map +2 -2
- package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +1 -1
- package/dist/mjs/core/managers/isDependencyNode.mjs +6 -6
- package/dist/mjs/core/managers/isDependencyNode.mjs.map +2 -2
- package/dist/mjs/core/managers/named-expression-manager.mjs.map +1 -1
- package/dist/mjs/core/managers/range-eval-order-builder.mjs +2 -2
- package/dist/mjs/core/managers/range-eval-order-builder.mjs.map +3 -3
- package/dist/mjs/core/managers/workbook-manager.mjs +3 -3
- package/dist/mjs/core/managers/workbook-manager.mjs.map +2 -2
- package/dist/mjs/core/types.mjs.map +2 -2
- package/dist/mjs/core/utils.mjs +2 -2
- package/dist/mjs/core/utils.mjs.map +2 -2
- package/dist/mjs/evaluator/arithmetic/add/add.mjs +2 -2
- package/dist/mjs/evaluator/arithmetic/add/add.mjs.map +2 -2
- package/dist/mjs/evaluator/arithmetic/divide/divide.mjs +2 -2
- package/dist/mjs/evaluator/arithmetic/divide/divide.mjs.map +2 -2
- package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs +2 -2
- package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs.map +2 -2
- package/dist/mjs/evaluator/arithmetic/power/power.mjs +2 -2
- package/dist/mjs/evaluator/arithmetic/power/power.mjs.map +2 -2
- package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs +2 -2
- package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs.map +2 -2
- package/dist/mjs/evaluator/comparison/equals.mjs.map +1 -1
- package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs +2 -2
- package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs.map +2 -2
- package/dist/mjs/evaluator/comparison/greater-than.mjs +2 -2
- package/dist/mjs/evaluator/comparison/greater-than.mjs.map +2 -2
- package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs +2 -2
- package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs.map +2 -2
- package/dist/mjs/evaluator/comparison/less-than.mjs +2 -2
- package/dist/mjs/evaluator/comparison/less-than.mjs.map +2 -2
- package/dist/mjs/evaluator/comparison/not-equals.mjs +2 -2
- package/dist/mjs/evaluator/comparison/not-equals.mjs.map +2 -2
- package/dist/mjs/evaluator/concatenation/concatenate.mjs +2 -2
- package/dist/mjs/evaluator/concatenation/concatenate.mjs.map +2 -2
- package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs +2 -2
- package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs.map +2 -2
- package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs.map +2 -2
- package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs +2 -2
- package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs.map +2 -2
- package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs +3 -3
- package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs.map +2 -2
- package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs +2 -2
- package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs.map +2 -2
- package/dist/mjs/evaluator/evaluate-scalar-operator.mjs.map +1 -1
- package/dist/mjs/evaluator/evaluation-context.mjs.map +2 -2
- package/dist/mjs/evaluator/evaluation-error.mjs.map +1 -1
- package/dist/mjs/evaluator/formula-evaluator.mjs +7 -7
- package/dist/mjs/evaluator/formula-evaluator.mjs.map +3 -3
- package/dist/mjs/evaluator/range-evaluation-node.mjs +3 -3
- package/dist/mjs/evaluator/range-evaluation-node.mjs.map +2 -2
- package/dist/mjs/functions/_template/template.mjs.map +1 -1
- package/dist/mjs/functions/array/sequence/sequence.mjs +4 -4
- package/dist/mjs/functions/array/sequence/sequence.mjs.map +2 -2
- package/dist/mjs/functions/criteria-parser.mjs.map +1 -1
- package/dist/mjs/functions/criteria-utils.mjs +8 -8
- package/dist/mjs/functions/criteria-utils.mjs.map +3 -3
- package/dist/mjs/functions/{index.mjs → function-registry.mjs} +2 -2
- package/dist/mjs/functions/function-registry.mjs.map +10 -0
- package/dist/mjs/functions/function-utils.mjs.map +1 -1
- package/dist/mjs/functions/information/cell/cell.mjs +3 -3
- package/dist/mjs/functions/information/cell/cell.mjs.map +2 -2
- package/dist/mjs/functions/information/column/column.mjs +4 -4
- package/dist/mjs/functions/information/column/column.mjs.map +2 -2
- package/dist/mjs/functions/information/row/row.mjs +4 -4
- package/dist/mjs/functions/information/row/row.mjs.map +2 -2
- package/dist/mjs/functions/logical/and/and.mjs +2 -2
- package/dist/mjs/functions/logical/and/and.mjs.map +2 -2
- package/dist/mjs/functions/logical/if/if.mjs +2 -2
- package/dist/mjs/functions/logical/if/if.mjs.map +3 -3
- package/dist/mjs/functions/logical/iferror/iferror.mjs +3 -3
- package/dist/mjs/functions/logical/iferror/iferror.mjs.map +2 -2
- package/dist/mjs/functions/logical/or/or.mjs +2 -2
- package/dist/mjs/functions/logical/or/or.mjs.map +2 -2
- package/dist/mjs/functions/lookup/count/count-utils.mjs.map +1 -1
- package/dist/mjs/functions/lookup/count/count.mjs +2 -2
- package/dist/mjs/functions/lookup/count/count.mjs.map +2 -2
- package/dist/mjs/functions/lookup/count/countif.mjs +2 -2
- package/dist/mjs/functions/lookup/count/countif.mjs.map +2 -2
- package/dist/mjs/functions/lookup/count/countifs.mjs.map +1 -1
- package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs +2 -2
- package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs.map +2 -2
- package/dist/mjs/functions/lookup/match/match.mjs +2 -2
- package/dist/mjs/functions/lookup/match/match.mjs.map +2 -2
- package/dist/mjs/functions/lookup/xlookup/xlookup.mjs +2 -2
- package/dist/mjs/functions/lookup/xlookup/xlookup.mjs.map +2 -2
- package/dist/mjs/functions/math/average/average-utils.mjs +2 -2
- package/dist/mjs/functions/math/average/average-utils.mjs.map +2 -2
- package/dist/mjs/functions/math/average/average.mjs +2 -2
- package/dist/mjs/functions/math/average/average.mjs.map +2 -2
- package/dist/mjs/functions/math/average/averageif.mjs +3 -3
- package/dist/mjs/functions/math/average/averageif.mjs.map +3 -3
- package/dist/mjs/functions/math/average/averageifs.mjs.map +2 -2
- package/dist/mjs/functions/math/ceiling/ceiling.mjs +2 -2
- package/dist/mjs/functions/math/ceiling/ceiling.mjs.map +3 -3
- package/dist/mjs/functions/math/max/max-utils.mjs +2 -2
- package/dist/mjs/functions/math/max/max-utils.mjs.map +2 -2
- package/dist/mjs/functions/math/max/max.mjs +2 -2
- package/dist/mjs/functions/math/max/max.mjs.map +2 -2
- package/dist/mjs/functions/math/max/maxif.mjs +2 -2
- package/dist/mjs/functions/math/max/maxif.mjs.map +2 -2
- package/dist/mjs/functions/math/max/maxifs.mjs.map +2 -2
- package/dist/mjs/functions/math/min/min-utils.mjs +2 -2
- package/dist/mjs/functions/math/min/min-utils.mjs.map +2 -2
- package/dist/mjs/functions/math/min/min.mjs +2 -2
- package/dist/mjs/functions/math/min/min.mjs.map +2 -2
- package/dist/mjs/functions/math/min/minif.mjs +2 -2
- package/dist/mjs/functions/math/min/minif.mjs.map +2 -2
- package/dist/mjs/functions/math/min/minifs.mjs.map +2 -2
- package/dist/mjs/functions/math/sum/sum.mjs +2 -2
- package/dist/mjs/functions/math/sum/sum.mjs.map +2 -2
- package/dist/mjs/functions/math/sum/sumif.mjs +2 -2
- package/dist/mjs/functions/math/sum/sumif.mjs.map +2 -2
- package/dist/mjs/functions/math/sum/sumifs.mjs.map +2 -2
- package/dist/mjs/functions/math/sum/summation-utils.mjs.map +1 -1
- package/dist/mjs/functions/reference/address/address.mjs +2 -2
- package/dist/mjs/functions/reference/address/address.mjs.map +2 -2
- package/dist/mjs/functions/reference/indirect/indirect.mjs +3 -3
- package/dist/mjs/functions/reference/indirect/indirect.mjs.map +3 -3
- package/dist/mjs/functions/reference/offset/offset.mjs +3 -3
- package/dist/mjs/functions/reference/offset/offset.mjs.map +2 -2
- package/dist/mjs/functions/text/concatenate/concatenate.mjs +2 -2
- package/dist/mjs/functions/text/concatenate/concatenate.mjs.map +2 -2
- package/dist/mjs/functions/text/exact/exact.mjs +2 -2
- package/dist/mjs/functions/text/exact/exact.mjs.map +2 -2
- package/dist/mjs/functions/text/find/find.mjs +2 -2
- package/dist/mjs/functions/text/find/find.mjs.map +3 -3
- package/dist/mjs/functions/text/left/left.mjs +3 -3
- package/dist/mjs/functions/text/left/left.mjs.map +2 -2
- package/dist/mjs/functions/text/len/len.mjs +2 -2
- package/dist/mjs/functions/text/len/len.mjs.map +3 -3
- package/dist/mjs/functions/text/mid/mid.mjs +3 -3
- package/dist/mjs/functions/text/mid/mid.mjs.map +2 -2
- package/dist/mjs/functions/text/right/right.mjs +4 -4
- package/dist/mjs/functions/text/right/right.mjs.map +3 -3
- package/dist/mjs/functions/text/text-helpers.mjs +2 -2
- package/dist/mjs/functions/text/text-helpers.mjs.map +2 -2
- package/dist/mjs/functions/text/textjoin/textjoin.mjs +2 -2
- package/dist/mjs/functions/text/textjoin/textjoin.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/parser/formatter.mjs +2 -2
- package/dist/mjs/parser/formatter.mjs.map +2 -2
- package/dist/types/core/engine.d.ts +5 -1
- package/dist/types/core/managers/dependency-manager.d.ts +7 -7
- package/dist/types/core/managers/dependency-node.d.ts +5 -5
- package/dist/types/core/managers/evaluation-manager.d.ts +4 -4
- package/dist/types/core/managers/frontier-dependency-manager.d.ts +2 -2
- package/dist/types/core/managers/named-expression-manager.d.ts +2 -2
- package/dist/types/core/managers/workbook-manager.d.ts +1 -1
- package/dist/types/core/types.d.ts +3 -3
- package/dist/types/evaluator/arithmetic/add/add.d.ts +1 -1
- package/dist/types/evaluator/arithmetic/divide/divide.d.ts +1 -1
- package/dist/types/evaluator/arithmetic/multiply/multiply.d.ts +1 -1
- package/dist/types/evaluator/arithmetic/power/power.d.ts +1 -1
- package/dist/types/evaluator/arithmetic/subtract/subtract.d.ts +1 -1
- package/dist/types/evaluator/comparison/equals.d.ts +1 -1
- package/dist/types/evaluator/comparison/greater-than-or-equal.d.ts +1 -1
- package/dist/types/evaluator/comparison/greater-than.d.ts +1 -1
- package/dist/types/evaluator/comparison/less-than-or-equal.d.ts +1 -1
- package/dist/types/evaluator/comparison/less-than.d.ts +1 -1
- package/dist/types/evaluator/comparison/not-equals.d.ts +1 -1
- package/dist/types/evaluator/concatenation/concatenate.d.ts +1 -1
- package/dist/types/evaluator/dependency-nodes/ast-evaluation-node.d.ts +2 -2
- package/dist/types/evaluator/dependency-nodes/base-eval-node.d.ts +1 -1
- package/dist/types/evaluator/dependency-nodes/cell-value-node.d.ts +1 -1
- package/dist/types/evaluator/dependency-nodes/empty-cell-evaluation-node.d.ts +4 -4
- package/dist/types/evaluator/dependency-nodes/spill-meta-node.d.ts +1 -1
- package/dist/types/evaluator/evaluate-scalar-operator.d.ts +1 -1
- package/dist/types/evaluator/evaluation-context.d.ts +3 -3
- package/dist/types/evaluator/evaluation-error.d.ts +2 -2
- package/dist/types/evaluator/formula-evaluator.d.ts +5 -5
- package/dist/types/evaluator/range-evaluation-node.d.ts +4 -4
- package/dist/types/functions/_template/template.d.ts +1 -1
- package/dist/types/functions/array/sequence/sequence.d.ts +1 -1
- package/dist/types/functions/criteria-parser.d.ts +1 -1
- package/dist/types/functions/criteria-utils.d.ts +5 -5
- package/dist/types/functions/{index.d.ts → function-registry.d.ts} +1 -1
- package/dist/types/functions/function-utils.d.ts +5 -5
- package/dist/types/functions/information/cell/cell.d.ts +1 -1
- package/dist/types/functions/information/column/column.d.ts +1 -1
- package/dist/types/functions/information/row/row.d.ts +1 -1
- package/dist/types/functions/logical/and/and.d.ts +1 -1
- package/dist/types/functions/logical/if/if.d.ts +1 -1
- package/dist/types/functions/logical/iferror/iferror.d.ts +1 -1
- package/dist/types/functions/logical/or/or.d.ts +1 -1
- package/dist/types/functions/lookup/count/count-utils.d.ts +2 -2
- package/dist/types/functions/lookup/count/count.d.ts +1 -1
- package/dist/types/functions/lookup/count/countif.d.ts +1 -1
- package/dist/types/functions/lookup/count/countifs.d.ts +1 -1
- package/dist/types/functions/lookup/index-lookup/index-lookup.d.ts +1 -1
- package/dist/types/functions/lookup/match/match.d.ts +1 -1
- package/dist/types/functions/lookup/xlookup/xlookup.d.ts +1 -1
- package/dist/types/functions/math/average/average-utils.d.ts +2 -2
- package/dist/types/functions/math/average/average.d.ts +1 -1
- package/dist/types/functions/math/average/averageif.d.ts +1 -1
- package/dist/types/functions/math/average/averageifs.d.ts +1 -1
- package/dist/types/functions/math/ceiling/ceiling.d.ts +1 -1
- package/dist/types/functions/math/max/max-utils.d.ts +2 -2
- package/dist/types/functions/math/max/max.d.ts +1 -1
- package/dist/types/functions/math/max/maxif.d.ts +1 -1
- package/dist/types/functions/math/max/maxifs.d.ts +1 -1
- package/dist/types/functions/math/min/min-utils.d.ts +2 -2
- package/dist/types/functions/math/min/min.d.ts +1 -1
- package/dist/types/functions/math/min/minif.d.ts +1 -1
- package/dist/types/functions/math/min/minifs.d.ts +1 -1
- package/dist/types/functions/math/sum/sum.d.ts +1 -1
- package/dist/types/functions/math/sum/sumif.d.ts +1 -1
- package/dist/types/functions/math/sum/sumifs.d.ts +1 -1
- package/dist/types/functions/math/sum/summation-utils.d.ts +1 -1
- package/dist/types/functions/reference/address/address.d.ts +1 -1
- package/dist/types/functions/reference/indirect/indirect.d.ts +1 -1
- package/dist/types/functions/reference/offset/offset.d.ts +1 -1
- package/dist/types/functions/text/concatenate/concatenate.d.ts +1 -1
- package/dist/types/functions/text/exact/exact.d.ts +1 -1
- package/dist/types/functions/text/find/find.d.ts +1 -1
- package/dist/types/functions/text/left/left.d.ts +1 -1
- package/dist/types/functions/text/len/len.d.ts +1 -1
- package/dist/types/functions/text/mid/mid.d.ts +1 -1
- package/dist/types/functions/text/right/right.d.ts +1 -1
- package/dist/types/functions/text/text-helpers.d.ts +3 -3
- package/dist/types/functions/text/textjoin/textjoin.d.ts +1 -1
- package/package.json +1 -1
- package/dist/cjs/core/managers/index.cjs +0 -49
- package/dist/cjs/core/managers/index.cjs.map +0 -10
- package/dist/cjs/functions/index.cjs.map +0 -10
- package/dist/mjs/core/managers/index.mjs +0 -21
- package/dist/mjs/core/managers/index.mjs.map +0 -10
- package/dist/mjs/functions/index.mjs.map +0 -10
- package/dist/types/core/managers/index.d.ts +0 -7
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/evaluator/dependency-nodes/spill-meta-node.ts
|
|
2
|
-
import { getCellReference, keyToCellAddress } from "
|
|
2
|
+
import { getCellReference, keyToCellAddress } from "../../core/utils.mjs";
|
|
3
3
|
import { BaseEvalNode } from "./base-eval-node.mjs";
|
|
4
4
|
|
|
5
5
|
class SpillMetaNode extends BaseEvalNode {
|
|
@@ -17,4 +17,4 @@ export {
|
|
|
17
17
|
SpillMetaNode
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
//# debugId=
|
|
20
|
+
//# debugId=74E3B120824BFC9E64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/evaluator/dependency-nodes/spill-meta-node.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type {\n CellAddress,\n DoesNotSpillResult,\n ErrorEvaluationResult,\n SpilledValuesEvaluationResult,\n} from \"
|
|
5
|
+
"import type {\n CellAddress,\n DoesNotSpillResult,\n ErrorEvaluationResult,\n SpilledValuesEvaluationResult,\n} from \"../../core/types.mjs\";\nimport { getCellReference, keyToCellAddress } from \"../../core/utils.mjs\";\nimport { BaseEvalNode } from \"./base-eval-node.mjs\";\n\nexport class SpillMetaNode extends BaseEvalNode<\n SpilledValuesEvaluationResult | ErrorEvaluationResult | DoesNotSpillResult\n> {\n public readonly cellAddress: CellAddress;\n\n constructor(key: string) {\n const cellAddress = keyToCellAddress(key);\n super(key);\n this.cellAddress = cellAddress;\n }\n\n public override toString(): string {\n return getCellReference(this.cellAddress);\n }\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";AAMA;AACA;AAAA;AAEO,MAAM,sBAAsB,aAEjC;AAAA,EACgB;AAAA,EAEhB,WAAW,CAAC,KAAa;AAAA,IACvB,MAAM,cAAc,iBAAiB,GAAG;AAAA,IACxC,MAAM,GAAG;AAAA,IACT,KAAK,cAAc;AAAA;AAAA,EAGL,QAAQ,GAAW;AAAA,IACjC,OAAO,iBAAiB,KAAK,WAAW;AAAA;AAE5C;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "74E3B120824BFC9E64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/evaluator/evaluate-scalar-operator.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport {\n FormulaError,\n type ArethmeticEvaluator,\n type CellAddress,\n type CellValue,\n type CellInRangeResult,\n type FunctionEvaluationResult,\n type SingleEvaluationResult,\n} from \"../core/types.mjs\";\nimport type { EvaluationContext } from \"./evaluation-context.mjs\";\n\nexport type EvaluateScalarOperatorOptions = {\n evaluateScalar: ArethmeticEvaluator;\n context: EvaluationContext;\n /**\n * for debugging messages\n */\n name: string;\n};\n\nfunction evaluateSingleScalarOperator(\n leftValue: CellValue,\n rightValue: CellValue,\n evaluateScalar: ArethmeticEvaluator,\n context: EvaluationContext\n): SingleEvaluationResult {\n const result = evaluateScalar(leftValue, rightValue, context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return { type: \"value\", result };\n}\n\nexport function evaluateScalarOperator(\n this: FormulaEvaluator,\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n options: EvaluateScalarOperatorOptions\n): FunctionEvaluationResult {\n const { evaluateScalar, context, name } = options;\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 if (left.type === \"value\" && right.type === \"value\") {\n const leftValue = left.result;\n const rightValue = right.result;\n const result = evaluateScalar(leftValue, rightValue, options.context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n if (result) {\n return { type: \"value\", result };\n }\n }\n if (left.type === \"spilled-values\" && right.type === \"value\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => left.spillArea(origin),\n source: `evaulate left spilled range onto right value in scalar operator ${name}`,\n evaluate: (spilled, context) => {\n const evaledLeft = left.evaluate(spilled, context);\n if (\n evaledLeft.type === \"error\" ||\n evaledLeft.type === \"awaiting-evaluation\"\n ) {\n return evaledLeft;\n }\n return evaluateSingleScalarOperator(\n evaledLeft.result,\n right.result,\n evaluateScalar,\n options.context\n );\n },\n evaluateAllCells: function (options) {\n const leftResults = left.evaluateAllCells.call(this, options);\n if (\n leftResults.type === \"error\" ||\n leftResults.type === \"awaiting-evaluation\"\n ) {\n return leftResults;\n }\n const results = leftResults.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: evaluateSingleScalarOperator(\n cellValue.result.result,\n right.result,\n evaluateScalar,\n options.context\n ),\n relativePos: cellValue.relativePos,\n };\n }\n });\n return {\n type: \"values\",\n values: results,\n };\n },\n };\n }\n if (right.type === \"spilled-values\" && left.type === \"value\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => right.spillArea(origin),\n source: `evaluate right spilled range onto left value in scalar operator ${name}`,\n evaluate: (spilled, context) => {\n const evaledRight = right.evaluate(spilled, context);\n if (\n evaledRight.type === \"error\" ||\n evaledRight.type === \"awaiting-evaluation\"\n ) {\n return evaledRight;\n }\n return evaluateSingleScalarOperator(\n left.result,\n evaledRight.result,\n evaluateScalar,\n options.context\n );\n },\n evaluateAllCells: function (options) {\n const rightResults = right.evaluateAllCells.call(this, options);\n if (\n rightResults.type === \"error\" ||\n rightResults.type === \"awaiting-evaluation\"\n ) {\n return rightResults;\n }\n const results = rightResults.values.map((cellValue) => {\n if (\n cellValue.result.type === \"error\" ||\n cellValue.result.type === \"awaiting-evaluation\"\n ) {\n return cellValue;\n } else {\n const result = evaluateSingleScalarOperator(\n left.result,\n cellValue.result.result,\n evaluateScalar,\n options.context\n );\n return {\n result: result,\n relativePos: cellValue.relativePos,\n };\n }\n });\n return {\n type: \"values\",\n values: results,\n };\n },\n };\n }\n\n if (left.type === \"spilled-values\" && right.type === \"spilled-values\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin) =>\n this.unionRanges(left.spillArea(origin), right.spillArea(origin)),\n source: `evaluate spilled ranges in scalar operator ${name}`,\n evaluate: (spilled, context) => {\n const evaledLeft = left.evaluate(spilled, context);\n if (\n evaledLeft.type === \"error\" ||\n evaledLeft.type === \"awaiting-evaluation\"\n ) {\n return evaledLeft;\n }\n const evaledRight = right.evaluate(spilled, context);\n if (\n evaledRight.type === \"error\" ||\n evaledRight.type === \"awaiting-evaluation\"\n ) {\n return evaledRight;\n }\n\n // Check if either value is an empty cell (empty string)\n const isLeftEmpty =\n evaledLeft.type === \"value\" &&\n evaledLeft.result.type === \"string\" &&\n evaledLeft.result.value === \"\";\n const isRightEmpty =\n evaledRight.type === \"value\" &&\n evaledRight.result.type === \"string\" &&\n evaledRight.result.value === \"\";\n\n // If either operand is empty, return #N/A\n if (isLeftEmpty || isRightEmpty) {\n return {\n type: \"error\",\n err: FormulaError.NA,\n message: \"Empty cell in scalar operation\",\n errAddress: options.context.dependencyNode,\n };\n }\n\n return evaluateSingleScalarOperator(\n evaledLeft.result,\n evaledRight.result,\n evaluateScalar,\n options.context\n );\n },\n evaluateAllCells: function (options) {\n const leftResults = left.evaluateAllCells.call(this, options);\n if (\n leftResults.type === \"error\" ||\n leftResults.type === \"awaiting-evaluation\"\n ) {\n return leftResults;\n }\n const rightResults = right.evaluateAllCells.call(this, options);\n if (\n rightResults.type === \"error\" ||\n rightResults.type === \"awaiting-evaluation\"\n ) {\n return rightResults;\n }\n\n // Create position-based maps for both left and right results\n const leftMap = new Map<string, CellInRangeResult>();\n const rightMap = new Map<string, CellInRangeResult>();\n const allPositions = new Set<string>();\n\n for (const result of leftResults.values) {\n const key = `${result.relativePos.x},${result.relativePos.y}`;\n leftMap.set(key, result);\n allPositions.add(key);\n }\n\n for (const result of rightResults.values) {\n const key = `${result.relativePos.x},${result.relativePos.y}`;\n rightMap.set(key, result);\n allPositions.add(key);\n }\n\n const results: CellInRangeResult[] = [];\n\n // Process each unique position\n for (const posKey of allPositions) {\n const leftResult = leftMap.get(posKey);\n const rightResult = rightMap.get(posKey);\n\n // Extract relative position from the key\n const [x, y] = posKey.split(\",\").map(Number);\n const relativePos = { x: x!, y: y! };\n\n if (!leftResult && !rightResult) {\n // Both empty - this shouldn't happen as we only iterate positions that exist\n continue;\n } else if (!leftResult && rightResult) {\n // Left is empty/missing, right has value\n if (\n rightResult.result.type === \"error\" ||\n rightResult.result.type === \"awaiting-evaluation\"\n ) {\n results.push(rightResult);\n } else if (rightResult.result.type === \"value\") {\n // Treat missing left as empty, which is handled by the operator\n results.push({\n result: {\n type: \"error\",\n err: FormulaError.NA,\n message: \"Left operand is empty\",\n errAddress: context.dependencyNode,\n },\n relativePos,\n });\n } else {\n results.push(rightResult);\n }\n } else if (!rightResult && leftResult) {\n // Right is empty/missing, left has value\n if (\n leftResult.result.type === \"error\" ||\n leftResult.result.type === \"awaiting-evaluation\"\n ) {\n results.push(leftResult);\n } else if (leftResult.result.type === \"value\") {\n // Treat missing right as empty, which is handled by the operator\n results.push({\n result: {\n type: \"error\",\n err: FormulaError.NA,\n message: \"Right operand is empty\",\n errAddress: context.dependencyNode,\n },\n relativePos,\n });\n } else {\n results.push(leftResult);\n }\n } else if (leftResult && rightResult) {\n // Both have values\n if (\n leftResult.result.type === \"error\" ||\n leftResult.result.type === \"awaiting-evaluation\"\n ) {\n results.push(leftResult);\n } else if (\n rightResult.result.type === \"error\" ||\n rightResult.result.type === \"awaiting-evaluation\"\n ) {\n results.push(rightResult);\n } else if (\n leftResult.result.type === \"value\" &&\n rightResult.result.type === \"value\"\n ) {\n results.push({\n result: evaluateSingleScalarOperator(\n leftResult.result.result,\n rightResult.result.result,\n evaluateScalar,\n options.context\n ),\n relativePos: leftResult.relativePos,\n });\n } else {\n // Both are awaiting-evaluation or some other state\n results.push({\n result: {\n type: \"error\",\n err: FormulaError.VALUE,\n message:\n \"Cannot evaluate scalar operator on non-value results\",\n errAddress: context.dependencyNode,\n },\n relativePos,\n });\n }\n }\n }\n\n return { type: \"values\", values: results };\n },\n };\n }\n\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Can't evaluate (${left.type}, ${right.type}) in scalar operator ${name}`,\n errAddress: options.context.dependencyNode,\n };\n}\n"
|
|
5
|
+
"import type { FormulaEvaluator } from \"./formula-evaluator.mjs\";\nimport {\n FormulaError,\n type ArethmeticEvaluator,\n type CellAddress,\n type CellValue,\n type CellInRangeResult,\n type FunctionEvaluationResult,\n type SingleEvaluationResult,\n} from \"../core/types.mjs\";\nimport type { EvaluationContext } from \"./evaluation-context.mjs\";\n\nexport type EvaluateScalarOperatorOptions = {\n evaluateScalar: ArethmeticEvaluator;\n context: EvaluationContext;\n /**\n * for debugging messages\n */\n name: string;\n};\n\nfunction evaluateSingleScalarOperator(\n leftValue: CellValue,\n rightValue: CellValue,\n evaluateScalar: ArethmeticEvaluator,\n context: EvaluationContext\n): SingleEvaluationResult {\n const result = evaluateScalar(leftValue, rightValue, context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return { type: \"value\", result };\n}\n\nexport function evaluateScalarOperator(\n this: FormulaEvaluator,\n left: FunctionEvaluationResult,\n right: FunctionEvaluationResult,\n options: EvaluateScalarOperatorOptions\n): FunctionEvaluationResult {\n const { evaluateScalar, context, name } = options;\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 if (left.type === \"value\" && right.type === \"value\") {\n const leftValue = left.result;\n const rightValue = right.result;\n const result = evaluateScalar(leftValue, rightValue, options.context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n if (result) {\n return { type: \"value\", result };\n }\n }\n if (left.type === \"spilled-values\" && right.type === \"value\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => left.spillArea(origin),\n source: `evaulate left spilled range onto right value in scalar operator ${name}`,\n evaluate: (spilled, context) => {\n const evaledLeft = left.evaluate(spilled, context);\n if (\n evaledLeft.type === \"error\" ||\n evaledLeft.type === \"awaiting-evaluation\"\n ) {\n return evaledLeft;\n }\n return evaluateSingleScalarOperator(\n evaledLeft.result,\n right.result,\n evaluateScalar,\n options.context\n );\n },\n evaluateAllCells: function (options) {\n const leftResults = left.evaluateAllCells.call(this, options);\n if (\n leftResults.type === \"error\" ||\n leftResults.type === \"awaiting-evaluation\"\n ) {\n return leftResults;\n }\n const results = leftResults.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: evaluateSingleScalarOperator(\n cellValue.result.result,\n right.result,\n evaluateScalar,\n options.context\n ),\n relativePos: cellValue.relativePos,\n };\n }\n });\n return {\n type: \"values\",\n values: results,\n };\n },\n };\n }\n if (right.type === \"spilled-values\" && left.type === \"value\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => right.spillArea(origin),\n source: `evaluate right spilled range onto left value in scalar operator ${name}`,\n evaluate: (spilled, context) => {\n const evaledRight = right.evaluate(spilled, context);\n if (\n evaledRight.type === \"error\" ||\n evaledRight.type === \"awaiting-evaluation\"\n ) {\n return evaledRight;\n }\n return evaluateSingleScalarOperator(\n left.result,\n evaledRight.result,\n evaluateScalar,\n options.context\n );\n },\n evaluateAllCells: function (options) {\n const rightResults = right.evaluateAllCells.call(this, options);\n if (\n rightResults.type === \"error\" ||\n rightResults.type === \"awaiting-evaluation\"\n ) {\n return rightResults;\n }\n const results = rightResults.values.map((cellValue) => {\n if (\n cellValue.result.type === \"error\" ||\n cellValue.result.type === \"awaiting-evaluation\"\n ) {\n return cellValue;\n } else {\n const result = evaluateSingleScalarOperator(\n left.result,\n cellValue.result.result,\n evaluateScalar,\n options.context\n );\n return {\n result: result,\n relativePos: cellValue.relativePos,\n };\n }\n });\n return {\n type: \"values\",\n values: results,\n };\n },\n };\n }\n\n if (left.type === \"spilled-values\" && right.type === \"spilled-values\") {\n return {\n type: \"spilled-values\",\n spillArea: (origin) =>\n this.unionRanges(left.spillArea(origin), right.spillArea(origin)),\n source: `evaluate spilled ranges in scalar operator ${name}`,\n evaluate: (spilled, context) => {\n const evaledLeft = left.evaluate(spilled, context);\n if (\n evaledLeft.type === \"error\" ||\n evaledLeft.type === \"awaiting-evaluation\"\n ) {\n return evaledLeft;\n }\n const evaledRight = right.evaluate(spilled, context);\n if (\n evaledRight.type === \"error\" ||\n evaledRight.type === \"awaiting-evaluation\"\n ) {\n return evaledRight;\n }\n\n // Check if either value is an empty cell (empty string)\n const isLeftEmpty =\n evaledLeft.type === \"value\" &&\n evaledLeft.result.type === \"string\" &&\n evaledLeft.result.value === \"\";\n const isRightEmpty =\n evaledRight.type === \"value\" &&\n evaledRight.result.type === \"string\" &&\n evaledRight.result.value === \"\";\n\n // If either operand is empty, return #N/A\n if (isLeftEmpty || isRightEmpty) {\n return {\n type: \"error\",\n err: FormulaError.NA,\n message: \"Empty cell in scalar operation\",\n errAddress: options.context.dependencyNode,\n };\n }\n\n return evaluateSingleScalarOperator(\n evaledLeft.result,\n evaledRight.result,\n evaluateScalar,\n options.context\n );\n },\n evaluateAllCells: function (options) {\n const leftResults = left.evaluateAllCells.call(this, options);\n if (\n leftResults.type === \"error\" ||\n leftResults.type === \"awaiting-evaluation\"\n ) {\n return leftResults;\n }\n const rightResults = right.evaluateAllCells.call(this, options);\n if (\n rightResults.type === \"error\" ||\n rightResults.type === \"awaiting-evaluation\"\n ) {\n return rightResults;\n }\n\n // Create position-based maps for both left and right results\n const leftMap = new Map<string, CellInRangeResult>();\n const rightMap = new Map<string, CellInRangeResult>();\n const allPositions = new Set<string>();\n\n for (const result of leftResults.values) {\n const key = `${result.relativePos.x},${result.relativePos.y}`;\n leftMap.set(key, result);\n allPositions.add(key);\n }\n\n for (const result of rightResults.values) {\n const key = `${result.relativePos.x},${result.relativePos.y}`;\n rightMap.set(key, result);\n allPositions.add(key);\n }\n\n const results: CellInRangeResult[] = [];\n\n // Process each unique position\n for (const posKey of allPositions) {\n const leftResult = leftMap.get(posKey);\n const rightResult = rightMap.get(posKey);\n\n // Extract relative position from the key\n const [x, y] = posKey.split(\",\").map(Number);\n const relativePos = { x: x!, y: y! };\n\n if (!leftResult && !rightResult) {\n // Both empty - this shouldn't happen as we only iterate positions that exist\n continue;\n } else if (!leftResult && rightResult) {\n // Left is empty/missing, right has value\n if (\n rightResult.result.type === \"error\" ||\n rightResult.result.type === \"awaiting-evaluation\"\n ) {\n results.push(rightResult);\n } else if (rightResult.result.type === \"value\") {\n // Treat missing left as empty, which is handled by the operator\n results.push({\n result: {\n type: \"error\",\n err: FormulaError.NA,\n message: \"Left operand is empty\",\n errAddress: context.dependencyNode,\n },\n relativePos,\n });\n } else {\n results.push(rightResult);\n }\n } else if (!rightResult && leftResult) {\n // Right is empty/missing, left has value\n if (\n leftResult.result.type === \"error\" ||\n leftResult.result.type === \"awaiting-evaluation\"\n ) {\n results.push(leftResult);\n } else if (leftResult.result.type === \"value\") {\n // Treat missing right as empty, which is handled by the operator\n results.push({\n result: {\n type: \"error\",\n err: FormulaError.NA,\n message: \"Right operand is empty\",\n errAddress: context.dependencyNode,\n },\n relativePos,\n });\n } else {\n results.push(leftResult);\n }\n } else if (leftResult && rightResult) {\n // Both have values\n if (\n leftResult.result.type === \"error\" ||\n leftResult.result.type === \"awaiting-evaluation\"\n ) {\n results.push(leftResult);\n } else if (\n rightResult.result.type === \"error\" ||\n rightResult.result.type === \"awaiting-evaluation\"\n ) {\n results.push(rightResult);\n } else if (\n leftResult.result.type === \"value\" &&\n rightResult.result.type === \"value\"\n ) {\n results.push({\n result: evaluateSingleScalarOperator(\n leftResult.result.result,\n rightResult.result.result,\n evaluateScalar,\n options.context\n ),\n relativePos: leftResult.relativePos,\n });\n } else {\n // Both are awaiting-evaluation or some other state\n results.push({\n result: {\n type: \"error\",\n err: FormulaError.VALUE,\n message:\n \"Cannot evaluate scalar operator on non-value results\",\n errAddress: context.dependencyNode,\n },\n relativePos,\n });\n }\n }\n }\n\n return { type: \"values\", values: results };\n },\n };\n }\n\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: `Can't evaluate (${left.type}, ${right.type}) in scalar operator ${name}`,\n errAddress: options.context.dependencyNode,\n };\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";AACA;AAAA;AAAA;AAoBA,SAAS,4BAA4B,CACnC,WACA,YACA,gBACA,SACwB;AAAA,EACxB,MAAM,SAAS,eAAe,WAAW,YAAY,OAAO;AAAA,EAC5D,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,uBAAuB;AAAA,IACpE,OAAO;AAAA,EACT;AAAA,EACA,OAAO,EAAE,MAAM,SAAS,OAAO;AAAA;AAG1B,SAAS,sBAAsB,CAEpC,MACA,OACA,SAC0B;AAAA,EAC1B,QAAQ,gBAAgB,SAAS,SAAS;AAAA,EAC1C,IAAI,KAAK,SAAS,WAAW,KAAK,SAAS,uBAAuB;AAAA,IAChE,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,SAAS,WAAW,MAAM,SAAS,uBAAuB;AAAA,IAClE,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,KAAK,SAAS,WAAW,MAAM,SAAS,SAAS;AAAA,IACnD,MAAM,YAAY,KAAK;AAAA,IACvB,MAAM,aAAa,MAAM;AAAA,IACzB,MAAM,SAAS,eAAe,WAAW,YAAY,QAAQ,OAAO;AAAA,IACpE,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,uBAAuB;AAAA,MACpE,OAAO;AAAA,IACT;AAAA,IACA,IAAI,QAAQ;AAAA,MACV,OAAO,EAAE,MAAM,SAAS,OAAO;AAAA,IACjC;AAAA,EACF;AAAA,EACA,IAAI,KAAK,SAAS,oBAAoB,MAAM,SAAS,SAAS;AAAA,IAC5D,OAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,CAAC,WAAwB,KAAK,UAAU,MAAM;AAAA,MACzD,QAAQ,mEAAmE;AAAA,MAC3E,UAAU,CAAC,SAAS,aAAY;AAAA,QAC9B,MAAM,aAAa,KAAK,SAAS,SAAS,QAAO;AAAA,QACjD,IACE,WAAW,SAAS,WACpB,WAAW,SAAS,uBACpB;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QACA,OAAO,6BACL,WAAW,QACX,MAAM,QACN,gBACA,QAAQ,OACV;AAAA;AAAA,MAEF,kBAAkB,QAAS,CAAC,UAAS;AAAA,QACnC,MAAM,cAAc,KAAK,iBAAiB,KAAK,MAAM,QAAO;AAAA,QAC5D,IACE,YAAY,SAAS,WACrB,YAAY,SAAS,uBACrB;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QACA,MAAM,UAAU,YAAY,OAAO,IAAI,CAAC,cAAc;AAAA,UACpD,IACE,UAAU,OAAO,SAAS,WAC1B,UAAU,OAAO,SAAS,uBAC1B;AAAA,YACA,OAAO;AAAA,UACT,EAAO;AAAA,YACL,OAAO;AAAA,cACL,QAAQ,6BACN,UAAU,OAAO,QACjB,MAAM,QACN,gBACA,SAAQ,OACV;AAAA,cACA,aAAa,UAAU;AAAA,YACzB;AAAA;AAAA,SAEH;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,QACV;AAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EACA,IAAI,MAAM,SAAS,oBAAoB,KAAK,SAAS,SAAS;AAAA,IAC5D,OAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,CAAC,WAAwB,MAAM,UAAU,MAAM;AAAA,MAC1D,QAAQ,mEAAmE;AAAA,MAC3E,UAAU,CAAC,SAAS,aAAY;AAAA,QAC9B,MAAM,cAAc,MAAM,SAAS,SAAS,QAAO;AAAA,QACnD,IACE,YAAY,SAAS,WACrB,YAAY,SAAS,uBACrB;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QACA,OAAO,6BACL,KAAK,QACL,YAAY,QACZ,gBACA,QAAQ,OACV;AAAA;AAAA,MAEF,kBAAkB,QAAS,CAAC,UAAS;AAAA,QACnC,MAAM,eAAe,MAAM,iBAAiB,KAAK,MAAM,QAAO;AAAA,QAC9D,IACE,aAAa,SAAS,WACtB,aAAa,SAAS,uBACtB;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QACA,MAAM,UAAU,aAAa,OAAO,IAAI,CAAC,cAAc;AAAA,UACrD,IACE,UAAU,OAAO,SAAS,WAC1B,UAAU,OAAO,SAAS,uBAC1B;AAAA,YACA,OAAO;AAAA,UACT,EAAO;AAAA,YACL,MAAM,SAAS,6BACb,KAAK,QACL,UAAU,OAAO,QACjB,gBACA,SAAQ,OACV;AAAA,YACA,OAAO;AAAA,cACL;AAAA,cACA,aAAa,UAAU;AAAA,YACzB;AAAA;AAAA,SAEH;AAAA,QACD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,QACV;AAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEA,IAAI,KAAK,SAAS,oBAAoB,MAAM,SAAS,kBAAkB;AAAA,IACrE,OAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW,CAAC,WACV,KAAK,YAAY,KAAK,UAAU,MAAM,GAAG,MAAM,UAAU,MAAM,CAAC;AAAA,MAClE,QAAQ,8CAA8C;AAAA,MACtD,UAAU,CAAC,SAAS,aAAY;AAAA,QAC9B,MAAM,aAAa,KAAK,SAAS,SAAS,QAAO;AAAA,QACjD,IACE,WAAW,SAAS,WACpB,WAAW,SAAS,uBACpB;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QACA,MAAM,cAAc,MAAM,SAAS,SAAS,QAAO;AAAA,QACnD,IACE,YAAY,SAAS,WACrB,YAAY,SAAS,uBACrB;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QAGA,MAAM,cACJ,WAAW,SAAS,WACpB,WAAW,OAAO,SAAS,YAC3B,WAAW,OAAO,UAAU;AAAA,QAC9B,MAAM,eACJ,YAAY,SAAS,WACrB,YAAY,OAAO,SAAS,YAC5B,YAAY,OAAO,UAAU;AAAA,QAG/B,IAAI,eAAe,cAAc;AAAA,UAC/B,OAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK,aAAa;AAAA,YAClB,SAAS;AAAA,YACT,YAAY,QAAQ,QAAQ;AAAA,UAC9B;AAAA,QACF;AAAA,QAEA,OAAO,6BACL,WAAW,QACX,YAAY,QACZ,gBACA,QAAQ,OACV;AAAA;AAAA,MAEF,kBAAkB,QAAS,CAAC,UAAS;AAAA,QACnC,MAAM,cAAc,KAAK,iBAAiB,KAAK,MAAM,QAAO;AAAA,QAC5D,IACE,YAAY,SAAS,WACrB,YAAY,SAAS,uBACrB;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QACA,MAAM,eAAe,MAAM,iBAAiB,KAAK,MAAM,QAAO;AAAA,QAC9D,IACE,aAAa,SAAS,WACtB,aAAa,SAAS,uBACtB;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QAGA,MAAM,UAAU,IAAI;AAAA,QACpB,MAAM,WAAW,IAAI;AAAA,QACrB,MAAM,eAAe,IAAI;AAAA,QAEzB,WAAW,UAAU,YAAY,QAAQ;AAAA,UACvC,MAAM,MAAM,GAAG,OAAO,YAAY,KAAK,OAAO,YAAY;AAAA,UAC1D,QAAQ,IAAI,KAAK,MAAM;AAAA,UACvB,aAAa,IAAI,GAAG;AAAA,QACtB;AAAA,QAEA,WAAW,UAAU,aAAa,QAAQ;AAAA,UACxC,MAAM,MAAM,GAAG,OAAO,YAAY,KAAK,OAAO,YAAY;AAAA,UAC1D,SAAS,IAAI,KAAK,MAAM;AAAA,UACxB,aAAa,IAAI,GAAG;AAAA,QACtB;AAAA,QAEA,MAAM,UAA+B,CAAC;AAAA,QAGtC,WAAW,UAAU,cAAc;AAAA,UACjC,MAAM,aAAa,QAAQ,IAAI,MAAM;AAAA,UACrC,MAAM,cAAc,SAAS,IAAI,MAAM;AAAA,UAGvC,OAAO,GAAG,KAAK,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAAA,UAC3C,MAAM,cAAc,EAAE,GAAO,EAAM;AAAA,UAEnC,IAAI,CAAC,cAAc,CAAC,aAAa;AAAA,YAE/B;AAAA,UACF,EAAO,SAAI,CAAC,cAAc,aAAa;AAAA,YAErC,IACE,YAAY,OAAO,SAAS,WAC5B,YAAY,OAAO,SAAS,uBAC5B;AAAA,cACA,QAAQ,KAAK,WAAW;AAAA,YAC1B,EAAO,SAAI,YAAY,OAAO,SAAS,SAAS;AAAA,cAE9C,QAAQ,KAAK;AAAA,gBACX,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,KAAK,aAAa;AAAA,kBAClB,SAAS;AAAA,kBACT,YAAY,QAAQ;AAAA,gBACtB;AAAA,gBACA;AAAA,cACF,CAAC;AAAA,YACH,EAAO;AAAA,cACL,QAAQ,KAAK,WAAW;AAAA;AAAA,UAE5B,EAAO,SAAI,CAAC,eAAe,YAAY;AAAA,YAErC,IACE,WAAW,OAAO,SAAS,WAC3B,WAAW,OAAO,SAAS,uBAC3B;AAAA,cACA,QAAQ,KAAK,UAAU;AAAA,YACzB,EAAO,SAAI,WAAW,OAAO,SAAS,SAAS;AAAA,cAE7C,QAAQ,KAAK;AAAA,gBACX,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,KAAK,aAAa;AAAA,kBAClB,SAAS;AAAA,kBACT,YAAY,QAAQ;AAAA,gBACtB;AAAA,gBACA;AAAA,cACF,CAAC;AAAA,YACH,EAAO;AAAA,cACL,QAAQ,KAAK,UAAU;AAAA;AAAA,UAE3B,EAAO,SAAI,cAAc,aAAa;AAAA,YAEpC,IACE,WAAW,OAAO,SAAS,WAC3B,WAAW,OAAO,SAAS,uBAC3B;AAAA,cACA,QAAQ,KAAK,UAAU;AAAA,YACzB,EAAO,SACL,YAAY,OAAO,SAAS,WAC5B,YAAY,OAAO,SAAS,uBAC5B;AAAA,cACA,QAAQ,KAAK,WAAW;AAAA,YAC1B,EAAO,SACL,WAAW,OAAO,SAAS,WAC3B,YAAY,OAAO,SAAS,SAC5B;AAAA,cACA,QAAQ,KAAK;AAAA,gBACX,QAAQ,6BACN,WAAW,OAAO,QAClB,YAAY,OAAO,QACnB,gBACA,SAAQ,OACV;AAAA,gBACA,aAAa,WAAW;AAAA,cAC1B,CAAC;AAAA,YACH,EAAO;AAAA,cAEL,QAAQ,KAAK;AAAA,gBACX,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,KAAK,aAAa;AAAA,kBAClB,SACE;AAAA,kBACF,YAAY,QAAQ;AAAA,gBACtB;AAAA,gBACA;AAAA,cACF,CAAC;AAAA;AAAA,UAEL;AAAA,QACF;AAAA,QAEA,OAAO,EAAE,MAAM,UAAU,QAAQ,QAAQ;AAAA;AAAA,IAE7C;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,aAAa;AAAA,IAClB,SAAS,mBAAmB,KAAK,SAAS,MAAM,4BAA4B;AAAA,IAC5E,YAAY,QAAQ,QAAQ;AAAA,EAC9B;AAAA;",
|
|
8
8
|
"debugId": "05B49E306BDF335264756E2164756E21",
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/evaluator/evaluation-context.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type {
|
|
5
|
+
"import type { DependencyNode } from \"../core/managers/dependency-node.mjs\";\nimport type { TableManager } from \"../core/managers/table-manager.mjs\";\nimport type { CellAddress } from \"../core/types.mjs\";\n\nexport class EvaluationContext {\n private _cellAddress: CellAddress;\n private _tableName: string | undefined;\n /**\n * Can be a range or a cell\n */\n private _dependencyNode: DependencyNode;\n constructor(\n tableManager: TableManager,\n dependencyNode: DependencyNode,\n cellAddress: CellAddress\n ) {\n this._dependencyNode = dependencyNode;\n this._cellAddress = cellAddress;\n const table = tableManager.isCellInTable(cellAddress);\n this._tableName = table?.name;\n }\n\n get dependencyNode() {\n return this._dependencyNode;\n }\n\n private _contextDependency: ContextDependency = {};\n\n getContextDependency() {\n return this._contextDependency;\n }\n\n /**\n * The cell context, the address of the cell being evaluated\n * and the context in which results should be stored\n */\n get cellAddress() {\n return this._cellAddress;\n }\n\n get tableName() {\n return this._tableName;\n }\n\n addContextDependency(...types: ContextDependencyType[]) {\n for (const type of types) {\n switch (type) {\n case \"row\":\n this._contextDependency.rowIndex = this._cellAddress.rowIndex;\n break;\n case \"col\":\n this._contextDependency.colIndex = this._cellAddress.colIndex;\n break;\n case \"workbook\":\n this._contextDependency.workbookName = this._cellAddress.workbookName;\n break;\n case \"sheet\":\n this._contextDependency.sheetName = this._cellAddress.sheetName;\n break;\n case \"table\":\n this._contextDependency.tableName = this.tableName;\n break;\n default:\n throw new Error(`Invalid context dependency type: ${type}`);\n }\n }\n }\n\n /**\n * When evaluating an AST node,\n * we need to append the subtree context\n * dependencies to the current context dependency\n */\n appendContextDependency(contextDependency: ContextDependency) {\n this._contextDependency = {\n ...this._contextDependency,\n ...Object.fromEntries(\n Object.entries(contextDependency).filter(\n ([key, value]) => value !== undefined\n )\n ),\n };\n }\n}\n\n/**\n * Each value has the same value as the origin cell\n * the defined keys are the ones the ast node is dependent on\n * e.g. A3=ROW() will have a context dependency of { rowIndex: 3 }\n *\n * The keys are ANDed together, e.g. { workbookName: \"Sheet1\", sheetName: \"Sheet2\" }\n * means the ast node is dependent on the workbook \"Sheet1\" and the sheet \"Sheet2\"\n */\nexport type ContextDependency = {\n workbookName?: string;\n sheetName?: string;\n tableName?: string;\n rowIndex?: number;\n colIndex?: number;\n};\n\nexport const contextDependencyKeys = [\n \"workbookName\",\n \"sheetName\",\n \"tableName\",\n \"rowIndex\",\n \"colIndex\",\n] as const;\n\n/**\n * These are some distinct scenarios where context dependencies are added\n */\nexport type ContextDependencyType =\n | \"row\"\n | \"col\"\n | \"workbook\"\n | \"sheet\"\n | \"table\";\n\n// * [astKey], // `=1+1`\n// * [astKey, sheetKey, workbookKey], // `B3`\n// * [astKey, workbookKey], // `Table1[Column1]`\n// * [astKey, workbookKey], // `Sheet1!B3`\n// * [astKey, cellAddress.rowIndex], // `ROW()`\n// * [astKey, cellAddress.colIndex], // `COL()`\n// * [astKey, cellAddress.rowIndex, cellAddress.colIndex] // `CELL(\"address\")`\n// * [astKey, tableKey, cellAddress.rowIndex], // `@Column1`\n// * [astKey, workbookKey, cellAddress.rowIndex], // `Table1[@Column1]`\n\ntype Dim = \"workbookName\" | \"sheetName\" | \"tableName\" | \"rowIndex\" | \"colIndex\";\nconst DIM_ORDER: readonly Dim[] = [\n \"workbookName\",\n \"sheetName\",\n \"tableName\",\n \"rowIndex\",\n \"colIndex\",\n] as const;\n\n/** Build the canonical cache key string for a dependency. */\nexport function keyFromDependency(dep: ContextDependency): string {\n return DIM_ORDER.map((k) =>\n dep[k] !== undefined ? `${k}:[${(dep as any)[k]}]` : `${k}:*`\n ).join(\",\");\n}\n\ntype Context = {\n workbookName: string;\n sheetName: string;\n tableName?: string;\n rowIndex: number;\n colIndex: number;\n};\n\n/** True if `dep` matches `ctx` (i.e., every specified field equals the context’s field). */\nexport function dependencyMatchesContext(\n ctx: Context,\n dep: ContextDependency\n): boolean {\n return DIM_ORDER.every(\n (k) => dep[k] === undefined || (dep as any)[k] === (ctx as any)[k]\n );\n}\n\nconst contextCacheKey = new Map<string, string[]>();\n\n/**\n * Generate every cache key that would be eligible for `ctx`.\n * By default returns keys ordered from most-specific to least-specific.\n */\nexport function eligibleKeysForContext(ctx: Context): string[] {\n const mostRestrictiveKey = keyFromDependency(ctx);\n const cachedKeys = contextCacheKey.get(mostRestrictiveKey);\n if (cachedKeys) {\n return cachedKeys;\n }\n\n const results: string[] = [];\n const n = DIM_ORDER.length;\n\n // If tableName is undefined in the context, we cannot create combos that \"specify\" it.\n const tableIdx = DIM_ORDER.indexOf(\"tableName\");\n\n const totalMasks = 1 << n; // 2^n\n for (let mask = 0; mask < totalMasks; mask++) {\n // Skip combos that specify tableName when ctx.tableName is undefined.\n if (ctx.tableName === undefined && ((mask >> tableIdx) & 1) === 1) continue;\n\n const dep: ContextDependency = {};\n for (let i = 0; i < n; i++) {\n if (((mask >> i) & 1) === 1) {\n const k = DIM_ORDER[i];\n const v = (ctx as any)[k!];\n // Only assign when we actually have a value (guards tableName: undefined)\n if (v !== undefined) (dep as any)[k!] = v;\n }\n }\n results.push(keyFromDependency(dep));\n }\n\n contextCacheKey.set(mostRestrictiveKey, results);\n\n return results;\n}\n\nexport function getContextDependencyKey(contextDependency: ContextDependency) {\n const keys: (string | number)[] = [];\n contextDependencyKeys.forEach((key) => {\n if (contextDependency[key] !== undefined) {\n keys.push(`${key}:[${contextDependency[key]}]`);\n } else {\n keys.push(`${key}:*`);\n }\n });\n return keys.join(\",\");\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";
|
|
7
|
+
"mappings": "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",
|
|
8
8
|
"debugId": "1AB9DAD8E987F90D64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/evaluator/evaluation-error.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { DependencyNode } from \"
|
|
5
|
+
"import type { DependencyNode } from \"../core/managers/dependency-node.mjs\";\nimport type { CellAddress, FormulaError } from \"../core/types.mjs\";\nimport { cellAddressToKey } from \"../core/utils.mjs\";\n\nexport class EvaluationError extends Error {\n constructor(\n public readonly type: FormulaError,\n message: string,\n public readonly errAddress?: DependencyNode\n ) {\n super(message);\n }\n}\n\nexport class AwaitingEvaluationError extends Error {\n constructor(\n public readonly errAddress: DependencyNode,\n public readonly waitingFor: DependencyNode\n ) {\n super(errAddress.key + \" is awaiting evaluation of \" + waitingFor.key);\n }\n}\n\nexport class SheetNotFoundError extends Error {\n constructor(public readonly sheetName: string) {\n super(\"Sheet not found: \" + sheetName);\n }\n}\n\nexport class WorkbookNotFoundError extends Error {\n constructor(public readonly workbookName: string) {\n super(\"Workbook not found: \" + workbookName);\n }\n}\n\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";AAIO,MAAM,wBAAwB,MAAM;AAAA,EAEvB;AAAA,EAEA;AAAA,EAHlB,WAAW,CACO,MAChB,SACgB,YAChB;AAAA,IACA,MAAM,OAAO;AAAA,IAJG;AAAA,IAEA;AAAA;AAIpB;AAAA;AAEO,MAAM,gCAAgC,MAAM;AAAA,EAE/B;AAAA,EACA;AAAA,EAFlB,WAAW,CACO,YACA,YAChB;AAAA,IACA,MAAM,WAAW,MAAM,gCAAgC,WAAW,GAAG;AAAA,IAHrD;AAAA,IACA;AAAA;AAIpB;AAAA;AAEO,MAAM,2BAA2B,MAAM;AAAA,EAChB;AAAA,EAA5B,WAAW,CAAiB,WAAmB;AAAA,IAC7C,MAAM,sBAAsB,SAAS;AAAA,IADX;AAAA;AAG9B;AAAA;AAEO,MAAM,8BAA8B,MAAM;AAAA,EACnB;AAAA,EAA5B,WAAW,CAAiB,cAAsB;AAAA,IAChD,MAAM,yBAAyB,YAAY;AAAA,IADjB;AAAA;AAG9B;",
|
|
8
8
|
"debugId": "02A2F6030CA52B7D64756E2164756E21",
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
// src/evaluator/formula-evaluator.ts
|
|
2
|
-
import { parseFormula } from "src/parser/parser";
|
|
3
2
|
import {
|
|
4
3
|
FormulaError
|
|
5
4
|
} from "../core/types.mjs";
|
|
6
|
-
import {
|
|
7
|
-
evaluateScalarOperator
|
|
8
|
-
} from "src/evaluator/evaluate-scalar-operator";
|
|
9
|
-
import { functions } from "src/functions";
|
|
5
|
+
import { parseFormula } from "../parser/parser.mjs";
|
|
10
6
|
import {
|
|
11
7
|
captureEvaluationErrors,
|
|
12
8
|
cellAddressToKey,
|
|
@@ -17,6 +13,10 @@ import {
|
|
|
17
13
|
isRangeOneCell,
|
|
18
14
|
rangeAddressToKey
|
|
19
15
|
} from "../core/utils.mjs";
|
|
16
|
+
import {
|
|
17
|
+
evaluateScalarOperator
|
|
18
|
+
} from "../evaluator/evaluate-scalar-operator.mjs";
|
|
19
|
+
import { functions } from "../functions/function-registry.mjs";
|
|
20
20
|
import { add } from "./arithmetic/add/add.mjs";
|
|
21
21
|
import { divide } from "./arithmetic/divide/divide.mjs";
|
|
22
22
|
import { multiply } from "./arithmetic/multiply/multiply.mjs";
|
|
@@ -29,8 +29,8 @@ import { lessThan } from "./comparison/less-than.mjs";
|
|
|
29
29
|
import { lessThanOrEqual } from "./comparison/less-than-or-equal.mjs";
|
|
30
30
|
import { notEquals } from "./comparison/not-equals.mjs";
|
|
31
31
|
import { concatenate } from "./concatenation/concatenate.mjs";
|
|
32
|
-
import { EvaluationContext } from "./evaluation-context.mjs";
|
|
33
32
|
import { CellValueNode } from "./dependency-nodes/cell-value-node.mjs";
|
|
33
|
+
import { EvaluationContext } from "./evaluation-context.mjs";
|
|
34
34
|
|
|
35
35
|
class FormulaEvaluator {
|
|
36
36
|
tableManager;
|
|
@@ -777,4 +777,4 @@ export {
|
|
|
777
777
|
FormulaEvaluator
|
|
778
778
|
};
|
|
779
779
|
|
|
780
|
-
//# debugId=
|
|
780
|
+
//# debugId=D0163067F1378BC864756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/evaluator/formula-evaluator.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { parseFormula } from \"src/parser/parser\";\nimport type {\n LocalCellAddress,\n RangeAddress,\n SingleEvaluationResult,\n} from \"../core/types.mjs\";\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.mjs\";\n\nimport type { DependencyManager } from \"src/core/managers/dependency-manager\";\nimport type { TableManager } from \"src/core/managers/table-manager\";\nimport type { WorkbookManager } from \"src/core/managers/workbook-manager\";\nimport {\n evaluateScalarOperator,\n type EvaluateScalarOperatorOptions,\n} from \"src/evaluator/evaluate-scalar-operator\";\nimport { functions } from \"src/functions\";\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 \"src/parser/ast\";\nimport {\n captureEvaluationErrors,\n cellAddressToKey,\n getAbsoluteRange,\n getCellReference,\n getRangeIntersection,\n getRangeKey,\n getRelativeRange,\n getRelativeRangeKey,\n isRangeOneCell,\n rangeAddressToKey,\n} from \"../core/utils.mjs\";\nimport { add } from \"./arithmetic/add/add.mjs\";\nimport { divide } from \"./arithmetic/divide/divide.mjs\";\nimport { multiply } from \"./arithmetic/multiply/multiply.mjs\";\nimport { power } from \"./arithmetic/power/power.mjs\";\nimport { subtract } from \"./arithmetic/subtract/subtract.mjs\";\nimport { equals } from \"./comparison/equals.mjs\";\nimport { greaterThan } from \"./comparison/greater-than.mjs\";\nimport { greaterThanOrEqual } from \"./comparison/greater-than-or-equal.mjs\";\nimport { lessThan } from \"./comparison/less-than.mjs\";\nimport { lessThanOrEqual } from \"./comparison/less-than-or-equal.mjs\";\nimport { notEquals } from \"./comparison/not-equals.mjs\";\nimport { concatenate } from \"./concatenation/concatenate.mjs\";\nimport type { NamedExpressionManager } from \"src/core/managers/named-expression-manager\";\nimport { EvaluationContext } from \"./evaluation-context.mjs\";\nimport { flags } from \"src/debug/flags\";\nimport { AwaitingEvaluationError, EvaluationError } from \"./evaluation-error.mjs\";\nimport { formatFormula } from \"src/parser/formatter\";\nimport { CellValueNode } from \"./dependency-nodes/cell-value-node.mjs\";\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.tableName,\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 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\n context.appendContextDependency(astContextDependency);\n\n return result;\n }\n\n evaluateStructuredReference(\n node: StructuredReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\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, we need to find the table in the current workbook\n // and the formula will be evaluated differently based on the table (and workbook) we are evaluating it in\n context.addContextDependency(\"workbook\", \"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 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 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 expression = this.namedExpressionManager.resolveNamedExpression(\n node,\n context\n );\n\n if (!expression) {\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 return this.evaluateFormula(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.mjs\";\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.mjs\";\nimport { parseFormula } from \"../parser/parser.mjs\";\n\nimport type { DependencyManager } from \"../core/managers/dependency-manager.mjs\";\nimport type { NamedExpressionManager } from \"../core/managers/named-expression-manager.mjs\";\nimport type { TableManager } from \"../core/managers/table-manager.mjs\";\nimport {\n captureEvaluationErrors,\n cellAddressToKey,\n getAbsoluteRange,\n getRangeIntersection,\n getRangeKey,\n getRelativeRange,\n isRangeOneCell,\n rangeAddressToKey,\n} from \"../core/utils.mjs\";\nimport {\n evaluateScalarOperator,\n type EvaluateScalarOperatorOptions,\n} from \"../evaluator/evaluate-scalar-operator.mjs\";\nimport { functions } from \"../functions/function-registry.mjs\";\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.mjs\";\nimport { add } from \"./arithmetic/add/add.mjs\";\nimport { divide } from \"./arithmetic/divide/divide.mjs\";\nimport { multiply } from \"./arithmetic/multiply/multiply.mjs\";\nimport { power } from \"./arithmetic/power/power.mjs\";\nimport { subtract } from \"./arithmetic/subtract/subtract.mjs\";\nimport { equals } from \"./comparison/equals.mjs\";\nimport { greaterThan } from \"./comparison/greater-than.mjs\";\nimport { greaterThanOrEqual } from \"./comparison/greater-than-or-equal.mjs\";\nimport { lessThan } from \"./comparison/less-than.mjs\";\nimport { lessThanOrEqual } from \"./comparison/less-than-or-equal.mjs\";\nimport { notEquals } from \"./comparison/not-equals.mjs\";\nimport { concatenate } from \"./concatenation/concatenate.mjs\";\nimport { CellValueNode } from \"./dependency-nodes/cell-value-node.mjs\";\nimport { EvaluationContext } from \"./evaluation-context.mjs\";\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.tableName,\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 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\n context.appendContextDependency(astContextDependency);\n\n return result;\n }\n\n evaluateStructuredReference(\n node: StructuredReferenceNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\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, we need to find the table in the current workbook\n // and the formula will be evaluated differently based on the table (and workbook) we are evaluating it in\n context.addContextDependency(\"workbook\", \"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 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 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 expression = this.namedExpressionManager.resolveNamedExpression(\n node,\n context\n );\n\n if (!expression) {\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 return this.evaluateFormula(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": "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",
|
|
8
|
+
"debugId": "D0163067F1378BC864756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/evaluator/range-evaluation-node.ts
|
|
2
|
-
import { FrontierDependencyManager } from "
|
|
3
|
-
import { getRangeKey, keyToRangeAddress } from "
|
|
2
|
+
import { FrontierDependencyManager } from "../core/managers/frontier-dependency-manager.mjs";
|
|
3
|
+
import { getRangeKey, keyToRangeAddress } from "../core/utils.mjs";
|
|
4
4
|
|
|
5
5
|
class RangeEvaluationNode extends FrontierDependencyManager {
|
|
6
6
|
rangeKey;
|
|
@@ -55,4 +55,4 @@ export {
|
|
|
55
55
|
RangeEvaluationNode
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
-
//# debugId=
|
|
58
|
+
//# debugId=E7418D30D9D7EAAD64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/evaluator/range-evaluation-node.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { DependencyManager } from \"
|
|
5
|
+
"import type { DependencyManager } from \"../core/managers/dependency-manager.mjs\";\nimport { FrontierDependencyManager } from \"../core/managers/frontier-dependency-manager.mjs\";\nimport type { WorkbookManager } from \"../core/managers/workbook-manager.mjs\";\nimport type { EvaluateAllCellsResult, RangeAddress } from \"../core/types.mjs\";\nimport { getRangeKey, keyToRangeAddress } from \"../core/utils.mjs\";\n\nexport class RangeEvaluationNode extends FrontierDependencyManager {\n public key: string;\n public address: RangeAddress;\n\n private _result: EvaluateAllCellsResult;\n\n constructor(\n public rangeKey: string,\n dependencyManager: DependencyManager,\n workbookManager: WorkbookManager\n ) {\n const rangeAddress = keyToRangeAddress(rangeKey);\n super(rangeAddress, workbookManager, dependencyManager);\n\n this.address = rangeAddress;\n this.key = rangeKey;\n this._result = {\n type: \"awaiting-evaluation\",\n waitingFor: this,\n errAddress: this,\n };\n }\n\n setResult(result: EvaluateAllCellsResult): void {\n this._result = result;\n }\n\n public get result(): EvaluateAllCellsResult {\n return this._result;\n }\n\n public override canResolve(): boolean {\n return super.canResolve() && this._result.type !== \"awaiting-evaluation\";\n }\n\n toJSON(visitor: Set<string> = new Set()): any {\n const hasVisited = visitor?.has(this.key);\n visitor?.add(this.key);\n if (hasVisited) {\n return {\n key: this.key,\n resolved: this.resolved,\n cycle: true,\n dependencies: [],\n frontierDependencies: [],\n };\n }\n return {\n key: this.key,\n resolved: this.resolved,\n dependencies: Array.from(this.getDependencies()).map((node) =>\n node.toJSON(visitor)\n ),\n frontierDependencies: Array.from(this.getFrontierDependencies()).map(\n (node) => node.toJSON(visitor)\n ),\n };\n }\n\n public override toString(): string {\n return getRangeKey(this.address.range);\n }\n}\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";AACA;AAGA;AAAA;AAEO,MAAM,4BAA4B,0BAA0B;AAAA,EAOxD;AAAA,EANF;AAAA,EACA;AAAA,EAEC;AAAA,EAER,WAAW,CACF,UACP,mBACA,iBACA;AAAA,IACA,MAAM,eAAe,kBAAkB,QAAQ;AAAA,IAC/C,MAAM,cAAc,iBAAiB,iBAAiB;AAAA,IAL/C;AAAA,IAOP,KAAK,UAAU;AAAA,IACf,KAAK,MAAM;AAAA,IACX,KAAK,UAAU;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,IACd;AAAA;AAAA,EAGF,SAAS,CAAC,QAAsC;AAAA,IAC9C,KAAK,UAAU;AAAA;AAAA,MAGN,MAAM,GAA2B;AAAA,IAC1C,OAAO,KAAK;AAAA;AAAA,EAGE,UAAU,GAAY;AAAA,IACpC,OAAO,MAAM,WAAW,KAAK,KAAK,QAAQ,SAAS;AAAA;AAAA,EAGrD,MAAM,CAAC,UAAuB,IAAI,KAAY;AAAA,IAC5C,MAAM,aAAa,SAAS,IAAI,KAAK,GAAG;AAAA,IACxC,SAAS,IAAI,KAAK,GAAG;AAAA,IACrB,IAAI,YAAY;AAAA,MACd,OAAO;AAAA,QACL,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,OAAO;AAAA,QACP,cAAc,CAAC;AAAA,QACf,sBAAsB,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,UAAU,KAAK;AAAA,MACf,cAAc,MAAM,KAAK,KAAK,gBAAgB,CAAC,EAAE,IAAI,CAAC,SACpD,KAAK,OAAO,OAAO,CACrB;AAAA,MACA,sBAAsB,MAAM,KAAK,KAAK,wBAAwB,CAAC,EAAE,IAC/D,CAAC,SAAS,KAAK,OAAO,OAAO,CAC/B;AAAA,IACF;AAAA;AAAA,EAGc,QAAQ,GAAW;AAAA,IACjC,OAAO,YAAY,KAAK,QAAQ,KAAK;AAAA;AAEzC;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "E7418D30D9D7EAAD64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/functions/_template/template.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n} from \"
|
|
5
|
+
"import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n} from \"../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../evaluator/evaluation-context.mjs\";\n\n/**\n * TEMPLATE function implementation\n */\nexport const TEMPLATE: FunctionDefinition = {\n name: \"TEMPLATE\",\n evaluate: function (node, context): FunctionEvaluationResult {\n throw new Error(\"Function not implemented\");\n },\n};\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";AAiBO,IAAM,WAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,MAAM,IAAI,MAAM,0BAA0B;AAAA;AAE9C;",
|
|
8
8
|
"debugId": "0300F5943370881264756E2164756E21",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// src/functions/array/sequence/sequence.ts
|
|
2
2
|
import {
|
|
3
3
|
FormulaError
|
|
4
|
-
} from "
|
|
5
|
-
import { getRangeIntersection, isRangeOneCell } from "
|
|
6
|
-
import { EvaluationError } from "
|
|
4
|
+
} from "../../../core/types.mjs";
|
|
5
|
+
import { getRangeIntersection, isRangeOneCell } from "../../../core/utils.mjs";
|
|
6
|
+
import { EvaluationError } from "../../../evaluator/evaluation-error.mjs";
|
|
7
7
|
var SEQUENCE = {
|
|
8
8
|
name: "SEQUENCE",
|
|
9
9
|
evaluate: function(node, context) {
|
|
@@ -284,4 +284,4 @@ export {
|
|
|
284
284
|
SEQUENCE
|
|
285
285
|
};
|
|
286
286
|
|
|
287
|
-
//# debugId=
|
|
287
|
+
//# debugId=F8677D1ADD5AA85464756E2164756E21
|