@dxos/plugin-sheet 0.6.12-staging.e11e696 → 0.6.12

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 (277) hide show
  1. package/dist/lib/browser/{chunk-CHQAW4F4.mjs → SheetContainer-U4H5D34A.mjs} +249 -1182
  2. package/dist/lib/browser/SheetContainer-U4H5D34A.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-APHOLYUB.mjs +175 -0
  4. package/dist/lib/browser/chunk-APHOLYUB.mjs.map +7 -0
  5. package/dist/lib/{node-esm/chunk-5WPZCXNS.mjs → browser/chunk-D5AGLXJP.mjs} +678 -411
  6. package/dist/lib/browser/chunk-D5AGLXJP.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-WZMOZKQZ.mjs → chunk-FUAGSXA4.mjs} +16 -9
  8. package/dist/lib/browser/chunk-FUAGSXA4.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-QILRZNE5.mjs → chunk-JRL5LGCE.mjs} +5 -2
  10. package/dist/lib/browser/chunk-JRL5LGCE.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-NU4PBN33.mjs +8 -0
  12. package/dist/lib/browser/chunk-NU4PBN33.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +60 -96
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/meta.mjs +1 -1
  17. package/dist/lib/browser/testing.mjs +92 -0
  18. package/dist/lib/browser/testing.mjs.map +7 -0
  19. package/dist/lib/browser/types.mjs +6 -4
  20. package/dist/lib/node/{chunk-5FTFZL5W.cjs → SheetContainer-AXQV3ZT5.cjs} +287 -1212
  21. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs.map +7 -0
  22. package/dist/lib/node/{chunk-5XPK2V4A.cjs → chunk-5KKJ4NPP.cjs} +678 -418
  23. package/dist/lib/node/chunk-5KKJ4NPP.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-BNARJ5GM.cjs → chunk-BJ6ZD7MN.cjs} +18 -5
  25. package/dist/lib/node/chunk-BJ6ZD7MN.cjs.map +7 -0
  26. package/dist/lib/node/chunk-CN3RPESU.cjs +202 -0
  27. package/dist/lib/node/chunk-CN3RPESU.cjs.map +7 -0
  28. package/dist/lib/node/{chunk-AOP42UAA.cjs → chunk-DSYKOI4E.cjs} +21 -13
  29. package/dist/lib/node/chunk-DSYKOI4E.cjs.map +7 -0
  30. package/dist/lib/node/chunk-PYXHNAAK.cjs +40 -0
  31. package/dist/lib/node/chunk-PYXHNAAK.cjs.map +7 -0
  32. package/dist/lib/node/index.cjs +66 -106
  33. package/dist/lib/node/index.cjs.map +4 -4
  34. package/dist/lib/node/meta.cjs +3 -3
  35. package/dist/lib/node/meta.cjs.map +1 -1
  36. package/dist/lib/node/meta.json +1 -1
  37. package/dist/lib/node/testing.cjs +111 -0
  38. package/dist/lib/node/testing.cjs.map +7 -0
  39. package/dist/lib/node/types.cjs +12 -10
  40. package/dist/lib/node/types.cjs.map +2 -2
  41. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  42. package/dist/types/src/components/CellEditor/CellEditor.d.ts +3 -23
  43. package/dist/types/src/components/CellEditor/CellEditor.d.ts.map +1 -1
  44. package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts +2 -2
  45. package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/CellEditor/extension.d.ts +1 -1
  47. package/dist/types/src/components/CellEditor/extension.d.ts.map +1 -1
  48. package/dist/types/src/{graph/functions → components/ComputeGraph}/async-function.d.ts +5 -14
  49. package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +1 -0
  50. package/dist/types/src/components/ComputeGraph/custom.d.ts +21 -0
  51. package/dist/types/src/components/ComputeGraph/custom.d.ts.map +1 -0
  52. package/dist/types/src/components/ComputeGraph/edge-function.d.ts +20 -0
  53. package/dist/types/src/components/ComputeGraph/edge-function.d.ts.map +1 -0
  54. package/dist/types/src/components/ComputeGraph/graph-context.d.ts +12 -0
  55. package/dist/types/src/components/ComputeGraph/graph-context.d.ts.map +1 -0
  56. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts +2 -0
  57. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts.map +1 -0
  58. package/dist/types/src/components/ComputeGraph/graph.d.ts +26 -0
  59. package/dist/types/src/components/ComputeGraph/graph.d.ts.map +1 -0
  60. package/dist/types/src/components/ComputeGraph/index.d.ts +3 -1
  61. package/dist/types/src/components/ComputeGraph/index.d.ts.map +1 -1
  62. package/dist/types/src/components/Sheet/Sheet.d.ts +1 -1
  63. package/dist/types/src/components/Sheet/Sheet.d.ts.map +1 -1
  64. package/dist/types/src/components/Sheet/Sheet.stories.d.ts +6 -5
  65. package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +1 -1
  66. package/dist/types/src/components/Sheet/formatting.d.ts +14 -0
  67. package/dist/types/src/components/Sheet/formatting.d.ts.map +1 -0
  68. package/dist/types/src/components/Sheet/grid.d.ts +2 -2
  69. package/dist/types/src/components/Sheet/grid.d.ts.map +1 -1
  70. package/dist/types/src/components/Sheet/nav.d.ts +3 -3
  71. package/dist/types/src/components/Sheet/nav.d.ts.map +1 -1
  72. package/dist/types/src/components/Sheet/sheet-context.d.ts +7 -8
  73. package/dist/types/src/components/Sheet/sheet-context.d.ts.map +1 -1
  74. package/dist/types/src/components/SheetContainer.d.ts +3 -2
  75. package/dist/types/src/components/SheetContainer.d.ts.map +1 -1
  76. package/dist/types/src/components/Toolbar/Toolbar.d.ts +3 -19
  77. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  78. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +13 -18
  79. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/index.d.ts +2 -2
  81. package/dist/types/src/components/index.d.ts.map +1 -1
  82. package/dist/types/src/meta.d.ts +4 -1
  83. package/dist/types/src/meta.d.ts.map +1 -1
  84. package/dist/types/src/{graph/functions/function-defs.d.ts → model/functions.d.ts} +1 -1
  85. package/dist/types/src/model/functions.d.ts.map +1 -0
  86. package/dist/types/src/model/index.d.ts +3 -2
  87. package/dist/types/src/model/index.d.ts.map +1 -1
  88. package/dist/types/src/model/model.browser.test.d.ts +2 -0
  89. package/dist/types/src/model/model.browser.test.d.ts.map +1 -0
  90. package/dist/types/src/model/{sheet-model.d.ts → model.d.ts} +65 -10
  91. package/dist/types/src/model/model.d.ts.map +1 -0
  92. package/dist/types/src/{defs → model}/types.d.ts +3 -8
  93. package/dist/types/src/model/types.d.ts.map +1 -0
  94. package/dist/types/src/model/types.test.d.ts.map +1 -0
  95. package/dist/types/src/model/util.d.ts +15 -0
  96. package/dist/types/src/model/util.d.ts.map +1 -0
  97. package/dist/types/src/testing.d.ts +9 -0
  98. package/dist/types/src/testing.d.ts.map +1 -0
  99. package/dist/types/src/translations.d.ts +12 -17
  100. package/dist/types/src/translations.d.ts.map +1 -1
  101. package/dist/types/src/types.d.ts +5 -86
  102. package/dist/types/src/types.d.ts.map +1 -1
  103. package/package.json +47 -55
  104. package/src/SheetPlugin.tsx +73 -50
  105. package/src/components/CellEditor/CellEditor.stories.tsx +6 -6
  106. package/src/components/CellEditor/CellEditor.tsx +9 -59
  107. package/src/components/CellEditor/extension.test.ts +6 -4
  108. package/src/components/CellEditor/extension.ts +6 -5
  109. package/src/{graph/functions → components/ComputeGraph}/async-function.ts +15 -25
  110. package/src/{graph/testing/test-plugin.ts → components/ComputeGraph/custom.ts} +14 -44
  111. package/src/{graph/functions → components/ComputeGraph}/edge-function.ts +14 -16
  112. package/src/components/ComputeGraph/graph-context.tsx +50 -0
  113. package/src/components/ComputeGraph/graph.browser.test.ts +50 -0
  114. package/src/components/ComputeGraph/graph.ts +62 -0
  115. package/src/components/ComputeGraph/index.ts +3 -1
  116. package/src/components/Sheet/Sheet.stories.tsx +88 -52
  117. package/src/components/Sheet/Sheet.tsx +32 -87
  118. package/src/{model/formatting-model.ts → components/Sheet/formatting.ts} +13 -20
  119. package/src/components/Sheet/grid.ts +3 -3
  120. package/src/components/Sheet/nav.ts +19 -19
  121. package/src/components/Sheet/sheet-context.tsx +80 -18
  122. package/src/components/SheetContainer.tsx +16 -68
  123. package/src/components/Toolbar/Toolbar.tsx +12 -53
  124. package/src/components/index.ts +0 -1
  125. package/src/meta.tsx +5 -1
  126. package/src/model/index.ts +3 -2
  127. package/src/model/model.browser.test.ts +100 -0
  128. package/src/model/model.ts +550 -0
  129. package/src/{defs → model}/types.test.ts +9 -8
  130. package/src/{defs → model}/types.ts +14 -24
  131. package/src/model/util.ts +36 -0
  132. package/src/testing.ts +50 -0
  133. package/src/translations.ts +1 -6
  134. package/src/types.ts +6 -31
  135. package/dist/lib/browser/SheetContainer-LG77O4RM.mjs +0 -262
  136. package/dist/lib/browser/SheetContainer-LG77O4RM.mjs.map +0 -7
  137. package/dist/lib/browser/chunk-CHQAW4F4.mjs.map +0 -7
  138. package/dist/lib/browser/chunk-GSV5QNLD.mjs +0 -2966
  139. package/dist/lib/browser/chunk-GSV5QNLD.mjs.map +0 -7
  140. package/dist/lib/browser/chunk-QILRZNE5.mjs.map +0 -7
  141. package/dist/lib/browser/chunk-WZMOZKQZ.mjs.map +0 -7
  142. package/dist/lib/browser/graph-M4IQ76QX.mjs +0 -33
  143. package/dist/lib/browser/graph-M4IQ76QX.mjs.map +0 -7
  144. package/dist/lib/node/SheetContainer-OZ7DHH4L.cjs +0 -280
  145. package/dist/lib/node/SheetContainer-OZ7DHH4L.cjs.map +0 -7
  146. package/dist/lib/node/chunk-5FTFZL5W.cjs.map +0 -7
  147. package/dist/lib/node/chunk-5XPK2V4A.cjs.map +0 -7
  148. package/dist/lib/node/chunk-AOP42UAA.cjs.map +0 -7
  149. package/dist/lib/node/chunk-BNARJ5GM.cjs.map +0 -7
  150. package/dist/lib/node/graph-Q3N2X26H.cjs +0 -55
  151. package/dist/lib/node/graph-Q3N2X26H.cjs.map +0 -7
  152. package/dist/lib/node-esm/SheetContainer-4XS2G25Z.mjs +0 -263
  153. package/dist/lib/node-esm/SheetContainer-4XS2G25Z.mjs.map +0 -7
  154. package/dist/lib/node-esm/chunk-5WPZCXNS.mjs.map +0 -7
  155. package/dist/lib/node-esm/chunk-IU2L277A.mjs +0 -17
  156. package/dist/lib/node-esm/chunk-IU2L277A.mjs.map +0 -7
  157. package/dist/lib/node-esm/chunk-KK3XL37M.mjs +0 -2706
  158. package/dist/lib/node-esm/chunk-KK3XL37M.mjs.map +0 -7
  159. package/dist/lib/node-esm/chunk-RR2AO4SM.mjs +0 -76
  160. package/dist/lib/node-esm/chunk-RR2AO4SM.mjs.map +0 -7
  161. package/dist/lib/node-esm/graph-SMPUMOV2.mjs +0 -34
  162. package/dist/lib/node-esm/graph-SMPUMOV2.mjs.map +0 -7
  163. package/dist/lib/node-esm/index.mjs +0 -285
  164. package/dist/lib/node-esm/index.mjs.map +0 -7
  165. package/dist/lib/node-esm/meta.json +0 -1
  166. package/dist/lib/node-esm/meta.mjs +0 -10
  167. package/dist/lib/node-esm/meta.mjs.map +0 -7
  168. package/dist/lib/node-esm/types.mjs +0 -21
  169. package/dist/lib/node-esm/types.mjs.map +0 -7
  170. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +0 -11
  171. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +0 -1
  172. package/dist/types/src/components/GridSheet/GridSheet.d.ts +0 -10
  173. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +0 -1
  174. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +0 -9
  175. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +0 -1
  176. package/dist/types/src/components/GridSheet/util.d.ts +0 -7
  177. package/dist/types/src/components/GridSheet/util.d.ts.map +0 -1
  178. package/dist/types/src/components/Sheet/decorations.d.ts +0 -24
  179. package/dist/types/src/components/Sheet/decorations.d.ts.map +0 -1
  180. package/dist/types/src/components/Sheet/threads.d.ts +0 -2
  181. package/dist/types/src/components/Sheet/threads.d.ts.map +0 -1
  182. package/dist/types/src/defs/index.d.ts +0 -3
  183. package/dist/types/src/defs/index.d.ts.map +0 -1
  184. package/dist/types/src/defs/types.d.ts.map +0 -1
  185. package/dist/types/src/defs/types.test.d.ts.map +0 -1
  186. package/dist/types/src/defs/util.d.ts +0 -43
  187. package/dist/types/src/defs/util.d.ts.map +0 -1
  188. package/dist/types/src/extensions/compute.d.ts +0 -6
  189. package/dist/types/src/extensions/compute.d.ts.map +0 -1
  190. package/dist/types/src/extensions/compute.stories.d.ts +0 -26
  191. package/dist/types/src/extensions/compute.stories.d.ts.map +0 -1
  192. package/dist/types/src/extensions/index.d.ts +0 -2
  193. package/dist/types/src/extensions/index.d.ts.map +0 -1
  194. package/dist/types/src/graph/compute-graph-registry.d.ts +0 -34
  195. package/dist/types/src/graph/compute-graph-registry.d.ts.map +0 -1
  196. package/dist/types/src/graph/compute-graph.d.ts +0 -64
  197. package/dist/types/src/graph/compute-graph.d.ts.map +0 -1
  198. package/dist/types/src/graph/compute-graph.stories.d.ts +0 -10
  199. package/dist/types/src/graph/compute-graph.stories.d.ts.map +0 -1
  200. package/dist/types/src/graph/compute-graph.test.d.ts +0 -2
  201. package/dist/types/src/graph/compute-graph.test.d.ts.map +0 -1
  202. package/dist/types/src/graph/compute-node.d.ts +0 -26
  203. package/dist/types/src/graph/compute-node.d.ts.map +0 -1
  204. package/dist/types/src/graph/functions/async-function.d.ts.map +0 -1
  205. package/dist/types/src/graph/functions/edge-function.d.ts +0 -21
  206. package/dist/types/src/graph/functions/edge-function.d.ts.map +0 -1
  207. package/dist/types/src/graph/functions/function-defs.d.ts.map +0 -1
  208. package/dist/types/src/graph/functions/index.d.ts +0 -4
  209. package/dist/types/src/graph/functions/index.d.ts.map +0 -1
  210. package/dist/types/src/graph/hyperformula.test.d.ts +0 -2
  211. package/dist/types/src/graph/hyperformula.test.d.ts.map +0 -1
  212. package/dist/types/src/graph/index.d.ts +0 -5
  213. package/dist/types/src/graph/index.d.ts.map +0 -1
  214. package/dist/types/src/graph/testing/index.d.ts +0 -3
  215. package/dist/types/src/graph/testing/index.d.ts.map +0 -1
  216. package/dist/types/src/graph/testing/test-builder.d.ts +0 -15
  217. package/dist/types/src/graph/testing/test-builder.d.ts.map +0 -1
  218. package/dist/types/src/graph/testing/test-plugin.d.ts +0 -36
  219. package/dist/types/src/graph/testing/test-plugin.d.ts.map +0 -1
  220. package/dist/types/src/graph/util.d.ts +0 -2
  221. package/dist/types/src/graph/util.d.ts.map +0 -1
  222. package/dist/types/src/hooks/hooks.stories.d.ts +0 -11
  223. package/dist/types/src/hooks/hooks.stories.d.ts.map +0 -1
  224. package/dist/types/src/hooks/index.d.ts +0 -4
  225. package/dist/types/src/hooks/index.d.ts.map +0 -1
  226. package/dist/types/src/hooks/useComputeGraph.d.ts +0 -7
  227. package/dist/types/src/hooks/useComputeGraph.d.ts.map +0 -1
  228. package/dist/types/src/hooks/useFormattingModel.d.ts +0 -3
  229. package/dist/types/src/hooks/useFormattingModel.d.ts.map +0 -1
  230. package/dist/types/src/hooks/useSheetModel.d.ts +0 -8
  231. package/dist/types/src/hooks/useSheetModel.d.ts.map +0 -1
  232. package/dist/types/src/model/formatting-model.d.ts +0 -16
  233. package/dist/types/src/model/formatting-model.d.ts.map +0 -1
  234. package/dist/types/src/model/sheet-model.d.ts.map +0 -1
  235. package/dist/types/src/model/sheet-model.test.d.ts +0 -2
  236. package/dist/types/src/model/sheet-model.test.d.ts.map +0 -1
  237. package/dist/types/src/sanity.test.d.ts +0 -2
  238. package/dist/types/src/sanity.test.d.ts.map +0 -1
  239. package/dist/types/src/testing/index.d.ts +0 -2
  240. package/dist/types/src/testing/index.d.ts.map +0 -1
  241. package/dist/types/src/testing/testing.d.ts +0 -8
  242. package/dist/types/src/testing/testing.d.ts.map +0 -1
  243. package/dist/vendor/hyperformula.mjs +0 -37145
  244. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +0 -20
  245. package/src/components/GridSheet/GridSheet.stories.tsx +0 -36
  246. package/src/components/GridSheet/GridSheet.tsx +0 -153
  247. package/src/components/GridSheet/util.ts +0 -108
  248. package/src/components/Sheet/decorations.ts +0 -62
  249. package/src/components/Sheet/threads.tsx +0 -205
  250. package/src/defs/index.ts +0 -6
  251. package/src/defs/util.ts +0 -151
  252. package/src/extensions/compute.stories.tsx +0 -151
  253. package/src/extensions/compute.ts +0 -147
  254. package/src/extensions/index.ts +0 -5
  255. package/src/graph/compute-graph-registry.ts +0 -90
  256. package/src/graph/compute-graph.stories.tsx +0 -93
  257. package/src/graph/compute-graph.test.ts +0 -87
  258. package/src/graph/compute-graph.ts +0 -242
  259. package/src/graph/compute-node.ts +0 -63
  260. package/src/graph/functions/index.ts +0 -7
  261. package/src/graph/hyperformula.test.ts +0 -14
  262. package/src/graph/index.ts +0 -8
  263. package/src/graph/testing/index.ts +0 -6
  264. package/src/graph/testing/test-builder.ts +0 -54
  265. package/src/graph/util.ts +0 -8
  266. package/src/hooks/hooks.stories.tsx +0 -50
  267. package/src/hooks/index.ts +0 -7
  268. package/src/hooks/useComputeGraph.ts +0 -28
  269. package/src/hooks/useFormattingModel.ts +0 -11
  270. package/src/hooks/useSheetModel.ts +0 -40
  271. package/src/model/sheet-model.test.ts +0 -59
  272. package/src/model/sheet-model.ts +0 -416
  273. package/src/sanity.test.ts +0 -40
  274. package/src/testing/index.ts +0 -5
  275. package/src/testing/testing.tsx +0 -68
  276. /package/dist/types/src/{defs → model}/types.test.d.ts +0 -0
  277. /package/src/{graph/functions/function-defs.ts → model/functions.ts} +0 -0
@@ -3,6 +3,7 @@
3
3
  //
4
4
 
5
5
  import { effect } from '@preact/signals-core';
6
+ import { CellError, ErrorType, FunctionArgumentType } from 'hyperformula';
6
7
  import { type InterpreterState } from 'hyperformula/typings/interpreter/InterpreterState';
7
8
  import { type ProcedureAst } from 'hyperformula/typings/parser';
8
9
 
@@ -12,20 +13,17 @@ import { getUserFunctionUrlInMetadata } from '@dxos/plugin-script/edge';
12
13
  import { FunctionType } from '@dxos/plugin-script/types';
13
14
  import { nonNullable } from '@dxos/util';
14
15
 
15
- import { CellError, ErrorType, FunctionArgumentType } from '#hyperformula';
16
- import { type AsyncFunction, AsyncFunctionPlugin } from './async-function';
16
+ import { type AsyncFunction, FunctionPluginAsync } from './async-function';
17
17
 
18
- export const EDGE_FUNCTION_NAME = 'DX';
19
-
20
- const FUNCTION_TTL = 10_000;
18
+ const EDGE_FUNCTION_TTL = 10_000;
21
19
 
22
20
  /**
23
- * A hyperformula function plugin for calling remote (EDGE) functions.
21
+ * A hyperformula function plugin for calling EDGE functions.
24
22
  *
25
23
  * https://hyperformula.handsontable.com/guide/custom-functions.html#add-a-simple-custom-function
26
24
  */
27
- export class EdgeFunctionPlugin extends AsyncFunctionPlugin {
28
- dx(ast: ProcedureAst, state: InterpreterState) {
25
+ export class EdgeFunctionPlugin extends FunctionPluginAsync {
26
+ edge(ast: ProcedureAst, state: InterpreterState) {
29
27
  const handler =
30
28
  (subscribe = false): AsyncFunction =>
31
29
  async (binding: string, ...args: any) => {
@@ -49,7 +47,7 @@ export class EdgeFunctionPlugin extends AsyncFunctionPlugin {
49
47
 
50
48
  // TODO(wittjosiah): `ttl` should be 0 to force a recalculation when a new version is deployed.
51
49
  // This needs a ttl to prevent a binding change from causing the function not to be found.
52
- this.runAsyncFunction(ast, state, handler(false), { ttl: FUNCTION_TTL });
50
+ this.runAsyncFunction(ast, state, handler(false), { ttl: EDGE_FUNCTION_TTL });
53
51
  });
54
52
 
55
53
  this.context.createSubscription(ast.procedureName, unsubscribe);
@@ -61,22 +59,22 @@ export class EdgeFunctionPlugin extends AsyncFunctionPlugin {
61
59
  headers: { 'Content-Type': 'application/json' },
62
60
  body: JSON.stringify({ args: args.filter(nonNullable) }),
63
61
  });
64
-
65
62
  return await result.text();
66
63
  };
67
64
 
68
- return this.runAsyncFunction(ast, state, handler(true), { ttl: FUNCTION_TTL });
65
+ return this.runAsyncFunction(ast, state, handler(true), { ttl: EDGE_FUNCTION_TTL });
69
66
  }
70
67
  }
71
68
 
72
69
  EdgeFunctionPlugin.implementedFunctions = {
73
- [EDGE_FUNCTION_NAME]: {
74
- method: 'dx',
70
+ EDGE: {
71
+ method: 'edge',
75
72
  parameters: [
76
73
  // Binding
77
74
  { argumentType: FunctionArgumentType.STRING },
78
75
 
79
- // Remote function arguments (currently supporting up to 8).
76
+ // Remote function arguments (currently supporting up to 9).
77
+ { argumentType: FunctionArgumentType.ANY, optionalArg: true },
80
78
  { argumentType: FunctionArgumentType.ANY, optionalArg: true },
81
79
  { argumentType: FunctionArgumentType.ANY, optionalArg: true },
82
80
  { argumentType: FunctionArgumentType.ANY, optionalArg: true },
@@ -92,9 +90,9 @@ EdgeFunctionPlugin.implementedFunctions = {
92
90
 
93
91
  export const EdgeFunctionPluginTranslations = {
94
92
  enGB: {
95
- [EDGE_FUNCTION_NAME]: 'Remote function',
93
+ EDGE: 'EDGE',
96
94
  },
97
95
  enUS: {
98
- [EDGE_FUNCTION_NAME]: 'Remote function',
96
+ EDGE: 'EDGE',
99
97
  },
100
98
  };
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React, { createContext, type PropsWithChildren, useContext, useEffect } from 'react';
6
+
7
+ import { type Space } from '@dxos/react-client/echo';
8
+
9
+ import { type FunctionContextOptions } from './async-function';
10
+ import { CustomPlugin, CustomPluginTranslations } from './custom';
11
+ import { EdgeFunctionPlugin, EdgeFunctionPluginTranslations } from './edge-function';
12
+ import { createComputeGraph, type ComputeGraph } from './graph';
13
+
14
+ export type ComputeGraphContextType = {
15
+ graphs: Record<string, ComputeGraph>;
16
+ setGraph: (key: string, graph: ComputeGraph) => void;
17
+ };
18
+
19
+ export const ComputeGraphContext = createContext<ComputeGraphContextType>({ graphs: {}, setGraph: () => {} });
20
+
21
+ export const ComputeGraphContextProvider = ({
22
+ children,
23
+ graphs,
24
+ setGraph,
25
+ }: PropsWithChildren<ComputeGraphContextType>) => {
26
+ return <ComputeGraphContext.Provider value={{ graphs, setGraph }}>{children}</ComputeGraphContext.Provider>;
27
+ };
28
+
29
+ export const useComputeGraph = (space: Space, options?: Partial<FunctionContextOptions>): ComputeGraph => {
30
+ const { graphs, setGraph } = useContext(ComputeGraphContext);
31
+ const graph =
32
+ graphs[space.id] ??
33
+ createComputeGraph(
34
+ [
35
+ { plugin: EdgeFunctionPlugin, translations: EdgeFunctionPluginTranslations },
36
+ // TODO(wittjosiah): Remove. Needed for current test sheet generated data.
37
+ { plugin: CustomPlugin, translations: CustomPluginTranslations },
38
+ ],
39
+ space,
40
+ options,
41
+ );
42
+
43
+ useEffect(() => {
44
+ if (!graphs[space.id]) {
45
+ setGraph(space.id, graph);
46
+ }
47
+ }, [space]);
48
+
49
+ return graph;
50
+ };
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { expect } from 'chai';
6
+ import { describe, test } from 'vitest';
7
+
8
+ import { Trigger } from '@dxos/async';
9
+
10
+ import { CustomPlugin, CustomPluginTranslations } from './custom';
11
+ import { createComputeGraph } from './graph';
12
+ import { addressFromA1Notation, SheetModel } from '../../model';
13
+ import { type CellScalarValue, createSheet } from '../../types';
14
+
15
+ /**
16
+ * VITEST_ENV=chrome p vitest --watch
17
+ * NOTE: Browser test required for hyperformula due to raw translation files.
18
+ */
19
+ describe('compute graph', () => {
20
+ const createModel = async () => {
21
+ const graph = createComputeGraph([{ plugin: CustomPlugin, translations: CustomPluginTranslations }]);
22
+ const sheet = createSheet();
23
+ const model = new SheetModel(graph, sheet, undefined, { rows: 5, columns: 5 });
24
+ graph.update.on(() => model.update.emit());
25
+ return { graph, model };
26
+ };
27
+
28
+ test('async function', async () => {
29
+ const { graph, model } = await createModel();
30
+
31
+ // Triggers function.
32
+ model.setValue(addressFromA1Notation('A1'), '=TEST()');
33
+
34
+ const trigger = new Trigger<CellScalarValue>();
35
+ model.update.on(() => {
36
+ const value = model.getValue(addressFromA1Notation('A1'));
37
+ trigger.wake(value);
38
+ });
39
+
40
+ // Get initial value (i.e., null).
41
+ const v1 = model.getValue(addressFromA1Notation('A1'));
42
+ expect(v1).to.be.null;
43
+ expect(graph.context.info.invocations.TEST).to.eq(undefined);
44
+
45
+ // Wait until async update triggered.
46
+ const v2 = await trigger.wait();
47
+ expect(v2).not.to.be.null;
48
+ expect(graph.context.info.invocations.TEST).to.eq(1);
49
+ });
50
+ });
@@ -0,0 +1,62 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type FunctionPluginDefinition, HyperFormula } from 'hyperformula';
6
+ import { type FunctionTranslationsPackage } from 'hyperformula/typings/interpreter';
7
+
8
+ import { Event } from '@dxos/async';
9
+ import { type Space } from '@dxos/client/echo';
10
+ import { PublicKey } from '@dxos/keys';
11
+ import { log } from '@dxos/log';
12
+
13
+ import { FunctionContext, type FunctionContextOptions } from './async-function';
14
+
15
+ /**
16
+ * Create root graph for space.
17
+ */
18
+ export const createComputeGraph = (
19
+ // TODO(wittjosiah): Factor out this type to make these easier to define.
20
+ functionPlugins: { plugin: FunctionPluginDefinition; translations: FunctionTranslationsPackage }[] = [],
21
+ space?: Space,
22
+ options?: Partial<FunctionContextOptions>,
23
+ ): ComputeGraph => {
24
+ functionPlugins.forEach(({ plugin, translations }) => {
25
+ HyperFormula.registerFunctionPlugin(plugin, translations);
26
+ });
27
+
28
+ const hf = HyperFormula.buildEmpty({ licenseKey: 'gpl-v3' });
29
+ return new ComputeGraph(hf, space, options);
30
+ };
31
+
32
+ /**
33
+ * Per-space compute and dependency graph.
34
+ */
35
+ // TODO(burdon): Create instance for each space.
36
+ export class ComputeGraph {
37
+ public readonly id = `graph-${PublicKey.random().truncate()}`;
38
+ public readonly update = new Event();
39
+
40
+ // The context is passed to all functions.
41
+ public readonly context = new FunctionContext(
42
+ this.hf,
43
+ this._space,
44
+ () => {
45
+ this.refresh();
46
+ },
47
+ this._options,
48
+ );
49
+
50
+ constructor(
51
+ public readonly hf: HyperFormula,
52
+ private readonly _space?: Space,
53
+ private readonly _options?: Partial<FunctionContextOptions>,
54
+ ) {
55
+ this.hf.updateConfig({ context: this.context });
56
+ }
57
+
58
+ refresh() {
59
+ log('refresh', { id: this.id });
60
+ this.update.emit();
61
+ }
62
+ }
@@ -2,4 +2,6 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './ComputeGraphContextProvider';
5
+ export * from './async-function';
6
+ export * from './custom';
7
+ export * from './graph';
@@ -4,34 +4,31 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import React, { useState } from 'react';
7
+ import { type Decorator } from '@storybook/react';
8
+ import React, { useContext, useEffect, useState } from 'react';
8
9
 
10
+ import { Client } from '@dxos/client';
11
+ import { type EchoReactiveObject } from '@dxos/echo-schema';
9
12
  import { log } from '@dxos/log';
10
- import { useSpace } from '@dxos/react-client/echo';
11
- import { withClientProvider } from '@dxos/react-client/testing';
13
+ import { getSpace, type Space } from '@dxos/react-client/echo';
12
14
  import { Button } from '@dxos/react-ui';
13
15
  import { mx } from '@dxos/react-ui-theme';
14
- import { withLayout, withTheme } from '@dxos/storybook-utils';
16
+ import { withTheme, withLayout } from '@dxos/storybook-utils';
15
17
 
16
18
  import { Sheet } from './Sheet';
17
19
  import { type SizeMap } from './grid';
18
20
  import { useSheetContext } from './sheet-context';
19
- import { addressToIndex, rangeToIndex } from '../../defs';
20
- import { type ComputeGraph } from '../../graph';
21
- import { testFunctionPlugins } from '../../graph/testing';
22
- import { useComputeGraph } from '../../hooks';
23
- import { createTestCells, useTestSheet, withComputeGraphDecorator } from '../../testing';
24
- import { SheetType, ValueTypeEnum } from '../../types';
21
+ import { createTestSheet, testSheetName } from '../../testing';
22
+ import { ValueTypeEnum, SheetType } from '../../types';
23
+ import { type ComputeGraph, createComputeGraph } from '../ComputeGraph';
24
+ // TODO(wittjosiah): Refactor. This is not exported from ./components due to depending on ECHO.
25
+ import { ComputeGraphContext, ComputeGraphContextProvider, useComputeGraph } from '../ComputeGraph/graph-context';
25
26
  import { Toolbar, type ToolbarActionHandler } from '../Toolbar';
26
27
 
27
28
  // TODO(burdon): Allow toolbar to access sheet context; provide state for current cursor/range.
28
- const SheetWithToolbar = ({ graph, debug }: { graph: ComputeGraph; debug?: boolean }) => {
29
+ const SheetWithToolbar = ({ debug, space }: { debug?: boolean; space: Space }) => {
29
30
  const { model, cursor, range } = useSheetContext();
30
31
 
31
- const handleRefresh = () => {
32
- // graph?.refresh(); // TODO(burdon): ???
33
- };
34
-
35
32
  // TODO(burdon): Factor out.
36
33
  const handleAction: ToolbarActionHandler = ({ type }) => {
37
34
  log.info('action', { type, cursor, range });
@@ -39,7 +36,7 @@ const SheetWithToolbar = ({ graph, debug }: { graph: ComputeGraph; debug?: boole
39
36
  return;
40
37
  }
41
38
 
42
- const idx = range ? rangeToIndex(model.sheet, range) : addressToIndex(model.sheet, cursor);
39
+ const idx = range ? model.rangeToIndex(range) : model.addressToIndex(cursor);
43
40
  model.sheet.formatting[idx] ??= {};
44
41
  const format = model.sheet.formatting[idx];
45
42
 
@@ -78,12 +75,14 @@ const SheetWithToolbar = ({ graph, debug }: { graph: ComputeGraph; debug?: boole
78
75
  format.precision = 2;
79
76
  break;
80
77
  }
81
- case 'comment': {
82
- break;
83
- }
84
78
  }
85
79
  };
86
80
 
81
+ const graph = useComputeGraph(space);
82
+ const handleRefresh = () => {
83
+ graph.refresh();
84
+ };
85
+
87
86
  return (
88
87
  <div className='flex flex-col overflow-hidden'>
89
88
  <Toolbar.Root onAction={handleAction}>
@@ -100,43 +99,56 @@ const SheetWithToolbar = ({ graph, debug }: { graph: ComputeGraph; debug?: boole
100
99
  );
101
100
  };
102
101
 
102
+ const withGraphDecorator: Decorator = (Story) => {
103
+ const [graphs, setGraphs] = useState<Record<string, ComputeGraph>>({});
104
+
105
+ const setGraph = (key: string, graph: ComputeGraph) => {
106
+ if (!graph.hf.doesSheetExist(testSheetName)) {
107
+ const sheetName = graph.hf.addSheet(testSheetName);
108
+ const sheet = graph.hf.getSheetId(sheetName)!;
109
+ graph.hf.setCellContents({ sheet, col: 0, row: 0 }, Math.random());
110
+ }
111
+
112
+ setGraphs((graphs) => ({ ...graphs, [key]: graph }));
113
+ };
114
+
115
+ return (
116
+ <ComputeGraphContextProvider graphs={graphs} setGraph={setGraph}>
117
+ <Story />
118
+ </ComputeGraphContextProvider>
119
+ );
120
+ };
121
+
103
122
  export default {
104
123
  title: 'plugin-sheet/Sheet',
105
124
  component: Sheet,
106
- decorators: [
107
- withClientProvider({ types: [SheetType], createIdentity: true }),
108
- withComputeGraphDecorator({ plugins: testFunctionPlugins }),
109
- withTheme,
110
- withLayout({ fullscreen: true, tooltips: true, classNames: 'inset-4' }),
111
- ],
125
+ decorators: [withTheme, withLayout({ fullscreen: true, tooltips: true, classNames: 'inset-4' }), withGraphDecorator],
112
126
  };
113
127
 
114
128
  export const Default = () => {
115
129
  const [debug, setDebug] = useState(false);
116
- const space = useSpace();
117
- const graph = useComputeGraph(space);
118
- const sheet = useTestSheet(space, graph, { cells: createTestCells() });
119
- if (!graph || !sheet) {
130
+ const sheet = useTestSheet();
131
+ const space = getSpace(sheet);
132
+ if (!sheet || !space) {
120
133
  return null;
121
134
  }
122
135
 
123
136
  return (
124
- <Sheet.Root graph={graph} sheet={sheet} onInfo={() => setDebug((debug) => !debug)}>
125
- <SheetWithToolbar graph={graph} debug={debug} />
137
+ <Sheet.Root sheet={sheet} space={space} onInfo={() => setDebug((debug) => !debug)}>
138
+ <SheetWithToolbar debug={debug} space={space} />
126
139
  </Sheet.Root>
127
140
  );
128
141
  };
129
142
 
130
143
  export const Debug = () => {
131
- const space = useSpace();
132
- const graph = useComputeGraph(space);
133
- const sheet = useTestSheet(space, graph, { cells: createTestCells() });
134
- if (!graph || !sheet) {
144
+ const sheet = useTestSheet();
145
+ const space = getSpace(sheet);
146
+ if (!sheet || !space) {
135
147
  return null;
136
148
  }
137
149
 
138
150
  return (
139
- <Sheet.Root graph={graph} sheet={sheet}>
151
+ <Sheet.Root sheet={sheet} space={space}>
140
152
  <Sheet.Main />
141
153
  <Sheet.Debug />
142
154
  </Sheet.Root>
@@ -145,15 +157,14 @@ export const Debug = () => {
145
157
 
146
158
  export const Rows = () => {
147
159
  const [rowSizes, setRowSizes] = useState<SizeMap>({});
148
- const space = useSpace();
149
- const graph = useComputeGraph(space);
150
- const sheet = useTestSheet(space, graph);
151
- if (!graph || !sheet) {
160
+ const sheet = useTestSheet();
161
+ const space = getSpace(sheet);
162
+ if (!sheet || !space) {
152
163
  return null;
153
164
  }
154
165
 
155
166
  return (
156
- <Sheet.Root graph={graph} sheet={sheet}>
167
+ <Sheet.Root sheet={sheet} space={space}>
157
168
  <Sheet.Rows
158
169
  rows={sheet.rows}
159
170
  sizes={rowSizes}
@@ -165,15 +176,14 @@ export const Rows = () => {
165
176
 
166
177
  export const Columns = () => {
167
178
  const [columnSizes, setColumnSizes] = useState<SizeMap>({});
168
- const space = useSpace();
169
- const graph = useComputeGraph(space);
170
- const sheet = useTestSheet(space, graph);
171
- if (!graph || !sheet) {
179
+ const sheet = useTestSheet();
180
+ const space = getSpace(sheet);
181
+ if (!sheet || !space) {
172
182
  return null;
173
183
  }
174
184
 
175
185
  return (
176
- <Sheet.Root graph={graph} sheet={sheet}>
186
+ <Sheet.Root sheet={sheet} space={space}>
177
187
  <Sheet.Columns
178
188
  columns={sheet.columns}
179
189
  sizes={columnSizes}
@@ -184,19 +194,18 @@ export const Columns = () => {
184
194
  };
185
195
 
186
196
  export const Main = () => {
187
- const space = useSpace();
188
- const graph = useComputeGraph(space);
189
- const sheet = useTestSheet(space, graph, { cells: createTestCells() });
190
- if (!graph || !sheet) {
197
+ const sheet = useTestSheet();
198
+ const space = getSpace(sheet);
199
+ if (!sheet || !space) {
191
200
  return null;
192
201
  }
193
202
 
194
203
  return (
195
- <Sheet.Root graph={graph} sheet={sheet}>
204
+ <Sheet.Root sheet={sheet} space={space}>
196
205
  <Sheet.Grid
197
206
  size={{
198
207
  numRows: 50,
199
- numCols: 26,
208
+ numColumns: 26,
200
209
  }}
201
210
  rows={sheet.rows}
202
211
  columns={sheet.columns}
@@ -249,3 +258,30 @@ export const GridLayout = () => {
249
258
  const Cell = ({ className, label }: { className?: string; label: string }) => (
250
259
  <div className={mx('flex items-center justify-center border', className)}>{label}</div>
251
260
  );
261
+
262
+ const useTestSheet = () => {
263
+ const { graphs, setGraph } = useContext(ComputeGraphContext);
264
+ const [sheet, setSheet] = useState<EchoReactiveObject<SheetType>>();
265
+ useEffect(() => {
266
+ const t = setTimeout(async () => {
267
+ const client = new Client();
268
+ await client.initialize();
269
+ await client.halo.createIdentity();
270
+ const space = await client.spaces.create();
271
+ client.addTypes([SheetType]);
272
+
273
+ const graph = graphs[space.id] ?? createComputeGraph();
274
+ if (!graphs[space.id]) {
275
+ setGraph(space.id, graph);
276
+ }
277
+
278
+ const sheet = await createTestSheet({ graph });
279
+ space.db.add(sheet);
280
+ setSheet(sheet);
281
+ });
282
+
283
+ return () => clearTimeout(t);
284
+ }, []);
285
+
286
+ return sheet;
287
+ };