mviz 1.4.2

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 (194) hide show
  1. package/README.md +174 -0
  2. package/dist/charts/area.d.ts +14 -0
  3. package/dist/charts/area.d.ts.map +1 -0
  4. package/dist/charts/area.js +137 -0
  5. package/dist/charts/area.js.map +1 -0
  6. package/dist/charts/bar.d.ts +14 -0
  7. package/dist/charts/bar.d.ts.map +1 -0
  8. package/dist/charts/bar.js +191 -0
  9. package/dist/charts/bar.js.map +1 -0
  10. package/dist/charts/boxplot.d.ts +14 -0
  11. package/dist/charts/boxplot.d.ts.map +1 -0
  12. package/dist/charts/boxplot.js +79 -0
  13. package/dist/charts/boxplot.js.map +1 -0
  14. package/dist/charts/bubble.d.ts +14 -0
  15. package/dist/charts/bubble.d.ts.map +1 -0
  16. package/dist/charts/bubble.js +127 -0
  17. package/dist/charts/bubble.js.map +1 -0
  18. package/dist/charts/calendar.d.ts +14 -0
  19. package/dist/charts/calendar.d.ts.map +1 -0
  20. package/dist/charts/calendar.js +94 -0
  21. package/dist/charts/calendar.js.map +1 -0
  22. package/dist/charts/combo.d.ts +14 -0
  23. package/dist/charts/combo.d.ts.map +1 -0
  24. package/dist/charts/combo.js +163 -0
  25. package/dist/charts/combo.js.map +1 -0
  26. package/dist/charts/dumbbell.d.ts +17 -0
  27. package/dist/charts/dumbbell.d.ts.map +1 -0
  28. package/dist/charts/dumbbell.js +368 -0
  29. package/dist/charts/dumbbell.js.map +1 -0
  30. package/dist/charts/funnel.d.ts +14 -0
  31. package/dist/charts/funnel.d.ts.map +1 -0
  32. package/dist/charts/funnel.js +145 -0
  33. package/dist/charts/funnel.js.map +1 -0
  34. package/dist/charts/heatmap.d.ts +14 -0
  35. package/dist/charts/heatmap.d.ts.map +1 -0
  36. package/dist/charts/heatmap.js +202 -0
  37. package/dist/charts/heatmap.js.map +1 -0
  38. package/dist/charts/histogram.d.ts +14 -0
  39. package/dist/charts/histogram.d.ts.map +1 -0
  40. package/dist/charts/histogram.js +103 -0
  41. package/dist/charts/histogram.js.map +1 -0
  42. package/dist/charts/index.d.ts +40 -0
  43. package/dist/charts/index.d.ts.map +1 -0
  44. package/dist/charts/index.js +42 -0
  45. package/dist/charts/index.js.map +1 -0
  46. package/dist/charts/line.d.ts +14 -0
  47. package/dist/charts/line.d.ts.map +1 -0
  48. package/dist/charts/line.js +134 -0
  49. package/dist/charts/line.js.map +1 -0
  50. package/dist/charts/pie.d.ts +14 -0
  51. package/dist/charts/pie.d.ts.map +1 -0
  52. package/dist/charts/pie.js +75 -0
  53. package/dist/charts/pie.js.map +1 -0
  54. package/dist/charts/registry.d.ts +36 -0
  55. package/dist/charts/registry.d.ts.map +1 -0
  56. package/dist/charts/registry.js +55 -0
  57. package/dist/charts/registry.js.map +1 -0
  58. package/dist/charts/sankey.d.ts +14 -0
  59. package/dist/charts/sankey.d.ts.map +1 -0
  60. package/dist/charts/sankey.js +74 -0
  61. package/dist/charts/sankey.js.map +1 -0
  62. package/dist/charts/scatter.d.ts +14 -0
  63. package/dist/charts/scatter.d.ts.map +1 -0
  64. package/dist/charts/scatter.js +130 -0
  65. package/dist/charts/scatter.js.map +1 -0
  66. package/dist/charts/sparkline.d.ts +19 -0
  67. package/dist/charts/sparkline.d.ts.map +1 -0
  68. package/dist/charts/sparkline.js +154 -0
  69. package/dist/charts/sparkline.js.map +1 -0
  70. package/dist/charts/waterfall.d.ts +14 -0
  71. package/dist/charts/waterfall.d.ts.map +1 -0
  72. package/dist/charts/waterfall.js +232 -0
  73. package/dist/charts/waterfall.js.map +1 -0
  74. package/dist/charts/xmr.d.ts +14 -0
  75. package/dist/charts/xmr.d.ts.map +1 -0
  76. package/dist/charts/xmr.js +456 -0
  77. package/dist/charts/xmr.js.map +1 -0
  78. package/dist/cli.d.ts +12 -0
  79. package/dist/cli.d.ts.map +1 -0
  80. package/dist/cli.js +120 -0
  81. package/dist/cli.js.map +1 -0
  82. package/dist/components/alert.d.ts +10 -0
  83. package/dist/components/alert.d.ts.map +1 -0
  84. package/dist/components/alert.js +65 -0
  85. package/dist/components/alert.js.map +1 -0
  86. package/dist/components/big_value.d.ts +10 -0
  87. package/dist/components/big_value.d.ts.map +1 -0
  88. package/dist/components/big_value.js +78 -0
  89. package/dist/components/big_value.js.map +1 -0
  90. package/dist/components/delta.d.ts +10 -0
  91. package/dist/components/delta.d.ts.map +1 -0
  92. package/dist/components/delta.js +83 -0
  93. package/dist/components/delta.js.map +1 -0
  94. package/dist/components/empty_space.d.ts +10 -0
  95. package/dist/components/empty_space.d.ts.map +1 -0
  96. package/dist/components/empty_space.js +29 -0
  97. package/dist/components/empty_space.js.map +1 -0
  98. package/dist/components/index.d.ts +21 -0
  99. package/dist/components/index.d.ts.map +1 -0
  100. package/dist/components/index.js +23 -0
  101. package/dist/components/index.js.map +1 -0
  102. package/dist/components/note.d.ts +10 -0
  103. package/dist/components/note.d.ts.map +1 -0
  104. package/dist/components/note.js +66 -0
  105. package/dist/components/note.js.map +1 -0
  106. package/dist/components/registry.d.ts +24 -0
  107. package/dist/components/registry.d.ts.map +1 -0
  108. package/dist/components/registry.js +36 -0
  109. package/dist/components/registry.js.map +1 -0
  110. package/dist/components/table.d.ts +90 -0
  111. package/dist/components/table.d.ts.map +1 -0
  112. package/dist/components/table.js +610 -0
  113. package/dist/components/table.js.map +1 -0
  114. package/dist/components/text.d.ts +10 -0
  115. package/dist/components/text.d.ts.map +1 -0
  116. package/dist/components/text.js +46 -0
  117. package/dist/components/text.js.map +1 -0
  118. package/dist/components/textarea.d.ts +10 -0
  119. package/dist/components/textarea.d.ts.map +1 -0
  120. package/dist/components/textarea.js +79 -0
  121. package/dist/components/textarea.js.map +1 -0
  122. package/dist/core/colors.d.ts +45 -0
  123. package/dist/core/colors.d.ts.map +1 -0
  124. package/dist/core/colors.js +93 -0
  125. package/dist/core/colors.js.map +1 -0
  126. package/dist/core/css.d.ts +20 -0
  127. package/dist/core/css.d.ts.map +1 -0
  128. package/dist/core/css.js +97 -0
  129. package/dist/core/css.js.map +1 -0
  130. package/dist/core/exceptions.d.ts +59 -0
  131. package/dist/core/exceptions.d.ts.map +1 -0
  132. package/dist/core/exceptions.js +100 -0
  133. package/dist/core/exceptions.js.map +1 -0
  134. package/dist/core/formatting.d.ts +53 -0
  135. package/dist/core/formatting.d.ts.map +1 -0
  136. package/dist/core/formatting.js +491 -0
  137. package/dist/core/formatting.js.map +1 -0
  138. package/dist/core/index.d.ts +10 -0
  139. package/dist/core/index.d.ts.map +1 -0
  140. package/dist/core/index.js +10 -0
  141. package/dist/core/index.js.map +1 -0
  142. package/dist/core/serializer.d.ts +29 -0
  143. package/dist/core/serializer.d.ts.map +1 -0
  144. package/dist/core/serializer.js +84 -0
  145. package/dist/core/serializer.js.map +1 -0
  146. package/dist/core/themes.d.ts +138 -0
  147. package/dist/core/themes.d.ts.map +1 -0
  148. package/dist/core/themes.js +484 -0
  149. package/dist/core/themes.js.map +1 -0
  150. package/dist/core/version-check.d.ts +23 -0
  151. package/dist/core/version-check.d.ts.map +1 -0
  152. package/dist/core/version-check.js +163 -0
  153. package/dist/core/version-check.js.map +1 -0
  154. package/dist/generate_test_harness.d.ts +13 -0
  155. package/dist/generate_test_harness.d.ts.map +1 -0
  156. package/dist/generate_test_harness.js +35 -0
  157. package/dist/generate_test_harness.js.map +1 -0
  158. package/dist/index.d.ts +17 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +19 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/layout/converter.d.ts +22 -0
  163. package/dist/layout/converter.d.ts.map +1 -0
  164. package/dist/layout/converter.js +46 -0
  165. package/dist/layout/converter.js.map +1 -0
  166. package/dist/layout/csv.d.ts +15 -0
  167. package/dist/layout/csv.d.ts.map +1 -0
  168. package/dist/layout/csv.js +88 -0
  169. package/dist/layout/csv.js.map +1 -0
  170. package/dist/layout/dispatcher.d.ts +13 -0
  171. package/dist/layout/dispatcher.d.ts.map +1 -0
  172. package/dist/layout/dispatcher.js +47 -0
  173. package/dist/layout/dispatcher.js.map +1 -0
  174. package/dist/layout/index.d.ts +8 -0
  175. package/dist/layout/index.d.ts.map +1 -0
  176. package/dist/layout/index.js +8 -0
  177. package/dist/layout/index.js.map +1 -0
  178. package/dist/layout/parser.d.ts +19 -0
  179. package/dist/layout/parser.d.ts.map +1 -0
  180. package/dist/layout/parser.js +888 -0
  181. package/dist/layout/parser.js.map +1 -0
  182. package/dist/layout/templates.d.ts +32 -0
  183. package/dist/layout/templates.d.ts.map +1 -0
  184. package/dist/layout/templates.js +1016 -0
  185. package/dist/layout/templates.js.map +1 -0
  186. package/dist/types.d.ts +144 -0
  187. package/dist/types.d.ts.map +1 -0
  188. package/dist/types.js +5 -0
  189. package/dist/types.js.map +1 -0
  190. package/dist/vitest.config.d.ts +3 -0
  191. package/dist/vitest.config.d.ts.map +1 -0
  192. package/dist/vitest.config.js +14 -0
  193. package/dist/vitest.config.js.map +1 -0
  194. package/package.json +79 -0
@@ -0,0 +1,491 @@
1
+ /**
2
+ * Number formatting utilities for mviz
3
+ */
4
+ /**
5
+ * Format a number according to the specified format type
6
+ * @param showSign - If true, prefix positive numbers with +
7
+ */
8
+ export function formatNumber(value, format, showSign = false) {
9
+ if (value === null || value === undefined || isNaN(value)) {
10
+ return '';
11
+ }
12
+ const fmt = format ?? 'auto';
13
+ let result;
14
+ switch (fmt) {
15
+ case 'auto':
16
+ result = smartFormatNumber(value, false);
17
+ break;
18
+ case 'usd_auto':
19
+ result = smartFormatNumber(value, true);
20
+ break;
21
+ case 'usd':
22
+ result = formatUsd(value);
23
+ break;
24
+ case 'usd0k':
25
+ result = formatUsd0k(value);
26
+ break;
27
+ case 'usd0m':
28
+ result = formatUsd0m(value);
29
+ break;
30
+ case 'usd0b':
31
+ result = formatUsd0b(value);
32
+ break;
33
+ case 'pct':
34
+ case 'pct1':
35
+ result = formatPct1(value);
36
+ break;
37
+ case 'pct0':
38
+ result = formatPct0(value);
39
+ break;
40
+ case 'num0':
41
+ result = formatNum0(value);
42
+ break;
43
+ case 'num1':
44
+ result = formatNum1(value);
45
+ break;
46
+ case 'num0k':
47
+ result = formatNum0k(value);
48
+ break;
49
+ case 'num0m':
50
+ result = formatNum0m(value);
51
+ break;
52
+ case 'num0b':
53
+ result = formatNum0b(value);
54
+ break;
55
+ default:
56
+ result = smartFormatNumber(value, false);
57
+ }
58
+ // Add + sign for positive numbers if requested (and not already using parentheses for negatives)
59
+ if (showSign && value > 0 && !result.startsWith('(')) {
60
+ result = '+' + result;
61
+ }
62
+ return result;
63
+ }
64
+ /**
65
+ * Smart auto-format based on magnitude, always showing ~4 significant digits.
66
+ * Matches Python's smart_format_number behavior.
67
+ */
68
+ function smartFormatNumber(value, isCurrency) {
69
+ const isNegative = value < 0;
70
+ const absValue = Math.abs(value);
71
+ const prefix = isCurrency ? '$' : '';
72
+ let formatted;
73
+ if (absValue >= 1_000_000_000) {
74
+ // Billions: 1.000b, 10.00b, 100.0b
75
+ const scaled = absValue / 1_000_000_000;
76
+ if (scaled >= 100) {
77
+ formatted = prefix + scaled.toFixed(1) + 'b';
78
+ }
79
+ else if (scaled >= 10) {
80
+ formatted = prefix + scaled.toFixed(2) + 'b';
81
+ }
82
+ else {
83
+ formatted = prefix + scaled.toFixed(3) + 'b';
84
+ }
85
+ }
86
+ else if (absValue >= 1_000_000) {
87
+ // Millions: 1.000m, 10.00m, 100.0m
88
+ const scaled = absValue / 1_000_000;
89
+ if (scaled >= 100) {
90
+ formatted = prefix + scaled.toFixed(1) + 'm';
91
+ }
92
+ else if (scaled >= 10) {
93
+ formatted = prefix + scaled.toFixed(2) + 'm';
94
+ }
95
+ else {
96
+ formatted = prefix + scaled.toFixed(3) + 'm';
97
+ }
98
+ }
99
+ else if (absValue >= 10_000) {
100
+ // Thousands: 10.00k, 100.0k
101
+ const scaled = absValue / 1_000;
102
+ if (scaled >= 100) {
103
+ formatted = prefix + scaled.toFixed(1) + 'k';
104
+ }
105
+ else {
106
+ formatted = prefix + scaled.toFixed(2) + 'k';
107
+ }
108
+ }
109
+ else if (absValue >= 1_000) {
110
+ // 1,000 - 9,999: use comma formatting
111
+ formatted = prefix + absValue.toLocaleString('en-US', { maximumFractionDigits: 0 });
112
+ }
113
+ else {
114
+ // Under 1,000: simple number
115
+ if (absValue === Math.floor(absValue)) {
116
+ formatted = prefix + absValue.toString();
117
+ }
118
+ else {
119
+ formatted = prefix + absValue.toFixed(2);
120
+ }
121
+ }
122
+ return isNegative ? `(${formatted})` : formatted;
123
+ }
124
+ /**
125
+ * Format as USD: $1,250,000
126
+ */
127
+ function formatUsd(value) {
128
+ const isNegative = value < 0;
129
+ const absValue = Math.abs(value);
130
+ const formatted = '$' + absValue.toLocaleString('en-US', { maximumFractionDigits: 0 });
131
+ return isNegative ? `(${formatted})` : formatted;
132
+ }
133
+ /**
134
+ * Format as USD with k suffix: $125k
135
+ */
136
+ function formatUsd0k(value) {
137
+ const isNegative = value < 0;
138
+ const absValue = Math.abs(value);
139
+ const formatted = '$' + Math.round(absValue / 1_000) + 'k';
140
+ return isNegative ? `(${formatted})` : formatted;
141
+ }
142
+ /**
143
+ * Format as USD with m suffix: $1.2m
144
+ */
145
+ function formatUsd0m(value) {
146
+ const isNegative = value < 0;
147
+ const absValue = Math.abs(value);
148
+ const formatted = '$' + (absValue / 1_000_000).toFixed(1) + 'm';
149
+ return isNegative ? `(${formatted})` : formatted;
150
+ }
151
+ /**
152
+ * Format as USD with b suffix: $1.2b
153
+ */
154
+ function formatUsd0b(value) {
155
+ const isNegative = value < 0;
156
+ const absValue = Math.abs(value);
157
+ const formatted = '$' + (absValue / 1_000_000_000).toFixed(1) + 'b';
158
+ return isNegative ? `(${formatted})` : formatted;
159
+ }
160
+ /**
161
+ * Format as percentage with 1 decimal: 15.0%
162
+ */
163
+ function formatPct1(value) {
164
+ return (value * 100).toFixed(1) + '%';
165
+ }
166
+ /**
167
+ * Format as percentage with 0 decimals: 15%
168
+ */
169
+ function formatPct0(value) {
170
+ return Math.round(value * 100) + '%';
171
+ }
172
+ /**
173
+ * Format as number with 0 decimals: 1,250
174
+ */
175
+ function formatNum0(value) {
176
+ return Math.round(value).toLocaleString('en-US');
177
+ }
178
+ /**
179
+ * Format as number with 1 decimal: 1,250.0
180
+ */
181
+ function formatNum1(value) {
182
+ return value.toLocaleString('en-US', {
183
+ minimumFractionDigits: 1,
184
+ maximumFractionDigits: 1,
185
+ });
186
+ }
187
+ /**
188
+ * Format as number with k suffix: 125k
189
+ */
190
+ function formatNum0k(value) {
191
+ const isNegative = value < 0;
192
+ const absValue = Math.abs(value);
193
+ const formatted = Math.round(absValue / 1_000) + 'k';
194
+ return isNegative ? `(${formatted})` : formatted;
195
+ }
196
+ /**
197
+ * Format as number with m suffix: 1.2m
198
+ */
199
+ function formatNum0m(value) {
200
+ const isNegative = value < 0;
201
+ const absValue = Math.abs(value);
202
+ const formatted = (absValue / 1_000_000).toFixed(1) + 'm';
203
+ return isNegative ? `(${formatted})` : formatted;
204
+ }
205
+ /**
206
+ * Format as number with b suffix: 1.2b
207
+ */
208
+ function formatNum0b(value) {
209
+ const isNegative = value < 0;
210
+ const absValue = Math.abs(value);
211
+ const formatted = (absValue / 1_000_000_000).toFixed(1) + 'b';
212
+ return isNegative ? `(${formatted})` : formatted;
213
+ }
214
+ /**
215
+ * Infer format type from field name and sample value
216
+ */
217
+ export function inferFormat(fieldName, value) {
218
+ const name = fieldName.toLowerCase();
219
+ // Check for percentage patterns first (most specific)
220
+ // Differentiate between pct (0-1 values) and pct0 (0-100 values) like Python
221
+ if (isPercentageField(name)) {
222
+ if (value !== undefined) {
223
+ const absVal = Math.abs(value);
224
+ if (absVal >= 0 && absVal <= 1) {
225
+ return 'pct';
226
+ }
227
+ else if (absVal >= 0 && absVal <= 100) {
228
+ return 'pct0';
229
+ }
230
+ }
231
+ return 'pct'; // Default to pct if no value to check
232
+ }
233
+ // Check for currency patterns - always return usd_auto like Python
234
+ if (isCurrencyField(name)) {
235
+ return 'usd_auto';
236
+ }
237
+ return 'auto';
238
+ }
239
+ /**
240
+ * Check if field name suggests currency
241
+ */
242
+ export function isCurrencyField(fieldName) {
243
+ const patterns = [
244
+ 'revenue',
245
+ 'sales',
246
+ 'cost',
247
+ 'price',
248
+ 'amount',
249
+ 'total',
250
+ 'budget',
251
+ 'spend',
252
+ 'income',
253
+ 'profit',
254
+ 'loss',
255
+ 'margin',
256
+ 'usd',
257
+ 'dollar',
258
+ 'fee',
259
+ 'payment',
260
+ ];
261
+ const name = fieldName.toLowerCase();
262
+ return patterns.some((p) => name.includes(p));
263
+ }
264
+ /**
265
+ * Check if field name suggests percentage
266
+ */
267
+ export function isPercentageField(fieldName) {
268
+ const patterns = ['pct', 'percent', 'rate', 'ratio', 'share', 'proportion'];
269
+ const name = fieldName.toLowerCase();
270
+ return patterns.some((p) => name.includes(p));
271
+ }
272
+ /**
273
+ * Check if field name suggests count/integer
274
+ */
275
+ export function isCountField(fieldName) {
276
+ const patterns = ['count', 'num_', '_num', 'qty', 'quantity', 'users', 'items', 'orders', 'rows'];
277
+ const name = fieldName.toLowerCase();
278
+ return patterns.some((p) => name.includes(p));
279
+ }
280
+ /**
281
+ * Check if a string looks like a parseable date for ECharts time axis.
282
+ * Only ISO dates are reliably parsed by ECharts - short formats like "12/16" are not.
283
+ */
284
+ function looksLikeDate(value) {
285
+ // ISO date pattern: 2024-01-15 or 2024-01-15T10:30:00
286
+ if (/^\d{4}-\d{2}-\d{2}/.test(value)) {
287
+ return true;
288
+ }
289
+ // Unix timestamp (10-13 digits)
290
+ if (/^\d{10,13}$/.test(value)) {
291
+ return true;
292
+ }
293
+ return false;
294
+ }
295
+ /**
296
+ * Check if majority of values look like dates
297
+ */
298
+ function majorityAreDates(values, threshold = 0.8) {
299
+ const sample = values.slice(0, 10).filter((v) => v != null);
300
+ if (sample.length === 0)
301
+ return false;
302
+ const dateCount = sample.filter((v) => typeof v === 'string' && looksLikeDate(v)).length;
303
+ return dateCount >= sample.length * threshold;
304
+ }
305
+ /**
306
+ * Infer axis type from data values
307
+ */
308
+ export function inferAxisType(values) {
309
+ if (values.length === 0) {
310
+ return 'category';
311
+ }
312
+ const sample = values[0];
313
+ // Check if values are dates
314
+ if (typeof sample === 'string') {
315
+ // Check if it looks like a date
316
+ if (looksLikeDate(sample)) {
317
+ // Validate with more samples to avoid false positives
318
+ if (majorityAreDates(values)) {
319
+ return 'time';
320
+ }
321
+ }
322
+ // Unix timestamp (large numbers as strings)
323
+ const num = Number(sample);
324
+ if (!isNaN(num) && num > 1_000_000_000 && num < 2_000_000_000) {
325
+ return 'time';
326
+ }
327
+ return 'category';
328
+ }
329
+ if (typeof sample === 'number') {
330
+ // Unix timestamp
331
+ if (sample > 1_000_000_000 && sample < 2_000_000_000) {
332
+ return 'time';
333
+ }
334
+ return 'value';
335
+ }
336
+ if (sample instanceof Date) {
337
+ return 'time';
338
+ }
339
+ return 'category';
340
+ }
341
+ /**
342
+ * Parse a potentially numeric string to number
343
+ */
344
+ export function parseNumericString(value) {
345
+ if (value === '')
346
+ return value;
347
+ // Try parsing as number
348
+ const num = Number(value);
349
+ if (!isNaN(num)) {
350
+ return num;
351
+ }
352
+ return value;
353
+ }
354
+ /**
355
+ * Generate ECharts formatter expression based on format type.
356
+ * Returns a simple JavaScript expression for inline use.
357
+ */
358
+ export function formatValue(fmt) {
359
+ switch (fmt) {
360
+ case 'usd':
361
+ return "'$' + value.toLocaleString()";
362
+ case 'usd0k':
363
+ return "'$' + (value/1000).toFixed(0) + 'k'";
364
+ case 'usd0m':
365
+ return "'$' + (value/1000000).toFixed(1) + 'm'";
366
+ case 'usd0b':
367
+ return "'$' + (value/1000000000).toFixed(1) + 'b'";
368
+ case 'pct':
369
+ case 'pct1':
370
+ return "(value * 100).toFixed(1) + '%'";
371
+ case 'pct0':
372
+ return "(value * 100).toFixed(0) + '%'";
373
+ case 'num0':
374
+ return "value.toLocaleString()";
375
+ case 'num1':
376
+ return "value.toFixed(1)";
377
+ case 'num0k':
378
+ return "(value/1000).toFixed(0) + 'k'";
379
+ case 'num0m':
380
+ return "(value/1000000).toFixed(1) + 'm'";
381
+ case 'num0b':
382
+ return "(value/1000000000).toFixed(1) + 'b'";
383
+ default:
384
+ return 'value';
385
+ }
386
+ }
387
+ /**
388
+ * Generate an ECharts label formatter function based on format type.
389
+ * Returns a dict with _js_ key containing the formatter function.
390
+ */
391
+ export function getLabelFormatterJs(fmt) {
392
+ if (fmt === null || fmt === undefined) {
393
+ return null;
394
+ }
395
+ // Smart auto-formatting based on magnitude (JavaScript version)
396
+ // Handle both scalar values and [x, y] array format (for time/value axes)
397
+ if (fmt === 'auto' || fmt === 'usd_auto') {
398
+ const isCurrency = fmt === 'usd_auto' ? 'true' : 'false';
399
+ return {
400
+ _js_: `function(params) {
401
+ var v = params.value;
402
+ if (v == null) return '';
403
+ if (Array.isArray(v)) v = v[1];
404
+ var abs = Math.abs(v);
405
+ var neg = v < 0;
406
+ var p = ${isCurrency} ? '$' : '';
407
+ var r;
408
+ if (abs >= 1e9) {
409
+ var s = abs / 1e9;
410
+ r = s >= 100 ? p + s.toFixed(1) + 'b' : s >= 10 ? p + s.toFixed(2) + 'b' : p + s.toFixed(3) + 'b';
411
+ } else if (abs >= 1e6) {
412
+ var s = abs / 1e6;
413
+ r = s >= 100 ? p + s.toFixed(1) + 'm' : s >= 10 ? p + s.toFixed(2) + 'm' : p + s.toFixed(3) + 'm';
414
+ } else if (abs >= 1e4) {
415
+ var s = abs / 1e3;
416
+ r = s >= 100 ? p + s.toFixed(1) + 'k' : p + s.toFixed(2) + 'k';
417
+ } else if (abs >= 1e3) {
418
+ r = p + abs.toLocaleString('en-US', {maximumFractionDigits: 0});
419
+ } else {
420
+ r = abs === Math.floor(abs) ? p + abs : p + abs.toFixed(2);
421
+ }
422
+ return neg ? '(' + r + ')' : r;
423
+ }`,
424
+ };
425
+ }
426
+ // Get the formatting expression for specific formats
427
+ const expr = formatValue(fmt);
428
+ if (expr === 'value') {
429
+ return null;
430
+ }
431
+ // Build the formatter function - ECharts passes params object with value
432
+ // Handle both scalar values and [x, y] array format (for time/value axes)
433
+ return {
434
+ _js_: `function(params) { var value = params.value; if (Array.isArray(value)) value = value[1]; return ${expr}; }`,
435
+ };
436
+ }
437
+ /**
438
+ * Generate an ECharts axis formatter function.
439
+ */
440
+ export function getAxisFormatterJs(fmt) {
441
+ if (fmt === null || fmt === undefined) {
442
+ return null;
443
+ }
444
+ // Smart auto-formatting for axis labels (compact to prevent overlap)
445
+ // Uses 1 decimal for all magnitudes (k, m, b) to prevent duplicate labels
446
+ if (fmt === 'auto' || fmt === 'usd_auto') {
447
+ const isCurrency = fmt === 'usd_auto' ? 'true' : 'false';
448
+ return {
449
+ _js_: `function(value) {
450
+ if (value == null) return '';
451
+ var abs = Math.abs(value);
452
+ var neg = value < 0;
453
+ var p = ${isCurrency} ? '$' : '';
454
+ var r;
455
+ if (abs >= 1e9) {
456
+ var s = abs / 1e9;
457
+ r = p + s.toFixed(1) + 'b';
458
+ } else if (abs >= 1e6) {
459
+ var s = abs / 1e6;
460
+ r = p + s.toFixed(1) + 'm';
461
+ } else if (abs >= 1e3) {
462
+ var s = abs / 1e3;
463
+ r = p + s.toFixed(1) + 'k';
464
+ } else {
465
+ r = abs === Math.floor(abs) ? p + Math.floor(abs) : p + abs.toFixed(1);
466
+ }
467
+ return neg ? '(' + r + ')' : r;
468
+ }`,
469
+ };
470
+ }
471
+ // For percentage, multiply by 100
472
+ if (fmt === 'pct' || fmt === 'pct1') {
473
+ return {
474
+ _js_: `function(value) { return (value * 100).toFixed(1) + '%'; }`,
475
+ };
476
+ }
477
+ if (fmt === 'pct0') {
478
+ return {
479
+ _js_: `function(value) { return (value * 100).toFixed(0) + '%'; }`,
480
+ };
481
+ }
482
+ // Get the formatting expression for specific formats
483
+ const expr = formatValue(fmt);
484
+ if (expr === 'value') {
485
+ return null;
486
+ }
487
+ return {
488
+ _js_: `function(value) { return ${expr}; }`,
489
+ };
490
+ }
491
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../core/formatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export * from './themes.js';
5
+ export * from './formatting.js';
6
+ export * from './colors.js';
7
+ export * from './css.js';
8
+ export * from './exceptions.js';
9
+ export * from './serializer.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Core module exports
3
+ */
4
+ export * from './themes.js';
5
+ export * from './formatting.js';
6
+ export * from './colors.js';
7
+ export * from './css.js';
8
+ export * from './exceptions.js';
9
+ export * from './serializer.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * JSON serialization with JavaScript function embedding for ECharts
3
+ */
4
+ /**
5
+ * Special markers for JS functions that need to be embedded in JSON
6
+ */
7
+ export declare const JS_MARKERS: {
8
+ readonly SYMBOL_SIZE_FUNC: "__SYMBOL_SIZE_FUNC__";
9
+ readonly XMR_TOOLTIP_FORMATTER: "__XMR_TOOLTIP_FORMATTER__";
10
+ readonly LABEL_FORMATTER: "__LABEL_FORMATTER__";
11
+ };
12
+ /**
13
+ * Serialize ECharts option to JSON with embedded JS functions
14
+ *
15
+ * Handles special markers like __SYMBOL_SIZE_FUNC__ and replaces them
16
+ * with actual JavaScript function code.
17
+ */
18
+ export declare function serializeOption(option: Record<string, unknown>): string;
19
+ /**
20
+ * Create a JS function marker for embedding in options
21
+ */
22
+ export declare function createJsFunction(code: string): {
23
+ _js_: string;
24
+ };
25
+ /**
26
+ * Wrap a chart in a complete HTML page
27
+ */
28
+ export declare function wrapHtml(chartId: string, option: Record<string, unknown>, css: string, width: string, height: number): string;
29
+ //# sourceMappingURL=serializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../core/serializer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU;;;;CAIb,CAAC;AAqBX;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAkBvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAE/D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAuBR"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * JSON serialization with JavaScript function embedding for ECharts
3
+ */
4
+ /**
5
+ * Special markers for JS functions that need to be embedded in JSON
6
+ */
7
+ export const JS_MARKERS = {
8
+ SYMBOL_SIZE_FUNC: '__SYMBOL_SIZE_FUNC__',
9
+ XMR_TOOLTIP_FORMATTER: '__XMR_TOOLTIP_FORMATTER__',
10
+ LABEL_FORMATTER: '__LABEL_FORMATTER__',
11
+ };
12
+ /**
13
+ * JavaScript function definitions to inject
14
+ */
15
+ const JS_FUNCTIONS = {
16
+ [JS_MARKERS.SYMBOL_SIZE_FUNC]: `function(data) {
17
+ var size = data[2];
18
+ return Math.sqrt(size) * 2 + 4;
19
+ }`,
20
+ [JS_MARKERS.XMR_TOOLTIP_FORMATTER]: `function(params) {
21
+ var lines = params.map(function(p) {
22
+ return p.marker + ' ' + p.seriesName + ': ' + p.value[1].toFixed(2);
23
+ });
24
+ return params[0].value[0] + '<br/>' + lines.join('<br/>');
25
+ }`,
26
+ [JS_MARKERS.LABEL_FORMATTER]: `function(params) {
27
+ return params.value;
28
+ }`,
29
+ };
30
+ /**
31
+ * Serialize ECharts option to JSON with embedded JS functions
32
+ *
33
+ * Handles special markers like __SYMBOL_SIZE_FUNC__ and replaces them
34
+ * with actual JavaScript function code.
35
+ */
36
+ export function serializeOption(option) {
37
+ let json = JSON.stringify(option, null, 2);
38
+ // Replace markers with actual JS functions
39
+ for (const [marker, func] of Object.entries(JS_FUNCTIONS)) {
40
+ // Match both quoted and unquoted markers
41
+ const quotedPattern = new RegExp(`"${marker}"`, 'g');
42
+ json = json.replace(quotedPattern, func);
43
+ }
44
+ // Handle inline JS function objects: {"_js_": "function..."}
45
+ const jsObjectPattern = /\{\s*"_js_"\s*:\s*"([^"]+)"\s*\}/g;
46
+ json = json.replace(jsObjectPattern, (_match, funcBody) => {
47
+ // Unescape the function body
48
+ return funcBody.replace(/\\n/g, '\n').replace(/\\"/g, '"');
49
+ });
50
+ return json;
51
+ }
52
+ /**
53
+ * Create a JS function marker for embedding in options
54
+ */
55
+ export function createJsFunction(code) {
56
+ return { _js_: code };
57
+ }
58
+ /**
59
+ * Wrap a chart in a complete HTML page
60
+ */
61
+ export function wrapHtml(chartId, option, css, width, height) {
62
+ const optionJson = serializeOption(option);
63
+ return `<!DOCTYPE html>
64
+ <html lang="en">
65
+ <head>
66
+ <meta charset="UTF-8">
67
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
68
+ <script src="https://cdn.jsdelivr.net/npm/echarts@5.5.0/dist/echarts.min.js"></script>
69
+ <style>
70
+ ${css}
71
+ </style>
72
+ </head>
73
+ <body>
74
+ <div id="${chartId}" style="width: ${width}; height: ${height}px;"></div>
75
+ <script>
76
+ var chart = echarts.init(document.getElementById('${chartId}'), null, {renderer: 'svg'});
77
+ var option = ${optionJson};
78
+ chart.setOption(option);
79
+ window.addEventListener('resize', function() { chart.resize(); });
80
+ </script>
81
+ </body>
82
+ </html>`;
83
+ }
84
+ //# sourceMappingURL=serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../core/serializer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,gBAAgB,EAAE,sBAAsB;IACxC,qBAAqB,EAAE,2BAA2B;IAClD,eAAe,EAAE,qBAAqB;CAC9B,CAAC;AAEX;;GAEG;AACH,MAAM,YAAY,GAA2B;IAC3C,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;;;IAG7B;IACF,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE;;;;;IAKlC;IACF,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE;;IAE5B;CACH,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAA+B;IAC7D,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE3C,2CAA2C;IAC3C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1D,yCAAyC;QACzC,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,6DAA6D;IAC7D,MAAM,eAAe,GAAG,mCAAmC,CAAC;IAC5D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,QAAgB,EAAE,EAAE;QAChE,6BAA6B;QAC7B,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,OAAe,EACf,MAA+B,EAC/B,GAAW,EACX,KAAa,EACb,MAAc;IAEd,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE3C,OAAO;;;;;;;MAOH,GAAG;;;;aAII,OAAO,mBAAmB,KAAK,aAAa,MAAM;;wDAEP,OAAO;mBAC5C,UAAU;;;;;QAKrB,CAAC;AACT,CAAC"}