@dxos/plugin-sheet 0.6.12-main.f9d0246 → 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 (263) hide show
  1. package/dist/lib/browser/{chunk-ZLJ2GRE2.mjs → SheetContainer-U4H5D34A.mjs} +240 -1151
  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/browser/{chunk-Z2XOOC2R.mjs → chunk-D5AGLXJP.mjs} +678 -385
  6. package/dist/lib/browser/chunk-D5AGLXJP.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-WZMOZKQZ.mjs → chunk-FUAGSXA4.mjs} +16 -9
  8. package/dist/lib/browser/chunk-FUAGSXA4.mjs.map +7 -0
  9. package/dist/lib/{node-esm/chunk-IU2L277A.mjs → browser/chunk-JRL5LGCE.mjs} +5 -4
  10. package/dist/lib/browser/chunk-JRL5LGCE.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-NU4PBN33.mjs +8 -0
  12. package/dist/lib/browser/chunk-NU4PBN33.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +60 -74
  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-6DQABRGJ.cjs → SheetContainer-AXQV3ZT5.cjs} +279 -1182
  21. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs.map +7 -0
  22. package/dist/lib/node/{chunk-P5QYYEHQ.cjs → chunk-5KKJ4NPP.cjs} +676 -388
  23. package/dist/lib/node/chunk-5KKJ4NPP.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-BNARJ5GM.cjs → chunk-BJ6ZD7MN.cjs} +18 -5
  25. package/dist/lib/node/chunk-BJ6ZD7MN.cjs.map +7 -0
  26. package/dist/lib/node/chunk-CN3RPESU.cjs +202 -0
  27. package/dist/lib/node/chunk-CN3RPESU.cjs.map +7 -0
  28. package/dist/lib/node/{chunk-AOP42UAA.cjs → chunk-DSYKOI4E.cjs} +21 -13
  29. package/dist/lib/node/chunk-DSYKOI4E.cjs.map +7 -0
  30. package/dist/lib/node/chunk-PYXHNAAK.cjs +40 -0
  31. package/dist/lib/node/chunk-PYXHNAAK.cjs.map +7 -0
  32. package/dist/lib/node/index.cjs +66 -86
  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 +2 -8
  49. package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +1 -0
  50. package/dist/types/src/{graph/testing/custom-function.d.ts → components/ComputeGraph/custom.d.ts} +2 -4
  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 +7 -8
  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} +65 -10
  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 +5 -86
  101. package/dist/types/src/types.d.ts.map +1 -1
  102. package/package.json +41 -48
  103. package/src/SheetPlugin.tsx +73 -48
  104. package/src/components/CellEditor/CellEditor.stories.tsx +4 -5
  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 +6 -15
  109. package/src/{graph/testing/custom-function.ts → components/ComputeGraph/custom.ts} +7 -11
  110. package/src/{graph → components/ComputeGraph}/edge-function.ts +3 -3
  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 +88 -52
  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 +80 -18
  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 -24
  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 +6 -31
  134. package/dist/lib/browser/SheetContainer-VISF3VUB.mjs +0 -261
  135. package/dist/lib/browser/SheetContainer-VISF3VUB.mjs.map +0 -7
  136. package/dist/lib/browser/chunk-QILRZNE5.mjs +0 -15
  137. package/dist/lib/browser/chunk-QILRZNE5.mjs.map +0 -7
  138. package/dist/lib/browser/chunk-WZMOZKQZ.mjs.map +0 -7
  139. package/dist/lib/browser/chunk-Z2XOOC2R.mjs.map +0 -7
  140. package/dist/lib/browser/chunk-ZLJ2GRE2.mjs.map +0 -7
  141. package/dist/lib/browser/graph-4XFKIHRL.mjs +0 -21
  142. package/dist/lib/browser/graph-4XFKIHRL.mjs.map +0 -7
  143. package/dist/lib/node/SheetContainer-2MEALQWW.cjs +0 -279
  144. package/dist/lib/node/SheetContainer-2MEALQWW.cjs.map +0 -7
  145. package/dist/lib/node/chunk-6DQABRGJ.cjs.map +0 -7
  146. package/dist/lib/node/chunk-AOP42UAA.cjs.map +0 -7
  147. package/dist/lib/node/chunk-BNARJ5GM.cjs.map +0 -7
  148. package/dist/lib/node/chunk-P5QYYEHQ.cjs.map +0 -7
  149. package/dist/lib/node/graph-2LRDUXBZ.cjs +0 -43
  150. package/dist/lib/node/graph-2LRDUXBZ.cjs.map +0 -7
  151. package/dist/lib/node-esm/SheetContainer-RPSUSXWS.mjs +0 -262
  152. package/dist/lib/node-esm/SheetContainer-RPSUSXWS.mjs.map +0 -7
  153. package/dist/lib/node-esm/chunk-4MM7THJW.mjs +0 -2944
  154. package/dist/lib/node-esm/chunk-4MM7THJW.mjs.map +0 -7
  155. package/dist/lib/node-esm/chunk-5RLTCIE2.mjs +0 -2684
  156. package/dist/lib/node-esm/chunk-5RLTCIE2.mjs.map +0 -7
  157. package/dist/lib/node-esm/chunk-IU2L277A.mjs.map +0 -7
  158. package/dist/lib/node-esm/chunk-RR2AO4SM.mjs +0 -76
  159. package/dist/lib/node-esm/chunk-RR2AO4SM.mjs.map +0 -7
  160. package/dist/lib/node-esm/graph-WG5EKOMO.mjs +0 -22
  161. package/dist/lib/node-esm/graph-WG5EKOMO.mjs.map +0 -7
  162. package/dist/lib/node-esm/index.mjs +0 -263
  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 -9
  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.d.ts +0 -84
  195. package/dist/types/src/graph/compute-graph.d.ts.map +0 -1
  196. package/dist/types/src/graph/compute-graph.stories.d.ts +0 -10
  197. package/dist/types/src/graph/compute-graph.stories.d.ts.map +0 -1
  198. package/dist/types/src/graph/compute-graph.test.d.ts +0 -2
  199. package/dist/types/src/graph/compute-graph.test.d.ts.map +0 -1
  200. package/dist/types/src/graph/compute-node.d.ts +0 -26
  201. package/dist/types/src/graph/compute-node.d.ts.map +0 -1
  202. package/dist/types/src/graph/edge-function.d.ts.map +0 -1
  203. package/dist/types/src/graph/function-defs.d.ts.map +0 -1
  204. package/dist/types/src/graph/hyperformula.test.d.ts +0 -2
  205. package/dist/types/src/graph/hyperformula.test.d.ts.map +0 -1
  206. package/dist/types/src/graph/index.d.ts +0 -4
  207. package/dist/types/src/graph/index.d.ts.map +0 -1
  208. package/dist/types/src/graph/testing/custom-function.d.ts.map +0 -1
  209. package/dist/types/src/graph/testing/index.d.ts +0 -2
  210. package/dist/types/src/graph/testing/index.d.ts.map +0 -1
  211. package/dist/types/src/graph/util.d.ts +0 -2
  212. package/dist/types/src/graph/util.d.ts.map +0 -1
  213. package/dist/types/src/hooks/hooks.stories.d.ts +0 -11
  214. package/dist/types/src/hooks/hooks.stories.d.ts.map +0 -1
  215. package/dist/types/src/hooks/index.d.ts +0 -4
  216. package/dist/types/src/hooks/index.d.ts.map +0 -1
  217. package/dist/types/src/hooks/useComputeGraph.d.ts +0 -7
  218. package/dist/types/src/hooks/useComputeGraph.d.ts.map +0 -1
  219. package/dist/types/src/hooks/useFormattingModel.d.ts +0 -3
  220. package/dist/types/src/hooks/useFormattingModel.d.ts.map +0 -1
  221. package/dist/types/src/hooks/useSheetModel.d.ts +0 -8
  222. package/dist/types/src/hooks/useSheetModel.d.ts.map +0 -1
  223. package/dist/types/src/model/formatting-model.d.ts +0 -16
  224. package/dist/types/src/model/formatting-model.d.ts.map +0 -1
  225. package/dist/types/src/model/sheet-model.d.ts.map +0 -1
  226. package/dist/types/src/sanity.test.d.ts +0 -2
  227. package/dist/types/src/sanity.test.d.ts.map +0 -1
  228. package/dist/types/src/testing/index.d.ts +0 -2
  229. package/dist/types/src/testing/index.d.ts.map +0 -1
  230. package/dist/types/src/testing/testing.d.ts +0 -8
  231. package/dist/types/src/testing/testing.d.ts.map +0 -1
  232. package/dist/vendor/hyperformula.mjs +0 -37145
  233. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +0 -20
  234. package/src/components/GridSheet/GridSheet.stories.tsx +0 -36
  235. package/src/components/GridSheet/GridSheet.tsx +0 -153
  236. package/src/components/GridSheet/util.ts +0 -108
  237. package/src/components/Sheet/decorations.ts +0 -62
  238. package/src/components/Sheet/threads.tsx +0 -205
  239. package/src/defs/index.ts +0 -6
  240. package/src/defs/util.ts +0 -151
  241. package/src/extensions/compute.stories.tsx +0 -153
  242. package/src/extensions/compute.ts +0 -131
  243. package/src/extensions/index.ts +0 -5
  244. package/src/graph/compute-graph.stories.tsx +0 -93
  245. package/src/graph/compute-graph.test.ts +0 -127
  246. package/src/graph/compute-graph.ts +0 -313
  247. package/src/graph/compute-node.ts +0 -62
  248. package/src/graph/hyperformula.test.ts +0 -15
  249. package/src/graph/index.ts +0 -7
  250. package/src/graph/testing/index.ts +0 -5
  251. package/src/graph/util.ts +0 -8
  252. package/src/hooks/hooks.stories.tsx +0 -50
  253. package/src/hooks/index.ts +0 -7
  254. package/src/hooks/useComputeGraph.ts +0 -21
  255. package/src/hooks/useFormattingModel.ts +0 -11
  256. package/src/hooks/useSheetModel.ts +0 -40
  257. package/src/model/sheet-model.ts +0 -414
  258. package/src/sanity.test.ts +0 -40
  259. package/src/testing/index.ts +0 -5
  260. package/src/testing/testing.tsx +0 -68
  261. /package/dist/types/src/{graph → components/ComputeGraph}/edge-function.d.ts +0 -0
  262. /package/dist/types/src/{defs → model}/types.test.d.ts +0 -0
  263. /package/src/{graph/function-defs.ts → model/functions.ts} +0 -0
@@ -1,21 +1,19 @@
1
- // packages/plugins/plugin-sheet/src/graph/compute-graph.ts
2
- import defaultsDeep2 from "lodash.defaultsdeep";
3
- import { Event as Event2 } from "@dxos/async";
4
- import { Filter as Filter2, fullyQualifiedId } from "@dxos/client/echo";
5
- import { Resource as Resource2 } from "@dxos/context";
6
- import { invariant } from "@dxos/invariant";
1
+ import {
2
+ ValueTypeEnum
3
+ } from "./chunk-FUAGSXA4.mjs";
4
+
5
+ // packages/plugins/plugin-sheet/src/components/ComputeGraph/graph.ts
6
+ import { HyperFormula } from "hyperformula";
7
+ import { Event } from "@dxos/async";
7
8
  import { PublicKey } from "@dxos/keys";
8
- import { log as log3 } from "@dxos/log";
9
- import { FunctionType as FunctionType2 } from "@dxos/plugin-script/types";
10
- import { nonNullable as nonNullable2 } from "@dxos/util";
11
- import { ExportedCellChange, HyperFormula } from "#hyperformula";
9
+ import { log as log2 } from "@dxos/log";
12
10
 
13
- // 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";
14
13
  import defaultsDeep from "lodash.defaultsdeep";
15
14
  import { debounce } from "@dxos/async";
16
15
  import { log } from "@dxos/log";
17
- import { CellError, ErrorType, EmptyValue, FunctionPlugin } from "#hyperformula";
18
- 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";
19
17
  var defaultFunctionContextOptions = {
20
18
  defaultTtl: 5e3,
21
19
  recalculationDelay: 200,
@@ -29,7 +27,7 @@ var FunctionContext = class _FunctionContext {
29
27
  ...args
30
28
  });
31
29
  }
32
- constructor(_hf, _space, _options) {
30
+ constructor(_hf, _space, onUpdate, _options) {
33
31
  this._hf = _hf;
34
32
  this._space = _space;
35
33
  this._cache = /* @__PURE__ */ new Map();
@@ -37,9 +35,9 @@ var FunctionContext = class _FunctionContext {
37
35
  this._subscriptions = /* @__PURE__ */ new Map();
38
36
  this._invocations = {};
39
37
  this._options = defaultsDeep(_options ?? {}, defaultFunctionContextOptions);
40
- this._onUpdate = debounce((update) => {
38
+ this._onUpdate = debounce(() => {
41
39
  this._hf.resumeEvaluation();
42
- this._options.onUpdate?.(update);
40
+ onUpdate(this);
43
41
  }, this._options.recalculationDelay);
44
42
  }
45
43
  get space() {
@@ -90,21 +88,18 @@ var FunctionContext = class _FunctionContext {
90
88
  value: value2
91
89
  }, {
92
90
  F: __dxlog_file,
93
- L: 145,
91
+ L: 136,
94
92
  S: this,
95
93
  C: (f, a) => f(...a)
96
94
  });
97
- this._onUpdate({
98
- name,
99
- cell
100
- });
95
+ this._onUpdate();
101
96
  } catch (err) {
102
97
  log.warn("failed", {
103
98
  cell,
104
99
  err
105
100
  }, {
106
101
  F: __dxlog_file,
107
- L: 149,
102
+ L: 140,
108
103
  S: this,
109
104
  C: (f, a) => f(...a)
110
105
  });
@@ -124,7 +119,7 @@ var FunctionContext = class _FunctionContext {
124
119
  cache: value
125
120
  }, {
126
121
  F: __dxlog_file,
127
- L: 157,
122
+ L: 148,
128
123
  S: this,
129
124
  C: (f, a) => f(...a)
130
125
  });
@@ -144,170 +139,53 @@ var FunctionPluginAsync = class extends FunctionPlugin {
144
139
  }
145
140
  };
146
141
 
147
- // packages/plugins/plugin-sheet/src/graph/compute-node.ts
148
- import { Event } from "@dxos/async";
149
- import { Resource } from "@dxos/context";
150
- import { DetailedCellError } from "#hyperformula";
151
- var ComputeNode = class extends Resource {
152
- constructor(_graph, sheetId) {
153
- super();
154
- this._graph = _graph;
155
- 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()}`;
156
159
  this.update = new Event();
157
- }
158
- get graph() {
159
- return this._graph;
160
- }
161
- clear() {
162
- this._graph.hf.clearSheet(this.sheetId);
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
166
  }
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
- }
187
- async _open() {
188
- }
189
- };
190
-
191
- // packages/plugins/plugin-sheet/src/graph/edge-function.ts
192
- import { effect } from "@preact/signals-core";
193
- import { Filter, getMeta } from "@dxos/client/echo";
194
- import { log as log2 } from "@dxos/log";
195
- import { getUserFunctionUrlInMetadata } from "@dxos/plugin-script/edge";
196
- import { FunctionType } from "@dxos/plugin-script/types";
197
- import { nonNullable } from "@dxos/util";
198
- import { CellError as CellError2, ErrorType as ErrorType2, FunctionArgumentType } from "#hyperformula";
199
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/edge-function.ts";
200
- var EDGE_FUNCTION_TTL = 1e4;
201
- var EdgeFunctionPlugin = class extends FunctionPluginAsync {
202
- edge(ast, state) {
203
- const handler = (subscribe = false) => async (binding, ...args) => {
204
- const space = this.context.space;
205
- if (!space) {
206
- return new CellError2(ErrorType2.REF, "Missing space");
207
- }
208
- const { objects: [fn] } = await space.db.query(Filter.schema(FunctionType, {
209
- binding
210
- })).run();
211
- if (!fn) {
212
- log2.info("Function not found", {
213
- binding
214
- }, {
215
- F: __dxlog_file2,
216
- L: 39,
217
- S: this,
218
- C: (f, a) => f(...a)
219
- });
220
- return new CellError2(ErrorType2.REF, "Function not found");
221
- }
222
- if (subscribe) {
223
- const unsubscribe = effect(() => {
224
- log2.info("function changed", {
225
- fn
226
- }, {
227
- F: __dxlog_file2,
228
- L: 45,
229
- S: this,
230
- C: (f, a) => f(...a)
231
- });
232
- const _ = fn?.version;
233
- this.runAsyncFunction(ast, state, handler(false), {
234
- ttl: EDGE_FUNCTION_TTL
235
- });
236
- });
237
- this.context.createSubscription(ast.procedureName, unsubscribe);
238
- }
239
- const path = getUserFunctionUrlInMetadata(getMeta(fn));
240
- const result = await fetch(`${this.context.remoteFunctionUrl}${path}`, {
241
- method: "POST",
242
- headers: {
243
- "Content-Type": "application/json"
244
- },
245
- body: JSON.stringify({
246
- args: args.filter(nonNullable)
247
- })
248
- });
249
- return await result.text();
250
- };
251
- return this.runAsyncFunction(ast, state, handler(true), {
252
- 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)
253
175
  });
176
+ this.update.emit();
254
177
  }
255
178
  };
256
- EdgeFunctionPlugin.implementedFunctions = {
257
- EDGE: {
258
- method: "edge",
259
- parameters: [
260
- // Binding
261
- {
262
- argumentType: FunctionArgumentType.STRING
263
- },
264
- // Remote function arguments (currently supporting up to 8).
265
- {
266
- argumentType: FunctionArgumentType.ANY,
267
- optionalArg: true
268
- },
269
- {
270
- argumentType: FunctionArgumentType.ANY,
271
- optionalArg: true
272
- },
273
- {
274
- argumentType: FunctionArgumentType.ANY,
275
- optionalArg: true
276
- },
277
- {
278
- argumentType: FunctionArgumentType.ANY,
279
- optionalArg: true
280
- },
281
- {
282
- argumentType: FunctionArgumentType.ANY,
283
- optionalArg: true
284
- },
285
- {
286
- argumentType: FunctionArgumentType.ANY,
287
- optionalArg: true
288
- },
289
- {
290
- argumentType: FunctionArgumentType.ANY,
291
- optionalArg: true
292
- },
293
- {
294
- argumentType: FunctionArgumentType.ANY,
295
- optionalArg: true
296
- }
297
- ],
298
- isVolatile: true
299
- }
300
- };
301
- var EdgeFunctionPluginTranslations = {
302
- enGB: {
303
- EDGE: "EDGE"
304
- },
305
- enUS: {
306
- EDGE: "EDGE"
307
- }
308
- };
309
179
 
310
- // 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
311
189
  var defaultFunctions = [
312
190
  // Array
313
191
  {
@@ -2681,262 +2559,677 @@ var defaultFunctions = [
2681
2559
  }
2682
2560
  ];
2683
2561
 
2684
- // packages/plugins/plugin-sheet/src/graph/compute-graph.ts
2685
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/graph/compute-graph.ts";
2686
- var OBJECT_ID_LENGTH = 60;
2687
- var CUSTOM_FUNCTION = "ECHO";
2688
- var defaultOptions = {
2689
- licenseKey: "gpl-v3"
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;
2690
2568
  };
2691
- var defaultPlugins = [
2692
- {
2693
- plugin: EdgeFunctionPlugin,
2694
- translations: EdgeFunctionPluginTranslations
2569
+ var columnLetter = (column) => {
2570
+ invariant(column < MAX_COLUMNS, `Invalid column: ${column}`, {
2571
+ F: __dxlog_file3,
2572
+ L: 17,
2573
+ S: void 0,
2574
+ A: [
2575
+ "column < MAX_COLUMNS",
2576
+ "`Invalid column: ${column}`"
2577
+ ]
2578
+ });
2579
+ return (column >= 26 ? String.fromCharCode("A".charCodeAt(0) + Math.floor(column / 26) - 1) : "") + String.fromCharCode("A".charCodeAt(0) + column % 26);
2580
+ };
2581
+ var addressToA1Notation = ({ column, row }) => {
2582
+ return `${columnLetter(column)}${row + 1}`;
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;
2695
2609
  }
2696
- ];
2697
- var PREFIX = "__";
2698
- var createSheetName = (id) => `${PREFIX}${id}`;
2699
- var getSheetId = (name) => name.startsWith(PREFIX) ? name.slice(PREFIX.length) : void 0;
2700
- var ComputeGraphRegistry = class extends Resource2 {
2701
- constructor(options = {
2702
- plugins: defaultPlugins
2703
- }) {
2704
- super();
2705
- this._graphs = /* @__PURE__ */ new Map();
2706
- this._options = defaultsDeep2({}, options, defaultOptions);
2707
- this._options.plugins?.forEach(({ plugin, translations }) => {
2708
- HyperFormula.registerFunctionPlugin(plugin, translations);
2709
- });
2610
+ const { from, to } = range;
2611
+ if (from && posEquals(from, cell) || to && posEquals(to, cell)) {
2612
+ return true;
2710
2613
  }
2711
- getGraph(spaceId) {
2712
- return this._graphs.get(spaceId);
2713
- }
2714
- async getOrCreateGraph(space) {
2715
- let graph = this.getGraph(space.id);
2716
- if (!graph) {
2717
- log3.info("create graph", {
2718
- space: space.id
2719
- }, {
2720
- F: __dxlog_file3,
2721
- L: 93,
2722
- S: this,
2723
- C: (f, a) => f(...a)
2724
- });
2725
- graph = await this.createGraph(space);
2726
- }
2727
- return graph;
2728
- }
2729
- async createGraph(space) {
2730
- invariant(!this._graphs.has(space.id), `ComputeGraph already exists for space: ${space.id}`, {
2731
- F: __dxlog_file3,
2732
- L: 101,
2733
- S: this,
2734
- A: [
2735
- "!this._graphs.has(space.id)",
2736
- "`ComputeGraph already exists for space: ${space.id}`"
2737
- ]
2738
- });
2739
- const hf = HyperFormula.buildEmpty(this._options);
2740
- const graph = new ComputeGraph(hf, space, this._options);
2741
- this._graphs.set(space.id, graph);
2742
- await graph.open();
2743
- return graph;
2744
- }
2745
- async _close() {
2746
- for (const graph of this._graphs.values()) {
2747
- await graph.close();
2748
- }
2614
+ if (!from || !to) {
2615
+ return false;
2749
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;
2750
2625
  };
2751
- var ComputeGraph = class extends Resource2 {
2752
- constructor(_hf, _space, _options) {
2626
+
2627
+ // packages/plugins/plugin-sheet/src/model/util.ts
2628
+ import { randomBytes } from "@dxos/crypto";
2629
+ var ApiError = class extends Error {
2630
+ };
2631
+ var ReadonlyException = class extends ApiError {
2632
+ };
2633
+ var RangeException = class extends ApiError {
2634
+ constructor(n) {
2753
2635
  super();
2754
- 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;
2755
2687
  this._space = _space;
2756
- this._options = _options;
2757
- this.id = `graph-${PublicKey.random().truncate()}`;
2758
- this._nodes = /* @__PURE__ */ new Map();
2688
+ this.id = `model-${PublicKey2.random().truncate()}`;
2689
+ this._ctx = void 0;
2759
2690
  this._functions = [];
2760
2691
  this.update = new Event2();
2761
- this.context = new FunctionContext(this._hf, this._space, this._options);
2762
- this._hf.updateConfig({
2763
- context: this.context
2764
- });
2765
- const onValuesUpdate = (changes) => {
2766
- for (const change of changes) {
2767
- if (change instanceof ExportedCellChange) {
2768
- const { sheet } = change;
2769
- const node = this._nodes.get(sheet);
2770
- if (node) {
2771
- node.update.emit({
2772
- type: "valuesUpdated",
2773
- change
2774
- });
2775
- }
2776
- }
2777
- }
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
2778
2700
  };
2779
- this._hf.on("valuesUpdated", onValuesUpdate);
2780
- this._ctx.onDispose(() => this._hf.off("valuesUpdated", onValuesUpdate));
2781
- }
2782
- get hf() {
2783
- return this._hf;
2784
- }
2785
- // refresh() {
2786
- // log('refresh', { id: this.id });
2787
- // this.update.emit();
2788
- // }
2789
- getFunctions({ standard, echo } = {
2790
- standard: true,
2791
- echo: true
2792
- }) {
2701
+ this.reset();
2702
+ }
2703
+ get graph() {
2704
+ return this._graph;
2705
+ }
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
+ };
2717
+ }
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
+ }));
2793
2725
  return [
2794
- ...standard ? this._hf.getRegisteredFunctionNames().map((name) => defaultFunctions.find((fn) => fn.name === name) ?? {
2795
- name
2796
- }) : [],
2797
- ...echo ? this._functions.map((fn) => ({
2798
- name: fn.binding
2799
- })) : []
2726
+ ...hfFunctions,
2727
+ ...echoFunctions
2800
2728
  ];
2801
2729
  }
2730
+ get initialized() {
2731
+ return !!this._ctx;
2732
+ }
2802
2733
  /**
2803
- * Get or create cell representing a sheet.
2734
+ * Initialize sheet and engine.
2804
2735
  */
2805
- // TODO(burdon): Async (open node).
2806
- // The graph should be an extensible factory that plugins extend with model constructors.
2807
- // This would enable on-the-fly instantiation of new models when then are referenced.
2808
- // E.g., Cross-object reference would be stored as "ObjectId!A1"
2809
- // The graph would then load the object and create a ComputeNode (model) of the appropriate type.
2810
- async getOrCreateNode(name) {
2811
- invariant(name.length, void 0, {
2812
- F: __dxlog_file3,
2813
- L: 193,
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,
2814
2748
  S: this,
2815
2749
  A: [
2816
- "name.length",
2817
- ""
2750
+ "!this.initialized",
2751
+ "'Already initialized.'"
2818
2752
  ]
2819
2753
  });
2820
- if (!this._hf.doesSheetExist(name)) {
2821
- log3.info("created node", {
2822
- space: this._space?.id,
2823
- name
2824
- }, {
2825
- F: __dxlog_file3,
2826
- L: 195,
2827
- S: this,
2828
- 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();
2829
2774
  });
2830
- this._hf.addSheet(name);
2775
+ this._ctx.onDispose(unsubscribe2);
2831
2776
  }
2832
- const sheetId = this._hf.getSheetId(name);
2833
- invariant(sheetId !== void 0, void 0, {
2834
- F: __dxlog_file3,
2835
- L: 201,
2777
+ return this;
2778
+ }
2779
+ async destroy() {
2780
+ log3("destroy", {
2781
+ id: this.id
2782
+ }, {
2783
+ F: __dxlog_file4,
2784
+ L: 174,
2836
2785
  S: this,
2837
- A: [
2838
- "sheetId !== undefined",
2839
- ""
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
2840
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);
2841
2977
  });
2842
- const node = new ComputeNode(this, sheetId);
2843
- await node.open();
2844
- this._nodes.set(sheetId, node);
2845
- return node;
2846
2978
  }
2847
2979
  /**
2848
- * Map bound value to custom function invocation.
2849
- * E.g., "HELLO(...args)" => "EDGE("HELLO", ...args)".
2980
+ * Iterate range.
2850
2981
  */
2851
- mapFormulaToNative(formula) {
2852
- return formula.replace(/['"]?([ \w]+)['"]?!/, (_match, name) => {
2853
- if (name) {
2854
- const objects = this._hf.getSheetNames().map((name2) => {
2855
- const id = getSheetId(name2);
2856
- return id ? this._space?.db.getObjectById(id) : void 0;
2857
- }).filter(nonNullable2);
2858
- for (const obj of objects) {
2859
- if (obj.name === name || obj.title === name) {
2860
- return `${createSheetName(obj.id)}!`;
2861
- }
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);
2862
3002
  }
2863
3003
  }
2864
- return `${name}!`;
2865
- }).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) => {
2866
3070
  const fn = this._functions.find((fn2) => fn2.binding === binding);
2867
3071
  if (!fn) {
2868
3072
  return match;
2869
3073
  }
2870
3074
  if (args.trim() === "") {
2871
- return `${CUSTOM_FUNCTION}("${binding}")`;
2872
- } else {
2873
- return `${CUSTOM_FUNCTION}("${binding}", ${args})`;
3075
+ return `EDGE("${binding}")`;
2874
3076
  }
3077
+ return `EDGE("${binding}", ${args})`;
2875
3078
  });
2876
3079
  }
2877
3080
  /**
2878
- * Map from binding to fully qualified ECHO ID (to store).
2879
- * E.g., HELLO() => spaceId:objectId()
3081
+ * E.g., "EDGE("HELLO")" => "HELLO()".
2880
3082
  */
2881
- mapFunctionBindingToId(formula) {
2882
- return formula.replace(/(\w+)\((.*)\)/g, (match, binding, args) => {
2883
- if (binding === CUSTOM_FUNCTION || defaultFunctions.find((fn2) => fn2.name === binding)) {
2884
- return match;
2885
- }
2886
- const fn = this._functions.find((fn2) => fn2.binding === binding);
2887
- if (fn) {
2888
- const id = fullyQualifiedId(fn);
2889
- return `${id}(${args})`;
2890
- } else {
2891
- return match;
3083
+ mapFormulaBindingFromFormula(formula) {
3084
+ return formula.replace(/EDGE\("([a-zA-Z0-9]+)"(.*)\)/, (_match, binding, args) => {
3085
+ if (args.trim() === "") {
3086
+ return `${binding}()`;
2892
3087
  }
3088
+ return `${binding}(${args.slice(2)})`;
2893
3089
  });
2894
3090
  }
2895
3091
  /**
2896
- * Map from fully qualified ECHO ID to binding (from store).
2897
- * E.g., spaceId:objectId() => HELLO()
3092
+ * Map from binding to fully qualified ECHO ID.
2898
3093
  */
2899
- mapFunctionBindingFromId(formula) {
2900
- return formula.replace(/(\w+):([a-zA-Z0-9]+)\((.*)\)/g, (match, spaceId, objectId, args) => {
2901
- const id = `${spaceId}:${objectId}`;
2902
- if (id.length !== OBJECT_ID_LENGTH) {
2903
- return match;
2904
- }
2905
- const fn = this._functions.find((fn2) => fullyQualifiedId(fn2) === id);
2906
- if (fn?.binding) {
2907
- return `${fn.binding}(${args})`;
2908
- } else {
2909
- 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;
2910
3185
  }
3186
+ return parseNumberString(rate);
3187
+ };
3188
+ return this.runAsyncFunction(ast, state, handler, {
3189
+ ttl: 1e4
2911
3190
  });
2912
3191
  }
2913
- async _open() {
2914
- if (this._space) {
2915
- const query = this._space.db.query(Filter2.schema(FunctionType2));
2916
- const unsubscribe = query.subscribe(({ objects }) => {
2917
- this._functions = objects.filter(({ binding }) => binding);
2918
- this.update.emit({
2919
- type: "functionsUpdated"
2920
- });
2921
- });
2922
- this._ctx.onDispose(unsubscribe);
2923
- }
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
2924
3208
  }
2925
- async _close() {
2926
- for (const node of this._nodes.values()) {
2927
- await node.close();
2928
- }
3209
+ };
3210
+ var CustomPluginTranslations = {
3211
+ enGB: {
3212
+ TEST: "TEST",
3213
+ CRYPTO: "CRYPTO"
3214
+ },
3215
+ enUS: {
3216
+ TEST: "TEST",
3217
+ CRYPTO: "CRYPTO"
2929
3218
  }
2930
3219
  };
2931
3220
 
2932
3221
  export {
2933
- ComputeNode,
3222
+ FunctionPluginAsync,
3223
+ CustomPlugin,
3224
+ CustomPluginTranslations,
3225
+ createComputeGraph,
2934
3226
  defaultFunctions,
2935
- defaultOptions,
2936
- defaultPlugins,
2937
- createSheetName,
2938
- getSheetId,
2939
- ComputeGraphRegistry,
2940
- ComputeGraph
3227
+ posEquals,
3228
+ columnLetter,
3229
+ addressToA1Notation,
3230
+ addressFromA1Notation,
3231
+ rangeToA1Notation,
3232
+ inRange,
3233
+ SheetModel
2941
3234
  };
2942
- //# sourceMappingURL=chunk-Z2XOOC2R.mjs.map
3235
+ //# sourceMappingURL=chunk-D5AGLXJP.mjs.map