exploreda 0.0.5 → 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 -10858
  3. package/dist/ExplorEda.cjs.map +1 -1
  4. package/dist/ExplorEda.css +2332 -1653
  5. package/dist/ExplorEda.css.map +1 -1
  6. package/dist/ExplorEda.d.cts +125 -278
  7. package/dist/ExplorEda.d.ts +125 -278
  8. package/dist/ExplorEda.js +4521 -10782
  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 +32 -52
@@ -0,0 +1,370 @@
1
+ 'use strict';
2
+
3
+ var ohm = require('ohm-js');
4
+
5
+ function _interopNamespace(e) {
6
+ if (e && e.__esModule) return e;
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var ohm__namespace = /*#__PURE__*/_interopNamespace(ohm);
24
+
25
+ // src/lib/calculations/parser/semantics.ts
26
+ var grammarSource = `Calculation {
27
+ Expression = IfExpr | TernaryExpr | LogicalExpr
28
+
29
+ LogicalExpr = LogicalExpr "||" AndExpr -- binary
30
+ | AndExpr -- term
31
+
32
+ AndExpr = AndExpr "&&" ComparisonExpr -- binary
33
+ | ComparisonExpr -- term
34
+
35
+ ComparisonExpr = ComparisonExpr ComparisonOp AddExpr -- binary
36
+ | AddExpr -- term
37
+
38
+ AddExpr = AddExpr ("+" | "-") MulExpr -- binary
39
+ | MulExpr -- term
40
+
41
+ MulExpr = MulExpr ("*" | "/") PowerExpr -- binary
42
+ | PowerExpr -- term
43
+
44
+ PowerExpr = Term "^" PowerExpr -- binary
45
+ | Term -- term
46
+
47
+ TernaryExpr = LogicalExpr "?" Expression ":" Expression
48
+ Term = UnaryExpr | FunctionCall | ParenTerm | fieldReference | number | string | boolean | null | identifier
49
+ fieldReference = "[" string "]"
50
+ UnaryExpr = UnaryOperator Term
51
+ FunctionCall = identifier "(" ListOf<Expression, ","> ")"
52
+ ParenTerm = "(" Expression ")"
53
+ IfExpr = "if" Expression "then" Expression "else" Expression
54
+
55
+ ComparisonOp = "==" | "!=" | "<=" | ">=" | "<" | ">"
56
+ UnaryOperator = "-" | "+" | "!"
57
+
58
+ identifier = ~keyword (letter | "_") (letter | digit | "_")*
59
+ number = digit+ ("." digit+)?
60
+ string = "\\"" stringChar* "\\""
61
+ stringChar = ~("\\"" | "\\\\") any -- nonEscape
62
+ | "\\\\" any -- escape
63
+ boolean = ("true" | "false") ~(letter | digit | "_")
64
+ null = "null" ~(letter | digit | "_")
65
+
66
+ // Built-in keywords
67
+ keyword = ("if" | "then" | "else" | "true" | "false" | "null") ~(letter | digit | "_")
68
+
69
+ // Whitespace handling
70
+ space += comment
71
+ comment = "//" (~"\\n" any)* "\\n" // Single line comments
72
+ }`;
73
+ var grammar2 = ohm__namespace.grammar(grammarSource);
74
+ var semantics = grammar2.createSemantics();
75
+ semantics.addOperation("eval", {
76
+ Expression(e) {
77
+ return e.eval();
78
+ },
79
+ LogicalExpr_binary(left, op, right) {
80
+ return {
81
+ type: "basic",
82
+ operator: op.sourceString,
83
+ expression: op.sourceString,
84
+ left: left.eval(),
85
+ right: right.eval()
86
+ };
87
+ },
88
+ LogicalExpr_term(term) {
89
+ return term.eval();
90
+ },
91
+ AndExpr_binary(left, op, right) {
92
+ return {
93
+ type: "basic",
94
+ operator: op.sourceString,
95
+ left: left.eval(),
96
+ right: right.eval()
97
+ };
98
+ },
99
+ AndExpr_term(term) {
100
+ return term.eval();
101
+ },
102
+ ComparisonExpr_binary(left, op, right) {
103
+ return {
104
+ type: "basic",
105
+ operator: op.sourceString,
106
+ expression: op.sourceString,
107
+ left: left.eval(),
108
+ right: right.eval()
109
+ };
110
+ },
111
+ ComparisonExpr_term(term) {
112
+ return term.eval();
113
+ },
114
+ AddExpr_binary(left, op, right) {
115
+ return {
116
+ type: "basic",
117
+ operator: op.sourceString,
118
+ expression: op.sourceString,
119
+ left: left.eval(),
120
+ right: right.eval()
121
+ };
122
+ },
123
+ AddExpr_term(term) {
124
+ return term.eval();
125
+ },
126
+ MulExpr_binary(left, op, right) {
127
+ return {
128
+ type: "basic",
129
+ operator: op.sourceString,
130
+ expression: op.sourceString,
131
+ left: left.eval(),
132
+ right: right.eval()
133
+ };
134
+ },
135
+ MulExpr_term(term) {
136
+ return term.eval();
137
+ },
138
+ PowerExpr_binary(left, op, right) {
139
+ return {
140
+ type: "basic",
141
+ operator: op.sourceString,
142
+ expression: op.sourceString,
143
+ left: left.eval(),
144
+ right: right.eval()
145
+ };
146
+ },
147
+ PowerExpr_term(term) {
148
+ return term.eval();
149
+ },
150
+ LogicalExpr(expr) {
151
+ return expr.eval();
152
+ },
153
+ ComparisonExpr(expr) {
154
+ return expr.eval();
155
+ },
156
+ AddExpr(expr) {
157
+ return expr.eval();
158
+ },
159
+ MulExpr(expr) {
160
+ return expr.eval();
161
+ },
162
+ PowerExpr(expr) {
163
+ return expr.eval();
164
+ },
165
+ TernaryExpr(condition, _q, trueBranch, _c, falseBranch) {
166
+ return {
167
+ type: "ternary",
168
+ condition: condition.eval(),
169
+ trueBranch: trueBranch.eval(),
170
+ falseBranch: falseBranch.eval(),
171
+ expression: "?:",
172
+ name: `${condition.sourceString} ? ${trueBranch.sourceString} : ${falseBranch.sourceString}`
173
+ };
174
+ },
175
+ IfExpr(_if, condition, _then, trueBranch, _else, falseBranch) {
176
+ return {
177
+ type: "ternary",
178
+ condition: condition.eval(),
179
+ trueBranch: trueBranch.eval(),
180
+ falseBranch: falseBranch.eval(),
181
+ expression: "if",
182
+ name: `if ${condition.sourceString} then ${trueBranch.sourceString} else ${falseBranch.sourceString}`
183
+ };
184
+ },
185
+ UnaryExpr(op, expr) {
186
+ return {
187
+ type: "unary",
188
+ operator: op.sourceString,
189
+ expression: op.sourceString,
190
+ operand: expr.eval()
191
+ };
192
+ },
193
+ FunctionCall(name, _open, args, _close) {
194
+ return {
195
+ type: "function",
196
+ name: name.sourceString,
197
+ arguments: args.asIteration().children.map((arg) => arg.eval())
198
+ };
199
+ },
200
+ ParenTerm(_open, expr, _close) {
201
+ return expr.eval();
202
+ },
203
+ number(digits, _dot, decimals) {
204
+ return {
205
+ type: "literal",
206
+ value: parseFloat(this.sourceString),
207
+ expression: this.sourceString
208
+ };
209
+ },
210
+ string(_open, chars, _close) {
211
+ return {
212
+ type: "literal",
213
+ value: JSON.parse(this.sourceString),
214
+ expression: chars.sourceString
215
+ };
216
+ },
217
+ fieldReference(_open, field, _close) {
218
+ return {
219
+ type: "identifier",
220
+ name: field.eval().value,
221
+ expression: this.sourceString
222
+ };
223
+ },
224
+ boolean(_value) {
225
+ return {
226
+ type: "literal",
227
+ value: this.sourceString === "true",
228
+ expression: this.sourceString
229
+ };
230
+ },
231
+ null(_value) {
232
+ return {
233
+ type: "literal",
234
+ value: null,
235
+ expression: "null"
236
+ };
237
+ },
238
+ identifier(first, rest) {
239
+ return {
240
+ type: "identifier",
241
+ name: this.sourceString,
242
+ expression: this.sourceString
243
+ };
244
+ }
245
+ });
246
+ function parseExpression(input) {
247
+ const matchResult = grammar2.match(input);
248
+ if (matchResult.failed()) {
249
+ throw new Error(`Parse error: ${matchResult.message}`);
250
+ }
251
+ const parsed = semantics(matchResult).eval();
252
+ return convertToExpression(parsed, input);
253
+ }
254
+ function convertToExpression(parsed, rawInput) {
255
+ const id = crypto.randomUUID();
256
+ switch (parsed.type) {
257
+ case "basic":
258
+ if (!parsed.left || !parsed.right) {
259
+ throw new Error("Basic expression must have left and right operands");
260
+ }
261
+ return {
262
+ id,
263
+ type: "basic",
264
+ name: `${parsed.left?.name || ""} ${parsed.operator} ${parsed.right?.name || ""}`,
265
+ expression: parsed.operator || "",
266
+ dependencies: getDependencies(parsed),
267
+ left: convertToExpression(parsed.left, ""),
268
+ right: convertToExpression(parsed.right, ""),
269
+ operator: parsed.operator || "",
270
+ rawInput
271
+ };
272
+ case "unary":
273
+ if (!parsed.operand) {
274
+ throw new Error("Unary expression must have an operand");
275
+ }
276
+ return {
277
+ id,
278
+ type: "unary",
279
+ name: `${parsed.operator}${parsed.operand?.name || ""}`,
280
+ expression: parsed.operator || "",
281
+ dependencies: getDependencies(parsed),
282
+ operand: convertToExpression(parsed.operand, ""),
283
+ operator: parsed.operator || "",
284
+ rawInput
285
+ };
286
+ case "ternary":
287
+ if (!parsed.condition || !parsed.trueBranch || !parsed.falseBranch) {
288
+ throw new Error(
289
+ "Ternary expression must have condition and both branches"
290
+ );
291
+ }
292
+ return {
293
+ id,
294
+ type: "ternary",
295
+ name: parsed.name || `${parsed.condition?.name || ""} ? ${parsed.trueBranch?.name || ""} : ${parsed.falseBranch?.name || ""}`,
296
+ expression: parsed.expression || "?:",
297
+ dependencies: getDependencies(parsed),
298
+ condition: convertToExpression(parsed.condition, ""),
299
+ trueBranch: convertToExpression(parsed.trueBranch, ""),
300
+ falseBranch: convertToExpression(parsed.falseBranch, ""),
301
+ rawInput
302
+ };
303
+ case "function":
304
+ return {
305
+ id,
306
+ type: "function",
307
+ name: parsed.name || "",
308
+ expression: "",
309
+ functionName: parsed.name || "",
310
+ arguments: parsed.arguments?.map((arg) => convertToExpression(arg, "")) || [],
311
+ dependencies: getDependencies(parsed),
312
+ rawInput
313
+ };
314
+ case "identifier":
315
+ return {
316
+ id,
317
+ type: "literal",
318
+ name: parsed.name || "",
319
+ expression: parsed.name || "",
320
+ dependencies: [parsed.name || ""],
321
+ value: parsed.name || "",
322
+ rawInput
323
+ };
324
+ case "literal":
325
+ return {
326
+ id,
327
+ type: "literal",
328
+ name: String(parsed.value),
329
+ expression: String(parsed.value),
330
+ dependencies: [],
331
+ value: parsed.value,
332
+ rawInput
333
+ };
334
+ default:
335
+ throw new Error(`Unsupported expression type: ${parsed.type}`);
336
+ }
337
+ }
338
+ function getDependencies(parsed) {
339
+ const deps = /* @__PURE__ */ new Set();
340
+ function collect(expr) {
341
+ if (expr.type === "identifier") {
342
+ deps.add(expr.name || "");
343
+ }
344
+ if (expr.arguments) {
345
+ expr.arguments.forEach(collect);
346
+ }
347
+ if (expr.left) {
348
+ collect(expr.left);
349
+ }
350
+ if (expr.right) {
351
+ collect(expr.right);
352
+ }
353
+ if (expr.operand) {
354
+ collect(expr.operand);
355
+ }
356
+ if (expr.condition) {
357
+ collect(expr.condition);
358
+ collect(expr.trueBranch);
359
+ collect(expr.falseBranch);
360
+ }
361
+ }
362
+ collect(parsed);
363
+ return Array.from(deps);
364
+ }
365
+ var semantics_default = semantics;
366
+
367
+ exports.parseExpression = parseExpression;
368
+ exports.semantics_default = semantics_default;
369
+ //# sourceMappingURL=chunk-SKXGYJJG.cjs.map
370
+ //# sourceMappingURL=chunk-SKXGYJJG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/calculations/parser/semantics.ts"],"names":["grammar","ohm"],"mappings":"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","file":"chunk-SKXGYJJG.cjs","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"]}