@dxos/plugin-sheet 0.6.12-main.f9d0246 → 0.6.12-staging.0b4bb48
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/{chunk-ZLJ2GRE2.mjs → SheetContainer-U4H5D34A.mjs} +240 -1151
- package/dist/lib/browser/SheetContainer-U4H5D34A.mjs.map +7 -0
- package/dist/lib/browser/chunk-APHOLYUB.mjs +175 -0
- package/dist/lib/browser/chunk-APHOLYUB.mjs.map +7 -0
- package/dist/lib/browser/{chunk-Z2XOOC2R.mjs → chunk-D5AGLXJP.mjs} +678 -385
- package/dist/lib/browser/chunk-D5AGLXJP.mjs.map +7 -0
- package/dist/lib/browser/{chunk-WZMOZKQZ.mjs → chunk-FUAGSXA4.mjs} +16 -9
- package/dist/lib/browser/chunk-FUAGSXA4.mjs.map +7 -0
- package/dist/lib/{node-esm/chunk-IU2L277A.mjs → browser/chunk-JRL5LGCE.mjs} +5 -4
- package/dist/lib/browser/chunk-JRL5LGCE.mjs.map +7 -0
- package/dist/lib/browser/chunk-NU4PBN33.mjs +8 -0
- package/dist/lib/browser/chunk-NU4PBN33.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +60 -74
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/meta.mjs +1 -1
- package/dist/lib/browser/testing.mjs +92 -0
- package/dist/lib/browser/testing.mjs.map +7 -0
- package/dist/lib/browser/types.mjs +6 -4
- package/dist/lib/node/{chunk-6DQABRGJ.cjs → SheetContainer-AXQV3ZT5.cjs} +279 -1182
- package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs.map +7 -0
- package/dist/lib/node/{chunk-P5QYYEHQ.cjs → chunk-5KKJ4NPP.cjs} +676 -388
- package/dist/lib/node/chunk-5KKJ4NPP.cjs.map +7 -0
- package/dist/lib/node/{chunk-BNARJ5GM.cjs → chunk-BJ6ZD7MN.cjs} +18 -5
- package/dist/lib/node/chunk-BJ6ZD7MN.cjs.map +7 -0
- package/dist/lib/node/chunk-CN3RPESU.cjs +202 -0
- package/dist/lib/node/chunk-CN3RPESU.cjs.map +7 -0
- package/dist/lib/node/{chunk-AOP42UAA.cjs → chunk-DSYKOI4E.cjs} +21 -13
- package/dist/lib/node/chunk-DSYKOI4E.cjs.map +7 -0
- package/dist/lib/node/chunk-PYXHNAAK.cjs +40 -0
- package/dist/lib/node/chunk-PYXHNAAK.cjs.map +7 -0
- package/dist/lib/node/index.cjs +66 -86
- package/dist/lib/node/index.cjs.map +3 -3
- 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/testing.cjs +111 -0
- package/dist/lib/node/testing.cjs.map +7 -0
- package/dist/lib/node/types.cjs +12 -10
- package/dist/lib/node/types.cjs.map +2 -2
- package/dist/types/src/SheetPlugin.d.ts.map +1 -1
- package/dist/types/src/components/CellEditor/CellEditor.d.ts +3 -23
- package/dist/types/src/components/CellEditor/CellEditor.d.ts.map +1 -1
- package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts +2 -2
- package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/CellEditor/extension.d.ts +1 -1
- package/dist/types/src/components/CellEditor/extension.d.ts.map +1 -1
- package/dist/types/src/{graph → components/ComputeGraph}/async-function.d.ts +2 -8
- package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +1 -0
- package/dist/types/src/{graph/testing/custom-function.d.ts → components/ComputeGraph/custom.d.ts} +2 -4
- package/dist/types/src/components/ComputeGraph/custom.d.ts.map +1 -0
- package/dist/types/src/components/ComputeGraph/edge-function.d.ts.map +1 -0
- package/dist/types/src/components/ComputeGraph/graph-context.d.ts +12 -0
- package/dist/types/src/components/ComputeGraph/graph-context.d.ts.map +1 -0
- package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts +2 -0
- package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts.map +1 -0
- package/dist/types/src/components/ComputeGraph/graph.d.ts +26 -0
- package/dist/types/src/components/ComputeGraph/graph.d.ts.map +1 -0
- package/dist/types/src/components/ComputeGraph/index.d.ts +3 -1
- package/dist/types/src/components/ComputeGraph/index.d.ts.map +1 -1
- package/dist/types/src/components/Sheet/Sheet.d.ts +1 -1
- package/dist/types/src/components/Sheet/Sheet.d.ts.map +1 -1
- package/dist/types/src/components/Sheet/Sheet.stories.d.ts +6 -5
- package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +1 -1
- package/dist/types/src/components/Sheet/formatting.d.ts +14 -0
- package/dist/types/src/components/Sheet/formatting.d.ts.map +1 -0
- package/dist/types/src/components/Sheet/grid.d.ts +2 -2
- package/dist/types/src/components/Sheet/grid.d.ts.map +1 -1
- package/dist/types/src/components/Sheet/nav.d.ts +3 -3
- package/dist/types/src/components/Sheet/nav.d.ts.map +1 -1
- package/dist/types/src/components/Sheet/sheet-context.d.ts +7 -8
- package/dist/types/src/components/Sheet/sheet-context.d.ts.map +1 -1
- package/dist/types/src/components/SheetContainer.d.ts +3 -2
- package/dist/types/src/components/SheetContainer.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +3 -19
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +13 -18
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +2 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +4 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/{graph/function-defs.d.ts → model/functions.d.ts} +1 -1
- package/dist/types/src/model/functions.d.ts.map +1 -0
- package/dist/types/src/model/index.d.ts +3 -2
- package/dist/types/src/model/index.d.ts.map +1 -1
- package/dist/types/src/model/model.browser.test.d.ts +2 -0
- package/dist/types/src/model/model.browser.test.d.ts.map +1 -0
- package/dist/types/src/model/{sheet-model.d.ts → model.d.ts} +65 -10
- package/dist/types/src/model/model.d.ts.map +1 -0
- package/dist/types/src/{defs → model}/types.d.ts +3 -8
- package/dist/types/src/model/types.d.ts.map +1 -0
- package/dist/types/src/model/types.test.d.ts.map +1 -0
- package/dist/types/src/model/util.d.ts +15 -0
- package/dist/types/src/model/util.d.ts.map +1 -0
- package/dist/types/src/testing.d.ts +9 -0
- package/dist/types/src/testing.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +12 -17
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +5 -86
- package/dist/types/src/types.d.ts.map +1 -1
- package/package.json +41 -48
- package/src/SheetPlugin.tsx +73 -48
- package/src/components/CellEditor/CellEditor.stories.tsx +4 -5
- package/src/components/CellEditor/CellEditor.tsx +9 -59
- package/src/components/CellEditor/extension.test.ts +5 -4
- package/src/components/CellEditor/extension.ts +3 -1
- package/src/{graph → components/ComputeGraph}/async-function.ts +6 -15
- package/src/{graph/testing/custom-function.ts → components/ComputeGraph/custom.ts} +7 -11
- package/src/{graph → components/ComputeGraph}/edge-function.ts +3 -3
- package/src/components/ComputeGraph/graph-context.tsx +50 -0
- package/src/components/ComputeGraph/graph.browser.test.ts +50 -0
- package/src/components/ComputeGraph/graph.ts +62 -0
- package/src/components/ComputeGraph/index.ts +3 -1
- package/src/components/Sheet/Sheet.stories.tsx +88 -52
- package/src/components/Sheet/Sheet.tsx +18 -57
- package/src/{model/formatting-model.ts → components/Sheet/formatting.ts} +13 -20
- package/src/components/Sheet/grid.ts +3 -3
- package/src/components/Sheet/nav.ts +19 -19
- package/src/components/Sheet/sheet-context.tsx +80 -18
- package/src/components/SheetContainer.tsx +19 -73
- package/src/components/Toolbar/Toolbar.tsx +12 -53
- package/src/components/index.ts +0 -1
- package/src/meta.tsx +5 -1
- package/src/model/index.ts +3 -2
- package/src/model/model.browser.test.ts +100 -0
- package/src/model/model.ts +550 -0
- package/src/{defs → model}/types.test.ts +9 -8
- package/src/{defs → model}/types.ts +14 -24
- package/src/model/util.ts +36 -0
- package/src/testing.ts +50 -0
- package/src/translations.ts +1 -6
- package/src/types.ts +6 -31
- package/dist/lib/browser/SheetContainer-VISF3VUB.mjs +0 -261
- package/dist/lib/browser/SheetContainer-VISF3VUB.mjs.map +0 -7
- package/dist/lib/browser/chunk-QILRZNE5.mjs +0 -15
- package/dist/lib/browser/chunk-QILRZNE5.mjs.map +0 -7
- package/dist/lib/browser/chunk-WZMOZKQZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-Z2XOOC2R.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZLJ2GRE2.mjs.map +0 -7
- package/dist/lib/browser/graph-4XFKIHRL.mjs +0 -21
- package/dist/lib/browser/graph-4XFKIHRL.mjs.map +0 -7
- package/dist/lib/node/SheetContainer-2MEALQWW.cjs +0 -279
- package/dist/lib/node/SheetContainer-2MEALQWW.cjs.map +0 -7
- package/dist/lib/node/chunk-6DQABRGJ.cjs.map +0 -7
- package/dist/lib/node/chunk-AOP42UAA.cjs.map +0 -7
- package/dist/lib/node/chunk-BNARJ5GM.cjs.map +0 -7
- package/dist/lib/node/chunk-P5QYYEHQ.cjs.map +0 -7
- package/dist/lib/node/graph-2LRDUXBZ.cjs +0 -43
- package/dist/lib/node/graph-2LRDUXBZ.cjs.map +0 -7
- package/dist/lib/node-esm/SheetContainer-RPSUSXWS.mjs +0 -262
- package/dist/lib/node-esm/SheetContainer-RPSUSXWS.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4MM7THJW.mjs +0 -2944
- package/dist/lib/node-esm/chunk-4MM7THJW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5RLTCIE2.mjs +0 -2684
- package/dist/lib/node-esm/chunk-5RLTCIE2.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IU2L277A.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-RR2AO4SM.mjs +0 -76
- package/dist/lib/node-esm/chunk-RR2AO4SM.mjs.map +0 -7
- package/dist/lib/node-esm/graph-WG5EKOMO.mjs +0 -22
- package/dist/lib/node-esm/graph-WG5EKOMO.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -263
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/meta.mjs +0 -10
- package/dist/lib/node-esm/meta.mjs.map +0 -7
- package/dist/lib/node-esm/types.mjs +0 -21
- package/dist/lib/node-esm/types.mjs.map +0 -7
- package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +0 -11
- package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +0 -1
- package/dist/types/src/components/GridSheet/GridSheet.d.ts +0 -10
- package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +0 -1
- package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +0 -9
- package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +0 -1
- package/dist/types/src/components/GridSheet/util.d.ts +0 -7
- package/dist/types/src/components/GridSheet/util.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/decorations.d.ts +0 -24
- package/dist/types/src/components/Sheet/decorations.d.ts.map +0 -1
- package/dist/types/src/components/Sheet/threads.d.ts +0 -2
- package/dist/types/src/components/Sheet/threads.d.ts.map +0 -1
- package/dist/types/src/defs/index.d.ts +0 -3
- package/dist/types/src/defs/index.d.ts.map +0 -1
- package/dist/types/src/defs/types.d.ts.map +0 -1
- package/dist/types/src/defs/types.test.d.ts.map +0 -1
- package/dist/types/src/defs/util.d.ts +0 -43
- package/dist/types/src/defs/util.d.ts.map +0 -1
- package/dist/types/src/extensions/compute.d.ts +0 -9
- package/dist/types/src/extensions/compute.d.ts.map +0 -1
- package/dist/types/src/extensions/compute.stories.d.ts +0 -26
- package/dist/types/src/extensions/compute.stories.d.ts.map +0 -1
- package/dist/types/src/extensions/index.d.ts +0 -2
- package/dist/types/src/extensions/index.d.ts.map +0 -1
- package/dist/types/src/graph/async-function.d.ts.map +0 -1
- package/dist/types/src/graph/compute-graph.d.ts +0 -84
- package/dist/types/src/graph/compute-graph.d.ts.map +0 -1
- package/dist/types/src/graph/compute-graph.stories.d.ts +0 -10
- package/dist/types/src/graph/compute-graph.stories.d.ts.map +0 -1
- package/dist/types/src/graph/compute-graph.test.d.ts +0 -2
- package/dist/types/src/graph/compute-graph.test.d.ts.map +0 -1
- package/dist/types/src/graph/compute-node.d.ts +0 -26
- package/dist/types/src/graph/compute-node.d.ts.map +0 -1
- package/dist/types/src/graph/edge-function.d.ts.map +0 -1
- package/dist/types/src/graph/function-defs.d.ts.map +0 -1
- package/dist/types/src/graph/hyperformula.test.d.ts +0 -2
- package/dist/types/src/graph/hyperformula.test.d.ts.map +0 -1
- package/dist/types/src/graph/index.d.ts +0 -4
- package/dist/types/src/graph/index.d.ts.map +0 -1
- package/dist/types/src/graph/testing/custom-function.d.ts.map +0 -1
- package/dist/types/src/graph/testing/index.d.ts +0 -2
- package/dist/types/src/graph/testing/index.d.ts.map +0 -1
- package/dist/types/src/graph/util.d.ts +0 -2
- package/dist/types/src/graph/util.d.ts.map +0 -1
- package/dist/types/src/hooks/hooks.stories.d.ts +0 -11
- package/dist/types/src/hooks/hooks.stories.d.ts.map +0 -1
- package/dist/types/src/hooks/index.d.ts +0 -4
- package/dist/types/src/hooks/index.d.ts.map +0 -1
- package/dist/types/src/hooks/useComputeGraph.d.ts +0 -7
- package/dist/types/src/hooks/useComputeGraph.d.ts.map +0 -1
- package/dist/types/src/hooks/useFormattingModel.d.ts +0 -3
- package/dist/types/src/hooks/useFormattingModel.d.ts.map +0 -1
- package/dist/types/src/hooks/useSheetModel.d.ts +0 -8
- package/dist/types/src/hooks/useSheetModel.d.ts.map +0 -1
- package/dist/types/src/model/formatting-model.d.ts +0 -16
- package/dist/types/src/model/formatting-model.d.ts.map +0 -1
- package/dist/types/src/model/sheet-model.d.ts.map +0 -1
- package/dist/types/src/sanity.test.d.ts +0 -2
- package/dist/types/src/sanity.test.d.ts.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -2
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/testing/testing.d.ts +0 -8
- package/dist/types/src/testing/testing.d.ts.map +0 -1
- package/dist/vendor/hyperformula.mjs +0 -37145
- package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +0 -20
- package/src/components/GridSheet/GridSheet.stories.tsx +0 -36
- package/src/components/GridSheet/GridSheet.tsx +0 -153
- package/src/components/GridSheet/util.ts +0 -108
- package/src/components/Sheet/decorations.ts +0 -62
- package/src/components/Sheet/threads.tsx +0 -205
- package/src/defs/index.ts +0 -6
- package/src/defs/util.ts +0 -151
- package/src/extensions/compute.stories.tsx +0 -153
- package/src/extensions/compute.ts +0 -131
- package/src/extensions/index.ts +0 -5
- package/src/graph/compute-graph.stories.tsx +0 -93
- package/src/graph/compute-graph.test.ts +0 -127
- package/src/graph/compute-graph.ts +0 -313
- package/src/graph/compute-node.ts +0 -62
- package/src/graph/hyperformula.test.ts +0 -15
- package/src/graph/index.ts +0 -7
- package/src/graph/testing/index.ts +0 -5
- package/src/graph/util.ts +0 -8
- package/src/hooks/hooks.stories.tsx +0 -50
- package/src/hooks/index.ts +0 -7
- package/src/hooks/useComputeGraph.ts +0 -21
- package/src/hooks/useFormattingModel.ts +0 -11
- package/src/hooks/useSheetModel.ts +0 -40
- package/src/model/sheet-model.ts +0 -414
- package/src/sanity.test.ts +0 -40
- package/src/testing/index.ts +0 -5
- package/src/testing/testing.tsx +0 -68
- /package/dist/types/src/{graph → components/ComputeGraph}/edge-function.d.ts +0 -0
- /package/dist/types/src/{defs → model}/types.test.d.ts +0 -0
- /package/src/{graph/function-defs.ts → model/functions.ts} +0 -0
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ValueTypeEnum
|
|
3
|
+
} from "./chunk-FUAGSXA4.mjs";
|
|
4
|
+
|
|
5
|
+
// packages/plugins/plugin-sheet/src/components/ComputeGraph/graph.ts
|
|
6
|
+
import { HyperFormula } from "hyperformula";
|
|
7
|
+
import { Event } from "@dxos/async";
|
|
7
8
|
import { PublicKey } from "@dxos/keys";
|
|
8
|
-
import { log as
|
|
9
|
-
import { FunctionType as FunctionType2 } from "@dxos/plugin-script/types";
|
|
10
|
-
import { nonNullable as nonNullable2 } from "@dxos/util";
|
|
11
|
-
import { ExportedCellChange, HyperFormula } from "#hyperformula";
|
|
9
|
+
import { log as log2 } from "@dxos/log";
|
|
12
10
|
|
|
13
|
-
// packages/plugins/plugin-sheet/src/
|
|
11
|
+
// packages/plugins/plugin-sheet/src/components/ComputeGraph/async-function.ts
|
|
12
|
+
import { CellError, ErrorType, EmptyValue, FunctionPlugin } from "hyperformula";
|
|
14
13
|
import defaultsDeep from "lodash.defaultsdeep";
|
|
15
14
|
import { debounce } from "@dxos/async";
|
|
16
15
|
import { log } from "@dxos/log";
|
|
17
|
-
|
|
18
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/async-function.ts";
|
|
16
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/components/ComputeGraph/async-function.ts";
|
|
19
17
|
var defaultFunctionContextOptions = {
|
|
20
18
|
defaultTtl: 5e3,
|
|
21
19
|
recalculationDelay: 200,
|
|
@@ -29,7 +27,7 @@ var FunctionContext = class _FunctionContext {
|
|
|
29
27
|
...args
|
|
30
28
|
});
|
|
31
29
|
}
|
|
32
|
-
constructor(_hf, _space, _options) {
|
|
30
|
+
constructor(_hf, _space, onUpdate, _options) {
|
|
33
31
|
this._hf = _hf;
|
|
34
32
|
this._space = _space;
|
|
35
33
|
this._cache = /* @__PURE__ */ new Map();
|
|
@@ -37,9 +35,9 @@ var FunctionContext = class _FunctionContext {
|
|
|
37
35
|
this._subscriptions = /* @__PURE__ */ new Map();
|
|
38
36
|
this._invocations = {};
|
|
39
37
|
this._options = defaultsDeep(_options ?? {}, defaultFunctionContextOptions);
|
|
40
|
-
this._onUpdate = debounce((
|
|
38
|
+
this._onUpdate = debounce(() => {
|
|
41
39
|
this._hf.resumeEvaluation();
|
|
42
|
-
|
|
40
|
+
onUpdate(this);
|
|
43
41
|
}, this._options.recalculationDelay);
|
|
44
42
|
}
|
|
45
43
|
get space() {
|
|
@@ -90,21 +88,18 @@ var FunctionContext = class _FunctionContext {
|
|
|
90
88
|
value: value2
|
|
91
89
|
}, {
|
|
92
90
|
F: __dxlog_file,
|
|
93
|
-
L:
|
|
91
|
+
L: 136,
|
|
94
92
|
S: this,
|
|
95
93
|
C: (f, a) => f(...a)
|
|
96
94
|
});
|
|
97
|
-
this._onUpdate(
|
|
98
|
-
name,
|
|
99
|
-
cell
|
|
100
|
-
});
|
|
95
|
+
this._onUpdate();
|
|
101
96
|
} catch (err) {
|
|
102
97
|
log.warn("failed", {
|
|
103
98
|
cell,
|
|
104
99
|
err
|
|
105
100
|
}, {
|
|
106
101
|
F: __dxlog_file,
|
|
107
|
-
L:
|
|
102
|
+
L: 140,
|
|
108
103
|
S: this,
|
|
109
104
|
C: (f, a) => f(...a)
|
|
110
105
|
});
|
|
@@ -124,7 +119,7 @@ var FunctionContext = class _FunctionContext {
|
|
|
124
119
|
cache: value
|
|
125
120
|
}, {
|
|
126
121
|
F: __dxlog_file,
|
|
127
|
-
L:
|
|
122
|
+
L: 148,
|
|
128
123
|
S: this,
|
|
129
124
|
C: (f, a) => f(...a)
|
|
130
125
|
});
|
|
@@ -144,170 +139,53 @@ var FunctionPluginAsync = class extends FunctionPlugin {
|
|
|
144
139
|
}
|
|
145
140
|
};
|
|
146
141
|
|
|
147
|
-
// packages/plugins/plugin-sheet/src/graph
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
142
|
+
// packages/plugins/plugin-sheet/src/components/ComputeGraph/graph.ts
|
|
143
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/components/ComputeGraph/graph.ts";
|
|
144
|
+
var createComputeGraph = (functionPlugins = [], space, options) => {
|
|
145
|
+
functionPlugins.forEach(({ plugin, translations }) => {
|
|
146
|
+
HyperFormula.registerFunctionPlugin(plugin, translations);
|
|
147
|
+
});
|
|
148
|
+
const hf = HyperFormula.buildEmpty({
|
|
149
|
+
licenseKey: "gpl-v3"
|
|
150
|
+
});
|
|
151
|
+
return new ComputeGraph(hf, space, options);
|
|
152
|
+
};
|
|
153
|
+
var ComputeGraph = class {
|
|
154
|
+
constructor(hf, _space, _options) {
|
|
155
|
+
this.hf = hf;
|
|
156
|
+
this._space = _space;
|
|
157
|
+
this._options = _options;
|
|
158
|
+
this.id = `graph-${PublicKey.random().truncate()}`;
|
|
156
159
|
this.update = new Event();
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
this._graph.hf.clearSheet(this.sheetId);
|
|
163
|
-
}
|
|
164
|
-
getValue(cell) {
|
|
165
|
-
const value = this._graph.hf.getCellValue({
|
|
166
|
-
sheet: this.sheetId,
|
|
167
|
-
row: cell.row,
|
|
168
|
-
col: cell.col
|
|
160
|
+
this.context = new FunctionContext(this.hf, this._space, () => {
|
|
161
|
+
this.refresh();
|
|
162
|
+
}, this._options);
|
|
163
|
+
this.hf.updateConfig({
|
|
164
|
+
context: this.context
|
|
169
165
|
});
|
|
170
|
-
if (value instanceof DetailedCellError) {
|
|
171
|
-
return null;
|
|
172
|
-
}
|
|
173
|
-
return value;
|
|
174
166
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
mappedValue
|
|
184
|
-
]
|
|
185
|
-
]);
|
|
186
|
-
}
|
|
187
|
-
async _open() {
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
// packages/plugins/plugin-sheet/src/graph/edge-function.ts
|
|
192
|
-
import { effect } from "@preact/signals-core";
|
|
193
|
-
import { Filter, getMeta } from "@dxos/client/echo";
|
|
194
|
-
import { log as log2 } from "@dxos/log";
|
|
195
|
-
import { getUserFunctionUrlInMetadata } from "@dxos/plugin-script/edge";
|
|
196
|
-
import { FunctionType } from "@dxos/plugin-script/types";
|
|
197
|
-
import { nonNullable } from "@dxos/util";
|
|
198
|
-
import { CellError as CellError2, ErrorType as ErrorType2, FunctionArgumentType } from "#hyperformula";
|
|
199
|
-
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/edge-function.ts";
|
|
200
|
-
var EDGE_FUNCTION_TTL = 1e4;
|
|
201
|
-
var EdgeFunctionPlugin = class extends FunctionPluginAsync {
|
|
202
|
-
edge(ast, state) {
|
|
203
|
-
const handler = (subscribe = false) => async (binding, ...args) => {
|
|
204
|
-
const space = this.context.space;
|
|
205
|
-
if (!space) {
|
|
206
|
-
return new CellError2(ErrorType2.REF, "Missing space");
|
|
207
|
-
}
|
|
208
|
-
const { objects: [fn] } = await space.db.query(Filter.schema(FunctionType, {
|
|
209
|
-
binding
|
|
210
|
-
})).run();
|
|
211
|
-
if (!fn) {
|
|
212
|
-
log2.info("Function not found", {
|
|
213
|
-
binding
|
|
214
|
-
}, {
|
|
215
|
-
F: __dxlog_file2,
|
|
216
|
-
L: 39,
|
|
217
|
-
S: this,
|
|
218
|
-
C: (f, a) => f(...a)
|
|
219
|
-
});
|
|
220
|
-
return new CellError2(ErrorType2.REF, "Function not found");
|
|
221
|
-
}
|
|
222
|
-
if (subscribe) {
|
|
223
|
-
const unsubscribe = effect(() => {
|
|
224
|
-
log2.info("function changed", {
|
|
225
|
-
fn
|
|
226
|
-
}, {
|
|
227
|
-
F: __dxlog_file2,
|
|
228
|
-
L: 45,
|
|
229
|
-
S: this,
|
|
230
|
-
C: (f, a) => f(...a)
|
|
231
|
-
});
|
|
232
|
-
const _ = fn?.version;
|
|
233
|
-
this.runAsyncFunction(ast, state, handler(false), {
|
|
234
|
-
ttl: EDGE_FUNCTION_TTL
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
this.context.createSubscription(ast.procedureName, unsubscribe);
|
|
238
|
-
}
|
|
239
|
-
const path = getUserFunctionUrlInMetadata(getMeta(fn));
|
|
240
|
-
const result = await fetch(`${this.context.remoteFunctionUrl}${path}`, {
|
|
241
|
-
method: "POST",
|
|
242
|
-
headers: {
|
|
243
|
-
"Content-Type": "application/json"
|
|
244
|
-
},
|
|
245
|
-
body: JSON.stringify({
|
|
246
|
-
args: args.filter(nonNullable)
|
|
247
|
-
})
|
|
248
|
-
});
|
|
249
|
-
return await result.text();
|
|
250
|
-
};
|
|
251
|
-
return this.runAsyncFunction(ast, state, handler(true), {
|
|
252
|
-
ttl: EDGE_FUNCTION_TTL
|
|
167
|
+
refresh() {
|
|
168
|
+
log2("refresh", {
|
|
169
|
+
id: this.id
|
|
170
|
+
}, {
|
|
171
|
+
F: __dxlog_file2,
|
|
172
|
+
L: 59,
|
|
173
|
+
S: this,
|
|
174
|
+
C: (f, a) => f(...a)
|
|
253
175
|
});
|
|
176
|
+
this.update.emit();
|
|
254
177
|
}
|
|
255
178
|
};
|
|
256
|
-
EdgeFunctionPlugin.implementedFunctions = {
|
|
257
|
-
EDGE: {
|
|
258
|
-
method: "edge",
|
|
259
|
-
parameters: [
|
|
260
|
-
// Binding
|
|
261
|
-
{
|
|
262
|
-
argumentType: FunctionArgumentType.STRING
|
|
263
|
-
},
|
|
264
|
-
// Remote function arguments (currently supporting up to 8).
|
|
265
|
-
{
|
|
266
|
-
argumentType: FunctionArgumentType.ANY,
|
|
267
|
-
optionalArg: true
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
argumentType: FunctionArgumentType.ANY,
|
|
271
|
-
optionalArg: true
|
|
272
|
-
},
|
|
273
|
-
{
|
|
274
|
-
argumentType: FunctionArgumentType.ANY,
|
|
275
|
-
optionalArg: true
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
argumentType: FunctionArgumentType.ANY,
|
|
279
|
-
optionalArg: true
|
|
280
|
-
},
|
|
281
|
-
{
|
|
282
|
-
argumentType: FunctionArgumentType.ANY,
|
|
283
|
-
optionalArg: true
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
argumentType: FunctionArgumentType.ANY,
|
|
287
|
-
optionalArg: true
|
|
288
|
-
},
|
|
289
|
-
{
|
|
290
|
-
argumentType: FunctionArgumentType.ANY,
|
|
291
|
-
optionalArg: true
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
argumentType: FunctionArgumentType.ANY,
|
|
295
|
-
optionalArg: true
|
|
296
|
-
}
|
|
297
|
-
],
|
|
298
|
-
isVolatile: true
|
|
299
|
-
}
|
|
300
|
-
};
|
|
301
|
-
var EdgeFunctionPluginTranslations = {
|
|
302
|
-
enGB: {
|
|
303
|
-
EDGE: "EDGE"
|
|
304
|
-
},
|
|
305
|
-
enUS: {
|
|
306
|
-
EDGE: "EDGE"
|
|
307
|
-
}
|
|
308
|
-
};
|
|
309
179
|
|
|
310
|
-
// packages/plugins/plugin-sheet/src/
|
|
180
|
+
// packages/plugins/plugin-sheet/src/model/model.ts
|
|
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
|
|
311
189
|
var defaultFunctions = [
|
|
312
190
|
// Array
|
|
313
191
|
{
|
|
@@ -2681,262 +2559,677 @@ var defaultFunctions = [
|
|
|
2681
2559
|
}
|
|
2682
2560
|
];
|
|
2683
2561
|
|
|
2684
|
-
// packages/plugins/plugin-sheet/src/
|
|
2685
|
-
|
|
2686
|
-
var
|
|
2687
|
-
var
|
|
2688
|
-
var
|
|
2689
|
-
|
|
2562
|
+
// packages/plugins/plugin-sheet/src/model/types.ts
|
|
2563
|
+
import { invariant } from "@dxos/invariant";
|
|
2564
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/model/types.ts";
|
|
2565
|
+
var MAX_COLUMNS = 26 * 26;
|
|
2566
|
+
var posEquals = (a, b) => {
|
|
2567
|
+
return a?.column === b?.column && a?.row === b?.row;
|
|
2690
2568
|
};
|
|
2691
|
-
var
|
|
2692
|
-
{
|
|
2693
|
-
|
|
2694
|
-
|
|
2569
|
+
var columnLetter = (column) => {
|
|
2570
|
+
invariant(column < MAX_COLUMNS, `Invalid column: ${column}`, {
|
|
2571
|
+
F: __dxlog_file3,
|
|
2572
|
+
L: 17,
|
|
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
|
|
2598
|
+
};
|
|
2599
|
+
};
|
|
2600
|
+
var rangeToA1Notation = (range) => {
|
|
2601
|
+
return [
|
|
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;
|
|
2695
2609
|
}
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2699
|
-
var getSheetId = (name) => name.startsWith(PREFIX) ? name.slice(PREFIX.length) : void 0;
|
|
2700
|
-
var ComputeGraphRegistry = class extends Resource2 {
|
|
2701
|
-
constructor(options = {
|
|
2702
|
-
plugins: defaultPlugins
|
|
2703
|
-
}) {
|
|
2704
|
-
super();
|
|
2705
|
-
this._graphs = /* @__PURE__ */ new Map();
|
|
2706
|
-
this._options = defaultsDeep2({}, options, defaultOptions);
|
|
2707
|
-
this._options.plugins?.forEach(({ plugin, translations }) => {
|
|
2708
|
-
HyperFormula.registerFunctionPlugin(plugin, translations);
|
|
2709
|
-
});
|
|
2610
|
+
const { from, to } = range;
|
|
2611
|
+
if (from && posEquals(from, cell) || to && posEquals(to, cell)) {
|
|
2612
|
+
return true;
|
|
2710
2613
|
}
|
|
2711
|
-
|
|
2712
|
-
return
|
|
2713
|
-
}
|
|
2714
|
-
async getOrCreateGraph(space) {
|
|
2715
|
-
let graph = this.getGraph(space.id);
|
|
2716
|
-
if (!graph) {
|
|
2717
|
-
log3.info("create graph", {
|
|
2718
|
-
space: space.id
|
|
2719
|
-
}, {
|
|
2720
|
-
F: __dxlog_file3,
|
|
2721
|
-
L: 93,
|
|
2722
|
-
S: this,
|
|
2723
|
-
C: (f, a) => f(...a)
|
|
2724
|
-
});
|
|
2725
|
-
graph = await this.createGraph(space);
|
|
2726
|
-
}
|
|
2727
|
-
return graph;
|
|
2728
|
-
}
|
|
2729
|
-
async createGraph(space) {
|
|
2730
|
-
invariant(!this._graphs.has(space.id), `ComputeGraph already exists for space: ${space.id}`, {
|
|
2731
|
-
F: __dxlog_file3,
|
|
2732
|
-
L: 101,
|
|
2733
|
-
S: this,
|
|
2734
|
-
A: [
|
|
2735
|
-
"!this._graphs.has(space.id)",
|
|
2736
|
-
"`ComputeGraph already exists for space: ${space.id}`"
|
|
2737
|
-
]
|
|
2738
|
-
});
|
|
2739
|
-
const hf = HyperFormula.buildEmpty(this._options);
|
|
2740
|
-
const graph = new ComputeGraph(hf, space, this._options);
|
|
2741
|
-
this._graphs.set(space.id, graph);
|
|
2742
|
-
await graph.open();
|
|
2743
|
-
return graph;
|
|
2744
|
-
}
|
|
2745
|
-
async _close() {
|
|
2746
|
-
for (const graph of this._graphs.values()) {
|
|
2747
|
-
await graph.close();
|
|
2748
|
-
}
|
|
2614
|
+
if (!from || !to) {
|
|
2615
|
+
return false;
|
|
2749
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;
|
|
2750
2625
|
};
|
|
2751
|
-
|
|
2752
|
-
|
|
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) {
|
|
2753
2635
|
super();
|
|
2754
|
-
|
|
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;
|
|
2755
2687
|
this._space = _space;
|
|
2756
|
-
this.
|
|
2757
|
-
this.
|
|
2758
|
-
this._nodes = /* @__PURE__ */ new Map();
|
|
2688
|
+
this.id = `model-${PublicKey2.random().truncate()}`;
|
|
2689
|
+
this._ctx = void 0;
|
|
2759
2690
|
this._functions = [];
|
|
2760
2691
|
this.update = new Event2();
|
|
2761
|
-
|
|
2762
|
-
this.
|
|
2763
|
-
|
|
2764
|
-
}
|
|
2765
|
-
|
|
2766
|
-
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
const node = this._nodes.get(sheet);
|
|
2770
|
-
if (node) {
|
|
2771
|
-
node.update.emit({
|
|
2772
|
-
type: "valuesUpdated",
|
|
2773
|
-
change
|
|
2774
|
-
});
|
|
2775
|
-
}
|
|
2776
|
-
}
|
|
2777
|
-
}
|
|
2692
|
+
const name = this._sheet.id;
|
|
2693
|
+
if (!this._graph.hf.doesSheetExist(name)) {
|
|
2694
|
+
this._graph.hf.addSheet(name);
|
|
2695
|
+
}
|
|
2696
|
+
this._sheetId = this._graph.hf.getSheetId(name);
|
|
2697
|
+
this._options = {
|
|
2698
|
+
...defaultOptions,
|
|
2699
|
+
...options
|
|
2778
2700
|
};
|
|
2779
|
-
this.
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
2785
|
-
|
|
2786
|
-
|
|
2787
|
-
|
|
2788
|
-
|
|
2789
|
-
|
|
2790
|
-
|
|
2791
|
-
|
|
2792
|
-
|
|
2701
|
+
this.reset();
|
|
2702
|
+
}
|
|
2703
|
+
get graph() {
|
|
2704
|
+
return this._graph;
|
|
2705
|
+
}
|
|
2706
|
+
get sheet() {
|
|
2707
|
+
return this._sheet;
|
|
2708
|
+
}
|
|
2709
|
+
get readonly() {
|
|
2710
|
+
return this._options.readonly;
|
|
2711
|
+
}
|
|
2712
|
+
get bounds() {
|
|
2713
|
+
return {
|
|
2714
|
+
rows: this._sheet.rows.length,
|
|
2715
|
+
columns: this._sheet.columns.length
|
|
2716
|
+
};
|
|
2717
|
+
}
|
|
2718
|
+
get functions() {
|
|
2719
|
+
const hfFunctions = this._graph.hf.getRegisteredFunctionNames().map((name) => defaultFunctions.find((fn) => fn.name === name) ?? {
|
|
2720
|
+
name
|
|
2721
|
+
});
|
|
2722
|
+
const echoFunctions = this._functions.map((fn) => ({
|
|
2723
|
+
name: fn.binding
|
|
2724
|
+
}));
|
|
2793
2725
|
return [
|
|
2794
|
-
...
|
|
2795
|
-
|
|
2796
|
-
}) : [],
|
|
2797
|
-
...echo ? this._functions.map((fn) => ({
|
|
2798
|
-
name: fn.binding
|
|
2799
|
-
})) : []
|
|
2726
|
+
...hfFunctions,
|
|
2727
|
+
...echoFunctions
|
|
2800
2728
|
];
|
|
2801
2729
|
}
|
|
2730
|
+
get initialized() {
|
|
2731
|
+
return !!this._ctx;
|
|
2732
|
+
}
|
|
2802
2733
|
/**
|
|
2803
|
-
*
|
|
2734
|
+
* Initialize sheet and engine.
|
|
2804
2735
|
*/
|
|
2805
|
-
|
|
2806
|
-
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
|
|
2811
|
-
|
|
2812
|
-
|
|
2813
|
-
|
|
2736
|
+
async initialize() {
|
|
2737
|
+
log3("initialize", {
|
|
2738
|
+
id: this.id
|
|
2739
|
+
}, {
|
|
2740
|
+
F: __dxlog_file4,
|
|
2741
|
+
L: 142,
|
|
2742
|
+
S: this,
|
|
2743
|
+
C: (f, a) => f(...a)
|
|
2744
|
+
});
|
|
2745
|
+
invariant2(!this.initialized, "Already initialized.", {
|
|
2746
|
+
F: __dxlog_file4,
|
|
2747
|
+
L: 143,
|
|
2814
2748
|
S: this,
|
|
2815
2749
|
A: [
|
|
2816
|
-
"
|
|
2817
|
-
""
|
|
2750
|
+
"!this.initialized",
|
|
2751
|
+
"'Already initialized.'"
|
|
2818
2752
|
]
|
|
2819
2753
|
});
|
|
2820
|
-
|
|
2821
|
-
|
|
2822
|
-
|
|
2823
|
-
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
|
|
2827
|
-
|
|
2828
|
-
|
|
2754
|
+
this._ctx = new Context(void 0, {
|
|
2755
|
+
F: __dxlog_file4,
|
|
2756
|
+
L: 144
|
|
2757
|
+
});
|
|
2758
|
+
if (!this._sheet.rows.length) {
|
|
2759
|
+
this._insertIndices(this._sheet.rows, 0, this._options.rows, DEFAULT_ROWS);
|
|
2760
|
+
}
|
|
2761
|
+
if (!this._sheet.columns.length) {
|
|
2762
|
+
this._insertIndices(this._sheet.columns, 0, this._options.columns, DEFAULT_COLUMNS);
|
|
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();
|
|
2829
2774
|
});
|
|
2830
|
-
this.
|
|
2775
|
+
this._ctx.onDispose(unsubscribe2);
|
|
2831
2776
|
}
|
|
2832
|
-
|
|
2833
|
-
|
|
2834
|
-
|
|
2835
|
-
|
|
2777
|
+
return this;
|
|
2778
|
+
}
|
|
2779
|
+
async destroy() {
|
|
2780
|
+
log3("destroy", {
|
|
2781
|
+
id: this.id
|
|
2782
|
+
}, {
|
|
2783
|
+
F: __dxlog_file4,
|
|
2784
|
+
L: 174,
|
|
2836
2785
|
S: this,
|
|
2837
|
-
|
|
2838
|
-
|
|
2839
|
-
|
|
2786
|
+
C: (f, a) => f(...a)
|
|
2787
|
+
});
|
|
2788
|
+
if (this._ctx) {
|
|
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
|
|
2840
2957
|
]
|
|
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);
|
|
2841
2977
|
});
|
|
2842
|
-
const node = new ComputeNode(this, sheetId);
|
|
2843
|
-
await node.open();
|
|
2844
|
-
this._nodes.set(sheetId, node);
|
|
2845
|
-
return node;
|
|
2846
2978
|
}
|
|
2847
2979
|
/**
|
|
2848
|
-
*
|
|
2849
|
-
* E.g., "HELLO(...args)" => "EDGE("HELLO", ...args)".
|
|
2980
|
+
* Iterate range.
|
|
2850
2981
|
*/
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2982
|
+
_iterRange(range, cb) {
|
|
2983
|
+
const to = range.to ?? range.from;
|
|
2984
|
+
const rowRange = [
|
|
2985
|
+
Math.min(range.from.row, to.row),
|
|
2986
|
+
Math.max(range.from.row, to.row)
|
|
2987
|
+
];
|
|
2988
|
+
const columnRange = [
|
|
2989
|
+
Math.min(range.from.column, to.column),
|
|
2990
|
+
Math.max(range.from.column, to.column)
|
|
2991
|
+
];
|
|
2992
|
+
const rows = [];
|
|
2993
|
+
for (let row = rowRange[0]; row <= rowRange[1]; row++) {
|
|
2994
|
+
const rowCells = [];
|
|
2995
|
+
for (let column = columnRange[0]; column <= columnRange[1]; column++) {
|
|
2996
|
+
const value = cb({
|
|
2997
|
+
row,
|
|
2998
|
+
column
|
|
2999
|
+
});
|
|
3000
|
+
if (value !== void 0) {
|
|
3001
|
+
rowCells.push(value);
|
|
2862
3002
|
}
|
|
2863
3003
|
}
|
|
2864
|
-
|
|
2865
|
-
}
|
|
3004
|
+
rows.push(rowCells);
|
|
3005
|
+
}
|
|
3006
|
+
return rows;
|
|
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) => {
|
|
2866
3070
|
const fn = this._functions.find((fn2) => fn2.binding === binding);
|
|
2867
3071
|
if (!fn) {
|
|
2868
3072
|
return match;
|
|
2869
3073
|
}
|
|
2870
3074
|
if (args.trim() === "") {
|
|
2871
|
-
return
|
|
2872
|
-
} else {
|
|
2873
|
-
return `${CUSTOM_FUNCTION}("${binding}", ${args})`;
|
|
3075
|
+
return `EDGE("${binding}")`;
|
|
2874
3076
|
}
|
|
3077
|
+
return `EDGE("${binding}", ${args})`;
|
|
2875
3078
|
});
|
|
2876
3079
|
}
|
|
2877
3080
|
/**
|
|
2878
|
-
*
|
|
2879
|
-
* E.g., HELLO() => spaceId:objectId()
|
|
3081
|
+
* E.g., "EDGE("HELLO")" => "HELLO()".
|
|
2880
3082
|
*/
|
|
2881
|
-
|
|
2882
|
-
return formula.replace(/(
|
|
2883
|
-
if (
|
|
2884
|
-
return
|
|
2885
|
-
}
|
|
2886
|
-
const fn = this._functions.find((fn2) => fn2.binding === binding);
|
|
2887
|
-
if (fn) {
|
|
2888
|
-
const id = fullyQualifiedId(fn);
|
|
2889
|
-
return `${id}(${args})`;
|
|
2890
|
-
} else {
|
|
2891
|
-
return match;
|
|
3083
|
+
mapFormulaBindingFromFormula(formula) {
|
|
3084
|
+
return formula.replace(/EDGE\("([a-zA-Z0-9]+)"(.*)\)/, (_match, binding, args) => {
|
|
3085
|
+
if (args.trim() === "") {
|
|
3086
|
+
return `${binding}()`;
|
|
2892
3087
|
}
|
|
3088
|
+
return `${binding}(${args.slice(2)})`;
|
|
2893
3089
|
});
|
|
2894
3090
|
}
|
|
2895
3091
|
/**
|
|
2896
|
-
* Map from fully qualified ECHO ID
|
|
2897
|
-
* E.g., spaceId:objectId() => HELLO()
|
|
3092
|
+
* Map from binding to fully qualified ECHO ID.
|
|
2898
3093
|
*/
|
|
2899
|
-
|
|
2900
|
-
return
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
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
|
+
});
|
|
3119
|
+
}
|
|
3120
|
+
/**
|
|
3121
|
+
* Map from indices to A1 notation.
|
|
3122
|
+
*/
|
|
3123
|
+
mapFormulaIndicesToRefs(formula) {
|
|
3124
|
+
invariant2(formula.charAt(0) === "=", void 0, {
|
|
3125
|
+
F: __dxlog_file4,
|
|
3126
|
+
L: 519,
|
|
3127
|
+
S: this,
|
|
3128
|
+
A: [
|
|
3129
|
+
"formula.charAt(0) === '='",
|
|
3130
|
+
""
|
|
3131
|
+
]
|
|
3132
|
+
});
|
|
3133
|
+
return formula.replace(/([a-zA-Z0-9]+)@([a-zA-Z0-9]+)/g, (idx) => {
|
|
3134
|
+
return addressToA1Notation(this.addressFromIndex(idx));
|
|
3135
|
+
});
|
|
3136
|
+
}
|
|
3137
|
+
//
|
|
3138
|
+
// Values
|
|
3139
|
+
//
|
|
3140
|
+
/**
|
|
3141
|
+
* https://hyperformula.handsontable.com/guide/date-and-time-handling.html#example
|
|
3142
|
+
* https://hyperformula.handsontable.com/api/interfaces/configparams.html#nulldate
|
|
3143
|
+
* NOTE: TODAY() is number of FULL days since nullDate. It will typically be -1 days from NOW().
|
|
3144
|
+
*/
|
|
3145
|
+
toLocalDate(num) {
|
|
3146
|
+
const { year, month, day, hours, minutes, seconds } = this.toDateTime(num);
|
|
3147
|
+
return new Date(year, month - 1, day, hours, minutes, seconds);
|
|
3148
|
+
}
|
|
3149
|
+
toDateTime(num) {
|
|
3150
|
+
return this._graph.hf.numberToDateTime(num);
|
|
3151
|
+
}
|
|
3152
|
+
toDate(num) {
|
|
3153
|
+
return this._graph.hf.numberToDate(num);
|
|
3154
|
+
}
|
|
3155
|
+
toTime(num) {
|
|
3156
|
+
return this._graph.hf.numberToTime(num);
|
|
3157
|
+
}
|
|
3158
|
+
};
|
|
3159
|
+
|
|
3160
|
+
// packages/plugins/plugin-sheet/src/components/ComputeGraph/custom.ts
|
|
3161
|
+
import { FunctionArgumentType } from "hyperformula";
|
|
3162
|
+
import { getDeep } from "@dxos/util";
|
|
3163
|
+
var parseNumberString = (str) => {
|
|
3164
|
+
return parseFloat(str.replace(/[^\d.]/g, ""));
|
|
3165
|
+
};
|
|
3166
|
+
var CustomPlugin = class extends FunctionPluginAsync {
|
|
3167
|
+
test(ast, state) {
|
|
3168
|
+
const handler = async () => {
|
|
3169
|
+
return Math.random();
|
|
3170
|
+
};
|
|
3171
|
+
return this.runAsyncFunction(ast, state, handler);
|
|
3172
|
+
}
|
|
3173
|
+
crypto(ast, state) {
|
|
3174
|
+
const handler = async (_currency) => {
|
|
3175
|
+
const currency = (_currency || "USD").toUpperCase();
|
|
3176
|
+
const result = await fetch(`https://api.coindesk.com/v1/bpi/currentprice/${currency}.json`);
|
|
3177
|
+
const data = await result.json();
|
|
3178
|
+
const rate = getDeep(data, [
|
|
3179
|
+
"bpi",
|
|
3180
|
+
currency,
|
|
3181
|
+
"rate"
|
|
3182
|
+
]);
|
|
3183
|
+
if (!rate) {
|
|
3184
|
+
return NaN;
|
|
2910
3185
|
}
|
|
3186
|
+
return parseNumberString(rate);
|
|
3187
|
+
};
|
|
3188
|
+
return this.runAsyncFunction(ast, state, handler, {
|
|
3189
|
+
ttl: 1e4
|
|
2911
3190
|
});
|
|
2912
3191
|
}
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
|
|
2918
|
-
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
|
|
2922
|
-
|
|
2923
|
-
|
|
3192
|
+
};
|
|
3193
|
+
CustomPlugin.implementedFunctions = {
|
|
3194
|
+
TEST: {
|
|
3195
|
+
method: "test",
|
|
3196
|
+
parameters: [],
|
|
3197
|
+
isVolatile: true
|
|
3198
|
+
},
|
|
3199
|
+
CRYPTO: {
|
|
3200
|
+
method: "crypto",
|
|
3201
|
+
parameters: [
|
|
3202
|
+
{
|
|
3203
|
+
argumentType: FunctionArgumentType.STRING,
|
|
3204
|
+
optionalArg: true
|
|
3205
|
+
}
|
|
3206
|
+
],
|
|
3207
|
+
isVolatile: true
|
|
2924
3208
|
}
|
|
2925
|
-
|
|
2926
|
-
|
|
2927
|
-
|
|
2928
|
-
|
|
3209
|
+
};
|
|
3210
|
+
var CustomPluginTranslations = {
|
|
3211
|
+
enGB: {
|
|
3212
|
+
TEST: "TEST",
|
|
3213
|
+
CRYPTO: "CRYPTO"
|
|
3214
|
+
},
|
|
3215
|
+
enUS: {
|
|
3216
|
+
TEST: "TEST",
|
|
3217
|
+
CRYPTO: "CRYPTO"
|
|
2929
3218
|
}
|
|
2930
3219
|
};
|
|
2931
3220
|
|
|
2932
3221
|
export {
|
|
2933
|
-
|
|
3222
|
+
FunctionPluginAsync,
|
|
3223
|
+
CustomPlugin,
|
|
3224
|
+
CustomPluginTranslations,
|
|
3225
|
+
createComputeGraph,
|
|
2934
3226
|
defaultFunctions,
|
|
2935
|
-
|
|
2936
|
-
|
|
2937
|
-
|
|
2938
|
-
|
|
2939
|
-
|
|
2940
|
-
|
|
3227
|
+
posEquals,
|
|
3228
|
+
columnLetter,
|
|
3229
|
+
addressToA1Notation,
|
|
3230
|
+
addressFromA1Notation,
|
|
3231
|
+
rangeToA1Notation,
|
|
3232
|
+
inRange,
|
|
3233
|
+
SheetModel
|
|
2941
3234
|
};
|
|
2942
|
-
//# sourceMappingURL=chunk-
|
|
3235
|
+
//# sourceMappingURL=chunk-D5AGLXJP.mjs.map
|