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