@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,145 @@
|
|
|
1
|
+
// src/parser/ast.ts
|
|
2
|
+
function createValueNode(value, position) {
|
|
3
|
+
return {
|
|
4
|
+
type: "value",
|
|
5
|
+
value,
|
|
6
|
+
position
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function createEmptyNode(position) {
|
|
10
|
+
return { type: "empty", position };
|
|
11
|
+
}
|
|
12
|
+
function createReferenceNode({
|
|
13
|
+
address,
|
|
14
|
+
isAbsolute,
|
|
15
|
+
position,
|
|
16
|
+
sheetName,
|
|
17
|
+
workbookName
|
|
18
|
+
}) {
|
|
19
|
+
return {
|
|
20
|
+
type: "reference",
|
|
21
|
+
address,
|
|
22
|
+
isAbsolute,
|
|
23
|
+
sheetName,
|
|
24
|
+
workbookName,
|
|
25
|
+
position
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function createRangeNode({
|
|
29
|
+
sheetName,
|
|
30
|
+
workbookName,
|
|
31
|
+
range,
|
|
32
|
+
isAbsolute,
|
|
33
|
+
position
|
|
34
|
+
}) {
|
|
35
|
+
return {
|
|
36
|
+
type: "range",
|
|
37
|
+
range,
|
|
38
|
+
sheetName,
|
|
39
|
+
workbookName,
|
|
40
|
+
isAbsolute,
|
|
41
|
+
position
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function createFunctionNode(name, args, position) {
|
|
45
|
+
return {
|
|
46
|
+
type: "function",
|
|
47
|
+
name: name.toUpperCase(),
|
|
48
|
+
args,
|
|
49
|
+
position
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function createUnaryOpNode(operator, operand, position) {
|
|
53
|
+
return {
|
|
54
|
+
type: "unary-op",
|
|
55
|
+
operator,
|
|
56
|
+
operand,
|
|
57
|
+
position
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function createBinaryOpNode(operator, left, right, position) {
|
|
61
|
+
return {
|
|
62
|
+
type: "binary-op",
|
|
63
|
+
operator,
|
|
64
|
+
left,
|
|
65
|
+
right,
|
|
66
|
+
position
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function createArrayNode(elements, position) {
|
|
70
|
+
return {
|
|
71
|
+
type: "array",
|
|
72
|
+
elements,
|
|
73
|
+
position
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function createNamedExpressionNode(name, position, sheetName, workbookName) {
|
|
77
|
+
return {
|
|
78
|
+
type: "named-expression",
|
|
79
|
+
name,
|
|
80
|
+
sheetName,
|
|
81
|
+
workbookName,
|
|
82
|
+
position
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function createErrorNode(error, message, position) {
|
|
86
|
+
return {
|
|
87
|
+
type: "error",
|
|
88
|
+
error,
|
|
89
|
+
message,
|
|
90
|
+
position
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function createThreeDRangeNode(startSheet, endSheet, reference, position, workbookName) {
|
|
94
|
+
return {
|
|
95
|
+
type: "3d-range",
|
|
96
|
+
startSheet,
|
|
97
|
+
endSheet,
|
|
98
|
+
workbookName,
|
|
99
|
+
reference,
|
|
100
|
+
position
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function createStructuredReferenceNode({
|
|
104
|
+
tableName,
|
|
105
|
+
sheetName,
|
|
106
|
+
workbookName,
|
|
107
|
+
cols,
|
|
108
|
+
selector,
|
|
109
|
+
isCurrentRow = false,
|
|
110
|
+
position
|
|
111
|
+
}) {
|
|
112
|
+
return {
|
|
113
|
+
type: "structured-reference",
|
|
114
|
+
tableName,
|
|
115
|
+
sheetName,
|
|
116
|
+
workbookName,
|
|
117
|
+
cols,
|
|
118
|
+
selector,
|
|
119
|
+
isCurrentRow,
|
|
120
|
+
position
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function createInfinityNode(position) {
|
|
124
|
+
return {
|
|
125
|
+
type: "infinity",
|
|
126
|
+
position
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export {
|
|
130
|
+
createValueNode,
|
|
131
|
+
createUnaryOpNode,
|
|
132
|
+
createThreeDRangeNode,
|
|
133
|
+
createStructuredReferenceNode,
|
|
134
|
+
createReferenceNode,
|
|
135
|
+
createRangeNode,
|
|
136
|
+
createNamedExpressionNode,
|
|
137
|
+
createInfinityNode,
|
|
138
|
+
createFunctionNode,
|
|
139
|
+
createErrorNode,
|
|
140
|
+
createEmptyNode,
|
|
141
|
+
createBinaryOpNode,
|
|
142
|
+
createArrayNode
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
//# debugId=99B12242BE345E9A64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/parser/ast.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Abstract Syntax Tree (AST) node definitions for formula parsing\n */\n\nimport type {\n CellAddress,\n CellValue,\n FormulaError,\n SpreadsheetRange,\n} from \"../core/types.mjs\";\n\n/**\n * Base interface for all AST nodes\n */\ntype ASTNodeBase = {\n position?: {\n start: number;\n end: number;\n };\n};\n\n/**\n * Literal value node (number, string, boolean, error)\n */\nexport type ValueNode = ASTNodeBase & {\n type: \"value\";\n value: CellValue;\n};\n\n/**\n * Cell reference node (e.g., A1, Sheet1!B2)\n */\nexport type ReferenceNode = ASTNodeBase & {\n type: \"reference\";\n address: {\n colIndex: number;\n rowIndex: number;\n };\n sheetName?: string;\n workbookName?: string;\n isAbsolute: {\n col: boolean;\n row: boolean;\n };\n};\n\n/**\n * Range reference node (e.g., A1:B10)\n */\nexport type RangeNode = ASTNodeBase & {\n type: \"range\";\n sheetName?: string;\n workbookName?: string;\n range: SpreadsheetRange;\n isAbsolute: {\n start: {\n col: boolean;\n row: boolean;\n };\n end: {\n col: boolean;\n row: boolean;\n };\n };\n};\n\n/**\n * Function call node (e.g., SUM(A1:A10))\n */\nexport type FunctionNode = ASTNodeBase & {\n type: \"function\";\n name: string;\n args: ASTNode[];\n};\n\n/**\n * Unary operator node (e.g., -A1, +B2)\n */\nexport type UnaryOpNode = ASTNodeBase & {\n type: \"unary-op\";\n operator: \"+\" | \"-\" | \"%\";\n operand: ASTNode;\n};\n\n/**\n * Binary operator node (e.g., A1+B1, C1*D1)\n */\nexport type BinaryOpNode = ASTNodeBase & {\n type: \"binary-op\";\n operator:\n | \"+\"\n | \"-\"\n | \"*\"\n | \"/\"\n | \"^\"\n | \"&\"\n | \"=\"\n | \"<>\"\n | \"<\"\n | \">\"\n | \"<=\"\n | \">=\";\n left: ASTNode;\n right: ASTNode;\n};\n\n/**\n * Array literal node (e.g., {1,2,3;4,5,6})\n */\nexport type ArrayNode = ASTNodeBase & {\n type: \"array\";\n elements: ASTNode[][]; // 2D array of elements\n};\n\n/**\n * 3D range node (e.g., Sheet1:Sheet3!A1)\n */\nexport type ThreeDRangeNode = ASTNodeBase & {\n type: \"3d-range\";\n startSheet: string;\n endSheet: string;\n workbookName?: string;\n reference: ReferenceNode | RangeNode;\n};\n\n/**\n * Structured reference node (e.g., Table1[Column1])\n */\nexport type StructuredReferenceNode = ASTNodeBase & {\n type: \"structured-reference\";\n tableName?: string;\n sheetName?: string;\n workbookName?: string;\n cols?: {\n startCol: string;\n endCol: string;\n };\n selector?: \"#All\" | \"#Data\" | \"#Headers\";\n isCurrentRow: boolean;\n};\n\n/**\n * Infinity literal node\n */\nexport type InfinityNode = ASTNodeBase & {\n type: \"infinity\";\n};\n\nexport type ASTNode =\n | ValueNode\n | ReferenceNode\n | RangeNode\n | FunctionNode\n | UnaryOpNode\n | BinaryOpNode\n | ArrayNode\n | NamedExpressionNode\n | ErrorNode\n | EmptyNode\n | ThreeDRangeNode\n | StructuredReferenceNode\n | InfinityNode;\n\n/**\n * Named expression reference node\n */\nexport type NamedExpressionNode = ASTNodeBase & {\n type: \"named-expression\";\n name: string;\n sheetName?: string;\n workbookName?: string;\n};\n\n/**\n * Error node for parsing errors\n */\nexport type ErrorNode = ASTNodeBase & {\n type: \"error\";\n error: FormulaError;\n message: string;\n};\n\nexport type EmptyNode = ASTNodeBase & {\n type: \"empty\";\n};\n\n/**\n * Helper function to create a value node\n */\nexport function createValueNode(\n value: CellValue,\n position?: {\n start: number;\n end: number;\n }\n): ValueNode {\n return {\n type: \"value\",\n value,\n position,\n };\n}\n\nexport function createEmptyNode(position?: {\n start: number;\n end: number;\n}): EmptyNode {\n return { type: \"empty\", position };\n}\n\n/**\n * Helper function to create a reference node\n */\nexport function createReferenceNode({\n address,\n isAbsolute,\n position,\n sheetName,\n workbookName,\n}: {\n address: {\n colIndex: number;\n rowIndex: number;\n };\n isAbsolute: { col: boolean; row: boolean };\n position?: {\n start: number;\n end: number;\n };\n sheetName?: string;\n workbookName?: string;\n}): ReferenceNode {\n return {\n type: \"reference\",\n address,\n isAbsolute,\n sheetName,\n workbookName,\n position,\n };\n}\n\n/**\n * Helper function to create a range node\n */\nexport function createRangeNode({\n sheetName,\n workbookName,\n range,\n isAbsolute,\n position,\n}: {\n sheetName?: string;\n workbookName?: string;\n range: SpreadsheetRange;\n isAbsolute: RangeNode[\"isAbsolute\"];\n position?: {\n start: number;\n end: number;\n };\n}): RangeNode {\n return {\n type: \"range\",\n range,\n sheetName,\n workbookName,\n isAbsolute,\n position,\n };\n}\n\n/**\n * Helper function to create a function node\n */\nexport function createFunctionNode(\n name: string,\n args: ASTNode[],\n position?: {\n start: number;\n end: number;\n }\n): FunctionNode {\n return {\n type: \"function\",\n name: name.toUpperCase(), // Normalize function names to uppercase\n args,\n position,\n };\n}\n\n/**\n * Helper function to create a unary operator node\n */\nexport function createUnaryOpNode(\n operator: UnaryOpNode[\"operator\"],\n operand: ASTNode,\n position?: {\n start: number;\n end: number;\n }\n): UnaryOpNode {\n return {\n type: \"unary-op\",\n operator,\n operand,\n position,\n };\n}\n\n/**\n * Helper function to create a binary operator node\n */\nexport function createBinaryOpNode(\n operator: BinaryOpNode[\"operator\"],\n left: ASTNode,\n right: ASTNode,\n position?: {\n start: number;\n end: number;\n }\n): BinaryOpNode {\n return {\n type: \"binary-op\",\n operator,\n left,\n right,\n position,\n };\n}\n\n/**\n * Helper function to create an array node\n */\nexport function createArrayNode(\n elements: ASTNode[][],\n position?: {\n start: number;\n end: number;\n }\n): ArrayNode {\n return {\n type: \"array\",\n elements,\n position,\n };\n}\n\n/**\n * Helper function to create a named expression node\n */\nexport function createNamedExpressionNode(\n name: string,\n position?: {\n start: number;\n end: number;\n },\n sheetName?: string,\n workbookName?: string\n): NamedExpressionNode {\n return {\n type: \"named-expression\",\n name,\n sheetName,\n workbookName,\n position,\n };\n}\n\n/**\n * Helper function to create an error node\n */\nexport function createErrorNode(\n error: FormulaError,\n message: string,\n position?: {\n start: number;\n end: number;\n }\n): ErrorNode {\n return {\n type: \"error\",\n error,\n message,\n position,\n };\n}\n\n/**\n * Helper function to create a 3D range node\n */\nexport function createThreeDRangeNode(\n startSheet: string,\n endSheet: string,\n reference: ReferenceNode | RangeNode,\n position?: {\n start: number;\n end: number;\n },\n workbookName?: string\n): ThreeDRangeNode {\n return {\n type: \"3d-range\",\n startSheet,\n endSheet,\n workbookName,\n reference,\n position,\n };\n}\n\n/**\n * Helper function to create a structured reference node\n */\nexport function createStructuredReferenceNode({\n tableName,\n sheetName,\n workbookName,\n cols,\n selector,\n isCurrentRow = false,\n position,\n}: {\n tableName?: string;\n sheetName?: string;\n workbookName?: string;\n cols?: {\n startCol: string;\n endCol: string;\n };\n selector?: \"#All\" | \"#Data\" | \"#Headers\";\n isCurrentRow?: boolean;\n position?: {\n start: number;\n end: number;\n };\n}): StructuredReferenceNode {\n return {\n type: \"structured-reference\",\n tableName,\n sheetName,\n workbookName,\n cols,\n selector,\n isCurrentRow,\n position,\n };\n}\n\n/**\n * Helper function to create an infinity node\n */\nexport function createInfinityNode(position?: {\n start: number;\n end: number;\n}): InfinityNode {\n return {\n type: \"infinity\",\n position,\n };\n}\n\n/**\n * AST visitor interface for traversing the tree\n */\nexport interface ASTVisitor<T = void> {\n visitValue?(node: ValueNode): T;\n visitReference?(node: ReferenceNode): T;\n visitRange?(node: RangeNode): T;\n visitFunction?(node: FunctionNode): T;\n visitUnaryOp?(node: UnaryOpNode): T;\n visitBinaryOp?(node: BinaryOpNode): T;\n visitArray?(node: ArrayNode): T;\n visitNamedExpression?(node: NamedExpressionNode): T;\n visitError?(node: ErrorNode): T;\n visitEmpty?(node: EmptyNode): T;\n visitThreeDRange?(node: ThreeDRangeNode): T;\n visitStructuredReference?(node: StructuredReferenceNode): T;\n visitInfinity?(node: InfinityNode): T;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AA6LO,SAAS,eAAe,CAC7B,OACA,UAIW;AAAA,EACX,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AAAA;AAGK,SAAS,eAAe,CAAC,UAGlB;AAAA,EACZ,OAAO,EAAE,MAAM,SAAS,SAAS;AAAA;AAM5B,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAagB;AAAA,EAChB,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAUY;AAAA,EACZ,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,kBAAkB,CAChC,MACA,MACA,UAIc;AAAA,EACd,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK,YAAY;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,iBAAiB,CAC/B,UACA,SACA,UAIa;AAAA,EACb,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,kBAAkB,CAChC,UACA,MACA,OACA,UAIc;AAAA,EACd,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,eAAe,CAC7B,UACA,UAIW;AAAA,EACX,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,yBAAyB,CACvC,MACA,UAIA,WACA,cACqB;AAAA,EACrB,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,eAAe,CAC7B,OACA,SACA,UAIW;AAAA,EACX,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,qBAAqB,CACnC,YACA,UACA,WACA,UAIA,cACiB;AAAA,EACjB,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,6BAA6B;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,GAe0B;AAAA,EAC1B,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,kBAAkB,CAAC,UAGlB;AAAA,EACf,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACF;AAAA;",
|
|
8
|
+
"debugId": "99B12242BE345E9A64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
// src/parser/formatter.ts
|
|
2
|
+
import { indexToColumn } from "src/core/utils";
|
|
3
|
+
import { getOperatorPrecedence, getOperatorAssociativity } from "./grammar.mjs";
|
|
4
|
+
import { parseFormula } from "./parser.mjs";
|
|
5
|
+
function astToString(ast) {
|
|
6
|
+
switch (ast.type) {
|
|
7
|
+
case "value":
|
|
8
|
+
return formatValue(ast.value);
|
|
9
|
+
case "reference":
|
|
10
|
+
return formatReference(ast);
|
|
11
|
+
case "range":
|
|
12
|
+
return formatRange(ast);
|
|
13
|
+
case "function":
|
|
14
|
+
return formatFunction(ast);
|
|
15
|
+
case "unary-op":
|
|
16
|
+
return formatUnaryOp(ast);
|
|
17
|
+
case "binary-op":
|
|
18
|
+
return formatBinaryOp(ast);
|
|
19
|
+
case "array":
|
|
20
|
+
return formatArray(ast);
|
|
21
|
+
case "named-expression":
|
|
22
|
+
return formatNamedExpression(ast);
|
|
23
|
+
case "error":
|
|
24
|
+
return ast.error;
|
|
25
|
+
case "empty":
|
|
26
|
+
return "";
|
|
27
|
+
case "3d-range":
|
|
28
|
+
return formatThreeDRange(ast);
|
|
29
|
+
case "structured-reference":
|
|
30
|
+
return formatStructuredReference(ast);
|
|
31
|
+
case "infinity":
|
|
32
|
+
return "INFINITY";
|
|
33
|
+
default:
|
|
34
|
+
throw new Error(`Unknown AST node type: ${ast.type}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function formatValue(value) {
|
|
38
|
+
if (value.type === "string") {
|
|
39
|
+
return `"${value.value.replace(/"/g, '""')}"`;
|
|
40
|
+
} else if (value.type === "boolean") {
|
|
41
|
+
return value.value ? "TRUE" : "FALSE";
|
|
42
|
+
} else if (value.type === "number") {
|
|
43
|
+
return value.value.toString();
|
|
44
|
+
}
|
|
45
|
+
return String(value);
|
|
46
|
+
}
|
|
47
|
+
function formatReference(ast) {
|
|
48
|
+
const { address, isAbsolute, sheetName, workbookName } = ast;
|
|
49
|
+
const colLetter = indexToColumn(address.colIndex);
|
|
50
|
+
const rowNumber = address.rowIndex + 1;
|
|
51
|
+
const colRef = isAbsolute.col ? `$${colLetter}` : colLetter;
|
|
52
|
+
const rowRef = isAbsolute.row ? `$${rowNumber}` : rowNumber.toString();
|
|
53
|
+
const cellRef = `${colRef}${rowRef}`;
|
|
54
|
+
let result = cellRef;
|
|
55
|
+
if (sheetName) {
|
|
56
|
+
const quotedSheet = sheetName.includes(" ") ? `'${sheetName}'` : sheetName;
|
|
57
|
+
result = `${quotedSheet}!${cellRef}`;
|
|
58
|
+
}
|
|
59
|
+
if (workbookName) {
|
|
60
|
+
result = `[${workbookName}]${result}`;
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
function formatRange(ast) {
|
|
65
|
+
const { range, isAbsolute, sheetName, workbookName } = ast;
|
|
66
|
+
if (range.end.col.type === "infinity" || range.end.row.type === "infinity") {
|
|
67
|
+
return formatInfiniteRange(ast);
|
|
68
|
+
}
|
|
69
|
+
const startCol = indexToColumn(range.start.col);
|
|
70
|
+
const startRow = range.start.row + 1;
|
|
71
|
+
const endCol = indexToColumn(range.end.col.value);
|
|
72
|
+
const endRow = range.end.row.value + 1;
|
|
73
|
+
const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;
|
|
74
|
+
const startRowRef = isAbsolute.start.row ? `$${startRow}` : startRow.toString();
|
|
75
|
+
const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;
|
|
76
|
+
const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();
|
|
77
|
+
const rangeRef = `${startColRef}${startRowRef}:${endColRef}${endRowRef}`;
|
|
78
|
+
let result = rangeRef;
|
|
79
|
+
if (sheetName) {
|
|
80
|
+
const quotedSheet = sheetName.includes(" ") ? `'${sheetName}'` : sheetName;
|
|
81
|
+
result = `${quotedSheet}!${rangeRef}`;
|
|
82
|
+
}
|
|
83
|
+
if (workbookName) {
|
|
84
|
+
result = `[${workbookName}]${result}`;
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
function formatInfiniteRange(ast) {
|
|
89
|
+
const { range, isAbsolute, sheetName, workbookName } = ast;
|
|
90
|
+
let rangeRef;
|
|
91
|
+
const startCol = indexToColumn(range.start.col);
|
|
92
|
+
const startRow = range.start.row + 1;
|
|
93
|
+
const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;
|
|
94
|
+
const startRowRef = isAbsolute.start.row ? `$${startRow}` : startRow.toString();
|
|
95
|
+
if (range.end.col.type === "infinity" && range.end.row.type === "infinity") {
|
|
96
|
+
rangeRef = `${startColRef}${startRowRef}:INFINITY`;
|
|
97
|
+
} else if (range.end.col.type === "infinity") {
|
|
98
|
+
if (range.end.row.type !== "number") {
|
|
99
|
+
throw new Error("Expected finite row for infinite column range");
|
|
100
|
+
}
|
|
101
|
+
const endRow = range.end.row.value + 1;
|
|
102
|
+
const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();
|
|
103
|
+
rangeRef = `${startColRef}${startRowRef}:${endRowRef}`;
|
|
104
|
+
} else if (range.end.row.type === "infinity") {
|
|
105
|
+
if (range.end.col.type !== "number") {
|
|
106
|
+
throw new Error("Expected finite column for infinite row range");
|
|
107
|
+
}
|
|
108
|
+
const endCol = indexToColumn(range.end.col.value);
|
|
109
|
+
const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;
|
|
110
|
+
rangeRef = `${startColRef}${startRowRef}:${endColRef}`;
|
|
111
|
+
} else {
|
|
112
|
+
throw new Error("Expected at least one infinite dimension for infinite range");
|
|
113
|
+
}
|
|
114
|
+
let result = rangeRef;
|
|
115
|
+
if (sheetName) {
|
|
116
|
+
const quotedSheet = sheetName.includes(" ") ? `'${sheetName}'` : sheetName;
|
|
117
|
+
result = `${quotedSheet}!${rangeRef}`;
|
|
118
|
+
}
|
|
119
|
+
if (workbookName) {
|
|
120
|
+
result = `[${workbookName}]${result}`;
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
function formatFunction(ast) {
|
|
125
|
+
const { name, args } = ast;
|
|
126
|
+
const formattedArgs = args.map((arg) => astToString(arg)).join(",");
|
|
127
|
+
return `${name}(${formattedArgs})`;
|
|
128
|
+
}
|
|
129
|
+
function formatUnaryOp(ast) {
|
|
130
|
+
const { operator, operand } = ast;
|
|
131
|
+
const operandStr = astToString(operand);
|
|
132
|
+
if (operator === "%") {
|
|
133
|
+
return `${operandStr}%`;
|
|
134
|
+
} else {
|
|
135
|
+
return `${operator}${operandStr}`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function formatBinaryOp(ast) {
|
|
139
|
+
const { operator, left, right } = ast;
|
|
140
|
+
const leftNeedsParens = needsParentheses(left, ast, "left");
|
|
141
|
+
const rightNeedsParens = needsParentheses(right, ast, "right");
|
|
142
|
+
const leftStr = leftNeedsParens ? `(${astToString(left)})` : astToString(left);
|
|
143
|
+
const rightStr = rightNeedsParens ? `(${astToString(right)})` : astToString(right);
|
|
144
|
+
return `${leftStr}${operator}${rightStr}`;
|
|
145
|
+
}
|
|
146
|
+
function needsParentheses(child, parent, position) {
|
|
147
|
+
if (child.type !== "binary-op") {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
if (parent.type !== "binary-op") {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
const childPrecedence = getOperatorPrecedence(child.operator);
|
|
154
|
+
const parentPrecedence = getOperatorPrecedence(parent.operator);
|
|
155
|
+
if (childPrecedence < parentPrecedence) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
if (childPrecedence === parentPrecedence) {
|
|
159
|
+
const associativity = getOperatorAssociativity(parent.operator);
|
|
160
|
+
if (associativity === "left" && position === "right") {
|
|
161
|
+
return true;
|
|
162
|
+
} else if (associativity === "right" && position === "left") {
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
function formatArray(ast) {
|
|
169
|
+
const { elements } = ast;
|
|
170
|
+
const rows = elements.map((row) => row.map((cell) => astToString(cell)).join(","));
|
|
171
|
+
return `{${rows.join(";")}}`;
|
|
172
|
+
}
|
|
173
|
+
function formatNamedExpression(ast) {
|
|
174
|
+
const { name, sheetName, workbookName } = ast;
|
|
175
|
+
let result = name;
|
|
176
|
+
if (sheetName !== undefined) {
|
|
177
|
+
const quotedSheet = sheetName.includes(" ") ? `'${sheetName}'` : sheetName;
|
|
178
|
+
result = `${quotedSheet}!${name}`;
|
|
179
|
+
}
|
|
180
|
+
if (workbookName) {
|
|
181
|
+
result = `[${workbookName}]${result}`;
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
function formatThreeDRange(ast) {
|
|
186
|
+
const { startSheet, endSheet, workbookName, reference } = ast;
|
|
187
|
+
const refStr = astToString(reference);
|
|
188
|
+
let cleanRef = refStr;
|
|
189
|
+
if (cleanRef.includes("!")) {
|
|
190
|
+
cleanRef = cleanRef.split("!")[1];
|
|
191
|
+
}
|
|
192
|
+
if (cleanRef.startsWith("[") && cleanRef.includes("]")) {
|
|
193
|
+
const bracketEnd = cleanRef.indexOf("]");
|
|
194
|
+
cleanRef = cleanRef.substring(bracketEnd + 1);
|
|
195
|
+
}
|
|
196
|
+
const quotedStartSheet = startSheet.includes(" ") ? `'${startSheet}'` : startSheet;
|
|
197
|
+
const quotedEndSheet = endSheet.includes(" ") ? `'${endSheet}'` : endSheet;
|
|
198
|
+
let result = `${quotedStartSheet}:${quotedEndSheet}!${cleanRef}`;
|
|
199
|
+
if (workbookName) {
|
|
200
|
+
result = `[${workbookName}]${result}`;
|
|
201
|
+
}
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
function needsColumnBrackets(columnName) {
|
|
205
|
+
return /[\s\[\]#@,=/]/.test(columnName);
|
|
206
|
+
}
|
|
207
|
+
function formatStructuredReference(ast) {
|
|
208
|
+
const { tableName, sheetName, workbookName, cols, selector, isCurrentRow } = ast;
|
|
209
|
+
if (!tableName && isCurrentRow) {
|
|
210
|
+
if (cols && cols.startCol) {
|
|
211
|
+
return `[@${cols.startCol}]`;
|
|
212
|
+
}
|
|
213
|
+
return "@";
|
|
214
|
+
}
|
|
215
|
+
if (!tableName && !isCurrentRow) {
|
|
216
|
+
if (selector) {
|
|
217
|
+
return `[${selector}]`;
|
|
218
|
+
} else if (cols) {
|
|
219
|
+
const startNeedsBrackets = needsColumnBrackets(cols.startCol);
|
|
220
|
+
if (cols.startCol === cols.endCol) {
|
|
221
|
+
if (startNeedsBrackets) {
|
|
222
|
+
return `[[${cols.startCol}]]`;
|
|
223
|
+
} else {
|
|
224
|
+
return `[${cols.startCol}]`;
|
|
225
|
+
}
|
|
226
|
+
} else {
|
|
227
|
+
return `[[${cols.startCol}]:[${cols.endCol}]]`;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return "[]";
|
|
231
|
+
}
|
|
232
|
+
let result = "";
|
|
233
|
+
if (workbookName) {
|
|
234
|
+
result += `[${workbookName}]`;
|
|
235
|
+
}
|
|
236
|
+
if (sheetName) {
|
|
237
|
+
const quotedSheet = sheetName.includes(" ") ? `'${sheetName}'` : sheetName;
|
|
238
|
+
result += `${quotedSheet}!`;
|
|
239
|
+
}
|
|
240
|
+
result += tableName;
|
|
241
|
+
if (selector && cols) {
|
|
242
|
+
const colRef = cols.startCol === cols.endCol ? `[${cols.startCol}]` : `[${cols.startCol}]:[${cols.endCol}]`;
|
|
243
|
+
result += `[[${selector}],${colRef}]`;
|
|
244
|
+
} else if (selector) {
|
|
245
|
+
result += `[${selector}]`;
|
|
246
|
+
} else if (cols) {
|
|
247
|
+
const startNeedsBrackets = needsColumnBrackets(cols.startCol);
|
|
248
|
+
const endNeedsBrackets = cols.startCol !== cols.endCol && needsColumnBrackets(cols.endCol);
|
|
249
|
+
const anyNeedsBrackets = startNeedsBrackets || endNeedsBrackets;
|
|
250
|
+
if (isCurrentRow) {
|
|
251
|
+
if (cols.startCol === cols.endCol) {
|
|
252
|
+
result += `[@${cols.startCol}]`;
|
|
253
|
+
} else {
|
|
254
|
+
result += `[@[${cols.startCol}]:[${cols.endCol}]]`;
|
|
255
|
+
}
|
|
256
|
+
} else {
|
|
257
|
+
if (cols.startCol === cols.endCol) {
|
|
258
|
+
result += `[${cols.startCol}]`;
|
|
259
|
+
} else {
|
|
260
|
+
result += `[[${cols.startCol}]:[${cols.endCol}]]`;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
function formatFormula(formula) {
|
|
267
|
+
return astToString(parseFormula(formula));
|
|
268
|
+
}
|
|
269
|
+
function normalizeSerializedCellValue(value) {
|
|
270
|
+
if (value === undefined || typeof value === "string" && value === "")
|
|
271
|
+
return "";
|
|
272
|
+
if (typeof value === "string" && value.startsWith("=")) {
|
|
273
|
+
return `=${formatFormula(value.slice(1))}`;
|
|
274
|
+
}
|
|
275
|
+
return value;
|
|
276
|
+
}
|
|
277
|
+
function isSerializedCellValueEqual(a, b) {
|
|
278
|
+
const normalizedA = normalizeSerializedCellValue(a);
|
|
279
|
+
const normalizedB = normalizeSerializedCellValue(b);
|
|
280
|
+
return normalizedA === normalizedB;
|
|
281
|
+
}
|
|
282
|
+
export {
|
|
283
|
+
normalizeSerializedCellValue,
|
|
284
|
+
isSerializedCellValueEqual,
|
|
285
|
+
formatFormula,
|
|
286
|
+
astToString
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
//# debugId=4A7465BE494DEACA64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/parser/formatter.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { indexToColumn } from \"src/core/utils\";\nimport { type CellValue, type SerializedCellValue } from \"../core/types.mjs\";\nimport { parseOpenEndedRange, parseInfiniteRange } from \"./grammar.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 \"./ast.mjs\";\nimport { getOperatorPrecedence, getOperatorAssociativity } from \"./grammar.mjs\";\nimport { parseFormula } from \"./parser.mjs\";\n\nexport function astToString(ast: ASTNode): string {\n switch (ast.type) {\n case \"value\":\n return formatValue(ast.value);\n\n case \"reference\":\n return formatReference(ast);\n\n case \"range\":\n return formatRange(ast);\n\n case \"function\":\n return formatFunction(ast);\n\n case \"unary-op\":\n return formatUnaryOp(ast);\n\n case \"binary-op\":\n return formatBinaryOp(ast);\n\n case \"array\":\n return formatArray(ast);\n\n case \"named-expression\":\n return formatNamedExpression(ast);\n\n case \"error\":\n return ast.error;\n\n case \"empty\":\n return \"\";\n\n case \"3d-range\":\n return formatThreeDRange(ast);\n\n case \"structured-reference\":\n return formatStructuredReference(ast);\n\n case \"infinity\":\n return \"INFINITY\";\n\n default:\n throw new Error(`Unknown AST node type: ${(ast as any).type}`);\n }\n}\n\nfunction formatValue(value: CellValue): string {\n if (value.type === \"string\") {\n // Escape quotes by doubling them and wrap in quotes\n return `\"${value.value.replace(/\"/g, '\"\"')}\"`;\n } else if (value.type === \"boolean\") {\n return value.value ? \"TRUE\" : \"FALSE\";\n } else if (value.type === \"number\") {\n return value.value.toString();\n }\n return String(value);\n}\n\nfunction formatReference(ast: ReferenceNode): string {\n const { address, isAbsolute, sheetName, workbookName } = ast;\n const colLetter = indexToColumn(address.colIndex);\n const rowNumber = address.rowIndex + 1; // Convert from 0-based to 1-based\n\n const colRef = isAbsolute.col ? `$${colLetter}` : colLetter;\n const rowRef = isAbsolute.row ? `$${rowNumber}` : rowNumber.toString();\n\n const cellRef = `${colRef}${rowRef}`;\n\n let result = cellRef;\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${cellRef}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatRange(ast: RangeNode): string {\n const { range, isAbsolute, sheetName, workbookName } = ast;\n\n // Handle infinite ranges\n if (range.end.col.type === \"infinity\" || range.end.row.type === \"infinity\") {\n return formatInfiniteRange(ast);\n }\n\n // Regular range\n const startCol = indexToColumn(range.start.col);\n const startRow = range.start.row + 1;\n const endCol = indexToColumn(range.end.col.value);\n const endRow = range.end.row.value + 1;\n\n const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;\n const startRowRef = isAbsolute.start.row\n ? `$${startRow}`\n : startRow.toString();\n const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;\n const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();\n\n const rangeRef = `${startColRef}${startRowRef}:${endColRef}${endRowRef}`;\n\n let result = rangeRef;\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${rangeRef}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatInfiniteRange(ast: RangeNode): string {\n const { range, isAbsolute, sheetName, workbookName } = ast;\n\n let rangeRef: string;\n\n // Canonical formatting rules:\n // 1. Start is always explicit cell (A5, $A$5, etc.)\n // 2. End varies by openness:\n // - Open→: A5:10 (row-bounded)\n // - Open↓: A5:D (column-bounded)\n // - Open both: A5:INFINITY\n // 3. Excel compatibility: whole rows/columns use canonical cell form\n // - 5:5 → A5:5, A:A → A1:A\n\n const startCol = indexToColumn(range.start.col);\n const startRow = range.start.row + 1;\n\n const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;\n const startRowRef = isAbsolute.start.row\n ? `$${startRow}`\n : startRow.toString();\n\n if (range.end.col.type === \"infinity\" && range.end.row.type === \"infinity\") {\n // Open both: A5:INFINITY\n rangeRef = `${startColRef}${startRowRef}:INFINITY`;\n } else if (range.end.col.type === \"infinity\") {\n // Open→ (row-bounded): A5:10\n if (range.end.row.type !== \"number\") {\n throw new Error(\"Expected finite row for infinite column range\");\n }\n\n const endRow = range.end.row.value + 1;\n const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();\n\n // Always use canonical cell form: A5:10 (not 5:10)\n rangeRef = `${startColRef}${startRowRef}:${endRowRef}`;\n } else if (range.end.row.type === \"infinity\") {\n // Open↓ (column-bounded): A5:D\n if (range.end.col.type !== \"number\") {\n throw new Error(\"Expected finite column for infinite row range\");\n }\n\n const endCol = indexToColumn(range.end.col.value);\n const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;\n\n // Always use canonical cell form: A1:D (not A:D)\n rangeRef = `${startColRef}${startRowRef}:${endColRef}`;\n } else {\n throw new Error(\n \"Expected at least one infinite dimension for infinite range\"\n );\n }\n\n let result = rangeRef;\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${rangeRef}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatFunction(ast: FunctionNode): string {\n const { name, args } = ast;\n const formattedArgs = args.map((arg: ASTNode) => astToString(arg)).join(\",\");\n return `${name}(${formattedArgs})`;\n}\n\nfunction formatUnaryOp(ast: UnaryOpNode): string {\n const { operator, operand } = ast;\n const operandStr = astToString(operand);\n\n if (operator === \"%\") {\n return `${operandStr}%`;\n } else {\n return `${operator}${operandStr}`;\n }\n}\n\nfunction formatBinaryOp(ast: BinaryOpNode): string {\n const { operator, left, right } = ast;\n\n // Determine if we need parentheses for left and right operands\n const leftNeedsParens = needsParentheses(left, ast, \"left\");\n const rightNeedsParens = needsParentheses(right, ast, \"right\");\n\n const leftStr = leftNeedsParens\n ? `(${astToString(left)})`\n : astToString(left);\n const rightStr = rightNeedsParens\n ? `(${astToString(right)})`\n : astToString(right);\n\n return `${leftStr}${operator}${rightStr}`;\n}\n\nfunction needsParentheses(\n child: ASTNode,\n parent: ASTNode,\n position: \"left\" | \"right\"\n): boolean {\n if (child.type !== \"binary-op\") {\n return false;\n }\n\n // Only binary operations need precedence checking\n if (parent.type !== \"binary-op\") {\n return false;\n }\n\n const childPrecedence = getOperatorPrecedence(child.operator);\n const parentPrecedence = getOperatorPrecedence(parent.operator);\n\n // Lower precedence always needs parentheses\n if (childPrecedence < parentPrecedence) {\n return true;\n }\n\n // For same precedence, check associativity\n if (childPrecedence === parentPrecedence) {\n const associativity = getOperatorAssociativity(parent.operator);\n\n // For left-associative operators, right side needs parentheses\n // For right-associative operators, left side needs parentheses\n if (associativity === \"left\" && position === \"right\") {\n return true;\n } else if (associativity === \"right\" && position === \"left\") {\n return true;\n }\n }\n\n return false;\n}\n\nfunction formatArray(ast: ArrayNode): string {\n const { elements } = ast;\n const rows = elements.map((row: ASTNode[]) =>\n row.map((cell: ASTNode) => astToString(cell)).join(\",\")\n );\n return `{${rows.join(\";\")}}`;\n}\n\nfunction formatNamedExpression(ast: NamedExpressionNode): string {\n const { name, sheetName, workbookName } = ast;\n\n let result = name;\n\n if (sheetName !== undefined) {\n // Sheet-scoped named expression\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result = `${quotedSheet}!${name}`;\n }\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\nfunction formatThreeDRange(ast: ThreeDRangeNode): string {\n const { startSheet, endSheet, workbookName, reference } = ast;\n const refStr = astToString(reference);\n\n // Remove sheet name and workbook name from reference if present (since we're adding the 3D range prefix)\n let cleanRef = refStr;\n if (cleanRef.includes(\"!\")) {\n cleanRef = cleanRef.split(\"!\")[1]!;\n }\n // Remove workbook prefix if present\n if (cleanRef.startsWith(\"[\") && cleanRef.includes(\"]\")) {\n const bracketEnd = cleanRef.indexOf(\"]\");\n cleanRef = cleanRef.substring(bracketEnd + 1);\n }\n\n const quotedStartSheet = startSheet.includes(\" \")\n ? `'${startSheet}'`\n : startSheet;\n const quotedEndSheet = endSheet.includes(\" \") ? `'${endSheet}'` : endSheet;\n\n let result = `${quotedStartSheet}:${quotedEndSheet}!${cleanRef}`;\n\n if (workbookName) {\n result = `[${workbookName}]${result}`;\n }\n\n return result;\n}\n\n/**\n * Check if a column name contains special characters that require double bracket syntax\n */\nfunction needsColumnBrackets(columnName: string): boolean {\n // Column names need extra brackets if they contain spaces or special characters\n // Note: Colons are NOT included here since they can be part of column names\n // Column ranges must use explicit double-bracket syntax: [[Col1]:[Col2]]\n return /[\\s\\[\\]#@,=/]/.test(columnName);\n}\n\nfunction formatStructuredReference(ast: StructuredReferenceNode): string {\n const { tableName, sheetName, workbookName, cols, selector, isCurrentRow } =\n ast;\n\n if (!tableName && isCurrentRow) {\n // Current row reference like [@Column] or @Column\n if (cols && cols.startCol) {\n return `[@${cols.startCol}]`;\n }\n return \"@\";\n }\n\n if (!tableName && !isCurrentRow) {\n // Bare column reference like [Column] or [#Data]\n if (selector) {\n return `[${selector}]`;\n } else if (cols) {\n const startNeedsBrackets = needsColumnBrackets(cols.startCol);\n\n if (cols.startCol === cols.endCol) {\n // Single column\n if (startNeedsBrackets) {\n return `[[${cols.startCol}]]`;\n } else {\n return `[${cols.startCol}]`;\n }\n } else {\n // Column range - always use double-bracket syntax to avoid ambiguity\n // with column names that contain colons\n return `[[${cols.startCol}]:[${cols.endCol}]]`;\n }\n }\n return \"[]\"; // Empty bare reference (shouldn't happen)\n }\n\n let result = \"\";\n\n if (workbookName) {\n result += `[${workbookName}]`;\n }\n\n if (sheetName) {\n const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n result += `${quotedSheet}!`;\n }\n\n result += tableName;\n\n if (selector && cols) {\n // Complex syntax like Table1[[#Headers],[Column1]] or Table1[[#Headers],[Col1]:[Col2]]\n const colRef =\n cols.startCol === cols.endCol\n ? `[${cols.startCol}]` // Single column: [Column]\n : `[${cols.startCol}]:[${cols.endCol}]`; // Range: [Col1]:[Col2]\n result += `[[${selector}],${colRef}]`;\n } else if (selector) {\n // Simple selector like Table1[#Data]\n result += `[${selector}]`;\n } else if (cols) {\n const startNeedsBrackets = needsColumnBrackets(cols.startCol);\n const endNeedsBrackets =\n cols.startCol !== cols.endCol && needsColumnBrackets(cols.endCol);\n const anyNeedsBrackets = startNeedsBrackets || endNeedsBrackets;\n\n if (isCurrentRow) {\n // Current row references\n if (cols.startCol === cols.endCol) {\n // Single column - always use simple format [@ColumnName]\n // No need for double brackets even if column name has spaces\n result += `[@${cols.startCol}]`;\n } else {\n // Column range - always use double-bracket syntax to avoid ambiguity\n // with column names that contain colons\n result += `[@[${cols.startCol}]:[${cols.endCol}]]`;\n }\n } else {\n // Regular column references\n if (cols.startCol === cols.endCol) {\n // Single column - always use single brackets for table references\n result += `[${cols.startCol}]`;\n } else {\n // Column range - always use double-bracket syntax to avoid ambiguity\n // with column names that contain colons\n result += `[[${cols.startCol}]:[${cols.endCol}]]`;\n }\n }\n }\n\n return result;\n}\n\nexport function formatFormula(formula: string): string {\n return astToString(parseFormula(formula));\n}\n\nexport function normalizeSerializedCellValue(\n value: SerializedCellValue\n): SerializedCellValue {\n if (value === undefined || (typeof value === \"string\" && value === \"\"))\n return \"\";\n\n if (typeof value === \"string\" && value.startsWith(\"=\")) {\n return `=${formatFormula(value.slice(1))}`;\n }\n\n return value;\n}\n\nexport function isSerializedCellValueEqual(\n a: SerializedCellValue,\n b: SerializedCellValue\n): boolean {\n const normalizedA = normalizeSerializedCellValue(a);\n const normalizedB = normalizeSerializedCellValue(b);\n\n return normalizedA === normalizedB;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";AAAA;AAgBA;AACA;AAEO,SAAS,WAAW,CAAC,KAAsB;AAAA,EAChD,QAAQ,IAAI;AAAA,SACL;AAAA,MACH,OAAO,YAAY,IAAI,KAAK;AAAA,SAEzB;AAAA,MACH,OAAO,gBAAgB,GAAG;AAAA,SAEvB;AAAA,MACH,OAAO,YAAY,GAAG;AAAA,SAEnB;AAAA,MACH,OAAO,eAAe,GAAG;AAAA,SAEtB;AAAA,MACH,OAAO,cAAc,GAAG;AAAA,SAErB;AAAA,MACH,OAAO,eAAe,GAAG;AAAA,SAEtB;AAAA,MACH,OAAO,YAAY,GAAG;AAAA,SAEnB;AAAA,MACH,OAAO,sBAAsB,GAAG;AAAA,SAE7B;AAAA,MACH,OAAO,IAAI;AAAA,SAER;AAAA,MACH,OAAO;AAAA,SAEJ;AAAA,MACH,OAAO,kBAAkB,GAAG;AAAA,SAEzB;AAAA,MACH,OAAO,0BAA0B,GAAG;AAAA,SAEjC;AAAA,MACH,OAAO;AAAA;AAAA,MAGP,MAAM,IAAI,MAAM,0BAA2B,IAAY,MAAM;AAAA;AAAA;AAInE,SAAS,WAAW,CAAC,OAA0B;AAAA,EAC7C,IAAI,MAAM,SAAS,UAAU;AAAA,IAE3B,OAAO,IAAI,MAAM,MAAM,QAAQ,MAAM,IAAI;AAAA,EAC3C,EAAO,SAAI,MAAM,SAAS,WAAW;AAAA,IACnC,OAAO,MAAM,QAAQ,SAAS;AAAA,EAChC,EAAO,SAAI,MAAM,SAAS,UAAU;AAAA,IAClC,OAAO,MAAM,MAAM,SAAS;AAAA,EAC9B;AAAA,EACA,OAAO,OAAO,KAAK;AAAA;AAGrB,SAAS,eAAe,CAAC,KAA4B;AAAA,EACnD,QAAQ,SAAS,YAAY,WAAW,iBAAiB;AAAA,EACzD,MAAM,YAAY,cAAc,QAAQ,QAAQ;AAAA,EAChD,MAAM,YAAY,QAAQ,WAAW;AAAA,EAErC,MAAM,SAAS,WAAW,MAAM,IAAI,cAAc;AAAA,EAClD,MAAM,SAAS,WAAW,MAAM,IAAI,cAAc,UAAU,SAAS;AAAA,EAErE,MAAM,UAAU,GAAG,SAAS;AAAA,EAE5B,IAAI,SAAS;AAAA,EAEb,IAAI,WAAW;AAAA,IACb,MAAM,cAAc,UAAU,SAAS,GAAG,IAAI,IAAI,eAAe;AAAA,IACjE,SAAS,GAAG,eAAe;AAAA,EAC7B;AAAA,EAEA,IAAI,cAAc;AAAA,IAChB,SAAS,IAAI,gBAAgB;AAAA,EAC/B;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,KAAwB;AAAA,EAC3C,QAAQ,OAAO,YAAY,WAAW,iBAAiB;AAAA,EAGvD,IAAI,MAAM,IAAI,IAAI,SAAS,cAAc,MAAM,IAAI,IAAI,SAAS,YAAY;AAAA,IAC1E,OAAO,oBAAoB,GAAG;AAAA,EAChC;AAAA,EAGA,MAAM,WAAW,cAAc,MAAM,MAAM,GAAG;AAAA,EAC9C,MAAM,WAAW,MAAM,MAAM,MAAM;AAAA,EACnC,MAAM,SAAS,cAAc,MAAM,IAAI,IAAI,KAAK;AAAA,EAChD,MAAM,SAAS,MAAM,IAAI,IAAI,QAAQ;AAAA,EAErC,MAAM,cAAc,WAAW,MAAM,MAAM,IAAI,aAAa;AAAA,EAC5D,MAAM,cAAc,WAAW,MAAM,MACjC,IAAI,aACJ,SAAS,SAAS;AAAA,EACtB,MAAM,YAAY,WAAW,IAAI,MAAM,IAAI,WAAW;AAAA,EACtD,MAAM,YAAY,WAAW,IAAI,MAAM,IAAI,WAAW,OAAO,SAAS;AAAA,EAEtE,MAAM,WAAW,GAAG,cAAc,eAAe,YAAY;AAAA,EAE7D,IAAI,SAAS;AAAA,EAEb,IAAI,WAAW;AAAA,IACb,MAAM,cAAc,UAAU,SAAS,GAAG,IAAI,IAAI,eAAe;AAAA,IACjE,SAAS,GAAG,eAAe;AAAA,EAC7B;AAAA,EAEA,IAAI,cAAc;AAAA,IAChB,SAAS,IAAI,gBAAgB;AAAA,EAC/B;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,mBAAmB,CAAC,KAAwB;AAAA,EACnD,QAAQ,OAAO,YAAY,WAAW,iBAAiB;AAAA,EAEvD,IAAI;AAAA,EAWJ,MAAM,WAAW,cAAc,MAAM,MAAM,GAAG;AAAA,EAC9C,MAAM,WAAW,MAAM,MAAM,MAAM;AAAA,EAEnC,MAAM,cAAc,WAAW,MAAM,MAAM,IAAI,aAAa;AAAA,EAC5D,MAAM,cAAc,WAAW,MAAM,MACjC,IAAI,aACJ,SAAS,SAAS;AAAA,EAEtB,IAAI,MAAM,IAAI,IAAI,SAAS,cAAc,MAAM,IAAI,IAAI,SAAS,YAAY;AAAA,IAE1E,WAAW,GAAG,cAAc;AAAA,EAC9B,EAAO,SAAI,MAAM,IAAI,IAAI,SAAS,YAAY;AAAA,IAE5C,IAAI,MAAM,IAAI,IAAI,SAAS,UAAU;AAAA,MACnC,MAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,IAEA,MAAM,SAAS,MAAM,IAAI,IAAI,QAAQ;AAAA,IACrC,MAAM,YAAY,WAAW,IAAI,MAAM,IAAI,WAAW,OAAO,SAAS;AAAA,IAGtE,WAAW,GAAG,cAAc,eAAe;AAAA,EAC7C,EAAO,SAAI,MAAM,IAAI,IAAI,SAAS,YAAY;AAAA,IAE5C,IAAI,MAAM,IAAI,IAAI,SAAS,UAAU;AAAA,MACnC,MAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,IAEA,MAAM,SAAS,cAAc,MAAM,IAAI,IAAI,KAAK;AAAA,IAChD,MAAM,YAAY,WAAW,IAAI,MAAM,IAAI,WAAW;AAAA,IAGtD,WAAW,GAAG,cAAc,eAAe;AAAA,EAC7C,EAAO;AAAA,IACL,MAAM,IAAI,MACR,6DACF;AAAA;AAAA,EAGF,IAAI,SAAS;AAAA,EAEb,IAAI,WAAW;AAAA,IACb,MAAM,cAAc,UAAU,SAAS,GAAG,IAAI,IAAI,eAAe;AAAA,IACjE,SAAS,GAAG,eAAe;AAAA,EAC7B;AAAA,EAEA,IAAI,cAAc;AAAA,IAChB,SAAS,IAAI,gBAAgB;AAAA,EAC/B;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,cAAc,CAAC,KAA2B;AAAA,EACjD,QAAQ,MAAM,SAAS;AAAA,EACvB,MAAM,gBAAgB,KAAK,IAAI,CAAC,QAAiB,YAAY,GAAG,CAAC,EAAE,KAAK,GAAG;AAAA,EAC3E,OAAO,GAAG,QAAQ;AAAA;AAGpB,SAAS,aAAa,CAAC,KAA0B;AAAA,EAC/C,QAAQ,UAAU,YAAY;AAAA,EAC9B,MAAM,aAAa,YAAY,OAAO;AAAA,EAEtC,IAAI,aAAa,KAAK;AAAA,IACpB,OAAO,GAAG;AAAA,EACZ,EAAO;AAAA,IACL,OAAO,GAAG,WAAW;AAAA;AAAA;AAIzB,SAAS,cAAc,CAAC,KAA2B;AAAA,EACjD,QAAQ,UAAU,MAAM,UAAU;AAAA,EAGlC,MAAM,kBAAkB,iBAAiB,MAAM,KAAK,MAAM;AAAA,EAC1D,MAAM,mBAAmB,iBAAiB,OAAO,KAAK,OAAO;AAAA,EAE7D,MAAM,UAAU,kBACZ,IAAI,YAAY,IAAI,OACpB,YAAY,IAAI;AAAA,EACpB,MAAM,WAAW,mBACb,IAAI,YAAY,KAAK,OACrB,YAAY,KAAK;AAAA,EAErB,OAAO,GAAG,UAAU,WAAW;AAAA;AAGjC,SAAS,gBAAgB,CACvB,OACA,QACA,UACS;AAAA,EACT,IAAI,MAAM,SAAS,aAAa;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,OAAO,SAAS,aAAa;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,sBAAsB,MAAM,QAAQ;AAAA,EAC5D,MAAM,mBAAmB,sBAAsB,OAAO,QAAQ;AAAA,EAG9D,IAAI,kBAAkB,kBAAkB;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,oBAAoB,kBAAkB;AAAA,IACxC,MAAM,gBAAgB,yBAAyB,OAAO,QAAQ;AAAA,IAI9D,IAAI,kBAAkB,UAAU,aAAa,SAAS;AAAA,MACpD,OAAO;AAAA,IACT,EAAO,SAAI,kBAAkB,WAAW,aAAa,QAAQ;AAAA,MAC3D,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,KAAwB;AAAA,EAC3C,QAAQ,aAAa;AAAA,EACrB,MAAM,OAAO,SAAS,IAAI,CAAC,QACzB,IAAI,IAAI,CAAC,SAAkB,YAAY,IAAI,CAAC,EAAE,KAAK,GAAG,CACxD;AAAA,EACA,OAAO,IAAI,KAAK,KAAK,GAAG;AAAA;AAG1B,SAAS,qBAAqB,CAAC,KAAkC;AAAA,EAC/D,QAAQ,MAAM,WAAW,iBAAiB;AAAA,EAE1C,IAAI,SAAS;AAAA,EAEb,IAAI,cAAc,WAAW;AAAA,IAE3B,MAAM,cAAc,UAAU,SAAS,GAAG,IAAI,IAAI,eAAe;AAAA,IACjE,SAAS,GAAG,eAAe;AAAA,EAC7B;AAAA,EAEA,IAAI,cAAc;AAAA,IAChB,SAAS,IAAI,gBAAgB;AAAA,EAC/B;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,KAA8B;AAAA,EACvD,QAAQ,YAAY,UAAU,cAAc,cAAc;AAAA,EAC1D,MAAM,SAAS,YAAY,SAAS;AAAA,EAGpC,IAAI,WAAW;AAAA,EACf,IAAI,SAAS,SAAS,GAAG,GAAG;AAAA,IAC1B,WAAW,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AAAA,EAEA,IAAI,SAAS,WAAW,GAAG,KAAK,SAAS,SAAS,GAAG,GAAG;AAAA,IACtD,MAAM,aAAa,SAAS,QAAQ,GAAG;AAAA,IACvC,WAAW,SAAS,UAAU,aAAa,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,mBAAmB,WAAW,SAAS,GAAG,IAC5C,IAAI,gBACJ;AAAA,EACJ,MAAM,iBAAiB,SAAS,SAAS,GAAG,IAAI,IAAI,cAAc;AAAA,EAElE,IAAI,SAAS,GAAG,oBAAoB,kBAAkB;AAAA,EAEtD,IAAI,cAAc;AAAA,IAChB,SAAS,IAAI,gBAAgB;AAAA,EAC/B;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,mBAAmB,CAAC,YAA6B;AAAA,EAIxD,OAAO,gBAAgB,KAAK,UAAU;AAAA;AAGxC,SAAS,yBAAyB,CAAC,KAAsC;AAAA,EACvE,QAAQ,WAAW,WAAW,cAAc,MAAM,UAAU,iBAC1D;AAAA,EAEF,IAAI,CAAC,aAAa,cAAc;AAAA,IAE9B,IAAI,QAAQ,KAAK,UAAU;AAAA,MACzB,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,CAAC,aAAa,CAAC,cAAc;AAAA,IAE/B,IAAI,UAAU;AAAA,MACZ,OAAO,IAAI;AAAA,IACb,EAAO,SAAI,MAAM;AAAA,MACf,MAAM,qBAAqB,oBAAoB,KAAK,QAAQ;AAAA,MAE5D,IAAI,KAAK,aAAa,KAAK,QAAQ;AAAA,QAEjC,IAAI,oBAAoB;AAAA,UACtB,OAAO,KAAK,KAAK;AAAA,QACnB,EAAO;AAAA,UACL,OAAO,IAAI,KAAK;AAAA;AAAA,MAEpB,EAAO;AAAA,QAGL,OAAO,KAAK,KAAK,cAAc,KAAK;AAAA;AAAA,IAExC;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS;AAAA,EAEb,IAAI,cAAc;AAAA,IAChB,UAAU,IAAI;AAAA,EAChB;AAAA,EAEA,IAAI,WAAW;AAAA,IACb,MAAM,cAAc,UAAU,SAAS,GAAG,IAAI,IAAI,eAAe;AAAA,IACjE,UAAU,GAAG;AAAA,EACf;AAAA,EAEA,UAAU;AAAA,EAEV,IAAI,YAAY,MAAM;AAAA,IAEpB,MAAM,SACJ,KAAK,aAAa,KAAK,SACnB,IAAI,KAAK,cACT,IAAI,KAAK,cAAc,KAAK;AAAA,IAClC,UAAU,KAAK,aAAa;AAAA,EAC9B,EAAO,SAAI,UAAU;AAAA,IAEnB,UAAU,IAAI;AAAA,EAChB,EAAO,SAAI,MAAM;AAAA,IACf,MAAM,qBAAqB,oBAAoB,KAAK,QAAQ;AAAA,IAC5D,MAAM,mBACJ,KAAK,aAAa,KAAK,UAAU,oBAAoB,KAAK,MAAM;AAAA,IAClE,MAAM,mBAAmB,sBAAsB;AAAA,IAE/C,IAAI,cAAc;AAAA,MAEhB,IAAI,KAAK,aAAa,KAAK,QAAQ;AAAA,QAGjC,UAAU,KAAK,KAAK;AAAA,MACtB,EAAO;AAAA,QAGL,UAAU,MAAM,KAAK,cAAc,KAAK;AAAA;AAAA,IAE5C,EAAO;AAAA,MAEL,IAAI,KAAK,aAAa,KAAK,QAAQ;AAAA,QAEjC,UAAU,IAAI,KAAK;AAAA,MACrB,EAAO;AAAA,QAGL,UAAU,KAAK,KAAK,cAAc,KAAK;AAAA;AAAA;AAAA,EAG7C;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,aAAa,CAAC,SAAyB;AAAA,EACrD,OAAO,YAAY,aAAa,OAAO,CAAC;AAAA;AAGnC,SAAS,4BAA4B,CAC1C,OACqB;AAAA,EACrB,IAAI,UAAU,aAAc,OAAO,UAAU,YAAY,UAAU;AAAA,IACjE,OAAO;AAAA,EAET,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG,GAAG;AAAA,IACtD,OAAO,IAAI,cAAc,MAAM,MAAM,CAAC,CAAC;AAAA,EACzC;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,0BAA0B,CACxC,GACA,GACS;AAAA,EACT,MAAM,cAAc,6BAA6B,CAAC;AAAA,EAClD,MAAM,cAAc,6BAA6B,CAAC;AAAA,EAElD,OAAO,gBAAgB;AAAA;",
|
|
8
|
+
"debugId": "4A7465BE494DEACA64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|