exploreda 0.0.6 → 0.1.0

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 (208) hide show
  1. package/README.md +144 -0
  2. package/dist/ExplorEda.cjs +4608 -11288
  3. package/dist/ExplorEda.cjs.map +1 -1
  4. package/dist/ExplorEda.css +2282 -1689
  5. package/dist/ExplorEda.css.map +1 -1
  6. package/dist/ExplorEda.d.cts +124 -278
  7. package/dist/ExplorEda.d.ts +124 -278
  8. package/dist/ExplorEda.js +4479 -11166
  9. package/dist/ExplorEda.js.map +1 -1
  10. package/dist/calculations.cjs +18 -0
  11. package/dist/calculations.cjs.map +1 -0
  12. package/dist/calculations.d.cts +63 -0
  13. package/dist/calculations.d.ts +63 -0
  14. package/dist/calculations.js +3 -0
  15. package/dist/calculations.js.map +1 -0
  16. package/dist/charts/bar.cjs +27 -0
  17. package/dist/charts/bar.cjs.map +1 -0
  18. package/dist/charts/bar.d.cts +2 -0
  19. package/dist/charts/bar.d.ts +2 -0
  20. package/dist/charts/bar.js +18 -0
  21. package/dist/charts/bar.js.map +1 -0
  22. package/dist/charts/box-plot.cjs +26 -0
  23. package/dist/charts/box-plot.cjs.map +1 -0
  24. package/dist/charts/box-plot.d.cts +2 -0
  25. package/dist/charts/box-plot.d.ts +2 -0
  26. package/dist/charts/box-plot.js +17 -0
  27. package/dist/charts/box-plot.js.map +1 -0
  28. package/dist/charts/color-legend.cjs +22 -0
  29. package/dist/charts/color-legend.cjs.map +1 -0
  30. package/dist/charts/color-legend.d.cts +2 -0
  31. package/dist/charts/color-legend.d.ts +2 -0
  32. package/dist/charts/color-legend.js +13 -0
  33. package/dist/charts/color-legend.js.map +1 -0
  34. package/dist/charts/data-table.cjs +22 -0
  35. package/dist/charts/data-table.cjs.map +1 -0
  36. package/dist/charts/data-table.d.cts +2 -0
  37. package/dist/charts/data-table.d.ts +2 -0
  38. package/dist/charts/data-table.js +13 -0
  39. package/dist/charts/data-table.js.map +1 -0
  40. package/dist/charts/line.cjs +30 -0
  41. package/dist/charts/line.cjs.map +1 -0
  42. package/dist/charts/line.d.cts +2 -0
  43. package/dist/charts/line.d.ts +2 -0
  44. package/dist/charts/line.js +17 -0
  45. package/dist/charts/line.js.map +1 -0
  46. package/dist/charts/markdown.cjs +16 -0
  47. package/dist/charts/markdown.cjs.map +1 -0
  48. package/dist/charts/markdown.css +77 -0
  49. package/dist/charts/markdown.css.map +1 -0
  50. package/dist/charts/markdown.d.cts +2 -0
  51. package/dist/charts/markdown.d.ts +2 -0
  52. package/dist/charts/markdown.js +7 -0
  53. package/dist/charts/markdown.js.map +1 -0
  54. package/dist/charts/pivot-table.cjs +23 -0
  55. package/dist/charts/pivot-table.cjs.map +1 -0
  56. package/dist/charts/pivot-table.d.cts +2 -0
  57. package/dist/charts/pivot-table.d.ts +2 -0
  58. package/dist/charts/pivot-table.js +14 -0
  59. package/dist/charts/pivot-table.js.map +1 -0
  60. package/dist/charts/row.cjs +27 -0
  61. package/dist/charts/row.cjs.map +1 -0
  62. package/dist/charts/row.d.cts +6 -0
  63. package/dist/charts/row.d.ts +6 -0
  64. package/dist/charts/row.js +18 -0
  65. package/dist/charts/row.js.map +1 -0
  66. package/dist/charts/scatter.cjs +24 -0
  67. package/dist/charts/scatter.cjs.map +1 -0
  68. package/dist/charts/scatter.d.cts +2 -0
  69. package/dist/charts/scatter.d.ts +2 -0
  70. package/dist/charts/scatter.js +15 -0
  71. package/dist/charts/scatter.js.map +1 -0
  72. package/dist/charts/summary-table.cjs +19 -0
  73. package/dist/charts/summary-table.cjs.map +1 -0
  74. package/dist/charts/summary-table.d.cts +2 -0
  75. package/dist/charts/summary-table.d.ts +2 -0
  76. package/dist/charts/summary-table.js +10 -0
  77. package/dist/charts/summary-table.js.map +1 -0
  78. package/dist/charts/three-d-scatter.cjs +24 -0
  79. package/dist/charts/three-d-scatter.cjs.map +1 -0
  80. package/dist/charts/three-d-scatter.d.cts +6 -0
  81. package/dist/charts/three-d-scatter.d.ts +6 -0
  82. package/dist/charts/three-d-scatter.js +15 -0
  83. package/dist/charts/three-d-scatter.js.map +1 -0
  84. package/dist/chunk-3PGYFLE3.cjs +499 -0
  85. package/dist/chunk-3PGYFLE3.cjs.map +1 -0
  86. package/dist/chunk-4HNDKMWF.js +167 -0
  87. package/dist/chunk-4HNDKMWF.js.map +1 -0
  88. package/dist/chunk-4QNENKTV.cjs +1214 -0
  89. package/dist/chunk-4QNENKTV.cjs.map +1 -0
  90. package/dist/chunk-54M32JJB.js +132 -0
  91. package/dist/chunk-54M32JJB.js.map +1 -0
  92. package/dist/chunk-5B23JVH3.cjs +2238 -0
  93. package/dist/chunk-5B23JVH3.cjs.map +1 -0
  94. package/dist/chunk-5LH6NSNL.js +456 -0
  95. package/dist/chunk-5LH6NSNL.js.map +1 -0
  96. package/dist/chunk-6DOKKCJ5.cjs +313 -0
  97. package/dist/chunk-6DOKKCJ5.cjs.map +1 -0
  98. package/dist/chunk-6HZX5CBT.cjs +1074 -0
  99. package/dist/chunk-6HZX5CBT.cjs.map +1 -0
  100. package/dist/chunk-6U5DOIQM.js +1071 -0
  101. package/dist/chunk-6U5DOIQM.js.map +1 -0
  102. package/dist/chunk-7GBZIK2R.cjs +80 -0
  103. package/dist/chunk-7GBZIK2R.cjs.map +1 -0
  104. package/dist/chunk-7PTJNIOD.js +520 -0
  105. package/dist/chunk-7PTJNIOD.js.map +1 -0
  106. package/dist/chunk-AHZYQ7FN.js +319 -0
  107. package/dist/chunk-AHZYQ7FN.js.map +1 -0
  108. package/dist/chunk-AOODAOL4.cjs +55 -0
  109. package/dist/chunk-AOODAOL4.cjs.map +1 -0
  110. package/dist/chunk-ASKFIRMC.cjs +165 -0
  111. package/dist/chunk-ASKFIRMC.cjs.map +1 -0
  112. package/dist/chunk-B7OQUBH4.cjs +171 -0
  113. package/dist/chunk-B7OQUBH4.cjs.map +1 -0
  114. package/dist/chunk-BIMEHDLB.js +72 -0
  115. package/dist/chunk-BIMEHDLB.js.map +1 -0
  116. package/dist/chunk-C62KHV7S.js +1225 -0
  117. package/dist/chunk-C62KHV7S.js.map +1 -0
  118. package/dist/chunk-C7GQT65O.cjs +1119 -0
  119. package/dist/chunk-C7GQT65O.cjs.map +1 -0
  120. package/dist/chunk-CGDWDV4Z.js +1211 -0
  121. package/dist/chunk-CGDWDV4Z.js.map +1 -0
  122. package/dist/chunk-CJQQFNEY.js +69 -0
  123. package/dist/chunk-CJQQFNEY.js.map +1 -0
  124. package/dist/chunk-DHYLSXNR.js +964 -0
  125. package/dist/chunk-DHYLSXNR.js.map +1 -0
  126. package/dist/chunk-DKFA4KOJ.cjs +87 -0
  127. package/dist/chunk-DKFA4KOJ.cjs.map +1 -0
  128. package/dist/chunk-DS5BS7PP.cjs +357 -0
  129. package/dist/chunk-DS5BS7PP.cjs.map +1 -0
  130. package/dist/chunk-EGMFQSGK.js +909 -0
  131. package/dist/chunk-EGMFQSGK.js.map +1 -0
  132. package/dist/chunk-EU5EFHO5.cjs +53 -0
  133. package/dist/chunk-EU5EFHO5.cjs.map +1 -0
  134. package/dist/chunk-FM46QSDM.js +837 -0
  135. package/dist/chunk-FM46QSDM.js.map +1 -0
  136. package/dist/chunk-GV2LRR32.cjs +843 -0
  137. package/dist/chunk-GV2LRR32.cjs.map +1 -0
  138. package/dist/chunk-H3XKFSA5.cjs +322 -0
  139. package/dist/chunk-H3XKFSA5.cjs.map +1 -0
  140. package/dist/chunk-H5AVMMCE.js +347 -0
  141. package/dist/chunk-H5AVMMCE.js.map +1 -0
  142. package/dist/chunk-JDMUN4VK.cjs +986 -0
  143. package/dist/chunk-JDMUN4VK.cjs.map +1 -0
  144. package/dist/chunk-JNO7OXCC.js +2171 -0
  145. package/dist/chunk-JNO7OXCC.js.map +1 -0
  146. package/dist/chunk-JQMG4ZR7.js +111 -0
  147. package/dist/chunk-JQMG4ZR7.js.map +1 -0
  148. package/dist/chunk-L2Q2R43U.cjs +118 -0
  149. package/dist/chunk-L2Q2R43U.cjs.map +1 -0
  150. package/dist/chunk-LBTZVERO.js +466 -0
  151. package/dist/chunk-LBTZVERO.js.map +1 -0
  152. package/dist/chunk-LUUGGTTK.cjs +1227 -0
  153. package/dist/chunk-LUUGGTTK.cjs.map +1 -0
  154. package/dist/chunk-MEEPH7ZC.cjs +911 -0
  155. package/dist/chunk-MEEPH7ZC.cjs.map +1 -0
  156. package/dist/chunk-MJPDJ5AS.js +184 -0
  157. package/dist/chunk-MJPDJ5AS.js.map +1 -0
  158. package/dist/chunk-MJROUIDZ.cjs +219 -0
  159. package/dist/chunk-MJROUIDZ.cjs.map +1 -0
  160. package/dist/chunk-MUWSBYJS.js +528 -0
  161. package/dist/chunk-MUWSBYJS.js.map +1 -0
  162. package/dist/chunk-NDF5LCST.js +1088 -0
  163. package/dist/chunk-NDF5LCST.js.map +1 -0
  164. package/dist/chunk-NGWTPED4.js +311 -0
  165. package/dist/chunk-NGWTPED4.js.map +1 -0
  166. package/dist/chunk-PP4VCONW.js +739 -0
  167. package/dist/chunk-PP4VCONW.js.map +1 -0
  168. package/dist/chunk-PRMC2A6P.cjs +488 -0
  169. package/dist/chunk-PRMC2A6P.cjs.map +1 -0
  170. package/dist/chunk-PST6UU6S.cjs +742 -0
  171. package/dist/chunk-PST6UU6S.cjs.map +1 -0
  172. package/dist/chunk-Q7LK2UWH.js +33 -0
  173. package/dist/chunk-Q7LK2UWH.js.map +1 -0
  174. package/dist/chunk-SFV5LZPD.js +162 -0
  175. package/dist/chunk-SFV5LZPD.js.map +1 -0
  176. package/dist/chunk-SKXGYJJG.cjs +370 -0
  177. package/dist/chunk-SKXGYJJG.cjs.map +1 -0
  178. package/dist/chunk-SWLNKY6R.js +477 -0
  179. package/dist/chunk-SWLNKY6R.js.map +1 -0
  180. package/dist/chunk-TGVLNHUB.cjs +483 -0
  181. package/dist/chunk-TGVLNHUB.cjs.map +1 -0
  182. package/dist/chunk-TLLRW6S3.js +74 -0
  183. package/dist/chunk-TLLRW6S3.js.map +1 -0
  184. package/dist/chunk-TRAIXZ6M.cjs +140 -0
  185. package/dist/chunk-TRAIXZ6M.cjs.map +1 -0
  186. package/dist/chunk-U74A5VK5.cjs +74 -0
  187. package/dist/chunk-U74A5VK5.cjs.map +1 -0
  188. package/dist/chunk-UAVDLBTA.cjs +74 -0
  189. package/dist/chunk-UAVDLBTA.cjs.map +1 -0
  190. package/dist/chunk-UJWS6TRV.js +354 -0
  191. package/dist/chunk-UJWS6TRV.js.map +1 -0
  192. package/dist/chunk-UUJMUPB3.cjs +531 -0
  193. package/dist/chunk-UUJMUPB3.cjs.map +1 -0
  194. package/dist/chunk-VTKHZIJB.cjs +549 -0
  195. package/dist/chunk-VTKHZIJB.cjs.map +1 -0
  196. package/dist/chunk-YXPAWUXO.js +51 -0
  197. package/dist/chunk-YXPAWUXO.js.map +1 -0
  198. package/dist/chunk-ZD64SCZB.js +80 -0
  199. package/dist/chunk-ZD64SCZB.js.map +1 -0
  200. package/dist/core.cjs +28 -0
  201. package/dist/core.cjs.map +1 -0
  202. package/dist/core.d.cts +22 -0
  203. package/dist/core.d.ts +22 -0
  204. package/dist/core.js +3 -0
  205. package/dist/core.js.map +1 -0
  206. package/dist/dataLayerState-B4XmQjQN.d.cts +258 -0
  207. package/dist/dataLayerState-B4XmQjQN.d.ts +258 -0
  208. package/package.json +30 -52
@@ -0,0 +1,347 @@
1
+ import * as ohm from 'ohm-js';
2
+
3
+ // src/lib/calculations/parser/semantics.ts
4
+ var grammarSource = `Calculation {
5
+ Expression = IfExpr | TernaryExpr | LogicalExpr
6
+
7
+ LogicalExpr = LogicalExpr "||" AndExpr -- binary
8
+ | AndExpr -- term
9
+
10
+ AndExpr = AndExpr "&&" ComparisonExpr -- binary
11
+ | ComparisonExpr -- term
12
+
13
+ ComparisonExpr = ComparisonExpr ComparisonOp AddExpr -- binary
14
+ | AddExpr -- term
15
+
16
+ AddExpr = AddExpr ("+" | "-") MulExpr -- binary
17
+ | MulExpr -- term
18
+
19
+ MulExpr = MulExpr ("*" | "/") PowerExpr -- binary
20
+ | PowerExpr -- term
21
+
22
+ PowerExpr = Term "^" PowerExpr -- binary
23
+ | Term -- term
24
+
25
+ TernaryExpr = LogicalExpr "?" Expression ":" Expression
26
+ Term = UnaryExpr | FunctionCall | ParenTerm | fieldReference | number | string | boolean | null | identifier
27
+ fieldReference = "[" string "]"
28
+ UnaryExpr = UnaryOperator Term
29
+ FunctionCall = identifier "(" ListOf<Expression, ","> ")"
30
+ ParenTerm = "(" Expression ")"
31
+ IfExpr = "if" Expression "then" Expression "else" Expression
32
+
33
+ ComparisonOp = "==" | "!=" | "<=" | ">=" | "<" | ">"
34
+ UnaryOperator = "-" | "+" | "!"
35
+
36
+ identifier = ~keyword (letter | "_") (letter | digit | "_")*
37
+ number = digit+ ("." digit+)?
38
+ string = "\\"" stringChar* "\\""
39
+ stringChar = ~("\\"" | "\\\\") any -- nonEscape
40
+ | "\\\\" any -- escape
41
+ boolean = ("true" | "false") ~(letter | digit | "_")
42
+ null = "null" ~(letter | digit | "_")
43
+
44
+ // Built-in keywords
45
+ keyword = ("if" | "then" | "else" | "true" | "false" | "null") ~(letter | digit | "_")
46
+
47
+ // Whitespace handling
48
+ space += comment
49
+ comment = "//" (~"\\n" any)* "\\n" // Single line comments
50
+ }`;
51
+ var grammar2 = ohm.grammar(grammarSource);
52
+ var semantics = grammar2.createSemantics();
53
+ semantics.addOperation("eval", {
54
+ Expression(e) {
55
+ return e.eval();
56
+ },
57
+ LogicalExpr_binary(left, op, right) {
58
+ return {
59
+ type: "basic",
60
+ operator: op.sourceString,
61
+ expression: op.sourceString,
62
+ left: left.eval(),
63
+ right: right.eval()
64
+ };
65
+ },
66
+ LogicalExpr_term(term) {
67
+ return term.eval();
68
+ },
69
+ AndExpr_binary(left, op, right) {
70
+ return {
71
+ type: "basic",
72
+ operator: op.sourceString,
73
+ left: left.eval(),
74
+ right: right.eval()
75
+ };
76
+ },
77
+ AndExpr_term(term) {
78
+ return term.eval();
79
+ },
80
+ ComparisonExpr_binary(left, op, right) {
81
+ return {
82
+ type: "basic",
83
+ operator: op.sourceString,
84
+ expression: op.sourceString,
85
+ left: left.eval(),
86
+ right: right.eval()
87
+ };
88
+ },
89
+ ComparisonExpr_term(term) {
90
+ return term.eval();
91
+ },
92
+ AddExpr_binary(left, op, right) {
93
+ return {
94
+ type: "basic",
95
+ operator: op.sourceString,
96
+ expression: op.sourceString,
97
+ left: left.eval(),
98
+ right: right.eval()
99
+ };
100
+ },
101
+ AddExpr_term(term) {
102
+ return term.eval();
103
+ },
104
+ MulExpr_binary(left, op, right) {
105
+ return {
106
+ type: "basic",
107
+ operator: op.sourceString,
108
+ expression: op.sourceString,
109
+ left: left.eval(),
110
+ right: right.eval()
111
+ };
112
+ },
113
+ MulExpr_term(term) {
114
+ return term.eval();
115
+ },
116
+ PowerExpr_binary(left, op, right) {
117
+ return {
118
+ type: "basic",
119
+ operator: op.sourceString,
120
+ expression: op.sourceString,
121
+ left: left.eval(),
122
+ right: right.eval()
123
+ };
124
+ },
125
+ PowerExpr_term(term) {
126
+ return term.eval();
127
+ },
128
+ LogicalExpr(expr) {
129
+ return expr.eval();
130
+ },
131
+ ComparisonExpr(expr) {
132
+ return expr.eval();
133
+ },
134
+ AddExpr(expr) {
135
+ return expr.eval();
136
+ },
137
+ MulExpr(expr) {
138
+ return expr.eval();
139
+ },
140
+ PowerExpr(expr) {
141
+ return expr.eval();
142
+ },
143
+ TernaryExpr(condition, _q, trueBranch, _c, falseBranch) {
144
+ return {
145
+ type: "ternary",
146
+ condition: condition.eval(),
147
+ trueBranch: trueBranch.eval(),
148
+ falseBranch: falseBranch.eval(),
149
+ expression: "?:",
150
+ name: `${condition.sourceString} ? ${trueBranch.sourceString} : ${falseBranch.sourceString}`
151
+ };
152
+ },
153
+ IfExpr(_if, condition, _then, trueBranch, _else, falseBranch) {
154
+ return {
155
+ type: "ternary",
156
+ condition: condition.eval(),
157
+ trueBranch: trueBranch.eval(),
158
+ falseBranch: falseBranch.eval(),
159
+ expression: "if",
160
+ name: `if ${condition.sourceString} then ${trueBranch.sourceString} else ${falseBranch.sourceString}`
161
+ };
162
+ },
163
+ UnaryExpr(op, expr) {
164
+ return {
165
+ type: "unary",
166
+ operator: op.sourceString,
167
+ expression: op.sourceString,
168
+ operand: expr.eval()
169
+ };
170
+ },
171
+ FunctionCall(name, _open, args, _close) {
172
+ return {
173
+ type: "function",
174
+ name: name.sourceString,
175
+ arguments: args.asIteration().children.map((arg) => arg.eval())
176
+ };
177
+ },
178
+ ParenTerm(_open, expr, _close) {
179
+ return expr.eval();
180
+ },
181
+ number(digits, _dot, decimals) {
182
+ return {
183
+ type: "literal",
184
+ value: parseFloat(this.sourceString),
185
+ expression: this.sourceString
186
+ };
187
+ },
188
+ string(_open, chars, _close) {
189
+ return {
190
+ type: "literal",
191
+ value: JSON.parse(this.sourceString),
192
+ expression: chars.sourceString
193
+ };
194
+ },
195
+ fieldReference(_open, field, _close) {
196
+ return {
197
+ type: "identifier",
198
+ name: field.eval().value,
199
+ expression: this.sourceString
200
+ };
201
+ },
202
+ boolean(_value) {
203
+ return {
204
+ type: "literal",
205
+ value: this.sourceString === "true",
206
+ expression: this.sourceString
207
+ };
208
+ },
209
+ null(_value) {
210
+ return {
211
+ type: "literal",
212
+ value: null,
213
+ expression: "null"
214
+ };
215
+ },
216
+ identifier(first, rest) {
217
+ return {
218
+ type: "identifier",
219
+ name: this.sourceString,
220
+ expression: this.sourceString
221
+ };
222
+ }
223
+ });
224
+ function parseExpression(input) {
225
+ const matchResult = grammar2.match(input);
226
+ if (matchResult.failed()) {
227
+ throw new Error(`Parse error: ${matchResult.message}`);
228
+ }
229
+ const parsed = semantics(matchResult).eval();
230
+ return convertToExpression(parsed, input);
231
+ }
232
+ function convertToExpression(parsed, rawInput) {
233
+ const id = crypto.randomUUID();
234
+ switch (parsed.type) {
235
+ case "basic":
236
+ if (!parsed.left || !parsed.right) {
237
+ throw new Error("Basic expression must have left and right operands");
238
+ }
239
+ return {
240
+ id,
241
+ type: "basic",
242
+ name: `${parsed.left?.name || ""} ${parsed.operator} ${parsed.right?.name || ""}`,
243
+ expression: parsed.operator || "",
244
+ dependencies: getDependencies(parsed),
245
+ left: convertToExpression(parsed.left, ""),
246
+ right: convertToExpression(parsed.right, ""),
247
+ operator: parsed.operator || "",
248
+ rawInput
249
+ };
250
+ case "unary":
251
+ if (!parsed.operand) {
252
+ throw new Error("Unary expression must have an operand");
253
+ }
254
+ return {
255
+ id,
256
+ type: "unary",
257
+ name: `${parsed.operator}${parsed.operand?.name || ""}`,
258
+ expression: parsed.operator || "",
259
+ dependencies: getDependencies(parsed),
260
+ operand: convertToExpression(parsed.operand, ""),
261
+ operator: parsed.operator || "",
262
+ rawInput
263
+ };
264
+ case "ternary":
265
+ if (!parsed.condition || !parsed.trueBranch || !parsed.falseBranch) {
266
+ throw new Error(
267
+ "Ternary expression must have condition and both branches"
268
+ );
269
+ }
270
+ return {
271
+ id,
272
+ type: "ternary",
273
+ name: parsed.name || `${parsed.condition?.name || ""} ? ${parsed.trueBranch?.name || ""} : ${parsed.falseBranch?.name || ""}`,
274
+ expression: parsed.expression || "?:",
275
+ dependencies: getDependencies(parsed),
276
+ condition: convertToExpression(parsed.condition, ""),
277
+ trueBranch: convertToExpression(parsed.trueBranch, ""),
278
+ falseBranch: convertToExpression(parsed.falseBranch, ""),
279
+ rawInput
280
+ };
281
+ case "function":
282
+ return {
283
+ id,
284
+ type: "function",
285
+ name: parsed.name || "",
286
+ expression: "",
287
+ functionName: parsed.name || "",
288
+ arguments: parsed.arguments?.map((arg) => convertToExpression(arg, "")) || [],
289
+ dependencies: getDependencies(parsed),
290
+ rawInput
291
+ };
292
+ case "identifier":
293
+ return {
294
+ id,
295
+ type: "literal",
296
+ name: parsed.name || "",
297
+ expression: parsed.name || "",
298
+ dependencies: [parsed.name || ""],
299
+ value: parsed.name || "",
300
+ rawInput
301
+ };
302
+ case "literal":
303
+ return {
304
+ id,
305
+ type: "literal",
306
+ name: String(parsed.value),
307
+ expression: String(parsed.value),
308
+ dependencies: [],
309
+ value: parsed.value,
310
+ rawInput
311
+ };
312
+ default:
313
+ throw new Error(`Unsupported expression type: ${parsed.type}`);
314
+ }
315
+ }
316
+ function getDependencies(parsed) {
317
+ const deps = /* @__PURE__ */ new Set();
318
+ function collect(expr) {
319
+ if (expr.type === "identifier") {
320
+ deps.add(expr.name || "");
321
+ }
322
+ if (expr.arguments) {
323
+ expr.arguments.forEach(collect);
324
+ }
325
+ if (expr.left) {
326
+ collect(expr.left);
327
+ }
328
+ if (expr.right) {
329
+ collect(expr.right);
330
+ }
331
+ if (expr.operand) {
332
+ collect(expr.operand);
333
+ }
334
+ if (expr.condition) {
335
+ collect(expr.condition);
336
+ collect(expr.trueBranch);
337
+ collect(expr.falseBranch);
338
+ }
339
+ }
340
+ collect(parsed);
341
+ return Array.from(deps);
342
+ }
343
+ var semantics_default = semantics;
344
+
345
+ export { parseExpression, semantics_default };
346
+ //# sourceMappingURL=chunk-H5AVMMCE.js.map
347
+ //# sourceMappingURL=chunk-H5AVMMCE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/calculations/parser/semantics.ts"],"names":["grammar"],"mappings":"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","file":"chunk-H5AVMMCE.js","sourcesContent":["import { type CalculationValue, type Expression } from \"../types\";\nimport * as ohm from \"ohm-js\";\n\n// Define the grammar inline\nconst grammarSource = `Calculation {\n Expression = IfExpr | TernaryExpr | LogicalExpr\n\n LogicalExpr = LogicalExpr \"||\" AndExpr -- binary\n | AndExpr -- term\n\n AndExpr = AndExpr \"&&\" ComparisonExpr -- binary\n | ComparisonExpr -- term\n\n ComparisonExpr = ComparisonExpr ComparisonOp AddExpr -- binary\n | AddExpr -- term\n\n AddExpr = AddExpr (\"+\" | \"-\") MulExpr -- binary\n | MulExpr -- term\n\n MulExpr = MulExpr (\"*\" | \"/\") PowerExpr -- binary\n | PowerExpr -- term\n\n PowerExpr = Term \"^\" PowerExpr -- binary\n | Term -- term\n\n TernaryExpr = LogicalExpr \"?\" Expression \":\" Expression\n Term = UnaryExpr | FunctionCall | ParenTerm | fieldReference | number | string | boolean | null | identifier\n fieldReference = \"[\" string \"]\"\n UnaryExpr = UnaryOperator Term\n FunctionCall = identifier \"(\" ListOf<Expression, \",\"> \")\"\n ParenTerm = \"(\" Expression \")\"\n IfExpr = \"if\" Expression \"then\" Expression \"else\" Expression\n\n ComparisonOp = \"==\" | \"!=\" | \"<=\" | \">=\" | \"<\" | \">\"\n UnaryOperator = \"-\" | \"+\" | \"!\"\n\n identifier = ~keyword (letter | \"_\") (letter | digit | \"_\")*\n number = digit+ (\".\" digit+)?\n string = \"\\\\\"\" stringChar* \"\\\\\"\"\n stringChar = ~(\"\\\\\"\" | \"\\\\\\\\\") any -- nonEscape\n | \"\\\\\\\\\" any -- escape\n boolean = (\"true\" | \"false\") ~(letter | digit | \"_\")\n null = \"null\" ~(letter | digit | \"_\")\n\n // Built-in keywords\n keyword = (\"if\" | \"then\" | \"else\" | \"true\" | \"false\" | \"null\") ~(letter | digit | \"_\")\n\n // Whitespace handling\n space += comment\n comment = \"//\" (~\"\\\\n\" any)* \"\\\\n\" // Single line comments\n}`;\n\n// Create the grammar\nconst grammar = ohm.grammar(grammarSource);\n\nexport interface ParsedExpression {\n type: string;\n value?: CalculationValue;\n children?: ParsedExpression[];\n operator?: string;\n left?: ParsedExpression;\n right?: ParsedExpression;\n name?: string;\n arguments?: ParsedExpression[];\n operand?: ParsedExpression;\n condition?: ParsedExpression;\n trueBranch?: ParsedExpression;\n falseBranch?: ParsedExpression;\n dependencies?: string[];\n expression?: string;\n}\n\ntype Node = ohm.Node;\n\n// Create semantics\nconst semantics = grammar.createSemantics();\n\nsemantics.addOperation<ParsedExpression>(\"eval\", {\n Expression(e: Node): ParsedExpression {\n return e.eval();\n },\n LogicalExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n LogicalExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n AndExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n AndExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n ComparisonExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n ComparisonExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n AddExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n AddExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n MulExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n MulExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n PowerExpr_binary(left: Node, op: Node, right: Node): ParsedExpression {\n return {\n type: \"basic\",\n operator: op.sourceString,\n expression: op.sourceString,\n left: left.eval(),\n right: right.eval(),\n };\n },\n PowerExpr_term(term: Node): ParsedExpression {\n return term.eval();\n },\n LogicalExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n ComparisonExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n AddExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n MulExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n PowerExpr(expr: Node): ParsedExpression {\n return expr.eval();\n },\n TernaryExpr(\n condition: Node,\n _q: Node,\n trueBranch: Node,\n _c: Node,\n falseBranch: Node\n ): ParsedExpression {\n void _q;\n void _c;\n return {\n type: \"ternary\",\n condition: condition.eval(),\n trueBranch: trueBranch.eval(),\n falseBranch: falseBranch.eval(),\n expression: \"?:\",\n name: `${condition.sourceString} ? ${trueBranch.sourceString} : ${falseBranch.sourceString}`,\n };\n },\n IfExpr(\n _if: Node,\n condition: Node,\n _then: Node,\n trueBranch: Node,\n _else: Node,\n falseBranch: Node\n ): ParsedExpression {\n void _if;\n void _then;\n void _else;\n return {\n type: \"ternary\",\n condition: condition.eval(),\n trueBranch: trueBranch.eval(),\n falseBranch: falseBranch.eval(),\n expression: \"if\",\n name: `if ${condition.sourceString} then ${trueBranch.sourceString} else ${falseBranch.sourceString}`,\n };\n },\n UnaryExpr(op: Node, expr: Node): ParsedExpression {\n return {\n type: \"unary\",\n operator: op.sourceString,\n expression: op.sourceString,\n operand: expr.eval(),\n };\n },\n FunctionCall(\n name: Node,\n _open: Node,\n args: Node,\n _close: Node\n ): ParsedExpression {\n void _open;\n void _close;\n return {\n type: \"function\",\n name: name.sourceString,\n arguments: args.asIteration().children.map((arg: Node) => arg.eval()),\n };\n },\n ParenTerm(_open: Node, expr: Node, _close: Node): ParsedExpression {\n void _open;\n void _close;\n return expr.eval();\n },\n number(digits: Node, _dot: Node, decimals: Node): ParsedExpression {\n void digits;\n void _dot;\n void decimals;\n return {\n type: \"literal\",\n value: parseFloat(this.sourceString),\n expression: this.sourceString,\n };\n },\n string(_open: Node, chars: Node, _close: Node): ParsedExpression {\n void _open;\n void _close;\n return {\n type: \"literal\",\n value: JSON.parse(this.sourceString),\n expression: chars.sourceString,\n };\n },\n fieldReference(_open: Node, field: Node, _close: Node): ParsedExpression {\n return {\n type: \"identifier\",\n name: field.eval().value as string,\n expression: this.sourceString,\n };\n },\n boolean(_value: Node): ParsedExpression {\n void _value;\n return {\n type: \"literal\",\n value: this.sourceString === \"true\",\n expression: this.sourceString,\n };\n },\n null(_value: Node): ParsedExpression {\n void _value;\n return {\n type: \"literal\",\n value: null,\n expression: \"null\",\n };\n },\n identifier(first: Node, rest: Node): ParsedExpression {\n void first;\n void rest;\n return {\n type: \"identifier\",\n name: this.sourceString,\n expression: this.sourceString,\n };\n },\n});\n\nexport function parseExpression(input: string): Expression {\n const matchResult = grammar.match(input);\n\n if (matchResult.failed()) {\n throw new Error(`Parse error: ${matchResult.message}`);\n }\n\n const parsed = semantics(matchResult).eval();\n\n // Convert the parsed expression to our Expression type\n return convertToExpression(parsed, input);\n}\n\nfunction convertToExpression(\n parsed: ParsedExpression,\n rawInput: string\n): Expression {\n const id = crypto.randomUUID();\n\n switch (parsed.type) {\n case \"basic\":\n if (!parsed.left || !parsed.right) {\n throw new Error(\"Basic expression must have left and right operands\");\n }\n return {\n id,\n type: \"basic\",\n name: `${parsed.left?.name || \"\"} ${parsed.operator} ${\n parsed.right?.name || \"\"\n }`,\n expression: parsed.operator || \"\",\n dependencies: getDependencies(parsed),\n left: convertToExpression(parsed.left, \"\"),\n right: convertToExpression(parsed.right, \"\"),\n operator: parsed.operator || \"\",\n rawInput,\n };\n case \"unary\":\n if (!parsed.operand) {\n throw new Error(\"Unary expression must have an operand\");\n }\n return {\n id,\n type: \"unary\",\n name: `${parsed.operator}${parsed.operand?.name || \"\"}`,\n expression: parsed.operator || \"\",\n dependencies: getDependencies(parsed),\n operand: convertToExpression(parsed.operand, \"\"),\n operator: parsed.operator || \"\",\n rawInput,\n };\n case \"ternary\":\n if (!parsed.condition || !parsed.trueBranch || !parsed.falseBranch) {\n throw new Error(\n \"Ternary expression must have condition and both branches\"\n );\n }\n return {\n id,\n type: \"ternary\",\n name:\n parsed.name ||\n `${parsed.condition?.name || \"\"} ? ${\n parsed.trueBranch?.name || \"\"\n } : ${parsed.falseBranch?.name || \"\"}`,\n expression: parsed.expression || \"?:\",\n dependencies: getDependencies(parsed),\n condition: convertToExpression(parsed.condition, \"\"),\n trueBranch: convertToExpression(parsed.trueBranch, \"\"),\n falseBranch: convertToExpression(parsed.falseBranch, \"\"),\n rawInput,\n };\n case \"function\":\n return {\n id,\n type: \"function\",\n name: parsed.name || \"\",\n expression: \"\",\n functionName: parsed.name || \"\",\n arguments:\n parsed.arguments?.map((arg) => convertToExpression(arg, \"\")) || [],\n dependencies: getDependencies(parsed),\n rawInput,\n };\n case \"identifier\":\n // Create a literal expression for identifiers instead of basic\n return {\n id,\n type: \"literal\",\n name: parsed.name || \"\",\n expression: parsed.name || \"\",\n dependencies: [parsed.name || \"\"],\n value: parsed.name || \"\",\n rawInput,\n };\n case \"literal\":\n return {\n id,\n type: \"literal\",\n name: String(parsed.value),\n expression: String(parsed.value),\n dependencies: [],\n value: parsed.value,\n rawInput,\n };\n default:\n throw new Error(`Unsupported expression type: ${parsed.type}`);\n }\n}\n\nfunction getDependencies(parsed: ParsedExpression): string[] {\n const deps = new Set<string>();\n\n function collect(expr: ParsedExpression) {\n if (expr.type === \"identifier\") {\n deps.add(expr.name || \"\");\n }\n if (expr.arguments) {\n expr.arguments.forEach(collect);\n }\n if (expr.left) {\n collect(expr.left);\n }\n if (expr.right) {\n collect(expr.right);\n }\n if (expr.operand) {\n collect(expr.operand);\n }\n if (expr.condition) {\n collect(expr.condition);\n collect(expr.trueBranch!);\n collect(expr.falseBranch!);\n }\n }\n\n collect(parsed);\n return Array.from(deps);\n}\n\nexport default semantics;\n"]}