@gridsheet/core 3.0.0-rc.10

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 (251) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +17 -0
  3. package/dist/constants.d.ts +21 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +28 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/formula/evaluator.d.ts +134 -0
  8. package/dist/formula/evaluator.d.ts.map +1 -0
  9. package/dist/formula/evaluator.js +585 -0
  10. package/dist/formula/evaluator.js.map +1 -0
  11. package/dist/formula/formula-error.d.ts +10 -0
  12. package/dist/formula/formula-error.d.ts.map +1 -0
  13. package/dist/formula/formula-error.js +15 -0
  14. package/dist/formula/formula-error.js.map +1 -0
  15. package/dist/formula/functions/__async.d.ts +67 -0
  16. package/dist/formula/functions/__async.d.ts.map +1 -0
  17. package/dist/formula/functions/__async.js +70 -0
  18. package/dist/formula/functions/__async.js.map +1 -0
  19. package/dist/formula/functions/__base.d.ts +112 -0
  20. package/dist/formula/functions/__base.d.ts.map +1 -0
  21. package/dist/formula/functions/__base.js +265 -0
  22. package/dist/formula/functions/__base.js.map +1 -0
  23. package/dist/formula/functions/__utils.d.ts +28 -0
  24. package/dist/formula/functions/__utils.d.ts.map +1 -0
  25. package/dist/formula/functions/__utils.js +179 -0
  26. package/dist/formula/functions/__utils.js.map +1 -0
  27. package/dist/formula/functions/abs.d.ts +9 -0
  28. package/dist/formula/functions/abs.d.ts.map +1 -0
  29. package/dist/formula/functions/abs.js +15 -0
  30. package/dist/formula/functions/abs.js.map +1 -0
  31. package/dist/formula/functions/add.d.ts +10 -0
  32. package/dist/formula/functions/add.d.ts.map +1 -0
  33. package/dist/formula/functions/add.js +37 -0
  34. package/dist/formula/functions/add.js.map +1 -0
  35. package/dist/formula/functions/and.d.ts +9 -0
  36. package/dist/formula/functions/and.d.ts.map +1 -0
  37. package/dist/formula/functions/and.js +23 -0
  38. package/dist/formula/functions/and.js.map +1 -0
  39. package/dist/formula/functions/arrayformula.d.ts +12 -0
  40. package/dist/formula/functions/arrayformula.d.ts.map +1 -0
  41. package/dist/formula/functions/arrayformula.js +24 -0
  42. package/dist/formula/functions/arrayformula.js.map +1 -0
  43. package/dist/formula/functions/average.d.ts +9 -0
  44. package/dist/formula/functions/average.d.ts.map +1 -0
  45. package/dist/formula/functions/average.js +40 -0
  46. package/dist/formula/functions/average.js.map +1 -0
  47. package/dist/formula/functions/concat.d.ts +9 -0
  48. package/dist/formula/functions/concat.d.ts.map +1 -0
  49. package/dist/formula/functions/concat.js +27 -0
  50. package/dist/formula/functions/concat.js.map +1 -0
  51. package/dist/formula/functions/count.d.ts +9 -0
  52. package/dist/formula/functions/count.d.ts.map +1 -0
  53. package/dist/formula/functions/count.js +32 -0
  54. package/dist/formula/functions/count.js.map +1 -0
  55. package/dist/formula/functions/counta.d.ts +9 -0
  56. package/dist/formula/functions/counta.d.ts.map +1 -0
  57. package/dist/formula/functions/counta.js +32 -0
  58. package/dist/formula/functions/counta.js.map +1 -0
  59. package/dist/formula/functions/divide.d.ts +10 -0
  60. package/dist/formula/functions/divide.d.ts.map +1 -0
  61. package/dist/formula/functions/divide.js +34 -0
  62. package/dist/formula/functions/divide.js.map +1 -0
  63. package/dist/formula/functions/eq.d.ts +9 -0
  64. package/dist/formula/functions/eq.d.ts.map +1 -0
  65. package/dist/formula/functions/eq.js +19 -0
  66. package/dist/formula/functions/eq.js.map +1 -0
  67. package/dist/formula/functions/gt.d.ts +9 -0
  68. package/dist/formula/functions/gt.d.ts.map +1 -0
  69. package/dist/formula/functions/gt.js +19 -0
  70. package/dist/formula/functions/gt.js.map +1 -0
  71. package/dist/formula/functions/gte.d.ts +9 -0
  72. package/dist/formula/functions/gte.d.ts.map +1 -0
  73. package/dist/formula/functions/gte.js +19 -0
  74. package/dist/formula/functions/gte.js.map +1 -0
  75. package/dist/formula/functions/if.d.ts +9 -0
  76. package/dist/formula/functions/if.d.ts.map +1 -0
  77. package/dist/formula/functions/if.js +29 -0
  78. package/dist/formula/functions/if.js.map +1 -0
  79. package/dist/formula/functions/iferror.d.ts +10 -0
  80. package/dist/formula/functions/iferror.d.ts.map +1 -0
  81. package/dist/formula/functions/iferror.js +28 -0
  82. package/dist/formula/functions/iferror.js.map +1 -0
  83. package/dist/formula/functions/len.d.ts +9 -0
  84. package/dist/formula/functions/len.d.ts.map +1 -0
  85. package/dist/formula/functions/len.js +21 -0
  86. package/dist/formula/functions/len.js.map +1 -0
  87. package/dist/formula/functions/lt.d.ts +9 -0
  88. package/dist/formula/functions/lt.d.ts.map +1 -0
  89. package/dist/formula/functions/lt.js +19 -0
  90. package/dist/formula/functions/lt.js.map +1 -0
  91. package/dist/formula/functions/lte.d.ts +9 -0
  92. package/dist/formula/functions/lte.d.ts.map +1 -0
  93. package/dist/formula/functions/lte.js +19 -0
  94. package/dist/formula/functions/lte.js.map +1 -0
  95. package/dist/formula/functions/max.d.ts +9 -0
  96. package/dist/formula/functions/max.d.ts.map +1 -0
  97. package/dist/formula/functions/max.js +37 -0
  98. package/dist/formula/functions/max.js.map +1 -0
  99. package/dist/formula/functions/min.d.ts +9 -0
  100. package/dist/formula/functions/min.d.ts.map +1 -0
  101. package/dist/formula/functions/min.js +37 -0
  102. package/dist/formula/functions/min.js.map +1 -0
  103. package/dist/formula/functions/minus.d.ts +10 -0
  104. package/dist/formula/functions/minus.d.ts.map +1 -0
  105. package/dist/formula/functions/minus.js +41 -0
  106. package/dist/formula/functions/minus.js.map +1 -0
  107. package/dist/formula/functions/multiply.d.ts +9 -0
  108. package/dist/formula/functions/multiply.d.ts.map +1 -0
  109. package/dist/formula/functions/multiply.js +19 -0
  110. package/dist/formula/functions/multiply.js.map +1 -0
  111. package/dist/formula/functions/ne.d.ts +9 -0
  112. package/dist/formula/functions/ne.d.ts.map +1 -0
  113. package/dist/formula/functions/ne.js +19 -0
  114. package/dist/formula/functions/ne.js.map +1 -0
  115. package/dist/formula/functions/not.d.ts +9 -0
  116. package/dist/formula/functions/not.d.ts.map +1 -0
  117. package/dist/formula/functions/not.js +22 -0
  118. package/dist/formula/functions/not.js.map +1 -0
  119. package/dist/formula/functions/now.d.ts +9 -0
  120. package/dist/formula/functions/now.d.ts.map +1 -0
  121. package/dist/formula/functions/now.js +14 -0
  122. package/dist/formula/functions/now.js.map +1 -0
  123. package/dist/formula/functions/or.d.ts +9 -0
  124. package/dist/formula/functions/or.d.ts.map +1 -0
  125. package/dist/formula/functions/or.js +23 -0
  126. package/dist/formula/functions/or.js.map +1 -0
  127. package/dist/formula/functions/power.d.ts +9 -0
  128. package/dist/formula/functions/power.d.ts.map +1 -0
  129. package/dist/formula/functions/power.js +18 -0
  130. package/dist/formula/functions/power.js.map +1 -0
  131. package/dist/formula/functions/sum.d.ts +9 -0
  132. package/dist/formula/functions/sum.d.ts.map +1 -0
  133. package/dist/formula/functions/sum.js +34 -0
  134. package/dist/formula/functions/sum.js.map +1 -0
  135. package/dist/formula/functions/uminus.d.ts +9 -0
  136. package/dist/formula/functions/uminus.d.ts.map +1 -0
  137. package/dist/formula/functions/uminus.js +17 -0
  138. package/dist/formula/functions/uminus.js.map +1 -0
  139. package/dist/formula/mapping.d.ts +11 -0
  140. package/dist/formula/mapping.d.ts.map +1 -0
  141. package/dist/formula/mapping.js +82 -0
  142. package/dist/formula/mapping.js.map +1 -0
  143. package/dist/formula/solver.d.ts +39 -0
  144. package/dist/formula/solver.d.ts.map +1 -0
  145. package/dist/formula/solver.js +71 -0
  146. package/dist/formula/solver.js.map +1 -0
  147. package/dist/index.d.ts +32 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +132 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/lib/autofill.d.ts +22 -0
  152. package/dist/lib/autofill.d.ts.map +1 -0
  153. package/dist/lib/autofill.js +276 -0
  154. package/dist/lib/autofill.js.map +1 -0
  155. package/dist/lib/book.d.ts +131 -0
  156. package/dist/lib/book.d.ts.map +1 -0
  157. package/dist/lib/book.js +53 -0
  158. package/dist/lib/book.js.map +1 -0
  159. package/dist/lib/cell.d.ts +17 -0
  160. package/dist/lib/cell.d.ts.map +1 -0
  161. package/dist/lib/cell.js +17 -0
  162. package/dist/lib/cell.js.map +1 -0
  163. package/dist/lib/coords.d.ts +22 -0
  164. package/dist/lib/coords.d.ts.map +1 -0
  165. package/dist/lib/coords.js +73 -0
  166. package/dist/lib/coords.js.map +1 -0
  167. package/dist/lib/date.d.ts +2 -0
  168. package/dist/lib/date.d.ts.map +1 -0
  169. package/dist/lib/date.js +91 -0
  170. package/dist/lib/date.js.map +1 -0
  171. package/dist/lib/dom.d.ts +7 -0
  172. package/dist/lib/dom.d.ts.map +1 -0
  173. package/dist/lib/dom.js +28 -0
  174. package/dist/lib/dom.js.map +1 -0
  175. package/dist/lib/filter.d.ts +7 -0
  176. package/dist/lib/filter.d.ts.map +1 -0
  177. package/dist/lib/filter.js +122 -0
  178. package/dist/lib/filter.js.map +1 -0
  179. package/dist/lib/input.d.ts +28 -0
  180. package/dist/lib/input.d.ts.map +1 -0
  181. package/dist/lib/input.js +73 -0
  182. package/dist/lib/input.js.map +1 -0
  183. package/dist/lib/label.d.ts +4 -0
  184. package/dist/lib/label.d.ts.map +1 -0
  185. package/dist/lib/label.js +10 -0
  186. package/dist/lib/label.js.map +1 -0
  187. package/dist/lib/operation.d.ts +31 -0
  188. package/dist/lib/operation.d.ts.map +1 -0
  189. package/dist/lib/operation.js +36 -0
  190. package/dist/lib/operation.js.map +1 -0
  191. package/dist/lib/palette.d.ts +2 -0
  192. package/dist/lib/palette.d.ts.map +1 -0
  193. package/dist/lib/palette.js +26 -0
  194. package/dist/lib/palette.js.map +1 -0
  195. package/dist/lib/popup.d.ts +24 -0
  196. package/dist/lib/popup.d.ts.map +1 -0
  197. package/dist/lib/popup.js +21 -0
  198. package/dist/lib/popup.js.map +1 -0
  199. package/dist/lib/reference.d.ts +19 -0
  200. package/dist/lib/reference.d.ts.map +1 -0
  201. package/dist/lib/reference.js +40 -0
  202. package/dist/lib/reference.js.map +1 -0
  203. package/dist/lib/sheet.d.ts +512 -0
  204. package/dist/lib/sheet.d.ts.map +1 -0
  205. package/dist/lib/sheet.js +1530 -0
  206. package/dist/lib/sheet.js.map +1 -0
  207. package/dist/lib/sheet_utils.d.ts +55 -0
  208. package/dist/lib/sheet_utils.d.ts.map +1 -0
  209. package/dist/lib/sheet_utils.js +125 -0
  210. package/dist/lib/sheet_utils.js.map +1 -0
  211. package/dist/lib/spatial.d.ts +79 -0
  212. package/dist/lib/spatial.d.ts.map +1 -0
  213. package/dist/lib/spatial.js +227 -0
  214. package/dist/lib/spatial.js.map +1 -0
  215. package/dist/lib/time.d.ts +29 -0
  216. package/dist/lib/time.d.ts.map +1 -0
  217. package/dist/lib/time.js +113 -0
  218. package/dist/lib/time.js.map +1 -0
  219. package/dist/lib/virtualization.d.ts +22 -0
  220. package/dist/lib/virtualization.d.ts.map +1 -0
  221. package/dist/lib/virtualization.js +91 -0
  222. package/dist/lib/virtualization.js.map +1 -0
  223. package/dist/policy/core.d.ts +161 -0
  224. package/dist/policy/core.d.ts.map +1 -0
  225. package/dist/policy/core.js +248 -0
  226. package/dist/policy/core.js.map +1 -0
  227. package/dist/policy/thousand_separator.d.ts +4 -0
  228. package/dist/policy/thousand_separator.d.ts.map +1 -0
  229. package/dist/policy/thousand_separator.js +13 -0
  230. package/dist/policy/thousand_separator.js.map +1 -0
  231. package/dist/sentinels.d.ts +40 -0
  232. package/dist/sentinels.d.ts.map +1 -0
  233. package/dist/sentinels.js +41 -0
  234. package/dist/sentinels.js.map +1 -0
  235. package/dist/styles/embedder.d.ts +2 -0
  236. package/dist/styles/embedder.d.ts.map +1 -0
  237. package/dist/styles/embedder.js +11 -0
  238. package/dist/styles/embedder.js.map +1 -0
  239. package/dist/styles/minified.d.ts +3 -0
  240. package/dist/styles/minified.d.ts.map +1 -0
  241. package/dist/styles/minified.js +6 -0
  242. package/dist/styles/minified.js.map +1 -0
  243. package/dist/types.d.ts +310 -0
  244. package/dist/types.d.ts.map +1 -0
  245. package/dist/types.js +2 -0
  246. package/dist/types.js.map +1 -0
  247. package/dist/utils.d.ts +2 -0
  248. package/dist/utils.d.ts.map +1 -0
  249. package/dist/utils.js +5 -0
  250. package/dist/utils.js.map +1 -0
  251. package/package.json +58 -0
@@ -0,0 +1,265 @@
1
+ import { Spilling as g } from "../../sentinels.js";
2
+ import { FormulaError as p } from "../formula-error.js";
3
+ import { stripSheet as $ } from "../solver.js";
4
+ import { hasDeepPending as S, createPropagatedPending as A, buildAsyncCacheKey as C, getAsyncCache as I, asyncCacheMiss as P, awaitAndSave as q, hasPendingArg as D } from "./__async.js";
5
+ import { Time as E } from "../../lib/time.js";
6
+ const u = (r) => (r == null ? void 0 : r.__gsType) === "Sheet", z = {
7
+ name: "condition",
8
+ description: 'The condition to evaluate. Use "=" for equal, "<" for less than, ">" for greater than, "<=" for less than or equal, ">=" for greater than or equal, "<>" for not equal.',
9
+ acceptedTypes: ["any"]
10
+ }, N = (r, { nullable: t = !0, errorTolerant: o = !1, acceptedTypes: s }) => {
11
+ if (!s || s.length === 0)
12
+ return !0;
13
+ if (r == null)
14
+ return t;
15
+ if (p.is(r) || r instanceof Error) {
16
+ if (o)
17
+ return !0;
18
+ throw r;
19
+ }
20
+ for (const e of s)
21
+ switch (e) {
22
+ case "any":
23
+ return !0;
24
+ case "number":
25
+ if (typeof r == "number")
26
+ return !0;
27
+ break;
28
+ case "string":
29
+ if (typeof r == "string")
30
+ return !0;
31
+ break;
32
+ case "boolean":
33
+ if (typeof r == "boolean")
34
+ return !0;
35
+ break;
36
+ case "date":
37
+ if (r instanceof Date)
38
+ return !0;
39
+ break;
40
+ case "time":
41
+ if (E.is(r))
42
+ return !0;
43
+ break;
44
+ case "matrix":
45
+ if (b(r))
46
+ return !0;
47
+ break;
48
+ case "reference":
49
+ if (u(r))
50
+ return !0;
51
+ break;
52
+ }
53
+ return !1;
54
+ }, b = (r) => u(r) || g.is(r) || Array.isArray(r) && Array.isArray(r[0]), j = (r, t) => {
55
+ var e;
56
+ if (!b(r))
57
+ return r;
58
+ if (u(r))
59
+ return $({ value: r, raise: !1, at: t });
60
+ const o = g.is(r) ? r.matrix : r;
61
+ return (e = o == null ? void 0 : o[0]) == null ? void 0 : e[0];
62
+ }, T = (r) => {
63
+ if (u(r))
64
+ return !r.hasSingleCell;
65
+ if (g.is(r)) {
66
+ const t = r.matrix;
67
+ return t.length > 1 || t.length === 1 && t[0].length > 1;
68
+ }
69
+ return Array.isArray(r) && Array.isArray(r[0]) ? r.length > 1 || r[0].length > 1 : !1;
70
+ }, k = (r, t) => {
71
+ const o = [];
72
+ let s = -1, e = 0;
73
+ for (let i = 0; i < r.length; i++)
74
+ r[i].variadic && (s < 0 && (s = i), e++);
75
+ for (let i = 0; i < t; i++)
76
+ if (s >= 0 && i >= s) {
77
+ const h = (i - s) % e;
78
+ o.push(s + h);
79
+ } else i < r.length ? o.push(i) : o.push(r.length - 1);
80
+ return o;
81
+ }, w = class w {
82
+ constructor({ args: t, sheet: o, at: s }) {
83
+ this.defs = [], this.description = "", this.category = "other", this.isAsync = !1, this.hashPrecision = 1, this.useInflight = !0, this.broadcastDisabled = !1, this.autoSpilling = !1, this.eachMatrix = (e, i) => {
84
+ if (u(e)) {
85
+ const h = e.solve({ at: this.at, raise: !0 });
86
+ for (let n = 0; n < h.length; n++)
87
+ for (let c = 0; c < h[n].length; c++)
88
+ i(h[n][c]);
89
+ } else if (g.is(e)) {
90
+ const h = e.matrix;
91
+ for (let n = 0; n < h.length; n++)
92
+ for (let c = 0; c < h[n].length; c++)
93
+ i(h[n][c]);
94
+ } else if (Array.isArray(e) && Array.isArray(e[0]))
95
+ for (let h = 0; h < e.length; h++)
96
+ for (let n = 0; n < e[h].length; n++)
97
+ i(e[h][n]);
98
+ else
99
+ i(e);
100
+ }, this.args = t.map((e) => {
101
+ try {
102
+ return e.evaluate({ sheet: o });
103
+ } catch (i) {
104
+ return i;
105
+ }
106
+ }), this.sheet = o, this.at = s ?? "?";
107
+ }
108
+ _main(...t) {
109
+ return this.autoSpilling ? new g(this.main(...t)) : this.main(...t);
110
+ }
111
+ /**
112
+ * Validate and normalise arguments before `main()` is called.
113
+ *
114
+ * Checks:
115
+ * 1. Argument count satisfies defs (respecting optional / variadic).
116
+ * 2. Each argument's runtime type matches the corresponding def's `type` list.
117
+ *
118
+ * Subclasses may override for additional coercion / spreading.
119
+ */
120
+ validate(t) {
121
+ const o = [...t], s = this.defs;
122
+ if (s.length === 0) {
123
+ if (t.length !== 0)
124
+ throw new p("#N/A", "Too many arguments: expected 0, got " + t.length + ".");
125
+ return o;
126
+ }
127
+ let e = 0, i = !1;
128
+ for (const n of s)
129
+ n.variadic && (i = !0), n.optional || e++;
130
+ if (t.length < e)
131
+ throw new p("#N/A", `Too few arguments: expected at least ${e}, got ${t.length}.`);
132
+ if (!i && t.length > s.length)
133
+ throw new p("#N/A", `Too many arguments: expected at most ${s.length}, got ${t.length}.`);
134
+ const h = k(s, t.length);
135
+ for (let n = 0; n < t.length; n++) {
136
+ const c = s[h[n]];
137
+ if (!c)
138
+ continue;
139
+ let a = t[n];
140
+ if (!(!c.acceptedTypes || c.acceptedTypes.length === 0)) {
141
+ if (T(a)) {
142
+ if (!c.takesMatrix)
143
+ continue;
144
+ } else b(a) && (c.takesMatrix || (a = j(a, this.at)));
145
+ if (!N(a, c))
146
+ throw new p(
147
+ "#VALUE!",
148
+ `Argument "${c.name}" (position ${n + 1}) expected ${c.acceptedTypes.join(" | ")}, got ${typeof a}.`
149
+ );
150
+ o[n] = a;
151
+ }
152
+ }
153
+ return o;
154
+ }
155
+ /**
156
+ * Extract a 2D array from a matrix value (Spilling, Sheet, or nested array).
157
+ * Default behavior for Sheet is value.solve(). Functions like COL can override
158
+ * this to preserve Sheet metadata per cell.
159
+ */
160
+ toMatrix(t) {
161
+ return g.is(t) ? t.matrix : u(t) ? t.solve({ at: this.at }) : Array.isArray(t) && Array.isArray(t[0]) ? t : [[t]];
162
+ }
163
+ /**
164
+ * Collapse a 1×1 matrix value (Sheet, Spilling, or 2D array) to a scalar.
165
+ * Non-matrix values pass through unchanged.
166
+ *
167
+ * Override in sub-classes that need the original Sheet / reference
168
+ * metadata (e.g. COL, ROW) — for instance, to extract position
169
+ * information before collapsing.
170
+ */
171
+ toScalar(t) {
172
+ var o, s, e;
173
+ if (u(t)) {
174
+ const { rows: i, cols: h } = t.shape;
175
+ return i === 1 && h === 1 ? t.strip({}) : t;
176
+ }
177
+ return g.is(t) ? (s = (o = t.matrix) == null ? void 0 : o[0]) == null ? void 0 : s[0] : Array.isArray(t) ? Array.isArray(t[0]) ? (e = t[0]) == null ? void 0 : e[0] : t[0] : t;
178
+ }
179
+ call() {
180
+ const t = this.broadcast();
181
+ if (t !== void 0)
182
+ return t;
183
+ if (S(this.args, this.at))
184
+ return A();
185
+ if (this.args = this.validate(this.args), this.isAsync) {
186
+ const o = C(this.constructor.name, this.args, this.hashPrecision), s = I(this.sheet, this.at, o, this.useInflight);
187
+ if (s !== P)
188
+ return s;
189
+ const e = this._main(...this.args);
190
+ return q(e, this.sheet, this.at, o, this.ttlMilliseconds, this.useInflight);
191
+ }
192
+ return this._main(...this.args);
193
+ }
194
+ /**
195
+ * If any broadcastable argument is a matrix (multi-cell), expand the call
196
+ * across all element positions and return a Spilling.
197
+ * Returns `undefined` when no broadcast is necessary.
198
+ *
199
+ * Rules:
200
+ * - broadcastDisabled = true → never broadcast
201
+ * - An arg is broadcastable when its corresponding args[].takesMatrix is not true
202
+ * - A Sheet/Spilling/2D-array whose size is (1,1) is treated as a scalar
203
+ * (not broadcast); only multi-cell matrices trigger broadcast
204
+ * - For variadic args, extra args are assigned round-robin
205
+ * across the variadic helpArg positions
206
+ */
207
+ broadcast() {
208
+ if (this.broadcastDisabled)
209
+ return;
210
+ const t = k(this.defs, this.args.length), o = this.args.map((a, f) => {
211
+ var d;
212
+ const l = t[f];
213
+ return !((d = this.defs[l]) != null && d.takesMatrix);
214
+ }), s = this.args.map((a, f) => o[f] && T(a) ? this.toMatrix(a) : null);
215
+ if (s.every((a) => a === null))
216
+ return;
217
+ const e = this.args.map((a, f) => s[f] !== null ? a : this.toScalar(a));
218
+ let i = 1, h = 1;
219
+ for (const a of s)
220
+ a && (i = Math.max(i, a.length), h = Math.max(
221
+ h,
222
+ a.reduce((f, l) => Math.max(f, l.length), 0)
223
+ ));
224
+ const n = this.args, c = [];
225
+ for (let a = 0; a < i; a++) {
226
+ const f = [];
227
+ for (let l = 0; l < h; l++) {
228
+ const d = e.map((m, _) => {
229
+ var M;
230
+ const y = s[_];
231
+ return y ? ((M = y == null ? void 0 : y[a]) == null ? void 0 : M[l]) ?? null : m;
232
+ });
233
+ try {
234
+ if (D(d))
235
+ f.push(A());
236
+ else {
237
+ const m = this.validate(d);
238
+ S(m, this.at) ? f.push(A()) : f.push(this._main(...m));
239
+ }
240
+ } catch (m) {
241
+ f.push(m);
242
+ }
243
+ }
244
+ c.push(f);
245
+ }
246
+ return this.args = n, c;
247
+ }
248
+ };
249
+ w.__name = "";
250
+ let x = w;
251
+ class B extends x {
252
+ constructor() {
253
+ super(...arguments), this.isAsync = !0;
254
+ }
255
+ }
256
+ export {
257
+ x as BaseFunction,
258
+ B as BaseFunctionAsync,
259
+ z as conditionArg,
260
+ b as isMatrix,
261
+ T as isMultiCell,
262
+ u as isSheet,
263
+ j as stripMatrix
264
+ };
265
+ //# sourceMappingURL=__base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"__base.js","sources":["../../../src/formula/functions/__base.ts"],"sourcesContent":["import { type Sheet } from '../../lib/sheet';\n\n/** Duck-type check for Sheet instances (avoids runtime import cycle). */\nexport const isSheet = (v: any): v is Sheet => v?.__gsType === 'Sheet';\n/** Duck-type check for Time instances (avoids runtime import cycle). */\nconst isTime = (v: any): boolean => v != null && v.__gsType === 'Time';\nimport { Spilling } from '../../sentinels';\nimport type { Id } from '../../types';\nimport { FormulaError } from '../formula-error';\nimport { stripSheet } from '../../formula/solver';\nimport type { Expression } from '../evaluator';\nimport {\n hasPendingArg,\n hasDeepPending,\n buildAsyncCacheKey,\n awaitAndSave,\n createPropagatedPending,\n getAsyncCache,\n asyncCacheMiss,\n} from './__async';\nimport { Time } from '../../lib/time';\n\nexport type FunctionCategory =\n | 'math'\n | 'statistics'\n | 'text'\n | 'time'\n | 'lookup'\n | 'information'\n | 'finance'\n | 'engineering'\n | 'logical'\n | 'other';\n\nexport type FunctionProps = {\n args: Expression[];\n sheet: Sheet;\n at?: Id;\n};\n\nexport type FunctionArgumentType = 'number' | 'string' | 'boolean' | 'date' | 'time' | 'matrix' | 'reference' | 'any';\n\nexport type FunctionArgumentDefinition = {\n name: string;\n description: string;\n // if true, this argument can be omitted (i.e. fewer args than defs.length is allowed)\n optional?: boolean;\n // If true, blank will be treated as 0 for numbers, \"\" for strings, etc. Default: true\n nullable?: boolean;\n variadic?: boolean;\n\n errorTolerant?: boolean;\n acceptedTypes?: FunctionArgumentType[];\n /** When true, this argument takes a range/matrix value — broadcasting is suppressed for it. */\n takesMatrix?: boolean;\n};\n\nexport const conditionArg: FunctionArgumentDefinition = {\n name: 'condition',\n description:\n 'The condition to evaluate. Use \"=\" for equal, \"<\" for less than, \">\" for greater than, \"<=\" for less than or equal, \">=\" for greater than or equal, \"<>\" for not equal.',\n acceptedTypes: ['any'],\n};\n\n/**\n * Check whether a value matches one of the allowed type names\n * from a FunctionArgumentDefinition.acceptedTypes array.\n */\nconst matchesType = (\n value: any,\n { nullable = true, errorTolerant = false, acceptedTypes }: FunctionArgumentDefinition,\n): boolean => {\n if (!acceptedTypes || acceptedTypes.length === 0) {\n return true;\n }\n if (value == null) {\n return nullable;\n }\n if (FormulaError.is(value) || value instanceof Error) {\n if (errorTolerant) {\n return true;\n }\n throw value;\n }\n for (const t of acceptedTypes) {\n switch (t) {\n case 'any':\n return true;\n case 'number':\n if (typeof value === 'number') {\n return true;\n }\n break;\n case 'string':\n if (typeof value === 'string') {\n return true;\n }\n break;\n case 'boolean':\n if (typeof value === 'boolean') {\n return true;\n }\n break;\n case 'date':\n if (value instanceof Date) {\n return true;\n }\n break;\n case 'time':\n if (Time.is(value)) {\n return true;\n }\n break;\n case 'matrix':\n if (isMatrix(value)) {\n return true;\n }\n break;\n case 'reference':\n if (isSheet(value)) {\n return true;\n }\n break;\n }\n }\n return false;\n};\n\n/**\n * Check if a value is a \"matrix\" (Sheet, Spilling, or 2D array).\n */\nexport const isMatrix = (value: any): boolean => {\n return isSheet(value) || Spilling.is(value) || (Array.isArray(value) && Array.isArray(value[0]));\n};\n\n/**\n * Extract the scalar from a 1×1 matrix (Sheet, Spilling, or plain 2D array).\n * Returns the value unchanged if it is not a matrix.\n */\nexport const stripMatrix = (value: any, at: Id): any => {\n if (!isMatrix(value)) {\n return value;\n }\n if (isSheet(value)) {\n return stripSheet({ value, raise: false, at });\n }\n const m: any[][] = Spilling.is(value) ? value.matrix : value;\n let val = m?.[0]?.[0];\n return val;\n};\n\n/**\n * Check if a value is a matrix that is larger than 1×1.\n */\nexport const isMultiCell = (value: any): boolean => {\n if (isSheet(value)) {\n return !value.hasSingleCell;\n }\n if (Spilling.is(value)) {\n const m = value.matrix;\n return m.length > 1 || (m.length === 1 && m[0].length > 1);\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value.length > 1 || value[0].length > 1;\n }\n return false;\n};\n\n/**\n * Resolve which FunctionArgumentDefinition index each args position maps to,\n * accounting for variadic args at the tail.\n *\n * Example: args = [A, B(variadic), C(variadic)], args has 7 elements\n * positions 0 → A, 1 → B, 2 → C, 3 → B, 4 → C, 5 → B, 6 → C\n */\nconst resolveParamIndex = (defs: FunctionArgumentDefinition[], argCount: number): number[] => {\n const indices: number[] = [];\n\n // Find the first variadic arg position\n let iterStart = -1;\n let iterCount = 0;\n for (let i = 0; i < defs.length; i++) {\n if (defs[i].variadic) {\n if (iterStart < 0) {\n iterStart = i;\n }\n iterCount++;\n }\n }\n\n for (let i = 0; i < argCount; i++) {\n if (iterStart >= 0 && i >= iterStart) {\n // Map extra args round-robin across variadic args\n const j = (i - iterStart) % iterCount;\n indices.push(iterStart + j);\n } else if (i < defs.length) {\n indices.push(i);\n } else {\n // Beyond defs and no variadic — fall back to last def\n indices.push(defs.length - 1);\n }\n }\n return indices;\n};\n\nexport class BaseFunction {\n public defs: FunctionArgumentDefinition[] = [];\n public example: string | undefined;\n public description = '';\n public category: FunctionCategory = 'other';\n /** Indicates if this function is async. Override in subclass or use BaseFunctionAsync. */\n protected isAsync: boolean = false;\n /** Cache TTL in milliseconds. Override in subclass to set expiry. undefined = never expires. */\n protected ttlMilliseconds?: number;\n /** Hash precision for cache key generation. Higher values reduce collision risk. Default: 1 */\n protected hashPrecision: number = 1;\n /** If true, reuse the same in-flight promise for matching cache keys across different cells. */\n protected useInflight: boolean = true;\n /** If true, broadcasting is unconditionally disabled for this function. */\n protected broadcastDisabled: boolean = false;\n protected args: any[];\n protected autoSpilling: boolean = false;\n public sheet: Sheet;\n public at: Id;\n static __name = '';\n\n constructor({ args, sheet, at }: FunctionProps) {\n this.args = args.map((a) => {\n try {\n return a.evaluate({ sheet });\n } catch (e) {\n return e;\n }\n });\n this.sheet = sheet;\n this.at = at ?? '?';\n }\n\n private _main(...args: any[]): any {\n if (this.autoSpilling) {\n // @ts-expect-error main is not defined in BaseFunction\n return new Spilling(this.main(...args));\n }\n // @ts-expect-error main is not defined in BaseFunction\n return this.main(...args);\n }\n\n /**\n * Validate and normalise arguments before `main()` is called.\n *\n * Checks:\n * 1. Argument count satisfies defs (respecting optional / variadic).\n * 2. Each argument's runtime type matches the corresponding def's `type` list.\n *\n * Subclasses may override for additional coercion / spreading.\n */\n protected validate(args: any[]): any[] {\n const validatedArgs = [...args];\n\n const defs = this.defs;\n if (defs.length === 0) {\n if (args.length !== 0) {\n throw new FormulaError('#N/A', 'Too many arguments: expected 0, got ' + args.length + '.');\n }\n return validatedArgs;\n }\n\n // --- argument count check ---\n // minArgs: count of defs that are neither optional nor variadic,\n // plus non-optional variadic defs (need at least one instance each).\n let minArgs = 0;\n let hasIterable = false;\n let variadicCount = 0;\n for (const d of defs) {\n if (d.variadic) {\n hasIterable = true;\n variadicCount++;\n if (!d.optional) {\n minArgs++;\n }\n } else if (!d.optional) {\n minArgs++;\n }\n }\n\n if (args.length < minArgs) {\n throw new FormulaError('#N/A', `Too few arguments: expected at least ${minArgs}, got ${args.length}.`);\n }\n\n // maxArgs: if no variadic defs, max = defs.length\n if (!hasIterable && args.length > defs.length) {\n throw new FormulaError('#N/A', `Too many arguments: expected at most ${defs.length}, got ${args.length}.`);\n }\n\n // --- per-argument type check ---\n const indices = resolveParamIndex(defs, args.length);\n for (let i = 0; i < args.length; i++) {\n const def = defs[indices[i]];\n if (!def) {\n continue;\n }\n let value = args[i];\n if (!def.acceptedTypes || def.acceptedTypes.length === 0) {\n continue;\n }\n\n if (isMultiCell(value)) {\n if (!def.takesMatrix) {\n continue;\n }\n } else if (isMatrix(value)) {\n // For 1x1 Sheet, Spilling, or plain 2D array, extract the single value for validation.\n // UNLESS the definition explicitly takes a matrix (e.g. SUM(A1) — let it pass through).\n if (!def.takesMatrix) {\n value = stripMatrix(value, this.at);\n }\n }\n if (!matchesType(value, def)) {\n throw new FormulaError(\n '#VALUE!',\n `Argument \"${def.name}\" (position ${i + 1}) expected ${def.acceptedTypes.join(' | ')}, got ${typeof value}.`,\n );\n }\n validatedArgs[i] = value;\n }\n return validatedArgs;\n }\n\n eachMatrix = (value: any, callback: (v: any) => void) => {\n if (isSheet(value)) {\n const matrix = value.solve({ at: this.at, raise: true });\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let r = 0; r < value.length; r++) {\n for (let c = 0; c < value[r].length; c++) {\n callback(value[r][c]);\n }\n }\n } else {\n callback(value);\n }\n };\n\n /**\n * Extract a 2D array from a matrix value (Spilling, Sheet, or nested array).\n * Default behavior for Sheet is value.solve(). Functions like COL can override\n * this to preserve Sheet metadata per cell.\n */\n protected toMatrix(value: any): any[][] {\n if (Spilling.is(value)) {\n return value.matrix;\n }\n if (isSheet(value)) {\n return value.solve({ at: this.at });\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value;\n }\n return [[value]];\n }\n\n /**\n * Collapse a 1×1 matrix value (Sheet, Spilling, or 2D array) to a scalar.\n * Non-matrix values pass through unchanged.\n *\n * Override in sub-classes that need the original Sheet / reference\n * metadata (e.g. COL, ROW) — for instance, to extract position\n * information before collapsing.\n */\n protected toScalar(value: any): any {\n if (isSheet(value)) {\n const { rows, cols } = value.shape;\n if (rows === 1 && cols === 1) {\n return value.strip({});\n }\n return value;\n }\n if (Spilling.is(value)) {\n return value.matrix?.[0]?.[0];\n }\n if (Array.isArray(value)) {\n if (Array.isArray(value[0])) {\n return value[0]?.[0];\n }\n return value[0];\n }\n return value;\n }\n\n public call() {\n // Broadcast BEFORE validate, because validate may strip Tables to scalars.\n // broadcast only activates when there are 2+ args and at least one\n // broadcastable arg is a multi-cell matrix.\n const broadcastResult = this.broadcast();\n if (broadcastResult !== undefined) {\n return broadcastResult;\n }\n\n // If any argument is still pending, propagate before validate runs\n // (Pending values would fail type checks in validate).\n if (hasDeepPending(this.args, this.at)) {\n return createPropagatedPending();\n }\n\n this.args = this.validate(this.args);\n\n // For async functions, build cache key and check cache before execution\n if (this.isAsync) {\n const key = buildAsyncCacheKey(this.constructor.name, this.args, this.hashPrecision);\n const cached = getAsyncCache(this.sheet, this.at, key, this.useInflight);\n if (cached !== asyncCacheMiss) {\n return cached;\n }\n\n const promise = this._main(...this.args);\n return awaitAndSave(promise, this.sheet, this.at, key, this.ttlMilliseconds, this.useInflight);\n }\n\n // For sync functions, just call and return\n return this._main(...this.args);\n }\n\n /**\n * If any broadcastable argument is a matrix (multi-cell), expand the call\n * across all element positions and return a Spilling.\n * Returns `undefined` when no broadcast is necessary.\n *\n * Rules:\n * - broadcastDisabled = true → never broadcast\n * - An arg is broadcastable when its corresponding args[].takesMatrix is not true\n * - A Sheet/Spilling/2D-array whose size is (1,1) is treated as a scalar\n * (not broadcast); only multi-cell matrices trigger broadcast\n * - For variadic args, extra args are assigned round-robin\n * across the variadic helpArg positions\n */\n private broadcast(): any[][] | undefined {\n if (this.broadcastDisabled) {\n return undefined;\n }\n\n // Map each args index to its corresponding args index\n const helpIndices = resolveParamIndex(this.defs, this.args.length);\n\n // Determine which arg positions are broadcastable (takesMatrix: true suppresses broadcasting).\n const broadcastable: boolean[] = this.args.map((_, i) => {\n const hIdx = helpIndices[i];\n return !this.defs[hIdx]?.takesMatrix;\n });\n\n // Collect matrices only for broadcastable positions whose value is a multi-cell matrix\n const matrices: (any[][] | null)[] = this.args.map((arg, i) => {\n if (broadcastable[i] && isMultiCell(arg)) {\n return this.toMatrix(arg);\n }\n return null;\n });\n\n // If no broadcastable arg is actually a multi-cell matrix, nothing to do\n if (matrices.every((m) => m === null)) {\n return undefined;\n }\n\n // Collapse 1×1 matrix args (non-broadcast) to scalars for the cell-level calls\n const scalarArgs = this.args.map((arg, i) => {\n if (matrices[i] !== null) {\n return arg;\n } // will be expanded per-cell\n return this.toScalar(arg);\n });\n\n // Compute the max rows / cols across all matrix arguments\n let maxRows = 1;\n let maxCols = 1;\n for (const m of matrices) {\n if (m) {\n maxRows = Math.max(maxRows, m.length);\n maxCols = Math.max(\n maxCols,\n m.reduce((acc, row) => Math.max(acc, row.length), 0),\n );\n }\n }\n\n // Save original args so we can restore after each cell iteration\n const originalBareArgs = this.args;\n\n // Iterate over every (row, col) position\n const result: any[][] = [];\n for (let r = 0; r < maxRows; r++) {\n const row: any[] = [];\n for (let c = 0; c < maxCols; c++) {\n // Build the argument list for this cell position\n const cellArgs = scalarArgs.map((arg, i) => {\n const m = matrices[i];\n if (m) {\n // If the position exists in the matrix, use it; otherwise null\n return m?.[r]?.[c] ?? null;\n }\n return arg;\n });\n try {\n if (hasPendingArg(cellArgs)) {\n row.push(createPropagatedPending());\n } else {\n // Validate cell-level args\n const validatedArgs = this.validate(cellArgs);\n if (hasDeepPending(validatedArgs, this.at)) {\n row.push(createPropagatedPending());\n } else {\n row.push(this._main(...validatedArgs));\n }\n }\n } catch (e) {\n row.push(e);\n }\n }\n result.push(row);\n }\n\n // Restore original args\n this.args = originalBareArgs;\n\n return result;\n }\n}\n\n/**\n * Base class for async functions.\n * Extend this class to create async functions that support caching.\n */\nexport class BaseFunctionAsync extends BaseFunction {\n protected isAsync: boolean = true;\n}\n\nexport type FunctionMapping = { [functionName: string]: typeof BaseFunction };\n"],"names":["isSheet","v","conditionArg","matchesType","value","nullable","errorTolerant","acceptedTypes","FormulaError","t","Time","isMatrix","Spilling","stripMatrix","at","stripSheet","m","_a","isMultiCell","resolveParamIndex","defs","argCount","indices","iterStart","iterCount","j","_BaseFunction","args","sheet","callback","matrix","r","c","a","e","validatedArgs","minArgs","hasIterable","d","i","def","rows","cols","_b","_c","broadcastResult","hasDeepPending","createPropagatedPending","key","buildAsyncCacheKey","cached","getAsyncCache","asyncCacheMiss","promise","awaitAndSave","helpIndices","broadcastable","_","hIdx","matrices","arg","scalarArgs","maxRows","maxCols","acc","row","originalBareArgs","result","cellArgs","hasPendingArg","BaseFunction","BaseFunctionAsync"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Sheet } from '../../lib/sheet';
2
+ import { Id, PointType } from '../../types';
3
+ export declare const gt: (left: any, right: any) => boolean;
4
+ export declare const gte: (left: any, right: any) => boolean;
5
+ export declare const lt: (left: any, right: any) => boolean;
6
+ export declare const lte: (left: any, right: any) => boolean;
7
+ export declare const eq: (left: any, right: any) => boolean;
8
+ export declare const ne: (left: any, right: any) => boolean;
9
+ export type EnsureNumberOptions = {
10
+ alternative?: number;
11
+ ignore?: boolean;
12
+ };
13
+ export type EnsureBooleanOptions = {
14
+ alternative?: boolean;
15
+ ignore?: boolean;
16
+ };
17
+ export declare const ensureNumber: (value: any, options?: EnsureNumberOptions) => number;
18
+ export declare const ensureString: (value: any) => string;
19
+ export declare const ensureBoolean: (value: any, options?: EnsureBooleanOptions) => boolean;
20
+ /**
21
+ * Converts a value to a Date object.
22
+ * Accepts: Date, number (ms since epoch), string (parseable date string).
23
+ */
24
+ export declare function ensureDate(value: any): Date;
25
+ export declare const check: (value: any, condition: string) => boolean;
26
+ export declare const eachMatrix: (value: any, callback: (v: any, relativePoint: PointType) => void, at: Id) => void;
27
+ export declare const createBooleanMask: (sheets: Sheet[], conditions: string[], at: Id) => boolean[][];
28
+ //# sourceMappingURL=__utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"__utils.d.ts","sourceRoot":"","sources":["../../../src/formula/functions/__utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAKxC,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGjD,eAAO,MAAM,EAAE,GAAI,MAAM,GAAG,EAAE,OAAO,GAAG,KAAG,OAS1C,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,MAAM,GAAG,EAAE,OAAO,GAAG,KAAG,OAS3C,CAAC;AAEF,eAAO,MAAM,EAAE,GAAI,MAAM,GAAG,EAAE,OAAO,GAAG,KAAG,OAE1C,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,MAAM,GAAG,EAAE,OAAO,GAAG,KAAG,OAE3C,CAAC;AAEF,eAAO,MAAM,EAAE,GAAI,MAAM,GAAG,EAAE,OAAO,GAAG,KAAG,OAE1C,CAAC;AAEF,eAAO,MAAM,EAAE,GAAI,MAAM,GAAG,EAAE,OAAO,GAAG,KAAG,OAE1C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,GAAG,EAAE,UAAU,mBAAmB,KAAG,MAsCxE,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,GAAG,KAAG,MAsBzC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,GAAG,EAAE,UAAU,oBAAoB,KAAG,OA0B1E,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAqB3C;AAID,eAAO,MAAM,KAAK,GAAI,OAAO,GAAG,EAAE,WAAW,MAAM,KAAG,OAqCrD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,GAAG,EAAE,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,SAwBlG,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,KAAK,EAAE,EAAE,YAAY,MAAM,EAAE,EAAE,IAAI,EAAE,KAAG,OAAO,EAAE,EAsB1F,CAAC"}
@@ -0,0 +1,179 @@
1
+ import { stripSheet as p } from "../solver.js";
2
+ import { Sheet as g } from "../../lib/sheet.js";
3
+ import { FormulaError as d } from "../formula-error.js";
4
+ import L from "dayjs";
5
+ import { FULLDATE_FORMAT_UTC as C } from "../../constants.js";
6
+ import { Pending as y, Spilling as R } from "../../sentinels.js";
7
+ import { Time as S } from "../../lib/time.js";
8
+ const u = (t, r) => {
9
+ if (typeof t == "string" || typeof r == "string")
10
+ return s(t) > s(r);
11
+ try {
12
+ return m(t) > m(r);
13
+ } catch {
14
+ return !1;
15
+ }
16
+ }, A = (t, r) => {
17
+ if (typeof t == "string" || typeof r == "string")
18
+ return s(t) >= s(r);
19
+ try {
20
+ return m(t) >= m(r);
21
+ } catch {
22
+ return !1;
23
+ }
24
+ }, T = (t, r) => !A(t, r), b = (t, r) => !u(t, r), N = (t, r) => s(t).toLowerCase() === s(r).toLowerCase(), P = (t, r) => !N(t, r), m = (t, r) => {
25
+ const { alternative: i, ignore: e } = r || {};
26
+ if (y.is(t))
27
+ return t;
28
+ if (typeof t > "u" && typeof i < "u")
29
+ return i;
30
+ if (!t)
31
+ return 0;
32
+ if (t instanceof g) {
33
+ const o = p({ value: t });
34
+ return m(o, { alternative: i });
35
+ }
36
+ if (t instanceof Date)
37
+ return t.getTime();
38
+ if (S.is(t))
39
+ return t.days;
40
+ if (typeof t == "string" && t.endsWith("%")) {
41
+ const o = parseFloat(t.slice(0, -1));
42
+ if (!isNaN(o))
43
+ return o / 100;
44
+ }
45
+ const n = parseFloat(t);
46
+ if (isNaN(n)) {
47
+ if (e)
48
+ return i ?? 0;
49
+ throw new d("#VALUE!", `${t} cannot be converted to a number`);
50
+ }
51
+ return n;
52
+ }, s = (t) => {
53
+ if (y.is(t))
54
+ return t;
55
+ if (t === 0)
56
+ return "0";
57
+ if (!t)
58
+ return "";
59
+ if (t instanceof g) {
60
+ const r = p({ value: t });
61
+ return s(r);
62
+ }
63
+ switch (t.constructor.name) {
64
+ case "Date":
65
+ return L(t).format(C);
66
+ default:
67
+ return String(t);
68
+ }
69
+ }, F = (t, r) => {
70
+ const { alternative: i, ignore: e } = r ?? {};
71
+ if (y.is(t))
72
+ return t;
73
+ if (typeof t > "u" && typeof i < "u")
74
+ return i;
75
+ if (t === null)
76
+ return !1;
77
+ if (t instanceof g) {
78
+ const n = p({ value: t });
79
+ return F(n, r);
80
+ }
81
+ if (typeof t == "string" || t instanceof String) {
82
+ const n = { true: !0, false: !1 }[t.toLowerCase()];
83
+ if (n == null) {
84
+ if (e)
85
+ return !1;
86
+ throw new d("#VALUE!", `text '${t}' cannot be converted to a boolean`);
87
+ }
88
+ return n;
89
+ }
90
+ return !!t;
91
+ };
92
+ function $(t) {
93
+ if (y.is(t) || t instanceof Date)
94
+ return t;
95
+ if (t instanceof g) {
96
+ const r = p({ value: t });
97
+ return $(r);
98
+ }
99
+ if (typeof t == "number")
100
+ return new Date(t);
101
+ if (typeof t == "string") {
102
+ const r = new Date(t);
103
+ if (!isNaN(r.getTime()))
104
+ return r;
105
+ }
106
+ throw new d("#VALUE!", `${t} cannot be converted to a date`);
107
+ }
108
+ const U = /^(<=|>=|<>|>|<|=)?(.*)$/, B = (t, r) => {
109
+ const i = r.match(U), [, e = "", n = ""] = i || [];
110
+ let o = n;
111
+ if (e === ">" || e === "<" || e === ">=" || e === "<=")
112
+ switch (typeof t == "number" && (o = parseFloat(n)), e) {
113
+ case ">":
114
+ return u(t, o);
115
+ case ">=":
116
+ return A(t, o);
117
+ case "<":
118
+ return T(t, o);
119
+ case "<=":
120
+ return b(t, o);
121
+ }
122
+ const f = e === "" || e === "=";
123
+ if (n === "")
124
+ return (t == null || t === "") === f;
125
+ if (typeof t == "string" || t instanceof String) {
126
+ const c = n.replace(/~\*/g, "(\\*)").replace(/~\?/g, "(\\?)").replace(/\*/g, "(.*)").replace(/\?/g, "(.)");
127
+ return RegExp(`^${c}$`, "i").test(t) === f;
128
+ }
129
+ return N(t, o) === f;
130
+ }, M = (t, r, i) => {
131
+ if (t instanceof g) {
132
+ const e = t.solve({ at: i });
133
+ for (let n = 0; n < e.length; n++)
134
+ for (let o = 0; o < e[n].length; o++)
135
+ r(e[n][o], { y: n, x: o });
136
+ } else if (R.is(t)) {
137
+ const e = t.matrix;
138
+ for (let n = 0; n < e.length; n++)
139
+ for (let o = 0; o < e[n].length; o++)
140
+ r(e[n][o], { y: n, x: o });
141
+ } else if (Array.isArray(t) && Array.isArray(t[0]))
142
+ for (let e = 0; e < t.length; e++)
143
+ for (let n = 0; n < t[e].length; n++)
144
+ r(t[e][n], { y: e, x: n });
145
+ else
146
+ r(t, { y: 0, x: 0 });
147
+ }, W = (t, r, i) => {
148
+ if (t.length === 0)
149
+ return [];
150
+ const e = t[0], n = e.numRows, o = e.numCols, f = Array.from({ length: n }, () => Array(o).fill(!0));
151
+ for (let c = 0; c < t.length; c++) {
152
+ const a = t[c], D = r[c];
153
+ M(
154
+ a,
155
+ (E, h) => {
156
+ var w, x;
157
+ (w = f[h.y])[x = h.x] && (w[x] = B(E, D));
158
+ },
159
+ i
160
+ );
161
+ }
162
+ return f;
163
+ };
164
+ export {
165
+ B as check,
166
+ W as createBooleanMask,
167
+ M as eachMatrix,
168
+ F as ensureBoolean,
169
+ $ as ensureDate,
170
+ m as ensureNumber,
171
+ s as ensureString,
172
+ N as eq,
173
+ u as gt,
174
+ A as gte,
175
+ T as lt,
176
+ b as lte,
177
+ P as ne
178
+ };
179
+ //# sourceMappingURL=__utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"__utils.js","sources":["../../../src/formula/functions/__utils.ts"],"sourcesContent":["import { stripSheet } from '../solver';\nimport { Sheet } from '../../lib/sheet';\nimport { FormulaError } from '../formula-error';\nimport dayjs from 'dayjs';\nimport { FULLDATE_FORMAT_UTC } from '../../constants';\nimport { Pending, Spilling } from '../../sentinels';\nimport type { Id, PointType } from '../../types';\nimport { Time } from '../../lib/time';\n\nexport const gt = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) > ensureString(right);\n }\n try {\n return ensureNumber(left) > ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const gte = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) >= ensureString(right);\n }\n try {\n return ensureNumber(left) >= ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const lt = (left: any, right: any): boolean => {\n return !gte(left, right);\n};\n\nexport const lte = (left: any, right: any): boolean => {\n return !gt(left, right);\n};\n\nexport const eq = (left: any, right: any): boolean => {\n return ensureString(left).toLowerCase() === ensureString(right).toLowerCase();\n};\n\nexport const ne = (left: any, right: any): boolean => {\n return !eq(left, right);\n};\n\nexport type EnsureNumberOptions = {\n alternative?: number;\n ignore?: boolean;\n};\n\nexport type EnsureBooleanOptions = {\n alternative?: boolean;\n ignore?: boolean;\n};\n\nexport const ensureNumber = (value: any, options?: EnsureNumberOptions): number => {\n const { alternative, ignore } = options || {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (!value) {\n // falsy is 0\n return 0;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureNumber(v, { alternative });\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n if (Time.is(value)) {\n return value.days;\n }\n\n if (typeof value === 'string' && value.endsWith('%')) {\n const num = parseFloat(value.slice(0, -1));\n if (!isNaN(num)) {\n return num / 100;\n }\n }\n\n const num = parseFloat(value as string);\n if (isNaN(num)) {\n if (ignore) {\n return alternative ?? 0;\n }\n throw new FormulaError('#VALUE!', `${value} cannot be converted to a number`);\n }\n return num;\n};\n\nexport const ensureString = (value: any): string => {\n if (Pending.is(value)) {\n return value as any;\n }\n if (value === 0) {\n return '0';\n }\n if (!value) {\n return '';\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureString(v);\n }\n switch (value.constructor.name) {\n case 'Date': {\n const d: Date = value;\n return dayjs(d).format(FULLDATE_FORMAT_UTC);\n }\n default:\n return String(value);\n }\n};\n\nexport const ensureBoolean = (value: any, options?: EnsureBooleanOptions): boolean => {\n const { alternative, ignore } = options ?? {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (value === null) {\n return false;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureBoolean(v, options);\n }\n if (typeof value === 'string' || value instanceof String) {\n const bool = { true: true, false: false }[value.toLowerCase()];\n if (bool == null) {\n if (ignore) {\n return false;\n }\n throw new FormulaError('#VALUE!', `text '${value as string}' cannot be converted to a boolean`);\n }\n return bool;\n }\n return Boolean(value);\n};\n\n/**\n * Converts a value to a Date object.\n * Accepts: Date, number (ms since epoch), string (parseable date string).\n */\nexport function ensureDate(value: any): Date {\n if (Pending.is(value)) {\n return value as any;\n }\n if (value instanceof Date) {\n return value;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureDate(v);\n }\n if (typeof value === 'number') {\n return new Date(value);\n }\n if (typeof value === 'string') {\n const d = new Date(value);\n if (!isNaN(d.getTime())) {\n return d;\n }\n }\n throw new FormulaError('#VALUE!', `${value} cannot be converted to a date`);\n}\n\nconst CONDITION_REGEX = /^(<=|>=|<>|>|<|=)?(.*)$/;\n\nexport const check = (value: any, condition: string): boolean => {\n const m = condition.match(CONDITION_REGEX);\n\n const [, expr = '', target = ''] = m || [];\n let comparison: any = target;\n if (expr === '>' || expr === '<' || expr === '>=' || expr === '<=') {\n if (typeof value === 'number') {\n comparison = parseFloat(target);\n }\n switch (expr) {\n case '>':\n return gt(value, comparison);\n case '>=':\n return gte(value, comparison);\n case '<':\n return lt(value, comparison);\n case '<=':\n return lte(value, comparison);\n }\n }\n\n const equals = expr === '' || expr === '=';\n if (target === '') {\n // empty target means \"\" or \"<>\"\n return (value == null || value === '') === equals;\n }\n\n if (typeof value === 'string' || value instanceof String) {\n const replaced = target\n .replace(/~\\*/g, '(\\\\*)')\n .replace(/~\\?/g, '(\\\\?)')\n .replace(/\\*/g, '(.*)')\n .replace(/\\?/g, '(.)');\n const regex = RegExp(`^${replaced}$`, 'i');\n return regex.test(value as string) === equals;\n }\n return eq(value, comparison) === equals;\n};\n\nexport const eachMatrix = (value: any, callback: (v: any, relativePoint: PointType) => void, at: Id) => {\n if (value instanceof Sheet) {\n const matrix = value.solve({ at });\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let y = 0; y < value.length; y++) {\n for (let x = 0; x < value[y].length; x++) {\n callback(value[y][x], { y, x });\n }\n }\n } else {\n callback(value, { y: 0, x: 0 });\n }\n};\n\nexport const createBooleanMask = (sheets: Sheet[], conditions: string[], at: Id): boolean[][] => {\n if (sheets.length === 0) {\n return [];\n }\n const refRange = sheets[0];\n const numRows = refRange.numRows;\n const numCols = refRange.numCols;\n\n const mask: boolean[][] = Array.from({ length: numRows }, () => Array(numCols).fill(true));\n\n for (let p = 0; p < sheets.length; p++) {\n const condRange = sheets[p];\n const condition = conditions[p];\n eachMatrix(\n condRange,\n (v: any, pt: PointType) => {\n mask[pt.y][pt.x] &&= check(v, condition);\n },\n at,\n );\n }\n return mask;\n};\n"],"names":["gt","left","right","ensureString","ensureNumber","gte","lt","lte","eq","ne","value","options","alternative","ignore","Pending","Sheet","v","stripSheet","Time","num","FormulaError","dayjs","FULLDATE_FORMAT_UTC","ensureBoolean","bool","ensureDate","d","CONDITION_REGEX","check","condition","m","expr","target","comparison","equals","replaced","eachMatrix","callback","at","matrix","y","x","Spilling","createBooleanMask","sheets","conditions","refRange","numRows","numCols","mask","p","condRange","pt","_a","_b"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';
2
+ export declare class AbsFunction extends BaseFunction {
3
+ example: string;
4
+ description: string;
5
+ defs: FunctionArgumentDefinition[];
6
+ category: FunctionCategory;
7
+ protected main(value: any): number;
8
+ }
9
+ //# sourceMappingURL=abs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abs.d.ts","sourceRoot":"","sources":["../../../src/formula/functions/abs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAKtF,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,SAAa;IACpB,WAAW,SAAe;IAC1B,IAAI,EAAE,0BAA0B,EAAE,CAAgF;IAClH,QAAQ,EAAE,gBAAgB,CAAU;IAEpC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;CAG1B"}
@@ -0,0 +1,15 @@
1
+ import { BaseFunction as t } from "./__base.js";
2
+ import { ensureNumber as r } from "./__utils.js";
3
+ const s = "Returns the absolute value of a number";
4
+ class i extends t {
5
+ constructor() {
6
+ super(...arguments), this.example = "ABS(-2)", this.description = s, this.defs = [{ name: "value", description: "target number", acceptedTypes: ["number"] }], this.category = "math";
7
+ }
8
+ main(e) {
9
+ return Math.abs(r(e));
10
+ }
11
+ }
12
+ export {
13
+ i as AbsFunction
14
+ };
15
+ //# sourceMappingURL=abs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abs.js","sources":["../../../src/formula/functions/abs.ts"],"sourcesContent":["import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the absolute value of a number`;\n\nexport class AbsFunction extends BaseFunction {\n example = 'ABS(-2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [{ name: 'value', description: 'target number', acceptedTypes: ['number'] }];\n category: FunctionCategory = 'math';\n\n protected main(value: any) {\n return Math.abs(ensureNumber(value));\n }\n}\n"],"names":["description","AbsFunction","BaseFunction","value","ensureNumber"],"mappings":";;AAGA,MAAMA,IAAc;AAEb,MAAMC,UAAoBC,EAAa;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA,GACK,KAAA,UAAA,WACI,KAAA,cAAAF,GACuB,KAAA,OAAA,CAAC,EAAE,MAAM,SAAS,aAAa,iBAAiB,eAAe,CAAC,QAAQ,GAAG,GACnF,KAAA,WAAA;AAAA,EAAA;AAAA,EAEnB,KAAKG,GAAY;AACzB,WAAO,KAAK,IAAIC,EAAaD,CAAK,CAAC;AAAA,EAAA;AAEvC;"}
@@ -0,0 +1,10 @@
1
+ import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';
2
+ import { Time } from '../../lib/time';
3
+ export declare class AddFunction extends BaseFunction {
4
+ example: string;
5
+ description: string;
6
+ defs: FunctionArgumentDefinition[];
7
+ category: FunctionCategory;
8
+ protected main(v1: number | Date | Time, v2: number | Date | Time): number | Date;
9
+ }
10
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/formula/functions/add.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAEhG,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAMtC,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,SAAe;IACtB,WAAW,SAAe;IAC1B,IAAI,EAAE,0BAA0B,EAAE,CAGhC;IACF,QAAQ,EAAE,gBAAgB,CAAU;IAEpC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CA0BlE"}
@@ -0,0 +1,37 @@
1
+ import n from "dayjs";
2
+ import { FormulaError as a } from "../formula-error.js";
3
+ import { BaseFunction as s } from "./__base.js";
4
+ import { ensureNumber as i } from "./__utils.js";
5
+ import { Time as r } from "../../lib/time.js";
6
+ import { SECONDS_IN_DAY as o } from "../../constants.js";
7
+ const d = `Returns the sum of two numbers.
8
+ This is the same as the '+' operator.`;
9
+ class b extends s {
10
+ constructor() {
11
+ super(...arguments), this.example = "ADD(2, 3)", this.description = d, this.defs = [
12
+ { name: "value1", description: "First additive.", acceptedTypes: ["number", "date", "time"] },
13
+ { name: "value2", description: "Second additive.", acceptedTypes: ["number", "date", "time"] }
14
+ ], this.category = "math";
15
+ }
16
+ main(e, t) {
17
+ if (typeof e == "number" && typeof t == "number")
18
+ return e + t;
19
+ if (e instanceof Date && r.is(t))
20
+ return r.ensure(t).add(e);
21
+ if (r.is(e) && t instanceof Date)
22
+ return r.ensure(e).add(t);
23
+ if (e instanceof Date && typeof t == "number")
24
+ return n(e).add(t * o, "second").toDate();
25
+ if (typeof e == "number" && t instanceof Date)
26
+ return n(t).add(e * o, "second").toDate();
27
+ try {
28
+ return i(e, { alternative: 0 }) + i(t, { alternative: 0 });
29
+ } catch {
30
+ throw new a("#VALUE!", "Mismatched types for augend or addend.");
31
+ }
32
+ }
33
+ }
34
+ export {
35
+ b as AddFunction
36
+ };
37
+ //# sourceMappingURL=add.js.map