@dxos/plugin-sheet 0.6.12-main.5cc132e → 0.6.12-main.78ddbdf

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.
Files changed (256) hide show
  1. package/dist/lib/browser/SheetContainer-V4GCCZTX.mjs +261 -0
  2. package/dist/lib/browser/SheetContainer-V4GCCZTX.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-GNNVBNCX.mjs → chunk-6ZMQVB4Z.mjs} +358 -678
  4. package/dist/lib/browser/chunk-6ZMQVB4Z.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-JRL5LGCE.mjs → chunk-QILRZNE5.mjs} +2 -5
  6. package/dist/lib/browser/chunk-QILRZNE5.mjs.map +7 -0
  7. package/dist/lib/{node-esm/chunk-WUPTZUTX.mjs → browser/chunk-T3NJFTD4.mjs} +4 -14
  8. package/dist/lib/browser/chunk-T3NJFTD4.mjs.map +7 -0
  9. package/dist/lib/browser/{SheetContainer-Y7ZMFBAP.mjs → chunk-U2JHW3L6.mjs} +819 -498
  10. package/dist/lib/browser/chunk-U2JHW3L6.mjs.map +7 -0
  11. package/dist/lib/browser/graph-T27BOBOV.mjs +21 -0
  12. package/dist/lib/browser/graph-T27BOBOV.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +58 -55
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/meta.mjs +1 -1
  17. package/dist/lib/browser/types.mjs +4 -6
  18. package/dist/lib/node/SheetContainer-3ZY7MPWJ.cjs +279 -0
  19. package/dist/lib/node/SheetContainer-3ZY7MPWJ.cjs.map +7 -0
  20. package/dist/lib/node/{chunk-BJ6ZD7MN.cjs → chunk-BNARJ5GM.cjs} +5 -18
  21. package/dist/lib/node/chunk-BNARJ5GM.cjs.map +7 -0
  22. package/dist/lib/node/{chunk-ZRQZFV5T.cjs → chunk-DD6FIXWC.cjs} +359 -679
  23. package/dist/lib/node/chunk-DD6FIXWC.cjs.map +7 -0
  24. package/dist/lib/node/{SheetContainer-KEOKUKAQ.cjs → chunk-OTTD7FBK.cjs} +875 -551
  25. package/dist/lib/node/chunk-OTTD7FBK.cjs.map +7 -0
  26. package/dist/lib/node/{chunk-VJU3NPUJ.cjs → chunk-Q3HBHPRL.cjs} +8 -19
  27. package/dist/lib/node/chunk-Q3HBHPRL.cjs.map +7 -0
  28. package/dist/lib/node/graph-SPKGX7W4.cjs +43 -0
  29. package/dist/lib/node/graph-SPKGX7W4.cjs.map +7 -0
  30. package/dist/lib/node/index.cjs +75 -64
  31. package/dist/lib/node/index.cjs.map +3 -3
  32. package/dist/lib/node/meta.cjs +3 -3
  33. package/dist/lib/node/meta.cjs.map +1 -1
  34. package/dist/lib/node/meta.json +1 -1
  35. package/dist/lib/node/types.cjs +10 -12
  36. package/dist/lib/node/types.cjs.map +2 -2
  37. package/dist/lib/node-esm/SheetContainer-PXSJX6XK.mjs +262 -0
  38. package/dist/lib/node-esm/SheetContainer-PXSJX6XK.mjs.map +7 -0
  39. package/dist/lib/node-esm/{SheetContainer-Y7ZMFBAP.mjs → chunk-7HVSOTGA.mjs} +820 -498
  40. package/dist/lib/node-esm/chunk-7HVSOTGA.mjs.map +7 -0
  41. package/dist/lib/{browser/chunk-WUPTZUTX.mjs → node-esm/chunk-BMNA27EX.mjs} +5 -14
  42. package/dist/lib/node-esm/chunk-BMNA27EX.mjs.map +7 -0
  43. package/dist/lib/node-esm/{chunk-GNNVBNCX.mjs → chunk-D6KU5MI7.mjs} +359 -677
  44. package/dist/lib/node-esm/chunk-D6KU5MI7.mjs.map +7 -0
  45. package/dist/lib/node-esm/{chunk-JRL5LGCE.mjs → chunk-IU2L277A.mjs} +4 -5
  46. package/dist/lib/node-esm/chunk-IU2L277A.mjs.map +7 -0
  47. package/dist/lib/node-esm/graph-U67IO4UC.mjs +22 -0
  48. package/dist/lib/node-esm/graph-U67IO4UC.mjs.map +7 -0
  49. package/dist/lib/node-esm/index.mjs +59 -55
  50. package/dist/lib/node-esm/index.mjs.map +3 -3
  51. package/dist/lib/node-esm/meta.json +1 -1
  52. package/dist/lib/node-esm/meta.mjs +2 -1
  53. package/dist/lib/node-esm/types.mjs +5 -6
  54. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  55. package/dist/types/src/components/CellEditor/CellEditor.d.ts +23 -3
  56. package/dist/types/src/components/CellEditor/CellEditor.d.ts.map +1 -1
  57. package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts +2 -2
  58. package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts.map +1 -1
  59. package/dist/types/src/components/CellEditor/extension.d.ts +1 -1
  60. package/dist/types/src/components/CellEditor/extension.d.ts.map +1 -1
  61. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +11 -0
  62. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -0
  63. package/dist/types/src/components/ComputeGraph/index.d.ts +1 -3
  64. package/dist/types/src/components/ComputeGraph/index.d.ts.map +1 -1
  65. package/dist/types/src/components/GridSheet/GridSheet.d.ts +10 -0
  66. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -0
  67. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +9 -0
  68. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/GridSheet/util.d.ts +7 -0
  70. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -0
  71. package/dist/types/src/components/Sheet/Sheet.d.ts +1 -1
  72. package/dist/types/src/components/Sheet/Sheet.d.ts.map +1 -1
  73. package/dist/types/src/components/Sheet/Sheet.stories.d.ts +5 -6
  74. package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +1 -1
  75. package/dist/types/src/components/Sheet/grid.d.ts +2 -2
  76. package/dist/types/src/components/Sheet/grid.d.ts.map +1 -1
  77. package/dist/types/src/components/Sheet/nav.d.ts +3 -3
  78. package/dist/types/src/components/Sheet/nav.d.ts.map +1 -1
  79. package/dist/types/src/components/Sheet/sheet-context.d.ts +4 -5
  80. package/dist/types/src/components/Sheet/sheet-context.d.ts.map +1 -1
  81. package/dist/types/src/components/Sheet/threads.d.ts.map +1 -1
  82. package/dist/types/src/components/SheetContainer.d.ts +1 -1
  83. package/dist/types/src/components/SheetContainer.d.ts.map +1 -1
  84. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  85. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +1 -1
  86. package/dist/types/src/components/index.d.ts +2 -1
  87. package/dist/types/src/components/index.d.ts.map +1 -1
  88. package/dist/types/src/defs/index.d.ts +3 -0
  89. package/dist/types/src/defs/index.d.ts.map +1 -0
  90. package/dist/types/src/{model → defs}/types.d.ts +8 -3
  91. package/dist/types/src/defs/types.d.ts.map +1 -0
  92. package/dist/types/src/defs/types.test.d.ts.map +1 -0
  93. package/dist/types/src/{model → defs}/util.d.ts +8 -4
  94. package/dist/types/src/defs/util.d.ts.map +1 -0
  95. package/dist/types/src/extensions/compute.d.ts +5 -0
  96. package/dist/types/src/extensions/compute.d.ts.map +1 -0
  97. package/dist/types/src/extensions/compute.stories.d.ts +26 -0
  98. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -0
  99. package/dist/types/src/extensions/index.d.ts +2 -0
  100. package/dist/types/src/extensions/index.d.ts.map +1 -0
  101. package/dist/types/src/{components/ComputeGraph → graph}/async-function.d.ts +1 -1
  102. package/dist/types/src/graph/async-function.d.ts.map +1 -0
  103. package/dist/types/src/graph/compute-graph.browser.test.d.ts +2 -0
  104. package/dist/types/src/graph/compute-graph.browser.test.d.ts.map +1 -0
  105. package/dist/types/src/graph/compute-graph.d.ts +81 -0
  106. package/dist/types/src/graph/compute-graph.d.ts.map +1 -0
  107. package/dist/types/src/graph/compute-graph.stories.d.ts +10 -0
  108. package/dist/types/src/graph/compute-graph.stories.d.ts.map +1 -0
  109. package/dist/types/src/graph/compute-node.d.ts +19 -0
  110. package/dist/types/src/graph/compute-node.d.ts.map +1 -0
  111. package/dist/types/src/{components/ComputeGraph/custom.d.ts → graph/custom-function.d.ts} +1 -1
  112. package/dist/types/src/graph/custom-function.d.ts.map +1 -0
  113. package/dist/types/src/graph/edge-function.d.ts.map +1 -0
  114. package/dist/types/src/{model/functions.d.ts → graph/function-defs.d.ts} +1 -1
  115. package/dist/types/src/graph/function-defs.d.ts.map +1 -0
  116. package/dist/types/src/graph/hyperformula.test.d.ts +2 -0
  117. package/dist/types/src/graph/hyperformula.test.d.ts.map +1 -0
  118. package/dist/types/src/graph/index.d.ts +4 -0
  119. package/dist/types/src/graph/index.d.ts.map +1 -0
  120. package/dist/types/src/graph/util.d.ts +2 -0
  121. package/dist/types/src/graph/util.d.ts.map +1 -0
  122. package/dist/types/src/hooks/hooks.stories.d.ts +11 -0
  123. package/dist/types/src/hooks/hooks.stories.d.ts.map +1 -0
  124. package/dist/types/src/hooks/index.d.ts +4 -0
  125. package/dist/types/src/hooks/index.d.ts.map +1 -0
  126. package/dist/types/src/hooks/useComputeGraph.d.ts +7 -0
  127. package/dist/types/src/hooks/useComputeGraph.d.ts.map +1 -0
  128. package/dist/types/src/hooks/useFormattingModel.d.ts +3 -0
  129. package/dist/types/src/hooks/useFormattingModel.d.ts.map +1 -0
  130. package/dist/types/src/hooks/useSheetModel.d.ts +8 -0
  131. package/dist/types/src/hooks/useSheetModel.d.ts.map +1 -0
  132. package/dist/types/src/meta.d.ts +1 -4
  133. package/dist/types/src/meta.d.ts.map +1 -1
  134. package/dist/types/src/model/formatting-model.d.ts +16 -0
  135. package/dist/types/src/model/formatting-model.d.ts.map +1 -0
  136. package/dist/types/src/model/index.d.ts +2 -4
  137. package/dist/types/src/model/index.d.ts.map +1 -1
  138. package/dist/types/src/model/{model.d.ts → sheet-model.d.ts} +9 -48
  139. package/dist/types/src/model/sheet-model.d.ts.map +1 -0
  140. package/dist/types/src/sanity.test.d.ts +2 -0
  141. package/dist/types/src/sanity.test.d.ts.map +1 -0
  142. package/dist/types/src/testing/index.d.ts +2 -0
  143. package/dist/types/src/testing/index.d.ts.map +1 -0
  144. package/dist/types/src/testing/testing.d.ts +9 -0
  145. package/dist/types/src/testing/testing.d.ts.map +1 -0
  146. package/dist/types/src/types.d.ts +12 -2
  147. package/dist/types/src/types.d.ts.map +1 -1
  148. package/dist/vendor/hyperformula.mjs +37145 -0
  149. package/package.json +41 -38
  150. package/src/SheetPlugin.tsx +39 -59
  151. package/src/components/CellEditor/CellEditor.stories.tsx +4 -3
  152. package/src/components/CellEditor/CellEditor.tsx +59 -9
  153. package/src/components/CellEditor/extension.test.ts +3 -3
  154. package/src/components/CellEditor/extension.ts +1 -3
  155. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +20 -0
  156. package/src/components/ComputeGraph/index.ts +1 -3
  157. package/src/components/GridSheet/GridSheet.stories.tsx +36 -0
  158. package/src/components/GridSheet/GridSheet.tsx +153 -0
  159. package/src/components/GridSheet/util.ts +108 -0
  160. package/src/components/Sheet/Sheet.stories.tsx +41 -82
  161. package/src/components/Sheet/Sheet.tsx +12 -10
  162. package/src/components/Sheet/grid.ts +3 -3
  163. package/src/components/Sheet/nav.ts +19 -19
  164. package/src/components/Sheet/sheet-context.tsx +10 -80
  165. package/src/components/Sheet/threads.tsx +10 -6
  166. package/src/components/SheetContainer.tsx +2 -2
  167. package/src/components/Toolbar/Toolbar.tsx +1 -2
  168. package/src/components/index.ts +1 -0
  169. package/src/defs/index.ts +6 -0
  170. package/src/{model → defs}/types.test.ts +7 -7
  171. package/src/{model → defs}/types.ts +23 -14
  172. package/src/{model → defs}/util.ts +49 -17
  173. package/src/extensions/compute.stories.tsx +151 -0
  174. package/src/extensions/compute.ts +98 -0
  175. package/src/extensions/index.ts +5 -0
  176. package/src/{components/ComputeGraph → graph}/async-function.ts +3 -1
  177. package/src/graph/compute-graph.browser.test.ts +104 -0
  178. package/src/graph/compute-graph.stories.tsx +92 -0
  179. package/src/graph/compute-graph.ts +290 -0
  180. package/src/graph/compute-node.ts +51 -0
  181. package/src/{components/ComputeGraph/custom.ts → graph/custom-function.ts} +2 -6
  182. package/src/{components/ComputeGraph → graph}/edge-function.ts +2 -1
  183. package/src/graph/hyperformula.test.ts +15 -0
  184. package/src/graph/index.ts +7 -0
  185. package/src/graph/util.ts +8 -0
  186. package/src/hooks/hooks.stories.tsx +50 -0
  187. package/src/hooks/index.ts +7 -0
  188. package/src/hooks/useComputeGraph.ts +20 -0
  189. package/src/hooks/useFormattingModel.ts +11 -0
  190. package/src/hooks/useSheetModel.ts +43 -0
  191. package/src/meta.tsx +1 -5
  192. package/src/{components/Sheet/formatting.ts → model/formatting-model.ts} +20 -13
  193. package/src/model/index.ts +2 -4
  194. package/src/model/{model.ts → sheet-model.ts} +67 -184
  195. package/src/sanity.test.ts +40 -0
  196. package/src/testing/index.ts +5 -0
  197. package/src/testing/testing.tsx +66 -0
  198. package/src/types.ts +14 -12
  199. package/dist/lib/browser/SheetContainer-Y7ZMFBAP.mjs.map +0 -7
  200. package/dist/lib/browser/chunk-GNNVBNCX.mjs.map +0 -7
  201. package/dist/lib/browser/chunk-JRL5LGCE.mjs.map +0 -7
  202. package/dist/lib/browser/chunk-PGKZPKUD.mjs +0 -175
  203. package/dist/lib/browser/chunk-PGKZPKUD.mjs.map +0 -7
  204. package/dist/lib/browser/chunk-VBF7YENS.mjs +0 -8
  205. package/dist/lib/browser/chunk-VBF7YENS.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-WUPTZUTX.mjs.map +0 -7
  207. package/dist/lib/browser/testing.mjs +0 -92
  208. package/dist/lib/browser/testing.mjs.map +0 -7
  209. package/dist/lib/node/SheetContainer-KEOKUKAQ.cjs.map +0 -7
  210. package/dist/lib/node/chunk-57PB2HPY.cjs +0 -40
  211. package/dist/lib/node/chunk-57PB2HPY.cjs.map +0 -7
  212. package/dist/lib/node/chunk-6LWBQAQZ.cjs +0 -202
  213. package/dist/lib/node/chunk-6LWBQAQZ.cjs.map +0 -7
  214. package/dist/lib/node/chunk-BJ6ZD7MN.cjs.map +0 -7
  215. package/dist/lib/node/chunk-VJU3NPUJ.cjs.map +0 -7
  216. package/dist/lib/node/chunk-ZRQZFV5T.cjs.map +0 -7
  217. package/dist/lib/node/testing.cjs +0 -111
  218. package/dist/lib/node/testing.cjs.map +0 -7
  219. package/dist/lib/node-esm/SheetContainer-Y7ZMFBAP.mjs.map +0 -7
  220. package/dist/lib/node-esm/chunk-GNNVBNCX.mjs.map +0 -7
  221. package/dist/lib/node-esm/chunk-JRL5LGCE.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-PGKZPKUD.mjs +0 -175
  223. package/dist/lib/node-esm/chunk-PGKZPKUD.mjs.map +0 -7
  224. package/dist/lib/node-esm/chunk-VBF7YENS.mjs +0 -8
  225. package/dist/lib/node-esm/chunk-VBF7YENS.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-WUPTZUTX.mjs.map +0 -7
  227. package/dist/lib/node-esm/testing.mjs +0 -92
  228. package/dist/lib/node-esm/testing.mjs.map +0 -7
  229. package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +0 -1
  230. package/dist/types/src/components/ComputeGraph/custom.d.ts.map +0 -1
  231. package/dist/types/src/components/ComputeGraph/edge-function.d.ts.map +0 -1
  232. package/dist/types/src/components/ComputeGraph/graph-context.d.ts +0 -12
  233. package/dist/types/src/components/ComputeGraph/graph-context.d.ts.map +0 -1
  234. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts +0 -2
  235. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts.map +0 -1
  236. package/dist/types/src/components/ComputeGraph/graph.d.ts +0 -26
  237. package/dist/types/src/components/ComputeGraph/graph.d.ts.map +0 -1
  238. package/dist/types/src/components/Sheet/formatting.d.ts +0 -14
  239. package/dist/types/src/components/Sheet/formatting.d.ts.map +0 -1
  240. package/dist/types/src/model/functions.d.ts.map +0 -1
  241. package/dist/types/src/model/model.browser.test.d.ts +0 -2
  242. package/dist/types/src/model/model.browser.test.d.ts.map +0 -1
  243. package/dist/types/src/model/model.d.ts.map +0 -1
  244. package/dist/types/src/model/types.d.ts.map +0 -1
  245. package/dist/types/src/model/types.test.d.ts.map +0 -1
  246. package/dist/types/src/model/util.d.ts.map +0 -1
  247. package/dist/types/src/testing.d.ts +0 -9
  248. package/dist/types/src/testing.d.ts.map +0 -1
  249. package/src/components/ComputeGraph/graph-context.tsx +0 -50
  250. package/src/components/ComputeGraph/graph.browser.test.ts +0 -49
  251. package/src/components/ComputeGraph/graph.ts +0 -62
  252. package/src/model/model.browser.test.ts +0 -99
  253. package/src/testing.ts +0 -50
  254. /package/dist/types/src/{model → defs}/types.test.d.ts +0 -0
  255. /package/dist/types/src/{components/ComputeGraph → graph}/edge-function.d.ts +0 -0
  256. /package/src/{model/functions.ts → graph/function-defs.ts} +0 -0
@@ -1,19 +1,20 @@
1
- import {
2
- ValueTypeEnum
3
- } from "./chunk-WUPTZUTX.mjs";
4
-
5
- // packages/plugins/plugin-sheet/src/components/ComputeGraph/graph.ts
6
- import { HyperFormula } from "hyperformula";
7
- import { Event } from "@dxos/async";
1
+ // packages/plugins/plugin-sheet/src/graph/compute-graph.ts
2
+ import { Event as Event2 } from "@dxos/async";
3
+ import { Filter as Filter2, fullyQualifiedId } from "@dxos/client/echo";
4
+ import { Resource as Resource2 } from "@dxos/context";
5
+ import { invariant } from "@dxos/invariant";
8
6
  import { PublicKey } from "@dxos/keys";
9
- import { log as log2 } from "@dxos/log";
7
+ import { log as log3 } from "@dxos/log";
8
+ import { FunctionType as FunctionType2 } from "@dxos/plugin-script/types";
9
+ import { nonNullable as nonNullable2 } from "@dxos/util";
10
+ import { HyperFormula } from "#hyperformula";
10
11
 
11
- // packages/plugins/plugin-sheet/src/components/ComputeGraph/async-function.ts
12
- import { CellError, ErrorType, EmptyValue, FunctionPlugin } from "hyperformula";
12
+ // packages/plugins/plugin-sheet/src/graph/async-function.ts
13
13
  import defaultsDeep from "lodash.defaultsdeep";
14
14
  import { debounce } from "@dxos/async";
15
15
  import { log } from "@dxos/log";
16
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/components/ComputeGraph/async-function.ts";
16
+ import { CellError, ErrorType, EmptyValue, FunctionPlugin } from "#hyperformula";
17
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/async-function.ts";
17
18
  var defaultFunctionContextOptions = {
18
19
  defaultTtl: 5e3,
19
20
  recalculationDelay: 200,
@@ -40,6 +41,7 @@ var FunctionContext = class _FunctionContext {
40
41
  onUpdate(this);
41
42
  }, this._options.recalculationDelay);
42
43
  }
44
+ // TODO(burdon): Remove?
43
45
  get space() {
44
46
  return this._space;
45
47
  }
@@ -88,7 +90,7 @@ var FunctionContext = class _FunctionContext {
88
90
  value: value2
89
91
  }, {
90
92
  F: __dxlog_file,
91
- L: 136,
93
+ L: 138,
92
94
  S: this,
93
95
  C: (f, a) => f(...a)
94
96
  });
@@ -99,7 +101,7 @@ var FunctionContext = class _FunctionContext {
99
101
  err
100
102
  }, {
101
103
  F: __dxlog_file,
102
- L: 140,
104
+ L: 142,
103
105
  S: this,
104
106
  C: (f, a) => f(...a)
105
107
  });
@@ -119,7 +121,7 @@ var FunctionContext = class _FunctionContext {
119
121
  cache: value
120
122
  }, {
121
123
  F: __dxlog_file,
122
- L: 148,
124
+ L: 150,
123
125
  S: this,
124
126
  C: (f, a) => f(...a)
125
127
  });
@@ -139,53 +141,173 @@ var FunctionPluginAsync = class extends FunctionPlugin {
139
141
  }
140
142
  };
141
143
 
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()}`;
144
+ // packages/plugins/plugin-sheet/src/graph/compute-node.ts
145
+ import { Event } from "@dxos/async";
146
+ import { Resource } from "@dxos/context";
147
+ import { DetailedCellError } from "#hyperformula";
148
+ var ComputeNode = class extends Resource {
149
+ constructor(_graph, sheetId) {
150
+ super();
151
+ this._graph = _graph;
152
+ this.sheetId = sheetId;
159
153
  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
154
  }
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)
155
+ // TODO(burdon): Remove?
156
+ get graph() {
157
+ return this._graph;
158
+ }
159
+ get hf() {
160
+ return this._graph.hf;
161
+ }
162
+ getValue(cell) {
163
+ const value = this._graph.hf.getCellValue({
164
+ sheet: this.sheetId,
165
+ row: cell.row,
166
+ col: cell.col
175
167
  });
176
- this.update.emit();
168
+ if (value instanceof DetailedCellError) {
169
+ return null;
170
+ }
171
+ return value;
172
+ }
173
+ setValue(cell, value) {
174
+ const mappedValue = typeof value === "string" && value.charAt(0) === "=" ? this._graph.mapFormulaToNative(value) : value;
175
+ this._graph.hf.setCellContents({
176
+ sheet: this.sheetId,
177
+ row: cell.row,
178
+ col: cell.col
179
+ }, [
180
+ [
181
+ mappedValue
182
+ ]
183
+ ]);
177
184
  }
178
185
  };
179
186
 
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
+ // packages/plugins/plugin-sheet/src/graph/edge-function.ts
188
+ import { effect } from "@preact/signals-core";
189
+ import { Filter, getMeta } from "@dxos/client/echo";
190
+ import { log as log2 } from "@dxos/log";
191
+ import { getUserFunctionUrlInMetadata } from "@dxos/plugin-script/edge";
192
+ import { FunctionType } from "@dxos/plugin-script/types";
193
+ import { nonNullable } from "@dxos/util";
194
+ import { CellError as CellError2, ErrorType as ErrorType2, FunctionArgumentType } from "#hyperformula";
195
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/edge-function.ts";
196
+ var EDGE_FUNCTION_TTL = 1e4;
197
+ var EdgeFunctionPlugin = class extends FunctionPluginAsync {
198
+ edge(ast, state) {
199
+ const handler = (subscribe = false) => async (binding, ...args) => {
200
+ const space = this.context.space;
201
+ if (!space) {
202
+ return new CellError2(ErrorType2.REF, "Missing space");
203
+ }
204
+ const { objects: [fn] } = await space.db.query(Filter.schema(FunctionType, {
205
+ binding
206
+ })).run();
207
+ if (!fn) {
208
+ log2.info("Function not found", {
209
+ binding
210
+ }, {
211
+ F: __dxlog_file2,
212
+ L: 39,
213
+ S: this,
214
+ C: (f, a) => f(...a)
215
+ });
216
+ return new CellError2(ErrorType2.REF, "Function not found");
217
+ }
218
+ if (subscribe) {
219
+ const unsubscribe = effect(() => {
220
+ log2.info("function changed", {
221
+ fn
222
+ }, {
223
+ F: __dxlog_file2,
224
+ L: 45,
225
+ S: this,
226
+ C: (f, a) => f(...a)
227
+ });
228
+ const _ = fn?.version;
229
+ this.runAsyncFunction(ast, state, handler(false), {
230
+ ttl: EDGE_FUNCTION_TTL
231
+ });
232
+ });
233
+ this.context.createSubscription(ast.procedureName, unsubscribe);
234
+ }
235
+ const path = getUserFunctionUrlInMetadata(getMeta(fn));
236
+ const result = await fetch(`${this.context.remoteFunctionUrl}${path}`, {
237
+ method: "POST",
238
+ headers: {
239
+ "Content-Type": "application/json"
240
+ },
241
+ body: JSON.stringify({
242
+ args: args.filter(nonNullable)
243
+ })
244
+ });
245
+ return await result.text();
246
+ };
247
+ return this.runAsyncFunction(ast, state, handler(true), {
248
+ ttl: EDGE_FUNCTION_TTL
249
+ });
250
+ }
251
+ };
252
+ EdgeFunctionPlugin.implementedFunctions = {
253
+ EDGE: {
254
+ method: "edge",
255
+ parameters: [
256
+ // Binding
257
+ {
258
+ argumentType: FunctionArgumentType.STRING
259
+ },
260
+ // Remote function arguments (currently supporting up to 9).
261
+ {
262
+ argumentType: FunctionArgumentType.ANY,
263
+ optionalArg: true
264
+ },
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/model/functions.ts
310
+ // packages/plugins/plugin-sheet/src/graph/function-defs.ts
189
311
  var defaultFunctions = [
190
312
  // Array
191
313
  {
@@ -2559,685 +2681,243 @@ var defaultFunctions = [
2559
2681
  }
2560
2682
  ];
2561
2683
 
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;
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}`;
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",
2690
+ plugins: [
2691
+ {
2692
+ plugin: EdgeFunctionPlugin,
2693
+ translations: EdgeFunctionPluginTranslations
2694
+ }
2695
+ ]
2583
2696
  };
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
- ]
2697
+ var PREFIX = "__";
2698
+ var createSheetName = (id) => `${PREFIX}${id}`;
2699
+ var getSheetId = (name) => name.startsWith(PREFIX) ? name.slice(PREFIX.length) : void 0;
2700
+ var createComputeGraphRegistry = (options = {}) => {
2701
+ return new ComputeGraphRegistry({
2702
+ ...defaultOptions,
2703
+ ...options
2594
2704
  });
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
2705
  };
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;
2609
- }
2610
- const { from, to } = range;
2611
- if (from && posEquals(from, cell) || to && posEquals(to, cell)) {
2612
- return true;
2613
- }
2614
- if (!from || !to) {
2615
- return false;
2616
- }
2617
- const { column: c1, row: r1 } = from;
2618
- const { column: c2, row: r2 } = to;
2619
- const cMin = Math.min(c1, c2);
2620
- const cMax = Math.max(c1, c2);
2621
- const rMin = Math.min(r1, r2);
2622
- const rMax = Math.max(r1, r2);
2623
- const { column, row } = cell;
2624
- return column >= cMin && column <= cMax && row >= rMin && row <= rMax;
2625
- };
2626
-
2627
- // packages/plugins/plugin-sheet/src/model/util.ts
2628
- import { randomBytes } from "@dxos/crypto";
2629
- var ApiError = class extends Error {
2630
- };
2631
- var ReadonlyException = class extends ApiError {
2632
- };
2633
- var RangeException = class extends ApiError {
2634
- constructor(n) {
2706
+ var ComputeGraphRegistry = class extends Resource2 {
2707
+ constructor(_options = defaultOptions) {
2635
2708
  super();
2709
+ this._options = _options;
2710
+ this._registry = /* @__PURE__ */ new Map();
2711
+ this._options.plugins?.forEach(({ plugin, translations }) => {
2712
+ HyperFormula.registerFunctionPlugin(plugin, translations);
2713
+ });
2636
2714
  }
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
- var addressToIndex = (sheet, cell) => {
2648
- return `${sheet.columns[cell.column]}@${sheet.rows[cell.row]}`;
2649
- };
2650
- var addressFromIndex = (sheet, idx) => {
2651
- const [column, row] = idx.split("@");
2652
- return {
2653
- column: sheet.columns.indexOf(column),
2654
- row: sheet.rows.indexOf(row)
2655
- };
2656
- };
2657
- var rangeFromIndex = (sheet, idx) => {
2658
- const [from, to] = idx.split(":").map((index) => addressFromIndex(sheet, index));
2659
- return {
2660
- from,
2661
- to
2662
- };
2663
- };
2664
- var closest = (cursor, cells) => {
2665
- let closestCell;
2666
- let closestDistance = Number.MAX_SAFE_INTEGER;
2667
- for (const cell of cells) {
2668
- const distance = Math.abs(cell.row - cursor.row) + Math.abs(cell.column - cursor.column);
2669
- if (distance < closestDistance) {
2670
- closestCell = cell;
2671
- closestDistance = distance;
2715
+ getGraph(spaceId) {
2716
+ return this._registry.get(spaceId);
2717
+ }
2718
+ async getOrCreateGraph(space) {
2719
+ let graph = this.getGraph(space.id);
2720
+ if (!graph) {
2721
+ log3.info("create graph", {
2722
+ space: space.id
2723
+ }, {
2724
+ F: __dxlog_file3,
2725
+ L: 95,
2726
+ S: this,
2727
+ C: (f, a) => f(...a)
2728
+ });
2729
+ graph = await this.createGraph(space);
2672
2730
  }
2731
+ return graph;
2673
2732
  }
2674
- return closestCell;
2675
- };
2676
- var compareIndexPositions = (sheet, indexA, indexB) => {
2677
- const { row: rowA, column: columnA } = addressFromIndex(sheet, indexA);
2678
- const { row: rowB, column: columnB } = addressFromIndex(sheet, indexB);
2679
- if (rowA !== rowB) {
2680
- return rowA - rowB;
2681
- } else {
2682
- return columnA - columnB;
2733
+ async createGraph(space) {
2734
+ invariant(!this._registry.has(space.id), `ComputeGraph already exists for space: ${space.id}`, {
2735
+ F: __dxlog_file3,
2736
+ L: 103,
2737
+ S: this,
2738
+ A: [
2739
+ "!this._registry.has(space.id)",
2740
+ "`ComputeGraph already exists for space: ${space.id}`"
2741
+ ]
2742
+ });
2743
+ const hf = HyperFormula.buildEmpty(this._options);
2744
+ const graph = new ComputeGraph(hf, space, this._options);
2745
+ await graph.open(this._ctx);
2746
+ this._registry.set(space.id, graph);
2747
+ return graph;
2683
2748
  }
2684
2749
  };
2685
-
2686
- // packages/plugins/plugin-sheet/src/model/model.ts
2687
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/model/model.ts";
2688
- var DEFAULT_ROWS = 100;
2689
- var DEFAULT_COLUMNS = 26;
2690
- var typeMap = {
2691
- BOOLEAN: ValueTypeEnum.Boolean,
2692
- NUMBER_RAW: ValueTypeEnum.Number,
2693
- NUMBER_PERCENT: ValueTypeEnum.Percent,
2694
- NUMBER_CURRENCY: ValueTypeEnum.Currency,
2695
- NUMBER_DATETIME: ValueTypeEnum.DateTime,
2696
- NUMBER_DATE: ValueTypeEnum.Date,
2697
- NUMBER_TIME: ValueTypeEnum.Time
2698
- };
2699
- var defaultOptions = {
2700
- rows: 50,
2701
- columns: 26,
2702
- mapFormulaBindingFromId: () => (formula) => formula,
2703
- mapFormulaBindingToId: () => (formula) => formula
2704
- };
2705
- var getTopLeft = (range) => {
2706
- const to = range.to ?? range.from;
2707
- return {
2708
- row: Math.min(range.from.row, to.row),
2709
- column: Math.min(range.from.column, to.column)
2710
- };
2711
- };
2712
- var toSimpleCellAddress = (sheet, cell) => ({
2713
- sheet,
2714
- row: cell.row,
2715
- col: cell.column
2716
- });
2717
- var toModelRange = (sheet, range) => ({
2718
- start: toSimpleCellAddress(sheet, range.from),
2719
- end: toSimpleCellAddress(sheet, range.to ?? range.from)
2720
- });
2721
- var SheetModel = class {
2722
- constructor(_graph, _sheet, _space, options = {}) {
2723
- this._graph = _graph;
2724
- this._sheet = _sheet;
2750
+ var ComputeGraph = class extends Resource2 {
2751
+ constructor(_hf, _space, _options) {
2752
+ super();
2753
+ this._hf = _hf;
2725
2754
  this._space = _space;
2726
- this.id = `model-${PublicKey2.random().truncate()}`;
2727
- this._ctx = void 0;
2755
+ this._options = _options;
2756
+ this.id = `graph-${PublicKey.random().truncate()}`;
2757
+ this._nodes = /* @__PURE__ */ new Map();
2728
2758
  this._functions = [];
2759
+ this.context = new FunctionContext(this._hf, this._space, this.refresh.bind(this), this._options);
2729
2760
  this.update = new Event2();
2730
- const name = this._sheet.id;
2731
- if (!this._graph.hf.doesSheetExist(name)) {
2732
- this._graph.hf.addSheet(name);
2733
- }
2734
- this._sheetId = this._graph.hf.getSheetId(name);
2735
- this._options = {
2736
- ...defaultOptions,
2737
- ...options
2738
- };
2739
- this.reset();
2740
- }
2741
- get graph() {
2742
- return this._graph;
2743
- }
2744
- get sheet() {
2745
- return this._sheet;
2746
- }
2747
- get readonly() {
2748
- return this._options.readonly;
2749
- }
2750
- get bounds() {
2751
- return {
2752
- rows: this._sheet.rows.length,
2753
- columns: this._sheet.columns.length
2754
- };
2755
- }
2756
- get functions() {
2757
- const hfFunctions = this._graph.hf.getRegisteredFunctionNames().map((name) => defaultFunctions.find((fn) => fn.name === name) ?? {
2758
- name
2761
+ this._hf.updateConfig({
2762
+ context: this.context
2759
2763
  });
2760
- const echoFunctions = this._functions.map((fn) => ({
2761
- name: fn.binding
2762
- }));
2763
- return [
2764
- ...hfFunctions,
2765
- ...echoFunctions
2766
- ];
2767
- }
2768
- get initialized() {
2769
- return !!this._ctx;
2770
2764
  }
2771
- /**
2772
- * Initialize sheet and engine.
2773
- */
2774
- async initialize() {
2775
- log3("initialize", {
2776
- id: this.id
2777
- }, {
2778
- F: __dxlog_file4,
2779
- L: 142,
2780
- S: this,
2781
- C: (f, a) => f(...a)
2782
- });
2783
- invariant2(!this.initialized, "Already initialized.", {
2784
- F: __dxlog_file4,
2785
- L: 143,
2786
- S: this,
2787
- A: [
2788
- "!this.initialized",
2789
- "'Already initialized.'"
2790
- ]
2791
- });
2792
- this._ctx = new Context(void 0, {
2793
- F: __dxlog_file4,
2794
- L: 144
2795
- });
2796
- if (!this._sheet.rows.length) {
2797
- this._insertIndices(this._sheet.rows, 0, this._options.rows, DEFAULT_ROWS);
2798
- }
2799
- if (!this._sheet.columns.length) {
2800
- this._insertIndices(this._sheet.columns, 0, this._options.columns, DEFAULT_COLUMNS);
2801
- }
2802
- this.reset();
2803
- const unsubscribe = this._graph.update.on(() => this.update.emit());
2804
- this._ctx.onDispose(unsubscribe);
2805
- if (this._space) {
2806
- const { Filter } = await import("@dxos/client/echo");
2807
- const { FunctionType } = await import("@dxos/plugin-script/types");
2808
- const query = this._space?.db.query(Filter.schema(FunctionType));
2809
- const unsubscribe2 = query.subscribe(({ objects }) => {
2810
- this._functions = objects.filter((fn) => fn.binding);
2811
- this.update.emit();
2812
- });
2813
- this._ctx.onDispose(unsubscribe2);
2814
- }
2815
- return this;
2765
+ // TODO(burdon): Remove.
2766
+ get hf() {
2767
+ return this._hf;
2816
2768
  }
2817
- async destroy() {
2818
- log3("destroy", {
2769
+ refresh() {
2770
+ log3("refresh", {
2819
2771
  id: this.id
2820
2772
  }, {
2821
- F: __dxlog_file4,
2822
- L: 174,
2773
+ F: __dxlog_file3,
2774
+ L: 152,
2823
2775
  S: this,
2824
2776
  C: (f, a) => f(...a)
2825
2777
  });
2826
- if (this._ctx) {
2827
- await this._ctx.dispose();
2828
- this._ctx = void 0;
2829
- }
2830
- }
2831
- /**
2832
- * Update engine.
2833
- * NOTE: This resets the undo history.
2834
- * @deprecated
2835
- */
2836
- reset() {
2837
- this._graph.hf.clearSheet(this._sheetId);
2838
- Object.entries(this._sheet.cells).forEach(([key, { value }]) => {
2839
- const { column, row } = addressFromIndex(this._sheet, key);
2840
- if (typeof value === "string" && value.charAt(0) === "=") {
2841
- value = this.mapFormulaBindingToFormula(this.mapFormulaBindingFromId(this.mapFormulaIndicesToRefs(value)));
2842
- }
2843
- this._graph.hf.setCellContents({
2844
- sheet: this._sheetId,
2845
- row,
2846
- col: column
2847
- }, value);
2848
- });
2849
- }
2850
- /**
2851
- * Recalculate formulas.
2852
- * NOTE: This resets the undo history.
2853
- * https://hyperformula.handsontable.com/guide/volatile-functions.html#volatile-actions
2854
- * @deprecated
2855
- */
2856
- // TODO(burdon): Remove.
2857
- recalculate() {
2858
- this._graph.hf.rebuildAndRecalculate();
2859
- }
2860
- insertRows(i, n = 1) {
2861
- this._insertIndices(this._sheet.rows, i, n, DEFAULT_ROWS);
2862
- this.reset();
2778
+ this.update.emit();
2863
2779
  }
2864
- insertColumns(i, n = 1) {
2865
- this._insertIndices(this._sheet.columns, i, n, DEFAULT_COLUMNS);
2866
- this.reset();
2780
+ getFunctions({ standard = true, echo = true } = {}) {
2781
+ return [
2782
+ ...standard ? this._hf.getRegisteredFunctionNames().map((name) => defaultFunctions.find((fn) => fn.name === name) ?? {
2783
+ name
2784
+ }) : [],
2785
+ ...echo ? this._functions.map((fn) => ({
2786
+ name: fn.binding
2787
+ })) : []
2788
+ ];
2867
2789
  }
2868
- //
2869
- // Undoable actions.
2870
- // TODO(burdon): Group undoable methods; consistently update hf/sheet.
2871
- //
2872
2790
  /**
2873
- * Clear range of values.
2791
+ * Get or create cell representing a sheet.
2874
2792
  */
2875
- clear(range) {
2876
- const topLeft = getTopLeft(range);
2877
- const values = this._iterRange(range, () => null);
2878
- this._graph.hf.setCellContents(toSimpleCellAddress(this._sheetId, topLeft), values);
2879
- this._iterRange(range, (cell) => {
2880
- const idx = addressToIndex(this._sheet, cell);
2881
- delete this._sheet.cells[idx];
2882
- });
2883
- }
2884
- cut(range) {
2885
- this._graph.hf.cut(toModelRange(this._sheetId, range));
2886
- this._iterRange(range, (cell) => {
2887
- const idx = addressToIndex(this._sheet, cell);
2888
- delete this._sheet.cells[idx];
2793
+ // TODO(burdon): Async (open node).
2794
+ // The graph should be an extensible factory that plugins extend with model constructors.
2795
+ // This would enable on-the-fly instantiation of new models when then are referenced.
2796
+ // E.g., Cross-object reference would be stored as "ObjectId!A1"
2797
+ // The graph would then load the object and create a ComputeNode (model) of the appropriate type.
2798
+ getOrCreateNode(name) {
2799
+ invariant(name.length, void 0, {
2800
+ F: __dxlog_file3,
2801
+ L: 176,
2802
+ S: this,
2803
+ A: [
2804
+ "name.length",
2805
+ ""
2806
+ ]
2889
2807
  });
2890
- }
2891
- copy(range) {
2892
- this._graph.hf.copy(toModelRange(this._sheetId, range));
2893
- }
2894
- paste(cell) {
2895
- if (!this._graph.hf.isClipboardEmpty()) {
2896
- const changes = this._graph.hf.paste(toSimpleCellAddress(this._sheetId, cell));
2897
- for (const change of changes) {
2898
- if (change instanceof ExportedCellChange) {
2899
- const { address, newValue } = change;
2900
- const idx = addressToIndex(this._sheet, {
2901
- row: address.row,
2902
- column: address.col
2903
- });
2904
- this._sheet.cells[idx] = {
2905
- value: newValue
2906
- };
2907
- }
2908
- }
2909
- }
2910
- }
2911
- // TODO(burdon): Display undo/redo state.
2912
- undo() {
2913
- if (this._graph.hf.isThereSomethingToUndo()) {
2914
- this._graph.hf.undo();
2915
- this.update.emit();
2916
- }
2917
- }
2918
- redo() {
2919
- if (this._graph.hf.isThereSomethingToRedo()) {
2920
- this._graph.hf.redo();
2808
+ if (!this._hf.doesSheetExist(name)) {
2809
+ log3.info("created node", {
2810
+ space: this._space?.id,
2811
+ name
2812
+ }, {
2813
+ F: __dxlog_file3,
2814
+ L: 178,
2815
+ S: this,
2816
+ C: (f, a) => f(...a)
2817
+ });
2818
+ this._hf.addSheet(name);
2921
2819
  this.update.emit();
2922
2820
  }
2923
- }
2924
- /**
2925
- * Get value from sheet.
2926
- */
2927
- getCellValue(cell) {
2928
- const idx = addressToIndex(this._sheet, cell);
2929
- return this._sheet.cells[idx]?.value ?? null;
2930
- }
2931
- /**
2932
- * Get value as a string for editing.
2933
- */
2934
- getCellText(cell) {
2935
- const value = this.getCellValue(cell);
2936
- if (value == null) {
2937
- return void 0;
2938
- }
2939
- if (typeof value === "string" && value.charAt(0) === "=") {
2940
- return this.mapFormulaBindingFromId(this.mapFormulaIndicesToRefs(value));
2941
- } else {
2942
- return String(value);
2943
- }
2944
- }
2945
- /**
2946
- * Get array of raw values from sheet.
2947
- */
2948
- getCellValues(range) {
2949
- return this._iterRange(range, (cell) => this.getCellValue(cell));
2950
- }
2951
- /**
2952
- * Gets the regular or computed value from the engine.
2953
- */
2954
- getValue(cell) {
2955
- const value = this._graph.hf.getCellValue(toSimpleCellAddress(this._sheetId, cell));
2956
- if (value instanceof DetailedCellError) {
2957
- return value.toString();
2958
- }
2959
- return value;
2960
- }
2961
- /**
2962
- * Get value type.
2963
- */
2964
- getValueType(cell) {
2965
- const addr = toSimpleCellAddress(this._sheetId, cell);
2966
- const type = this._graph.hf.getCellValueDetailedType(addr);
2967
- return typeMap[type];
2968
- }
2969
- /**
2970
- * Sets the value, updating the sheet and engine.
2971
- */
2972
- setValue(cell, value) {
2973
- if (this._options.readonly) {
2974
- throw new ReadonlyException();
2975
- }
2976
- let refresh = false;
2977
- if (cell.row >= this._sheet.rows.length) {
2978
- this._insertIndices(this._sheet.rows, cell.row, 1, DEFAULT_ROWS);
2979
- refresh = true;
2980
- }
2981
- if (cell.column >= this._sheet.columns.length) {
2982
- this._insertIndices(this._sheet.columns, cell.column, 1, DEFAULT_COLUMNS);
2983
- refresh = true;
2984
- }
2985
- if (refresh) {
2986
- this.reset();
2987
- }
2988
- this._graph.hf.setCellContents({
2989
- sheet: this._sheetId,
2990
- row: cell.row,
2991
- col: cell.column
2992
- }, [
2993
- [
2994
- typeof value === "string" && value.charAt(0) === "=" ? this.mapFormulaBindingToFormula(value) : value
2821
+ const sheetId = this._hf.getSheetId(name);
2822
+ invariant(sheetId !== void 0, void 0, {
2823
+ F: __dxlog_file3,
2824
+ L: 184,
2825
+ S: this,
2826
+ A: [
2827
+ "sheetId !== undefined",
2828
+ ""
2995
2829
  ]
2996
- ]);
2997
- const idx = addressToIndex(this._sheet, cell);
2998
- if (value === void 0 || value === null) {
2999
- delete this._sheet.cells[idx];
3000
- } else {
3001
- if (typeof value === "string" && value.charAt(0) === "=") {
3002
- value = this.mapFormulaBindingToId(this.mapFormulaRefsToIndices(value));
3003
- }
3004
- this._sheet.cells[idx] = {
3005
- value
3006
- };
3007
- }
3008
- }
3009
- /**
3010
- * Sets values from a simple map.
3011
- */
3012
- setValues(values) {
3013
- Object.entries(values).forEach(([key, { value }]) => {
3014
- this.setValue(addressFromA1Notation(key), value);
3015
2830
  });
2831
+ const node = new ComputeNode(this, sheetId);
2832
+ this._nodes.set(sheetId, node);
2833
+ return node;
3016
2834
  }
3017
2835
  /**
3018
- * Iterate range.
2836
+ * Map bound value to custom function invocation.
2837
+ * E.g., "HELLO(...args)" => "EDGE("HELLO", ...args)".
3019
2838
  */
3020
- _iterRange(range, cb) {
3021
- const to = range.to ?? range.from;
3022
- const rowRange = [
3023
- Math.min(range.from.row, to.row),
3024
- Math.max(range.from.row, to.row)
3025
- ];
3026
- const columnRange = [
3027
- Math.min(range.from.column, to.column),
3028
- Math.max(range.from.column, to.column)
3029
- ];
3030
- const rows = [];
3031
- for (let row = rowRange[0]; row <= rowRange[1]; row++) {
3032
- const rowCells = [];
3033
- for (let column = columnRange[0]; column <= columnRange[1]; column++) {
3034
- const value = cb({
3035
- row,
3036
- column
3037
- });
3038
- if (value !== void 0) {
3039
- rowCells.push(value);
2839
+ mapFormulaToNative(formula) {
2840
+ return formula.replace(/['"]?([ \w]+)['"]?!/, (_match, name) => {
2841
+ if (name) {
2842
+ const objects = this._hf.getSheetNames().map((name2) => {
2843
+ const id = getSheetId(name2);
2844
+ return id ? this._space?.db.getObjectById(id) : void 0;
2845
+ }).filter(nonNullable2);
2846
+ for (const obj of objects) {
2847
+ if (obj.name === name || obj.title === name) {
2848
+ return `${createSheetName(obj.id)}!`;
2849
+ }
3040
2850
  }
3041
2851
  }
3042
- rows.push(rowCells);
3043
- }
3044
- return rows;
3045
- }
3046
- /**
3047
- *
3048
- */
3049
- // TODO(burdon): Insert indices into sheet.
3050
- _insertIndices(indices, i, n, max) {
3051
- if (i + n > max) {
3052
- throw new RangeException(i + n);
3053
- }
3054
- const idx = createIndices(n);
3055
- indices.splice(i, 0, ...idx);
3056
- }
3057
- // TODO(burdon): Delete index.
3058
- _deleteIndices(indices, i, n) {
3059
- throw new Error("Not implemented");
3060
- }
3061
- // TODO(burdon): Move. Cannot use fractional without changing. Switch back to using unique IDs?
3062
- _moveIndices(indices, i, j, n) {
3063
- throw new Error("Not implemented");
3064
- }
3065
- //
3066
- // Indices.
3067
- //
3068
- /**
3069
- * E.g., "HELLO()" => "EDGE("HELLO")".
3070
- */
3071
- mapFormulaBindingToFormula(formula) {
3072
- return formula.replace(/([a-zA-Z0-9]+)\((.*)\)/g, (match, binding, args) => {
2852
+ return `${name}!`;
2853
+ }).replace(/(\w+)\((.*)\)/g, (match, binding, args) => {
3073
2854
  const fn = this._functions.find((fn2) => fn2.binding === binding);
3074
2855
  if (!fn) {
3075
2856
  return match;
3076
2857
  }
3077
2858
  if (args.trim() === "") {
3078
- return `EDGE("${binding}")`;
2859
+ return `${CUSTOM_FUNCTION}("${binding}")`;
2860
+ } else {
2861
+ return `${CUSTOM_FUNCTION}("${binding}", ${args})`;
3079
2862
  }
3080
- return `EDGE("${binding}", ${args})`;
3081
2863
  });
3082
2864
  }
3083
2865
  /**
3084
- * E.g., "EDGE("HELLO")" => "HELLO()".
2866
+ * Map from binding to fully qualified ECHO ID (to store).
2867
+ * E.g., HELLO() => spaceId:objectId()
3085
2868
  */
3086
- mapFormulaBindingFromFormula(formula) {
3087
- return formula.replace(/EDGE\("([a-zA-Z0-9]+)"(.*)\)/, (_match, binding, args) => {
3088
- if (args.trim() === "") {
3089
- return `${binding}()`;
2869
+ mapFunctionBindingToId(formula) {
2870
+ return formula.replace(/(\w+)\((.*)\)/g, (match, binding, args) => {
2871
+ if (binding === CUSTOM_FUNCTION || defaultFunctions.find((fn2) => fn2.name === binding)) {
2872
+ return match;
2873
+ }
2874
+ const fn = this._functions.find((fn2) => fn2.binding === binding);
2875
+ if (fn) {
2876
+ const id = fullyQualifiedId(fn);
2877
+ return `${id}(${args})`;
2878
+ } else {
2879
+ return match;
3090
2880
  }
3091
- return `${binding}(${args.slice(2)})`;
3092
- });
3093
- }
3094
- /**
3095
- * Map from binding to fully qualified ECHO ID.
3096
- */
3097
- mapFormulaBindingToId(formula) {
3098
- return this._options.mapFormulaBindingToId(this._functions)(formula);
3099
- }
3100
- /**
3101
- * Map from fully qualified ECHO ID to binding.
3102
- */
3103
- mapFormulaBindingFromId(formula) {
3104
- return this._options.mapFormulaBindingFromId(this._functions)(formula);
3105
- }
3106
- /**
3107
- * Map from A1 notation to indices.
3108
- */
3109
- mapFormulaRefsToIndices(formula) {
3110
- invariant2(formula.charAt(0) === "=", void 0, {
3111
- F: __dxlog_file4,
3112
- L: 475,
3113
- S: this,
3114
- A: [
3115
- "formula.charAt(0) === '='",
3116
- ""
3117
- ]
3118
- });
3119
- return formula.replace(/([a-zA-Z]+)([0-9]+)/g, (match) => {
3120
- return addressToIndex(this._sheet, addressFromA1Notation(match));
3121
- });
3122
- }
3123
- /**
3124
- * Map from indices to A1 notation.
3125
- */
3126
- mapFormulaIndicesToRefs(formula) {
3127
- invariant2(formula.charAt(0) === "=", void 0, {
3128
- F: __dxlog_file4,
3129
- L: 485,
3130
- S: this,
3131
- A: [
3132
- "formula.charAt(0) === '='",
3133
- ""
3134
- ]
3135
- });
3136
- return formula.replace(/([a-zA-Z0-9]+)@([a-zA-Z0-9]+)/g, (idx) => {
3137
- return addressToA1Notation(addressFromIndex(this._sheet, idx));
3138
2881
  });
3139
2882
  }
3140
- //
3141
- // Values
3142
- //
3143
2883
  /**
3144
- * https://hyperformula.handsontable.com/guide/date-and-time-handling.html#example
3145
- * https://hyperformula.handsontable.com/api/interfaces/configparams.html#nulldate
3146
- * NOTE: TODAY() is number of FULL days since nullDate. It will typically be -1 days from NOW().
2884
+ * Map from fully qualified ECHO ID to binding (from store).
2885
+ * E.g., spaceId:objectId() => HELLO()
3147
2886
  */
3148
- toLocalDate(num) {
3149
- const { year, month, day, hours, minutes, seconds } = this.toDateTime(num);
3150
- return new Date(year, month - 1, day, hours, minutes, seconds);
3151
- }
3152
- toDateTime(num) {
3153
- return this._graph.hf.numberToDateTime(num);
3154
- }
3155
- toDate(num) {
3156
- return this._graph.hf.numberToDate(num);
3157
- }
3158
- toTime(num) {
3159
- return this._graph.hf.numberToTime(num);
3160
- }
3161
- };
3162
-
3163
- // packages/plugins/plugin-sheet/src/components/ComputeGraph/custom.ts
3164
- import { FunctionArgumentType } from "hyperformula";
3165
- import { getDeep } from "@dxos/util";
3166
- var parseNumberString = (str) => {
3167
- return parseFloat(str.replace(/[^\d.]/g, ""));
3168
- };
3169
- var CustomPlugin = class extends FunctionPluginAsync {
3170
- test(ast, state) {
3171
- const handler = async () => {
3172
- return Math.random();
3173
- };
3174
- return this.runAsyncFunction(ast, state, handler);
3175
- }
3176
- crypto(ast, state) {
3177
- const handler = async (_currency) => {
3178
- const currency = (_currency || "USD").toUpperCase();
3179
- const result = await fetch(`https://api.coindesk.com/v1/bpi/currentprice/${currency}.json`);
3180
- const data = await result.json();
3181
- const rate = getDeep(data, [
3182
- "bpi",
3183
- currency,
3184
- "rate"
3185
- ]);
3186
- if (!rate) {
3187
- return NaN;
2887
+ mapFunctionBindingFromId(formula) {
2888
+ return formula.replace(/(\w+):([a-zA-Z0-9]+)\((.*)\)/g, (match, spaceId, objectId, args) => {
2889
+ const id = `${spaceId}:${objectId}`;
2890
+ if (id.length !== OBJECT_ID_LENGTH) {
2891
+ return match;
3188
2892
  }
3189
- return parseNumberString(rate);
3190
- };
3191
- return this.runAsyncFunction(ast, state, handler, {
3192
- ttl: 1e4
3193
- });
3194
- }
3195
- };
3196
- CustomPlugin.implementedFunctions = {
3197
- TEST: {
3198
- method: "test",
3199
- parameters: [],
3200
- isVolatile: true
3201
- },
3202
- CRYPTO: {
3203
- method: "crypto",
3204
- parameters: [
3205
- {
3206
- argumentType: FunctionArgumentType.STRING,
3207
- optionalArg: true
2893
+ const fn = this._functions.find((fn2) => fullyQualifiedId(fn2) === id);
2894
+ if (fn?.binding) {
2895
+ return `${fn.binding}(${args})`;
2896
+ } else {
2897
+ return match;
3208
2898
  }
3209
- ],
3210
- isVolatile: true
2899
+ });
3211
2900
  }
3212
- };
3213
- var CustomPluginTranslations = {
3214
- enGB: {
3215
- TEST: "TEST",
3216
- CRYPTO: "CRYPTO"
3217
- },
3218
- enUS: {
3219
- TEST: "TEST",
3220
- CRYPTO: "CRYPTO"
2901
+ async _open() {
2902
+ if (this._space) {
2903
+ const query = this._space.db.query(Filter2.schema(FunctionType2));
2904
+ const unsubscribe = query.subscribe(({ objects }) => {
2905
+ this._functions = objects.filter(({ binding }) => binding);
2906
+ this.update.emit();
2907
+ });
2908
+ this._ctx.onDispose(unsubscribe);
2909
+ }
3221
2910
  }
3222
2911
  };
3223
2912
 
3224
2913
  export {
3225
- FunctionPluginAsync,
3226
- CustomPlugin,
3227
- CustomPluginTranslations,
3228
- createComputeGraph,
2914
+ ComputeNode,
3229
2915
  defaultFunctions,
3230
- posEquals,
3231
- columnLetter,
3232
- addressToA1Notation,
3233
- addressFromA1Notation,
3234
- rangeToA1Notation,
3235
- inRange,
3236
- addressToIndex,
3237
- addressFromIndex,
3238
- rangeFromIndex,
3239
- closest,
3240
- compareIndexPositions,
3241
- SheetModel
2916
+ defaultOptions,
2917
+ createSheetName,
2918
+ getSheetId,
2919
+ createComputeGraphRegistry,
2920
+ ComputeGraphRegistry,
2921
+ ComputeGraph
3242
2922
  };
3243
- //# sourceMappingURL=chunk-GNNVBNCX.mjs.map
2923
+ //# sourceMappingURL=chunk-6ZMQVB4Z.mjs.map