@dxos/plugin-sheet 0.6.11 → 0.6.12-main.5a87ad5
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-VISF3VUB.mjs +261 -0
- package/dist/lib/browser/SheetContainer-VISF3VUB.mjs.map +7 -0
- package/dist/lib/browser/{chunk-JRL5LGCE.mjs → chunk-QILRZNE5.mjs} +2 -5
- package/dist/lib/browser/chunk-QILRZNE5.mjs.map +7 -0
- package/dist/lib/browser/{chunk-FUAGSXA4.mjs → chunk-WZMOZKQZ.mjs} +9 -16
- package/dist/lib/browser/chunk-WZMOZKQZ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-D5AGLXJP.mjs → chunk-Z2XOOC2R.mjs} +385 -678
- package/dist/lib/browser/chunk-Z2XOOC2R.mjs.map +7 -0
- package/dist/lib/browser/{SheetContainer-U4H5D34A.mjs → chunk-ZLJ2GRE2.mjs} +1151 -240
- package/dist/lib/browser/chunk-ZLJ2GRE2.mjs.map +7 -0
- package/dist/lib/browser/graph-4XFKIHRL.mjs +21 -0
- package/dist/lib/browser/graph-4XFKIHRL.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +74 -60
- 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/types.mjs +4 -6
- package/dist/lib/node/SheetContainer-2MEALQWW.cjs +279 -0
- package/dist/lib/node/SheetContainer-2MEALQWW.cjs.map +7 -0
- package/dist/lib/node/{SheetContainer-AXQV3ZT5.cjs → chunk-6DQABRGJ.cjs} +1182 -279
- package/dist/lib/node/chunk-6DQABRGJ.cjs.map +7 -0
- package/dist/lib/node/{chunk-DSYKOI4E.cjs → chunk-AOP42UAA.cjs} +13 -21
- package/dist/lib/node/chunk-AOP42UAA.cjs.map +7 -0
- package/dist/lib/node/{chunk-BJ6ZD7MN.cjs → chunk-BNARJ5GM.cjs} +5 -18
- package/dist/lib/node/chunk-BNARJ5GM.cjs.map +7 -0
- package/dist/lib/node/{chunk-5KKJ4NPP.cjs → chunk-P5QYYEHQ.cjs} +388 -676
- package/dist/lib/node/chunk-P5QYYEHQ.cjs.map +7 -0
- package/dist/lib/node/graph-2LRDUXBZ.cjs +43 -0
- package/dist/lib/node/graph-2LRDUXBZ.cjs.map +7 -0
- package/dist/lib/node/index.cjs +86 -66
- 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/types.cjs +10 -12
- package/dist/lib/node/types.cjs.map +2 -2
- package/dist/lib/node-esm/SheetContainer-RPSUSXWS.mjs +262 -0
- package/dist/lib/node-esm/SheetContainer-RPSUSXWS.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-4MM7THJW.mjs +2944 -0
- package/dist/lib/node-esm/chunk-4MM7THJW.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-5RLTCIE2.mjs +2684 -0
- package/dist/lib/node-esm/chunk-5RLTCIE2.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-IU2L277A.mjs +17 -0
- package/dist/lib/node-esm/chunk-IU2L277A.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-RR2AO4SM.mjs +76 -0
- package/dist/lib/node-esm/chunk-RR2AO4SM.mjs.map +7 -0
- package/dist/lib/node-esm/graph-WG5EKOMO.mjs +22 -0
- package/dist/lib/node-esm/graph-WG5EKOMO.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +263 -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 +21 -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/CellEditor/CellEditor.d.ts +23 -3
- 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/components/ComputeGraph/ComputeGraphContextProvider.d.ts +11 -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/GridSheet/GridSheet.d.ts +10 -0
- package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -0
- package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +9 -0
- package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -0
- package/dist/types/src/components/GridSheet/util.d.ts +7 -0
- package/dist/types/src/components/GridSheet/util.d.ts.map +1 -0
- 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 +5 -6
- package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +1 -1
- package/dist/types/src/components/Sheet/decorations.d.ts +24 -0
- package/dist/types/src/components/Sheet/decorations.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 +8 -7
- package/dist/types/src/components/Sheet/sheet-context.d.ts.map +1 -1
- package/dist/types/src/components/Sheet/threads.d.ts +2 -0
- package/dist/types/src/components/Sheet/threads.d.ts.map +1 -0
- package/dist/types/src/components/SheetContainer.d.ts +2 -3
- package/dist/types/src/components/SheetContainer.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +19 -3
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +18 -13
- 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/defs/index.d.ts +3 -0
- package/dist/types/src/defs/index.d.ts.map +1 -0
- package/dist/types/src/{model → defs}/types.d.ts +8 -3
- 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 +43 -0
- package/dist/types/src/defs/util.d.ts.map +1 -0
- package/dist/types/src/extensions/compute.d.ts +9 -0
- package/dist/types/src/extensions/compute.d.ts.map +1 -0
- package/dist/types/src/extensions/compute.stories.d.ts +26 -0
- package/dist/types/src/extensions/compute.stories.d.ts.map +1 -0
- package/dist/types/src/extensions/index.d.ts +2 -0
- package/dist/types/src/extensions/index.d.ts.map +1 -0
- package/dist/types/src/{components/ComputeGraph → graph}/async-function.d.ts +8 -2
- package/dist/types/src/graph/async-function.d.ts.map +1 -0
- package/dist/types/src/graph/compute-graph.d.ts +84 -0
- package/dist/types/src/graph/compute-graph.d.ts.map +1 -0
- package/dist/types/src/graph/compute-graph.stories.d.ts +10 -0
- package/dist/types/src/graph/compute-graph.stories.d.ts.map +1 -0
- package/dist/types/src/graph/compute-graph.test.d.ts +2 -0
- package/dist/types/src/graph/compute-graph.test.d.ts.map +1 -0
- package/dist/types/src/graph/compute-node.d.ts +26 -0
- package/dist/types/src/graph/compute-node.d.ts.map +1 -0
- package/dist/types/src/graph/edge-function.d.ts.map +1 -0
- package/dist/types/src/{model/functions.d.ts → graph/function-defs.d.ts} +1 -1
- package/dist/types/src/graph/function-defs.d.ts.map +1 -0
- package/dist/types/src/graph/hyperformula.test.d.ts +2 -0
- package/dist/types/src/graph/hyperformula.test.d.ts.map +1 -0
- package/dist/types/src/graph/index.d.ts +4 -0
- package/dist/types/src/graph/index.d.ts.map +1 -0
- package/dist/types/src/{components/ComputeGraph/custom.d.ts → graph/testing/custom-function.d.ts} +4 -2
- package/dist/types/src/graph/testing/custom-function.d.ts.map +1 -0
- package/dist/types/src/graph/testing/index.d.ts +2 -0
- package/dist/types/src/graph/testing/index.d.ts.map +1 -0
- package/dist/types/src/graph/util.d.ts +2 -0
- package/dist/types/src/graph/util.d.ts.map +1 -0
- package/dist/types/src/hooks/hooks.stories.d.ts +11 -0
- package/dist/types/src/hooks/hooks.stories.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +4 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -0
- package/dist/types/src/hooks/useComputeGraph.d.ts +7 -0
- package/dist/types/src/hooks/useComputeGraph.d.ts.map +1 -0
- package/dist/types/src/hooks/useFormattingModel.d.ts +3 -0
- package/dist/types/src/hooks/useFormattingModel.d.ts.map +1 -0
- package/dist/types/src/hooks/useSheetModel.d.ts +8 -0
- package/dist/types/src/hooks/useSheetModel.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +1 -4
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/model/formatting-model.d.ts +16 -0
- package/dist/types/src/model/formatting-model.d.ts.map +1 -0
- 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} +10 -65
- package/dist/types/src/model/sheet-model.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/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 +17 -12
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +86 -5
- package/dist/types/src/types.d.ts.map +1 -1
- package/dist/vendor/hyperformula.mjs +37145 -0
- package/package.json +48 -41
- package/src/SheetPlugin.tsx +48 -73
- package/src/components/CellEditor/CellEditor.stories.tsx +5 -4
- package/src/components/CellEditor/CellEditor.tsx +59 -9
- package/src/components/CellEditor/extension.test.ts +4 -5
- package/src/components/CellEditor/extension.ts +1 -3
- package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +20 -0
- package/src/components/ComputeGraph/index.ts +1 -3
- package/src/components/GridSheet/GridSheet.stories.tsx +36 -0
- package/src/components/GridSheet/GridSheet.tsx +153 -0
- package/src/components/GridSheet/util.ts +108 -0
- package/src/components/Sheet/Sheet.stories.tsx +52 -88
- package/src/components/Sheet/Sheet.tsx +57 -18
- package/src/components/Sheet/decorations.ts +62 -0
- package/src/components/Sheet/grid.ts +3 -3
- package/src/components/Sheet/nav.ts +19 -19
- package/src/components/Sheet/sheet-context.tsx +18 -80
- package/src/components/Sheet/threads.tsx +205 -0
- package/src/components/SheetContainer.tsx +73 -19
- package/src/components/Toolbar/Toolbar.tsx +53 -12
- package/src/components/index.ts +1 -0
- package/src/defs/index.ts +6 -0
- package/src/{model → defs}/types.test.ts +8 -9
- package/src/{model → defs}/types.ts +24 -14
- package/src/defs/util.ts +151 -0
- package/src/extensions/compute.stories.tsx +153 -0
- package/src/extensions/compute.ts +131 -0
- package/src/extensions/index.ts +5 -0
- package/src/{components/ComputeGraph → graph}/async-function.ts +15 -6
- package/src/graph/compute-graph.stories.tsx +93 -0
- package/src/graph/compute-graph.test.ts +127 -0
- package/src/graph/compute-graph.ts +313 -0
- package/src/graph/compute-node.ts +62 -0
- package/src/{components/ComputeGraph → graph}/edge-function.ts +3 -3
- package/src/graph/hyperformula.test.ts +15 -0
- package/src/graph/index.ts +7 -0
- package/src/{components/ComputeGraph/custom.ts → graph/testing/custom-function.ts} +11 -7
- package/src/graph/testing/index.ts +5 -0
- package/src/graph/util.ts +8 -0
- package/src/hooks/hooks.stories.tsx +50 -0
- package/src/hooks/index.ts +7 -0
- package/src/hooks/useComputeGraph.ts +21 -0
- package/src/hooks/useFormattingModel.ts +11 -0
- package/src/hooks/useSheetModel.ts +40 -0
- package/src/meta.tsx +1 -5
- package/src/{components/Sheet/formatting.ts → model/formatting-model.ts} +20 -13
- package/src/model/index.ts +2 -3
- package/src/model/sheet-model.ts +414 -0
- package/src/sanity.test.ts +40 -0
- package/src/testing/index.ts +5 -0
- package/src/testing/testing.tsx +68 -0
- package/src/translations.ts +6 -1
- package/src/types.ts +31 -6
- 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.map +0 -7
- 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.map +0 -7
- package/dist/lib/node/chunk-5KKJ4NPP.cjs.map +0 -7
- 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/ComputeGraph/async-function.d.ts.map +0 -1
- package/dist/types/src/components/ComputeGraph/custom.d.ts.map +0 -1
- 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/formatting.d.ts +0 -14
- package/dist/types/src/components/Sheet/formatting.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.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/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/model/model.browser.test.ts +0 -100
- package/src/model/model.ts +0 -550
- 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/ComputeGraph → graph}/edge-function.d.ts +0 -0
- /package/src/{model/functions.ts → graph/function-defs.ts} +0 -0
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
} from "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import { Event } from "@dxos/async";
|
|
1
|
+
// packages/plugins/plugin-sheet/src/graph/compute-graph.ts
|
|
2
|
+
import defaultsDeep2 from "lodash.defaultsdeep";
|
|
3
|
+
import { Event as Event2 } from "@dxos/async";
|
|
4
|
+
import { Filter as Filter2, fullyQualifiedId } from "@dxos/client/echo";
|
|
5
|
+
import { Resource as Resource2 } from "@dxos/context";
|
|
6
|
+
import { invariant } from "@dxos/invariant";
|
|
8
7
|
import { PublicKey } from "@dxos/keys";
|
|
9
|
-
import { log as
|
|
8
|
+
import { log as log3 } from "@dxos/log";
|
|
9
|
+
import { FunctionType as FunctionType2 } from "@dxos/plugin-script/types";
|
|
10
|
+
import { nonNullable as nonNullable2 } from "@dxos/util";
|
|
11
|
+
import { ExportedCellChange, HyperFormula } from "#hyperformula";
|
|
10
12
|
|
|
11
|
-
// packages/plugins/plugin-sheet/src/
|
|
12
|
-
import { CellError, ErrorType, EmptyValue, FunctionPlugin } from "hyperformula";
|
|
13
|
+
// packages/plugins/plugin-sheet/src/graph/async-function.ts
|
|
13
14
|
import defaultsDeep from "lodash.defaultsdeep";
|
|
14
15
|
import { debounce } from "@dxos/async";
|
|
15
16
|
import { log } from "@dxos/log";
|
|
16
|
-
|
|
17
|
+
import { CellError, ErrorType, EmptyValue, FunctionPlugin } from "#hyperformula";
|
|
18
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/async-function.ts";
|
|
17
19
|
var defaultFunctionContextOptions = {
|
|
18
20
|
defaultTtl: 5e3,
|
|
19
21
|
recalculationDelay: 200,
|
|
@@ -27,7 +29,7 @@ var FunctionContext = class _FunctionContext {
|
|
|
27
29
|
...args
|
|
28
30
|
});
|
|
29
31
|
}
|
|
30
|
-
constructor(_hf, _space,
|
|
32
|
+
constructor(_hf, _space, _options) {
|
|
31
33
|
this._hf = _hf;
|
|
32
34
|
this._space = _space;
|
|
33
35
|
this._cache = /* @__PURE__ */ new Map();
|
|
@@ -35,9 +37,9 @@ var FunctionContext = class _FunctionContext {
|
|
|
35
37
|
this._subscriptions = /* @__PURE__ */ new Map();
|
|
36
38
|
this._invocations = {};
|
|
37
39
|
this._options = defaultsDeep(_options ?? {}, defaultFunctionContextOptions);
|
|
38
|
-
this._onUpdate = debounce(() => {
|
|
40
|
+
this._onUpdate = debounce((update) => {
|
|
39
41
|
this._hf.resumeEvaluation();
|
|
40
|
-
onUpdate(
|
|
42
|
+
this._options.onUpdate?.(update);
|
|
41
43
|
}, this._options.recalculationDelay);
|
|
42
44
|
}
|
|
43
45
|
get space() {
|
|
@@ -88,18 +90,21 @@ var FunctionContext = class _FunctionContext {
|
|
|
88
90
|
value: value2
|
|
89
91
|
}, {
|
|
90
92
|
F: __dxlog_file,
|
|
91
|
-
L:
|
|
93
|
+
L: 145,
|
|
92
94
|
S: this,
|
|
93
95
|
C: (f, a) => f(...a)
|
|
94
96
|
});
|
|
95
|
-
this._onUpdate(
|
|
97
|
+
this._onUpdate({
|
|
98
|
+
name,
|
|
99
|
+
cell
|
|
100
|
+
});
|
|
96
101
|
} catch (err) {
|
|
97
102
|
log.warn("failed", {
|
|
98
103
|
cell,
|
|
99
104
|
err
|
|
100
105
|
}, {
|
|
101
106
|
F: __dxlog_file,
|
|
102
|
-
L:
|
|
107
|
+
L: 149,
|
|
103
108
|
S: this,
|
|
104
109
|
C: (f, a) => f(...a)
|
|
105
110
|
});
|
|
@@ -119,7 +124,7 @@ var FunctionContext = class _FunctionContext {
|
|
|
119
124
|
cache: value
|
|
120
125
|
}, {
|
|
121
126
|
F: __dxlog_file,
|
|
122
|
-
L:
|
|
127
|
+
L: 157,
|
|
123
128
|
S: this,
|
|
124
129
|
C: (f, a) => f(...a)
|
|
125
130
|
});
|
|
@@ -139,53 +144,170 @@ var FunctionPluginAsync = class extends FunctionPlugin {
|
|
|
139
144
|
}
|
|
140
145
|
};
|
|
141
146
|
|
|
142
|
-
// packages/plugins/plugin-sheet/src/
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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()}`;
|
|
147
|
+
// packages/plugins/plugin-sheet/src/graph/compute-node.ts
|
|
148
|
+
import { Event } from "@dxos/async";
|
|
149
|
+
import { Resource } from "@dxos/context";
|
|
150
|
+
import { DetailedCellError } from "#hyperformula";
|
|
151
|
+
var ComputeNode = class extends Resource {
|
|
152
|
+
constructor(_graph, sheetId) {
|
|
153
|
+
super();
|
|
154
|
+
this._graph = _graph;
|
|
155
|
+
this.sheetId = sheetId;
|
|
159
156
|
this.update = new Event();
|
|
160
|
-
this.context = new FunctionContext(this.hf, this._space, () => {
|
|
161
|
-
this.refresh();
|
|
162
|
-
}, this._options);
|
|
163
|
-
this.hf.updateConfig({
|
|
164
|
-
context: this.context
|
|
165
|
-
});
|
|
166
157
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
158
|
+
get graph() {
|
|
159
|
+
return this._graph;
|
|
160
|
+
}
|
|
161
|
+
clear() {
|
|
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
|
|
175
169
|
});
|
|
176
|
-
|
|
170
|
+
if (value instanceof DetailedCellError) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
return value;
|
|
174
|
+
}
|
|
175
|
+
setValue(cell, value) {
|
|
176
|
+
const mappedValue = typeof value === "string" && value.charAt(0) === "=" ? this._graph.mapFormulaToNative(value) : value;
|
|
177
|
+
this._graph.hf.setCellContents({
|
|
178
|
+
sheet: this.sheetId,
|
|
179
|
+
row: cell.row,
|
|
180
|
+
col: cell.col
|
|
181
|
+
}, [
|
|
182
|
+
[
|
|
183
|
+
mappedValue
|
|
184
|
+
]
|
|
185
|
+
]);
|
|
186
|
+
}
|
|
187
|
+
async _open() {
|
|
177
188
|
}
|
|
178
189
|
};
|
|
179
190
|
|
|
180
|
-
// packages/plugins/plugin-sheet/src/
|
|
181
|
-
import {
|
|
182
|
-
import {
|
|
183
|
-
import {
|
|
184
|
-
import {
|
|
185
|
-
import {
|
|
186
|
-
import {
|
|
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
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
};
|
|
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
|
+
};
|
|
187
309
|
|
|
188
|
-
// packages/plugins/plugin-sheet/src/
|
|
310
|
+
// packages/plugins/plugin-sheet/src/graph/function-defs.ts
|
|
189
311
|
var defaultFunctions = [
|
|
190
312
|
// Array
|
|
191
313
|
{
|
|
@@ -2559,677 +2681,262 @@ var defaultFunctions = [
|
|
|
2559
2681
|
}
|
|
2560
2682
|
];
|
|
2561
2683
|
|
|
2562
|
-
// packages/plugins/plugin-sheet/src/
|
|
2563
|
-
|
|
2564
|
-
var
|
|
2565
|
-
var
|
|
2566
|
-
var
|
|
2567
|
-
|
|
2568
|
-
};
|
|
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(":");
|
|
2684
|
+
// packages/plugins/plugin-sheet/src/graph/compute-graph.ts
|
|
2685
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/compute-graph.ts";
|
|
2686
|
+
var OBJECT_ID_LENGTH = 60;
|
|
2687
|
+
var CUSTOM_FUNCTION = "ECHO";
|
|
2688
|
+
var defaultOptions = {
|
|
2689
|
+
licenseKey: "gpl-v3"
|
|
2605
2690
|
};
|
|
2606
|
-
var
|
|
2607
|
-
|
|
2608
|
-
|
|
2691
|
+
var defaultPlugins = [
|
|
2692
|
+
{
|
|
2693
|
+
plugin: EdgeFunctionPlugin,
|
|
2694
|
+
translations: EdgeFunctionPluginTranslations
|
|
2609
2695
|
}
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2696
|
+
];
|
|
2697
|
+
var PREFIX = "__";
|
|
2698
|
+
var createSheetName = (id) => `${PREFIX}${id}`;
|
|
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
|
+
});
|
|
2613
2710
|
}
|
|
2614
|
-
|
|
2615
|
-
return
|
|
2711
|
+
getGraph(spaceId) {
|
|
2712
|
+
return this._graphs.get(spaceId);
|
|
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;
|
|
2616
2728
|
}
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
|
|
2625
|
-
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
}
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
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
|
+
}
|
|
2636
2749
|
}
|
|
2637
2750
|
};
|
|
2638
|
-
var
|
|
2639
|
-
|
|
2640
|
-
|
|
2641
|
-
|
|
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;
|
|
2751
|
+
var ComputeGraph = class extends Resource2 {
|
|
2752
|
+
constructor(_hf, _space, _options) {
|
|
2753
|
+
super();
|
|
2754
|
+
this._hf = _hf;
|
|
2687
2755
|
this._space = _space;
|
|
2688
|
-
this.
|
|
2689
|
-
this.
|
|
2756
|
+
this._options = _options;
|
|
2757
|
+
this.id = `graph-${PublicKey.random().truncate()}`;
|
|
2758
|
+
this._nodes = /* @__PURE__ */ new Map();
|
|
2690
2759
|
this._functions = [];
|
|
2691
2760
|
this.update = new Event2();
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
this.
|
|
2695
|
-
}
|
|
2696
|
-
this._sheetId = this._graph.hf.getSheetId(name);
|
|
2697
|
-
this._options = {
|
|
2698
|
-
...defaultOptions,
|
|
2699
|
-
...options
|
|
2700
|
-
};
|
|
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
|
|
2761
|
+
this.context = new FunctionContext(this._hf, this._space, this._options);
|
|
2762
|
+
this._hf.updateConfig({
|
|
2763
|
+
context: this.context
|
|
2721
2764
|
});
|
|
2722
|
-
const
|
|
2723
|
-
|
|
2724
|
-
|
|
2765
|
+
const onValuesUpdate = (changes) => {
|
|
2766
|
+
for (const change of changes) {
|
|
2767
|
+
if (change instanceof ExportedCellChange) {
|
|
2768
|
+
const { sheet } = change;
|
|
2769
|
+
const node = this._nodes.get(sheet);
|
|
2770
|
+
if (node) {
|
|
2771
|
+
node.update.emit({
|
|
2772
|
+
type: "valuesUpdated",
|
|
2773
|
+
change
|
|
2774
|
+
});
|
|
2775
|
+
}
|
|
2776
|
+
}
|
|
2777
|
+
}
|
|
2778
|
+
};
|
|
2779
|
+
this._hf.on("valuesUpdated", onValuesUpdate);
|
|
2780
|
+
this._ctx.onDispose(() => this._hf.off("valuesUpdated", onValuesUpdate));
|
|
2781
|
+
}
|
|
2782
|
+
get hf() {
|
|
2783
|
+
return this._hf;
|
|
2784
|
+
}
|
|
2785
|
+
// refresh() {
|
|
2786
|
+
// log('refresh', { id: this.id });
|
|
2787
|
+
// this.update.emit();
|
|
2788
|
+
// }
|
|
2789
|
+
getFunctions({ standard, echo } = {
|
|
2790
|
+
standard: true,
|
|
2791
|
+
echo: true
|
|
2792
|
+
}) {
|
|
2725
2793
|
return [
|
|
2726
|
-
...
|
|
2727
|
-
|
|
2794
|
+
...standard ? this._hf.getRegisteredFunctionNames().map((name) => defaultFunctions.find((fn) => fn.name === name) ?? {
|
|
2795
|
+
name
|
|
2796
|
+
}) : [],
|
|
2797
|
+
...echo ? this._functions.map((fn) => ({
|
|
2798
|
+
name: fn.binding
|
|
2799
|
+
})) : []
|
|
2728
2800
|
];
|
|
2729
2801
|
}
|
|
2730
|
-
get initialized() {
|
|
2731
|
-
return !!this._ctx;
|
|
2732
|
-
}
|
|
2733
2802
|
/**
|
|
2734
|
-
*
|
|
2803
|
+
* Get or create cell representing a sheet.
|
|
2735
2804
|
*/
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
invariant2(!this.initialized, "Already initialized.", {
|
|
2746
|
-
F: __dxlog_file4,
|
|
2747
|
-
L: 143,
|
|
2805
|
+
// TODO(burdon): Async (open node).
|
|
2806
|
+
// The graph should be an extensible factory that plugins extend with model constructors.
|
|
2807
|
+
// This would enable on-the-fly instantiation of new models when then are referenced.
|
|
2808
|
+
// E.g., Cross-object reference would be stored as "ObjectId!A1"
|
|
2809
|
+
// The graph would then load the object and create a ComputeNode (model) of the appropriate type.
|
|
2810
|
+
async getOrCreateNode(name) {
|
|
2811
|
+
invariant(name.length, void 0, {
|
|
2812
|
+
F: __dxlog_file3,
|
|
2813
|
+
L: 193,
|
|
2748
2814
|
S: this,
|
|
2749
2815
|
A: [
|
|
2750
|
-
"
|
|
2751
|
-
"
|
|
2816
|
+
"name.length",
|
|
2817
|
+
""
|
|
2752
2818
|
]
|
|
2753
2819
|
});
|
|
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();
|
|
2820
|
+
if (!this._hf.doesSheetExist(name)) {
|
|
2821
|
+
log3.info("created node", {
|
|
2822
|
+
space: this._space?.id,
|
|
2823
|
+
name
|
|
2824
|
+
}, {
|
|
2825
|
+
F: __dxlog_file3,
|
|
2826
|
+
L: 195,
|
|
2827
|
+
S: this,
|
|
2828
|
+
C: (f, a) => f(...a)
|
|
2774
2829
|
});
|
|
2775
|
-
this.
|
|
2830
|
+
this._hf.addSheet(name);
|
|
2776
2831
|
}
|
|
2777
|
-
|
|
2778
|
-
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
id: this.id
|
|
2782
|
-
}, {
|
|
2783
|
-
F: __dxlog_file4,
|
|
2784
|
-
L: 174,
|
|
2832
|
+
const sheetId = this._hf.getSheetId(name);
|
|
2833
|
+
invariant(sheetId !== void 0, void 0, {
|
|
2834
|
+
F: __dxlog_file3,
|
|
2835
|
+
L: 201,
|
|
2785
2836
|
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
|
|
2837
|
+
A: [
|
|
2838
|
+
"sheetId !== undefined",
|
|
2839
|
+
""
|
|
2957
2840
|
]
|
|
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
2841
|
});
|
|
2842
|
+
const node = new ComputeNode(this, sheetId);
|
|
2843
|
+
await node.open();
|
|
2844
|
+
this._nodes.set(sheetId, node);
|
|
2845
|
+
return node;
|
|
2978
2846
|
}
|
|
2979
2847
|
/**
|
|
2980
|
-
*
|
|
2848
|
+
* Map bound value to custom function invocation.
|
|
2849
|
+
* E.g., "HELLO(...args)" => "EDGE("HELLO", ...args)".
|
|
2981
2850
|
*/
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
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);
|
|
2851
|
+
mapFormulaToNative(formula) {
|
|
2852
|
+
return formula.replace(/['"]?([ \w]+)['"]?!/, (_match, name) => {
|
|
2853
|
+
if (name) {
|
|
2854
|
+
const objects = this._hf.getSheetNames().map((name2) => {
|
|
2855
|
+
const id = getSheetId(name2);
|
|
2856
|
+
return id ? this._space?.db.getObjectById(id) : void 0;
|
|
2857
|
+
}).filter(nonNullable2);
|
|
2858
|
+
for (const obj of objects) {
|
|
2859
|
+
if (obj.name === name || obj.title === name) {
|
|
2860
|
+
return `${createSheetName(obj.id)}!`;
|
|
2861
|
+
}
|
|
3002
2862
|
}
|
|
3003
2863
|
}
|
|
3004
|
-
|
|
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) => {
|
|
2864
|
+
return `${name}!`;
|
|
2865
|
+
}).replace(/(\w+)\((.*)\)/g, (match, binding, args) => {
|
|
3070
2866
|
const fn = this._functions.find((fn2) => fn2.binding === binding);
|
|
3071
2867
|
if (!fn) {
|
|
3072
2868
|
return match;
|
|
3073
2869
|
}
|
|
3074
2870
|
if (args.trim() === "") {
|
|
3075
|
-
return
|
|
2871
|
+
return `${CUSTOM_FUNCTION}("${binding}")`;
|
|
2872
|
+
} else {
|
|
2873
|
+
return `${CUSTOM_FUNCTION}("${binding}", ${args})`;
|
|
3076
2874
|
}
|
|
3077
|
-
return `EDGE("${binding}", ${args})`;
|
|
3078
2875
|
});
|
|
3079
2876
|
}
|
|
3080
2877
|
/**
|
|
3081
|
-
*
|
|
2878
|
+
* Map from binding to fully qualified ECHO ID (to store).
|
|
2879
|
+
* E.g., HELLO() => spaceId:objectId()
|
|
3082
2880
|
*/
|
|
3083
|
-
|
|
3084
|
-
return formula.replace(/
|
|
3085
|
-
if (
|
|
3086
|
-
return
|
|
2881
|
+
mapFunctionBindingToId(formula) {
|
|
2882
|
+
return formula.replace(/(\w+)\((.*)\)/g, (match, binding, args) => {
|
|
2883
|
+
if (binding === CUSTOM_FUNCTION || defaultFunctions.find((fn2) => fn2.name === binding)) {
|
|
2884
|
+
return match;
|
|
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;
|
|
3087
2892
|
}
|
|
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
|
-
});
|
|
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
2893
|
});
|
|
3136
2894
|
}
|
|
3137
|
-
//
|
|
3138
|
-
// Values
|
|
3139
|
-
//
|
|
3140
2895
|
/**
|
|
3141
|
-
*
|
|
3142
|
-
*
|
|
3143
|
-
* NOTE: TODAY() is number of FULL days since nullDate. It will typically be -1 days from NOW().
|
|
2896
|
+
* Map from fully qualified ECHO ID to binding (from store).
|
|
2897
|
+
* E.g., spaceId:objectId() => HELLO()
|
|
3144
2898
|
*/
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
|
|
3148
|
-
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
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;
|
|
2899
|
+
mapFunctionBindingFromId(formula) {
|
|
2900
|
+
return formula.replace(/(\w+):([a-zA-Z0-9]+)\((.*)\)/g, (match, spaceId, objectId, args) => {
|
|
2901
|
+
const id = `${spaceId}:${objectId}`;
|
|
2902
|
+
if (id.length !== OBJECT_ID_LENGTH) {
|
|
2903
|
+
return match;
|
|
2904
|
+
}
|
|
2905
|
+
const fn = this._functions.find((fn2) => fullyQualifiedId(fn2) === id);
|
|
2906
|
+
if (fn?.binding) {
|
|
2907
|
+
return `${fn.binding}(${args})`;
|
|
2908
|
+
} else {
|
|
2909
|
+
return match;
|
|
3185
2910
|
}
|
|
3186
|
-
return parseNumberString(rate);
|
|
3187
|
-
};
|
|
3188
|
-
return this.runAsyncFunction(ast, state, handler, {
|
|
3189
|
-
ttl: 1e4
|
|
3190
2911
|
});
|
|
3191
2912
|
}
|
|
3192
|
-
|
|
3193
|
-
|
|
3194
|
-
|
|
3195
|
-
|
|
3196
|
-
|
|
3197
|
-
|
|
3198
|
-
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
argumentType: FunctionArgumentType.STRING,
|
|
3204
|
-
optionalArg: true
|
|
3205
|
-
}
|
|
3206
|
-
],
|
|
3207
|
-
isVolatile: true
|
|
2913
|
+
async _open() {
|
|
2914
|
+
if (this._space) {
|
|
2915
|
+
const query = this._space.db.query(Filter2.schema(FunctionType2));
|
|
2916
|
+
const unsubscribe = query.subscribe(({ objects }) => {
|
|
2917
|
+
this._functions = objects.filter(({ binding }) => binding);
|
|
2918
|
+
this.update.emit({
|
|
2919
|
+
type: "functionsUpdated"
|
|
2920
|
+
});
|
|
2921
|
+
});
|
|
2922
|
+
this._ctx.onDispose(unsubscribe);
|
|
2923
|
+
}
|
|
3208
2924
|
}
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3212
|
-
|
|
3213
|
-
CRYPTO: "CRYPTO"
|
|
3214
|
-
},
|
|
3215
|
-
enUS: {
|
|
3216
|
-
TEST: "TEST",
|
|
3217
|
-
CRYPTO: "CRYPTO"
|
|
2925
|
+
async _close() {
|
|
2926
|
+
for (const node of this._nodes.values()) {
|
|
2927
|
+
await node.close();
|
|
2928
|
+
}
|
|
3218
2929
|
}
|
|
3219
2930
|
};
|
|
3220
2931
|
|
|
3221
2932
|
export {
|
|
3222
|
-
|
|
3223
|
-
CustomPlugin,
|
|
3224
|
-
CustomPluginTranslations,
|
|
3225
|
-
createComputeGraph,
|
|
2933
|
+
ComputeNode,
|
|
3226
2934
|
defaultFunctions,
|
|
3227
|
-
|
|
3228
|
-
|
|
3229
|
-
|
|
3230
|
-
|
|
3231
|
-
|
|
3232
|
-
|
|
3233
|
-
SheetModel
|
|
2935
|
+
defaultOptions,
|
|
2936
|
+
defaultPlugins,
|
|
2937
|
+
createSheetName,
|
|
2938
|
+
getSheetId,
|
|
2939
|
+
ComputeGraphRegistry,
|
|
2940
|
+
ComputeGraph
|
|
3234
2941
|
};
|
|
3235
|
-
//# sourceMappingURL=chunk-
|
|
2942
|
+
//# sourceMappingURL=chunk-Z2XOOC2R.mjs.map
|