@dxos/plugin-sheet 0.6.13 → 0.6.14-main.69511f5

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