@dxos/plugin-sheet 0.6.13 → 0.6.14-main.1366248
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/SheetContainer-JZEKRM4Z.mjs +297 -0
- package/dist/lib/browser/SheetContainer-JZEKRM4Z.mjs.map +7 -0
- package/dist/lib/browser/chunk-BVUN7SHF.mjs +67 -0
- package/dist/lib/browser/chunk-BVUN7SHF.mjs.map +7 -0
- package/dist/lib/browser/chunk-G2FUL6PK.mjs +1671 -0
- package/dist/lib/browser/chunk-G2FUL6PK.mjs.map +7 -0
- package/dist/lib/browser/chunk-RABELMEQ.mjs +15 -0
- package/dist/lib/browser/chunk-RABELMEQ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-D5AGLXJP.mjs → chunk-VMSX6Z4X.mjs} +659 -675
- package/dist/lib/browser/chunk-VMSX6Z4X.mjs.map +7 -0
- package/dist/lib/browser/compute-graph-GGWUX644.mjs +35 -0
- package/dist/lib/browser/compute-graph-GGWUX644.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +168 -67
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/meta.mjs +1 -1
- package/dist/lib/browser/types.mjs +6 -12
- package/dist/lib/node/SheetContainer-PJE74VO4.cjs +300 -0
- package/dist/lib/node/SheetContainer-PJE74VO4.cjs.map +7 -0
- package/dist/lib/node/chunk-2ZVZI2KJ.cjs +38 -0
- package/dist/lib/node/chunk-2ZVZI2KJ.cjs.map +7 -0
- package/dist/lib/node/{chunk-DSYKOI4E.cjs → chunk-AWKOWDMI.cjs} +34 -52
- package/dist/lib/node/chunk-AWKOWDMI.cjs.map +7 -0
- package/dist/lib/node/{chunk-5KKJ4NPP.cjs → chunk-O7XR4R7Y.cjs} +678 -674
- package/dist/lib/node/chunk-O7XR4R7Y.cjs.map +7 -0
- package/dist/lib/node/chunk-STZ7S7RF.cjs +1656 -0
- package/dist/lib/node/chunk-STZ7S7RF.cjs.map +7 -0
- package/dist/lib/node/compute-graph-KGWA2QLE.cjs +57 -0
- package/dist/lib/node/compute-graph-KGWA2QLE.cjs.map +7 -0
- package/dist/lib/node/index.cjs +178 -75
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.cjs +3 -3
- package/dist/lib/node/meta.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types.cjs +9 -15
- package/dist/lib/node/types.cjs.map +2 -2
- package/dist/lib/node-esm/SheetContainer-R73XEXHU.mjs +298 -0
- package/dist/lib/node-esm/SheetContainer-R73XEXHU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-BM2Q3FFC.mjs +17 -0
- package/dist/lib/node-esm/chunk-BM2Q3FFC.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-CR4K75EL.mjs +3220 -0
- package/dist/lib/node-esm/chunk-CR4K75EL.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-UIBWRHW7.mjs +68 -0
- package/dist/lib/node-esm/chunk-UIBWRHW7.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-V5N3Y2O5.mjs +1672 -0
- package/dist/lib/node-esm/chunk-V5N3Y2O5.mjs.map +7 -0
- package/dist/lib/node-esm/compute-graph-2SCZT7N5.mjs +36 -0
- package/dist/lib/node-esm/compute-graph-2SCZT7N5.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +350 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/meta.mjs +10 -0
- package/dist/lib/node-esm/meta.mjs.map +7 -0
- package/dist/lib/node-esm/types.mjs +17 -0
- package/dist/lib/node-esm/types.mjs.map +7 -0
- package/dist/types/src/SheetPlugin.d.ts.map +1 -1
- package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +13 -0
- package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -0
- package/dist/types/src/components/ComputeGraph/index.d.ts +1 -3
- package/dist/types/src/components/ComputeGraph/index.d.ts.map +1 -1
- package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts +3 -0
- package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts.map +1 -0
- package/dist/types/src/components/FunctionEditor/index.d.ts +2 -0
- package/dist/types/src/components/FunctionEditor/index.d.ts.map +1 -0
- package/dist/types/src/components/GridSheet/GridSheet.d.ts +3 -0
- package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -0
- package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +6 -0
- package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -0
- package/dist/types/src/components/{CellEditor/CellEditor.stories.d.ts → GridSheet/SheetCellEditor.stories.d.ts} +5 -9
- package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +1 -0
- package/dist/types/src/components/GridSheet/index.d.ts +2 -0
- package/dist/types/src/components/GridSheet/index.d.ts.map +1 -0
- package/dist/types/src/components/GridSheet/util.d.ts +15 -0
- package/dist/types/src/components/GridSheet/util.d.ts.map +1 -0
- package/dist/types/src/components/RangeList/RangeList.d.ts +7 -0
- package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -0
- package/dist/types/src/components/RangeList/index.d.ts +2 -0
- package/dist/types/src/components/RangeList/index.d.ts.map +1 -0
- package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +9 -0
- package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -0
- package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +6 -0
- package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -0
- package/dist/types/src/components/SheetContainer/index.d.ts +3 -0
- package/dist/types/src/components/SheetContainer/index.d.ts.map +1 -0
- package/dist/types/src/components/SheetContext/SheetContext.d.ts +28 -0
- package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -0
- package/dist/types/src/components/SheetContext/index.d.ts +2 -0
- package/dist/types/src/components/SheetContext/index.d.ts.map +1 -0
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +36 -9
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +4 -32
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +7 -4
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/compute-graph/compute-graph-registry.d.ts +34 -0
- package/dist/types/src/compute-graph/compute-graph-registry.d.ts.map +1 -0
- package/dist/types/src/compute-graph/compute-graph.d.ts +64 -0
- package/dist/types/src/compute-graph/compute-graph.d.ts.map +1 -0
- package/dist/types/src/compute-graph/compute-graph.stories.d.ts +6 -0
- package/dist/types/src/compute-graph/compute-graph.stories.d.ts.map +1 -0
- package/dist/types/src/compute-graph/compute-graph.test.d.ts +2 -0
- package/dist/types/src/compute-graph/compute-graph.test.d.ts.map +1 -0
- package/dist/types/src/compute-graph/compute-node.d.ts +26 -0
- package/dist/types/src/compute-graph/compute-node.d.ts.map +1 -0
- package/dist/types/src/{components/ComputeGraph → compute-graph/functions}/async-function.d.ts +14 -5
- package/dist/types/src/compute-graph/functions/async-function.d.ts.map +1 -0
- package/dist/types/src/compute-graph/functions/edge-function.d.ts +21 -0
- package/dist/types/src/compute-graph/functions/edge-function.d.ts.map +1 -0
- package/dist/types/src/{model/functions.d.ts → compute-graph/functions/function-defs.d.ts} +1 -1
- package/dist/types/src/compute-graph/functions/function-defs.d.ts.map +1 -0
- package/dist/types/src/compute-graph/functions/index.d.ts +4 -0
- package/dist/types/src/compute-graph/functions/index.d.ts.map +1 -0
- package/dist/types/src/compute-graph/hyperformula.test.d.ts +2 -0
- package/dist/types/src/compute-graph/hyperformula.test.d.ts.map +1 -0
- package/dist/types/src/compute-graph/index.d.ts +5 -0
- package/dist/types/src/compute-graph/index.d.ts.map +1 -0
- package/dist/types/src/compute-graph/testing/index.d.ts +3 -0
- package/dist/types/src/compute-graph/testing/index.d.ts.map +1 -0
- package/dist/types/src/compute-graph/testing/test-builder.d.ts +15 -0
- package/dist/types/src/compute-graph/testing/test-builder.d.ts.map +1 -0
- package/dist/types/src/compute-graph/testing/test-plugin.d.ts +36 -0
- package/dist/types/src/compute-graph/testing/test-plugin.d.ts.map +1 -0
- package/dist/types/src/compute-graph/util.d.ts +2 -0
- package/dist/types/src/compute-graph/util.d.ts.map +1 -0
- package/dist/types/src/defs/index.d.ts +4 -0
- package/dist/types/src/defs/index.d.ts.map +1 -0
- package/dist/types/src/defs/sheet-range-types.d.ts +13 -0
- package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -0
- package/dist/types/src/defs/types.d.ts +28 -0
- package/dist/types/src/defs/types.d.ts.map +1 -0
- package/dist/types/src/defs/types.test.d.ts.map +1 -0
- package/dist/types/src/defs/util.d.ts +39 -0
- package/dist/types/src/defs/util.d.ts.map +1 -0
- package/dist/types/src/extensions/compute.d.ts +6 -0
- package/dist/types/src/extensions/compute.d.ts.map +1 -0
- package/dist/types/src/extensions/compute.stories.d.ts +21 -0
- package/dist/types/src/extensions/compute.stories.d.ts.map +1 -0
- package/dist/types/src/extensions/editor/extension.d.ts +39 -0
- package/dist/types/src/extensions/editor/extension.d.ts.map +1 -0
- package/dist/types/src/extensions/editor/extension.test.d.ts.map +1 -0
- package/dist/types/src/extensions/editor/index.d.ts +2 -0
- package/dist/types/src/extensions/editor/index.d.ts.map +1 -0
- package/dist/types/src/extensions/index.d.ts +3 -0
- package/dist/types/src/extensions/index.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/integrations/index.d.ts +2 -0
- package/dist/types/src/integrations/index.d.ts.map +1 -0
- package/dist/types/src/integrations/thread-ranges.d.ts +7 -0
- package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +4 -9
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/model/index.d.ts +2 -3
- package/dist/types/src/model/index.d.ts.map +1 -1
- package/dist/types/src/model/{model.d.ts → sheet-model.d.ts} +22 -69
- package/dist/types/src/model/sheet-model.d.ts.map +1 -0
- package/dist/types/src/model/sheet-model.test.d.ts +2 -0
- package/dist/types/src/model/sheet-model.test.d.ts.map +1 -0
- package/dist/types/src/model/useSheetModel.d.ts +8 -0
- package/dist/types/src/model/useSheetModel.d.ts.map +1 -0
- package/dist/types/src/sanity.test.d.ts +2 -0
- package/dist/types/src/sanity.test.d.ts.map +1 -0
- package/dist/types/src/serializer.d.ts +4 -0
- package/dist/types/src/serializer.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/testing.d.ts +8 -0
- package/dist/types/src/testing/testing.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +32 -12
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +132 -43
- package/dist/types/src/types.d.ts.map +1 -1
- package/dist/vendor/hyperformula.mjs +37145 -0
- package/package.json +60 -61
- package/src/SheetPlugin.tsx +89 -78
- package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +37 -0
- package/src/components/ComputeGraph/index.ts +1 -3
- package/src/components/FunctionEditor/FunctionEditor.tsx +45 -0
- package/src/components/FunctionEditor/index.ts +5 -0
- package/src/components/GridSheet/GridSheet.stories.tsx +46 -0
- package/src/components/GridSheet/GridSheet.tsx +358 -0
- package/src/components/{CellEditor/CellEditor.stories.tsx → GridSheet/SheetCellEditor.stories.tsx} +18 -15
- package/src/components/GridSheet/index.ts +5 -0
- package/src/components/GridSheet/util.ts +170 -0
- package/src/components/RangeList/RangeList.tsx +53 -0
- package/src/components/RangeList/index.ts +5 -0
- package/src/components/SheetContainer/SheetContainer.stories.tsx +45 -0
- package/src/components/SheetContainer/SheetContainer.tsx +33 -0
- package/src/components/SheetContainer/index.ts +7 -0
- package/src/components/SheetContext/SheetContext.tsx +127 -0
- package/src/components/SheetContext/index.ts +5 -0
- package/src/components/Toolbar/Toolbar.stories.tsx +9 -6
- package/src/components/Toolbar/Toolbar.tsx +265 -111
- package/src/components/index.ts +5 -3
- package/src/compute-graph/compute-graph-registry.ts +90 -0
- package/src/compute-graph/compute-graph.stories.tsx +97 -0
- package/src/compute-graph/compute-graph.test.ts +87 -0
- package/src/compute-graph/compute-graph.ts +260 -0
- package/src/compute-graph/compute-node.ts +62 -0
- package/src/{components/ComputeGraph → compute-graph/functions}/async-function.ts +26 -15
- package/src/{components/ComputeGraph → compute-graph/functions}/edge-function.ts +21 -17
- package/src/compute-graph/functions/index.ts +7 -0
- package/src/compute-graph/hyperformula.test.ts +14 -0
- package/src/compute-graph/index.ts +8 -0
- package/src/compute-graph/testing/index.ts +6 -0
- package/src/compute-graph/testing/test-builder.ts +54 -0
- package/src/{components/ComputeGraph/custom.ts → compute-graph/testing/test-plugin.ts} +44 -14
- package/src/compute-graph/util.ts +8 -0
- package/src/defs/index.ts +7 -0
- package/src/defs/sheet-range-types.ts +49 -0
- package/src/{model → defs}/types.test.ts +8 -9
- package/src/defs/types.ts +86 -0
- package/src/defs/util.ts +136 -0
- package/src/extensions/compute.stories.tsx +155 -0
- package/src/extensions/compute.ts +147 -0
- package/src/{components/CellEditor → extensions/editor}/extension.test.ts +4 -6
- package/src/{components/CellEditor → extensions/editor}/extension.ts +51 -27
- package/src/{components/CellEditor → extensions/editor}/index.ts +0 -1
- package/src/extensions/index.ts +6 -0
- package/src/index.ts +2 -2
- package/src/integrations/index.ts +5 -0
- package/src/integrations/thread-ranges.ts +101 -0
- package/src/meta.ts +15 -0
- package/src/model/index.ts +2 -3
- package/src/model/sheet-model.test.ts +59 -0
- package/src/model/sheet-model.ts +495 -0
- package/src/model/useSheetModel.ts +40 -0
- package/src/sanity.test.ts +40 -0
- package/src/serializer.ts +27 -0
- package/src/{components/Sheet → testing}/index.ts +1 -1
- package/src/testing/testing.tsx +68 -0
- package/src/translations.ts +24 -4
- package/src/types.ts +62 -47
- package/dist/lib/browser/SheetContainer-U4H5D34A.mjs +0 -1772
- package/dist/lib/browser/SheetContainer-U4H5D34A.mjs.map +0 -7
- package/dist/lib/browser/chunk-APHOLYUB.mjs +0 -175
- package/dist/lib/browser/chunk-APHOLYUB.mjs.map +0 -7
- package/dist/lib/browser/chunk-D5AGLXJP.mjs.map +0 -7
- package/dist/lib/browser/chunk-FUAGSXA4.mjs +0 -82
- package/dist/lib/browser/chunk-FUAGSXA4.mjs.map +0 -7
- package/dist/lib/browser/chunk-JRL5LGCE.mjs +0 -18
- package/dist/lib/browser/chunk-JRL5LGCE.mjs.map +0 -7
- package/dist/lib/browser/chunk-NU4PBN33.mjs +0 -8
- package/dist/lib/browser/chunk-NU4PBN33.mjs.map +0 -7
- package/dist/lib/browser/testing.mjs +0 -92
- package/dist/lib/browser/testing.mjs.map +0 -7
- package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs +0 -1765
- package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs.map +0 -7
- package/dist/lib/node/chunk-5KKJ4NPP.cjs.map +0 -7
- package/dist/lib/node/chunk-BJ6ZD7MN.cjs +0 -51
- package/dist/lib/node/chunk-BJ6ZD7MN.cjs.map +0 -7
- package/dist/lib/node/chunk-CN3RPESU.cjs +0 -202
- package/dist/lib/node/chunk-CN3RPESU.cjs.map +0 -7
- package/dist/lib/node/chunk-DSYKOI4E.cjs.map +0 -7
- package/dist/lib/node/chunk-PYXHNAAK.cjs +0 -40
- package/dist/lib/node/chunk-PYXHNAAK.cjs.map +0 -7
- package/dist/lib/node/testing.cjs +0 -111
- package/dist/lib/node/testing.cjs.map +0 -7
- package/dist/types/src/components/CellEditor/CellEditor.d.ts +0 -14
- package/dist/types/src/components/CellEditor/CellEditor.d.ts.map +0 -1
- package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts.map +0 -1
- package/dist/types/src/components/CellEditor/extension.d.ts +0 -19
- package/dist/types/src/components/CellEditor/extension.d.ts.map +0 -1
- package/dist/types/src/components/CellEditor/extension.test.d.ts.map +0 -1
- package/dist/types/src/components/CellEditor/index.d.ts +0 -3
- package/dist/types/src/components/CellEditor/index.d.ts.map +0 -1
- package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +0 -1
- package/dist/types/src/components/ComputeGraph/custom.d.ts +0 -21
- package/dist/types/src/components/ComputeGraph/custom.d.ts.map +0 -1
- package/dist/types/src/components/ComputeGraph/edge-function.d.ts +0 -20
- package/dist/types/src/components/ComputeGraph/edge-function.d.ts.map +0 -1
- package/dist/types/src/components/ComputeGraph/graph-context.d.ts +0 -12
- package/dist/types/src/components/ComputeGraph/graph-context.d.ts.map +0 -1
- package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts +0 -2
- package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts.map +0 -1
- package/dist/types/src/components/ComputeGraph/graph.d.ts +0 -26
- package/dist/types/src/components/ComputeGraph/graph.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/Sheet.d.ts +0 -55
- package/dist/types/src/components/Sheet/Sheet.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/Sheet.stories.d.ts +0 -54
- package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/formatting.d.ts +0 -14
- package/dist/types/src/components/Sheet/formatting.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/grid.d.ts +0 -52
- package/dist/types/src/components/Sheet/grid.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/index.d.ts +0 -2
- package/dist/types/src/components/Sheet/index.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/nav.d.ts +0 -29
- package/dist/types/src/components/Sheet/nav.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/sheet-context.d.ts +0 -25
- package/dist/types/src/components/Sheet/sheet-context.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/util.d.ts +0 -18
- package/dist/types/src/components/Sheet/util.d.ts.map +0 -1
- package/dist/types/src/components/SheetContainer.d.ts +0 -9
- package/dist/types/src/components/SheetContainer.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar/common.d.ts +0 -20
- package/dist/types/src/components/Toolbar/common.d.ts.map +0 -1
- package/dist/types/src/model/functions.d.ts.map +0 -1
- package/dist/types/src/model/model.browser.test.d.ts +0 -2
- package/dist/types/src/model/model.browser.test.d.ts.map +0 -1
- package/dist/types/src/model/model.d.ts.map +0 -1
- package/dist/types/src/model/types.d.ts +0 -17
- package/dist/types/src/model/types.d.ts.map +0 -1
- package/dist/types/src/model/types.test.d.ts.map +0 -1
- package/dist/types/src/model/util.d.ts +0 -15
- package/dist/types/src/model/util.d.ts.map +0 -1
- package/dist/types/src/testing.d.ts +0 -9
- package/dist/types/src/testing.d.ts.map +0 -1
- package/src/components/CellEditor/CellEditor.tsx +0 -113
- package/src/components/ComputeGraph/graph-context.tsx +0 -50
- package/src/components/ComputeGraph/graph.browser.test.ts +0 -50
- package/src/components/ComputeGraph/graph.ts +0 -62
- package/src/components/Sheet/Sheet.stories.tsx +0 -287
- package/src/components/Sheet/Sheet.tsx +0 -1160
- package/src/components/Sheet/formatting.ts +0 -106
- package/src/components/Sheet/grid.ts +0 -191
- package/src/components/Sheet/nav.ts +0 -157
- package/src/components/Sheet/sheet-context.tsx +0 -150
- package/src/components/Sheet/util.ts +0 -56
- package/src/components/SheetContainer.tsx +0 -34
- package/src/components/Toolbar/common.tsx +0 -72
- package/src/meta.tsx +0 -18
- package/src/model/model.browser.test.ts +0 -100
- package/src/model/model.ts +0 -550
- package/src/model/types.ts +0 -71
- package/src/model/util.ts +0 -36
- package/src/testing.ts +0 -50
- /package/dist/types/src/{model → defs}/types.test.d.ts +0 -0
- /package/dist/types/src/{components/CellEditor → extensions/editor}/extension.test.d.ts +0 -0
- /package/src/{model/functions.ts → compute-graph/functions/function-defs.ts} +0 -0
|
@@ -1,22 +1,271 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
2
|
+
SheetType
|
|
3
|
+
} from "./chunk-BVUN7SHF.mjs";
|
|
4
4
|
|
|
5
|
-
// packages/plugins/plugin-sheet/src/
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
// packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts
|
|
6
|
+
import { Event as Event2 } from "@dxos/async";
|
|
7
|
+
import { Filter as Filter2, fullyQualifiedId } from "@dxos/client/echo";
|
|
8
|
+
import { FQ_ID_LENGTH } from "@dxos/client/echo";
|
|
9
|
+
import { Resource as Resource2 } from "@dxos/context";
|
|
10
|
+
import { getTypename } from "@dxos/echo-schema";
|
|
11
|
+
import { invariant as invariant2 } from "@dxos/invariant";
|
|
8
12
|
import { PublicKey } from "@dxos/keys";
|
|
9
|
-
import { log as
|
|
13
|
+
import { log as log3 } from "@dxos/log";
|
|
14
|
+
import { FunctionType as FunctionType2 } from "@dxos/plugin-script/types";
|
|
15
|
+
import { nonNullable as nonNullable2 } from "@dxos/util";
|
|
16
|
+
import { ExportedCellChange } from "#hyperformula";
|
|
17
|
+
|
|
18
|
+
// packages/plugins/plugin-sheet/src/compute-graph/compute-node.ts
|
|
19
|
+
import { Event } from "@dxos/async";
|
|
20
|
+
import { Resource } from "@dxos/context";
|
|
21
|
+
import { DetailedCellError } from "#hyperformula";
|
|
22
|
+
|
|
23
|
+
// packages/plugins/plugin-sheet/src/defs/sheet-range-types.ts
|
|
24
|
+
var alignKey = "alignment";
|
|
25
|
+
var commentKey = "comment";
|
|
26
|
+
var styleKey = "style";
|
|
27
|
+
var cellClassNameForRange = ({ key, value }) => {
|
|
28
|
+
switch (key) {
|
|
29
|
+
case alignKey:
|
|
30
|
+
switch (value) {
|
|
31
|
+
case "start":
|
|
32
|
+
return "text-start";
|
|
33
|
+
case "center":
|
|
34
|
+
return "text-center";
|
|
35
|
+
case "end":
|
|
36
|
+
return "text-end";
|
|
37
|
+
default:
|
|
38
|
+
return void 0;
|
|
39
|
+
}
|
|
40
|
+
case commentKey:
|
|
41
|
+
return "bg-gridComment";
|
|
42
|
+
case styleKey:
|
|
43
|
+
switch (value) {
|
|
44
|
+
case "highlight":
|
|
45
|
+
return "!bg-gridHighlight";
|
|
46
|
+
case "softwrap":
|
|
47
|
+
return "!whitespace-normal";
|
|
48
|
+
default:
|
|
49
|
+
return void 0;
|
|
50
|
+
}
|
|
51
|
+
default:
|
|
52
|
+
return void 0;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// packages/plugins/plugin-sheet/src/defs/types.ts
|
|
57
|
+
import { invariant } from "@dxos/invariant";
|
|
58
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/defs/types.ts";
|
|
59
|
+
var DEFAULT_ROWS = 50;
|
|
60
|
+
var DEFAULT_COLUMNS = 26;
|
|
61
|
+
var MAX_ROWS = 500;
|
|
62
|
+
var MAX_COLUMNS = 26 * 2;
|
|
63
|
+
var RANGE_NOTATION = /^[A-Z]+[0-9]+(:[A-Z]+[0-9]+)?$/;
|
|
64
|
+
var isFormula = (value) => typeof value === "string" && value.charAt(0) === "=";
|
|
65
|
+
var posEquals = (a, b) => {
|
|
66
|
+
return a?.col === b?.col && a?.row === b?.row;
|
|
67
|
+
};
|
|
68
|
+
var columnLetter = (col) => {
|
|
69
|
+
invariant(col < MAX_COLUMNS, `Invalid column: ${col}`, {
|
|
70
|
+
F: __dxlog_file,
|
|
71
|
+
L: 31,
|
|
72
|
+
S: void 0,
|
|
73
|
+
A: [
|
|
74
|
+
"col < MAX_COLUMNS",
|
|
75
|
+
"`Invalid column: ${col}`"
|
|
76
|
+
]
|
|
77
|
+
});
|
|
78
|
+
return (col >= 26 ? String.fromCharCode("A".charCodeAt(0) + Math.floor(col / 26) - 1) : "") + String.fromCharCode("A".charCodeAt(0) + col % 26);
|
|
79
|
+
};
|
|
80
|
+
var addressToA1Notation = ({ col, row }) => {
|
|
81
|
+
return `${columnLetter(col)}${row + 1}`;
|
|
82
|
+
};
|
|
83
|
+
var addressFromA1Notation = (ref) => {
|
|
84
|
+
const match = ref.match(/([A-Z]+)(\d+)/);
|
|
85
|
+
invariant(match, `Invalid notation: ${ref}`, {
|
|
86
|
+
F: __dxlog_file,
|
|
87
|
+
L: 45,
|
|
88
|
+
S: void 0,
|
|
89
|
+
A: [
|
|
90
|
+
"match",
|
|
91
|
+
"`Invalid notation: ${ref}`"
|
|
92
|
+
]
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
row: parseInt(match[2], 10) - 1,
|
|
96
|
+
col: match[1].split("").reduce((acc, c) => acc * 26 + c.charCodeAt(0) - "A".charCodeAt(0) + 1, 0) - 1
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
var rangeToA1Notation = (range) => {
|
|
100
|
+
return [
|
|
101
|
+
range?.from && addressToA1Notation(range?.from),
|
|
102
|
+
range?.to && addressToA1Notation(range?.to)
|
|
103
|
+
].filter(Boolean).join(":");
|
|
104
|
+
};
|
|
105
|
+
var inRange = (range, cell) => {
|
|
106
|
+
if (!range) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
const { from, to } = range;
|
|
110
|
+
if (from && posEquals(from, cell) || to && posEquals(to, cell)) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
if (!from || !to) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
const { col: c1, row: r1 } = from;
|
|
117
|
+
const { col: c2, row: r2 } = to;
|
|
118
|
+
const cMin = Math.min(c1, c2);
|
|
119
|
+
const cMax = Math.max(c1, c2);
|
|
120
|
+
const rMin = Math.min(r1, r2);
|
|
121
|
+
const rMax = Math.max(r1, r2);
|
|
122
|
+
const { col, row } = cell;
|
|
123
|
+
return col >= cMin && col <= cMax && row >= rMin && row <= rMax;
|
|
124
|
+
};
|
|
10
125
|
|
|
11
|
-
// packages/plugins/plugin-sheet/src/
|
|
12
|
-
import {
|
|
126
|
+
// packages/plugins/plugin-sheet/src/defs/util.ts
|
|
127
|
+
import { randomBytes } from "@dxos/crypto";
|
|
128
|
+
import { create } from "@dxos/echo-schema";
|
|
129
|
+
var ApiError = class extends Error {
|
|
130
|
+
};
|
|
131
|
+
var ReadonlyException = class extends ApiError {
|
|
132
|
+
};
|
|
133
|
+
var RangeException = class extends ApiError {
|
|
134
|
+
constructor(n) {
|
|
135
|
+
super();
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
var createIndex = (length = 8) => {
|
|
139
|
+
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
140
|
+
const charactersLength = characters.length;
|
|
141
|
+
const randomBuffer = randomBytes(length);
|
|
142
|
+
return Array.from(randomBuffer, (byte) => characters[byte % charactersLength]).join("");
|
|
143
|
+
};
|
|
144
|
+
var createIndices = (length) => Array.from({
|
|
145
|
+
length
|
|
146
|
+
}).map(() => createIndex());
|
|
147
|
+
var insertIndices = (indices, i, n, max) => {
|
|
148
|
+
if (i + n > max) {
|
|
149
|
+
throw new RangeException(i + n);
|
|
150
|
+
}
|
|
151
|
+
const idx = createIndices(n);
|
|
152
|
+
indices.splice(i, 0, ...idx);
|
|
153
|
+
return idx;
|
|
154
|
+
};
|
|
155
|
+
var initialize = (sheet, { rows = DEFAULT_ROWS, columns = DEFAULT_COLUMNS } = {}) => {
|
|
156
|
+
if (!sheet.rows.length) {
|
|
157
|
+
insertIndices(sheet.rows, 0, rows, MAX_ROWS);
|
|
158
|
+
}
|
|
159
|
+
if (!sheet.columns.length) {
|
|
160
|
+
insertIndices(sheet.columns, 0, columns, MAX_COLUMNS);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
var createSheet = ({ name, cells, ...size } = {}) => {
|
|
164
|
+
const sheet = create(SheetType, {
|
|
165
|
+
name,
|
|
166
|
+
cells: {},
|
|
167
|
+
rows: [],
|
|
168
|
+
columns: [],
|
|
169
|
+
rowMeta: {},
|
|
170
|
+
columnMeta: {},
|
|
171
|
+
ranges: [],
|
|
172
|
+
threads: []
|
|
173
|
+
});
|
|
174
|
+
initialize(sheet, size);
|
|
175
|
+
if (cells) {
|
|
176
|
+
Object.entries(cells).forEach(([key, { value }]) => {
|
|
177
|
+
const idx = addressToIndex(sheet, addressFromA1Notation(key));
|
|
178
|
+
sheet.cells[idx] = {
|
|
179
|
+
value
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return sheet;
|
|
184
|
+
};
|
|
185
|
+
var addressToIndex = (sheet, cell) => {
|
|
186
|
+
return `${sheet.columns[cell.col]}@${sheet.rows[cell.row]}`;
|
|
187
|
+
};
|
|
188
|
+
var addressFromIndex = (sheet, idx) => {
|
|
189
|
+
const [column, row] = idx.split("@");
|
|
190
|
+
return {
|
|
191
|
+
col: sheet.columns.indexOf(column),
|
|
192
|
+
row: sheet.rows.indexOf(row)
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
var rangeToIndex = (sheet, range) => {
|
|
196
|
+
return [
|
|
197
|
+
range.from,
|
|
198
|
+
range.to ?? range.from
|
|
199
|
+
].map((cell) => addressToIndex(sheet, cell)).join(":");
|
|
200
|
+
};
|
|
201
|
+
var rangeFromIndex = (sheet, idx) => {
|
|
202
|
+
const [from, to] = idx.split(":").map((index) => addressFromIndex(sheet, index));
|
|
203
|
+
return {
|
|
204
|
+
from,
|
|
205
|
+
to
|
|
206
|
+
};
|
|
207
|
+
};
|
|
208
|
+
var compareIndexPositions = (sheet, indexA, indexB) => {
|
|
209
|
+
const { row: rowA, col: columnA } = addressFromIndex(sheet, indexA);
|
|
210
|
+
const { row: rowB, col: columnB } = addressFromIndex(sheet, indexB);
|
|
211
|
+
if (rowA !== rowB) {
|
|
212
|
+
return rowA - rowB;
|
|
213
|
+
} else {
|
|
214
|
+
return columnA - columnB;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
// packages/plugins/plugin-sheet/src/compute-graph/compute-node.ts
|
|
219
|
+
var ComputeNode = class extends Resource {
|
|
220
|
+
constructor(_graph, sheetId) {
|
|
221
|
+
super();
|
|
222
|
+
this._graph = _graph;
|
|
223
|
+
this.sheetId = sheetId;
|
|
224
|
+
this.update = new Event();
|
|
225
|
+
}
|
|
226
|
+
get graph() {
|
|
227
|
+
return this._graph;
|
|
228
|
+
}
|
|
229
|
+
clear() {
|
|
230
|
+
this._graph.hf.clearSheet(this.sheetId);
|
|
231
|
+
}
|
|
232
|
+
getValue(cell) {
|
|
233
|
+
const value = this._graph.hf.getCellValue({
|
|
234
|
+
sheet: this.sheetId,
|
|
235
|
+
row: cell.row,
|
|
236
|
+
col: cell.col
|
|
237
|
+
});
|
|
238
|
+
if (value instanceof DetailedCellError) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
return value;
|
|
242
|
+
}
|
|
243
|
+
setValue(cell, value) {
|
|
244
|
+
const mappedValue = isFormula(value) ? this._graph.mapFormulaToNative(value) : value;
|
|
245
|
+
this._graph.hf.setCellContents({
|
|
246
|
+
sheet: this.sheetId,
|
|
247
|
+
row: cell.row,
|
|
248
|
+
col: cell.col
|
|
249
|
+
}, [
|
|
250
|
+
[
|
|
251
|
+
mappedValue
|
|
252
|
+
]
|
|
253
|
+
]);
|
|
254
|
+
}
|
|
255
|
+
// TODO(burdon): Load data into sheet.
|
|
256
|
+
async _open() {
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
// packages/plugins/plugin-sheet/src/compute-graph/functions/async-function.ts
|
|
13
261
|
import defaultsDeep from "lodash.defaultsdeep";
|
|
14
262
|
import { debounce } from "@dxos/async";
|
|
15
263
|
import { log } from "@dxos/log";
|
|
16
|
-
|
|
264
|
+
import { CellError, ErrorType, EmptyValue, FunctionPlugin } from "#hyperformula";
|
|
265
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/functions/async-function.ts";
|
|
17
266
|
var defaultFunctionContextOptions = {
|
|
18
267
|
defaultTtl: 5e3,
|
|
19
|
-
|
|
268
|
+
debounceDelay: 200,
|
|
20
269
|
remoteFunctionUrl: "https://edge.dxos.workers.dev/functions"
|
|
21
270
|
};
|
|
22
271
|
var FunctionContext = class _FunctionContext {
|
|
@@ -27,7 +276,7 @@ var FunctionContext = class _FunctionContext {
|
|
|
27
276
|
...args
|
|
28
277
|
});
|
|
29
278
|
}
|
|
30
|
-
constructor(_hf, _space,
|
|
279
|
+
constructor(_hf, _space, _options) {
|
|
31
280
|
this._hf = _hf;
|
|
32
281
|
this._space = _space;
|
|
33
282
|
this._cache = /* @__PURE__ */ new Map();
|
|
@@ -35,10 +284,16 @@ var FunctionContext = class _FunctionContext {
|
|
|
35
284
|
this._subscriptions = /* @__PURE__ */ new Map();
|
|
36
285
|
this._invocations = {};
|
|
37
286
|
this._options = defaultsDeep(_options ?? {}, defaultFunctionContextOptions);
|
|
38
|
-
this._onUpdate = debounce(() => {
|
|
287
|
+
this._onUpdate = debounce((update) => {
|
|
288
|
+
log("update", update, {
|
|
289
|
+
F: __dxlog_file2,
|
|
290
|
+
L: 86,
|
|
291
|
+
S: this,
|
|
292
|
+
C: (f, a) => f(...a)
|
|
293
|
+
});
|
|
39
294
|
this._hf.resumeEvaluation();
|
|
40
|
-
onUpdate(
|
|
41
|
-
}, this._options.
|
|
295
|
+
this._options.onUpdate?.(update);
|
|
296
|
+
}, this._options.debounceDelay);
|
|
42
297
|
}
|
|
43
298
|
get space() {
|
|
44
299
|
return this._space;
|
|
@@ -87,19 +342,22 @@ var FunctionContext = class _FunctionContext {
|
|
|
87
342
|
cell,
|
|
88
343
|
value: value2
|
|
89
344
|
}, {
|
|
90
|
-
F:
|
|
91
|
-
L:
|
|
345
|
+
F: __dxlog_file2,
|
|
346
|
+
L: 144,
|
|
92
347
|
S: this,
|
|
93
348
|
C: (f, a) => f(...a)
|
|
94
349
|
});
|
|
95
|
-
this._onUpdate(
|
|
350
|
+
this._onUpdate({
|
|
351
|
+
name,
|
|
352
|
+
cell
|
|
353
|
+
});
|
|
96
354
|
} catch (err) {
|
|
97
355
|
log.warn("failed", {
|
|
98
356
|
cell,
|
|
99
357
|
err
|
|
100
358
|
}, {
|
|
101
|
-
F:
|
|
102
|
-
L:
|
|
359
|
+
F: __dxlog_file2,
|
|
360
|
+
L: 148,
|
|
103
361
|
S: this,
|
|
104
362
|
C: (f, a) => f(...a)
|
|
105
363
|
});
|
|
@@ -118,18 +376,21 @@ var FunctionContext = class _FunctionContext {
|
|
|
118
376
|
args,
|
|
119
377
|
cache: value
|
|
120
378
|
}, {
|
|
121
|
-
F:
|
|
122
|
-
L:
|
|
379
|
+
F: __dxlog_file2,
|
|
380
|
+
L: 156,
|
|
123
381
|
S: this,
|
|
124
382
|
C: (f, a) => f(...a)
|
|
125
383
|
});
|
|
126
384
|
return value;
|
|
127
385
|
}
|
|
128
386
|
};
|
|
129
|
-
var
|
|
387
|
+
var AsyncFunctionPlugin = class extends FunctionPlugin {
|
|
130
388
|
get context() {
|
|
131
389
|
return this.config.context;
|
|
132
390
|
}
|
|
391
|
+
/**
|
|
392
|
+
* Immediately returns cached value then runs the async function.
|
|
393
|
+
*/
|
|
133
394
|
runAsyncFunction(ast, state, cb, options) {
|
|
134
395
|
const { procedureName } = ast;
|
|
135
396
|
const metadata = this.metadata(procedureName);
|
|
@@ -139,53 +400,136 @@ var FunctionPluginAsync = class extends FunctionPlugin {
|
|
|
139
400
|
}
|
|
140
401
|
};
|
|
141
402
|
|
|
142
|
-
// packages/plugins/plugin-sheet/src/
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
var
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
403
|
+
// packages/plugins/plugin-sheet/src/compute-graph/functions/edge-function.ts
|
|
404
|
+
import { effect } from "@preact/signals-core";
|
|
405
|
+
import { Filter, getMeta } from "@dxos/client/echo";
|
|
406
|
+
import { log as log2 } from "@dxos/log";
|
|
407
|
+
import { getUserFunctionUrlInMetadata } from "@dxos/plugin-script/edge";
|
|
408
|
+
import { FunctionType } from "@dxos/plugin-script/types";
|
|
409
|
+
import { nonNullable } from "@dxos/util";
|
|
410
|
+
import { CellError as CellError2, ErrorType as ErrorType2, FunctionArgumentType } from "#hyperformula";
|
|
411
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/functions/edge-function.ts";
|
|
412
|
+
var EDGE_FUNCTION_NAME = "DX";
|
|
413
|
+
var FUNCTION_TTL = 1e4;
|
|
414
|
+
var EdgeFunctionPlugin = class extends AsyncFunctionPlugin {
|
|
415
|
+
dx(ast, state) {
|
|
416
|
+
const handler = (subscribe = false) => async (binding, ...args) => {
|
|
417
|
+
const space = this.context.space;
|
|
418
|
+
if (!space) {
|
|
419
|
+
return new CellError2(ErrorType2.REF, "Missing space");
|
|
420
|
+
}
|
|
421
|
+
const { objects: [fn] } = await space.db.query(Filter.schema(FunctionType, {
|
|
422
|
+
binding
|
|
423
|
+
})).run();
|
|
424
|
+
if (!fn) {
|
|
425
|
+
log2.info("Function not found", {
|
|
426
|
+
binding
|
|
427
|
+
}, {
|
|
428
|
+
F: __dxlog_file3,
|
|
429
|
+
L: 41,
|
|
430
|
+
S: this,
|
|
431
|
+
C: (f, a) => f(...a)
|
|
432
|
+
});
|
|
433
|
+
return new CellError2(ErrorType2.REF, "Function not found");
|
|
434
|
+
}
|
|
435
|
+
if (subscribe) {
|
|
436
|
+
const unsubscribe = effect(() => {
|
|
437
|
+
log2("function changed", {
|
|
438
|
+
fn
|
|
439
|
+
}, {
|
|
440
|
+
F: __dxlog_file3,
|
|
441
|
+
L: 47,
|
|
442
|
+
S: this,
|
|
443
|
+
C: (f, a) => f(...a)
|
|
444
|
+
});
|
|
445
|
+
const _ = fn?.version;
|
|
446
|
+
this.runAsyncFunction(ast, state, handler(false), {
|
|
447
|
+
ttl: FUNCTION_TTL
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
this.context.createSubscription(ast.procedureName, unsubscribe);
|
|
451
|
+
}
|
|
452
|
+
const path = getUserFunctionUrlInMetadata(getMeta(fn));
|
|
453
|
+
const response = await fetch(`${this.context.remoteFunctionUrl}${path}`, {
|
|
454
|
+
method: "POST",
|
|
455
|
+
headers: {
|
|
456
|
+
"Content-Type": "application/json"
|
|
457
|
+
},
|
|
458
|
+
body: JSON.stringify({
|
|
459
|
+
args: args.filter(nonNullable)
|
|
460
|
+
})
|
|
461
|
+
});
|
|
462
|
+
const result = await response.text();
|
|
463
|
+
log2("function executed", {
|
|
464
|
+
result
|
|
465
|
+
}, {
|
|
466
|
+
F: __dxlog_file3,
|
|
467
|
+
L: 65,
|
|
468
|
+
S: this,
|
|
469
|
+
C: (f, a) => f(...a)
|
|
470
|
+
});
|
|
471
|
+
return result;
|
|
472
|
+
};
|
|
473
|
+
return this.runAsyncFunction(ast, state, handler(true), {
|
|
474
|
+
ttl: FUNCTION_TTL
|
|
165
475
|
});
|
|
166
476
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
477
|
+
};
|
|
478
|
+
EdgeFunctionPlugin.implementedFunctions = {
|
|
479
|
+
[EDGE_FUNCTION_NAME]: {
|
|
480
|
+
method: "dx",
|
|
481
|
+
parameters: [
|
|
482
|
+
// Binding
|
|
483
|
+
{
|
|
484
|
+
argumentType: FunctionArgumentType.STRING
|
|
485
|
+
},
|
|
486
|
+
// Remote function arguments (currently supporting up to 8).
|
|
487
|
+
{
|
|
488
|
+
argumentType: FunctionArgumentType.ANY,
|
|
489
|
+
optionalArg: true
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
argumentType: FunctionArgumentType.ANY,
|
|
493
|
+
optionalArg: true
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
argumentType: FunctionArgumentType.ANY,
|
|
497
|
+
optionalArg: true
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
argumentType: FunctionArgumentType.ANY,
|
|
501
|
+
optionalArg: true
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
argumentType: FunctionArgumentType.ANY,
|
|
505
|
+
optionalArg: true
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
argumentType: FunctionArgumentType.ANY,
|
|
509
|
+
optionalArg: true
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
argumentType: FunctionArgumentType.ANY,
|
|
513
|
+
optionalArg: true
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
argumentType: FunctionArgumentType.ANY,
|
|
517
|
+
optionalArg: true
|
|
518
|
+
}
|
|
519
|
+
],
|
|
520
|
+
isVolatile: true
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
var EdgeFunctionPluginTranslations = {
|
|
524
|
+
enGB: {
|
|
525
|
+
[EDGE_FUNCTION_NAME]: "Remote function"
|
|
526
|
+
},
|
|
527
|
+
enUS: {
|
|
528
|
+
[EDGE_FUNCTION_NAME]: "Remote function"
|
|
177
529
|
}
|
|
178
530
|
};
|
|
179
531
|
|
|
180
|
-
// packages/plugins/plugin-sheet/src/
|
|
181
|
-
import { DetailedCellError, ExportedCellChange } from "hyperformula";
|
|
182
|
-
import { Event as Event2 } from "@dxos/async";
|
|
183
|
-
import { Context } from "@dxos/context";
|
|
184
|
-
import { invariant as invariant2 } from "@dxos/invariant";
|
|
185
|
-
import { PublicKey as PublicKey2 } from "@dxos/keys";
|
|
186
|
-
import { log as log3 } from "@dxos/log";
|
|
187
|
-
|
|
188
|
-
// packages/plugins/plugin-sheet/src/model/functions.ts
|
|
532
|
+
// packages/plugins/plugin-sheet/src/compute-graph/functions/function-defs.ts
|
|
189
533
|
var defaultFunctions = [
|
|
190
534
|
// Array
|
|
191
535
|
{
|
|
@@ -2559,677 +2903,317 @@ var defaultFunctions = [
|
|
|
2559
2903
|
}
|
|
2560
2904
|
];
|
|
2561
2905
|
|
|
2562
|
-
// packages/plugins/plugin-sheet/src/
|
|
2563
|
-
|
|
2564
|
-
var
|
|
2565
|
-
var
|
|
2566
|
-
var
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
S: void 0,
|
|
2574
|
-
A: [
|
|
2575
|
-
"column < MAX_COLUMNS",
|
|
2576
|
-
"`Invalid column: ${column}`"
|
|
2577
|
-
]
|
|
2578
|
-
});
|
|
2579
|
-
return (column >= 26 ? String.fromCharCode("A".charCodeAt(0) + Math.floor(column / 26) - 1) : "") + String.fromCharCode("A".charCodeAt(0) + column % 26);
|
|
2580
|
-
};
|
|
2581
|
-
var addressToA1Notation = ({ column, row }) => {
|
|
2582
|
-
return `${columnLetter(column)}${row + 1}`;
|
|
2583
|
-
};
|
|
2584
|
-
var addressFromA1Notation = (ref) => {
|
|
2585
|
-
const match = ref.match(/([A-Z]+)(\d+)/);
|
|
2586
|
-
invariant(match, `Invalid notation: ${ref}`, {
|
|
2587
|
-
F: __dxlog_file3,
|
|
2588
|
-
L: 30,
|
|
2589
|
-
S: void 0,
|
|
2590
|
-
A: [
|
|
2591
|
-
"match",
|
|
2592
|
-
"`Invalid notation: ${ref}`"
|
|
2593
|
-
]
|
|
2594
|
-
});
|
|
2595
|
-
return {
|
|
2596
|
-
row: parseInt(match[2], 10) - 1,
|
|
2597
|
-
column: match[1].split("").reduce((acc, c) => acc * 26 + c.charCodeAt(0) - "A".charCodeAt(0) + 1, 0) - 1
|
|
2906
|
+
// packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts
|
|
2907
|
+
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/compute-graph.ts";
|
|
2908
|
+
var UNKNOWN_BINDING = "__UNKNOWN__";
|
|
2909
|
+
var createSheetName = ({ type, id }) => `${type}@${id}`;
|
|
2910
|
+
var parseSheetName = (name) => {
|
|
2911
|
+
const [type, id] = name.split("@");
|
|
2912
|
+
return id ? {
|
|
2913
|
+
type,
|
|
2914
|
+
id
|
|
2915
|
+
} : {
|
|
2916
|
+
id: type
|
|
2598
2917
|
};
|
|
2599
2918
|
};
|
|
2600
|
-
var
|
|
2601
|
-
|
|
2602
|
-
range?.from && addressToA1Notation(range?.from),
|
|
2603
|
-
range?.to && addressToA1Notation(range?.to)
|
|
2604
|
-
].filter(Boolean).join(":");
|
|
2605
|
-
};
|
|
2606
|
-
var inRange = (range, cell) => {
|
|
2607
|
-
if (!range) {
|
|
2608
|
-
return false;
|
|
2609
|
-
}
|
|
2610
|
-
const { from, to } = range;
|
|
2611
|
-
if (from && posEquals(from, cell) || to && posEquals(to, cell)) {
|
|
2612
|
-
return true;
|
|
2613
|
-
}
|
|
2614
|
-
if (!from || !to) {
|
|
2615
|
-
return false;
|
|
2616
|
-
}
|
|
2617
|
-
const { column: c1, row: r1 } = from;
|
|
2618
|
-
const { column: c2, row: r2 } = to;
|
|
2619
|
-
const cMin = Math.min(c1, c2);
|
|
2620
|
-
const cMax = Math.max(c1, c2);
|
|
2621
|
-
const rMin = Math.min(r1, r2);
|
|
2622
|
-
const rMax = Math.max(r1, r2);
|
|
2623
|
-
const { column, row } = cell;
|
|
2624
|
-
return column >= cMin && column <= cMax && row >= rMin && row <= rMax;
|
|
2625
|
-
};
|
|
2626
|
-
|
|
2627
|
-
// packages/plugins/plugin-sheet/src/model/util.ts
|
|
2628
|
-
import { randomBytes } from "@dxos/crypto";
|
|
2629
|
-
var ApiError = class extends Error {
|
|
2630
|
-
};
|
|
2631
|
-
var ReadonlyException = class extends ApiError {
|
|
2632
|
-
};
|
|
2633
|
-
var RangeException = class extends ApiError {
|
|
2634
|
-
constructor(n) {
|
|
2919
|
+
var ComputeGraph = class extends Resource2 {
|
|
2920
|
+
constructor(_hf, _space, _options) {
|
|
2635
2921
|
super();
|
|
2636
|
-
|
|
2637
|
-
};
|
|
2638
|
-
var createIndex = (length = 8) => {
|
|
2639
|
-
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
2640
|
-
const charactersLength = characters.length;
|
|
2641
|
-
const randomBuffer = randomBytes(length);
|
|
2642
|
-
return Array.from(randomBuffer, (byte) => characters[byte % charactersLength]).join("");
|
|
2643
|
-
};
|
|
2644
|
-
var createIndices = (length) => Array.from({
|
|
2645
|
-
length
|
|
2646
|
-
}).map(() => createIndex());
|
|
2647
|
-
|
|
2648
|
-
// packages/plugins/plugin-sheet/src/model/model.ts
|
|
2649
|
-
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/model/model.ts";
|
|
2650
|
-
var DEFAULT_ROWS = 100;
|
|
2651
|
-
var DEFAULT_COLUMNS = 26;
|
|
2652
|
-
var typeMap = {
|
|
2653
|
-
BOOLEAN: ValueTypeEnum.Boolean,
|
|
2654
|
-
NUMBER_RAW: ValueTypeEnum.Number,
|
|
2655
|
-
NUMBER_PERCENT: ValueTypeEnum.Percent,
|
|
2656
|
-
NUMBER_CURRENCY: ValueTypeEnum.Currency,
|
|
2657
|
-
NUMBER_DATETIME: ValueTypeEnum.DateTime,
|
|
2658
|
-
NUMBER_DATE: ValueTypeEnum.Date,
|
|
2659
|
-
NUMBER_TIME: ValueTypeEnum.Time
|
|
2660
|
-
};
|
|
2661
|
-
var defaultOptions = {
|
|
2662
|
-
rows: 50,
|
|
2663
|
-
columns: 26,
|
|
2664
|
-
mapFormulaBindingFromId: () => (formula) => formula,
|
|
2665
|
-
mapFormulaBindingToId: () => (formula) => formula
|
|
2666
|
-
};
|
|
2667
|
-
var getTopLeft = (range) => {
|
|
2668
|
-
const to = range.to ?? range.from;
|
|
2669
|
-
return {
|
|
2670
|
-
row: Math.min(range.from.row, to.row),
|
|
2671
|
-
column: Math.min(range.from.column, to.column)
|
|
2672
|
-
};
|
|
2673
|
-
};
|
|
2674
|
-
var toSimpleCellAddress = (sheet, cell) => ({
|
|
2675
|
-
sheet,
|
|
2676
|
-
row: cell.row,
|
|
2677
|
-
col: cell.column
|
|
2678
|
-
});
|
|
2679
|
-
var toModelRange = (sheet, range) => ({
|
|
2680
|
-
start: toSimpleCellAddress(sheet, range.from),
|
|
2681
|
-
end: toSimpleCellAddress(sheet, range.to ?? range.from)
|
|
2682
|
-
});
|
|
2683
|
-
var SheetModel = class {
|
|
2684
|
-
constructor(_graph, _sheet, _space, options = {}) {
|
|
2685
|
-
this._graph = _graph;
|
|
2686
|
-
this._sheet = _sheet;
|
|
2922
|
+
this._hf = _hf;
|
|
2687
2923
|
this._space = _space;
|
|
2688
|
-
this.
|
|
2689
|
-
this.
|
|
2690
|
-
this.
|
|
2924
|
+
this._options = _options;
|
|
2925
|
+
this.id = `graph-${PublicKey.random().truncate()}`;
|
|
2926
|
+
this._nodes = /* @__PURE__ */ new Map();
|
|
2927
|
+
this._remoteFunctions = [];
|
|
2691
2928
|
this.update = new Event2();
|
|
2692
|
-
const
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
|
|
2929
|
+
const contextOptions = {
|
|
2930
|
+
...this._options,
|
|
2931
|
+
onUpdate: (update) => {
|
|
2932
|
+
this._options?.onUpdate?.(update);
|
|
2933
|
+
this.update.emit({
|
|
2934
|
+
type: "valuesUpdated"
|
|
2935
|
+
});
|
|
2936
|
+
}
|
|
2700
2937
|
};
|
|
2701
|
-
this.
|
|
2702
|
-
|
|
2703
|
-
|
|
2704
|
-
|
|
2705
|
-
|
|
2706
|
-
|
|
2707
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
|
|
2713
|
-
|
|
2714
|
-
|
|
2715
|
-
|
|
2938
|
+
this.context = new FunctionContext(this._hf, this._space, contextOptions);
|
|
2939
|
+
this._hf.updateConfig({
|
|
2940
|
+
context: this.context
|
|
2941
|
+
});
|
|
2942
|
+
const onValuesUpdate = (changes) => {
|
|
2943
|
+
for (const change of changes) {
|
|
2944
|
+
if (change instanceof ExportedCellChange) {
|
|
2945
|
+
const { sheet } = change;
|
|
2946
|
+
const node = this._nodes.get(sheet);
|
|
2947
|
+
if (node) {
|
|
2948
|
+
node.update.emit({
|
|
2949
|
+
type: "valuesUpdated",
|
|
2950
|
+
change
|
|
2951
|
+
});
|
|
2952
|
+
}
|
|
2953
|
+
}
|
|
2954
|
+
}
|
|
2716
2955
|
};
|
|
2956
|
+
this._hf.on("valuesUpdated", onValuesUpdate);
|
|
2957
|
+
this._ctx.onDispose(() => this._hf.off("valuesUpdated", onValuesUpdate));
|
|
2717
2958
|
}
|
|
2718
|
-
get
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
2722
|
-
|
|
2723
|
-
|
|
2724
|
-
|
|
2959
|
+
get hf() {
|
|
2960
|
+
return this._hf;
|
|
2961
|
+
}
|
|
2962
|
+
getFunctions({ standard, echo } = {
|
|
2963
|
+
standard: true,
|
|
2964
|
+
echo: true
|
|
2965
|
+
}) {
|
|
2725
2966
|
return [
|
|
2726
|
-
...
|
|
2727
|
-
|
|
2967
|
+
...standard ? this._hf.getRegisteredFunctionNames().map((name) => defaultFunctions.find((fn) => fn.name === name) ?? {
|
|
2968
|
+
name
|
|
2969
|
+
}) : [],
|
|
2970
|
+
...echo ? this._remoteFunctions.map((fn) => ({
|
|
2971
|
+
name: fn.binding
|
|
2972
|
+
})) : []
|
|
2728
2973
|
];
|
|
2729
2974
|
}
|
|
2730
|
-
get initialized() {
|
|
2731
|
-
return !!this._ctx;
|
|
2732
|
-
}
|
|
2733
2975
|
/**
|
|
2734
|
-
*
|
|
2976
|
+
* Get or create cell representing a sheet.
|
|
2735
2977
|
*/
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2978
|
+
// TODO(burdon): Async (open node).
|
|
2979
|
+
// The graph should be an extensible factory that plugins extend with model constructors.
|
|
2980
|
+
// This would enable on-the-fly instantiation of new models when then are referenced.
|
|
2981
|
+
// E.g., Cross-object reference would be stored as "ObjectId!A1"
|
|
2982
|
+
// The graph would then load the object and create a ComputeNode (model) of the appropriate type.
|
|
2983
|
+
getOrCreateNode(name) {
|
|
2984
|
+
invariant2(name.length, void 0, {
|
|
2740
2985
|
F: __dxlog_file4,
|
|
2741
|
-
L:
|
|
2742
|
-
S: this,
|
|
2743
|
-
C: (f, a) => f(...a)
|
|
2744
|
-
});
|
|
2745
|
-
invariant2(!this.initialized, "Already initialized.", {
|
|
2746
|
-
F: __dxlog_file4,
|
|
2747
|
-
L: 143,
|
|
2986
|
+
L: 129,
|
|
2748
2987
|
S: this,
|
|
2749
2988
|
A: [
|
|
2750
|
-
"
|
|
2751
|
-
"
|
|
2989
|
+
"name.length",
|
|
2990
|
+
""
|
|
2752
2991
|
]
|
|
2753
2992
|
});
|
|
2754
|
-
this.
|
|
2755
|
-
|
|
2756
|
-
|
|
2757
|
-
|
|
2758
|
-
|
|
2759
|
-
|
|
2760
|
-
|
|
2761
|
-
|
|
2762
|
-
|
|
2763
|
-
}
|
|
2764
|
-
this.reset();
|
|
2765
|
-
const unsubscribe = this._graph.update.on(() => this.update.emit());
|
|
2766
|
-
this._ctx.onDispose(unsubscribe);
|
|
2767
|
-
if (this._space) {
|
|
2768
|
-
const { Filter } = await import("@dxos/client/echo");
|
|
2769
|
-
const { FunctionType } = await import("@dxos/plugin-script/types");
|
|
2770
|
-
const query = this._space?.db.query(Filter.schema(FunctionType));
|
|
2771
|
-
const unsubscribe2 = query.subscribe(({ objects }) => {
|
|
2772
|
-
this._functions = objects.filter((fn) => fn.binding);
|
|
2773
|
-
this.update.emit();
|
|
2993
|
+
if (!this._hf.doesSheetExist(name)) {
|
|
2994
|
+
log3("created node", {
|
|
2995
|
+
space: this._space?.id,
|
|
2996
|
+
sheet: name
|
|
2997
|
+
}, {
|
|
2998
|
+
F: __dxlog_file4,
|
|
2999
|
+
L: 131,
|
|
3000
|
+
S: this,
|
|
3001
|
+
C: (f, a) => f(...a)
|
|
2774
3002
|
});
|
|
2775
|
-
this.
|
|
3003
|
+
this._hf.addSheet(name);
|
|
2776
3004
|
}
|
|
2777
|
-
|
|
2778
|
-
|
|
2779
|
-
async destroy() {
|
|
2780
|
-
log3("destroy", {
|
|
2781
|
-
id: this.id
|
|
2782
|
-
}, {
|
|
3005
|
+
const sheetId = this._hf.getSheetId(name);
|
|
3006
|
+
invariant2(sheetId !== void 0, void 0, {
|
|
2783
3007
|
F: __dxlog_file4,
|
|
2784
|
-
L:
|
|
3008
|
+
L: 136,
|
|
2785
3009
|
S: this,
|
|
2786
|
-
|
|
2787
|
-
|
|
2788
|
-
|
|
2789
|
-
await this._ctx.dispose();
|
|
2790
|
-
this._ctx = void 0;
|
|
2791
|
-
}
|
|
2792
|
-
}
|
|
2793
|
-
/**
|
|
2794
|
-
* Update engine.
|
|
2795
|
-
* NOTE: This resets the undo history.
|
|
2796
|
-
* @deprecated
|
|
2797
|
-
*/
|
|
2798
|
-
reset() {
|
|
2799
|
-
this._graph.hf.clearSheet(this._sheetId);
|
|
2800
|
-
Object.entries(this._sheet.cells).forEach(([key, { value }]) => {
|
|
2801
|
-
const { column, row } = this.addressFromIndex(key);
|
|
2802
|
-
if (typeof value === "string" && value.charAt(0) === "=") {
|
|
2803
|
-
value = this.mapFormulaBindingToFormula(this.mapFormulaBindingFromId(this.mapFormulaIndicesToRefs(value)));
|
|
2804
|
-
}
|
|
2805
|
-
this._graph.hf.setCellContents({
|
|
2806
|
-
sheet: this._sheetId,
|
|
2807
|
-
row,
|
|
2808
|
-
col: column
|
|
2809
|
-
}, value);
|
|
2810
|
-
});
|
|
2811
|
-
}
|
|
2812
|
-
/**
|
|
2813
|
-
* Recalculate formulas.
|
|
2814
|
-
* NOTE: This resets the undo history.
|
|
2815
|
-
* https://hyperformula.handsontable.com/guide/volatile-functions.html#volatile-actions
|
|
2816
|
-
* @deprecated
|
|
2817
|
-
*/
|
|
2818
|
-
// TODO(burdon): Remove.
|
|
2819
|
-
recalculate() {
|
|
2820
|
-
this._graph.hf.rebuildAndRecalculate();
|
|
2821
|
-
}
|
|
2822
|
-
insertRows(i, n = 1) {
|
|
2823
|
-
this._insertIndices(this._sheet.rows, i, n, DEFAULT_ROWS);
|
|
2824
|
-
this.reset();
|
|
2825
|
-
}
|
|
2826
|
-
insertColumns(i, n = 1) {
|
|
2827
|
-
this._insertIndices(this._sheet.columns, i, n, DEFAULT_COLUMNS);
|
|
2828
|
-
this.reset();
|
|
2829
|
-
}
|
|
2830
|
-
//
|
|
2831
|
-
// Undoable actions.
|
|
2832
|
-
// TODO(burdon): Group undoable methods; consistently update hf/sheet.
|
|
2833
|
-
//
|
|
2834
|
-
/**
|
|
2835
|
-
* Clear range of values.
|
|
2836
|
-
*/
|
|
2837
|
-
clear(range) {
|
|
2838
|
-
const topLeft = getTopLeft(range);
|
|
2839
|
-
const values = this._iterRange(range, () => null);
|
|
2840
|
-
this._graph.hf.setCellContents(toSimpleCellAddress(this._sheetId, topLeft), values);
|
|
2841
|
-
this._iterRange(range, (cell) => {
|
|
2842
|
-
const idx = this.addressToIndex(cell);
|
|
2843
|
-
delete this._sheet.cells[idx];
|
|
2844
|
-
});
|
|
2845
|
-
}
|
|
2846
|
-
cut(range) {
|
|
2847
|
-
this._graph.hf.cut(toModelRange(this._sheetId, range));
|
|
2848
|
-
this._iterRange(range, (cell) => {
|
|
2849
|
-
const idx = this.addressToIndex(cell);
|
|
2850
|
-
delete this._sheet.cells[idx];
|
|
2851
|
-
});
|
|
2852
|
-
}
|
|
2853
|
-
copy(range) {
|
|
2854
|
-
this._graph.hf.copy(toModelRange(this._sheetId, range));
|
|
2855
|
-
}
|
|
2856
|
-
paste(cell) {
|
|
2857
|
-
if (!this._graph.hf.isClipboardEmpty()) {
|
|
2858
|
-
const changes = this._graph.hf.paste(toSimpleCellAddress(this._sheetId, cell));
|
|
2859
|
-
for (const change of changes) {
|
|
2860
|
-
if (change instanceof ExportedCellChange) {
|
|
2861
|
-
const { address, newValue } = change;
|
|
2862
|
-
const idx = this.addressToIndex({
|
|
2863
|
-
row: address.row,
|
|
2864
|
-
column: address.col
|
|
2865
|
-
});
|
|
2866
|
-
this._sheet.cells[idx] = {
|
|
2867
|
-
value: newValue
|
|
2868
|
-
};
|
|
2869
|
-
}
|
|
2870
|
-
}
|
|
2871
|
-
}
|
|
2872
|
-
}
|
|
2873
|
-
// TODO(burdon): Display undo/redo state.
|
|
2874
|
-
undo() {
|
|
2875
|
-
if (this._graph.hf.isThereSomethingToUndo()) {
|
|
2876
|
-
this._graph.hf.undo();
|
|
2877
|
-
this.update.emit();
|
|
2878
|
-
}
|
|
2879
|
-
}
|
|
2880
|
-
redo() {
|
|
2881
|
-
if (this._graph.hf.isThereSomethingToRedo()) {
|
|
2882
|
-
this._graph.hf.redo();
|
|
2883
|
-
this.update.emit();
|
|
2884
|
-
}
|
|
2885
|
-
}
|
|
2886
|
-
/**
|
|
2887
|
-
* Get value from sheet.
|
|
2888
|
-
*/
|
|
2889
|
-
getCellValue(cell) {
|
|
2890
|
-
const idx = this.addressToIndex(cell);
|
|
2891
|
-
return this._sheet.cells[idx]?.value ?? null;
|
|
2892
|
-
}
|
|
2893
|
-
/**
|
|
2894
|
-
* Get value as a string for editing.
|
|
2895
|
-
*/
|
|
2896
|
-
getCellText(cell) {
|
|
2897
|
-
const value = this.getCellValue(cell);
|
|
2898
|
-
if (value == null) {
|
|
2899
|
-
return void 0;
|
|
2900
|
-
}
|
|
2901
|
-
if (typeof value === "string" && value.charAt(0) === "=") {
|
|
2902
|
-
return this.mapFormulaBindingFromId(this.mapFormulaIndicesToRefs(value));
|
|
2903
|
-
} else {
|
|
2904
|
-
return String(value);
|
|
2905
|
-
}
|
|
2906
|
-
}
|
|
2907
|
-
/**
|
|
2908
|
-
* Get array of raw values from sheet.
|
|
2909
|
-
*/
|
|
2910
|
-
getCellValues(range) {
|
|
2911
|
-
return this._iterRange(range, (cell) => this.getCellValue(cell));
|
|
2912
|
-
}
|
|
2913
|
-
/**
|
|
2914
|
-
* Gets the regular or computed value from the engine.
|
|
2915
|
-
*/
|
|
2916
|
-
getValue(cell) {
|
|
2917
|
-
const value = this._graph.hf.getCellValue(toSimpleCellAddress(this._sheetId, cell));
|
|
2918
|
-
if (value instanceof DetailedCellError) {
|
|
2919
|
-
return value.toString();
|
|
2920
|
-
}
|
|
2921
|
-
return value;
|
|
2922
|
-
}
|
|
2923
|
-
/**
|
|
2924
|
-
* Get value type.
|
|
2925
|
-
*/
|
|
2926
|
-
getValueType(cell) {
|
|
2927
|
-
const addr = toSimpleCellAddress(this._sheetId, cell);
|
|
2928
|
-
const type = this._graph.hf.getCellValueDetailedType(addr);
|
|
2929
|
-
return typeMap[type];
|
|
2930
|
-
}
|
|
2931
|
-
/**
|
|
2932
|
-
* Sets the value, updating the sheet and engine.
|
|
2933
|
-
*/
|
|
2934
|
-
setValue(cell, value) {
|
|
2935
|
-
if (this._options.readonly) {
|
|
2936
|
-
throw new ReadonlyException();
|
|
2937
|
-
}
|
|
2938
|
-
let refresh = false;
|
|
2939
|
-
if (cell.row >= this._sheet.rows.length) {
|
|
2940
|
-
this._insertIndices(this._sheet.rows, cell.row, 1, DEFAULT_ROWS);
|
|
2941
|
-
refresh = true;
|
|
2942
|
-
}
|
|
2943
|
-
if (cell.column >= this._sheet.columns.length) {
|
|
2944
|
-
this._insertIndices(this._sheet.columns, cell.column, 1, DEFAULT_COLUMNS);
|
|
2945
|
-
refresh = true;
|
|
2946
|
-
}
|
|
2947
|
-
if (refresh) {
|
|
2948
|
-
this.reset();
|
|
2949
|
-
}
|
|
2950
|
-
this._graph.hf.setCellContents({
|
|
2951
|
-
sheet: this._sheetId,
|
|
2952
|
-
row: cell.row,
|
|
2953
|
-
col: cell.column
|
|
2954
|
-
}, [
|
|
2955
|
-
[
|
|
2956
|
-
typeof value === "string" && value.charAt(0) === "=" ? this.mapFormulaBindingToFormula(value) : value
|
|
3010
|
+
A: [
|
|
3011
|
+
"sheetId !== undefined",
|
|
3012
|
+
""
|
|
2957
3013
|
]
|
|
2958
|
-
]);
|
|
2959
|
-
const idx = this.addressToIndex(cell);
|
|
2960
|
-
if (value === void 0 || value === null) {
|
|
2961
|
-
delete this._sheet.cells[idx];
|
|
2962
|
-
} else {
|
|
2963
|
-
if (typeof value === "string" && value.charAt(0) === "=") {
|
|
2964
|
-
value = this.mapFormulaBindingToId(this.mapFormulaRefsToIndices(value));
|
|
2965
|
-
}
|
|
2966
|
-
this._sheet.cells[idx] = {
|
|
2967
|
-
value
|
|
2968
|
-
};
|
|
2969
|
-
}
|
|
2970
|
-
}
|
|
2971
|
-
/**
|
|
2972
|
-
* Sets values from a simple map.
|
|
2973
|
-
*/
|
|
2974
|
-
setValues(values) {
|
|
2975
|
-
Object.entries(values).forEach(([key, { value }]) => {
|
|
2976
|
-
this.setValue(addressFromA1Notation(key), value);
|
|
2977
3014
|
});
|
|
3015
|
+
const node = new ComputeNode(this, sheetId);
|
|
3016
|
+
this._nodes.set(sheetId, node);
|
|
3017
|
+
return node;
|
|
2978
3018
|
}
|
|
2979
3019
|
/**
|
|
2980
|
-
*
|
|
3020
|
+
* Map bound value to custom function invocation.
|
|
3021
|
+
* E.g., "HELLO(...args)" => "DX("HELLO", ...args)".
|
|
2981
3022
|
*/
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
row,
|
|
2998
|
-
column
|
|
2999
|
-
});
|
|
3000
|
-
if (value !== void 0) {
|
|
3001
|
-
rowCells.push(value);
|
|
3023
|
+
mapFormulaToNative(formula) {
|
|
3024
|
+
return formula.replace(/['"]?([ \w]+)['"]?!/, (_match, name) => {
|
|
3025
|
+
if (name) {
|
|
3026
|
+
const objects = this._hf.getSheetNames().map((name2) => {
|
|
3027
|
+
const { type, id } = parseSheetName(name2);
|
|
3028
|
+
return type && id ? this._space?.db.getObjectById(id) : void 0;
|
|
3029
|
+
}).filter(nonNullable2);
|
|
3030
|
+
for (const obj of objects) {
|
|
3031
|
+
if (obj.name === name) {
|
|
3032
|
+
const type = getTypename(obj);
|
|
3033
|
+
return `'${createSheetName({
|
|
3034
|
+
type,
|
|
3035
|
+
id: obj.id
|
|
3036
|
+
})}'!`;
|
|
3037
|
+
}
|
|
3002
3038
|
}
|
|
3003
3039
|
}
|
|
3004
|
-
|
|
3005
|
-
}
|
|
3006
|
-
|
|
3007
|
-
}
|
|
3008
|
-
/**
|
|
3009
|
-
*
|
|
3010
|
-
*/
|
|
3011
|
-
// TODO(burdon): Insert indices into sheet.
|
|
3012
|
-
_insertIndices(indices, i, n, max) {
|
|
3013
|
-
if (i + n > max) {
|
|
3014
|
-
throw new RangeException(i + n);
|
|
3015
|
-
}
|
|
3016
|
-
const idx = createIndices(n);
|
|
3017
|
-
indices.splice(i, 0, ...idx);
|
|
3018
|
-
}
|
|
3019
|
-
// TODO(burdon): Delete index.
|
|
3020
|
-
_deleteIndices(indices, i, n) {
|
|
3021
|
-
throw new Error("Not implemented");
|
|
3022
|
-
}
|
|
3023
|
-
// TODO(burdon): Move. Cannot use fractional without changing. Switch back to using unique IDs?
|
|
3024
|
-
_moveIndices(indices, i, j, n) {
|
|
3025
|
-
throw new Error("Not implemented");
|
|
3026
|
-
}
|
|
3027
|
-
//
|
|
3028
|
-
// Indices.
|
|
3029
|
-
//
|
|
3030
|
-
/**
|
|
3031
|
-
* E.g., "A1" => "x1@y1".
|
|
3032
|
-
*/
|
|
3033
|
-
addressToIndex(cell) {
|
|
3034
|
-
return `${this._sheet.columns[cell.column]}@${this._sheet.rows[cell.row]}`;
|
|
3035
|
-
}
|
|
3036
|
-
/**
|
|
3037
|
-
* E.g., "x1@y1" => "A1".
|
|
3038
|
-
*/
|
|
3039
|
-
addressFromIndex(idx) {
|
|
3040
|
-
const [column, row] = idx.split("@");
|
|
3041
|
-
return {
|
|
3042
|
-
column: this._sheet.columns.indexOf(column),
|
|
3043
|
-
row: this._sheet.rows.indexOf(row)
|
|
3044
|
-
};
|
|
3045
|
-
}
|
|
3046
|
-
/**
|
|
3047
|
-
* E.g., "A1:B2" => "x1@y1:x2@y2".
|
|
3048
|
-
*/
|
|
3049
|
-
rangeToIndex(range) {
|
|
3050
|
-
return [
|
|
3051
|
-
range.from,
|
|
3052
|
-
range.to ?? range.from
|
|
3053
|
-
].map((cell) => this.addressToIndex(cell)).join(":");
|
|
3054
|
-
}
|
|
3055
|
-
/**
|
|
3056
|
-
* E.g., "x1@y1:x2@y2" => "A1:B2".
|
|
3057
|
-
*/
|
|
3058
|
-
rangeFromIndex(idx) {
|
|
3059
|
-
const [from, to] = idx.split(":").map((idx2) => this.addressFromIndex(idx2));
|
|
3060
|
-
return {
|
|
3061
|
-
from,
|
|
3062
|
-
to
|
|
3063
|
-
};
|
|
3064
|
-
}
|
|
3065
|
-
/**
|
|
3066
|
-
* E.g., "HELLO()" => "EDGE("HELLO")".
|
|
3067
|
-
*/
|
|
3068
|
-
mapFormulaBindingToFormula(formula) {
|
|
3069
|
-
return formula.replace(/([a-zA-Z0-9]+)\((.*)\)/g, (match, binding, args) => {
|
|
3070
|
-
const fn = this._functions.find((fn2) => fn2.binding === binding);
|
|
3040
|
+
return `${name}!`;
|
|
3041
|
+
}).replace(/(\w+)\((.*)\)/g, (match, binding, args) => {
|
|
3042
|
+
const fn = this._remoteFunctions.find((fn2) => fn2.binding === binding);
|
|
3071
3043
|
if (!fn) {
|
|
3072
3044
|
return match;
|
|
3073
3045
|
}
|
|
3074
3046
|
if (args.trim() === "") {
|
|
3075
|
-
return
|
|
3047
|
+
return `${EDGE_FUNCTION_NAME}("${binding}")`;
|
|
3048
|
+
} else {
|
|
3049
|
+
return `${EDGE_FUNCTION_NAME}("${binding}", ${args})`;
|
|
3076
3050
|
}
|
|
3077
|
-
return `EDGE("${binding}", ${args})`;
|
|
3078
3051
|
});
|
|
3079
3052
|
}
|
|
3080
3053
|
/**
|
|
3081
|
-
*
|
|
3054
|
+
* Map from binding to fully qualified ECHO ID (to store).
|
|
3055
|
+
* E.g., HELLO() => spaceId:objectId()
|
|
3082
3056
|
*/
|
|
3083
|
-
|
|
3084
|
-
return formula.replace(/
|
|
3085
|
-
if (
|
|
3086
|
-
return
|
|
3057
|
+
mapFunctionBindingToId(formula) {
|
|
3058
|
+
return formula.replace(/(\w+)\((.*)\)/g, (match, binding, args) => {
|
|
3059
|
+
if (binding === EDGE_FUNCTION_NAME || defaultFunctions.find((fn2) => fn2.name === binding)) {
|
|
3060
|
+
return match;
|
|
3061
|
+
}
|
|
3062
|
+
const fn = this._remoteFunctions.find((fn2) => fn2.binding === binding);
|
|
3063
|
+
if (fn) {
|
|
3064
|
+
const id = fullyQualifiedId(fn);
|
|
3065
|
+
return `${id}(${args})`;
|
|
3066
|
+
} else {
|
|
3067
|
+
return match;
|
|
3087
3068
|
}
|
|
3088
|
-
return `${binding}(${args.slice(2)})`;
|
|
3089
|
-
});
|
|
3090
|
-
}
|
|
3091
|
-
/**
|
|
3092
|
-
* Map from binding to fully qualified ECHO ID.
|
|
3093
|
-
*/
|
|
3094
|
-
mapFormulaBindingToId(formula) {
|
|
3095
|
-
return this._options.mapFormulaBindingToId(this._functions)(formula);
|
|
3096
|
-
}
|
|
3097
|
-
/**
|
|
3098
|
-
* Map from fully qualified ECHO ID to binding.
|
|
3099
|
-
*/
|
|
3100
|
-
mapFormulaBindingFromId(formula) {
|
|
3101
|
-
return this._options.mapFormulaBindingFromId(this._functions)(formula);
|
|
3102
|
-
}
|
|
3103
|
-
/**
|
|
3104
|
-
* Map from A1 notation to indices.
|
|
3105
|
-
*/
|
|
3106
|
-
mapFormulaRefsToIndices(formula) {
|
|
3107
|
-
invariant2(formula.charAt(0) === "=", void 0, {
|
|
3108
|
-
F: __dxlog_file4,
|
|
3109
|
-
L: 509,
|
|
3110
|
-
S: this,
|
|
3111
|
-
A: [
|
|
3112
|
-
"formula.charAt(0) === '='",
|
|
3113
|
-
""
|
|
3114
|
-
]
|
|
3115
|
-
});
|
|
3116
|
-
return formula.replace(/([a-zA-Z]+)([0-9]+)/g, (match) => {
|
|
3117
|
-
return this.addressToIndex(addressFromA1Notation(match));
|
|
3118
3069
|
});
|
|
3119
3070
|
}
|
|
3120
3071
|
/**
|
|
3121
|
-
* Map from
|
|
3072
|
+
* Map from fully qualified ECHO ID to binding (from store).
|
|
3073
|
+
* E.g., spaceId:objectId() => HELLO()
|
|
3122
3074
|
*/
|
|
3123
|
-
|
|
3124
|
-
|
|
3125
|
-
|
|
3126
|
-
|
|
3127
|
-
|
|
3128
|
-
|
|
3129
|
-
|
|
3130
|
-
|
|
3131
|
-
|
|
3132
|
-
|
|
3133
|
-
|
|
3134
|
-
|
|
3075
|
+
mapFunctionBindingFromId(formula) {
|
|
3076
|
+
const binding = formula.replace(/(\w+):([a-zA-Z0-9]+)\((.*)\)/g, (match, spaceId, objectId, args) => {
|
|
3077
|
+
const id = `${spaceId}:${objectId}`;
|
|
3078
|
+
if (id.length !== FQ_ID_LENGTH) {
|
|
3079
|
+
return match;
|
|
3080
|
+
}
|
|
3081
|
+
const fn = this._remoteFunctions.find((fn2) => fullyQualifiedId(fn2) === id);
|
|
3082
|
+
if (fn?.binding) {
|
|
3083
|
+
return `${fn.binding}(${args})`;
|
|
3084
|
+
} else {
|
|
3085
|
+
return UNKNOWN_BINDING;
|
|
3086
|
+
}
|
|
3135
3087
|
});
|
|
3088
|
+
if (binding.startsWith(`=${UNKNOWN_BINDING}`)) {
|
|
3089
|
+
return void 0;
|
|
3090
|
+
} else {
|
|
3091
|
+
return binding;
|
|
3092
|
+
}
|
|
3136
3093
|
}
|
|
3137
|
-
|
|
3138
|
-
|
|
3139
|
-
|
|
3140
|
-
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
|
|
3148
|
-
}
|
|
3149
|
-
toDateTime(num) {
|
|
3150
|
-
return this._graph.hf.numberToDateTime(num);
|
|
3151
|
-
}
|
|
3152
|
-
toDate(num) {
|
|
3153
|
-
return this._graph.hf.numberToDate(num);
|
|
3094
|
+
async _open() {
|
|
3095
|
+
if (this._space) {
|
|
3096
|
+
const query = this._space.db.query(Filter2.schema(FunctionType2));
|
|
3097
|
+
const unsubscribe = query.subscribe(({ objects }) => {
|
|
3098
|
+
this._remoteFunctions = objects.filter(({ binding }) => binding);
|
|
3099
|
+
this.update.emit({
|
|
3100
|
+
type: "functionsUpdated"
|
|
3101
|
+
});
|
|
3102
|
+
});
|
|
3103
|
+
this._ctx.onDispose(unsubscribe);
|
|
3104
|
+
}
|
|
3154
3105
|
}
|
|
3155
|
-
|
|
3156
|
-
|
|
3106
|
+
async _close() {
|
|
3107
|
+
for (const node of this._nodes.values()) {
|
|
3108
|
+
await node.close();
|
|
3109
|
+
}
|
|
3157
3110
|
}
|
|
3158
3111
|
};
|
|
3159
3112
|
|
|
3160
|
-
// packages/plugins/plugin-sheet/src/
|
|
3161
|
-
import
|
|
3162
|
-
import {
|
|
3163
|
-
|
|
3164
|
-
|
|
3113
|
+
// packages/plugins/plugin-sheet/src/compute-graph/compute-graph-registry.ts
|
|
3114
|
+
import defaultsDeep2 from "lodash.defaultsdeep";
|
|
3115
|
+
import { Resource as Resource3 } from "@dxos/context";
|
|
3116
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
|
3117
|
+
import { log as log4 } from "@dxos/log";
|
|
3118
|
+
import { HyperFormula } from "#hyperformula";
|
|
3119
|
+
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/compute-graph/compute-graph-registry.ts";
|
|
3120
|
+
var defaultOptions = {
|
|
3121
|
+
licenseKey: "gpl-v3"
|
|
3165
3122
|
};
|
|
3166
|
-
var
|
|
3167
|
-
|
|
3168
|
-
|
|
3169
|
-
|
|
3170
|
-
};
|
|
3171
|
-
return this.runAsyncFunction(ast, state, handler);
|
|
3123
|
+
var defaultPlugins = [
|
|
3124
|
+
{
|
|
3125
|
+
plugin: EdgeFunctionPlugin,
|
|
3126
|
+
translations: EdgeFunctionPluginTranslations
|
|
3172
3127
|
}
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
if (!rate) {
|
|
3184
|
-
return NaN;
|
|
3185
|
-
}
|
|
3186
|
-
return parseNumberString(rate);
|
|
3187
|
-
};
|
|
3188
|
-
return this.runAsyncFunction(ast, state, handler, {
|
|
3189
|
-
ttl: 1e4
|
|
3128
|
+
];
|
|
3129
|
+
var ComputeGraphRegistry = class extends Resource3 {
|
|
3130
|
+
constructor(options = {
|
|
3131
|
+
plugins: defaultPlugins
|
|
3132
|
+
}) {
|
|
3133
|
+
super();
|
|
3134
|
+
this._graphs = /* @__PURE__ */ new Map();
|
|
3135
|
+
this._options = defaultsDeep2({}, options, defaultOptions);
|
|
3136
|
+
this._options.plugins?.forEach(({ plugin, translations }) => {
|
|
3137
|
+
HyperFormula.registerFunctionPlugin(plugin, translations);
|
|
3190
3138
|
});
|
|
3191
3139
|
}
|
|
3192
|
-
|
|
3193
|
-
|
|
3194
|
-
|
|
3195
|
-
|
|
3196
|
-
|
|
3197
|
-
|
|
3198
|
-
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
}
|
|
3206
|
-
|
|
3207
|
-
|
|
3140
|
+
getGraph(spaceId) {
|
|
3141
|
+
return this._graphs.get(spaceId);
|
|
3142
|
+
}
|
|
3143
|
+
getOrCreateGraph(space) {
|
|
3144
|
+
let graph = this._graphs.get(space.id);
|
|
3145
|
+
if (!graph) {
|
|
3146
|
+
log4("create graph", {
|
|
3147
|
+
space: space.id
|
|
3148
|
+
}, {
|
|
3149
|
+
F: __dxlog_file5,
|
|
3150
|
+
L: 69,
|
|
3151
|
+
S: this,
|
|
3152
|
+
C: (f, a) => f(...a)
|
|
3153
|
+
});
|
|
3154
|
+
graph = this.createGraph(space);
|
|
3155
|
+
}
|
|
3156
|
+
return graph;
|
|
3208
3157
|
}
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3212
|
-
|
|
3213
|
-
|
|
3214
|
-
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3158
|
+
createGraph(space) {
|
|
3159
|
+
invariant3(!this._graphs.has(space.id), `ComputeGraph already exists for space: ${space.id}`, {
|
|
3160
|
+
F: __dxlog_file5,
|
|
3161
|
+
L: 77,
|
|
3162
|
+
S: this,
|
|
3163
|
+
A: [
|
|
3164
|
+
"!this._graphs.has(space.id)",
|
|
3165
|
+
"`ComputeGraph already exists for space: ${space.id}`"
|
|
3166
|
+
]
|
|
3167
|
+
});
|
|
3168
|
+
const hf = HyperFormula.buildEmpty(this._options);
|
|
3169
|
+
const graph = new ComputeGraph(hf, space, this._options);
|
|
3170
|
+
this._graphs.set(space.id, graph);
|
|
3171
|
+
return graph;
|
|
3172
|
+
}
|
|
3173
|
+
async _close() {
|
|
3174
|
+
for (const graph of this._graphs.values()) {
|
|
3175
|
+
await graph.close();
|
|
3176
|
+
}
|
|
3177
|
+
this._graphs.clear();
|
|
3218
3178
|
}
|
|
3219
3179
|
};
|
|
3220
3180
|
|
|
3221
3181
|
export {
|
|
3222
|
-
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
|
|
3182
|
+
alignKey,
|
|
3183
|
+
styleKey,
|
|
3184
|
+
cellClassNameForRange,
|
|
3185
|
+
DEFAULT_ROWS,
|
|
3186
|
+
DEFAULT_COLUMNS,
|
|
3187
|
+
MAX_ROWS,
|
|
3188
|
+
MAX_COLUMNS,
|
|
3189
|
+
RANGE_NOTATION,
|
|
3190
|
+
isFormula,
|
|
3229
3191
|
addressToA1Notation,
|
|
3230
3192
|
addressFromA1Notation,
|
|
3231
3193
|
rangeToA1Notation,
|
|
3232
3194
|
inRange,
|
|
3233
|
-
|
|
3195
|
+
ReadonlyException,
|
|
3196
|
+
insertIndices,
|
|
3197
|
+
initialize,
|
|
3198
|
+
createSheet,
|
|
3199
|
+
addressToIndex,
|
|
3200
|
+
addressFromIndex,
|
|
3201
|
+
rangeToIndex,
|
|
3202
|
+
rangeFromIndex,
|
|
3203
|
+
compareIndexPositions,
|
|
3204
|
+
ComputeNode,
|
|
3205
|
+
defaultFunctionContextOptions,
|
|
3206
|
+
FunctionContext,
|
|
3207
|
+
AsyncFunctionPlugin,
|
|
3208
|
+
EDGE_FUNCTION_NAME,
|
|
3209
|
+
EdgeFunctionPlugin,
|
|
3210
|
+
EdgeFunctionPluginTranslations,
|
|
3211
|
+
defaultFunctions,
|
|
3212
|
+
createSheetName,
|
|
3213
|
+
parseSheetName,
|
|
3214
|
+
ComputeGraph,
|
|
3215
|
+
defaultOptions,
|
|
3216
|
+
defaultPlugins,
|
|
3217
|
+
ComputeGraphRegistry
|
|
3234
3218
|
};
|
|
3235
|
-
//# sourceMappingURL=chunk-
|
|
3219
|
+
//# sourceMappingURL=chunk-VMSX6Z4X.mjs.map
|