@ricsam/formula-engine 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -0
- package/dist/cjs/core/ast-traverser.cjs +124 -0
- package/dist/cjs/core/ast-traverser.cjs.map +10 -0
- package/dist/cjs/core/autofill-utils.cjs +304 -0
- package/dist/cjs/core/autofill-utils.cjs.map +10 -0
- package/dist/cjs/core/engine.cjs +390 -0
- package/dist/cjs/core/engine.cjs.map +10 -0
- package/dist/cjs/core/managers/cache-manager.cjs +58 -0
- package/dist/cjs/core/managers/cache-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/dependency-manager.cjs +620 -0
- package/dist/cjs/core/managers/dependency-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/dependency-node.cjs +24 -0
- package/dist/cjs/core/managers/dependency-node.cjs.map +9 -0
- package/dist/cjs/core/managers/evaluation-manager.cjs +433 -0
- package/dist/cjs/core/managers/evaluation-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/event-manager.cjs +49 -0
- package/dist/cjs/core/managers/event-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/frontier-dependency-manager.cjs +181 -0
- package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/index.cjs +49 -0
- package/dist/cjs/core/managers/index.cjs.map +10 -0
- package/dist/cjs/core/managers/isDependencyNode.cjs +44 -0
- package/dist/cjs/core/managers/isDependencyNode.cjs.map +10 -0
- package/dist/cjs/core/managers/named-expression-manager.cjs +379 -0
- package/dist/cjs/core/managers/named-expression-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/range-eval-order-builder.cjs +644 -0
- package/dist/cjs/core/managers/range-eval-order-builder.cjs.map +10 -0
- package/dist/cjs/core/managers/table-manager.cjs +254 -0
- package/dist/cjs/core/managers/table-manager.cjs.map +10 -0
- package/dist/cjs/core/managers/workbook-manager.cjs +474 -0
- package/dist/cjs/core/managers/workbook-manager.cjs.map +10 -0
- package/dist/cjs/core/map-serializer.cjs +69 -0
- package/dist/cjs/core/map-serializer.cjs.map +10 -0
- package/dist/cjs/core/named-expression-renamer.cjs +88 -0
- package/dist/cjs/core/named-expression-renamer.cjs.map +10 -0
- package/dist/cjs/core/sheet-renamer.cjs +89 -0
- package/dist/cjs/core/sheet-renamer.cjs.map +10 -0
- package/dist/cjs/core/sheet-utils.cjs +39 -0
- package/dist/cjs/core/sheet-utils.cjs.map +10 -0
- package/dist/cjs/core/table-renamer.cjs +88 -0
- package/dist/cjs/core/table-renamer.cjs.map +10 -0
- package/dist/cjs/core/types.cjs +48 -0
- package/dist/cjs/core/types.cjs.map +10 -0
- package/dist/cjs/core/utils/range-serializer.cjs +65 -0
- package/dist/cjs/core/utils/range-serializer.cjs.map +10 -0
- package/dist/cjs/core/utils/spreadsheet-visualizer.cjs +142 -0
- package/dist/cjs/core/utils/spreadsheet-visualizer.cjs.map +10 -0
- package/dist/cjs/core/utils.cjs +434 -0
- package/dist/cjs/core/utils.cjs.map +10 -0
- package/dist/cjs/core/workbook-renamer.cjs +106 -0
- package/dist/cjs/core/workbook-renamer.cjs.map +10 -0
- package/dist/cjs/debug/flags.cjs +47 -0
- package/dist/cjs/debug/flags.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/add/add.cjs +82 -0
- package/dist/cjs/evaluator/arithmetic/add/add.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/divide/divide.cjs +107 -0
- package/dist/cjs/evaluator/arithmetic/divide/divide.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs +93 -0
- package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/power/power.cjs +125 -0
- package/dist/cjs/evaluator/arithmetic/power/power.cjs.map +10 -0
- package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs +84 -0
- package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/equals.cjs +64 -0
- package/dist/cjs/evaluator/comparison/equals.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs +61 -0
- package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/greater-than.cjs +61 -0
- package/dist/cjs/evaluator/comparison/greater-than.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs +69 -0
- package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/less-than.cjs +68 -0
- package/dist/cjs/evaluator/comparison/less-than.cjs.map +10 -0
- package/dist/cjs/evaluator/comparison/not-equals.cjs +53 -0
- package/dist/cjs/evaluator/comparison/not-equals.cjs.map +10 -0
- package/dist/cjs/evaluator/concatenation/concatenate.cjs +72 -0
- package/dist/cjs/evaluator/concatenation/concatenate.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs +58 -0
- package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs +112 -0
- package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs +54 -0
- package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs +108 -0
- package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs.map +10 -0
- package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs +50 -0
- package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs.map +10 -0
- package/dist/cjs/evaluator/evaluate-scalar-operator.cjs +254 -0
- package/dist/cjs/evaluator/evaluate-scalar-operator.cjs.map +10 -0
- package/dist/cjs/evaluator/evaluation-context.cjs +154 -0
- package/dist/cjs/evaluator/evaluation-context.cjs.map +10 -0
- package/dist/cjs/evaluator/evaluation-error.cjs +75 -0
- package/dist/cjs/evaluator/evaluation-error.cjs.map +10 -0
- package/dist/cjs/evaluator/formula-evaluator.cjs +797 -0
- package/dist/cjs/evaluator/formula-evaluator.cjs.map +10 -0
- package/dist/cjs/evaluator/range-evaluation-node.cjs +88 -0
- package/dist/cjs/evaluator/range-evaluation-node.cjs.map +10 -0
- package/dist/cjs/functions/_template/template.cjs +42 -0
- package/dist/cjs/functions/_template/template.cjs.map +10 -0
- package/dist/cjs/functions/array/sequence/sequence.cjs +315 -0
- package/dist/cjs/functions/array/sequence/sequence.cjs.map +10 -0
- package/dist/cjs/functions/criteria-parser.cjs +217 -0
- package/dist/cjs/functions/criteria-parser.cjs.map +10 -0
- package/dist/cjs/functions/criteria-utils.cjs +291 -0
- package/dist/cjs/functions/criteria-utils.cjs.map +10 -0
- package/dist/cjs/functions/function-utils.cjs +63 -0
- package/dist/cjs/functions/function-utils.cjs.map +10 -0
- package/dist/cjs/functions/index.cjs +125 -0
- package/dist/cjs/functions/index.cjs.map +10 -0
- package/dist/cjs/functions/information/cell/cell.cjs +196 -0
- package/dist/cjs/functions/information/cell/cell.cjs.map +10 -0
- package/dist/cjs/functions/information/column/column.cjs +144 -0
- package/dist/cjs/functions/information/column/column.cjs.map +10 -0
- package/dist/cjs/functions/information/row/row.cjs +150 -0
- package/dist/cjs/functions/information/row/row.cjs.map +10 -0
- package/dist/cjs/functions/logical/and/and.cjs +112 -0
- package/dist/cjs/functions/logical/and/and.cjs.map +10 -0
- package/dist/cjs/functions/logical/if/if.cjs +195 -0
- package/dist/cjs/functions/logical/if/if.cjs.map +10 -0
- package/dist/cjs/functions/logical/iferror/iferror.cjs +126 -0
- package/dist/cjs/functions/logical/iferror/iferror.cjs.map +10 -0
- package/dist/cjs/functions/logical/or/or.cjs +112 -0
- package/dist/cjs/functions/logical/or/or.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/count-utils.cjs +65 -0
- package/dist/cjs/functions/lookup/count/count-utils.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/count.cjs +48 -0
- package/dist/cjs/functions/lookup/count/count.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/countif.cjs +94 -0
- package/dist/cjs/functions/lookup/count/countif.cjs.map +10 -0
- package/dist/cjs/functions/lookup/count/countifs.cjs +63 -0
- package/dist/cjs/functions/lookup/count/countifs.cjs.map +10 -0
- package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs +187 -0
- package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs.map +10 -0
- package/dist/cjs/functions/lookup/match/match.cjs +168 -0
- package/dist/cjs/functions/lookup/match/match.cjs.map +10 -0
- package/dist/cjs/functions/lookup/xlookup/xlookup.cjs +410 -0
- package/dist/cjs/functions/lookup/xlookup/xlookup.cjs.map +10 -0
- package/dist/cjs/functions/math/average/average-utils.cjs +72 -0
- package/dist/cjs/functions/math/average/average-utils.cjs.map +10 -0
- package/dist/cjs/functions/math/average/average.cjs +48 -0
- package/dist/cjs/functions/math/average/average.cjs.map +10 -0
- package/dist/cjs/functions/math/average/averageif.cjs +83 -0
- package/dist/cjs/functions/math/average/averageif.cjs.map +10 -0
- package/dist/cjs/functions/math/average/averageifs.cjs +61 -0
- package/dist/cjs/functions/math/average/averageifs.cjs.map +10 -0
- package/dist/cjs/functions/math/ceiling/ceiling.cjs +219 -0
- package/dist/cjs/functions/math/ceiling/ceiling.cjs.map +10 -0
- package/dist/cjs/functions/math/max/max-utils.cjs +71 -0
- package/dist/cjs/functions/math/max/max-utils.cjs.map +10 -0
- package/dist/cjs/functions/math/max/max.cjs +48 -0
- package/dist/cjs/functions/math/max/max.cjs.map +10 -0
- package/dist/cjs/functions/math/max/maxif.cjs +83 -0
- package/dist/cjs/functions/math/max/maxif.cjs.map +10 -0
- package/dist/cjs/functions/math/max/maxifs.cjs +61 -0
- package/dist/cjs/functions/math/max/maxifs.cjs.map +10 -0
- package/dist/cjs/functions/math/min/min-utils.cjs +71 -0
- package/dist/cjs/functions/math/min/min-utils.cjs.map +10 -0
- package/dist/cjs/functions/math/min/min.cjs +48 -0
- package/dist/cjs/functions/math/min/min.cjs.map +10 -0
- package/dist/cjs/functions/math/min/minif.cjs +83 -0
- package/dist/cjs/functions/math/min/minif.cjs.map +10 -0
- package/dist/cjs/functions/math/min/minifs.cjs +61 -0
- package/dist/cjs/functions/math/min/minifs.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/sum.cjs +48 -0
- package/dist/cjs/functions/math/sum/sum.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/sumif.cjs +83 -0
- package/dist/cjs/functions/math/sum/sumif.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/sumifs.cjs +60 -0
- package/dist/cjs/functions/math/sum/sumifs.cjs.map +10 -0
- package/dist/cjs/functions/math/sum/summation-utils.cjs +57 -0
- package/dist/cjs/functions/math/sum/summation-utils.cjs.map +10 -0
- package/dist/cjs/functions/reference/address/address.cjs +163 -0
- package/dist/cjs/functions/reference/address/address.cjs.map +10 -0
- package/dist/cjs/functions/reference/indirect/indirect.cjs +102 -0
- package/dist/cjs/functions/reference/indirect/indirect.cjs.map +10 -0
- package/dist/cjs/functions/reference/offset/offset.cjs +233 -0
- package/dist/cjs/functions/reference/offset/offset.cjs.map +10 -0
- package/dist/cjs/functions/text/concatenate/concatenate.cjs +167 -0
- package/dist/cjs/functions/text/concatenate/concatenate.cjs.map +10 -0
- package/dist/cjs/functions/text/exact/exact.cjs +171 -0
- package/dist/cjs/functions/text/exact/exact.cjs.map +10 -0
- package/dist/cjs/functions/text/find/find.cjs +397 -0
- package/dist/cjs/functions/text/find/find.cjs.map +10 -0
- package/dist/cjs/functions/text/left/left.cjs +109 -0
- package/dist/cjs/functions/text/left/left.cjs.map +10 -0
- package/dist/cjs/functions/text/len/len.cjs +119 -0
- package/dist/cjs/functions/text/len/len.cjs.map +10 -0
- package/dist/cjs/functions/text/mid/mid.cjs +103 -0
- package/dist/cjs/functions/text/mid/mid.cjs.map +10 -0
- package/dist/cjs/functions/text/right/right.cjs +167 -0
- package/dist/cjs/functions/text/right/right.cjs.map +10 -0
- package/dist/cjs/functions/text/text-helpers.cjs +179 -0
- package/dist/cjs/functions/text/text-helpers.cjs.map +10 -0
- package/dist/cjs/functions/text/textjoin/textjoin.cjs +173 -0
- package/dist/cjs/functions/text/textjoin/textjoin.cjs.map +10 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/parser/ast.cjs +175 -0
- package/dist/cjs/parser/ast.cjs.map +10 -0
- package/dist/cjs/parser/formatter.cjs +319 -0
- package/dist/cjs/parser/formatter.cjs.map +10 -0
- package/dist/cjs/parser/grammar.cjs +375 -0
- package/dist/cjs/parser/grammar.cjs.map +10 -0
- package/dist/cjs/parser/lexer.cjs +443 -0
- package/dist/cjs/parser/lexer.cjs.map +10 -0
- package/dist/cjs/parser/parser.cjs +1700 -0
- package/dist/cjs/parser/parser.cjs.map +10 -0
- package/dist/cjs/react/hooks.cjs +59 -0
- package/dist/cjs/react/hooks.cjs.map +10 -0
- package/dist/mjs/core/ast-traverser.mjs +94 -0
- package/dist/mjs/core/ast-traverser.mjs.map +10 -0
- package/dist/mjs/core/autofill-utils.mjs +274 -0
- package/dist/mjs/core/autofill-utils.mjs.map +10 -0
- package/dist/mjs/core/engine.mjs +366 -0
- package/dist/mjs/core/engine.mjs.map +10 -0
- package/dist/mjs/core/managers/cache-manager.mjs +27 -0
- package/dist/mjs/core/managers/cache-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/dependency-manager.mjs +593 -0
- package/dist/mjs/core/managers/dependency-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/dependency-node.mjs +2 -0
- package/dist/mjs/core/managers/dependency-node.mjs.map +9 -0
- package/dist/mjs/core/managers/evaluation-manager.mjs +415 -0
- package/dist/mjs/core/managers/evaluation-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/event-manager.mjs +18 -0
- package/dist/mjs/core/managers/event-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/frontier-dependency-manager.mjs +151 -0
- package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/index.mjs +21 -0
- package/dist/mjs/core/managers/index.mjs.map +10 -0
- package/dist/mjs/core/managers/isDependencyNode.mjs +14 -0
- package/dist/mjs/core/managers/isDependencyNode.mjs.map +10 -0
- package/dist/mjs/core/managers/named-expression-manager.mjs +348 -0
- package/dist/mjs/core/managers/named-expression-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/range-eval-order-builder.mjs +618 -0
- package/dist/mjs/core/managers/range-eval-order-builder.mjs.map +10 -0
- package/dist/mjs/core/managers/table-manager.mjs +224 -0
- package/dist/mjs/core/managers/table-manager.mjs.map +10 -0
- package/dist/mjs/core/managers/workbook-manager.mjs +447 -0
- package/dist/mjs/core/managers/workbook-manager.mjs.map +10 -0
- package/dist/mjs/core/map-serializer.mjs +39 -0
- package/dist/mjs/core/map-serializer.mjs.map +10 -0
- package/dist/mjs/core/named-expression-renamer.mjs +58 -0
- package/dist/mjs/core/named-expression-renamer.mjs.map +10 -0
- package/dist/mjs/core/sheet-renamer.mjs +59 -0
- package/dist/mjs/core/sheet-renamer.mjs.map +10 -0
- package/dist/mjs/core/sheet-utils.mjs +8 -0
- package/dist/mjs/core/sheet-utils.mjs.map +10 -0
- package/dist/mjs/core/table-renamer.mjs +58 -0
- package/dist/mjs/core/table-renamer.mjs.map +10 -0
- package/dist/mjs/core/types.mjs +18 -0
- package/dist/mjs/core/types.mjs.map +10 -0
- package/dist/mjs/core/utils/range-serializer.mjs +35 -0
- package/dist/mjs/core/utils/range-serializer.mjs.map +10 -0
- package/dist/mjs/core/utils/spreadsheet-visualizer.mjs +112 -0
- package/dist/mjs/core/utils/spreadsheet-visualizer.mjs.map +10 -0
- package/dist/mjs/core/utils.mjs +409 -0
- package/dist/mjs/core/utils.mjs.map +10 -0
- package/dist/mjs/core/workbook-renamer.mjs +76 -0
- package/dist/mjs/core/workbook-renamer.mjs.map +10 -0
- package/dist/mjs/debug/flags.mjs +17 -0
- package/dist/mjs/debug/flags.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/add/add.mjs +52 -0
- package/dist/mjs/evaluator/arithmetic/add/add.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/divide/divide.mjs +77 -0
- package/dist/mjs/evaluator/arithmetic/divide/divide.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs +63 -0
- package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/power/power.mjs +95 -0
- package/dist/mjs/evaluator/arithmetic/power/power.mjs.map +10 -0
- package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs +54 -0
- package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/equals.mjs +34 -0
- package/dist/mjs/evaluator/comparison/equals.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs +31 -0
- package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/greater-than.mjs +31 -0
- package/dist/mjs/evaluator/comparison/greater-than.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs +39 -0
- package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/less-than.mjs +38 -0
- package/dist/mjs/evaluator/comparison/less-than.mjs.map +10 -0
- package/dist/mjs/evaluator/comparison/not-equals.mjs +23 -0
- package/dist/mjs/evaluator/comparison/not-equals.mjs.map +10 -0
- package/dist/mjs/evaluator/concatenation/concatenate.mjs +42 -0
- package/dist/mjs/evaluator/concatenation/concatenate.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs +28 -0
- package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs +81 -0
- package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs +24 -0
- package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs +78 -0
- package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs.map +10 -0
- package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs +20 -0
- package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs.map +10 -0
- package/dist/mjs/evaluator/evaluate-scalar-operator.mjs +226 -0
- package/dist/mjs/evaluator/evaluate-scalar-operator.mjs.map +10 -0
- package/dist/mjs/evaluator/evaluation-context.mjs +123 -0
- package/dist/mjs/evaluator/evaluation-context.mjs.map +10 -0
- package/dist/mjs/evaluator/evaluation-error.mjs +44 -0
- package/dist/mjs/evaluator/evaluation-error.mjs.map +10 -0
- package/dist/mjs/evaluator/formula-evaluator.mjs +780 -0
- package/dist/mjs/evaluator/formula-evaluator.mjs.map +10 -0
- package/dist/mjs/evaluator/range-evaluation-node.mjs +58 -0
- package/dist/mjs/evaluator/range-evaluation-node.mjs.map +10 -0
- package/dist/mjs/functions/_template/template.mjs +12 -0
- package/dist/mjs/functions/_template/template.mjs.map +10 -0
- package/dist/mjs/functions/array/sequence/sequence.mjs +287 -0
- package/dist/mjs/functions/array/sequence/sequence.mjs.map +10 -0
- package/dist/mjs/functions/criteria-parser.mjs +187 -0
- package/dist/mjs/functions/criteria-parser.mjs.map +10 -0
- package/dist/mjs/functions/criteria-utils.mjs +268 -0
- package/dist/mjs/functions/criteria-utils.mjs.map +10 -0
- package/dist/mjs/functions/function-utils.mjs +33 -0
- package/dist/mjs/functions/function-utils.mjs.map +10 -0
- package/dist/mjs/functions/index.mjs +95 -0
- package/dist/mjs/functions/index.mjs.map +10 -0
- package/dist/mjs/functions/information/cell/cell.mjs +168 -0
- package/dist/mjs/functions/information/cell/cell.mjs.map +10 -0
- package/dist/mjs/functions/information/column/column.mjs +120 -0
- package/dist/mjs/functions/information/column/column.mjs.map +10 -0
- package/dist/mjs/functions/information/row/row.mjs +126 -0
- package/dist/mjs/functions/information/row/row.mjs.map +10 -0
- package/dist/mjs/functions/logical/and/and.mjs +84 -0
- package/dist/mjs/functions/logical/and/and.mjs.map +10 -0
- package/dist/mjs/functions/logical/if/if.mjs +167 -0
- package/dist/mjs/functions/logical/if/if.mjs.map +10 -0
- package/dist/mjs/functions/logical/iferror/iferror.mjs +98 -0
- package/dist/mjs/functions/logical/iferror/iferror.mjs.map +10 -0
- package/dist/mjs/functions/logical/or/or.mjs +84 -0
- package/dist/mjs/functions/logical/or/or.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/count-utils.mjs +35 -0
- package/dist/mjs/functions/lookup/count/count-utils.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/count.mjs +18 -0
- package/dist/mjs/functions/lookup/count/count.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/countif.mjs +68 -0
- package/dist/mjs/functions/lookup/count/countif.mjs.map +10 -0
- package/dist/mjs/functions/lookup/count/countifs.mjs +37 -0
- package/dist/mjs/functions/lookup/count/countifs.mjs.map +10 -0
- package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs +159 -0
- package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs.map +10 -0
- package/dist/mjs/functions/lookup/match/match.mjs +140 -0
- package/dist/mjs/functions/lookup/match/match.mjs.map +10 -0
- package/dist/mjs/functions/lookup/xlookup/xlookup.mjs +382 -0
- package/dist/mjs/functions/lookup/xlookup/xlookup.mjs.map +10 -0
- package/dist/mjs/functions/math/average/average-utils.mjs +44 -0
- package/dist/mjs/functions/math/average/average-utils.mjs.map +10 -0
- package/dist/mjs/functions/math/average/average.mjs +18 -0
- package/dist/mjs/functions/math/average/average.mjs.map +10 -0
- package/dist/mjs/functions/math/average/averageif.mjs +58 -0
- package/dist/mjs/functions/math/average/averageif.mjs.map +10 -0
- package/dist/mjs/functions/math/average/averageifs.mjs +35 -0
- package/dist/mjs/functions/math/average/averageifs.mjs.map +10 -0
- package/dist/mjs/functions/math/ceiling/ceiling.mjs +191 -0
- package/dist/mjs/functions/math/ceiling/ceiling.mjs.map +10 -0
- package/dist/mjs/functions/math/max/max-utils.mjs +43 -0
- package/dist/mjs/functions/math/max/max-utils.mjs.map +10 -0
- package/dist/mjs/functions/math/max/max.mjs +18 -0
- package/dist/mjs/functions/math/max/max.mjs.map +10 -0
- package/dist/mjs/functions/math/max/maxif.mjs +58 -0
- package/dist/mjs/functions/math/max/maxif.mjs.map +10 -0
- package/dist/mjs/functions/math/max/maxifs.mjs +35 -0
- package/dist/mjs/functions/math/max/maxifs.mjs.map +10 -0
- package/dist/mjs/functions/math/min/min-utils.mjs +43 -0
- package/dist/mjs/functions/math/min/min-utils.mjs.map +10 -0
- package/dist/mjs/functions/math/min/min.mjs +18 -0
- package/dist/mjs/functions/math/min/min.mjs.map +10 -0
- package/dist/mjs/functions/math/min/minif.mjs +58 -0
- package/dist/mjs/functions/math/min/minif.mjs.map +10 -0
- package/dist/mjs/functions/math/min/minifs.mjs +35 -0
- package/dist/mjs/functions/math/min/minifs.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/sum.mjs +18 -0
- package/dist/mjs/functions/math/sum/sum.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/sumif.mjs +58 -0
- package/dist/mjs/functions/math/sum/sumif.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/sumifs.mjs +34 -0
- package/dist/mjs/functions/math/sum/sumifs.mjs.map +10 -0
- package/dist/mjs/functions/math/sum/summation-utils.mjs +27 -0
- package/dist/mjs/functions/math/sum/summation-utils.mjs.map +10 -0
- package/dist/mjs/functions/reference/address/address.mjs +135 -0
- package/dist/mjs/functions/reference/address/address.mjs.map +10 -0
- package/dist/mjs/functions/reference/indirect/indirect.mjs +74 -0
- package/dist/mjs/functions/reference/indirect/indirect.mjs.map +10 -0
- package/dist/mjs/functions/reference/offset/offset.mjs +205 -0
- package/dist/mjs/functions/reference/offset/offset.mjs.map +10 -0
- package/dist/mjs/functions/text/concatenate/concatenate.mjs +139 -0
- package/dist/mjs/functions/text/concatenate/concatenate.mjs.map +10 -0
- package/dist/mjs/functions/text/exact/exact.mjs +143 -0
- package/dist/mjs/functions/text/exact/exact.mjs.map +10 -0
- package/dist/mjs/functions/text/find/find.mjs +369 -0
- package/dist/mjs/functions/text/find/find.mjs.map +10 -0
- package/dist/mjs/functions/text/left/left.mjs +81 -0
- package/dist/mjs/functions/text/left/left.mjs.map +10 -0
- package/dist/mjs/functions/text/len/len.mjs +91 -0
- package/dist/mjs/functions/text/len/len.mjs.map +10 -0
- package/dist/mjs/functions/text/mid/mid.mjs +75 -0
- package/dist/mjs/functions/text/mid/mid.mjs.map +10 -0
- package/dist/mjs/functions/text/right/right.mjs +143 -0
- package/dist/mjs/functions/text/right/right.mjs.map +10 -0
- package/dist/mjs/functions/text/text-helpers.mjs +151 -0
- package/dist/mjs/functions/text/text-helpers.mjs.map +10 -0
- package/dist/mjs/functions/text/textjoin/textjoin.mjs +145 -0
- package/dist/mjs/functions/text/textjoin/textjoin.mjs.map +10 -0
- package/dist/mjs/package.json +5 -0
- package/dist/mjs/parser/ast.mjs +145 -0
- package/dist/mjs/parser/ast.mjs.map +10 -0
- package/dist/mjs/parser/formatter.mjs +289 -0
- package/dist/mjs/parser/formatter.mjs.map +10 -0
- package/dist/mjs/parser/grammar.mjs +345 -0
- package/dist/mjs/parser/grammar.mjs.map +10 -0
- package/dist/mjs/parser/lexer.mjs +412 -0
- package/dist/mjs/parser/lexer.mjs.map +10 -0
- package/dist/mjs/parser/parser.mjs +1692 -0
- package/dist/mjs/parser/parser.mjs.map +10 -0
- package/dist/mjs/react/hooks.mjs +16 -0
- package/dist/mjs/react/hooks.mjs.map +10 -0
- package/dist/types/core/ast-traverser.d.ts +28 -0
- package/dist/types/core/autofill-utils.d.ts +32 -0
- package/dist/types/core/engine.d.ts +184 -0
- package/dist/types/core/managers/cache-manager.d.ts +14 -0
- package/dist/types/core/managers/dependency-manager.d.ts +147 -0
- package/dist/types/core/managers/dependency-node.d.ts +13 -0
- package/dist/types/core/managers/evaluation-manager.d.ts +30 -0
- package/dist/types/core/managers/event-manager.d.ts +8 -0
- package/dist/types/core/managers/frontier-dependency-manager.d.ts +69 -0
- package/dist/types/core/managers/index.d.ts +7 -0
- package/dist/types/core/managers/isDependencyNode.d.ts +2 -0
- package/dist/types/core/managers/named-expression-manager.d.ts +101 -0
- package/dist/types/core/managers/range-eval-order-builder.d.ts +33 -0
- package/dist/types/core/managers/table-manager.d.ts +84 -0
- package/dist/types/core/managers/workbook-manager.d.ts +136 -0
- package/dist/types/core/map-serializer.d.ts +4 -0
- package/dist/types/core/named-expression-renamer.d.ts +21 -0
- package/dist/types/core/sheet-renamer.d.ts +28 -0
- package/dist/types/core/sheet-utils.d.ts +2 -0
- package/dist/types/core/table-renamer.d.ts +21 -0
- package/dist/types/core/types.d.ts +272 -0
- package/dist/types/core/utils/cell-address-parsing.test.d.ts +1 -0
- package/dist/types/core/utils/range-serializer.d.ts +22 -0
- package/dist/types/core/utils/range-serializer.test.d.ts +1 -0
- package/dist/types/core/utils/spreadsheet-visualizer.d.ts +30 -0
- package/dist/types/core/utils.d.ts +48 -0
- package/dist/types/core/workbook-renamer.d.ts +28 -0
- package/dist/types/debug/flags.d.ts +11 -0
- package/dist/types/evaluator/arithmetic/add/add.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/add/add.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/divide/divide.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/divide/divide.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/multiply/multiply.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/multiply/multiply.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/power/power.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/power/power.test.d.ts +1 -0
- package/dist/types/evaluator/arithmetic/subtract/subtract.d.ts +2 -0
- package/dist/types/evaluator/arithmetic/subtract/subtract.test.d.ts +1 -0
- package/dist/types/evaluator/comparison/comparison-operators.test.d.ts +1 -0
- package/dist/types/evaluator/comparison/equals.d.ts +6 -0
- package/dist/types/evaluator/comparison/greater-than-or-equal.d.ts +6 -0
- package/dist/types/evaluator/comparison/greater-than.d.ts +6 -0
- package/dist/types/evaluator/comparison/less-than-or-equal.d.ts +6 -0
- package/dist/types/evaluator/comparison/less-than.d.ts +6 -0
- package/dist/types/evaluator/comparison/not-equals.d.ts +6 -0
- package/dist/types/evaluator/concatenation/concatenate.d.ts +6 -0
- package/dist/types/evaluator/concatenation/concatenate.test.d.ts +1 -0
- package/dist/types/evaluator/dependency-nodes/ast-evaluation-node.d.ts +12 -0
- package/dist/types/evaluator/dependency-nodes/base-eval-node.d.ts +31 -0
- package/dist/types/evaluator/dependency-nodes/cell-value-node.d.ts +10 -0
- package/dist/types/evaluator/dependency-nodes/empty-cell-evaluation-node.d.ts +17 -0
- package/dist/types/evaluator/dependency-nodes/spill-meta-node.d.ts +7 -0
- package/dist/types/evaluator/evaluate-scalar-operator.d.ts +12 -0
- package/dist/types/evaluator/evaluation-context.d.ts +66 -0
- package/dist/types/evaluator/evaluation-error.d.ts +20 -0
- package/dist/types/evaluator/formula-evaluator.d.ts +67 -0
- package/dist/types/evaluator/open-range-evaluator.test.d.ts +1 -0
- package/dist/types/evaluator/range-evaluation-node.d.ts +16 -0
- package/dist/types/functions/_template/template.d.ts +5 -0
- package/dist/types/functions/_template/template.test.d.ts +1 -0
- package/dist/types/functions/array/sequence/performance-test.d.ts +1 -0
- package/dist/types/functions/array/sequence/sequence.d.ts +14 -0
- package/dist/types/functions/array/sequence/sequence.test.d.ts +1 -0
- package/dist/types/functions/criteria-parser.d.ts +27 -0
- package/dist/types/functions/criteria-utils.d.ts +61 -0
- package/dist/types/functions/function-utils.d.ts +21 -0
- package/dist/types/functions/index.d.ts +2 -0
- package/dist/types/functions/information/cell/cell.d.ts +24 -0
- package/dist/types/functions/information/cell/cell.test.d.ts +1 -0
- package/dist/types/functions/information/column/column.d.ts +14 -0
- package/dist/types/functions/information/column/column.test.d.ts +1 -0
- package/dist/types/functions/information/row/row.d.ts +14 -0
- package/dist/types/functions/information/row/row.test.d.ts +1 -0
- package/dist/types/functions/logical/and/and.d.ts +5 -0
- package/dist/types/functions/logical/and/and.test.d.ts +1 -0
- package/dist/types/functions/logical/if/if.d.ts +5 -0
- package/dist/types/functions/logical/if/if.test.d.ts +1 -0
- package/dist/types/functions/logical/iferror/iferror.d.ts +5 -0
- package/dist/types/functions/logical/iferror/iferror.test.d.ts +1 -0
- package/dist/types/functions/logical/or/or.d.ts +5 -0
- package/dist/types/functions/logical/or/or.test.d.ts +1 -0
- package/dist/types/functions/lookup/count/count-utils.d.ts +14 -0
- package/dist/types/functions/lookup/count/count.d.ts +21 -0
- package/dist/types/functions/lookup/count/count.test.d.ts +1 -0
- package/dist/types/functions/lookup/count/countif.d.ts +26 -0
- package/dist/types/functions/lookup/count/countif.test.d.ts +1 -0
- package/dist/types/functions/lookup/count/countifs.d.ts +21 -0
- package/dist/types/functions/lookup/count/countifs.test.d.ts +1 -0
- package/dist/types/functions/lookup/index-lookup/index-lookup.d.ts +2 -0
- package/dist/types/functions/lookup/index-lookup/index-lookup.test.d.ts +1 -0
- package/dist/types/functions/lookup/match/match.d.ts +2 -0
- package/dist/types/functions/lookup/match/match.test.d.ts +1 -0
- package/dist/types/functions/lookup/xlookup/xlookup.d.ts +2 -0
- package/dist/types/functions/lookup/xlookup/xlookup.test.d.ts +1 -0
- package/dist/types/functions/math/average/average-utils.d.ts +10 -0
- package/dist/types/functions/math/average/average.d.ts +18 -0
- package/dist/types/functions/math/average/average.test.d.ts +1 -0
- package/dist/types/functions/math/average/averageif.d.ts +23 -0
- package/dist/types/functions/math/average/averageif.test.d.ts +1 -0
- package/dist/types/functions/math/average/averageifs.d.ts +21 -0
- package/dist/types/functions/math/average/averageifs.test.d.ts +1 -0
- package/dist/types/functions/math/ceiling/ceiling.d.ts +5 -0
- package/dist/types/functions/math/ceiling/ceiling.test.d.ts +1 -0
- package/dist/types/functions/math/max/max-utils.d.ts +20 -0
- package/dist/types/functions/math/max/max.d.ts +18 -0
- package/dist/types/functions/math/max/max.test.d.ts +1 -0
- package/dist/types/functions/math/max/maxif.d.ts +23 -0
- package/dist/types/functions/math/max/maxif.test.d.ts +1 -0
- package/dist/types/functions/math/max/maxifs.d.ts +21 -0
- package/dist/types/functions/math/max/maxifs.test.d.ts +1 -0
- package/dist/types/functions/math/min/min-utils.d.ts +20 -0
- package/dist/types/functions/math/min/min.d.ts +5 -0
- package/dist/types/functions/math/min/min.test.d.ts +1 -0
- package/dist/types/functions/math/min/minif.d.ts +23 -0
- package/dist/types/functions/math/min/minif.test.d.ts +1 -0
- package/dist/types/functions/math/min/minifs.d.ts +21 -0
- package/dist/types/functions/math/min/minifs.test.d.ts +1 -0
- package/dist/types/functions/math/sum/sum.d.ts +5 -0
- package/dist/types/functions/math/sum/sum.test.d.ts +1 -0
- package/dist/types/functions/math/sum/sumif.d.ts +23 -0
- package/dist/types/functions/math/sum/sumif.test.d.ts +1 -0
- package/dist/types/functions/math/sum/sumifs.d.ts +21 -0
- package/dist/types/functions/math/sum/sumifs.test.d.ts +1 -0
- package/dist/types/functions/math/sum/summation-utils.d.ts +19 -0
- package/dist/types/functions/reference/address/address.d.ts +18 -0
- package/dist/types/functions/reference/address/address.test.d.ts +1 -0
- package/dist/types/functions/reference/indirect/indirect.d.ts +20 -0
- package/dist/types/functions/reference/indirect/indirect.test.d.ts +1 -0
- package/dist/types/functions/reference/offset/offset.d.ts +23 -0
- package/dist/types/functions/reference/offset/offset.test.d.ts +1 -0
- package/dist/types/functions/text/concatenate/concatenate.d.ts +5 -0
- package/dist/types/functions/text/concatenate/concatenate.test.d.ts +1 -0
- package/dist/types/functions/text/exact/exact.d.ts +5 -0
- package/dist/types/functions/text/exact/exact.test.d.ts +1 -0
- package/dist/types/functions/text/find/find.d.ts +20 -0
- package/dist/types/functions/text/find/find.test.d.ts +1 -0
- package/dist/types/functions/text/left/left.d.ts +19 -0
- package/dist/types/functions/text/left/left.test.d.ts +1 -0
- package/dist/types/functions/text/len/len.d.ts +16 -0
- package/dist/types/functions/text/len/len.test.d.ts +1 -0
- package/dist/types/functions/text/mid/mid.d.ts +20 -0
- package/dist/types/functions/text/mid/mid.test.d.ts +1 -0
- package/dist/types/functions/text/right/right.d.ts +2 -0
- package/dist/types/functions/text/right/right.test.d.ts +1 -0
- package/dist/types/functions/text/text-helpers.d.ts +27 -0
- package/dist/types/functions/text/textjoin/textjoin.d.ts +5 -0
- package/dist/types/functions/text/textjoin/textjoin.test.d.ts +1 -0
- package/dist/types/parser/ast.d.ts +275 -0
- package/dist/types/parser/formatter.d.ts +6 -0
- package/dist/types/parser/grammar.d.ts +203 -0
- package/dist/types/parser/lexer.d.ts +144 -0
- package/dist/types/parser/parser.d.ts +159 -0
- package/dist/types/react/hooks.d.ts +5 -0
- package/package.json +41 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/functions/text/len/len.ts
|
|
30
|
+
var exports_len = {};
|
|
31
|
+
__export(exports_len, {
|
|
32
|
+
LEN: () => LEN
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(exports_len);
|
|
35
|
+
var import_types = require("src/core/types");
|
|
36
|
+
var LEN = {
|
|
37
|
+
name: "LEN",
|
|
38
|
+
evaluate: function(node, context) {
|
|
39
|
+
if (node.args.length !== 1) {
|
|
40
|
+
return {
|
|
41
|
+
type: "error",
|
|
42
|
+
err: import_types.FormulaError.VALUE,
|
|
43
|
+
message: "LEN function takes exactly 1 argument",
|
|
44
|
+
errAddress: context.dependencyNode
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const textResult = this.evaluateNode(node.args[0], context);
|
|
48
|
+
if (textResult.type === "error" || textResult.type === "awaiting-evaluation") {
|
|
49
|
+
return textResult;
|
|
50
|
+
}
|
|
51
|
+
if (textResult.type === "spilled-values") {
|
|
52
|
+
return createLenSpilledResult.call(this, {
|
|
53
|
+
textResult,
|
|
54
|
+
context
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (textResult.result.type !== "string") {
|
|
58
|
+
return {
|
|
59
|
+
type: "error",
|
|
60
|
+
err: import_types.FormulaError.VALUE,
|
|
61
|
+
message: "Text argument must be a string",
|
|
62
|
+
errAddress: context.dependencyNode
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (textResult.result.type === "string") {
|
|
66
|
+
return {
|
|
67
|
+
type: "value",
|
|
68
|
+
result: { type: "number", value: textResult.result.value.length }
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
type: "error",
|
|
73
|
+
err: import_types.FormulaError.VALUE,
|
|
74
|
+
message: "LEN operation failed",
|
|
75
|
+
errAddress: context.dependencyNode
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
function createLenSpilledResult({
|
|
80
|
+
textResult,
|
|
81
|
+
context
|
|
82
|
+
}) {
|
|
83
|
+
if (textResult.type !== "spilled-values") {
|
|
84
|
+
return {
|
|
85
|
+
type: "error",
|
|
86
|
+
err: import_types.FormulaError.VALUE,
|
|
87
|
+
message: "createLenSpilledResult called without spilled values",
|
|
88
|
+
errAddress: context.dependencyNode
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
type: "spilled-values",
|
|
93
|
+
spillArea: (origin) => textResult.spillArea(origin),
|
|
94
|
+
source: "LEN with spilled text values",
|
|
95
|
+
evaluate: (spillOffset, evalContext) => {
|
|
96
|
+
const spillTextResult = textResult.evaluate(spillOffset, evalContext);
|
|
97
|
+
if (!spillTextResult || spillTextResult.type === "error" || spillTextResult.type === "awaiting-evaluation") {
|
|
98
|
+
return spillTextResult;
|
|
99
|
+
}
|
|
100
|
+
if (spillTextResult.type !== "value" || spillTextResult.result.type !== "string") {
|
|
101
|
+
return {
|
|
102
|
+
type: "error",
|
|
103
|
+
err: import_types.FormulaError.VALUE,
|
|
104
|
+
message: "LEN operation failed",
|
|
105
|
+
errAddress: context.dependencyNode
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
type: "value",
|
|
110
|
+
result: { type: "number", value: spillTextResult.result.value.length }
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
evaluateAllCells: (intersectingRange) => {
|
|
114
|
+
throw new Error("WIP: evaluateAllCells for LEN is not implemented");
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
//# debugId=C318A6303594CA3464756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/text/len/len.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type CellNumber,\n type CellAddress,\n type SpreadsheetRange,\n} from \"src/core/types\";\nimport { convertToString } from \"../text-helpers.cjs\";\nimport type { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\n\n/**\n * LEN function - Returns the length of a text string\n *\n * Usage: LEN(text)\n *\n * text: The text string whose length you want to find.\n *\n * Example: LEN(\"Hello World\") returns 11\n *\n * Note:\n * - Supports dynamic arrays (spilled values) for the text argument\n * - Strict type checking: text must be string\n * - Returns the number of characters in the text string\n */\nexport const LEN: FunctionDefinition = {\n name: \"LEN\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length !== 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"LEN function takes exactly 1 argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate the text argument\n const textResult = this.evaluateNode(node.args[0]!, context);\n if (\n textResult.type === \"error\" ||\n textResult.type === \"awaiting-evaluation\"\n ) {\n return textResult;\n }\n\n // Handle spilled-values input\n if (textResult.type === \"spilled-values\") {\n return createLenSpilledResult.call(this, {\n textResult,\n context,\n });\n }\n\n // Strict type checking - no coercion\n if (textResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Text argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (textResult.result.type === \"string\") {\n return {\n type: \"value\",\n result: { type: \"number\", value: textResult.result.value.length },\n };\n }\n\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"LEN operation failed\",\n errAddress: context.dependencyNode,\n };\n },\n};\n\n/**\n * Helper for creating spilled-values result for LEN function\n */\nfunction createLenSpilledResult(\n this: FormulaEvaluator,\n {\n textResult,\n context,\n }: {\n textResult: FunctionEvaluationResult;\n context: EvaluationContext;\n }\n): FunctionEvaluationResult {\n if (textResult.type !== \"spilled-values\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"createLenSpilledResult called without spilled values\",\n errAddress: context.dependencyNode,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => textResult.spillArea(origin),\n source: \"LEN with spilled text values\",\n evaluate: (spillOffset, evalContext) => {\n const spillTextResult = textResult.evaluate(spillOffset, evalContext);\n if (\n !spillTextResult ||\n spillTextResult.type === \"error\" ||\n spillTextResult.type === \"awaiting-evaluation\"\n ) {\n return spillTextResult;\n }\n\n if (\n spillTextResult.type !== \"value\" ||\n spillTextResult.result.type !== \"string\"\n ) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"LEN operation failed\",\n errAddress: context.dependencyNode,\n };\n }\n\n return {\n type: \"value\",\n result: { type: \"number\", value: spillTextResult.result.value.length },\n };\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for LEN is not implemented\");\n },\n };\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,IAPP;AA0BO,IAAM,MAA0B;AAAA,EACrC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,IAAI,KAAK,KAAK,WAAW,GAAG;AAAA,MAC1B,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,aAAa,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC3D,IACE,WAAW,SAAS,WACpB,WAAW,SAAS,uBACpB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAGA,IAAI,WAAW,SAAS,kBAAkB;AAAA,MACxC,OAAO,uBAAuB,KAAK,MAAM;AAAA,QACvC;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAGA,IAAI,WAAW,OAAO,SAAS,UAAU;AAAA,MACvC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,IAAI,WAAW,OAAO,SAAS,UAAU;AAAA,MACvC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,MAAM,OAAO;AAAA,MAClE;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,0BAAa;AAAA,MAClB,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACtB;AAAA;AAEJ;AAKA,SAAS,sBAAsB;AAAA,EAG3B;AAAA,EACA;AAAA,GAKwB;AAAA,EAC1B,IAAI,WAAW,SAAS,kBAAkB;AAAA,IACxC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,0BAAa;AAAA,MAClB,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,CAAC,WAAwB,WAAW,UAAU,MAAM;AAAA,IAC/D,QAAQ;AAAA,IACR,UAAU,CAAC,aAAa,gBAAgB;AAAA,MACtC,MAAM,kBAAkB,WAAW,SAAS,aAAa,WAAW;AAAA,MACpE,IACE,CAAC,mBACD,gBAAgB,SAAS,WACzB,gBAAgB,SAAS,uBACzB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MAEA,IACE,gBAAgB,SAAS,WACzB,gBAAgB,OAAO,SAAS,UAChC;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,0BAAa;AAAA,UAClB,SAAS;AAAA,UACT,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,OAAO,gBAAgB,OAAO,MAAM,OAAO;AAAA,MACvE;AAAA;AAAA,IAEF,kBAAkB,CAAC,sBAAsB;AAAA,MACvC,MAAM,IAAI,MAAM,kDAAkD;AAAA;AAAA,EAEtE;AAAA;",
|
|
8
|
+
"debugId": "C318A6303594CA3464756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/functions/text/mid/mid.ts
|
|
30
|
+
var exports_mid = {};
|
|
31
|
+
__export(exports_mid, {
|
|
32
|
+
MID: () => MID
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(exports_mid);
|
|
35
|
+
var import_types = require("src/core/types");
|
|
36
|
+
var import_text_helpers = require("../text-helpers.cjs");
|
|
37
|
+
var MID = {
|
|
38
|
+
name: "MID",
|
|
39
|
+
evaluate: function(node, context) {
|
|
40
|
+
if (node.args.length !== 3) {
|
|
41
|
+
return {
|
|
42
|
+
type: "error",
|
|
43
|
+
err: import_types.FormulaError.VALUE,
|
|
44
|
+
message: "MID function takes exactly 3 arguments",
|
|
45
|
+
errAddress: context.dependencyNode
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const textResult = this.evaluateNode(node.args[0], context);
|
|
49
|
+
if (textResult.type === "error" || textResult.type === "awaiting-evaluation") {
|
|
50
|
+
return textResult;
|
|
51
|
+
}
|
|
52
|
+
const startNumResult = this.evaluateNode(node.args[1], context);
|
|
53
|
+
if (startNumResult.type === "error" || startNumResult.type === "awaiting-evaluation") {
|
|
54
|
+
return startNumResult;
|
|
55
|
+
}
|
|
56
|
+
const numCharsResult = this.evaluateNode(node.args[2], context);
|
|
57
|
+
if (numCharsResult.type === "error" || numCharsResult.type === "awaiting-evaluation") {
|
|
58
|
+
return numCharsResult;
|
|
59
|
+
}
|
|
60
|
+
if (textResult.type === "spilled-values" || startNumResult.type === "spilled-values" || numCharsResult.type === "spilled-values") {
|
|
61
|
+
return import_text_helpers.createMidSpilledResult.call(this, {
|
|
62
|
+
textResult,
|
|
63
|
+
startNumResult,
|
|
64
|
+
numCharsResult,
|
|
65
|
+
context
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (textResult.result.type !== "string") {
|
|
69
|
+
return {
|
|
70
|
+
type: "error",
|
|
71
|
+
err: import_types.FormulaError.VALUE,
|
|
72
|
+
message: "Text argument must be a string",
|
|
73
|
+
errAddress: context.dependencyNode
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (startNumResult.result.type !== "number") {
|
|
77
|
+
return {
|
|
78
|
+
type: "error",
|
|
79
|
+
err: import_types.FormulaError.VALUE,
|
|
80
|
+
message: "Start_num argument must be a number",
|
|
81
|
+
errAddress: context.dependencyNode
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (numCharsResult.result.type !== "number") {
|
|
85
|
+
return {
|
|
86
|
+
type: "error",
|
|
87
|
+
err: import_types.FormulaError.VALUE,
|
|
88
|
+
message: "Num_chars argument must be a number",
|
|
89
|
+
errAddress: context.dependencyNode
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const result = import_text_helpers.midOperation(textResult, startNumResult, numCharsResult, context);
|
|
93
|
+
if (result.type === "error" || result.type === "awaiting-evaluation") {
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
type: "value",
|
|
98
|
+
result: result.result
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
//# debugId=4A2485640856964964756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/text/mid/mid.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport { midOperation, createMidSpilledResult } from \"../text-helpers.cjs\";\n\n/**\n * MID function - Returns characters from the middle of a text string\n *\n * Usage: MID(text, start_num, num_chars)\n *\n * text: The text string to extract characters from.\n * start_num: The position of the first character to extract (1-based).\n * num_chars: The number of characters to extract.\n *\n * Example: MID(\"Hello, World!\", 8, 5) returns \"World\"\n *\n * Note:\n * - If start_num is less than 1, the function returns an error.\n * - If num_chars is less than 0, the function returns an error.\n * - If start_num is greater than the length of text, the function returns an empty string.\n * - Supports dynamic arrays (spilled values) for all arguments\n * - Strict type checking: text must be string, start_num and num_chars must be numbers\n */\nexport const MID: FunctionDefinition = {\n name: \"MID\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length !== 3) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"MID function takes exactly 3 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate the text argument\n const textResult = this.evaluateNode(node.args[0]!, context);\n if (\n textResult.type === \"error\" ||\n textResult.type === \"awaiting-evaluation\"\n ) {\n return textResult;\n }\n\n // Evaluate the start_num argument\n const startNumResult = this.evaluateNode(node.args[1]!, context);\n if (\n startNumResult.type === \"error\" ||\n startNumResult.type === \"awaiting-evaluation\"\n ) {\n return startNumResult;\n }\n\n // Evaluate the num_chars argument\n const numCharsResult = this.evaluateNode(node.args[2]!, context);\n if (\n numCharsResult.type === \"error\" ||\n numCharsResult.type === \"awaiting-evaluation\"\n ) {\n return numCharsResult;\n }\n\n // Handle spilled-values inputs\n if (\n textResult.type === \"spilled-values\" ||\n startNumResult.type === \"spilled-values\" ||\n numCharsResult.type === \"spilled-values\"\n ) {\n return createMidSpilledResult.call(this, {\n textResult,\n startNumResult,\n numCharsResult,\n context,\n });\n }\n\n // Strict type checking - no coercion\n if (textResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Text argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (startNumResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Start_num argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (numCharsResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Num_chars argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n const result = midOperation(\n textResult,\n startNumResult,\n numCharsResult,\n context\n );\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return {\n type: \"value\",\n result: result.result,\n };\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,IAJP;AAKqD,IAArD;AAoBO,IAAM,MAA0B;AAAA,EACrC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,IAAI,KAAK,KAAK,WAAW,GAAG;AAAA,MAC1B,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,aAAa,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC3D,IACE,WAAW,SAAS,WACpB,WAAW,SAAS,uBACpB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IACE,eAAe,SAAS,WACxB,eAAe,SAAS,uBACxB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IACE,eAAe,SAAS,WACxB,eAAe,SAAS,uBACxB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAGA,IACE,WAAW,SAAS,oBACpB,eAAe,SAAS,oBACxB,eAAe,SAAS,kBACxB;AAAA,MACA,OAAO,2CAAuB,KAAK,MAAM;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAGA,IAAI,WAAW,OAAO,SAAS,UAAU;AAAA,MACvC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,IAAI,eAAe,OAAO,SAAS,UAAU;AAAA,MAC3C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,IAAI,eAAe,OAAO,SAAS,UAAU;AAAA,MAC3C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,iCACb,YACA,gBACA,gBACA,OACF;AAAA,IACA,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,uBAAuB;AAAA,MACpE,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,IACjB;AAAA;AAEJ;",
|
|
8
|
+
"debugId": "4A2485640856964964756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/functions/text/right/right.ts
|
|
30
|
+
var exports_right = {};
|
|
31
|
+
__export(exports_right, {
|
|
32
|
+
RIGHT: () => RIGHT
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(exports_right);
|
|
35
|
+
var import_types = require("src/core/types");
|
|
36
|
+
var import_text_helpers = require("../text-helpers.cjs");
|
|
37
|
+
function rightOperation(textResult, numCharsResult, context) {
|
|
38
|
+
const textStr = import_text_helpers.convertToString(textResult, context);
|
|
39
|
+
const numChars = import_text_helpers.extractNumericValue(numCharsResult, context);
|
|
40
|
+
if (typeof textStr === "object" && (textStr.type === "awaiting-evaluation" || textStr.type === "error")) {
|
|
41
|
+
return textStr;
|
|
42
|
+
}
|
|
43
|
+
if (typeof numChars === "object" && (numChars.type === "awaiting-evaluation" || numChars.type === "error")) {
|
|
44
|
+
return numChars;
|
|
45
|
+
}
|
|
46
|
+
const textValue = textStr;
|
|
47
|
+
const numCharsValue = numChars;
|
|
48
|
+
if (numCharsValue < 0) {
|
|
49
|
+
return {
|
|
50
|
+
type: "error",
|
|
51
|
+
err: import_types.FormulaError.VALUE,
|
|
52
|
+
message: "NumChars argument must be a positive number",
|
|
53
|
+
errAddress: context.dependencyNode
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const textLength = textValue.length;
|
|
57
|
+
const startPos = Math.max(1, textLength - Math.floor(numCharsValue) + 1);
|
|
58
|
+
const startNumResult = {
|
|
59
|
+
type: "value",
|
|
60
|
+
result: { type: "number", value: startPos }
|
|
61
|
+
};
|
|
62
|
+
return import_text_helpers.midOperation(textResult, startNumResult, numCharsResult, context);
|
|
63
|
+
}
|
|
64
|
+
var RIGHT = {
|
|
65
|
+
name: "RIGHT",
|
|
66
|
+
evaluate: function(node, context) {
|
|
67
|
+
if (node.args.length < 1 || node.args.length > 2) {
|
|
68
|
+
return {
|
|
69
|
+
type: "error",
|
|
70
|
+
err: import_types.FormulaError.VALUE,
|
|
71
|
+
message: "RIGHT function takes 1 or 2 arguments",
|
|
72
|
+
errAddress: context.dependencyNode
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const textResult = this.evaluateNode(node.args[0], context);
|
|
76
|
+
if (textResult.type === "error" || textResult.type === "awaiting-evaluation") {
|
|
77
|
+
return textResult;
|
|
78
|
+
}
|
|
79
|
+
let numCharsResult;
|
|
80
|
+
if (node.args.length > 1) {
|
|
81
|
+
numCharsResult = this.evaluateNode(node.args[1], context);
|
|
82
|
+
if (numCharsResult.type === "error" || numCharsResult.type === "awaiting-evaluation") {
|
|
83
|
+
return numCharsResult;
|
|
84
|
+
}
|
|
85
|
+
} else {
|
|
86
|
+
numCharsResult = {
|
|
87
|
+
type: "value",
|
|
88
|
+
result: { type: "number", value: 1 }
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (textResult.type === "spilled-values" || numCharsResult.type === "spilled-values") {
|
|
92
|
+
return createRightSpilledResult.call(this, {
|
|
93
|
+
textResult,
|
|
94
|
+
numCharsResult,
|
|
95
|
+
context
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (textResult.result.type !== "string") {
|
|
99
|
+
return {
|
|
100
|
+
type: "error",
|
|
101
|
+
err: import_types.FormulaError.VALUE,
|
|
102
|
+
message: "Text argument must be a string",
|
|
103
|
+
errAddress: context.dependencyNode
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (numCharsResult.result.type !== "number") {
|
|
107
|
+
return {
|
|
108
|
+
type: "error",
|
|
109
|
+
err: import_types.FormulaError.VALUE,
|
|
110
|
+
message: "NumChars argument must be a number",
|
|
111
|
+
errAddress: context.dependencyNode
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return rightOperation(textResult, numCharsResult, context);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
function createRightSpilledResult({
|
|
118
|
+
textResult,
|
|
119
|
+
numCharsResult,
|
|
120
|
+
context
|
|
121
|
+
}) {
|
|
122
|
+
if (textResult.type !== "spilled-values" && numCharsResult.type !== "spilled-values") {
|
|
123
|
+
throw new Error("createRightSpilledResult called without spilled values");
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
type: "spilled-values",
|
|
127
|
+
spillArea: (origin) => {
|
|
128
|
+
let spillArea;
|
|
129
|
+
if (textResult.type === "spilled-values") {
|
|
130
|
+
spillArea = textResult.spillArea(origin);
|
|
131
|
+
} else if (numCharsResult.type === "spilled-values") {
|
|
132
|
+
spillArea = numCharsResult.spillArea(origin);
|
|
133
|
+
} else {
|
|
134
|
+
throw new Error("No spilled values found");
|
|
135
|
+
}
|
|
136
|
+
if (textResult.type === "spilled-values" && numCharsResult.type === "spilled-values") {
|
|
137
|
+
spillArea = this.unionRanges(this.projectRange(textResult.spillArea(origin), origin), this.projectRange(numCharsResult.spillArea(origin), origin));
|
|
138
|
+
}
|
|
139
|
+
return spillArea;
|
|
140
|
+
},
|
|
141
|
+
source: "RIGHT with spilled values",
|
|
142
|
+
evaluate: (spilledCell, evalContext) => {
|
|
143
|
+
const spillTextResult = textResult.type === "spilled-values" ? textResult.evaluate(spilledCell, evalContext) : textResult;
|
|
144
|
+
const spillNumResult = numCharsResult.type === "spilled-values" ? numCharsResult.evaluate(spilledCell, evalContext) : numCharsResult;
|
|
145
|
+
if (spillTextResult === undefined || spillNumResult === undefined) {
|
|
146
|
+
return {
|
|
147
|
+
type: "error",
|
|
148
|
+
err: import_types.FormulaError.REF,
|
|
149
|
+
message: "The spilled results have not been evaluated",
|
|
150
|
+
errAddress: context.dependencyNode
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (spillNumResult.type === "error") {
|
|
154
|
+
return spillNumResult;
|
|
155
|
+
}
|
|
156
|
+
if (spillTextResult.type === "error") {
|
|
157
|
+
return spillTextResult;
|
|
158
|
+
}
|
|
159
|
+
return rightOperation(spillTextResult, spillNumResult, context);
|
|
160
|
+
},
|
|
161
|
+
evaluateAllCells: (intersectingRange) => {
|
|
162
|
+
throw new Error("WIP: evaluateAllCells for RIGHT is not implemented");
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
//# debugId=677703F9538EF34864756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/functions/text/right/right.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type CellString,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type ErrorEvaluationResult,\n type SingleEvaluationResult,\n} from \"src/core/types\";\nimport { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport {\n midOperation,\n createMidSpilledResult,\n convertToString,\n extractNumericValue,\n} from \"../text-helpers.cjs\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\n\n/**\n * RIGHT function - Returns the rightmost characters from a text string\n *\n * Usage: RIGHT(text, num_chars)\n *\n * text: The text string to extract characters from.\n * num_chars: The number of characters to extract from the right side of the text.\n *\n * Example: RIGHT(\"Hello, World!\", 6) returns \"World!\"\n *\n * Note:\n * - If num_chars is less than 0, the function returns an error.\n * - If num_chars is greater than the length of text, the function returns the entire text.\n * - Supports dynamic arrays (spilled values) for both arguments\n * - Strict type checking: text must be string, num_chars must be number\n * - Implemented as MID(text, LEN(text) - num_chars + 1, num_chars)\n */\n\n/**\n * Helper function to calculate RIGHT operation using MID\n */\nfunction rightOperation(\n textResult: FunctionEvaluationResult,\n numCharsResult: FunctionEvaluationResult,\n context: EvaluationContext\n): { type: \"value\"; result: CellString } | ErrorEvaluationResult {\n const textStr = convertToString(textResult, context);\n const numChars = extractNumericValue(numCharsResult, context);\n\n // Check if any of the results are awaiting evaluation or errors\n if (\n typeof textStr === \"object\" &&\n (textStr.type === \"awaiting-evaluation\" || textStr.type === \"error\")\n ) {\n return textStr;\n }\n if (\n typeof numChars === \"object\" &&\n (numChars.type === \"awaiting-evaluation\" || numChars.type === \"error\")\n ) {\n return numChars;\n }\n\n // At this point, all values should be primitive types\n const textValue = textStr as string;\n const numCharsValue = numChars as number;\n\n // Validate numChars\n if (numCharsValue < 0) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"NumChars argument must be a positive number\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Calculate start position: LEN(text) - num_chars + 1\n const textLength = textValue.length;\n const startPos = Math.max(1, textLength - Math.floor(numCharsValue) + 1);\n\n // Create start_num result\n const startNumResult: FunctionEvaluationResult = {\n type: \"value\",\n result: { type: \"number\", value: startPos },\n };\n\n // Use MID operation\n return midOperation(textResult, startNumResult, numCharsResult, context);\n}\n\nexport const RIGHT: FunctionDefinition = {\n name: \"RIGHT\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 1 || node.args.length > 2) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"RIGHT function takes 1 or 2 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate the text argument\n const textResult = this.evaluateNode(node.args[0]!, context);\n if (\n textResult.type === \"error\" ||\n textResult.type === \"awaiting-evaluation\"\n ) {\n return textResult;\n }\n\n // Evaluate the numChars argument (optional, defaults to 1)\n let numCharsResult: FunctionEvaluationResult;\n if (node.args.length > 1) {\n numCharsResult = this.evaluateNode(node.args[1]!, context);\n if (\n numCharsResult.type === \"error\" ||\n numCharsResult.type === \"awaiting-evaluation\"\n ) {\n return numCharsResult;\n }\n } else {\n numCharsResult = {\n type: \"value\",\n result: { type: \"number\", value: 1 },\n };\n }\n\n // Handle spilled-values inputs\n if (\n textResult.type === \"spilled-values\" ||\n numCharsResult.type === \"spilled-values\"\n ) {\n // For RIGHT with spilled values, we need a custom spilled result handler\n // because we need to calculate start_num dynamically for each text value\n return createRightSpilledResult.call(this, {\n textResult,\n numCharsResult,\n context,\n });\n }\n\n // Strict type checking - no coercion\n if (textResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Text argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (numCharsResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"NumChars argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Use RIGHT operation: RIGHT(text, num_chars) = MID(text, LEN(text) - num_chars + 1, num_chars)\n return rightOperation(textResult, numCharsResult, context);\n },\n};\n\n/**\n * Helper for creating spilled-values result for RIGHT function\n */\nfunction createRightSpilledResult(\n this: FormulaEvaluator,\n {\n textResult,\n numCharsResult,\n context,\n }: {\n textResult: FunctionEvaluationResult;\n numCharsResult: FunctionEvaluationResult;\n context: EvaluationContext;\n }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n if (\n textResult.type !== \"spilled-values\" &&\n numCharsResult.type !== \"spilled-values\"\n ) {\n throw new Error(\"createRightSpilledResult called without spilled values\");\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress): SpreadsheetRange => {\n // Calculate spill area\n let spillArea;\n if (textResult.type === \"spilled-values\") {\n spillArea = textResult.spillArea(origin);\n } else if (numCharsResult.type === \"spilled-values\") {\n spillArea = numCharsResult.spillArea(origin);\n } else {\n throw new Error(\"No spilled values found\");\n }\n\n // Union spill areas if both are spilled\n if (\n textResult.type === \"spilled-values\" &&\n numCharsResult.type === \"spilled-values\"\n ) {\n spillArea = this.unionRanges(\n this.projectRange(textResult.spillArea(origin), origin),\n this.projectRange(numCharsResult.spillArea(origin), origin)\n );\n }\n return spillArea;\n },\n source: \"RIGHT with spilled values\",\n evaluate: (spilledCell, evalContext): SingleEvaluationResult => {\n // Evaluate arguments at this spilled position\n const spillTextResult =\n textResult.type === \"spilled-values\"\n ? textResult.evaluate(spilledCell, evalContext)\n : textResult;\n const spillNumResult =\n numCharsResult.type === \"spilled-values\"\n ? numCharsResult.evaluate(spilledCell, evalContext)\n : numCharsResult;\n\n if (spillTextResult === undefined || spillNumResult === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled results have not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n if (spillNumResult.type === \"error\") {\n return spillNumResult;\n }\n if (spillTextResult.type === \"error\") {\n return spillTextResult;\n }\n\n return rightOperation(spillTextResult, spillNumResult, context);\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for RIGHT is not implemented\");\n },\n };\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUO,IAVP;AAiBO,IALP;AA6BA,SAAS,cAAc,CACrB,YACA,gBACA,SAC+D;AAAA,EAC/D,MAAM,UAAU,oCAAgB,YAAY,OAAO;AAAA,EACnD,MAAM,WAAW,wCAAoB,gBAAgB,OAAO;AAAA,EAG5D,IACE,OAAO,YAAY,aAClB,QAAQ,SAAS,yBAAyB,QAAQ,SAAS,UAC5D;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IACE,OAAO,aAAa,aACnB,SAAS,SAAS,yBAAyB,SAAS,SAAS,UAC9D;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,YAAY;AAAA,EAClB,MAAM,gBAAgB;AAAA,EAGtB,IAAI,gBAAgB,GAAG;AAAA,IACrB,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,0BAAa;AAAA,MAClB,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA,EAGA,MAAM,aAAa,UAAU;AAAA,EAC7B,MAAM,WAAW,KAAK,IAAI,GAAG,aAAa,KAAK,MAAM,aAAa,IAAI,CAAC;AAAA,EAGvE,MAAM,iBAA2C;AAAA,IAC/C,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,EAC5C;AAAA,EAGA,OAAO,iCAAa,YAAY,gBAAgB,gBAAgB,OAAO;AAAA;AAGlE,IAAM,QAA4B;AAAA,EACvC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,IAAI,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,GAAG;AAAA,MAChD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,aAAa,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC3D,IACE,WAAW,SAAS,WACpB,WAAW,SAAS,uBACpB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI,KAAK,KAAK,SAAS,GAAG;AAAA,MACxB,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,MACzD,IACE,eAAe,SAAS,WACxB,eAAe,SAAS,uBACxB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF,EAAO;AAAA,MACL,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,OAAO,EAAE;AAAA,MACrC;AAAA;AAAA,IAIF,IACE,WAAW,SAAS,oBACpB,eAAe,SAAS,kBACxB;AAAA,MAGA,OAAO,yBAAyB,KAAK,MAAM;AAAA,QACzC;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAGA,IAAI,WAAW,OAAO,SAAS,UAAU;AAAA,MACvC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,IAAI,eAAe,OAAO,SAAS,UAAU;AAAA,MAC3C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,0BAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,OAAO,eAAe,YAAY,gBAAgB,OAAO;AAAA;AAE7D;AAKA,SAAS,wBAAwB;AAAA,EAG7B;AAAA,EACA;AAAA,EACA;AAAA,GAMqD;AAAA,EACvD,IACE,WAAW,SAAS,oBACpB,eAAe,SAAS,kBACxB;AAAA,IACA,MAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,CAAC,WAA0C;AAAA,MAEpD,IAAI;AAAA,MACJ,IAAI,WAAW,SAAS,kBAAkB;AAAA,QACxC,YAAY,WAAW,UAAU,MAAM;AAAA,MACzC,EAAO,SAAI,eAAe,SAAS,kBAAkB;AAAA,QACnD,YAAY,eAAe,UAAU,MAAM;AAAA,MAC7C,EAAO;AAAA,QACL,MAAM,IAAI,MAAM,yBAAyB;AAAA;AAAA,MAI3C,IACE,WAAW,SAAS,oBACpB,eAAe,SAAS,kBACxB;AAAA,QACA,YAAY,KAAK,YACf,KAAK,aAAa,WAAW,UAAU,MAAM,GAAG,MAAM,GACtD,KAAK,aAAa,eAAe,UAAU,MAAM,GAAG,MAAM,CAC5D;AAAA,MACF;AAAA,MACA,OAAO;AAAA;AAAA,IAET,QAAQ;AAAA,IACR,UAAU,CAAC,aAAa,gBAAwC;AAAA,MAE9D,MAAM,kBACJ,WAAW,SAAS,mBAChB,WAAW,SAAS,aAAa,WAAW,IAC5C;AAAA,MACN,MAAM,iBACJ,eAAe,SAAS,mBACpB,eAAe,SAAS,aAAa,WAAW,IAChD;AAAA,MAEN,IAAI,oBAAoB,aAAa,mBAAmB,WAAW;AAAA,QACjE,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,0BAAa;AAAA,UAClB,SAAS;AAAA,UACT,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,MACA,IAAI,eAAe,SAAS,SAAS;AAAA,QACnC,OAAO;AAAA,MACT;AAAA,MACA,IAAI,gBAAgB,SAAS,SAAS;AAAA,QACpC,OAAO;AAAA,MACT;AAAA,MAEA,OAAO,eAAe,iBAAiB,gBAAgB,OAAO;AAAA;AAAA,IAEhE,kBAAkB,CAAC,sBAAsB;AAAA,MACvC,MAAM,IAAI,MAAM,oDAAoD;AAAA;AAAA,EAExE;AAAA;",
|
|
8
|
+
"debugId": "677703F9538EF34864756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// src/functions/text/text-helpers.ts
|
|
30
|
+
var exports_text_helpers = {};
|
|
31
|
+
__export(exports_text_helpers, {
|
|
32
|
+
midOperation: () => midOperation,
|
|
33
|
+
extractNumericValue: () => extractNumericValue,
|
|
34
|
+
createMidSpilledResult: () => createMidSpilledResult,
|
|
35
|
+
convertToString: () => convertToString
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(exports_text_helpers);
|
|
38
|
+
var import_types = require("src/core/types");
|
|
39
|
+
function convertToString(result, context) {
|
|
40
|
+
if (result.type === "awaiting-evaluation") {
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
if (result.type !== "value") {
|
|
44
|
+
return {
|
|
45
|
+
type: "error",
|
|
46
|
+
err: import_types.FormulaError.VALUE,
|
|
47
|
+
message: "Expected a value result",
|
|
48
|
+
errAddress: context.dependencyNode
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (result.result.type === "string") {
|
|
52
|
+
return result.result.value;
|
|
53
|
+
} else {
|
|
54
|
+
return {
|
|
55
|
+
type: "error",
|
|
56
|
+
err: import_types.FormulaError.VALUE,
|
|
57
|
+
message: "Expected a string value",
|
|
58
|
+
errAddress: context.dependencyNode
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function extractNumericValue(result, context) {
|
|
63
|
+
if (result.type === "awaiting-evaluation") {
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
if (result.type !== "value") {
|
|
67
|
+
return {
|
|
68
|
+
type: "error",
|
|
69
|
+
err: import_types.FormulaError.VALUE,
|
|
70
|
+
message: "Expected a value result",
|
|
71
|
+
errAddress: context.dependencyNode
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (result.result.type === "number") {
|
|
75
|
+
return result.result.value;
|
|
76
|
+
} else {
|
|
77
|
+
return {
|
|
78
|
+
type: "error",
|
|
79
|
+
err: import_types.FormulaError.VALUE,
|
|
80
|
+
message: "Expected a number value",
|
|
81
|
+
errAddress: context.dependencyNode
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function midOperation(textResult, startNumResult, numCharsResult, context) {
|
|
86
|
+
const textStr = convertToString(textResult, context);
|
|
87
|
+
const startNum = extractNumericValue(startNumResult, context);
|
|
88
|
+
const numChars = extractNumericValue(numCharsResult, context);
|
|
89
|
+
if (typeof textStr === "object" && (textStr.type === "awaiting-evaluation" || textStr.type === "error")) {
|
|
90
|
+
return textStr;
|
|
91
|
+
}
|
|
92
|
+
if (typeof startNum === "object" && (startNum.type === "awaiting-evaluation" || startNum.type === "error")) {
|
|
93
|
+
return startNum;
|
|
94
|
+
}
|
|
95
|
+
if (typeof numChars === "object" && (numChars.type === "awaiting-evaluation" || numChars.type === "error")) {
|
|
96
|
+
return numChars;
|
|
97
|
+
}
|
|
98
|
+
const textValue = textStr;
|
|
99
|
+
const startNumValue = startNum;
|
|
100
|
+
const numCharsValue = numChars;
|
|
101
|
+
if (startNumValue < 1) {
|
|
102
|
+
return {
|
|
103
|
+
type: "error",
|
|
104
|
+
err: import_types.FormulaError.VALUE,
|
|
105
|
+
message: "StartNum argument must be a positive number",
|
|
106
|
+
errAddress: context.dependencyNode
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (numCharsValue < 0) {
|
|
110
|
+
return {
|
|
111
|
+
type: "error",
|
|
112
|
+
err: import_types.FormulaError.VALUE,
|
|
113
|
+
message: "NumChars argument must be a positive number",
|
|
114
|
+
errAddress: context.dependencyNode
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const startIndex = Math.floor(startNumValue) - 1;
|
|
118
|
+
const length = Math.floor(numCharsValue);
|
|
119
|
+
const result = textValue.substring(startIndex, startIndex + length);
|
|
120
|
+
return { type: "value", result: { type: "string", value: result } };
|
|
121
|
+
}
|
|
122
|
+
function createMidSpilledResult({
|
|
123
|
+
textResult,
|
|
124
|
+
startNumResult,
|
|
125
|
+
numCharsResult,
|
|
126
|
+
context
|
|
127
|
+
}) {
|
|
128
|
+
const hasSpilledText = textResult.type === "spilled-values";
|
|
129
|
+
const hasSpilledStart = startNumResult.type === "spilled-values";
|
|
130
|
+
const hasSpilledNum = numCharsResult.type === "spilled-values";
|
|
131
|
+
if (!hasSpilledText && !hasSpilledStart && !hasSpilledNum) {
|
|
132
|
+
throw new Error("createMidSpilledResult called without spilled values");
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
type: "spilled-values",
|
|
136
|
+
spillArea: (origin) => {
|
|
137
|
+
let spillArea;
|
|
138
|
+
if (hasSpilledText && textResult.type === "spilled-values") {
|
|
139
|
+
spillArea = textResult.spillArea(origin);
|
|
140
|
+
} else if (hasSpilledStart && startNumResult.type === "spilled-values") {
|
|
141
|
+
spillArea = startNumResult.spillArea(origin);
|
|
142
|
+
} else if (hasSpilledNum && numCharsResult.type === "spilled-values") {
|
|
143
|
+
spillArea = numCharsResult.spillArea(origin);
|
|
144
|
+
} else {
|
|
145
|
+
throw new Error("No spilled values found");
|
|
146
|
+
}
|
|
147
|
+
if (hasSpilledText && hasSpilledStart && textResult.type === "spilled-values" && startNumResult.type === "spilled-values") {
|
|
148
|
+
spillArea = this.unionRanges(this.projectRange(textResult.spillArea(origin), origin), this.projectRange(startNumResult.spillArea(origin), origin));
|
|
149
|
+
}
|
|
150
|
+
if ((hasSpilledText || hasSpilledStart) && hasSpilledNum && numCharsResult.type === "spilled-values") {
|
|
151
|
+
const projectedSpillArea = this.projectRange(spillArea, origin);
|
|
152
|
+
const numSpillArea = this.projectRange(numCharsResult.spillArea(origin), origin);
|
|
153
|
+
spillArea = this.unionRanges(projectedSpillArea, numSpillArea);
|
|
154
|
+
}
|
|
155
|
+
return spillArea;
|
|
156
|
+
},
|
|
157
|
+
source: "MID with spilled values",
|
|
158
|
+
evaluate: (spilledCell, evalContext) => {
|
|
159
|
+
const spillTextResult = hasSpilledText ? textResult.evaluate(spilledCell, evalContext) : textResult;
|
|
160
|
+
const spillStartResult = hasSpilledStart ? startNumResult.evaluate(spilledCell, evalContext) : startNumResult;
|
|
161
|
+
const spillNumResult = hasSpilledNum ? numCharsResult.evaluate(spilledCell, evalContext) : numCharsResult;
|
|
162
|
+
if (!spillTextResult || spillTextResult.type === "error") {
|
|
163
|
+
return spillTextResult;
|
|
164
|
+
}
|
|
165
|
+
if (!spillStartResult || spillStartResult.type === "error") {
|
|
166
|
+
return spillStartResult;
|
|
167
|
+
}
|
|
168
|
+
if (!spillNumResult || spillNumResult.type === "error") {
|
|
169
|
+
return spillNumResult;
|
|
170
|
+
}
|
|
171
|
+
return midOperation(spillTextResult, spillStartResult, spillNumResult, evalContext);
|
|
172
|
+
},
|
|
173
|
+
evaluateAllCells: (intersectingRange) => {
|
|
174
|
+
throw new Error("WIP: evaluateAllCells for MID is not implemented");
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
//# debugId=81F08635A25A4B9364756E2164756E21
|