@gridsheet/core 3.0.0-rc.8

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 (250) hide show
  1. package/README.md +17 -0
  2. package/dist/constants.d.ts +21 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +28 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/formula/evaluator.d.ts +134 -0
  7. package/dist/formula/evaluator.d.ts.map +1 -0
  8. package/dist/formula/evaluator.js +585 -0
  9. package/dist/formula/evaluator.js.map +1 -0
  10. package/dist/formula/formula-error.d.ts +10 -0
  11. package/dist/formula/formula-error.d.ts.map +1 -0
  12. package/dist/formula/formula-error.js +15 -0
  13. package/dist/formula/formula-error.js.map +1 -0
  14. package/dist/formula/functions/__async.d.ts +67 -0
  15. package/dist/formula/functions/__async.d.ts.map +1 -0
  16. package/dist/formula/functions/__async.js +70 -0
  17. package/dist/formula/functions/__async.js.map +1 -0
  18. package/dist/formula/functions/__base.d.ts +112 -0
  19. package/dist/formula/functions/__base.d.ts.map +1 -0
  20. package/dist/formula/functions/__base.js +265 -0
  21. package/dist/formula/functions/__base.js.map +1 -0
  22. package/dist/formula/functions/__utils.d.ts +28 -0
  23. package/dist/formula/functions/__utils.d.ts.map +1 -0
  24. package/dist/formula/functions/__utils.js +179 -0
  25. package/dist/formula/functions/__utils.js.map +1 -0
  26. package/dist/formula/functions/abs.d.ts +9 -0
  27. package/dist/formula/functions/abs.d.ts.map +1 -0
  28. package/dist/formula/functions/abs.js +15 -0
  29. package/dist/formula/functions/abs.js.map +1 -0
  30. package/dist/formula/functions/add.d.ts +10 -0
  31. package/dist/formula/functions/add.d.ts.map +1 -0
  32. package/dist/formula/functions/add.js +37 -0
  33. package/dist/formula/functions/add.js.map +1 -0
  34. package/dist/formula/functions/and.d.ts +9 -0
  35. package/dist/formula/functions/and.d.ts.map +1 -0
  36. package/dist/formula/functions/and.js +23 -0
  37. package/dist/formula/functions/and.js.map +1 -0
  38. package/dist/formula/functions/arrayformula.d.ts +12 -0
  39. package/dist/formula/functions/arrayformula.d.ts.map +1 -0
  40. package/dist/formula/functions/arrayformula.js +24 -0
  41. package/dist/formula/functions/arrayformula.js.map +1 -0
  42. package/dist/formula/functions/average.d.ts +9 -0
  43. package/dist/formula/functions/average.d.ts.map +1 -0
  44. package/dist/formula/functions/average.js +40 -0
  45. package/dist/formula/functions/average.js.map +1 -0
  46. package/dist/formula/functions/concat.d.ts +9 -0
  47. package/dist/formula/functions/concat.d.ts.map +1 -0
  48. package/dist/formula/functions/concat.js +27 -0
  49. package/dist/formula/functions/concat.js.map +1 -0
  50. package/dist/formula/functions/count.d.ts +9 -0
  51. package/dist/formula/functions/count.d.ts.map +1 -0
  52. package/dist/formula/functions/count.js +32 -0
  53. package/dist/formula/functions/count.js.map +1 -0
  54. package/dist/formula/functions/counta.d.ts +9 -0
  55. package/dist/formula/functions/counta.d.ts.map +1 -0
  56. package/dist/formula/functions/counta.js +32 -0
  57. package/dist/formula/functions/counta.js.map +1 -0
  58. package/dist/formula/functions/divide.d.ts +10 -0
  59. package/dist/formula/functions/divide.d.ts.map +1 -0
  60. package/dist/formula/functions/divide.js +34 -0
  61. package/dist/formula/functions/divide.js.map +1 -0
  62. package/dist/formula/functions/eq.d.ts +9 -0
  63. package/dist/formula/functions/eq.d.ts.map +1 -0
  64. package/dist/formula/functions/eq.js +19 -0
  65. package/dist/formula/functions/eq.js.map +1 -0
  66. package/dist/formula/functions/gt.d.ts +9 -0
  67. package/dist/formula/functions/gt.d.ts.map +1 -0
  68. package/dist/formula/functions/gt.js +19 -0
  69. package/dist/formula/functions/gt.js.map +1 -0
  70. package/dist/formula/functions/gte.d.ts +9 -0
  71. package/dist/formula/functions/gte.d.ts.map +1 -0
  72. package/dist/formula/functions/gte.js +19 -0
  73. package/dist/formula/functions/gte.js.map +1 -0
  74. package/dist/formula/functions/if.d.ts +9 -0
  75. package/dist/formula/functions/if.d.ts.map +1 -0
  76. package/dist/formula/functions/if.js +29 -0
  77. package/dist/formula/functions/if.js.map +1 -0
  78. package/dist/formula/functions/iferror.d.ts +10 -0
  79. package/dist/formula/functions/iferror.d.ts.map +1 -0
  80. package/dist/formula/functions/iferror.js +28 -0
  81. package/dist/formula/functions/iferror.js.map +1 -0
  82. package/dist/formula/functions/len.d.ts +9 -0
  83. package/dist/formula/functions/len.d.ts.map +1 -0
  84. package/dist/formula/functions/len.js +21 -0
  85. package/dist/formula/functions/len.js.map +1 -0
  86. package/dist/formula/functions/lt.d.ts +9 -0
  87. package/dist/formula/functions/lt.d.ts.map +1 -0
  88. package/dist/formula/functions/lt.js +19 -0
  89. package/dist/formula/functions/lt.js.map +1 -0
  90. package/dist/formula/functions/lte.d.ts +9 -0
  91. package/dist/formula/functions/lte.d.ts.map +1 -0
  92. package/dist/formula/functions/lte.js +19 -0
  93. package/dist/formula/functions/lte.js.map +1 -0
  94. package/dist/formula/functions/max.d.ts +9 -0
  95. package/dist/formula/functions/max.d.ts.map +1 -0
  96. package/dist/formula/functions/max.js +37 -0
  97. package/dist/formula/functions/max.js.map +1 -0
  98. package/dist/formula/functions/min.d.ts +9 -0
  99. package/dist/formula/functions/min.d.ts.map +1 -0
  100. package/dist/formula/functions/min.js +37 -0
  101. package/dist/formula/functions/min.js.map +1 -0
  102. package/dist/formula/functions/minus.d.ts +10 -0
  103. package/dist/formula/functions/minus.d.ts.map +1 -0
  104. package/dist/formula/functions/minus.js +41 -0
  105. package/dist/formula/functions/minus.js.map +1 -0
  106. package/dist/formula/functions/multiply.d.ts +9 -0
  107. package/dist/formula/functions/multiply.d.ts.map +1 -0
  108. package/dist/formula/functions/multiply.js +19 -0
  109. package/dist/formula/functions/multiply.js.map +1 -0
  110. package/dist/formula/functions/ne.d.ts +9 -0
  111. package/dist/formula/functions/ne.d.ts.map +1 -0
  112. package/dist/formula/functions/ne.js +19 -0
  113. package/dist/formula/functions/ne.js.map +1 -0
  114. package/dist/formula/functions/not.d.ts +9 -0
  115. package/dist/formula/functions/not.d.ts.map +1 -0
  116. package/dist/formula/functions/not.js +22 -0
  117. package/dist/formula/functions/not.js.map +1 -0
  118. package/dist/formula/functions/now.d.ts +9 -0
  119. package/dist/formula/functions/now.d.ts.map +1 -0
  120. package/dist/formula/functions/now.js +14 -0
  121. package/dist/formula/functions/now.js.map +1 -0
  122. package/dist/formula/functions/or.d.ts +9 -0
  123. package/dist/formula/functions/or.d.ts.map +1 -0
  124. package/dist/formula/functions/or.js +23 -0
  125. package/dist/formula/functions/or.js.map +1 -0
  126. package/dist/formula/functions/power.d.ts +9 -0
  127. package/dist/formula/functions/power.d.ts.map +1 -0
  128. package/dist/formula/functions/power.js +18 -0
  129. package/dist/formula/functions/power.js.map +1 -0
  130. package/dist/formula/functions/sum.d.ts +9 -0
  131. package/dist/formula/functions/sum.d.ts.map +1 -0
  132. package/dist/formula/functions/sum.js +34 -0
  133. package/dist/formula/functions/sum.js.map +1 -0
  134. package/dist/formula/functions/uminus.d.ts +9 -0
  135. package/dist/formula/functions/uminus.d.ts.map +1 -0
  136. package/dist/formula/functions/uminus.js +17 -0
  137. package/dist/formula/functions/uminus.js.map +1 -0
  138. package/dist/formula/mapping.d.ts +11 -0
  139. package/dist/formula/mapping.d.ts.map +1 -0
  140. package/dist/formula/mapping.js +82 -0
  141. package/dist/formula/mapping.js.map +1 -0
  142. package/dist/formula/solver.d.ts +39 -0
  143. package/dist/formula/solver.d.ts.map +1 -0
  144. package/dist/formula/solver.js +71 -0
  145. package/dist/formula/solver.js.map +1 -0
  146. package/dist/index.d.ts +22 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +74 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/lib/autofill.d.ts +22 -0
  151. package/dist/lib/autofill.d.ts.map +1 -0
  152. package/dist/lib/autofill.js +276 -0
  153. package/dist/lib/autofill.js.map +1 -0
  154. package/dist/lib/book.d.ts +131 -0
  155. package/dist/lib/book.d.ts.map +1 -0
  156. package/dist/lib/book.js +53 -0
  157. package/dist/lib/book.js.map +1 -0
  158. package/dist/lib/cell.d.ts +17 -0
  159. package/dist/lib/cell.d.ts.map +1 -0
  160. package/dist/lib/cell.js +17 -0
  161. package/dist/lib/cell.js.map +1 -0
  162. package/dist/lib/coords.d.ts +22 -0
  163. package/dist/lib/coords.d.ts.map +1 -0
  164. package/dist/lib/coords.js +73 -0
  165. package/dist/lib/coords.js.map +1 -0
  166. package/dist/lib/date.d.ts +2 -0
  167. package/dist/lib/date.d.ts.map +1 -0
  168. package/dist/lib/date.js +91 -0
  169. package/dist/lib/date.js.map +1 -0
  170. package/dist/lib/dom.d.ts +7 -0
  171. package/dist/lib/dom.d.ts.map +1 -0
  172. package/dist/lib/dom.js +28 -0
  173. package/dist/lib/dom.js.map +1 -0
  174. package/dist/lib/filter.d.ts +7 -0
  175. package/dist/lib/filter.d.ts.map +1 -0
  176. package/dist/lib/filter.js +122 -0
  177. package/dist/lib/filter.js.map +1 -0
  178. package/dist/lib/input.d.ts +28 -0
  179. package/dist/lib/input.d.ts.map +1 -0
  180. package/dist/lib/input.js +73 -0
  181. package/dist/lib/input.js.map +1 -0
  182. package/dist/lib/label.d.ts +4 -0
  183. package/dist/lib/label.d.ts.map +1 -0
  184. package/dist/lib/label.js +10 -0
  185. package/dist/lib/label.js.map +1 -0
  186. package/dist/lib/operation.d.ts +31 -0
  187. package/dist/lib/operation.d.ts.map +1 -0
  188. package/dist/lib/operation.js +36 -0
  189. package/dist/lib/operation.js.map +1 -0
  190. package/dist/lib/palette.d.ts +2 -0
  191. package/dist/lib/palette.d.ts.map +1 -0
  192. package/dist/lib/palette.js +26 -0
  193. package/dist/lib/palette.js.map +1 -0
  194. package/dist/lib/popup.d.ts +24 -0
  195. package/dist/lib/popup.d.ts.map +1 -0
  196. package/dist/lib/popup.js +21 -0
  197. package/dist/lib/popup.js.map +1 -0
  198. package/dist/lib/reference.d.ts +19 -0
  199. package/dist/lib/reference.d.ts.map +1 -0
  200. package/dist/lib/reference.js +40 -0
  201. package/dist/lib/reference.js.map +1 -0
  202. package/dist/lib/sheet.d.ts +512 -0
  203. package/dist/lib/sheet.d.ts.map +1 -0
  204. package/dist/lib/sheet.js +1530 -0
  205. package/dist/lib/sheet.js.map +1 -0
  206. package/dist/lib/sheet_utils.d.ts +55 -0
  207. package/dist/lib/sheet_utils.d.ts.map +1 -0
  208. package/dist/lib/sheet_utils.js +125 -0
  209. package/dist/lib/sheet_utils.js.map +1 -0
  210. package/dist/lib/spatial.d.ts +79 -0
  211. package/dist/lib/spatial.d.ts.map +1 -0
  212. package/dist/lib/spatial.js +227 -0
  213. package/dist/lib/spatial.js.map +1 -0
  214. package/dist/lib/time.d.ts +29 -0
  215. package/dist/lib/time.d.ts.map +1 -0
  216. package/dist/lib/time.js +113 -0
  217. package/dist/lib/time.js.map +1 -0
  218. package/dist/lib/virtualization.d.ts +22 -0
  219. package/dist/lib/virtualization.d.ts.map +1 -0
  220. package/dist/lib/virtualization.js +91 -0
  221. package/dist/lib/virtualization.js.map +1 -0
  222. package/dist/policy/core.d.ts +161 -0
  223. package/dist/policy/core.d.ts.map +1 -0
  224. package/dist/policy/core.js +248 -0
  225. package/dist/policy/core.js.map +1 -0
  226. package/dist/policy/thousand_separator.d.ts +4 -0
  227. package/dist/policy/thousand_separator.d.ts.map +1 -0
  228. package/dist/policy/thousand_separator.js +13 -0
  229. package/dist/policy/thousand_separator.js.map +1 -0
  230. package/dist/sentinels.d.ts +40 -0
  231. package/dist/sentinels.d.ts.map +1 -0
  232. package/dist/sentinels.js +41 -0
  233. package/dist/sentinels.js.map +1 -0
  234. package/dist/styles/embedder.d.ts +2 -0
  235. package/dist/styles/embedder.d.ts.map +1 -0
  236. package/dist/styles/embedder.js +11 -0
  237. package/dist/styles/embedder.js.map +1 -0
  238. package/dist/styles/minified.d.ts +3 -0
  239. package/dist/styles/minified.d.ts.map +1 -0
  240. package/dist/styles/minified.js +6 -0
  241. package/dist/styles/minified.js.map +1 -0
  242. package/dist/types.d.ts +310 -0
  243. package/dist/types.d.ts.map +1 -0
  244. package/dist/types.js +2 -0
  245. package/dist/types.js.map +1 -0
  246. package/dist/utils.d.ts +2 -0
  247. package/dist/utils.d.ts.map +1 -0
  248. package/dist/utils.js +5 -0
  249. package/dist/utils.js.map +1 -0
  250. package/package.json +59 -0
@@ -0,0 +1,276 @@
1
+ import I from "dayjs";
2
+ import { complementSelectingArea as P, zoneToArea as F, createMatrix as G, areaShape as q, areaToZone as A, concatAreas as T } from "./spatial.js";
3
+ import { p2a as L } from "./coords.js";
4
+ import { Time as E } from "./time.js";
5
+ const m = "dashed 1px #888888", M = {
6
+ left: ["horizontal", -1],
7
+ right: ["horizontal", 1],
8
+ up: ["vertical", -1],
9
+ down: ["vertical", 1],
10
+ none: ["none", 0]
11
+ };
12
+ class U {
13
+ constructor(i, t) {
14
+ const { sheetReactive: s, choosing: r, selectingZone: n } = i, o = s.current;
15
+ if (!o)
16
+ throw new Error("Sheet is not available");
17
+ this.src = P(F(n), r), this.direction = this.suggestDirection(t), this.dst = this.getDestinationArea(t), this.sheet = o;
18
+ }
19
+ get applied() {
20
+ var c, x;
21
+ const [i, t] = M[this.direction], { top: s, left: r, bottom: n, right: o } = this.src, e = G(n - s + 1, o - r + 1);
22
+ for (let a = s; a <= n; a++)
23
+ for (let b = r; b <= o; b++)
24
+ e[a - s][b - r] = this.sheet.getCell({ y: a, x: b }, { resolution: "SYSTEM" }) ?? null;
25
+ const h = q(this.src), d = q(this.dst), u = {};
26
+ if (i === "horizontal")
27
+ for (let a = 0; a < d.rows; a++) {
28
+ const b = this.getChangePatterns(e[a], "");
29
+ for (let f = 0; f < d.cols; f++) {
30
+ const y = (c = e[a % h.rows]) == null ? void 0 : c[f % h.cols], v = t > 0 ? this.dst.left + f : this.dst.right - f, S = t > 0 ? f % h.cols : (h.cols - 1 - f % h.cols) % h.cols, k = { y: this.dst.top + a, x: v }, z = this.sheet.getId(k), R = b[S].next().value, C = (y == null ? void 0 : y.formulaEnabled) ?? !0 ? this.sheet.processFormula(R, {
31
+ dependency: z
32
+ }) : R;
33
+ u[L(k)] = {
34
+ ...y,
35
+ value: C
36
+ };
37
+ }
38
+ }
39
+ else if (i === "vertical")
40
+ for (let a = 0; a < d.cols; a++) {
41
+ const b = this.getChangePatterns(
42
+ e.map((f) => f[a]),
43
+ ""
44
+ );
45
+ for (let f = 0; f < d.rows; f++) {
46
+ const y = (x = e[f % h.rows]) == null ? void 0 : x[a % h.cols], v = t > 0 ? this.dst.top + f : this.dst.bottom - f, S = t > 0 ? f % h.rows : (h.rows - 1 - f % h.rows) % h.rows, k = b[S].next().value;
47
+ u[L({ y: v, x: this.dst.left + a })] = { ...y, value: k };
48
+ }
49
+ }
50
+ return this.sheet.update({
51
+ diff: u,
52
+ operator: "USER",
53
+ undoReflection: {
54
+ sheetId: this.sheet.id,
55
+ selectingZone: A(this.src)
56
+ },
57
+ redoReflection: {
58
+ sheetId: this.sheet.id,
59
+ selectingZone: A(this.dst)
60
+ }
61
+ });
62
+ }
63
+ get wholeArea() {
64
+ return T(this.src, this.dst);
65
+ }
66
+ getCellStyle(i) {
67
+ const { x: t, y: s } = i, r = {}, { top: n, left: o, bottom: e, right: h } = this.src;
68
+ switch (this.direction) {
69
+ case "left": {
70
+ this.dst.left <= t && t <= this.dst.right && (n === s && (r.borderTop = m), e === s - 1 && (r.borderTop = m)), this.dst.left === t && n <= s && s <= e && (r.borderLeft = m);
71
+ break;
72
+ }
73
+ case "right": {
74
+ this.dst.left <= t && t <= this.dst.right && (n === s && (r.borderTop = m), e === s - 1 && (r.borderTop = m)), this.dst.right === t - 1 && n <= s && s <= e && (r.borderLeft = m);
75
+ break;
76
+ }
77
+ case "up": {
78
+ this.dst.top <= s && s <= this.dst.bottom && (o === t && (r.borderLeft = m), h === t - 1 && (r.borderLeft = m)), this.dst.top === s && o <= t && t <= h && (r.borderTop = m);
79
+ break;
80
+ }
81
+ case "down": {
82
+ this.dst.top <= s && s <= this.dst.bottom && (o === t && (r.borderLeft = m), h === t - 1 && (r.borderLeft = m)), this.dst.bottom === s - 1 && o <= t && t <= h && (r.borderTop = m);
83
+ break;
84
+ }
85
+ }
86
+ return r;
87
+ }
88
+ getDestinationArea(i) {
89
+ const { x: t, y: s } = i, { top: r, left: n, bottom: o, right: e } = this.src;
90
+ switch (this.direction) {
91
+ case "left":
92
+ return { top: r, bottom: o, left: t, right: n - 1 };
93
+ case "right":
94
+ return { top: r, bottom: o, left: e + 1, right: t };
95
+ case "up":
96
+ return { left: n, right: e, top: s, bottom: r - 1 };
97
+ case "down":
98
+ return { left: n, right: e, top: o + 1, bottom: s };
99
+ }
100
+ return this.src;
101
+ }
102
+ suggestDirection(i) {
103
+ const { top: t, left: s, bottom: r, right: n } = this.src;
104
+ let o = 0, e = 0;
105
+ return i.x < s ? o = i.x - s : i.x > n && (o = i.x - n), i.y < t ? e = i.y - t : i.y > r && (e = i.y - r), Math.abs(o) > 0 && Math.abs(e) > 0 ? Math.abs(o) > Math.abs(e) ? o < 0 ? "left" : "right" : e < 0 ? "up" : "down" : o !== 0 ? o < 0 ? "left" : "right" : e !== 0 ? e < 0 ? "up" : "down" : "none";
106
+ }
107
+ getChangePatterns(i, t) {
108
+ const s = [], r = Z(i), [n, o] = M[this.direction];
109
+ return r.forEach((e) => {
110
+ const h = o > 0 ? e.last : e.first;
111
+ switch (e.kind) {
112
+ case "other": {
113
+ s.push(w(e.first));
114
+ return;
115
+ }
116
+ case "formula": {
117
+ const d = e.first, u = this.sheet;
118
+ function* l() {
119
+ let c = 0;
120
+ const x = i.length * o;
121
+ for (; ; )
122
+ c += x, yield u.processFormula(d, {
123
+ dependency: t,
124
+ slideY: n === "vertical" ? c : 0,
125
+ slideX: n === "horizontal" ? c : 0
126
+ });
127
+ }
128
+ s.push(l());
129
+ return;
130
+ }
131
+ case "number": {
132
+ if (!e.equidistant) {
133
+ s.push(w(e.first), ...e.nexts.map((l) => w(l)));
134
+ return;
135
+ }
136
+ function* d() {
137
+ let l = h;
138
+ const c = e.numericDelta * o;
139
+ for (; ; )
140
+ l += c, yield l;
141
+ }
142
+ const u = d();
143
+ s.push(u, ...e.nexts.map(() => u));
144
+ return;
145
+ }
146
+ case "date": {
147
+ const d = (c) => o > 0 ? e.time.add(c) : e.time.sub(c);
148
+ if (!e.equidistant) {
149
+ s.push(w(e.first), ...e.nexts.map((c) => w(c)));
150
+ return;
151
+ }
152
+ function* u() {
153
+ let c = h;
154
+ for (; ; )
155
+ c = d(c), yield new Date(c);
156
+ }
157
+ const l = u();
158
+ s.push(l, ...e.nexts.map(() => l));
159
+ return;
160
+ }
161
+ case "string+number": {
162
+ if (!e.equidistant) {
163
+ s.push(w(e.first), ...e.nexts.map((l) => w(l)));
164
+ return;
165
+ }
166
+ function* d() {
167
+ const { prefix: l } = g(e.first), { number: c } = g(h);
168
+ let x = c;
169
+ const a = e.numericDelta * o;
170
+ for (; ; )
171
+ x += a, yield `${l}${Math.abs(x)}`;
172
+ }
173
+ const u = d();
174
+ s.push(u, ...e.nexts.map(() => u));
175
+ return;
176
+ }
177
+ }
178
+ }), s;
179
+ }
180
+ }
181
+ function* w(p) {
182
+ for (; ; )
183
+ yield p;
184
+ }
185
+ const N = new RegExp("(.+?)(\\d+)$"), g = (p) => {
186
+ const i = p.match(N);
187
+ if (i) {
188
+ const [, t, s] = i;
189
+ return { prefix: t, number: Number(s) };
190
+ }
191
+ return { prefix: "", number: 0 };
192
+ };
193
+ class D {
194
+ constructor(i) {
195
+ this.time = E.create(), this.numericDelta = 0, this.equidistant = !0, this.first = i, this.nexts = [], this.kind = this.discriminate(i);
196
+ }
197
+ discriminate(i) {
198
+ const t = i instanceof Date ? "date" : typeof i;
199
+ return t === "number" || t === "date" ? t : t === "string" && i[0] === "=" ? "formula" : t === "string" && i.match(N) ? "string+number" : "other";
200
+ }
201
+ get last() {
202
+ return this.nexts.length === 0 ? this.first : this.nexts[this.nexts.length - 1];
203
+ }
204
+ add(i) {
205
+ const t = this.discriminate(i);
206
+ if (this.kind !== t || t === "other" || t === "formula")
207
+ return new D(i);
208
+ if (this.nexts.length === 0)
209
+ switch (t) {
210
+ case "date": {
211
+ this.time = E.fromDates(i, this.first);
212
+ break;
213
+ }
214
+ case "number": {
215
+ this.numericDelta = i - this.first;
216
+ break;
217
+ }
218
+ case "string+number": {
219
+ const { prefix: s, number: r } = g(this.first), { prefix: n, number: o } = g(i);
220
+ s === n && (this.numericDelta = o - r);
221
+ break;
222
+ }
223
+ }
224
+ this.nexts.push(i);
225
+ }
226
+ subdivide() {
227
+ if (this.nexts.length === 0)
228
+ return [];
229
+ const i = [];
230
+ let t = this;
231
+ switch (this.kind) {
232
+ case "date": {
233
+ const s = this.nexts.every((r, n) => n === 0 || I(r).isSame(this.time.add(this.nexts[n - 1])));
234
+ return this.equidistant = s, [];
235
+ }
236
+ case "number": {
237
+ const s = this.nexts.every((r, n) => n === 0 || r === this.first + this.numericDelta * (n + 1));
238
+ return this.equidistant = s, [];
239
+ }
240
+ case "string+number": {
241
+ const { prefix: s } = g(this.first);
242
+ for (let r = 0; r < t.nexts.length; r++) {
243
+ const n = t.nexts[r], { prefix: o, number: e } = g(n);
244
+ if (s !== o) {
245
+ const h = this.nexts.splice(r, this.nexts.length);
246
+ t = new D(h.splice(0, 1)[0]), h.forEach(t.add.bind(t)), i.push(t, ...t.subdivide());
247
+ break;
248
+ } else {
249
+ const { number: h } = g(t.first);
250
+ e !== h + (r + 1) * t.numericDelta && (t.equidistant = !1);
251
+ }
252
+ }
253
+ break;
254
+ }
255
+ }
256
+ return i;
257
+ }
258
+ }
259
+ function Z(p) {
260
+ var s, r;
261
+ let i = new D((s = p[0]) == null ? void 0 : s.value);
262
+ const t = [i];
263
+ for (let n = 1; n < p.length; n++) {
264
+ const o = (r = p[n]) == null ? void 0 : r.value, e = i.add(o);
265
+ e && (t.push(e), i = e);
266
+ }
267
+ for (let n = t.length - 1; n >= 0; n--) {
268
+ const o = t[n];
269
+ t.splice(n + 1, 0, ...o.subdivide());
270
+ }
271
+ return t;
272
+ }
273
+ export {
274
+ U as Autofill
275
+ };
276
+ //# sourceMappingURL=autofill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autofill.js","sources":["../../src/lib/autofill.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport type { AreaType, CellsByAddressType, CellType, CSSPropertiesLike, PointType, RefLike, ZoneType } from '../types';\nimport { Sheet } from './sheet';\nimport { areaShape, areaToZone, complementSelectingArea, concatAreas, zoneToArea, createMatrix } from './spatial';\nimport { p2a } from './coords';\nimport { Time } from './time';\n\ntype AutofillStore = {\n sheetReactive: RefLike<Sheet>;\n choosing: PointType;\n selectingZone: ZoneType;\n};\n\nconst BORDER_AUTOFILL_DRAGGING = 'dashed 1px #888888';\n\ntype Direction = 'left' | 'right' | 'up' | 'down' | 'none';\ntype Orientation = 'horizontal' | 'vertical' | 'none';\nconst DirectionMapping: {\n [key: string]: [Orientation, number];\n} = {\n left: ['horizontal', -1],\n right: ['horizontal', 1],\n up: ['vertical', -1],\n down: ['vertical', 1],\n none: ['none', 0],\n};\n\nexport class Autofill {\n private readonly src: AreaType;\n private readonly dst: AreaType;\n private readonly direction: Direction;\n private readonly sheet: Sheet;\n constructor(store: AutofillStore, draggingTo: PointType) {\n const { sheetReactive: sheetRef, choosing, selectingZone } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n throw new Error('Sheet is not available');\n }\n this.src = complementSelectingArea(zoneToArea(selectingZone), choosing);\n this.direction = this.suggestDirection(draggingTo);\n this.dst = this.getDestinationArea(draggingTo);\n this.sheet = sheet;\n }\n\n public get applied(): Sheet {\n const [orientation, sign] = DirectionMapping[this.direction];\n const { top: sTop, left: sLeft, bottom: sBottom, right: sRight } = this.src;\n const matrix = createMatrix(sBottom - sTop + 1, sRight - sLeft + 1) as (CellType | null)[][];\n for (let y = sTop; y <= sBottom; y++) {\n for (let x = sLeft; x <= sRight; x++) {\n matrix[y - sTop][x - sLeft] = this.sheet.getCell({ y, x }, { resolution: 'SYSTEM' }) ?? null;\n }\n }\n const srcShape = areaShape(this.src);\n const dstShape = areaShape(this.dst);\n\n const diff: CellsByAddressType = {};\n if (orientation === 'horizontal') {\n for (let i = 0; i < dstShape.rows; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(matrix[i], '');\n for (let j = 0; j < dstShape.cols; j++) {\n const baseCell = matrix[i % srcShape.rows]?.[j % srcShape.cols];\n const x = sign > 0 ? this.dst.left + j : this.dst.right - j;\n const px = sign > 0 ? j % srcShape.cols : (srcShape.cols - 1 - (j % srcShape.cols)) % srcShape.cols;\n const point = { y: this.dst.top + i, x };\n const id = this.sheet.getId(point);\n const value = patterns[px].next().value;\n const nextValue =\n (baseCell?.formulaEnabled ?? true)\n ? this.sheet.processFormula(value, {\n dependency: id,\n })\n : value;\n diff[p2a(point)] = {\n ...baseCell,\n value: nextValue,\n };\n }\n }\n } else if (orientation === 'vertical') {\n for (let i = 0; i < dstShape.cols; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(\n matrix.map((row) => row[i]),\n '',\n );\n for (let j = 0; j < dstShape.rows; j++) {\n const baseCell = matrix[j % srcShape.rows]?.[i % srcShape.cols];\n const y = sign > 0 ? this.dst.top + j : this.dst.bottom - j;\n const py = sign > 0 ? j % srcShape.rows : (srcShape.rows - 1 - (j % srcShape.rows)) % srcShape.rows;\n const value = patterns[py].next().value;\n diff[p2a({ y, x: this.dst.left + i })] = { ...baseCell, value };\n }\n }\n }\n const sheet = this.sheet.update({\n diff,\n operator: 'USER',\n undoReflection: {\n sheetId: this.sheet.id,\n selectingZone: areaToZone(this.src),\n },\n redoReflection: {\n sheetId: this.sheet.id,\n selectingZone: areaToZone(this.dst),\n },\n });\n return sheet;\n }\n\n public get wholeArea() {\n return concatAreas(this.src, this.dst);\n }\n\n public getCellStyle(target: PointType) {\n const { x, y } = target;\n const style: CSSPropertiesLike = {};\n const { top, left, bottom, right } = this.src;\n\n switch (this.direction) {\n case 'left': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.left === x && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'right': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.right === x - 1 && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n\n case 'up': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.top === y && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'down': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.bottom === y - 1 && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n }\n return style;\n }\n\n private getDestinationArea(autofillDraggingTo: PointType): AreaType {\n const { x, y } = autofillDraggingTo;\n const { top, left, bottom, right } = this.src;\n switch (this.direction) {\n case 'left':\n return { top, bottom, left: x, right: left - 1 };\n case 'right':\n return { top, bottom, left: right + 1, right: x };\n case 'up':\n return { left, right, top: y, bottom: top - 1 };\n case 'down':\n return { left, right, top: bottom + 1, bottom: y };\n }\n return this.src;\n }\n\n private suggestDirection(draggingTo: PointType): Direction {\n const { top, left, bottom, right } = this.src;\n let horizontal = 0,\n vertical = 0;\n if (draggingTo.x < left) {\n horizontal = draggingTo.x - left;\n } else if (draggingTo.x > right) {\n horizontal = draggingTo.x - right;\n }\n if (draggingTo.y < top) {\n vertical = draggingTo.y - top;\n } else if (draggingTo.y > bottom) {\n vertical = draggingTo.y - bottom;\n }\n // diagonal\n if (Math.abs(horizontal) > 0 && Math.abs(vertical) > 0) {\n if (Math.abs(horizontal) > Math.abs(vertical)) {\n return horizontal < 0 ? 'left' : 'right';\n }\n return vertical < 0 ? 'up' : 'down';\n }\n if (horizontal !== 0) {\n return horizontal < 0 ? 'left' : 'right';\n }\n if (vertical !== 0) {\n return vertical < 0 ? 'up' : 'down';\n }\n return 'none';\n }\n\n private getChangePatterns(cells: (CellType | null)[], id: string): Generator[] {\n const result: Generator[] = [];\n const groups = groupByType(cells);\n const [orientation, sign] = DirectionMapping[this.direction];\n groups.forEach((group) => {\n const lastValue = sign > 0 ? group.last : group.first;\n switch (group.kind) {\n case 'other': {\n result.push(pass(group.first));\n return;\n }\n case 'formula': {\n const value = group.first;\n const sheet = this.sheet;\n\n function* generateFormula() {\n let slide = 0;\n const skip = cells.length * sign;\n while (true) {\n slide += skip;\n yield sheet.processFormula(value, {\n dependency: id,\n slideY: orientation === 'vertical' ? slide : 0,\n slideX: orientation === 'horizontal' ? slide : 0,\n });\n }\n }\n result.push(generateFormula());\n return;\n }\n case 'number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateNumber() {\n let value = lastValue;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield value;\n }\n }\n const g = generateNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'date': {\n const next = (d: Date) => {\n return sign > 0 ? group.time.add(d) : group.time.sub(d);\n };\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateDate() {\n let value = lastValue as Date;\n while (true) {\n value = next(value);\n yield new Date(value);\n }\n }\n const g = generateDate();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'string+number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateStringNumber() {\n const { prefix } = extractStringNumber(group.first as string);\n const { number: lastNumber } = extractStringNumber(lastValue as string);\n let value = lastNumber;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield `${prefix}${Math.abs(value)}`;\n }\n }\n const g = generateStringNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n }\n });\n return result;\n }\n}\n\nfunction* pass(value: any) {\n while (true) {\n yield value;\n }\n}\n\ntype GroupKind = 'number' | 'date' | 'string+number' | 'formula' | 'other';\n\nconst StringNumberPattern = new RegExp('(.+?)(\\\\d+)$');\n\nconst extractStringNumber = (value: string) => {\n const match = value.match(StringNumberPattern);\n if (match) {\n const [, prefix, n] = match;\n return { prefix, number: Number(n) };\n }\n return { prefix: '', number: 0 };\n};\n\nclass TypedGroup {\n public time: Time = Time.create();\n public numericDelta: number = 0;\n public kind: GroupKind;\n public nexts: any[];\n public first: any;\n public equidistant = true;\n\n constructor(value: any) {\n this.first = value;\n this.nexts = [];\n this.kind = this.discriminate(value);\n }\n private discriminate(value: any): GroupKind {\n const kind = value instanceof Date ? 'date' : typeof value;\n if (kind === 'number' || kind === 'date') {\n return kind;\n }\n if (kind === 'string' && value[0] === '=') {\n return 'formula';\n } else if (kind === 'string' && value.match(StringNumberPattern)) {\n return 'string+number';\n }\n return 'other';\n }\n\n public get last() {\n if (this.nexts.length === 0) {\n return this.first;\n }\n return this.nexts[this.nexts.length - 1];\n }\n\n public add(value: any): TypedGroup | undefined {\n const kind = this.discriminate(value);\n if (this.kind !== kind || kind === 'other' || kind === 'formula') {\n return new TypedGroup(value);\n }\n if (this.nexts.length === 0) {\n switch (kind) {\n case 'date': {\n this.time = Time.fromDates(value as Date, this.first as Date);\n break;\n }\n case 'number': {\n this.numericDelta = (value as number) - this.first;\n break;\n }\n case 'string+number': {\n const { prefix: prefix1, number: number1 } = extractStringNumber(this.first as string);\n const { prefix: prefix2, number: number2 } = extractStringNumber(value as string);\n if (prefix1 === prefix2) {\n this.numericDelta = number2 - number1;\n }\n break;\n }\n }\n }\n this.nexts.push(value);\n }\n\n public subdivide() {\n if (this.nexts.length === 0) {\n return [];\n }\n\n const news: TypedGroup[] = [];\n\n let lastGroup: TypedGroup = this;\n switch (this.kind) {\n case 'date': {\n const eq = this.nexts.every((v, i) => i === 0 || dayjs(v).isSame(this.time.add(this.nexts[i - 1])));\n this.equidistant = eq;\n return [];\n }\n case 'number': {\n const eq = this.nexts.every((v, i) => i === 0 || v === this.first + this.numericDelta * (i + 1));\n this.equidistant = eq;\n return [];\n }\n case 'string+number': {\n const { prefix: basePrefix } = extractStringNumber(this.first as string);\n for (let i = 0; i < lastGroup.nexts.length; i++) {\n const next = lastGroup.nexts[i];\n const { prefix, number } = extractStringNumber(next as string);\n if (basePrefix !== prefix) {\n const nexts = this.nexts.splice(i, this.nexts.length);\n lastGroup = new TypedGroup(nexts.splice(0, 1)[0]);\n nexts.forEach(lastGroup.add.bind(lastGroup));\n news.push(lastGroup, ...lastGroup.subdivide());\n break;\n } else {\n const { number: firstNumber } = extractStringNumber(lastGroup.first as string);\n if (number !== firstNumber + (i + 1) * lastGroup.numericDelta) {\n lastGroup.equidistant = false;\n }\n }\n }\n break;\n }\n }\n\n return news;\n }\n}\n\nfunction groupByType(cells: (CellType | null)[]): TypedGroup[] {\n let group = new TypedGroup(cells[0]?.value);\n const groups: TypedGroup[] = [group];\n\n for (let i = 1; i < cells.length; i++) {\n const value = cells[i]?.value;\n const nextGroup = group.add(value);\n if (nextGroup) {\n groups.push(nextGroup);\n group = nextGroup;\n }\n }\n for (let i = groups.length - 1; i >= 0; i--) {\n const group = groups[i];\n groups.splice(i + 1, 0, ...group.subdivide());\n }\n return groups;\n}\n"],"names":["BORDER_AUTOFILL_DRAGGING","DirectionMapping","Autofill","store","draggingTo","sheetRef","choosing","selectingZone","sheet","complementSelectingArea","zoneToArea","orientation","sign","sTop","sLeft","sBottom","sRight","matrix","createMatrix","y","x","srcShape","areaShape","dstShape","diff","i","patterns","j","baseCell","_a","px","point","id","value","nextValue","p2a","row","_b","py","areaToZone","concatAreas","target","style","top","left","bottom","right","autofillDraggingTo","horizontal","vertical","cells","result","groups","groupByType","group","lastValue","pass","generateFormula","slide","skip","v","generateNumber","g","next","d","generateDate","generateStringNumber","prefix","extractStringNumber","lastNumber","StringNumberPattern","match","n","TypedGroup","Time","kind","prefix1","number1","prefix2","number2","news","lastGroup","eq","dayjs","basePrefix","number","nexts","firstNumber","nextGroup"],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import { Pending } from '../sentinels';
2
+ import { HistoryType, RefPaletteType, SheetIdsByName, ContextsBySheetId, ZoneType, CellsByIdType, SystemsByIdType, Id, FeedbackType, EditorEvent, CursorStateType } from '../types';
3
+ import { UserSheet, Sheet } from './sheet';
4
+ import { FunctionMapping } from '../formula/functions/__base';
5
+ import { PolicyType } from '../policy/core';
6
+ export type RegistryProps = {
7
+ historyLimit?: number;
8
+ additionalFunctions?: FunctionMapping;
9
+ policies?: {
10
+ [policyName: string]: PolicyType | null;
11
+ };
12
+ onSave?: FeedbackType;
13
+ onChange?: FeedbackType;
14
+ onRemoveRows?: (args: {
15
+ sheet: UserSheet;
16
+ ys: number[];
17
+ }) => void;
18
+ onRemoveCols?: (args: {
19
+ sheet: UserSheet;
20
+ xs: number[];
21
+ }) => void;
22
+ onInsertRows?: (args: {
23
+ sheet: UserSheet;
24
+ y: number;
25
+ numRows: number;
26
+ }) => void;
27
+ onInsertCols?: (args: {
28
+ sheet: UserSheet;
29
+ x: number;
30
+ numCols: number;
31
+ }) => void;
32
+ onSelect?: FeedbackType;
33
+ onKeyUp?: (args: {
34
+ e: EditorEvent;
35
+ points: CursorStateType;
36
+ }) => void;
37
+ onInit?: (args: {
38
+ sheet: UserSheet;
39
+ }) => void;
40
+ };
41
+ export type BookProps = RegistryProps;
42
+ export declare class Registry {
43
+ sheetHead: number;
44
+ cellHead: number;
45
+ data: CellsByIdType;
46
+ systems: SystemsByIdType;
47
+ sheetIdsByName: SheetIdsByName;
48
+ contextsBySheetId: ContextsBySheetId;
49
+ choosingSheetId: number;
50
+ choosingAddress: string;
51
+ editingSheetId: number;
52
+ editingAddress: string;
53
+ paletteBySheetName: {
54
+ [sheetName: string]: RefPaletteType;
55
+ };
56
+ lastFocused: HTMLTextAreaElement | null;
57
+ solvedCaches: Map<Id, any>;
58
+ /** IDs of non-origin cells that received spilled values (populated in spill(), cleared in clearSolvedCaches()). */
59
+ lastSpilledTargetIds: Set<Id>;
60
+ /** Currently in-flight async formula Pending sentinels (keyed by cell ID). */
61
+ asyncPending: Map<string, Pending>;
62
+ /** In-flight async formulas shared by cache key (for useInflight). */
63
+ asyncInflight?: Map<string, {
64
+ pending: Pending;
65
+ expireTime?: number;
66
+ }>;
67
+ copyingSheetId: number;
68
+ copyingZone: ZoneType;
69
+ cutting: boolean;
70
+ histories: HistoryType[];
71
+ historyIndex: number;
72
+ historyLimit: number;
73
+ lastHistory?: HistoryType;
74
+ currentHistory?: HistoryType;
75
+ /** StrictMode guard: Map from action object (identity) to cached reducer result.
76
+ * Using a Map instead of a single slot allows multiple batched dispatches to coexist. */
77
+ _strictModeCache?: Map<unknown, unknown>;
78
+ /** StrictMode guard: Map from useId component key to assigned sheetId.
79
+ * Prevents double-increment of sheetHead when useState initializer runs twice in Strict Mode. */
80
+ _componentSheetIds: Map<string, number>;
81
+ ready: boolean;
82
+ functions: FunctionMapping;
83
+ policies: {
84
+ [policyName: string]: PolicyType | null;
85
+ };
86
+ onSave?: FeedbackType;
87
+ onChange?: FeedbackType;
88
+ onRemoveRows?: (args: {
89
+ sheet: UserSheet;
90
+ ys: number[];
91
+ }) => void;
92
+ onRemoveCols?: (args: {
93
+ sheet: UserSheet;
94
+ xs: number[];
95
+ }) => void;
96
+ onInsertRows?: (args: {
97
+ sheet: UserSheet;
98
+ y: number;
99
+ numRows: number;
100
+ }) => void;
101
+ onInsertCols?: (args: {
102
+ sheet: UserSheet;
103
+ x: number;
104
+ numCols: number;
105
+ }) => void;
106
+ onSelect?: FeedbackType;
107
+ onKeyUp?: (args: {
108
+ e: EditorEvent;
109
+ points: CursorStateType;
110
+ }) => void;
111
+ onInit?: (args: {
112
+ sheet: UserSheet;
113
+ }) => void;
114
+ transmit: (newBook?: TransmitProps) => void;
115
+ /** Injected by react-core / preact-core to create a store action for sheet updates. */
116
+ updateSheet: (sheet: Sheet) => {
117
+ type: number;
118
+ value: any;
119
+ };
120
+ boot(): void;
121
+ constructor({ historyLimit, additionalFunctions, policies, onSave, onChange, onRemoveRows, onRemoveCols, onInsertRows, onInsertCols, onSelect, onKeyUp, onInit, }?: RegistryProps);
122
+ }
123
+ export type TransmitProps = Partial<Registry>;
124
+ export declare const createRegistry: (props?: RegistryProps) => Registry;
125
+ /** @deprecated use createRegistry */
126
+ export declare const createBinding: (props?: RegistryProps) => Registry;
127
+ export type BookType = {
128
+ registry: Registry;
129
+ };
130
+ export declare const createBook: (props?: RegistryProps) => BookType;
131
+ //# sourceMappingURL=book.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"book.d.ts","sourceRoot":"","sources":["../../src/lib/book.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,eAAe,EAEf,EAAE,EAEF,YAAY,EACZ,WAAW,EACX,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,EAAE;QAAE,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;KAAE,CAAC;IACvD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAClE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAClE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChF,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,KAAK,IAAI,CAAC;IACtE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAA;KAAE,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,aAAa,CAAC;AAEtC,qBAAa,QAAQ;IACnB,SAAS,EAAE,MAAM,CAAK;IACtB,QAAQ,EAAE,MAAM,CAAK;IACrB,IAAI,EAAE,aAAa,CAAM;IACzB,OAAO,EAAE,eAAe,CAAM;IAC9B,cAAc,EAAE,cAAc,CAAM;IACpC,iBAAiB,EAAE,iBAAiB,CAAM;IAC1C,eAAe,EAAE,MAAM,CAAK;IAC5B,eAAe,EAAE,MAAM,CAAM;IAC7B,cAAc,EAAE,MAAM,CAAK;IAC3B,cAAc,EAAE,MAAM,CAAM;IAC5B,kBAAkB,EAAE;QAAE,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAA;KAAE,CAAM;IACjE,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAAQ;IAC/C,YAAY,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAa;IACvC,mHAAmH;IACnH,oBAAoB,EAAE,GAAG,CAAC,EAAE,CAAC,CAAa;IAC1C,8EAA8E;IAC9E,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAa;IAC/C,sEAAsE;IACtE,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,cAAc,EAAE,MAAM,CAAK;IAC3B,WAAW,EAAE,QAAQ,CAAc;IACnC,OAAO,EAAE,OAAO,CAAS;IACzB,SAAS,EAAE,WAAW,EAAE,CAAM;IAC9B,YAAY,EAAE,MAAM,CAAM;IAC1B,YAAY,EAAE,MAAM,CAAyB;IAC7C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B;6FACyF;IACzF,gBAAgB,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC;qGACiG;IACjG,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IACpD,KAAK,UAAS;IACd,SAAS,EAAE,eAAe,CAAM;IAChC,QAAQ,EAAE;QAAE,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;KAAE,CAAM;IAC3D,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAClE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAClE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChF,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,CAAC,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,KAAK,IAAI,CAAC;IACtE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAA;KAAE,KAAK,IAAI,CAAC;IAE9C,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,aAAa,KAAK,IAAI,CAEzC;IAEF,uFAAuF;IACvF,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAA0C;IAE9F,IAAI;gBA2BC,EACV,YAAY,EACZ,mBAAmB,EACnB,QAAa,EACb,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,MAAM,GACP,GAAE,aAAkB;CAuBtB;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE9C,eAAO,MAAM,cAAc,GAAI,QAAO,aAAkB,aAEvD,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,aAAa,WALY,aAAa,aAKR,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAO,aAAkB,KAAG,QAEtD,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { RESET_ZONE as I, DEFAULT_HISTORY_LIMIT as g } from "../constants.js";
2
+ import { functions as S } from "../formula/mapping.js";
3
+ class m {
4
+ constructor({
5
+ historyLimit: i,
6
+ additionalFunctions: n,
7
+ policies: t = {},
8
+ onSave: h,
9
+ onChange: s,
10
+ onRemoveRows: e,
11
+ onRemoveCols: a,
12
+ onInsertRows: d,
13
+ onInsertCols: l,
14
+ onSelect: u,
15
+ onKeyUp: y,
16
+ onInit: p
17
+ } = {}) {
18
+ this.sheetHead = 0, this.cellHead = 0, this.data = {}, this.systems = {}, this.sheetIdsByName = {}, this.contextsBySheetId = {}, this.choosingSheetId = 0, this.choosingAddress = "", this.editingSheetId = 0, this.editingAddress = "", this.paletteBySheetName = {}, this.lastFocused = null, this.solvedCaches = /* @__PURE__ */ new Map(), this.lastSpilledTargetIds = /* @__PURE__ */ new Set(), this.asyncPending = /* @__PURE__ */ new Map(), this.copyingSheetId = 0, this.copyingZone = I, this.cutting = !1, this.histories = [], this.historyIndex = -1, this.historyLimit = g, this._componentSheetIds = /* @__PURE__ */ new Map(), this.ready = !1, this.functions = {}, this.policies = {}, this.transmit = (o) => {
19
+ }, this.updateSheet = (o) => ({ type: 0, value: o }), i != null && (this.historyLimit = i), this.functions = {
20
+ ...S,
21
+ ...n
22
+ };
23
+ for (const o in this.functions) {
24
+ const f = this.functions[o];
25
+ f.__name = o;
26
+ }
27
+ this.policies = t, this.onSave = h, this.onChange = s, this.onRemoveRows = e, this.onRemoveCols = a, this.onInsertRows = d, this.onInsertCols = l, this.onSelect = u, this.onKeyUp = y, this.onInit = p;
28
+ }
29
+ boot() {
30
+ if (this.ready || Object.keys(this.contextsBySheetId).length === 0)
31
+ return;
32
+ const i = Object.keys(this.contextsBySheetId), n = [];
33
+ for (let t = 0; t < i.length; t++) {
34
+ const h = i[t], s = this.contextsBySheetId[h], e = s.store.sheetReactive.current;
35
+ if (!e || e.status === 0)
36
+ return;
37
+ n.push(s);
38
+ }
39
+ for (let t = 0; t < n.length; t++) {
40
+ const { store: h, dispatch: s } = n[t], e = h.sheetReactive.current;
41
+ e && (e.resolveFormulas(), s(this.updateSheet(e)));
42
+ }
43
+ this.ready = !0;
44
+ }
45
+ }
46
+ const r = (c = {}) => new m(c), v = r, w = (c = {}) => ({ registry: r(c) });
47
+ export {
48
+ m as Registry,
49
+ v as createBinding,
50
+ w as createBook,
51
+ r as createRegistry
52
+ };
53
+ //# sourceMappingURL=book.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"book.js","sources":["../../src/lib/book.ts"],"sourcesContent":["import { DEFAULT_HISTORY_LIMIT, RESET_ZONE } from '../constants';\nimport { Pending } from '../sentinels';\n\nimport type {\n HistoryType,\n RefPaletteType,\n SheetIdsByName,\n ContextsBySheetId,\n ZoneType,\n CellsByIdType,\n SystemsByIdType,\n System,\n Id,\n StoreDispatchType,\n FeedbackType,\n EditorEvent,\n CursorStateType,\n} from '../types';\nimport type { UserSheet, Sheet } from './sheet';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport { functions as functionsDefault } from '../formula/mapping';\nimport { PolicyType } from '../policy/core';\n\nexport type RegistryProps = {\n historyLimit?: number;\n additionalFunctions?: FunctionMapping;\n policies?: { [policyName: string]: PolicyType | null };\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n};\n\nexport type BookProps = RegistryProps;\n\nexport class Registry {\n sheetHead: number = 0;\n cellHead: number = 0;\n data: CellsByIdType = {};\n systems: SystemsByIdType = {};\n sheetIdsByName: SheetIdsByName = {};\n contextsBySheetId: ContextsBySheetId = {};\n choosingSheetId: number = 0;\n choosingAddress: string = '';\n editingSheetId: number = 0;\n editingAddress: string = '';\n paletteBySheetName: { [sheetName: string]: RefPaletteType } = {};\n lastFocused: HTMLTextAreaElement | null = null;\n solvedCaches: Map<Id, any> = new Map();\n /** IDs of non-origin cells that received spilled values (populated in spill(), cleared in clearSolvedCaches()). */\n lastSpilledTargetIds: Set<Id> = new Set();\n /** Currently in-flight async formula Pending sentinels (keyed by cell ID). */\n asyncPending: Map<string, Pending> = new Map();\n /** In-flight async formulas shared by cache key (for useInflight). */\n asyncInflight?: Map<string, { pending: Pending; expireTime?: number }>;\n copyingSheetId: number = 0;\n copyingZone: ZoneType = RESET_ZONE;\n cutting: boolean = false;\n histories: HistoryType[] = [];\n historyIndex: number = -1;\n historyLimit: number = DEFAULT_HISTORY_LIMIT;\n lastHistory?: HistoryType;\n currentHistory?: HistoryType;\n /** StrictMode guard: Map from action object (identity) to cached reducer result.\n * Using a Map instead of a single slot allows multiple batched dispatches to coexist. */\n _strictModeCache?: Map<unknown, unknown>;\n /** StrictMode guard: Map from useId component key to assigned sheetId.\n * Prevents double-increment of sheetHead when useState initializer runs twice in Strict Mode. */\n _componentSheetIds: Map<string, number> = new Map();\n ready = false;\n functions: FunctionMapping = {};\n policies: { [policyName: string]: PolicyType | null } = {};\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n\n transmit: (newBook?: TransmitProps) => void = (newBook?: TransmitProps) => {\n // This method will be overridden by useBook\n };\n\n /** Injected by react-core / preact-core to create a store action for sheet updates. */\n updateSheet: (sheet: Sheet) => { type: number; value: any } = (sheet) => ({ type: 0, value: sheet });\n\n public boot() {\n if (this.ready || Object.keys(this.contextsBySheetId).length === 0) {\n return;\n }\n const keys = Object.keys(this.contextsBySheetId);\n const tobe: StoreDispatchType[] = [];\n for (let i = 0; i < keys.length; i++) {\n const sheetId = keys[i];\n const storeDispatch = this.contextsBySheetId[sheetId];\n const sheet = storeDispatch.store.sheetReactive.current;\n if (!sheet || sheet.status === 0) {\n return;\n }\n tobe.push(storeDispatch);\n }\n for (let i = 0; i < tobe.length; i++) {\n const { store, dispatch } = tobe[i];\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n continue;\n }\n sheet.resolveFormulas();\n dispatch(this.updateSheet(sheet));\n }\n this.ready = true;\n }\n\n constructor({\n historyLimit,\n additionalFunctions,\n policies = {},\n onSave,\n onChange,\n onRemoveRows,\n onRemoveCols,\n onInsertRows,\n onInsertCols,\n onSelect,\n onKeyUp,\n onInit,\n }: RegistryProps = {}) {\n if (historyLimit != null) {\n this.historyLimit = historyLimit;\n }\n this.functions = {\n ...functionsDefault,\n ...additionalFunctions,\n };\n for (const fnName in this.functions) {\n const fn = this.functions[fnName];\n fn.__name = fnName;\n }\n this.policies = policies;\n this.onSave = onSave;\n this.onChange = onChange;\n this.onRemoveRows = onRemoveRows;\n this.onRemoveCols = onRemoveCols;\n this.onInsertRows = onInsertRows;\n this.onInsertCols = onInsertCols;\n this.onSelect = onSelect;\n this.onKeyUp = onKeyUp;\n this.onInit = onInit;\n }\n}\n\nexport type TransmitProps = Partial<Registry>;\n\nexport const createRegistry = (props: RegistryProps = {}) => {\n return new Registry(props);\n};\n\n/** @deprecated use createRegistry */\nexport const createBinding = createRegistry;\n\nexport type BookType = {\n registry: Registry;\n};\n\nexport const createBook = (props: RegistryProps = {}): BookType => {\n return { registry: createRegistry(props) };\n};\n"],"names":["Registry","historyLimit","additionalFunctions","policies","onSave","onChange","onRemoveRows","onRemoveCols","onInsertRows","onInsertCols","onSelect","onKeyUp","onInit","RESET_ZONE","DEFAULT_HISTORY_LIMIT","newBook","sheet","functionsDefault","fnName","fn","keys","tobe","i","sheetId","storeDispatch","store","dispatch","createRegistry","props","createBinding","createBook"],"mappings":";;AAwCO,MAAMA,EAAS;AAAA,EAiFpB,YAAY;AAAA,IACV,cAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,UAAAC,IAAW,CAAC;AAAA,IACZ,QAAAC;AAAA,IACA,UAAAC;AAAA,IACA,cAAAC;AAAA,IACA,cAAAC;AAAA,IACA,cAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,QAAAC;AAAA,EACF,IAAmB,IAAI;AA7FH,SAAA,YAAA,GACD,KAAA,WAAA,GACnB,KAAA,OAAsB,CAAC,GACvB,KAAA,UAA2B,CAAC,GAC5B,KAAA,iBAAiC,CAAC,GAClC,KAAA,oBAAuC,CAAC,GACd,KAAA,kBAAA,GACA,KAAA,kBAAA,IACD,KAAA,iBAAA,GACA,KAAA,iBAAA,IACzB,KAAA,qBAA8D,CAAC,GACrB,KAAA,cAAA,MAC1C,KAAA,mCAAiC,IAAI,GAErC,KAAA,2CAAoC,IAAI,GAExC,KAAA,mCAAyC,IAAI,GAGpB,KAAA,iBAAA,GACD,KAAA,cAAAC,GACL,KAAA,UAAA,IACnB,KAAA,YAA2B,CAAC,GACL,KAAA,eAAA,IACA,KAAA,eAAAC,GAQvB,KAAA,yCAA8C,IAAI,GAC1C,KAAA,QAAA,IACR,KAAA,YAA6B,CAAC,GAC9B,KAAA,WAAwD,CAAC,GAWzD,KAAA,WAA8C,CAACC,MAA4B;AAAA,IAE3E,GAGA,KAAA,cAA8D,CAACC,OAAW,EAAE,MAAM,GAAG,OAAOA,MA2CtFf,KAAgB,SAClB,KAAK,eAAeA,IAEtB,KAAK,YAAY;AAAA,MACf,GAAGgB;AAAAA,MACH,GAAGf;AAAA,IACL;AACW,eAAAgB,KAAU,KAAK,WAAW;AAC7B,YAAAC,IAAK,KAAK,UAAUD,CAAM;AAChC,MAAAC,EAAG,SAASD;AAAA,IAAA;AAEd,SAAK,WAAWf,GAChB,KAAK,SAASC,GACd,KAAK,WAAWC,GAChB,KAAK,eAAeC,GACpB,KAAK,eAAeC,GACpB,KAAK,eAAeC,GACpB,KAAK,eAAeC,GACpB,KAAK,WAAWC,GAChB,KAAK,UAAUC,GACf,KAAK,SAASC;AAAA,EAAA;AAAA,EA7DT,OAAO;AACR,QAAA,KAAK,SAAS,OAAO,KAAK,KAAK,iBAAiB,EAAE,WAAW;AAC/D;AAEF,UAAMQ,IAAO,OAAO,KAAK,KAAK,iBAAiB,GACzCC,IAA4B,CAAC;AACnC,aAASC,IAAI,GAAGA,IAAIF,EAAK,QAAQE,KAAK;AAC9B,YAAAC,IAAUH,EAAKE,CAAC,GAChBE,IAAgB,KAAK,kBAAkBD,CAAO,GAC9CP,IAAQQ,EAAc,MAAM,cAAc;AAChD,UAAI,CAACR,KAASA,EAAM,WAAW;AAC7B;AAEF,MAAAK,EAAK,KAAKG,CAAa;AAAA,IAAA;AAEzB,aAASF,IAAI,GAAGA,IAAID,EAAK,QAAQC,KAAK;AACpC,YAAM,EAAE,OAAAG,GAAO,UAAAC,MAAaL,EAAKC,CAAC,GAC5BN,IAAQS,EAAM,cAAc;AAClC,MAAKT,MAGLA,EAAM,gBAAgB,GACbU,EAAA,KAAK,YAAYV,CAAK,CAAC;AAAA,IAAA;AAElC,SAAK,QAAQ;AAAA,EAAA;AAuCjB;AAIO,MAAMW,IAAiB,CAACC,IAAuB,OAC7C,IAAI5B,EAAS4B,CAAK,GAIdC,IAAgBF,GAMhBG,IAAa,CAACF,IAAuB,QACzC,EAAE,UAAUD,EAAeC,CAAK,EAAE;"}
@@ -0,0 +1,17 @@
1
+ import { AsyncCache, CellType, System } from '../types';
2
+ export declare const filterCellFields: (cell: CellType, ignoreFields: (keyof CellType)[]) => CellType;
3
+ /**
4
+ * Ensure that `registry.systems[id]` exists, initialising it with sensible
5
+ * defaults when missing. Any keys present in `defaults` that are absent on
6
+ * the existing System object are filled in.
7
+ * Returns the (possibly freshly-created) `System` object.
8
+ */
9
+ export declare const ensureSys: (registry: {
10
+ systems: Record<string, System>;
11
+ }, id: string, defaults?: Partial<System>) => System;
12
+ /**
13
+ * Write an `AsyncCache` entry into `cell.asyncCaches[key]`, creating the
14
+ * `asyncCaches` record if it does not yet exist.
15
+ */
16
+ export declare const setAsyncCache: (cell: CellType, key: string, ac: AsyncCache) => void;
17
+ //# sourceMappingURL=cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../../src/lib/cell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAE7D,eAAO,MAAM,gBAAgB,GAAI,MAAM,QAAQ,EAAE,cAAc,CAAC,MAAM,QAAQ,CAAC,EAAE,KAAG,QAOnF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAC7C,IAAI,MAAM,EACV,WAAU,OAAO,CAAC,MAAM,CAAM,KAC7B,MASF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,QAAQ,EAAE,KAAK,MAAM,EAAE,IAAI,UAAU,KAAG,IAK3E,CAAC"}
@@ -0,0 +1,17 @@
1
+ const r = (s, e) => e.length === 0 ? s : Object.fromEntries(
2
+ Object.entries(s).filter(([t]) => !e.includes(t))
3
+ ), o = (s, e, t = {}) => {
4
+ s.systems[e] == null && (s.systems[e] = {});
5
+ const n = s.systems[e];
6
+ for (const c of Object.keys(t))
7
+ n[c] ?? (n[c] = t[c]);
8
+ return n;
9
+ }, f = (s, e, t) => {
10
+ s.asyncCaches || (s.asyncCaches = {}), s.asyncCaches[e] = t;
11
+ };
12
+ export {
13
+ o as ensureSys,
14
+ r as filterCellFields,
15
+ f as setAsyncCache
16
+ };
17
+ //# sourceMappingURL=cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.js","sources":["../../src/lib/cell.ts"],"sourcesContent":["import type { AsyncCache, CellType, System } from '../types';\n\nexport const filterCellFields = (cell: CellType, ignoreFields: (keyof CellType)[]): CellType => {\n if (ignoreFields.length === 0) {\n return cell;\n }\n return Object.fromEntries(\n Object.entries(cell).filter(([key]) => !ignoreFields.includes(key as keyof CellType)),\n ) as CellType;\n};\n\n/**\n * Ensure that `registry.systems[id]` exists, initialising it with sensible\n * defaults when missing. Any keys present in `defaults` that are absent on\n * the existing System object are filled in.\n * Returns the (possibly freshly-created) `System` object.\n */\nexport const ensureSys = (\n registry: { systems: Record<string, System> },\n id: string,\n defaults: Partial<System> = {},\n): System => {\n if (registry.systems[id] == null) {\n registry.systems[id] = {};\n }\n const sys = registry.systems[id];\n for (const key of Object.keys(defaults) as (keyof System)[]) {\n (sys as any)[key] ??= defaults[key];\n }\n return sys;\n};\n\n/**\n * Write an `AsyncCache` entry into `cell.asyncCaches[key]`, creating the\n * `asyncCaches` record if it does not yet exist.\n */\nexport const setAsyncCache = (cell: CellType, key: string, ac: AsyncCache): void => {\n if (!cell.asyncCaches) {\n cell.asyncCaches = {};\n }\n cell.asyncCaches[key] = ac;\n};\n"],"names":["filterCellFields","cell","ignoreFields","key","ensureSys","registry","id","defaults","sys","setAsyncCache","ac"],"mappings":"AAEa,MAAAA,IAAmB,CAACC,GAAgBC,MAC3CA,EAAa,WAAW,IACnBD,IAEF,OAAO;AAAA,EACZ,OAAO,QAAQA,CAAI,EAAE,OAAO,CAAC,CAACE,CAAG,MAAM,CAACD,EAAa,SAASC,CAAqB,CAAC;AACtF,GASWC,IAAY,CACvBC,GACAC,GACAC,IAA4B,CAAA,MACjB;AACX,EAAIF,EAAS,QAAQC,CAAE,KAAK,SACjBD,EAAA,QAAQC,CAAE,IAAI,CAAC;AAEpB,QAAAE,IAAMH,EAAS,QAAQC,CAAE;AAC/B,aAAWH,KAAO,OAAO,KAAKI,CAAQ;AACnC,IAAAC,EAAAL,OAAAK,EAAAL,KAAqBI,EAASJ,CAAG;AAE7B,SAAAK;AACT,GAMaC,IAAgB,CAACR,GAAgBE,GAAaO,MAAyB;AAC9E,EAACT,EAAK,gBACRA,EAAK,cAAc,CAAC,IAEjBA,EAAA,YAAYE,CAAG,IAAIO;AAC1B;"}
@@ -0,0 +1,22 @@
1
+ import { Address, ExtraPointType } from '../types';
2
+ export declare const x2c: (x: number) => string;
3
+ export declare const c2x: (col: string, absolute?: boolean) => number;
4
+ export declare const y2r: (y: number) => string;
5
+ export declare const r2y: (row: number | string, absolute?: boolean) => number;
6
+ export declare const p2a: ({ y, x, absX, absY }: Partial<ExtraPointType>) => string;
7
+ export declare const a2p: (address: Address) => ExtraPointType;
8
+ export declare const grantAddressAbsolute: (address: Address, absCol: boolean, absRow: boolean) => string;
9
+ /**
10
+ * Returns the row header cell address for a given row number by prepending `0`.
11
+ * e.g. rh(6) → '06', rh(1) → '01'
12
+ */
13
+ export declare const rh: (y: number) => string;
14
+ /**
15
+ * Returns the column header cell address for a given column letter or column index
16
+ * (1-based, same as point.x) by appending `0`.
17
+ * e.g. ch('A') → 'A0', ch(1) → 'A0'
18
+ */
19
+ export declare const ch: (col: string | number) => string;
20
+ export declare const stripAddressAbsolute: (address: Address) => string;
21
+ export declare const buildIdentifiedRef: (id: string, absX?: boolean, absY?: boolean) => string;
22
+ //# sourceMappingURL=coords.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coords.d.ts","sourceRoot":"","sources":["../../src/lib/coords.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,cAAc,EAAE,MAAM,UAAU,CAAC;AAwDnE,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,KAAG,MAM/B,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,KAAK,MAAM,EAAE,kBAAgB,KAAG,MAGnD,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,WAK5B,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,KAAK,MAAM,GAAG,MAAM,EAAE,kBAAgB,WAKzD,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,sBAAsB,OAAO,CAAC,cAAc,CAAC,WAOhE,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,SAAS,OAAO,KAAG,cAWtC,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,EAAE,QAAQ,OAAO,EAAE,QAAQ,OAAO,WAOtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,EAAE,GAAI,GAAG,MAAM,KAAG,MAAiB,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,EAAE,GAAI,KAAK,MAAM,GAAG,MAAM,KAAG,MAC0B,CAAC;AAErE,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,WAEpD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,IAAI,MAAM,EAAE,cAAY,EAAE,cAAY,KAAG,MAE3E,CAAC"}