@dxos/plugin-sheet 0.6.12-main.ed7cda7 → 0.6.12-staging.0b4bb48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/dist/lib/browser/{chunk-U2JHW3L6.mjs → SheetContainer-U4H5D34A.mjs} +240 -1020
  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-D6KU5MI7.mjs → browser/chunk-D5AGLXJP.mjs} +670 -360
  6. package/dist/lib/browser/chunk-D5AGLXJP.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-T3NJFTD4.mjs → chunk-FUAGSXA4.mjs} +15 -8
  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 +56 -68
  14. package/dist/lib/browser/index.mjs.map +3 -3
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/meta.mjs +1 -1
  17. package/dist/lib/browser/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-OTTD7FBK.cjs → SheetContainer-AXQV3ZT5.cjs} +279 -1050
  21. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs.map +7 -0
  22. package/dist/lib/node/{chunk-DD6FIXWC.cjs → chunk-5KKJ4NPP.cjs} +667 -360
  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-Q3HBHPRL.cjs → chunk-DSYKOI4E.cjs} +20 -12
  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 +64 -83
  33. package/dist/lib/node/index.cjs.map +3 -3
  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 → components/ComputeGraph}/async-function.d.ts +1 -1
  49. package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +1 -0
  50. package/dist/types/src/{graph/custom-function.d.ts → components/ComputeGraph/custom.d.ts} +1 -1
  51. package/dist/types/src/components/ComputeGraph/custom.d.ts.map +1 -0
  52. package/dist/types/src/components/ComputeGraph/edge-function.d.ts.map +1 -0
  53. package/dist/types/src/components/ComputeGraph/graph-context.d.ts +12 -0
  54. package/dist/types/src/components/ComputeGraph/graph-context.d.ts.map +1 -0
  55. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts +2 -0
  56. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts.map +1 -0
  57. package/dist/types/src/components/ComputeGraph/graph.d.ts +26 -0
  58. package/dist/types/src/components/ComputeGraph/graph.d.ts.map +1 -0
  59. package/dist/types/src/components/ComputeGraph/index.d.ts +3 -1
  60. package/dist/types/src/components/ComputeGraph/index.d.ts.map +1 -1
  61. package/dist/types/src/components/Sheet/Sheet.d.ts +1 -1
  62. package/dist/types/src/components/Sheet/Sheet.d.ts.map +1 -1
  63. package/dist/types/src/components/Sheet/Sheet.stories.d.ts +6 -5
  64. package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +1 -1
  65. package/dist/types/src/components/Sheet/formatting.d.ts +14 -0
  66. package/dist/types/src/components/Sheet/formatting.d.ts.map +1 -0
  67. package/dist/types/src/components/Sheet/grid.d.ts +2 -2
  68. package/dist/types/src/components/Sheet/grid.d.ts.map +1 -1
  69. package/dist/types/src/components/Sheet/nav.d.ts +3 -3
  70. package/dist/types/src/components/Sheet/nav.d.ts.map +1 -1
  71. package/dist/types/src/components/Sheet/sheet-context.d.ts +5 -6
  72. package/dist/types/src/components/Sheet/sheet-context.d.ts.map +1 -1
  73. package/dist/types/src/components/SheetContainer.d.ts +3 -2
  74. package/dist/types/src/components/SheetContainer.d.ts.map +1 -1
  75. package/dist/types/src/components/Toolbar/Toolbar.d.ts +3 -19
  76. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  77. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +13 -18
  78. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  79. package/dist/types/src/components/index.d.ts +2 -2
  80. package/dist/types/src/components/index.d.ts.map +1 -1
  81. package/dist/types/src/meta.d.ts +4 -1
  82. package/dist/types/src/meta.d.ts.map +1 -1
  83. package/dist/types/src/{graph/function-defs.d.ts → model/functions.d.ts} +1 -1
  84. package/dist/types/src/model/functions.d.ts.map +1 -0
  85. package/dist/types/src/model/index.d.ts +3 -2
  86. package/dist/types/src/model/index.d.ts.map +1 -1
  87. package/dist/types/src/model/model.browser.test.d.ts +2 -0
  88. package/dist/types/src/model/model.browser.test.d.ts.map +1 -0
  89. package/dist/types/src/model/{sheet-model.d.ts → model.d.ts} +64 -9
  90. package/dist/types/src/model/model.d.ts.map +1 -0
  91. package/dist/types/src/{defs → model}/types.d.ts +3 -8
  92. package/dist/types/src/model/types.d.ts.map +1 -0
  93. package/dist/types/src/model/types.test.d.ts.map +1 -0
  94. package/dist/types/src/model/util.d.ts +15 -0
  95. package/dist/types/src/model/util.d.ts.map +1 -0
  96. package/dist/types/src/testing.d.ts +9 -0
  97. package/dist/types/src/testing.d.ts.map +1 -0
  98. package/dist/types/src/translations.d.ts +12 -17
  99. package/dist/types/src/translations.d.ts.map +1 -1
  100. package/dist/types/src/types.d.ts +3 -83
  101. package/dist/types/src/types.d.ts.map +1 -1
  102. package/package.json +41 -48
  103. package/src/SheetPlugin.tsx +70 -43
  104. package/src/components/CellEditor/CellEditor.stories.tsx +3 -4
  105. package/src/components/CellEditor/CellEditor.tsx +9 -59
  106. package/src/components/CellEditor/extension.test.ts +5 -4
  107. package/src/components/CellEditor/extension.ts +3 -1
  108. package/src/{graph → components/ComputeGraph}/async-function.ts +1 -3
  109. package/src/{graph/custom-function.ts → components/ComputeGraph/custom.ts} +6 -2
  110. package/src/{graph → components/ComputeGraph}/edge-function.ts +1 -2
  111. package/src/components/ComputeGraph/graph-context.tsx +50 -0
  112. package/src/components/ComputeGraph/graph.browser.test.ts +50 -0
  113. package/src/components/ComputeGraph/graph.ts +62 -0
  114. package/src/components/ComputeGraph/index.ts +3 -1
  115. package/src/components/Sheet/Sheet.stories.tsx +82 -45
  116. package/src/components/Sheet/Sheet.tsx +18 -57
  117. package/src/{model/formatting-model.ts → components/Sheet/formatting.ts} +13 -20
  118. package/src/components/Sheet/grid.ts +3 -3
  119. package/src/components/Sheet/nav.ts +19 -19
  120. package/src/components/Sheet/sheet-context.tsx +78 -16
  121. package/src/components/SheetContainer.tsx +19 -73
  122. package/src/components/Toolbar/Toolbar.tsx +12 -53
  123. package/src/components/index.ts +0 -1
  124. package/src/meta.tsx +5 -1
  125. package/src/model/index.ts +3 -2
  126. package/src/model/model.browser.test.ts +100 -0
  127. package/src/model/model.ts +550 -0
  128. package/src/{defs → model}/types.test.ts +9 -8
  129. package/src/{defs → model}/types.ts +14 -23
  130. package/src/model/util.ts +36 -0
  131. package/src/testing.ts +50 -0
  132. package/src/translations.ts +1 -6
  133. package/src/types.ts +5 -30
  134. package/dist/lib/browser/SheetContainer-V4GCCZTX.mjs +0 -261
  135. package/dist/lib/browser/SheetContainer-V4GCCZTX.mjs.map +0 -7
  136. package/dist/lib/browser/chunk-6ZMQVB4Z.mjs +0 -2923
  137. package/dist/lib/browser/chunk-6ZMQVB4Z.mjs.map +0 -7
  138. package/dist/lib/browser/chunk-QILRZNE5.mjs.map +0 -7
  139. package/dist/lib/browser/chunk-T3NJFTD4.mjs.map +0 -7
  140. package/dist/lib/browser/chunk-U2JHW3L6.mjs.map +0 -7
  141. package/dist/lib/browser/graph-T27BOBOV.mjs +0 -21
  142. package/dist/lib/browser/graph-T27BOBOV.mjs.map +0 -7
  143. package/dist/lib/node/SheetContainer-3ZY7MPWJ.cjs +0 -279
  144. package/dist/lib/node/SheetContainer-3ZY7MPWJ.cjs.map +0 -7
  145. package/dist/lib/node/chunk-BNARJ5GM.cjs.map +0 -7
  146. package/dist/lib/node/chunk-DD6FIXWC.cjs.map +0 -7
  147. package/dist/lib/node/chunk-OTTD7FBK.cjs.map +0 -7
  148. package/dist/lib/node/chunk-Q3HBHPRL.cjs.map +0 -7
  149. package/dist/lib/node/graph-SPKGX7W4.cjs +0 -43
  150. package/dist/lib/node/graph-SPKGX7W4.cjs.map +0 -7
  151. package/dist/lib/node-esm/SheetContainer-PXSJX6XK.mjs +0 -262
  152. package/dist/lib/node-esm/SheetContainer-PXSJX6XK.mjs.map +0 -7
  153. package/dist/lib/node-esm/chunk-7HVSOTGA.mjs +0 -2553
  154. package/dist/lib/node-esm/chunk-7HVSOTGA.mjs.map +0 -7
  155. package/dist/lib/node-esm/chunk-BMNA27EX.mjs +0 -76
  156. package/dist/lib/node-esm/chunk-BMNA27EX.mjs.map +0 -7
  157. package/dist/lib/node-esm/chunk-D6KU5MI7.mjs.map +0 -7
  158. package/dist/lib/node-esm/chunk-IU2L277A.mjs +0 -17
  159. package/dist/lib/node-esm/chunk-IU2L277A.mjs.map +0 -7
  160. package/dist/lib/node-esm/graph-U67IO4UC.mjs +0 -22
  161. package/dist/lib/node-esm/graph-U67IO4UC.mjs.map +0 -7
  162. package/dist/lib/node-esm/index.mjs +0 -261
  163. package/dist/lib/node-esm/index.mjs.map +0 -7
  164. package/dist/lib/node-esm/meta.json +0 -1
  165. package/dist/lib/node-esm/meta.mjs +0 -10
  166. package/dist/lib/node-esm/meta.mjs.map +0 -7
  167. package/dist/lib/node-esm/types.mjs +0 -21
  168. package/dist/lib/node-esm/types.mjs.map +0 -7
  169. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +0 -11
  170. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +0 -1
  171. package/dist/types/src/components/GridSheet/GridSheet.d.ts +0 -10
  172. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +0 -1
  173. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +0 -9
  174. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +0 -1
  175. package/dist/types/src/components/GridSheet/util.d.ts +0 -7
  176. package/dist/types/src/components/GridSheet/util.d.ts.map +0 -1
  177. package/dist/types/src/components/Sheet/decorations.d.ts +0 -24
  178. package/dist/types/src/components/Sheet/decorations.d.ts.map +0 -1
  179. package/dist/types/src/components/Sheet/threads.d.ts +0 -2
  180. package/dist/types/src/components/Sheet/threads.d.ts.map +0 -1
  181. package/dist/types/src/defs/index.d.ts +0 -3
  182. package/dist/types/src/defs/index.d.ts.map +0 -1
  183. package/dist/types/src/defs/types.d.ts.map +0 -1
  184. package/dist/types/src/defs/types.test.d.ts.map +0 -1
  185. package/dist/types/src/defs/util.d.ts +0 -43
  186. package/dist/types/src/defs/util.d.ts.map +0 -1
  187. package/dist/types/src/extensions/compute.d.ts +0 -5
  188. package/dist/types/src/extensions/compute.d.ts.map +0 -1
  189. package/dist/types/src/extensions/compute.stories.d.ts +0 -26
  190. package/dist/types/src/extensions/compute.stories.d.ts.map +0 -1
  191. package/dist/types/src/extensions/index.d.ts +0 -2
  192. package/dist/types/src/extensions/index.d.ts.map +0 -1
  193. package/dist/types/src/graph/async-function.d.ts.map +0 -1
  194. package/dist/types/src/graph/compute-graph.browser.test.d.ts +0 -2
  195. package/dist/types/src/graph/compute-graph.browser.test.d.ts.map +0 -1
  196. package/dist/types/src/graph/compute-graph.d.ts +0 -81
  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-node.d.ts +0 -19
  201. package/dist/types/src/graph/compute-node.d.ts.map +0 -1
  202. package/dist/types/src/graph/custom-function.d.ts.map +0 -1
  203. package/dist/types/src/graph/edge-function.d.ts.map +0 -1
  204. package/dist/types/src/graph/function-defs.d.ts.map +0 -1
  205. package/dist/types/src/graph/hyperformula.test.d.ts +0 -2
  206. package/dist/types/src/graph/hyperformula.test.d.ts.map +0 -1
  207. package/dist/types/src/graph/index.d.ts +0 -4
  208. package/dist/types/src/graph/index.d.ts.map +0 -1
  209. package/dist/types/src/graph/util.d.ts +0 -2
  210. package/dist/types/src/graph/util.d.ts.map +0 -1
  211. package/dist/types/src/hooks/hooks.stories.d.ts +0 -11
  212. package/dist/types/src/hooks/hooks.stories.d.ts.map +0 -1
  213. package/dist/types/src/hooks/index.d.ts +0 -4
  214. package/dist/types/src/hooks/index.d.ts.map +0 -1
  215. package/dist/types/src/hooks/useComputeGraph.d.ts +0 -7
  216. package/dist/types/src/hooks/useComputeGraph.d.ts.map +0 -1
  217. package/dist/types/src/hooks/useFormattingModel.d.ts +0 -3
  218. package/dist/types/src/hooks/useFormattingModel.d.ts.map +0 -1
  219. package/dist/types/src/hooks/useSheetModel.d.ts +0 -8
  220. package/dist/types/src/hooks/useSheetModel.d.ts.map +0 -1
  221. package/dist/types/src/model/formatting-model.d.ts +0 -16
  222. package/dist/types/src/model/formatting-model.d.ts.map +0 -1
  223. package/dist/types/src/model/sheet-model.d.ts.map +0 -1
  224. package/dist/types/src/sanity.test.d.ts +0 -2
  225. package/dist/types/src/sanity.test.d.ts.map +0 -1
  226. package/dist/types/src/testing/index.d.ts +0 -2
  227. package/dist/types/src/testing/index.d.ts.map +0 -1
  228. package/dist/types/src/testing/testing.d.ts +0 -9
  229. package/dist/types/src/testing/testing.d.ts.map +0 -1
  230. package/dist/vendor/hyperformula.mjs +0 -37145
  231. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +0 -20
  232. package/src/components/GridSheet/GridSheet.stories.tsx +0 -35
  233. package/src/components/GridSheet/GridSheet.tsx +0 -153
  234. package/src/components/GridSheet/util.ts +0 -108
  235. package/src/components/Sheet/decorations.ts +0 -62
  236. package/src/components/Sheet/threads.tsx +0 -205
  237. package/src/defs/index.ts +0 -6
  238. package/src/defs/util.ts +0 -135
  239. package/src/extensions/compute.stories.tsx +0 -151
  240. package/src/extensions/compute.ts +0 -98
  241. package/src/extensions/index.ts +0 -5
  242. package/src/graph/compute-graph.browser.test.ts +0 -104
  243. package/src/graph/compute-graph.stories.tsx +0 -92
  244. package/src/graph/compute-graph.ts +0 -290
  245. package/src/graph/compute-node.ts +0 -51
  246. package/src/graph/hyperformula.test.ts +0 -15
  247. package/src/graph/index.ts +0 -7
  248. package/src/graph/util.ts +0 -8
  249. package/src/hooks/hooks.stories.tsx +0 -50
  250. package/src/hooks/index.ts +0 -7
  251. package/src/hooks/useComputeGraph.ts +0 -20
  252. package/src/hooks/useFormattingModel.ts +0 -11
  253. package/src/hooks/useSheetModel.ts +0 -43
  254. package/src/model/sheet-model.ts +0 -399
  255. package/src/sanity.test.ts +0 -40
  256. package/src/testing/index.ts +0 -5
  257. package/src/testing/testing.tsx +0 -66
  258. /package/dist/types/src/{graph → components/ComputeGraph}/edge-function.d.ts +0 -0
  259. /package/dist/types/src/{defs → model}/types.test.d.ts +0 -0
  260. /package/src/{graph/function-defs.ts → model/functions.ts} +0 -0
@@ -26,42 +26,42 @@ 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_DD6FIXWC_exports = {};
30
- __export(chunk_DD6FIXWC_exports, {
31
- ComputeGraph: () => ComputeGraph,
32
- ComputeGraphRegistry: () => ComputeGraphRegistry,
33
- ComputeNode: () => ComputeNode,
34
- createComputeGraphRegistry: () => createComputeGraphRegistry,
35
- createSheetName: () => createSheetName,
29
+ var chunk_5KKJ4NPP_exports = {};
30
+ __export(chunk_5KKJ4NPP_exports, {
31
+ CustomPlugin: () => CustomPlugin,
32
+ CustomPluginTranslations: () => CustomPluginTranslations,
33
+ FunctionPluginAsync: () => FunctionPluginAsync,
34
+ SheetModel: () => SheetModel,
35
+ addressFromA1Notation: () => addressFromA1Notation,
36
+ addressToA1Notation: () => addressToA1Notation,
37
+ columnLetter: () => columnLetter,
38
+ createComputeGraph: () => createComputeGraph,
36
39
  defaultFunctions: () => defaultFunctions,
37
- defaultOptions: () => defaultOptions,
38
- getSheetId: () => getSheetId
40
+ inRange: () => inRange,
41
+ posEquals: () => posEquals,
42
+ rangeToA1Notation: () => rangeToA1Notation
39
43
  });
40
- module.exports = __toCommonJS(chunk_DD6FIXWC_exports);
44
+ module.exports = __toCommonJS(chunk_5KKJ4NPP_exports);
45
+ var import_chunk_DSYKOI4E = require("./chunk-DSYKOI4E.cjs");
46
+ var import_hyperformula = require("hyperformula");
41
47
  var import_async = require("@dxos/async");
42
- var import_echo = require("@dxos/client/echo");
43
- var import_context = require("@dxos/context");
44
- var import_invariant = require("@dxos/invariant");
45
48
  var import_keys = require("@dxos/keys");
46
49
  var import_log = require("@dxos/log");
47
- var import_types = require("@dxos/plugin-script/types");
48
- var import_util = require("@dxos/util");
49
- var import_hyperformula = require("#hyperformula");
50
+ var import_hyperformula2 = require("hyperformula");
50
51
  var import_lodash = __toESM(require("lodash.defaultsdeep"));
51
52
  var import_async2 = require("@dxos/async");
52
53
  var import_log2 = require("@dxos/log");
53
- var import_hyperformula2 = require("#hyperformula");
54
+ var import_hyperformula3 = require("hyperformula");
54
55
  var import_async3 = require("@dxos/async");
55
- var import_context2 = require("@dxos/context");
56
- var import_hyperformula3 = require("#hyperformula");
57
- var import_signals_core = require("@preact/signals-core");
58
- var import_echo2 = require("@dxos/client/echo");
56
+ var import_context = require("@dxos/context");
57
+ var import_invariant = require("@dxos/invariant");
58
+ var import_keys2 = require("@dxos/keys");
59
59
  var import_log3 = require("@dxos/log");
60
- var import_edge = require("@dxos/plugin-script/edge");
61
- var import_types2 = require("@dxos/plugin-script/types");
62
- var import_util2 = require("@dxos/util");
63
- var import_hyperformula4 = require("#hyperformula");
64
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/async-function.ts";
60
+ var import_invariant2 = require("@dxos/invariant");
61
+ 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";
65
65
  var defaultFunctionContextOptions = {
66
66
  defaultTtl: 5e3,
67
67
  recalculationDelay: 200,
@@ -88,7 +88,6 @@ var FunctionContext = class _FunctionContext {
88
88
  onUpdate(this);
89
89
  }, this._options.recalculationDelay);
90
90
  }
91
- // TODO(burdon): Remove?
92
91
  get space() {
93
92
  return this._space;
94
93
  }
@@ -137,7 +136,7 @@ var FunctionContext = class _FunctionContext {
137
136
  value: value2
138
137
  }, {
139
138
  F: __dxlog_file,
140
- L: 138,
139
+ L: 136,
141
140
  S: this,
142
141
  C: (f, a) => f(...a)
143
142
  });
@@ -148,7 +147,7 @@ var FunctionContext = class _FunctionContext {
148
147
  err
149
148
  }, {
150
149
  F: __dxlog_file,
151
- L: 142,
150
+ L: 140,
152
151
  S: this,
153
152
  C: (f, a) => f(...a)
154
153
  });
@@ -168,7 +167,7 @@ var FunctionContext = class _FunctionContext {
168
167
  cache: value
169
168
  }, {
170
169
  F: __dxlog_file,
171
- L: 150,
170
+ L: 148,
172
171
  S: this,
173
172
  C: (f, a) => f(...a)
174
173
  });
@@ -187,156 +186,40 @@ var FunctionPluginAsync = class extends import_hyperformula2.FunctionPlugin {
187
186
  });
188
187
  }
189
188
  };
190
- var ComputeNode = class extends import_context2.Resource {
191
- constructor(_graph, sheetId) {
192
- super();
193
- this._graph = _graph;
194
- this.sheetId = sheetId;
195
- this.update = new import_async3.Event();
196
- }
197
- // TODO(burdon): Remove?
198
- get graph() {
199
- return this._graph;
200
- }
201
- get hf() {
202
- return this._graph.hf;
203
- }
204
- getValue(cell) {
205
- const value = this._graph.hf.getCellValue({
206
- sheet: this.sheetId,
207
- row: cell.row,
208
- col: cell.col
209
- });
210
- if (value instanceof import_hyperformula3.DetailedCellError) {
211
- return null;
212
- }
213
- return value;
214
- }
215
- setValue(cell, value) {
216
- const mappedValue = typeof value === "string" && value.charAt(0) === "=" ? this._graph.mapFormulaToNative(value) : value;
217
- this._graph.hf.setCellContents({
218
- sheet: this.sheetId,
219
- row: cell.row,
220
- col: cell.col
221
- }, [
222
- [
223
- mappedValue
224
- ]
225
- ]);
226
- }
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);
227
198
  };
228
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/edge-function.ts";
229
- var EDGE_FUNCTION_TTL = 1e4;
230
- var EdgeFunctionPlugin = class extends FunctionPluginAsync {
231
- edge(ast, state) {
232
- const handler = (subscribe = false) => async (binding, ...args) => {
233
- const space = this.context.space;
234
- if (!space) {
235
- return new import_hyperformula4.CellError(import_hyperformula4.ErrorType.REF, "Missing space");
236
- }
237
- const { objects: [fn] } = await space.db.query(import_echo2.Filter.schema(import_types2.FunctionType, {
238
- binding
239
- })).run();
240
- if (!fn) {
241
- import_log3.log.info("Function not found", {
242
- binding
243
- }, {
244
- F: __dxlog_file2,
245
- L: 39,
246
- S: this,
247
- C: (f, a) => f(...a)
248
- });
249
- return new import_hyperformula4.CellError(import_hyperformula4.ErrorType.REF, "Function not found");
250
- }
251
- if (subscribe) {
252
- const unsubscribe = (0, import_signals_core.effect)(() => {
253
- import_log3.log.info("function changed", {
254
- fn
255
- }, {
256
- F: __dxlog_file2,
257
- L: 45,
258
- S: this,
259
- C: (f, a) => f(...a)
260
- });
261
- const _ = fn?.version;
262
- this.runAsyncFunction(ast, state, handler(false), {
263
- ttl: EDGE_FUNCTION_TTL
264
- });
265
- });
266
- this.context.createSubscription(ast.procedureName, unsubscribe);
267
- }
268
- const path = (0, import_edge.getUserFunctionUrlInMetadata)((0, import_echo2.getMeta)(fn));
269
- const result = await fetch(`${this.context.remoteFunctionUrl}${path}`, {
270
- method: "POST",
271
- headers: {
272
- "Content-Type": "application/json"
273
- },
274
- body: JSON.stringify({
275
- args: args.filter(import_util2.nonNullable)
276
- })
277
- });
278
- return await result.text();
279
- };
280
- return this.runAsyncFunction(ast, state, handler(true), {
281
- ttl: EDGE_FUNCTION_TTL
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
282
211
  });
283
212
  }
284
- };
285
- EdgeFunctionPlugin.implementedFunctions = {
286
- EDGE: {
287
- method: "edge",
288
- parameters: [
289
- // Binding
290
- {
291
- argumentType: import_hyperformula4.FunctionArgumentType.STRING
292
- },
293
- // Remote function arguments (currently supporting up to 9).
294
- {
295
- argumentType: import_hyperformula4.FunctionArgumentType.ANY,
296
- optionalArg: true
297
- },
298
- {
299
- argumentType: import_hyperformula4.FunctionArgumentType.ANY,
300
- optionalArg: true
301
- },
302
- {
303
- argumentType: import_hyperformula4.FunctionArgumentType.ANY,
304
- optionalArg: true
305
- },
306
- {
307
- argumentType: import_hyperformula4.FunctionArgumentType.ANY,
308
- optionalArg: true
309
- },
310
- {
311
- argumentType: import_hyperformula4.FunctionArgumentType.ANY,
312
- optionalArg: true
313
- },
314
- {
315
- argumentType: import_hyperformula4.FunctionArgumentType.ANY,
316
- optionalArg: true
317
- },
318
- {
319
- argumentType: import_hyperformula4.FunctionArgumentType.ANY,
320
- optionalArg: true
321
- },
322
- {
323
- argumentType: import_hyperformula4.FunctionArgumentType.ANY,
324
- optionalArg: true
325
- },
326
- {
327
- argumentType: import_hyperformula4.FunctionArgumentType.ANY,
328
- optionalArg: true
329
- }
330
- ],
331
- isVolatile: true
332
- }
333
- };
334
- var EdgeFunctionPluginTranslations = {
335
- enGB: {
336
- EDGE: "EDGE"
337
- },
338
- enUS: {
339
- EDGE: "EDGE"
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();
340
223
  }
341
224
  };
342
225
  var defaultFunctions = [
@@ -2711,242 +2594,666 @@ var defaultFunctions = [
2711
2594
  section: "Text"
2712
2595
  }
2713
2596
  ];
2714
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/compute-graph.ts";
2715
- var OBJECT_ID_LENGTH = 60;
2716
- var CUSTOM_FUNCTION = "ECHO";
2717
- var defaultOptions = {
2718
- licenseKey: "gpl-v3",
2719
- plugins: [
2720
- {
2721
- plugin: EdgeFunctionPlugin,
2722
- translations: EdgeFunctionPluginTranslations
2723
- }
2724
- ]
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;
2725
2601
  };
2726
- var PREFIX = "__";
2727
- var createSheetName = (id) => `${PREFIX}${id}`;
2728
- var getSheetId = (name) => name.startsWith(PREFIX) ? name.slice(PREFIX.length) : void 0;
2729
- var createComputeGraphRegistry = (options = {}) => {
2730
- return new ComputeGraphRegistry({
2731
- ...defaultOptions,
2732
- ...options
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
+ ]
2733
2611
  });
2612
+ return (column >= 26 ? String.fromCharCode("A".charCodeAt(0) + Math.floor(column / 26) - 1) : "") + String.fromCharCode("A".charCodeAt(0) + column % 26);
2734
2613
  };
2735
- var ComputeGraphRegistry = class extends import_context.Resource {
2736
- constructor(_options = defaultOptions) {
2737
- super();
2738
- this._options = _options;
2739
- this._registry = /* @__PURE__ */ new Map();
2740
- this._options.plugins?.forEach(({ plugin, translations }) => {
2741
- import_hyperformula.HyperFormula.registerFunctionPlugin(plugin, translations);
2742
- });
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
2631
+ };
2632
+ };
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;
2743
2642
  }
2744
- getGraph(spaceId) {
2745
- return this._registry.get(spaceId);
2746
- }
2747
- async getOrCreateGraph(space) {
2748
- let graph = this.getGraph(space.id);
2749
- if (!graph) {
2750
- import_log.log.info("create graph", {
2751
- space: space.id
2752
- }, {
2753
- F: __dxlog_file3,
2754
- L: 95,
2755
- S: this,
2756
- C: (f, a) => f(...a)
2757
- });
2758
- graph = await this.createGraph(space);
2759
- }
2760
- return graph;
2643
+ const { from, to } = range;
2644
+ if (from && posEquals(from, cell) || to && posEquals(to, cell)) {
2645
+ return true;
2761
2646
  }
2762
- async createGraph(space) {
2763
- (0, import_invariant.invariant)(!this._registry.has(space.id), `ComputeGraph already exists for space: ${space.id}`, {
2764
- F: __dxlog_file3,
2765
- L: 103,
2766
- S: this,
2767
- A: [
2768
- "!this._registry.has(space.id)",
2769
- "`ComputeGraph already exists for space: ${space.id}`"
2770
- ]
2771
- });
2772
- const hf = import_hyperformula.HyperFormula.buildEmpty(this._options);
2773
- const graph = new ComputeGraph(hf, space, this._options);
2774
- await graph.open(this._ctx);
2775
- this._registry.set(space.id, graph);
2776
- return graph;
2647
+ if (!from || !to) {
2648
+ return false;
2777
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 {
2778
2660
  };
2779
- var ComputeGraph = class extends import_context.Resource {
2780
- constructor(_hf, _space, _options) {
2661
+ var ReadonlyException = class extends ApiError {
2662
+ };
2663
+ var RangeException = class extends ApiError {
2664
+ constructor(n) {
2781
2665
  super();
2782
- this._hf = _hf;
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;
2783
2715
  this._space = _space;
2784
- this._options = _options;
2785
- this.id = `graph-${import_keys.PublicKey.random().truncate()}`;
2786
- this._nodes = /* @__PURE__ */ new Map();
2716
+ this.id = `model-${import_keys2.PublicKey.random().truncate()}`;
2717
+ this._ctx = void 0;
2787
2718
  this._functions = [];
2788
- this.context = new FunctionContext(this._hf, this._space, this.refresh.bind(this), this._options);
2789
- this.update = new import_async.Event();
2790
- this._hf.updateConfig({
2791
- context: this.context
2792
- });
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
2728
+ };
2729
+ this.reset();
2793
2730
  }
2794
- // TODO(burdon): Remove.
2795
- get hf() {
2796
- return this._hf;
2731
+ get graph() {
2732
+ return this._graph;
2797
2733
  }
2798
- refresh() {
2799
- (0, import_log.log)("refresh", {
2800
- id: this.id
2801
- }, {
2802
- F: __dxlog_file3,
2803
- L: 152,
2804
- S: this,
2805
- C: (f, a) => f(...a)
2806
- });
2807
- this.update.emit();
2734
+ get sheet() {
2735
+ return this._sheet;
2736
+ }
2737
+ get readonly() {
2738
+ return this._options.readonly;
2808
2739
  }
2809
- getFunctions({ standard = true, echo = true } = {}) {
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
+ }));
2810
2753
  return [
2811
- ...standard ? this._hf.getRegisteredFunctionNames().map((name) => defaultFunctions.find((fn) => fn.name === name) ?? {
2812
- name
2813
- }) : [],
2814
- ...echo ? this._functions.map((fn) => ({
2815
- name: fn.binding
2816
- })) : []
2754
+ ...hfFunctions,
2755
+ ...echoFunctions
2817
2756
  ];
2818
2757
  }
2758
+ get initialized() {
2759
+ return !!this._ctx;
2760
+ }
2819
2761
  /**
2820
- * Get or create cell representing a sheet.
2762
+ * Initialize sheet and engine.
2821
2763
  */
2822
- // TODO(burdon): Async (open node).
2823
- // The graph should be an extensible factory that plugins extend with model constructors.
2824
- // This would enable on-the-fly instantiation of new models when then are referenced.
2825
- // E.g., Cross-object reference would be stored as "ObjectId!A1"
2826
- // The graph would then load the object and create a ComputeNode (model) of the appropriate type.
2827
- getOrCreateNode(name) {
2828
- (0, import_invariant.invariant)(name.length, void 0, {
2829
- F: __dxlog_file3,
2830
- L: 176,
2764
+ async initialize() {
2765
+ (0, import_log3.log)("initialize", {
2766
+ id: this.id
2767
+ }, {
2768
+ 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,
2831
2776
  S: this,
2832
2777
  A: [
2833
- "name.length",
2834
- ""
2778
+ "!this.initialized",
2779
+ "'Already initialized.'"
2835
2780
  ]
2836
2781
  });
2837
- if (!this._hf.doesSheetExist(name)) {
2838
- import_log.log.info("created node", {
2839
- space: this._space?.id,
2840
- name
2841
- }, {
2842
- F: __dxlog_file3,
2843
- L: 178,
2844
- S: this,
2845
- C: (f, a) => f(...a)
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();
2846
2802
  });
2847
- this._hf.addSheet(name);
2848
- this.update.emit();
2803
+ this._ctx.onDispose(unsubscribe2);
2849
2804
  }
2850
- const sheetId = this._hf.getSheetId(name);
2851
- (0, import_invariant.invariant)(sheetId !== void 0, void 0, {
2852
- F: __dxlog_file3,
2853
- L: 184,
2805
+ return this;
2806
+ }
2807
+ async destroy() {
2808
+ (0, import_log3.log)("destroy", {
2809
+ id: this.id
2810
+ }, {
2811
+ F: __dxlog_file4,
2812
+ L: 174,
2854
2813
  S: this,
2855
- A: [
2856
- "sheetId !== undefined",
2857
- ""
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
2858
2985
  ]
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);
2859
3005
  });
2860
- const node = new ComputeNode(this, sheetId);
2861
- this._nodes.set(sheetId, node);
2862
- return node;
2863
3006
  }
2864
3007
  /**
2865
- * Map bound value to custom function invocation.
2866
- * E.g., "HELLO(...args)" => "EDGE("HELLO", ...args)".
3008
+ * Iterate range.
2867
3009
  */
2868
- mapFormulaToNative(formula) {
2869
- return formula.replace(/['"]?([ \w]+)['"]?!/, (_match, name) => {
2870
- if (name) {
2871
- const objects = this._hf.getSheetNames().map((name2) => {
2872
- const id = getSheetId(name2);
2873
- return id ? this._space?.db.getObjectById(id) : void 0;
2874
- }).filter(import_util.nonNullable);
2875
- for (const obj of objects) {
2876
- if (obj.name === name || obj.title === name) {
2877
- return `${createSheetName(obj.id)}!`;
2878
- }
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);
2879
3030
  }
2880
3031
  }
2881
- return `${name}!`;
2882
- }).replace(/(\w+)\((.*)\)/g, (match, binding, args) => {
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) => {
2883
3098
  const fn = this._functions.find((fn2) => fn2.binding === binding);
2884
3099
  if (!fn) {
2885
3100
  return match;
2886
3101
  }
2887
3102
  if (args.trim() === "") {
2888
- return `${CUSTOM_FUNCTION}("${binding}")`;
2889
- } else {
2890
- return `${CUSTOM_FUNCTION}("${binding}", ${args})`;
3103
+ return `EDGE("${binding}")`;
2891
3104
  }
3105
+ return `EDGE("${binding}", ${args})`;
2892
3106
  });
2893
3107
  }
2894
3108
  /**
2895
- * Map from binding to fully qualified ECHO ID (to store).
2896
- * E.g., HELLO() => spaceId:objectId()
3109
+ * E.g., "EDGE("HELLO")" => "HELLO()".
2897
3110
  */
2898
- mapFunctionBindingToId(formula) {
2899
- return formula.replace(/(\w+)\((.*)\)/g, (match, binding, args) => {
2900
- if (binding === CUSTOM_FUNCTION || defaultFunctions.find((fn2) => fn2.name === binding)) {
2901
- return match;
2902
- }
2903
- const fn = this._functions.find((fn2) => fn2.binding === binding);
2904
- if (fn) {
2905
- const id = (0, import_echo.fullyQualifiedId)(fn);
2906
- return `${id}(${args})`;
2907
- } else {
2908
- return match;
3111
+ mapFormulaBindingFromFormula(formula) {
3112
+ return formula.replace(/EDGE\("([a-zA-Z0-9]+)"(.*)\)/, (_match, binding, args) => {
3113
+ if (args.trim() === "") {
3114
+ return `${binding}()`;
2909
3115
  }
3116
+ return `${binding}(${args.slice(2)})`;
2910
3117
  });
2911
3118
  }
2912
3119
  /**
2913
- * Map from fully qualified ECHO ID to binding (from store).
2914
- * E.g., spaceId:objectId() => HELLO()
3120
+ * Map from binding to fully qualified ECHO ID.
2915
3121
  */
2916
- mapFunctionBindingFromId(formula) {
2917
- return formula.replace(/(\w+):([a-zA-Z0-9]+)\((.*)\)/g, (match, spaceId, objectId, args) => {
2918
- const id = `${spaceId}:${objectId}`;
2919
- if (id.length !== OBJECT_ID_LENGTH) {
2920
- return match;
2921
- }
2922
- const fn = this._functions.find((fn2) => (0, import_echo.fullyQualifiedId)(fn2) === id);
2923
- if (fn?.binding) {
2924
- return `${fn.binding}(${args})`;
2925
- } else {
2926
- return match;
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
+ });
3147
+ }
3148
+ /**
3149
+ * Map from indices to A1 notation.
3150
+ */
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));
3163
+ });
3164
+ }
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);
3182
+ }
3183
+ toTime(num) {
3184
+ return this._graph.hf.numberToTime(num);
3185
+ }
3186
+ };
3187
+ var parseNumberString = (str) => {
3188
+ return parseFloat(str.replace(/[^\d.]/g, ""));
3189
+ };
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);
3196
+ }
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;
2927
3209
  }
3210
+ return parseNumberString(rate);
3211
+ };
3212
+ return this.runAsyncFunction(ast, state, handler, {
3213
+ ttl: 1e4
2928
3214
  });
2929
3215
  }
2930
- async _open() {
2931
- if (this._space) {
2932
- const query = this._space.db.query(import_echo.Filter.schema(import_types.FunctionType));
2933
- const unsubscribe = query.subscribe(({ objects }) => {
2934
- this._functions = objects.filter(({ binding }) => binding);
2935
- this.update.emit();
2936
- });
2937
- this._ctx.onDispose(unsubscribe);
2938
- }
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
3232
+ }
3233
+ };
3234
+ var CustomPluginTranslations = {
3235
+ enGB: {
3236
+ TEST: "TEST",
3237
+ CRYPTO: "CRYPTO"
3238
+ },
3239
+ enUS: {
3240
+ TEST: "TEST",
3241
+ CRYPTO: "CRYPTO"
2939
3242
  }
2940
3243
  };
2941
3244
  // Annotate the CommonJS export names for ESM import in node:
2942
3245
  0 && (module.exports = {
2943
- ComputeGraph,
2944
- ComputeGraphRegistry,
2945
- ComputeNode,
2946
- createComputeGraphRegistry,
2947
- createSheetName,
3246
+ CustomPlugin,
3247
+ CustomPluginTranslations,
3248
+ FunctionPluginAsync,
3249
+ SheetModel,
3250
+ addressFromA1Notation,
3251
+ addressToA1Notation,
3252
+ columnLetter,
3253
+ createComputeGraph,
2948
3254
  defaultFunctions,
2949
- defaultOptions,
2950
- getSheetId
3255
+ inRange,
3256
+ posEquals,
3257
+ rangeToA1Notation
2951
3258
  });
2952
- //# sourceMappingURL=chunk-DD6FIXWC.cjs.map
3259
+ //# sourceMappingURL=chunk-5KKJ4NPP.cjs.map