@gridsheet/react-core 1.4.0-alpha.2 → 1.4.0-alpha.3

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 (235) hide show
  1. package/dist/_virtual/_commonjsHelpers.js +7 -0
  2. package/dist/_virtual/_commonjsHelpers.js.map +1 -0
  3. package/dist/_virtual/dayjs.min.js +8 -0
  4. package/dist/_virtual/dayjs.min.js.map +1 -0
  5. package/dist/_virtual/dayjs.min2.js +5 -0
  6. package/dist/_virtual/dayjs.min2.js.map +1 -0
  7. package/dist/_virtual/jsx-runtime.js +6 -0
  8. package/dist/_virtual/jsx-runtime.js.map +1 -0
  9. package/dist/_virtual/jsx-runtime2.js +5 -0
  10. package/dist/_virtual/jsx-runtime2.js.map +1 -0
  11. package/dist/_virtual/react-jsx-runtime.development.js +5 -0
  12. package/dist/_virtual/react-jsx-runtime.development.js.map +1 -0
  13. package/dist/_virtual/react-jsx-runtime.production.js +5 -0
  14. package/dist/_virtual/react-jsx-runtime.production.js.map +1 -0
  15. package/dist/_virtual/timezone.js +8 -0
  16. package/dist/_virtual/timezone.js.map +1 -0
  17. package/dist/_virtual/timezone2.js +5 -0
  18. package/dist/_virtual/timezone2.js.map +1 -0
  19. package/dist/_virtual/utc.js +8 -0
  20. package/dist/_virtual/utc.js.map +1 -0
  21. package/dist/_virtual/utc2.js +5 -0
  22. package/dist/_virtual/utc2.js.map +1 -0
  23. package/dist/components/Cell.js +232 -0
  24. package/dist/components/Cell.js.map +1 -0
  25. package/dist/components/ContextMenu.js +297 -0
  26. package/dist/components/ContextMenu.js.map +1 -0
  27. package/dist/components/Editor.js +455 -0
  28. package/dist/components/Editor.js.map +1 -0
  29. package/dist/components/Emitter.js +26 -0
  30. package/dist/components/Emitter.js.map +1 -0
  31. package/dist/components/Fixed.js +17 -0
  32. package/dist/components/Fixed.js.map +1 -0
  33. package/dist/components/FormulaBar.js +149 -0
  34. package/dist/components/FormulaBar.js.map +1 -0
  35. package/dist/components/GridSheet.js +246 -0
  36. package/dist/components/GridSheet.js.map +1 -0
  37. package/dist/components/HeaderCellLeft.js +131 -0
  38. package/dist/components/HeaderCellLeft.js.map +1 -0
  39. package/dist/components/HeaderCellTop.js +132 -0
  40. package/dist/components/HeaderCellTop.js.map +1 -0
  41. package/dist/components/PluginBase.js +35 -0
  42. package/dist/components/PluginBase.js.map +1 -0
  43. package/dist/components/Resizer.js +98 -0
  44. package/dist/components/Resizer.js.map +1 -0
  45. package/dist/components/SearchBar.js +108 -0
  46. package/dist/components/SearchBar.js.map +1 -0
  47. package/dist/components/SheetProvider.js +56 -0
  48. package/dist/components/SheetProvider.js.map +1 -0
  49. package/dist/components/StoreInitializer.js +84 -0
  50. package/dist/components/StoreInitializer.js.map +1 -0
  51. package/dist/components/Tabular.js +308 -0
  52. package/dist/components/Tabular.js.map +1 -0
  53. package/dist/components/hooks.js +15 -0
  54. package/dist/components/hooks.js.map +1 -0
  55. package/dist/components/svg/Base.js +24 -0
  56. package/dist/components/svg/Base.js.map +1 -0
  57. package/dist/components/svg/CloseIcon.js +13 -0
  58. package/dist/components/svg/CloseIcon.js.map +1 -0
  59. package/dist/components/svg/SearchIcon.js +13 -0
  60. package/dist/components/svg/SearchIcon.js.map +1 -0
  61. package/dist/constants.js +43 -0
  62. package/dist/constants.js.map +1 -0
  63. package/dist/formula/evaluator.js +674 -0
  64. package/dist/formula/evaluator.js.map +1 -0
  65. package/dist/formula/functions/__base.js +19 -0
  66. package/dist/formula/functions/__base.js.map +1 -0
  67. package/dist/formula/functions/__utils.js +145 -0
  68. package/dist/formula/functions/__utils.js.map +1 -0
  69. package/dist/formula/functions/abs.js +24 -0
  70. package/dist/formula/functions/abs.js.map +1 -0
  71. package/dist/formula/functions/acos.js +32 -0
  72. package/dist/formula/functions/acos.js.map +1 -0
  73. package/dist/formula/functions/add.js +57 -0
  74. package/dist/formula/functions/add.js.map +1 -0
  75. package/dist/formula/functions/and.js +28 -0
  76. package/dist/formula/functions/and.js.map +1 -0
  77. package/dist/formula/functions/asin.js +32 -0
  78. package/dist/formula/functions/asin.js.map +1 -0
  79. package/dist/formula/functions/atan.js +29 -0
  80. package/dist/formula/functions/atan.js.map +1 -0
  81. package/dist/formula/functions/atan2.js +35 -0
  82. package/dist/formula/functions/atan2.js.map +1 -0
  83. package/dist/formula/functions/average.js +44 -0
  84. package/dist/formula/functions/average.js.map +1 -0
  85. package/dist/formula/functions/col.js +31 -0
  86. package/dist/formula/functions/col.js.map +1 -0
  87. package/dist/formula/functions/concat.js +27 -0
  88. package/dist/formula/functions/concat.js.map +1 -0
  89. package/dist/formula/functions/concatenate.js +28 -0
  90. package/dist/formula/functions/concatenate.js.map +1 -0
  91. package/dist/formula/functions/cos.js +29 -0
  92. package/dist/formula/functions/cos.js.map +1 -0
  93. package/dist/formula/functions/count.js +38 -0
  94. package/dist/formula/functions/count.js.map +1 -0
  95. package/dist/formula/functions/counta.js +38 -0
  96. package/dist/formula/functions/counta.js.map +1 -0
  97. package/dist/formula/functions/countif.js +32 -0
  98. package/dist/formula/functions/countif.js.map +1 -0
  99. package/dist/formula/functions/divide.js +33 -0
  100. package/dist/formula/functions/divide.js.map +1 -0
  101. package/dist/formula/functions/eq.js +29 -0
  102. package/dist/formula/functions/eq.js.map +1 -0
  103. package/dist/formula/functions/exp.js +29 -0
  104. package/dist/formula/functions/exp.js.map +1 -0
  105. package/dist/formula/functions/gt.js +29 -0
  106. package/dist/formula/functions/gt.js.map +1 -0
  107. package/dist/formula/functions/gte.js +29 -0
  108. package/dist/formula/functions/gte.js.map +1 -0
  109. package/dist/formula/functions/hlookup.js +75 -0
  110. package/dist/formula/functions/hlookup.js.map +1 -0
  111. package/dist/formula/functions/if.js +39 -0
  112. package/dist/formula/functions/if.js.map +1 -0
  113. package/dist/formula/functions/iferror.js +45 -0
  114. package/dist/formula/functions/iferror.js.map +1 -0
  115. package/dist/formula/functions/len.js +29 -0
  116. package/dist/formula/functions/len.js.map +1 -0
  117. package/dist/formula/functions/lenb.js +29 -0
  118. package/dist/formula/functions/lenb.js.map +1 -0
  119. package/dist/formula/functions/ln.js +32 -0
  120. package/dist/formula/functions/ln.js.map +1 -0
  121. package/dist/formula/functions/log.js +36 -0
  122. package/dist/formula/functions/log.js.map +1 -0
  123. package/dist/formula/functions/log10.js +32 -0
  124. package/dist/formula/functions/log10.js.map +1 -0
  125. package/dist/formula/functions/lt.js +29 -0
  126. package/dist/formula/functions/lt.js.map +1 -0
  127. package/dist/formula/functions/lte.js +29 -0
  128. package/dist/formula/functions/lte.js.map +1 -0
  129. package/dist/formula/functions/max.js +47 -0
  130. package/dist/formula/functions/max.js.map +1 -0
  131. package/dist/formula/functions/min.js +47 -0
  132. package/dist/formula/functions/min.js.map +1 -0
  133. package/dist/formula/functions/minus.js +57 -0
  134. package/dist/formula/functions/minus.js.map +1 -0
  135. package/dist/formula/functions/mod.js +33 -0
  136. package/dist/formula/functions/mod.js.map +1 -0
  137. package/dist/formula/functions/multiply.js +27 -0
  138. package/dist/formula/functions/multiply.js.map +1 -0
  139. package/dist/formula/functions/ne.js +29 -0
  140. package/dist/formula/functions/ne.js.map +1 -0
  141. package/dist/formula/functions/not.js +30 -0
  142. package/dist/formula/functions/not.js.map +1 -0
  143. package/dist/formula/functions/now.js +22 -0
  144. package/dist/formula/functions/now.js.map +1 -0
  145. package/dist/formula/functions/or.js +28 -0
  146. package/dist/formula/functions/or.js.map +1 -0
  147. package/dist/formula/functions/pi.js +22 -0
  148. package/dist/formula/functions/pi.js.map +1 -0
  149. package/dist/formula/functions/power.js +27 -0
  150. package/dist/formula/functions/power.js.map +1 -0
  151. package/dist/formula/functions/product.js +40 -0
  152. package/dist/formula/functions/product.js.map +1 -0
  153. package/dist/formula/functions/radians.js +29 -0
  154. package/dist/formula/functions/radians.js.map +1 -0
  155. package/dist/formula/functions/rand.js +22 -0
  156. package/dist/formula/functions/rand.js.map +1 -0
  157. package/dist/formula/functions/round.js +35 -0
  158. package/dist/formula/functions/round.js.map +1 -0
  159. package/dist/formula/functions/rounddown.js +35 -0
  160. package/dist/formula/functions/rounddown.js.map +1 -0
  161. package/dist/formula/functions/roundup.js +35 -0
  162. package/dist/formula/functions/roundup.js.map +1 -0
  163. package/dist/formula/functions/row.js +31 -0
  164. package/dist/formula/functions/row.js.map +1 -0
  165. package/dist/formula/functions/sin.js +29 -0
  166. package/dist/formula/functions/sin.js.map +1 -0
  167. package/dist/formula/functions/sqrt.js +32 -0
  168. package/dist/formula/functions/sqrt.js.map +1 -0
  169. package/dist/formula/functions/sum.js +47 -0
  170. package/dist/formula/functions/sum.js.map +1 -0
  171. package/dist/formula/functions/sumif.js +65 -0
  172. package/dist/formula/functions/sumif.js.map +1 -0
  173. package/dist/formula/functions/tan.js +29 -0
  174. package/dist/formula/functions/tan.js.map +1 -0
  175. package/dist/formula/functions/uminus.js +24 -0
  176. package/dist/formula/functions/uminus.js.map +1 -0
  177. package/dist/formula/functions/vlookup.js +75 -0
  178. package/dist/formula/functions/vlookup.js.map +1 -0
  179. package/dist/formula/mapping.js +118 -0
  180. package/dist/formula/mapping.js.map +1 -0
  181. package/dist/formula/solver.js +70 -0
  182. package/dist/formula/solver.js.map +1 -0
  183. package/dist/index.js +16 -9113
  184. package/dist/index.js.map +1 -1
  185. package/dist/lib/autofill.js +391 -0
  186. package/dist/lib/autofill.js.map +1 -0
  187. package/dist/lib/clipboard.js +46 -0
  188. package/dist/lib/clipboard.js.map +1 -0
  189. package/dist/lib/converters.js +141 -0
  190. package/dist/lib/converters.js.map +1 -0
  191. package/dist/lib/input.js +52 -0
  192. package/dist/lib/input.js.map +1 -0
  193. package/dist/lib/palette.js +24 -0
  194. package/dist/lib/palette.js.map +1 -0
  195. package/dist/lib/prevention.js +82 -0
  196. package/dist/lib/prevention.js.map +1 -0
  197. package/dist/lib/structs.js +276 -0
  198. package/dist/lib/structs.js.map +1 -0
  199. package/dist/lib/table.js +1248 -0
  200. package/dist/lib/table.js.map +1 -0
  201. package/dist/lib/time.js +79 -0
  202. package/dist/lib/time.js.map +1 -0
  203. package/dist/lib/virtualization.js +129 -0
  204. package/dist/lib/virtualization.js.map +1 -0
  205. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js +287 -0
  206. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js.map +1 -0
  207. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/timezone.js +72 -0
  208. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/timezone.js.map +1 -0
  209. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.js +85 -0
  210. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.js.map +1 -0
  211. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.development.js +454 -0
  212. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -0
  213. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.production.js +42 -0
  214. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.production.js.map +1 -0
  215. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/jsx-runtime.js +18 -0
  216. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/jsx-runtime.js.map +1 -0
  217. package/dist/parsers/core.js +139 -0
  218. package/dist/parsers/core.js.map +1 -0
  219. package/dist/renderers/checkbox.js +20 -0
  220. package/dist/renderers/checkbox.js.map +1 -0
  221. package/dist/renderers/core.js +147 -0
  222. package/dist/renderers/core.js.map +1 -0
  223. package/dist/renderers/thousand_separator.js +17 -0
  224. package/dist/renderers/thousand_separator.js.map +1 -0
  225. package/dist/store/actions.js +762 -0
  226. package/dist/store/actions.js.map +1 -0
  227. package/dist/store/helpers.js +88 -0
  228. package/dist/store/helpers.js.map +1 -0
  229. package/dist/store/index.js +8 -0
  230. package/dist/store/index.js.map +1 -0
  231. package/dist/styles/embedder.js +19 -0
  232. package/dist/styles/embedder.js.map +1 -0
  233. package/dist/styles/minified.js +7 -0
  234. package/dist/styles/minified.js.map +1 -0
  235. package/package.json +1 -7
@@ -0,0 +1,674 @@
1
+ import { a2p } from "../lib/converters.js";
2
+ const getId = (idString, stripAbsolute = true) => {
3
+ let id = idString.slice(1);
4
+ if (stripAbsolute && id.startsWith("$")) {
5
+ id = id.slice(1);
6
+ }
7
+ if (stripAbsolute && id.endsWith("$")) {
8
+ id = id.slice(0, -1);
9
+ }
10
+ return id;
11
+ };
12
+ class FormulaError {
13
+ constructor(code, message, error) {
14
+ this.code = code;
15
+ this.message = message;
16
+ this.error = error;
17
+ }
18
+ }
19
+ class Entity {
20
+ constructor(value) {
21
+ this.value = value;
22
+ }
23
+ }
24
+ class ValueEntity extends Entity {
25
+ evaluate() {
26
+ return this.value;
27
+ }
28
+ }
29
+ class UnreferencedEntity extends Entity {
30
+ evaluate() {
31
+ throw new FormulaError("#REF!", `Reference does not exist.`);
32
+ }
33
+ }
34
+ class InvalidRefEntity extends Entity {
35
+ evaluate() {
36
+ throw new FormulaError("#NAME?", `Invalid ref: ${this.value}`);
37
+ }
38
+ }
39
+ class RefEntity extends Entity {
40
+ constructor(value) {
41
+ super(value);
42
+ }
43
+ stringify() {
44
+ return this.value.toUpperCase();
45
+ }
46
+ parse(table) {
47
+ if (this.value.indexOf("!") !== -1) {
48
+ const [rawSheetName, ref] = this.value.split("!");
49
+ const sheetName = stripSheetName(rawSheetName);
50
+ return {
51
+ table: table.getTableBySheetName(sheetName),
52
+ ref: ref.toUpperCase(),
53
+ sheetName
54
+ };
55
+ }
56
+ return {
57
+ table,
58
+ ref: this.value.toUpperCase(),
59
+ sheetName: stripSheetName(table.sheetName)
60
+ };
61
+ }
62
+ evaluate({ table }) {
63
+ const parsed = this.parse(table);
64
+ if (parsed.table == null) {
65
+ throw new FormulaError("#REF!", `Unknown sheet: ${parsed.sheetName}`);
66
+ }
67
+ const { y, x } = a2p(parsed.ref);
68
+ return parsed.table.trim({ top: y, left: x, bottom: y, right: x });
69
+ }
70
+ id(table) {
71
+ const parsed = this.parse(table);
72
+ if (parsed.table == null) {
73
+ return this.value;
74
+ }
75
+ const id = parsed.table.getIdByAddress(parsed.ref);
76
+ if (id) {
77
+ if (parsed.table === table) {
78
+ return id;
79
+ }
80
+ return `#${parsed.table.sheetId}!${id}`;
81
+ }
82
+ return this.value;
83
+ }
84
+ }
85
+ class RangeEntity extends Entity {
86
+ parse(table) {
87
+ const rawRefs = this.value.split(":");
88
+ const refs = [];
89
+ let sheetName = "";
90
+ for (let i = 0; i < rawRefs.length; i++) {
91
+ const ref = rawRefs[i];
92
+ if (ref.indexOf("!") !== -1) {
93
+ const [rawSheetName, rawRef] = ref.split("!");
94
+ refs.push(rawRef.toUpperCase());
95
+ if (i === 0) {
96
+ sheetName = stripSheetName(rawSheetName);
97
+ table = table.getTableBySheetName(sheetName);
98
+ }
99
+ if (table == null) {
100
+ return { table, refs, sheetName };
101
+ }
102
+ } else {
103
+ refs.push(ref);
104
+ }
105
+ }
106
+ return { table, refs, sheetName: sheetName || table.sheetName };
107
+ }
108
+ stringify() {
109
+ return this.value.toUpperCase();
110
+ }
111
+ evaluate({ table }) {
112
+ const parsed = this.parse(table);
113
+ if (parsed.table == null) {
114
+ throw new FormulaError("#REF!", `Unknown sheet: ${parsed.sheetName}`);
115
+ }
116
+ const area = parsed.table.rangeToArea(parsed.refs.join(":"));
117
+ return parsed.table.trim(area);
118
+ }
119
+ idRange(table) {
120
+ const parsed = this.parse(table);
121
+ if (parsed.table == null) {
122
+ return this.value;
123
+ }
124
+ const range = parsed.refs.map((ref) => parsed.table.getIdByAddress(ref)).join(":");
125
+ if (parsed.table === table) {
126
+ return range;
127
+ }
128
+ return `#${parsed.table.sheetId}!${range}`;
129
+ }
130
+ }
131
+ class IdEntity extends Entity {
132
+ parse(table) {
133
+ if (this.value.indexOf("!") !== -1) {
134
+ const [tableId, id] = this.value.split("!");
135
+ return { table: table.tables[tableId.slice(1)], id: getId(id, false) };
136
+ }
137
+ return { table, id: getId(this.value, false) };
138
+ }
139
+ evaluate({ table }) {
140
+ const parsed = this.parse(table);
141
+ const { y, x } = parsed.table.getPointById(parsed.id);
142
+ const [absY, absX] = [Math.abs(y), Math.abs(x)];
143
+ return parsed.table.trim({
144
+ top: absY,
145
+ left: absX,
146
+ bottom: absY,
147
+ right: absX
148
+ });
149
+ }
150
+ ref(table, slideY = 0, slideX = 0) {
151
+ const parsed = this.parse(table);
152
+ const address = parsed.table.getAddressById(parsed.id, slideY, slideX);
153
+ if (parsed.table.sheetId === table.sheetId) {
154
+ return address;
155
+ }
156
+ return `${parsed.table.sheetPrefix()}${address}`;
157
+ }
158
+ slide(table, slideY = 0, slideX = 0) {
159
+ const address = this.ref(table, slideY, slideX);
160
+ if (address == null || address.length < 2) {
161
+ return "#REF!";
162
+ }
163
+ return table.getIdByAddress(address);
164
+ }
165
+ }
166
+ class IdRangeEntity extends Entity {
167
+ parse(table) {
168
+ const range = this.value;
169
+ if (range.indexOf("!") !== -1) {
170
+ const [sheetId, idRange] = range.split("!");
171
+ table = table.tables[sheetId.slice(1)];
172
+ return { table, ids: idRange.split(":") };
173
+ }
174
+ return { table, ids: range.split(":") };
175
+ }
176
+ evaluate({ table }) {
177
+ const parsed = this.parse(table);
178
+ const [p1, p2] = parsed.ids.map((id) => getId(id)).map((id) => parsed.table.getPointById(id));
179
+ const [top, left, bottom, right] = [
180
+ p1.y,
181
+ p1.x,
182
+ p2.y || parsed.table.getNumRows(),
183
+ p2.x || parsed.table.getNumCols()
184
+ ];
185
+ return parsed.table.trim({ top, left, bottom, right });
186
+ }
187
+ range(table, slideY = 0, slideX = 0) {
188
+ const parsed = this.parse(table);
189
+ const range = parsed.ids.map((id) => getId(id, false)).map((id) => parsed.table.getAddressById(id, slideY, slideX)).join(":");
190
+ if (parsed.table.sheetId === table.sheetId) {
191
+ return range;
192
+ }
193
+ return `${parsed.table.sheetPrefix()}${range}`;
194
+ }
195
+ slide(table, slideY = 0, slideX = 0) {
196
+ const range = this.range(table, slideY, slideX);
197
+ return new RangeEntity(range).idRange(table);
198
+ }
199
+ }
200
+ class FunctionEntity {
201
+ constructor(name, precedence = 0, args = []) {
202
+ this.name = name;
203
+ this.precedence = precedence;
204
+ this.args = args;
205
+ }
206
+ evaluate({ table }) {
207
+ const name = this.name.toLowerCase();
208
+ const Func = table.getFunction(name);
209
+ if (Func == null) {
210
+ throw new FormulaError("#NAME?", `Unknown function: ${name}`);
211
+ }
212
+ const func = new Func({ args: this.args, table });
213
+ return func.call();
214
+ }
215
+ }
216
+ const ZERO = new ValueEntity(0);
217
+ const INFIX_FUNCTION_NAME_MAP = {
218
+ "+": "add",
219
+ "-": "minus",
220
+ "/": "divide",
221
+ "*": "multiply",
222
+ "^": "power",
223
+ "&": "concat",
224
+ "=": "eq",
225
+ "<>": "ne",
226
+ ">": "gt",
227
+ ">=": "gte",
228
+ "<": "lt",
229
+ "<=": "lte"
230
+ };
231
+ const PREFIX_FUNCTION_NAME_MAP = {
232
+ "-": "uminus"
233
+ };
234
+ const WHITESPACE_CHARS = /* @__PURE__ */ new Set([" ", "\n", "\r", " ", "\f"]);
235
+ const SPECIAL_CHARS = /* @__PURE__ */ new Set([...WHITESPACE_CHARS, "+", "-", "/", "*", "^", "&", "=", "<", ">", ")", ",", "%"]);
236
+ class Token {
237
+ constructor(type, entity, precedence = 0) {
238
+ this.type = type;
239
+ this.entity = entity;
240
+ this.precedence = precedence;
241
+ }
242
+ length() {
243
+ if (this.type === "VALUE" && typeof this.entity === "string") {
244
+ return this.entity.length + 2;
245
+ }
246
+ return new String(this.entity).length;
247
+ }
248
+ stringify() {
249
+ if (this.type === "VALUE") {
250
+ if (typeof this.entity === "string") {
251
+ return `"${this.entity}"`;
252
+ }
253
+ if (typeof this.entity === "boolean") {
254
+ return this.entity ? "TRUE" : "FALSE";
255
+ }
256
+ }
257
+ return this.entity;
258
+ }
259
+ convert() {
260
+ switch (this.type) {
261
+ case "VALUE":
262
+ return new ValueEntity(this.entity);
263
+ case "ID":
264
+ return new IdEntity(this.entity);
265
+ case "ID_RANGE":
266
+ return new IdRangeEntity(this.entity);
267
+ case "REF":
268
+ return new RefEntity(this.entity);
269
+ case "RANGE":
270
+ return new RangeEntity(this.entity);
271
+ case "INFIX_OPERATOR": {
272
+ const name = INFIX_FUNCTION_NAME_MAP[this.entity];
273
+ return new FunctionEntity(name, this.precedence);
274
+ }
275
+ case "PREFIX_OPERATOR": {
276
+ const name = PREFIX_FUNCTION_NAME_MAP[this.entity];
277
+ return new FunctionEntity(name, this.precedence);
278
+ }
279
+ case "FUNCTION":
280
+ return new FunctionEntity(this.entity);
281
+ case "UNREFERENCED":
282
+ return new UnreferencedEntity(this.entity);
283
+ case "INVALID_REF":
284
+ return new InvalidRefEntity(this.entity);
285
+ }
286
+ }
287
+ }
288
+ const isWhiteSpace = (char) => {
289
+ return WHITESPACE_CHARS.has(char);
290
+ };
291
+ const TOKEN_OPEN = new Token("OPEN", "("), TOKEN_CLOSE = new Token("CLOSE", ")"), TOKEN_COMMA = new Token("COMMA", ","), TOKEN_ADD = new Token("INFIX_OPERATOR", "+", 3), TOKEN_MINUS = new Token("INFIX_OPERATOR", "-", 3), TOKEN_UMINUS = new Token("PREFIX_OPERATOR", "-", 6), TOKEN_DIVIDE = new Token("INFIX_OPERATOR", "/", 4), TOKEN_MULTIPLY = new Token("INFIX_OPERATOR", "*", 4), TOKEN_POWER = new Token("INFIX_OPERATOR", "^", 5), TOKEN_CONCAT = new Token("INFIX_OPERATOR", "&", 4), TOKEN_GTE = new Token("INFIX_OPERATOR", ">=", 2), TOKEN_GT = new Token("INFIX_OPERATOR", ">", 2), TOKEN_LTE = new Token("INFIX_OPERATOR", "<=", 2), TOKEN_LT = new Token("INFIX_OPERATOR", "<", 2), TOKEN_NE = new Token("INFIX_OPERATOR", "<>", 1), TOKEN_EQ = new Token("INFIX_OPERATOR", "=", 1);
292
+ const BOOLS = { ["true"]: true, ["false"]: false };
293
+ class Lexer {
294
+ constructor(formula) {
295
+ this.tokens = [];
296
+ this.foreign = false;
297
+ this.formula = formula;
298
+ this.index = 0;
299
+ this.tokens = [];
300
+ }
301
+ isWhiteSpace() {
302
+ return isWhiteSpace(this.formula[this.index]);
303
+ }
304
+ next(base = 1) {
305
+ this.index += base;
306
+ }
307
+ get(base = 0) {
308
+ const c = this.formula[this.index + base];
309
+ return c;
310
+ }
311
+ getToken(base = 0) {
312
+ return this.tokens[this.tokens.length + base];
313
+ }
314
+ getTokenIndexByCharPosition(pos) {
315
+ let start = 0, end = 0;
316
+ for (let i = 0; i < this.tokens.length; i++) {
317
+ const token = this.tokens[i];
318
+ end = start + token.length();
319
+ if (start <= pos && pos <= end) {
320
+ return i;
321
+ }
322
+ start = end;
323
+ }
324
+ return -1;
325
+ }
326
+ getTokenPositionRange(index, slide = 1) {
327
+ let start = 0, end = 0;
328
+ for (let i = 0; i < index; i++) {
329
+ start = end;
330
+ end += this.tokens[i].length();
331
+ }
332
+ return [start + slide, end + slide];
333
+ }
334
+ stringify() {
335
+ return this.tokens.map((t) => t.stringify()).join("");
336
+ }
337
+ stringifyToId(table, slideY = 0, slideX = 0) {
338
+ return this.tokens.map((t) => {
339
+ switch (t.type) {
340
+ case "VALUE":
341
+ if (typeof t.entity === "number" || typeof t.entity === "boolean") {
342
+ return t.entity;
343
+ }
344
+ return `"${t.entity}"`;
345
+ case "ID":
346
+ return new IdEntity(t.entity).slide(table, slideY, slideX);
347
+ case "ID_RANGE":
348
+ return new IdRangeEntity(t.entity).slide(table, slideY, slideX);
349
+ case "REF":
350
+ return new RefEntity(t.entity).id(table);
351
+ case "RANGE":
352
+ return new RangeEntity(t.entity).idRange(table);
353
+ }
354
+ return t.entity;
355
+ }).join("");
356
+ }
357
+ stringifyToRef(table) {
358
+ return this.tokens.map((t) => {
359
+ switch (t.type) {
360
+ case "VALUE":
361
+ if (typeof t.entity === "number" || typeof t.entity === "boolean") {
362
+ return t.entity;
363
+ }
364
+ return `"${t.entity}"`;
365
+ case "ID":
366
+ return new IdEntity(t.entity).ref(table);
367
+ case "ID_RANGE":
368
+ return new IdRangeEntity(t.entity).range(table);
369
+ }
370
+ return t.entity;
371
+ }).join("");
372
+ }
373
+ tokenize() {
374
+ var _a, _b;
375
+ while (this.index <= this.formula.length) {
376
+ this.skipSpaces();
377
+ let char = this.get();
378
+ this.next();
379
+ switch (char) {
380
+ case void 0:
381
+ return;
382
+ case "(":
383
+ this.tokens.push(TOKEN_OPEN);
384
+ continue;
385
+ case ")":
386
+ this.tokens.push(TOKEN_CLOSE);
387
+ continue;
388
+ case ",":
389
+ this.tokens.push(TOKEN_COMMA);
390
+ continue;
391
+ case "+":
392
+ this.tokens.push(TOKEN_ADD);
393
+ continue;
394
+ case "-": {
395
+ const prev1 = (_a = this.getToken(-1)) == null ? void 0 : _a.type;
396
+ const prev2 = (_b = this.getToken(-2)) == null ? void 0 : _b.type;
397
+ if (prev1 === "INFIX_OPERATOR" || prev1 === "SPACE" && prev2 === "INFIX_OPERATOR") {
398
+ this.tokens.push(TOKEN_UMINUS);
399
+ } else {
400
+ this.tokens.push(TOKEN_MINUS);
401
+ }
402
+ continue;
403
+ }
404
+ case "/":
405
+ this.tokens.push(TOKEN_DIVIDE);
406
+ continue;
407
+ case "*":
408
+ this.tokens.push(TOKEN_MULTIPLY);
409
+ continue;
410
+ case "^":
411
+ this.tokens.push(TOKEN_POWER);
412
+ continue;
413
+ case "&":
414
+ this.tokens.push(TOKEN_CONCAT);
415
+ continue;
416
+ case "=":
417
+ this.tokens.push(TOKEN_EQ);
418
+ continue;
419
+ case ">":
420
+ if (this.get() === "=") {
421
+ this.next();
422
+ this.tokens.push(TOKEN_GTE);
423
+ continue;
424
+ }
425
+ this.tokens.push(TOKEN_GT);
426
+ continue;
427
+ case "<":
428
+ if (this.get() === "=") {
429
+ this.next();
430
+ this.tokens.push(TOKEN_LTE);
431
+ continue;
432
+ }
433
+ if (this.get() === ">") {
434
+ this.next();
435
+ this.tokens.push(TOKEN_NE);
436
+ continue;
437
+ }
438
+ this.tokens.push(TOKEN_LT);
439
+ continue;
440
+ case '"': {
441
+ const buf2 = this.getString('"');
442
+ this.tokens.push(new Token("VALUE", buf2));
443
+ continue;
444
+ }
445
+ case "'": {
446
+ const buf2 = this.getString("'");
447
+ char = `'${buf2}'`;
448
+ break;
449
+ }
450
+ case "!": {
451
+ this.foreign = true;
452
+ break;
453
+ }
454
+ case "%": {
455
+ this.tokens.push(new Token("POSTFIX_OPERATOR", "%", 4));
456
+ continue;
457
+ }
458
+ }
459
+ let buf = char;
460
+ while (true) {
461
+ const c = this.get();
462
+ if (c === "(") {
463
+ this.tokens.push(new Token("FUNCTION", buf), TOKEN_OPEN);
464
+ this.next();
465
+ break;
466
+ }
467
+ if (c == null || SPECIAL_CHARS.has(c)) {
468
+ if (buf.length === 0) {
469
+ break;
470
+ }
471
+ if (buf.match(/^[+-]?(\d*[.])?\d+$/)) {
472
+ this.tokens.push(new Token("VALUE", parseFloat(buf)));
473
+ } else {
474
+ const bool = BOOLS[buf.toLowerCase()];
475
+ if (bool != null) {
476
+ this.tokens.push(new Token("VALUE", bool));
477
+ } else if (buf.startsWith("#")) {
478
+ if (buf === "#REF!") {
479
+ this.tokens.push(new Token("UNREFERENCED", buf));
480
+ } else if (buf.indexOf(":") !== -1) {
481
+ this.tokens.push(new Token("ID_RANGE", buf));
482
+ } else {
483
+ this.tokens.push(new Token("ID", buf));
484
+ }
485
+ } else if (buf.indexOf(":") !== -1) {
486
+ this.tokens.push(new Token("RANGE", buf));
487
+ } else {
488
+ if (isNaN(buf[buf.length - 1])) {
489
+ this.tokens.push(new Token("INVALID_REF", buf));
490
+ } else {
491
+ this.tokens.push(new Token("REF", buf));
492
+ }
493
+ }
494
+ }
495
+ break;
496
+ }
497
+ buf += c;
498
+ this.next();
499
+ }
500
+ }
501
+ }
502
+ skipSpaces() {
503
+ let space = "";
504
+ while (this.isWhiteSpace()) {
505
+ space += this.formula[this.index++];
506
+ }
507
+ if (space !== "") {
508
+ this.tokens.push(new Token("SPACE", space));
509
+ }
510
+ }
511
+ getString(quote = '"') {
512
+ let buf = "";
513
+ while (true) {
514
+ const c = this.get();
515
+ this.next();
516
+ if (c == null) {
517
+ break;
518
+ }
519
+ if (c === quote) {
520
+ if (this.get() === quote) {
521
+ buf += quote;
522
+ this.next();
523
+ continue;
524
+ } else {
525
+ break;
526
+ }
527
+ } else {
528
+ buf += c;
529
+ }
530
+ }
531
+ return buf;
532
+ }
533
+ }
534
+ class Parser {
535
+ constructor(tokens) {
536
+ this.index = 0;
537
+ this.depth = 0;
538
+ this.tokens = tokens;
539
+ }
540
+ build() {
541
+ const { expr } = this.parse(false);
542
+ return expr;
543
+ }
544
+ parse(underFunction) {
545
+ const stack = [];
546
+ let lastOperator;
547
+ const complement = (hasNext = false) => {
548
+ if (lastOperator) {
549
+ const outer = stack.pop();
550
+ lastOperator.args.push(outer);
551
+ }
552
+ return { hasNext, expr: stack.shift() };
553
+ };
554
+ while (this.tokens.length > this.index) {
555
+ const token = this.tokens[this.index++];
556
+ if (token.type === "SPACE") {
557
+ continue;
558
+ }
559
+ if (token.type === "COMMA") {
560
+ if (!underFunction) {
561
+ throw new FormulaError("#ERROR!", "Invalid comma");
562
+ }
563
+ return complement(true);
564
+ } else if (token.type === "VALUE" || token.type === "ID" || token.type === "ID_RANGE" || token.type === "REF" || token.type === "RANGE" || token.type === "UNREFERENCED" || token.type === "INVALID_REF") {
565
+ const expr = token.convert();
566
+ stack.push(expr);
567
+ } else if (token.type === "POSTFIX_OPERATOR" && token.entity === "%") {
568
+ const expr = stack.pop();
569
+ if (!expr) {
570
+ throw new FormulaError("#ERROR!", "Missing expression before %");
571
+ }
572
+ const divideBy100 = new FunctionEntity("divide", 4, [expr, new ValueEntity(100)]);
573
+ stack.push(divideBy100);
574
+ } else if (token.type === "FUNCTION") {
575
+ this.index++;
576
+ this.depth++;
577
+ const func = token.convert();
578
+ stack.push(func);
579
+ while (true) {
580
+ const { expr, hasNext } = this.parse(true);
581
+ if (expr) {
582
+ func.args.push(expr);
583
+ }
584
+ if (!hasNext) {
585
+ break;
586
+ }
587
+ }
588
+ } else if (token.type === "OPEN") {
589
+ this.depth++;
590
+ const { expr } = this.parse(false);
591
+ stack.push(expr);
592
+ } else if (token.type === "CLOSE") {
593
+ if (this.depth-- === 0) {
594
+ throw new FormulaError("#ERROR!", "Unexpected end paren");
595
+ }
596
+ return complement();
597
+ } else if (token.type === "INFIX_OPERATOR") {
598
+ const operator = token.convert();
599
+ let left = stack.pop();
600
+ if (left == null) {
601
+ if (operator.name === "minus" || operator.name === "add") {
602
+ left = ZERO;
603
+ } else {
604
+ throw new FormulaError("#ERROR!", "Missing left expression");
605
+ }
606
+ }
607
+ if (lastOperator == null) {
608
+ operator.args.push(left);
609
+ stack.unshift(operator);
610
+ } else if (operator.precedence > lastOperator.precedence) {
611
+ operator.args.push(left);
612
+ lastOperator.args.push(operator);
613
+ stack.unshift(lastOperator);
614
+ } else {
615
+ const outer = stack.shift();
616
+ operator.args.push(outer);
617
+ lastOperator.args.push(left);
618
+ stack.unshift(operator);
619
+ }
620
+ lastOperator = operator;
621
+ } else if (token.type === "PREFIX_OPERATOR") {
622
+ const operator = token.convert();
623
+ if (lastOperator) {
624
+ lastOperator.args.push(operator);
625
+ } else {
626
+ stack.unshift(operator);
627
+ }
628
+ lastOperator = operator;
629
+ }
630
+ }
631
+ return complement();
632
+ }
633
+ }
634
+ const absolutizeFormula = ({
635
+ value,
636
+ table,
637
+ slideY = 0,
638
+ slideX = 0
639
+ }) => {
640
+ if (typeof value === "string" || value instanceof String) {
641
+ if (value.charAt(0) === "=") {
642
+ const lexer = new Lexer(value.substring(1));
643
+ lexer.tokenize();
644
+ return "=" + lexer.stringifyToId(table, slideY, slideX);
645
+ }
646
+ }
647
+ return value;
648
+ };
649
+ const stripSheetName = (sheetName) => {
650
+ if (sheetName.charAt(0) === "'") {
651
+ sheetName = sheetName.slice(1);
652
+ }
653
+ if (sheetName.charAt(sheetName.length - 1) === "'") {
654
+ sheetName = sheetName.slice(0, -1);
655
+ }
656
+ return sheetName;
657
+ };
658
+ export {
659
+ FormulaError,
660
+ FunctionEntity,
661
+ IdEntity,
662
+ IdRangeEntity,
663
+ InvalidRefEntity,
664
+ Lexer,
665
+ Parser,
666
+ RangeEntity,
667
+ RefEntity,
668
+ Token,
669
+ UnreferencedEntity,
670
+ ValueEntity,
671
+ absolutizeFormula,
672
+ stripSheetName
673
+ };
674
+ //# sourceMappingURL=evaluator.js.map