@cj-tech-master/excelts 9.2.1 → 9.3.0
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 +25 -2
- package/README_zh.md +29 -6
- package/dist/browser/index.browser.d.ts +1 -1
- package/dist/browser/index.browser.js +4 -0
- package/dist/browser/index.d.ts +1 -1
- package/dist/browser/index.js +4 -0
- package/dist/browser/modules/excel/cell.d.ts +17 -3
- package/dist/browser/modules/excel/cell.js +170 -22
- package/dist/browser/modules/excel/defined-names.d.ts +96 -1
- package/dist/browser/modules/excel/defined-names.js +411 -21
- package/dist/browser/modules/excel/image.d.ts +11 -0
- package/dist/browser/modules/excel/image.js +24 -1
- package/dist/browser/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
- package/dist/browser/modules/excel/stream/workbook-reader.browser.js +14 -0
- package/dist/browser/modules/excel/stream/workbook-reader.d.ts +2 -1
- package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
- package/dist/browser/modules/excel/stream/workbook-writer.browser.js +48 -1
- package/dist/browser/modules/excel/stream/workbook-writer.d.ts +3 -2
- package/dist/browser/modules/excel/stream/worksheet-reader.js +17 -1
- package/dist/browser/modules/excel/stream/worksheet-writer.d.ts +39 -6
- package/dist/browser/modules/excel/stream/worksheet-writer.js +45 -5
- package/dist/browser/modules/excel/table.js +15 -2
- package/dist/browser/modules/excel/types.d.ts +133 -2
- package/dist/browser/modules/excel/utils/col-cache.d.ts +1 -0
- package/dist/browser/modules/excel/utils/col-cache.js +15 -0
- package/dist/browser/modules/excel/utils/drawing-utils.d.ts +3 -3
- package/dist/browser/modules/excel/utils/drawing-utils.js +4 -0
- package/dist/browser/modules/excel/utils/external-link-formula.d.ts +76 -0
- package/dist/browser/modules/excel/utils/external-link-formula.js +208 -0
- package/dist/browser/modules/excel/utils/iterate-stream.d.ts +9 -3
- package/dist/browser/modules/excel/utils/iterate-stream.js +3 -1
- package/dist/browser/modules/excel/utils/ooxml-paths.d.ts +19 -0
- package/dist/browser/modules/excel/utils/ooxml-paths.js +37 -2
- package/dist/browser/modules/excel/utils/shared-strings.d.ts +8 -3
- package/dist/browser/modules/excel/utils/shared-strings.js +21 -2
- package/dist/browser/modules/excel/utils/workbook-protection.d.ts +30 -0
- package/dist/browser/modules/excel/utils/workbook-protection.js +30 -0
- package/dist/browser/modules/excel/workbook.browser.d.ts +257 -6
- package/dist/browser/modules/excel/workbook.browser.js +318 -34
- package/dist/browser/modules/excel/workbook.d.ts +1 -1
- package/dist/browser/modules/excel/worksheet.d.ts +3 -1
- package/dist/browser/modules/excel/worksheet.js +21 -2
- package/dist/browser/modules/excel/xlsx/rel-type.d.ts +15 -0
- package/dist/browser/modules/excel/xlsx/rel-type.js +16 -1
- package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
- package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
- package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
- package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
- package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
- package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
- package/dist/browser/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
- package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
- package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
- package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
- package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
- package/dist/browser/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
- package/dist/browser/modules/excel/xlsx/xform/style/border-xform.js +4 -1
- package/dist/browser/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
- package/dist/browser/modules/excel/xlsx/xlsx.browser.js +410 -20
- package/dist/browser/modules/excel/xlsx/xlsx.d.ts +7 -4
- package/dist/browser/modules/excel/xlsx/xlsx.js +4 -5
- package/dist/browser/modules/formula/compile/address-utils.d.ts +62 -0
- package/dist/browser/modules/formula/compile/address-utils.js +83 -0
- package/dist/browser/modules/formula/compile/binder.d.ts +42 -0
- package/dist/browser/modules/formula/compile/binder.js +487 -0
- package/dist/browser/modules/formula/compile/bound-ast.d.ts +230 -0
- package/dist/browser/modules/formula/compile/bound-ast.js +80 -0
- package/dist/browser/modules/formula/compile/compiled-formula.d.ts +137 -0
- package/dist/browser/modules/formula/compile/compiled-formula.js +383 -0
- package/dist/browser/modules/formula/compile/dependency-analysis.d.ts +93 -0
- package/dist/browser/modules/formula/compile/dependency-analysis.js +432 -0
- package/dist/browser/modules/formula/compile/structured-ref-utils.d.ts +93 -0
- package/dist/browser/modules/formula/compile/structured-ref-utils.js +136 -0
- package/dist/browser/modules/formula/default-syntax-probe.d.ts +79 -0
- package/dist/browser/modules/formula/default-syntax-probe.js +83 -0
- package/dist/browser/modules/formula/functions/_date-context.d.ts +4 -0
- package/dist/browser/modules/formula/functions/_date-context.js +29 -0
- package/dist/browser/modules/formula/functions/_shared.d.ts +121 -0
- package/dist/browser/modules/formula/functions/_shared.js +381 -0
- package/dist/browser/modules/formula/functions/conditional.d.ts +27 -0
- package/dist/browser/modules/formula/functions/conditional.js +343 -0
- package/dist/browser/modules/formula/functions/database.d.ts +37 -0
- package/dist/browser/modules/formula/functions/database.js +274 -0
- package/dist/browser/modules/formula/functions/date.d.ts +61 -0
- package/dist/browser/modules/formula/functions/date.js +855 -0
- package/dist/browser/modules/formula/functions/dynamic-array.d.ts +23 -0
- package/dist/browser/modules/formula/functions/dynamic-array.js +860 -0
- package/dist/browser/modules/formula/functions/engineering.d.ts +57 -0
- package/dist/browser/modules/formula/functions/engineering.js +1128 -0
- package/dist/browser/modules/formula/functions/financial.d.ts +202 -0
- package/dist/browser/modules/formula/functions/financial.js +2296 -0
- package/dist/browser/modules/formula/functions/lookup.d.ts +18 -0
- package/dist/browser/modules/formula/functions/lookup.js +886 -0
- package/dist/browser/modules/formula/functions/math.d.ts +114 -0
- package/dist/browser/modules/formula/functions/math.js +1406 -0
- package/dist/browser/modules/formula/functions/statistical.d.ts +193 -0
- package/dist/browser/modules/formula/functions/statistical.js +3390 -0
- package/dist/browser/modules/formula/functions/text.d.ts +86 -0
- package/dist/browser/modules/formula/functions/text.js +1845 -0
- package/dist/browser/modules/formula/host-registry.d.ts +53 -0
- package/dist/browser/modules/formula/host-registry.js +69 -0
- package/dist/browser/modules/formula/index.d.ts +39 -0
- package/dist/browser/modules/formula/index.js +49 -0
- package/dist/browser/modules/formula/install.d.ts +62 -0
- package/dist/browser/modules/formula/install.js +88 -0
- package/dist/browser/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
- package/dist/browser/modules/formula/integration/apply-writeback-plan.js +210 -0
- package/dist/browser/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
- package/dist/browser/modules/formula/integration/calculate-formulas-impl.js +616 -0
- package/dist/browser/modules/formula/integration/calculate-formulas.d.ts +67 -0
- package/dist/browser/modules/formula/integration/calculate-formulas.js +68 -0
- package/dist/browser/modules/formula/integration/formula-instance.d.ts +64 -0
- package/dist/browser/modules/formula/integration/formula-instance.js +79 -0
- package/dist/browser/modules/formula/integration/workbook-adapter.d.ts +26 -0
- package/dist/browser/modules/formula/integration/workbook-adapter.js +324 -0
- package/dist/browser/modules/formula/integration/workbook-snapshot.d.ts +267 -0
- package/dist/browser/modules/formula/integration/workbook-snapshot.js +77 -0
- package/dist/browser/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
- package/dist/browser/modules/formula/materialize/build-writeback-plan.js +473 -0
- package/dist/browser/modules/formula/materialize/spill-engine.d.ts +9 -0
- package/dist/browser/modules/formula/materialize/spill-engine.js +38 -0
- package/dist/browser/modules/formula/materialize/types.d.ts +179 -0
- package/dist/browser/modules/formula/materialize/types.js +29 -0
- package/dist/browser/modules/formula/materialize/writeback-plan.d.ts +167 -0
- package/dist/browser/modules/formula/materialize/writeback-plan.js +27 -0
- package/dist/browser/modules/formula/runtime/evaluator.d.ts +151 -0
- package/dist/browser/modules/formula/runtime/evaluator.js +2291 -0
- package/dist/browser/modules/formula/runtime/function-registry.d.ts +47 -0
- package/dist/browser/modules/formula/runtime/function-registry.js +840 -0
- package/dist/browser/modules/formula/runtime/values.d.ts +211 -0
- package/dist/browser/modules/formula/runtime/values.js +385 -0
- package/dist/browser/modules/formula/syntax/ast.d.ts +129 -0
- package/dist/browser/modules/formula/syntax/ast.js +28 -0
- package/dist/browser/modules/formula/syntax/parser.d.ts +18 -0
- package/dist/browser/modules/formula/syntax/parser.js +439 -0
- package/dist/browser/modules/formula/syntax/token-types.d.ts +153 -0
- package/dist/browser/modules/formula/syntax/token-types.js +59 -0
- package/dist/browser/modules/formula/syntax/tokenizer.d.ts +10 -0
- package/dist/browser/modules/formula/syntax/tokenizer.js +1074 -0
- package/dist/browser/modules/pdf/excel-bridge.js +9 -0
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/modules/excel/cell.js +170 -22
- package/dist/cjs/modules/excel/defined-names.js +411 -21
- package/dist/cjs/modules/excel/image.js +24 -1
- package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +14 -0
- package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +48 -1
- package/dist/cjs/modules/excel/stream/worksheet-reader.js +17 -1
- package/dist/cjs/modules/excel/stream/worksheet-writer.js +45 -5
- package/dist/cjs/modules/excel/table.js +15 -2
- package/dist/cjs/modules/excel/utils/col-cache.js +15 -0
- package/dist/cjs/modules/excel/utils/drawing-utils.js +4 -0
- package/dist/cjs/modules/excel/utils/external-link-formula.js +212 -0
- package/dist/cjs/modules/excel/utils/iterate-stream.js +3 -1
- package/dist/cjs/modules/excel/utils/ooxml-paths.js +42 -2
- package/dist/cjs/modules/excel/utils/shared-strings.js +21 -2
- package/dist/cjs/modules/excel/utils/workbook-protection.js +33 -0
- package/dist/cjs/modules/excel/workbook.browser.js +318 -34
- package/dist/cjs/modules/excel/worksheet.js +20 -1
- package/dist/cjs/modules/excel/xlsx/rel-type.js +16 -1
- package/dist/cjs/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
- package/dist/cjs/modules/excel/xlsx/xform/book/external-link-xform.js +333 -0
- package/dist/cjs/modules/excel/xlsx/xform/book/external-reference-xform.js +27 -0
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-protection-xform.js +69 -0
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
- package/dist/cjs/modules/excel/xlsx/xform/core/content-types-xform.js +18 -0
- package/dist/cjs/modules/excel/xlsx/xform/core/metadata-xform.js +161 -0
- package/dist/cjs/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +108 -0
- package/dist/cjs/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
- package/dist/cjs/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
- package/dist/cjs/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +83 -0
- package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
- package/dist/cjs/modules/excel/xlsx/xform/style/border-xform.js +4 -1
- package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +408 -18
- package/dist/cjs/modules/excel/xlsx/xlsx.js +4 -5
- package/dist/cjs/modules/formula/compile/address-utils.js +89 -0
- package/dist/cjs/modules/formula/compile/binder.js +489 -0
- package/dist/cjs/modules/formula/compile/bound-ast.js +68 -0
- package/dist/cjs/modules/formula/compile/compiled-formula.js +387 -0
- package/dist/cjs/modules/formula/compile/dependency-analysis.js +437 -0
- package/dist/cjs/modules/formula/compile/structured-ref-utils.js +141 -0
- package/dist/cjs/modules/formula/default-syntax-probe.js +87 -0
- package/dist/cjs/modules/formula/functions/_date-context.js +33 -0
- package/dist/cjs/modules/formula/functions/_shared.js +396 -0
- package/dist/cjs/modules/formula/functions/conditional.js +354 -0
- package/dist/cjs/modules/formula/functions/database.js +288 -0
- package/dist/cjs/modules/formula/functions/date.js +883 -0
- package/dist/cjs/modules/formula/functions/dynamic-array.js +881 -0
- package/dist/cjs/modules/formula/functions/engineering.js +1183 -0
- package/dist/cjs/modules/formula/functions/financial.js +2348 -0
- package/dist/cjs/modules/formula/functions/lookup.js +902 -0
- package/dist/cjs/modules/formula/functions/math.js +1487 -0
- package/dist/cjs/modules/formula/functions/statistical.js +3488 -0
- package/dist/cjs/modules/formula/functions/text.js +1889 -0
- package/dist/cjs/modules/formula/host-registry.js +75 -0
- package/dist/cjs/modules/formula/index.js +58 -0
- package/dist/cjs/modules/formula/install.js +93 -0
- package/dist/cjs/modules/formula/integration/apply-writeback-plan.js +213 -0
- package/dist/cjs/modules/formula/integration/calculate-formulas-impl.js +619 -0
- package/dist/cjs/modules/formula/integration/calculate-formulas.js +71 -0
- package/dist/cjs/modules/formula/integration/formula-instance.js +82 -0
- package/dist/cjs/modules/formula/integration/workbook-adapter.js +327 -0
- package/dist/cjs/modules/formula/integration/workbook-snapshot.js +84 -0
- package/dist/cjs/modules/formula/materialize/build-writeback-plan.js +475 -0
- package/dist/cjs/modules/formula/materialize/spill-engine.js +42 -0
- package/dist/cjs/modules/formula/materialize/types.js +32 -0
- package/dist/cjs/modules/formula/materialize/writeback-plan.js +28 -0
- package/dist/cjs/modules/formula/runtime/evaluator.js +2298 -0
- package/dist/cjs/modules/formula/runtime/function-registry.js +846 -0
- package/dist/cjs/modules/formula/runtime/values.js +385 -0
- package/dist/cjs/modules/formula/syntax/ast.js +8 -0
- package/dist/cjs/modules/formula/syntax/parser.js +440 -0
- package/dist/cjs/modules/formula/syntax/token-types.js +32 -0
- package/dist/cjs/modules/formula/syntax/tokenizer.js +1076 -0
- package/dist/cjs/modules/pdf/excel-bridge.js +9 -0
- package/dist/esm/index.browser.js +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/modules/excel/cell.js +170 -22
- package/dist/esm/modules/excel/defined-names.js +411 -21
- package/dist/esm/modules/excel/image.js +24 -1
- package/dist/esm/modules/excel/stream/workbook-reader.browser.js +14 -0
- package/dist/esm/modules/excel/stream/workbook-writer.browser.js +48 -1
- package/dist/esm/modules/excel/stream/worksheet-reader.js +17 -1
- package/dist/esm/modules/excel/stream/worksheet-writer.js +45 -5
- package/dist/esm/modules/excel/table.js +15 -2
- package/dist/esm/modules/excel/utils/col-cache.js +15 -0
- package/dist/esm/modules/excel/utils/drawing-utils.js +4 -0
- package/dist/esm/modules/excel/utils/external-link-formula.js +208 -0
- package/dist/esm/modules/excel/utils/iterate-stream.js +3 -1
- package/dist/esm/modules/excel/utils/ooxml-paths.js +37 -2
- package/dist/esm/modules/excel/utils/shared-strings.js +21 -2
- package/dist/esm/modules/excel/utils/workbook-protection.js +30 -0
- package/dist/esm/modules/excel/workbook.browser.js +318 -34
- package/dist/esm/modules/excel/worksheet.js +21 -2
- package/dist/esm/modules/excel/xlsx/rel-type.js +16 -1
- package/dist/esm/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
- package/dist/esm/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
- package/dist/esm/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
- package/dist/esm/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
- package/dist/esm/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
- package/dist/esm/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
- package/dist/esm/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
- package/dist/esm/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
- package/dist/esm/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
- package/dist/esm/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
- package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
- package/dist/esm/modules/excel/xlsx/xform/style/border-xform.js +4 -1
- package/dist/esm/modules/excel/xlsx/xlsx.browser.js +410 -20
- package/dist/esm/modules/excel/xlsx/xlsx.js +4 -5
- package/dist/esm/modules/formula/compile/address-utils.js +83 -0
- package/dist/esm/modules/formula/compile/binder.js +487 -0
- package/dist/esm/modules/formula/compile/bound-ast.js +80 -0
- package/dist/esm/modules/formula/compile/compiled-formula.js +383 -0
- package/dist/esm/modules/formula/compile/dependency-analysis.js +432 -0
- package/dist/esm/modules/formula/compile/structured-ref-utils.js +136 -0
- package/dist/esm/modules/formula/default-syntax-probe.js +83 -0
- package/dist/esm/modules/formula/functions/_date-context.js +29 -0
- package/dist/esm/modules/formula/functions/_shared.js +381 -0
- package/dist/esm/modules/formula/functions/conditional.js +343 -0
- package/dist/esm/modules/formula/functions/database.js +274 -0
- package/dist/esm/modules/formula/functions/date.js +855 -0
- package/dist/esm/modules/formula/functions/dynamic-array.js +860 -0
- package/dist/esm/modules/formula/functions/engineering.js +1128 -0
- package/dist/esm/modules/formula/functions/financial.js +2296 -0
- package/dist/esm/modules/formula/functions/lookup.js +886 -0
- package/dist/esm/modules/formula/functions/math.js +1406 -0
- package/dist/esm/modules/formula/functions/statistical.js +3390 -0
- package/dist/esm/modules/formula/functions/text.js +1845 -0
- package/dist/esm/modules/formula/host-registry.js +69 -0
- package/dist/esm/modules/formula/index.js +49 -0
- package/dist/esm/modules/formula/install.js +88 -0
- package/dist/esm/modules/formula/integration/apply-writeback-plan.js +210 -0
- package/dist/esm/modules/formula/integration/calculate-formulas-impl.js +616 -0
- package/dist/esm/modules/formula/integration/calculate-formulas.js +68 -0
- package/dist/esm/modules/formula/integration/formula-instance.js +79 -0
- package/dist/esm/modules/formula/integration/workbook-adapter.js +324 -0
- package/dist/esm/modules/formula/integration/workbook-snapshot.js +77 -0
- package/dist/esm/modules/formula/materialize/build-writeback-plan.js +473 -0
- package/dist/esm/modules/formula/materialize/spill-engine.js +38 -0
- package/dist/esm/modules/formula/materialize/types.js +29 -0
- package/dist/esm/modules/formula/materialize/writeback-plan.js +27 -0
- package/dist/esm/modules/formula/runtime/evaluator.js +2291 -0
- package/dist/esm/modules/formula/runtime/function-registry.js +840 -0
- package/dist/esm/modules/formula/runtime/values.js +385 -0
- package/dist/esm/modules/formula/syntax/ast.js +28 -0
- package/dist/esm/modules/formula/syntax/parser.js +439 -0
- package/dist/esm/modules/formula/syntax/token-types.js +59 -0
- package/dist/esm/modules/formula/syntax/tokenizer.js +1074 -0
- package/dist/esm/modules/pdf/excel-bridge.js +9 -0
- package/dist/iife/excelts.iife.js +2302 -373
- package/dist/iife/excelts.iife.js.map +1 -1
- package/dist/iife/excelts.iife.min.js +34 -34
- package/dist/types/index.browser.d.ts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/modules/excel/cell.d.ts +17 -3
- package/dist/types/modules/excel/defined-names.d.ts +96 -1
- package/dist/types/modules/excel/image.d.ts +11 -0
- package/dist/types/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
- package/dist/types/modules/excel/stream/workbook-reader.d.ts +2 -1
- package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
- package/dist/types/modules/excel/stream/workbook-writer.d.ts +3 -2
- package/dist/types/modules/excel/stream/worksheet-writer.d.ts +39 -6
- package/dist/types/modules/excel/types.d.ts +133 -2
- package/dist/types/modules/excel/utils/col-cache.d.ts +1 -0
- package/dist/types/modules/excel/utils/drawing-utils.d.ts +3 -3
- package/dist/types/modules/excel/utils/external-link-formula.d.ts +76 -0
- package/dist/types/modules/excel/utils/iterate-stream.d.ts +9 -3
- package/dist/types/modules/excel/utils/ooxml-paths.d.ts +19 -0
- package/dist/types/modules/excel/utils/shared-strings.d.ts +8 -3
- package/dist/types/modules/excel/utils/workbook-protection.d.ts +30 -0
- package/dist/types/modules/excel/workbook.browser.d.ts +257 -6
- package/dist/types/modules/excel/workbook.d.ts +1 -1
- package/dist/types/modules/excel/worksheet.d.ts +3 -1
- package/dist/types/modules/excel/xlsx/rel-type.d.ts +15 -0
- package/dist/types/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
- package/dist/types/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
- package/dist/types/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
- package/dist/types/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
- package/dist/types/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
- package/dist/types/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
- package/dist/types/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
- package/dist/types/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
- package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
- package/dist/types/modules/excel/xlsx/xlsx.d.ts +7 -4
- package/dist/types/modules/formula/compile/address-utils.d.ts +62 -0
- package/dist/types/modules/formula/compile/binder.d.ts +42 -0
- package/dist/types/modules/formula/compile/bound-ast.d.ts +230 -0
- package/dist/types/modules/formula/compile/compiled-formula.d.ts +137 -0
- package/dist/types/modules/formula/compile/dependency-analysis.d.ts +93 -0
- package/dist/types/modules/formula/compile/structured-ref-utils.d.ts +93 -0
- package/dist/types/modules/formula/default-syntax-probe.d.ts +79 -0
- package/dist/types/modules/formula/functions/_date-context.d.ts +4 -0
- package/dist/types/modules/formula/functions/_shared.d.ts +121 -0
- package/dist/types/modules/formula/functions/conditional.d.ts +27 -0
- package/dist/types/modules/formula/functions/database.d.ts +37 -0
- package/dist/types/modules/formula/functions/date.d.ts +61 -0
- package/dist/types/modules/formula/functions/dynamic-array.d.ts +23 -0
- package/dist/types/modules/formula/functions/engineering.d.ts +57 -0
- package/dist/types/modules/formula/functions/financial.d.ts +202 -0
- package/dist/types/modules/formula/functions/lookup.d.ts +18 -0
- package/dist/types/modules/formula/functions/math.d.ts +114 -0
- package/dist/types/modules/formula/functions/statistical.d.ts +193 -0
- package/dist/types/modules/formula/functions/text.d.ts +86 -0
- package/dist/types/modules/formula/host-registry.d.ts +53 -0
- package/dist/types/modules/formula/index.d.ts +39 -0
- package/dist/types/modules/formula/install.d.ts +62 -0
- package/dist/types/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
- package/dist/types/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
- package/dist/types/modules/formula/integration/calculate-formulas.d.ts +67 -0
- package/dist/types/modules/formula/integration/formula-instance.d.ts +64 -0
- package/dist/types/modules/formula/integration/workbook-adapter.d.ts +26 -0
- package/dist/types/modules/formula/integration/workbook-snapshot.d.ts +267 -0
- package/dist/types/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
- package/dist/types/modules/formula/materialize/spill-engine.d.ts +9 -0
- package/dist/types/modules/formula/materialize/types.d.ts +179 -0
- package/dist/types/modules/formula/materialize/writeback-plan.d.ts +167 -0
- package/dist/types/modules/formula/runtime/evaluator.d.ts +151 -0
- package/dist/types/modules/formula/runtime/function-registry.d.ts +47 -0
- package/dist/types/modules/formula/runtime/values.d.ts +211 -0
- package/dist/types/modules/formula/syntax/ast.d.ts +129 -0
- package/dist/types/modules/formula/syntax/parser.d.ts +18 -0
- package/dist/types/modules/formula/syntax/token-types.d.ts +153 -0
- package/dist/types/modules/formula/syntax/tokenizer.d.ts +10 -0
- package/package.json +28 -28
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiled Formula — The output of the full compilation pipeline.
|
|
3
|
+
*
|
|
4
|
+
* A `CompiledFormula` packages together:
|
|
5
|
+
* - The original `FormulaInstance` metadata
|
|
6
|
+
* - The bound expression tree (from the binder)
|
|
7
|
+
* - Static dependency information
|
|
8
|
+
* - Metadata flags (volatile, dynamic refs, etc.)
|
|
9
|
+
*
|
|
10
|
+
* ## Static Dependency Extraction
|
|
11
|
+
*
|
|
12
|
+
* Dependencies are extracted from the `BoundExpr` tree. Since names and
|
|
13
|
+
* structured refs are already resolved by the binder, the dependency
|
|
14
|
+
* extraction is a simple tree walk that collects `BoundCellRef` and
|
|
15
|
+
* `BoundAreaRef` nodes.
|
|
16
|
+
*
|
|
17
|
+
* Runtime-dependent references (INDIRECT, OFFSET) cannot be captured
|
|
18
|
+
* statically — the `hasDynamicRefs` flag marks formulas that may have
|
|
19
|
+
* additional runtime dependencies. Those functions re-parse their dynamic
|
|
20
|
+
* arguments at evaluation time using their own parser invocation (the raw
|
|
21
|
+
* AST is not retained on the CompiledFormula).
|
|
22
|
+
*/
|
|
23
|
+
import { NodeType } from "../syntax/ast.js";
|
|
24
|
+
import { stripFunctionPrefix } from "../syntax/token-types.js";
|
|
25
|
+
import { BoundExprKind } from "./bound-ast.js";
|
|
26
|
+
import { resolveStructuredRefRows, buildTableGeometry, resolveStructuredRefColumns } from "./structured-ref-utils.js";
|
|
27
|
+
/**
|
|
28
|
+
* Extract static dependencies from a bound expression tree.
|
|
29
|
+
*
|
|
30
|
+
* @param expr - The bound expression tree to analyze
|
|
31
|
+
* @param snapshot - Optional snapshot for resolving structured references
|
|
32
|
+
* @param nameResolver - Optional resolver for formula-based defined name dependencies
|
|
33
|
+
*/
|
|
34
|
+
export function extractStaticDeps(expr, snapshot, nameResolver) {
|
|
35
|
+
const cells = [];
|
|
36
|
+
const areas = [];
|
|
37
|
+
walkDeps(expr, cells, areas, snapshot?.tablesByName, nameResolver, new Set());
|
|
38
|
+
// Deduplicate — a formula like `=A1+A1+A1` would otherwise add three
|
|
39
|
+
// copies of A1 to the dep list, bloating both the dependency graph's
|
|
40
|
+
// intermediate storage and the `expandRefsToKeys` pass downstream. We
|
|
41
|
+
// use positional keys that mirror the Set<string> dedup logic that the
|
|
42
|
+
// graph builder already applies, so we can pay the cost here once
|
|
43
|
+
// instead of in every consumer. (R6 architectural note #5)
|
|
44
|
+
return { cells: dedupeCells(cells), areas: dedupeAreas(areas) };
|
|
45
|
+
}
|
|
46
|
+
function dedupeCells(cells) {
|
|
47
|
+
if (cells.length < 2) {
|
|
48
|
+
return cells;
|
|
49
|
+
}
|
|
50
|
+
const seen = new Set();
|
|
51
|
+
const out = [];
|
|
52
|
+
for (const c of cells) {
|
|
53
|
+
const key = `${c.sheet}\u0000${c.row}\u0001${c.col}`;
|
|
54
|
+
if (seen.has(key)) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
seen.add(key);
|
|
58
|
+
out.push(c);
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function dedupeAreas(areas) {
|
|
63
|
+
if (areas.length < 2) {
|
|
64
|
+
return areas;
|
|
65
|
+
}
|
|
66
|
+
const seen = new Set();
|
|
67
|
+
const out = [];
|
|
68
|
+
for (const a of areas) {
|
|
69
|
+
const key = `${a.sheet}\u0000${a.top}\u0001${a.left}\u0002${a.bottom}\u0003${a.right}`;
|
|
70
|
+
if (seen.has(key)) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
seen.add(key);
|
|
74
|
+
out.push(a);
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
function walkDeps(expr, cells, areas, tablesByName, nameResolver, visitedNames) {
|
|
79
|
+
switch (expr.kind) {
|
|
80
|
+
case BoundExprKind.CellRef:
|
|
81
|
+
cells.push({ sheet: expr.sheet, row: expr.row, col: expr.col });
|
|
82
|
+
break;
|
|
83
|
+
case BoundExprKind.AreaRef:
|
|
84
|
+
areas.push({
|
|
85
|
+
sheet: expr.sheet,
|
|
86
|
+
top: expr.top,
|
|
87
|
+
left: expr.left,
|
|
88
|
+
bottom: expr.bottom,
|
|
89
|
+
right: expr.right
|
|
90
|
+
});
|
|
91
|
+
break;
|
|
92
|
+
case BoundExprKind.ColRangeRef:
|
|
93
|
+
areas.push({
|
|
94
|
+
sheet: expr.sheet,
|
|
95
|
+
top: 1,
|
|
96
|
+
left: expr.leftCol,
|
|
97
|
+
bottom: 1048576,
|
|
98
|
+
right: expr.rightCol
|
|
99
|
+
});
|
|
100
|
+
break;
|
|
101
|
+
case BoundExprKind.RowRangeRef:
|
|
102
|
+
areas.push({
|
|
103
|
+
sheet: expr.sheet,
|
|
104
|
+
top: expr.topRow,
|
|
105
|
+
left: 1,
|
|
106
|
+
bottom: expr.bottomRow,
|
|
107
|
+
right: 16384
|
|
108
|
+
});
|
|
109
|
+
break;
|
|
110
|
+
case BoundExprKind.Ref3D:
|
|
111
|
+
for (const sheet of expr.sheets) {
|
|
112
|
+
if (expr.inner.kind === BoundExprKind.CellRef) {
|
|
113
|
+
cells.push({ sheet, row: expr.inner.row, col: expr.inner.col });
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
areas.push({
|
|
117
|
+
sheet,
|
|
118
|
+
top: expr.inner.top,
|
|
119
|
+
left: expr.inner.left,
|
|
120
|
+
bottom: expr.inner.bottom,
|
|
121
|
+
right: expr.inner.right
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
break;
|
|
126
|
+
case BoundExprKind.BinaryOp:
|
|
127
|
+
walkDeps(expr.left, cells, areas, tablesByName, nameResolver, visitedNames);
|
|
128
|
+
walkDeps(expr.right, cells, areas, tablesByName, nameResolver, visitedNames);
|
|
129
|
+
break;
|
|
130
|
+
case BoundExprKind.UnaryOp:
|
|
131
|
+
walkDeps(expr.operand, cells, areas, tablesByName, nameResolver, visitedNames);
|
|
132
|
+
break;
|
|
133
|
+
case BoundExprKind.Percent:
|
|
134
|
+
walkDeps(expr.operand, cells, areas, tablesByName, nameResolver, visitedNames);
|
|
135
|
+
break;
|
|
136
|
+
case BoundExprKind.Call:
|
|
137
|
+
for (const arg of expr.args) {
|
|
138
|
+
walkDeps(arg, cells, areas, tablesByName, nameResolver, visitedNames);
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
case BoundExprKind.SpecialCall:
|
|
142
|
+
for (const arg of expr.args) {
|
|
143
|
+
walkDeps(arg, cells, areas, tablesByName, nameResolver, visitedNames);
|
|
144
|
+
}
|
|
145
|
+
break;
|
|
146
|
+
case BoundExprKind.Array:
|
|
147
|
+
for (const row of expr.rows) {
|
|
148
|
+
for (const elem of row) {
|
|
149
|
+
walkDeps(elem, cells, areas, tablesByName, nameResolver, visitedNames);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
case BoundExprKind.Lambda:
|
|
154
|
+
walkDeps(expr.body, cells, areas, tablesByName, nameResolver, visitedNames);
|
|
155
|
+
break;
|
|
156
|
+
case BoundExprKind.StructuredRef:
|
|
157
|
+
// Try to resolve structured reference to static deps using the table index.
|
|
158
|
+
// Only possible when we have the table name and the table exists in the snapshot.
|
|
159
|
+
if (tablesByName && expr.tableName) {
|
|
160
|
+
const resolved = tablesByName.get(expr.tableName.toLowerCase());
|
|
161
|
+
if (resolved) {
|
|
162
|
+
const t = resolved.table;
|
|
163
|
+
const geo = buildTableGeometry(t);
|
|
164
|
+
// Permissive column resolution — static-deps is conservative, so
|
|
165
|
+
// unknown column names fall back to the full table width rather
|
|
166
|
+
// than being treated as errors.
|
|
167
|
+
const colRange = resolveStructuredRefColumns(expr.columns, t, "permissive");
|
|
168
|
+
if (colRange === "error") {
|
|
169
|
+
// Not reachable in permissive mode, but guard for exhaustiveness.
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
// #This Row can't be resolved statically; we still record the data
|
|
173
|
+
// range as a conservative dependency bound.
|
|
174
|
+
const rowRange = resolveStructuredRefRows(expr.specials, geo);
|
|
175
|
+
let rowTop = geo.dataRowStart;
|
|
176
|
+
let rowBottom = geo.dataRowEnd;
|
|
177
|
+
if (rowRange !== "thisRow" && rowRange !== "error") {
|
|
178
|
+
rowTop = rowRange.rowTop;
|
|
179
|
+
rowBottom = rowRange.rowBottom;
|
|
180
|
+
}
|
|
181
|
+
areas.push({
|
|
182
|
+
sheet: resolved.sheetName,
|
|
183
|
+
top: rowTop,
|
|
184
|
+
left: colRange.colLeft,
|
|
185
|
+
bottom: rowBottom,
|
|
186
|
+
right: colRange.colRight
|
|
187
|
+
});
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Cannot resolve — no static deps (will be handled at runtime)
|
|
192
|
+
break;
|
|
193
|
+
case BoundExprKind.Literal:
|
|
194
|
+
// No static dependencies
|
|
195
|
+
break;
|
|
196
|
+
case BoundExprKind.NameExpr:
|
|
197
|
+
// Try to resolve the defined name and extract its dependencies.
|
|
198
|
+
// Guard against infinite recursion with visitedNames.
|
|
199
|
+
if (nameResolver && visitedNames && !visitedNames.has(expr.upperName)) {
|
|
200
|
+
visitedNames.add(expr.upperName);
|
|
201
|
+
const resolved = nameResolver(expr.upperName);
|
|
202
|
+
if (resolved) {
|
|
203
|
+
for (const c of resolved.deps.cells) {
|
|
204
|
+
cells.push(c);
|
|
205
|
+
}
|
|
206
|
+
for (const a of resolved.deps.areas) {
|
|
207
|
+
areas.push(a);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// ============================================================================
|
|
215
|
+
// Volatility / Dynamic Ref / Dynamic Array Detection
|
|
216
|
+
// ============================================================================
|
|
217
|
+
// Excel's volatile-function list: any formula containing one of these
|
|
218
|
+
// must be re-evaluated on every calc pass, because the result can change
|
|
219
|
+
// without any explicit input change. INDIRECT / OFFSET are additionally
|
|
220
|
+
// flagged as "dynamic ref" (their dependency set isn't known at compile
|
|
221
|
+
// time), but they're also volatile in the usual sense — the target
|
|
222
|
+
// cell's value may change even when the INDIRECT string itself is
|
|
223
|
+
// constant. INFO and CELL with the "row"/"col" info-type also qualify
|
|
224
|
+
// but those require per-invocation arg inspection; the coarse opt-in
|
|
225
|
+
// below is intentionally conservative.
|
|
226
|
+
const VOLATILE_FUNCTIONS = new Set([
|
|
227
|
+
"RAND",
|
|
228
|
+
"RANDBETWEEN",
|
|
229
|
+
"RANDARRAY",
|
|
230
|
+
"NOW",
|
|
231
|
+
"TODAY",
|
|
232
|
+
"INDIRECT",
|
|
233
|
+
"OFFSET",
|
|
234
|
+
"INFO",
|
|
235
|
+
"CELL"
|
|
236
|
+
]);
|
|
237
|
+
const DYNAMIC_REF_FUNCTIONS = new Set(["INDIRECT", "OFFSET"]);
|
|
238
|
+
/**
|
|
239
|
+
* Function names that naturally produce arrays and should trigger spill
|
|
240
|
+
* behavior even when `isDynamicArray` is not explicitly set in the XLSX model.
|
|
241
|
+
*/
|
|
242
|
+
const DYNAMIC_ARRAY_FUNCTION_NAMES = new Set([
|
|
243
|
+
"FILTER",
|
|
244
|
+
"SORT",
|
|
245
|
+
"UNIQUE",
|
|
246
|
+
"SORTBY",
|
|
247
|
+
"SEQUENCE",
|
|
248
|
+
"RANDARRAY",
|
|
249
|
+
"TOCOL",
|
|
250
|
+
"TOROW",
|
|
251
|
+
"CHOOSEROWS",
|
|
252
|
+
"CHOOSECOLS",
|
|
253
|
+
"VSTACK",
|
|
254
|
+
"HSTACK",
|
|
255
|
+
"WRAPROWS",
|
|
256
|
+
"WRAPCOLS",
|
|
257
|
+
"EXPAND",
|
|
258
|
+
"TAKE",
|
|
259
|
+
"DROP"
|
|
260
|
+
]);
|
|
261
|
+
/**
|
|
262
|
+
* Check if the formula's top-level expression is a known dynamic array
|
|
263
|
+
* function. Checks both the raw AST (for prefixed names like `_XLFN.FILTER`)
|
|
264
|
+
* and the bound expression (for the canonical uppercase name).
|
|
265
|
+
*/
|
|
266
|
+
export function detectDynamicArrayFunction(ast, bound) {
|
|
267
|
+
// Check AST level (handles _XLFN. prefixed names)
|
|
268
|
+
if (ast.type === NodeType.FunctionCall) {
|
|
269
|
+
const upper = ast.name.toUpperCase();
|
|
270
|
+
if (DYNAMIC_ARRAY_FUNCTION_NAMES.has(upper)) {
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
const canonical = stripFunctionPrefix(upper);
|
|
274
|
+
if (DYNAMIC_ARRAY_FUNCTION_NAMES.has(canonical)) {
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Check bound expression level
|
|
279
|
+
if (bound.kind === BoundExprKind.Call && DYNAMIC_ARRAY_FUNCTION_NAMES.has(bound.name)) {
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Check if the formula's top-level expression is SUBTOTAL or AGGREGATE.
|
|
286
|
+
*
|
|
287
|
+
* Excel's SUBTOTAL/AGGREGATE functions deliberately skip any cell whose
|
|
288
|
+
* own source formula is itself a SUBTOTAL or AGGREGATE call — this is
|
|
289
|
+
* what makes the classic "totals row inside a filtered range" case not
|
|
290
|
+
* double-count. `buildRangeArray` reads this flag off the compiled
|
|
291
|
+
* formula to decide whether to set `subtotalMask[r][c]`.
|
|
292
|
+
*/
|
|
293
|
+
export function detectSubtotalOutput(ast, bound) {
|
|
294
|
+
if (ast.type === NodeType.FunctionCall) {
|
|
295
|
+
const upper = ast.name.toUpperCase();
|
|
296
|
+
const canonical = stripFunctionPrefix(upper);
|
|
297
|
+
if (canonical === "SUBTOTAL" || canonical === "AGGREGATE") {
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (bound.kind === BoundExprKind.Call &&
|
|
302
|
+
(bound.name === "SUBTOTAL" || bound.name === "AGGREGATE")) {
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Analyze a bound expression for volatile functions and dynamic references.
|
|
309
|
+
*
|
|
310
|
+
* @param nameResolver - Optional; if a NameExpr resolves to a formula-based
|
|
311
|
+
* defined name containing INDIRECT/OFFSET, the outer formula inherits
|
|
312
|
+
* `hasDynamicRefs = true`.
|
|
313
|
+
*/
|
|
314
|
+
export function analyzeExpr(expr, nameResolver) {
|
|
315
|
+
let isVolatile = false;
|
|
316
|
+
let hasDynamicRefs = false;
|
|
317
|
+
let containsLambda = false;
|
|
318
|
+
walkAnalyze(expr);
|
|
319
|
+
return { isVolatile, hasDynamicRefs, containsLambda };
|
|
320
|
+
function walkAnalyze(e) {
|
|
321
|
+
switch (e.kind) {
|
|
322
|
+
case BoundExprKind.Call:
|
|
323
|
+
if (VOLATILE_FUNCTIONS.has(e.name)) {
|
|
324
|
+
isVolatile = true;
|
|
325
|
+
}
|
|
326
|
+
for (const arg of e.args) {
|
|
327
|
+
walkAnalyze(arg);
|
|
328
|
+
}
|
|
329
|
+
break;
|
|
330
|
+
case BoundExprKind.SpecialCall:
|
|
331
|
+
if (DYNAMIC_REF_FUNCTIONS.has(e.name)) {
|
|
332
|
+
hasDynamicRefs = true;
|
|
333
|
+
}
|
|
334
|
+
if (VOLATILE_FUNCTIONS.has(e.name)) {
|
|
335
|
+
isVolatile = true;
|
|
336
|
+
}
|
|
337
|
+
for (const arg of e.args) {
|
|
338
|
+
walkAnalyze(arg);
|
|
339
|
+
}
|
|
340
|
+
break;
|
|
341
|
+
case BoundExprKind.Lambda:
|
|
342
|
+
containsLambda = true;
|
|
343
|
+
walkAnalyze(e.body);
|
|
344
|
+
break;
|
|
345
|
+
case BoundExprKind.NameExpr:
|
|
346
|
+
// If the name resolves to a formula that contains dynamic refs
|
|
347
|
+
// or volatile functions, the outer formula inherits both flags.
|
|
348
|
+
// Forgetting to propagate `isVolatile` meant that a defined name
|
|
349
|
+
// pointing at `NOW()` stayed cached between calculations — the
|
|
350
|
+
// bug drove R5-P0-5.
|
|
351
|
+
if (nameResolver) {
|
|
352
|
+
const resolved = nameResolver(e.upperName);
|
|
353
|
+
if (resolved?.hasDynamicRefs) {
|
|
354
|
+
hasDynamicRefs = true;
|
|
355
|
+
}
|
|
356
|
+
if (resolved?.isVolatile) {
|
|
357
|
+
isVolatile = true;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
break;
|
|
361
|
+
case BoundExprKind.BinaryOp:
|
|
362
|
+
walkAnalyze(e.left);
|
|
363
|
+
walkAnalyze(e.right);
|
|
364
|
+
break;
|
|
365
|
+
case BoundExprKind.UnaryOp:
|
|
366
|
+
walkAnalyze(e.operand);
|
|
367
|
+
break;
|
|
368
|
+
case BoundExprKind.Percent:
|
|
369
|
+
walkAnalyze(e.operand);
|
|
370
|
+
break;
|
|
371
|
+
case BoundExprKind.Array:
|
|
372
|
+
for (const row of e.rows) {
|
|
373
|
+
for (const elem of row) {
|
|
374
|
+
walkAnalyze(elem);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
break;
|
|
378
|
+
default:
|
|
379
|
+
// Literal, CellRef, AreaRef, etc. — no children to analyze
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Graph for Formula Calculation
|
|
3
|
+
*
|
|
4
|
+
* Builds a dependency graph from compiled formulas' static dependencies,
|
|
5
|
+
* then produces a topological evaluation order with circular reference
|
|
6
|
+
* detection.
|
|
7
|
+
*
|
|
8
|
+
* Key exports:
|
|
9
|
+
* - `buildDependencyGraphFromDeps()` — build graph from CompiledFormula static deps
|
|
10
|
+
* - `topologicalSort()` — produce evaluation order, detecting circular refs
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* The dependency graph structure.
|
|
14
|
+
*
|
|
15
|
+
* - `dependsOn`: formula cell key → set of cell keys it reads from
|
|
16
|
+
* - `dependedBy`: cell key → set of formula cell keys that read from it
|
|
17
|
+
* - `formulaKeys`: ordered list of all formula cell keys
|
|
18
|
+
* - `circularKeys`: set of formula cell keys involved in circular references
|
|
19
|
+
*/
|
|
20
|
+
export interface DependencyGraph {
|
|
21
|
+
/** Forward edges: formula → cells it depends on */
|
|
22
|
+
readonly dependsOn: ReadonlyMap<string, ReadonlySet<string>>;
|
|
23
|
+
/** Reverse edges: cell → formulas that depend on it */
|
|
24
|
+
readonly dependedBy: ReadonlyMap<string, ReadonlySet<string>>;
|
|
25
|
+
/** All formula cell keys in insertion order */
|
|
26
|
+
readonly formulaKeys: readonly string[];
|
|
27
|
+
/** Formula cell keys that are part of a circular reference cycle */
|
|
28
|
+
readonly circularKeys: ReadonlySet<string>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Build a dependency graph from compiled formulas' static dependencies.
|
|
32
|
+
*
|
|
33
|
+
* Operates on the already-resolved `StaticDependencySet` from each compiled
|
|
34
|
+
* formula. Since names and structured references are already resolved by
|
|
35
|
+
* the binder, the dependency edges are complete.
|
|
36
|
+
*
|
|
37
|
+
* @param compiled - Map from formula cell key to compiled formula with static deps
|
|
38
|
+
* @param producerMap - Optional map from cell key → formula key that produces
|
|
39
|
+
* that cell's value (via CSE distribution or dynamic-array spill). Allows
|
|
40
|
+
* dependency edges to be added to the producer even when the target cell
|
|
41
|
+
* isn't itself a formula.
|
|
42
|
+
* @returns The complete dependency graph
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildDependencyGraphFromDeps(compiled: ReadonlyMap<string, {
|
|
45
|
+
instance: {
|
|
46
|
+
sheetName: string;
|
|
47
|
+
row: number;
|
|
48
|
+
col: number;
|
|
49
|
+
isDynamicArray?: boolean;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Whether this formula's top-level function is a known dynamic-
|
|
53
|
+
* array producer (SEQUENCE / FILTER / SORT / …). Used to collapse
|
|
54
|
+
* downstream `A1:A5`-style range dependencies into a single edge
|
|
55
|
+
* on the master so dependency ordering stays correct on the first
|
|
56
|
+
* calc pass (before ghost cells exist in the snapshot).
|
|
57
|
+
*/
|
|
58
|
+
isDynamicArrayFunction?: boolean;
|
|
59
|
+
staticDeps: {
|
|
60
|
+
cells: readonly {
|
|
61
|
+
sheet: string;
|
|
62
|
+
row: number;
|
|
63
|
+
col: number;
|
|
64
|
+
}[];
|
|
65
|
+
areas: readonly {
|
|
66
|
+
sheet: string;
|
|
67
|
+
top: number;
|
|
68
|
+
left: number;
|
|
69
|
+
bottom: number;
|
|
70
|
+
right: number;
|
|
71
|
+
}[];
|
|
72
|
+
};
|
|
73
|
+
}>, producerMap?: ReadonlyMap<string, string>): DependencyGraph;
|
|
74
|
+
/**
|
|
75
|
+
* Merge runtime-discovered dynamic dependencies into a dependency graph.
|
|
76
|
+
*
|
|
77
|
+
* After evaluating formulas that contain INDIRECT/OFFSET, the runtime
|
|
78
|
+
* dependency recorder has collected the actual cell accesses. This function
|
|
79
|
+
* incorporates those dynamic edges into the graph and re-detects cycles.
|
|
80
|
+
*
|
|
81
|
+
* Returns a new graph if edges were added, or the original graph if no
|
|
82
|
+
* dynamic deps were recorded.
|
|
83
|
+
*/
|
|
84
|
+
export declare function mergeDynamicDeps(graph: DependencyGraph, dynamicDeps: ReadonlyMap<string, ReadonlySet<string>>): {
|
|
85
|
+
graph: DependencyGraph;
|
|
86
|
+
changed: boolean;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Produce a topological evaluation order for formula cells using Kahn's algorithm.
|
|
90
|
+
* Cells with no dependencies are evaluated first. Circular references are
|
|
91
|
+
* appended at the end in their original order.
|
|
92
|
+
*/
|
|
93
|
+
export declare function topologicalSort(graph: DependencyGraph): string[];
|