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,163 @@
1
+ /**
2
+ * Version check utility for mviz CLI
3
+ *
4
+ * Checks npm registry for newer versions and notifies users.
5
+ * Caches results to avoid slowing down normal usage.
6
+ */
7
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
8
+ import { homedir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ const PACKAGE_NAME = 'mviz';
11
+ const CACHE_DIR = join(homedir(), '.mviz');
12
+ const CACHE_FILE = join(CACHE_DIR, 'version-check.json');
13
+ const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
14
+ /**
15
+ * Get the current package version from package.json
16
+ */
17
+ export function getCurrentVersion() {
18
+ // In production, this would read from the installed package
19
+ // For now, we hardcode or read from a known location
20
+ try {
21
+ // Try to find package.json relative to this file
22
+ const packageJsonPaths = [
23
+ join(__dirname, '..', 'package.json'),
24
+ join(__dirname, '..', '..', 'package.json'),
25
+ ];
26
+ for (const path of packageJsonPaths) {
27
+ if (existsSync(path)) {
28
+ const pkg = JSON.parse(readFileSync(path, 'utf8'));
29
+ if (pkg.version) {
30
+ return pkg.version;
31
+ }
32
+ }
33
+ }
34
+ }
35
+ catch {
36
+ // Ignore errors
37
+ }
38
+ return '0.0.0';
39
+ }
40
+ /**
41
+ * Read cached version check data
42
+ */
43
+ function readCache() {
44
+ try {
45
+ if (existsSync(CACHE_FILE)) {
46
+ return JSON.parse(readFileSync(CACHE_FILE, 'utf8'));
47
+ }
48
+ }
49
+ catch {
50
+ // Ignore cache read errors
51
+ }
52
+ return null;
53
+ }
54
+ /**
55
+ * Write version check data to cache
56
+ */
57
+ function writeCache(data) {
58
+ try {
59
+ if (!existsSync(CACHE_DIR)) {
60
+ mkdirSync(CACHE_DIR, { recursive: true });
61
+ }
62
+ writeFileSync(CACHE_FILE, JSON.stringify(data));
63
+ }
64
+ catch {
65
+ // Ignore cache write errors
66
+ }
67
+ }
68
+ /**
69
+ * Fetch the latest version from npm registry
70
+ */
71
+ async function fetchLatestVersion() {
72
+ try {
73
+ const controller = new AbortController();
74
+ const timeout = setTimeout(() => controller.abort(), 3000); // 3 second timeout
75
+ const response = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}`, {
76
+ signal: controller.signal,
77
+ headers: {
78
+ Accept: 'application/json',
79
+ },
80
+ });
81
+ clearTimeout(timeout);
82
+ if (!response.ok) {
83
+ return null;
84
+ }
85
+ const data = (await response.json());
86
+ return data['dist-tags']?.latest ?? null;
87
+ }
88
+ catch {
89
+ // Network errors, timeouts, etc. - fail silently
90
+ return null;
91
+ }
92
+ }
93
+ /**
94
+ * Compare two semver versions
95
+ * Returns true if latest > current
96
+ */
97
+ function isNewerVersion(current, latest) {
98
+ const currentParts = current.split('.').map(Number);
99
+ const latestParts = latest.split('.').map(Number);
100
+ for (let i = 0; i < 3; i++) {
101
+ const c = currentParts[i] ?? 0;
102
+ const l = latestParts[i] ?? 0;
103
+ if (l > c)
104
+ return true;
105
+ if (l < c)
106
+ return false;
107
+ }
108
+ return false;
109
+ }
110
+ /**
111
+ * Check for updates and return notification message if available
112
+ *
113
+ * This function is designed to be non-blocking and fast.
114
+ * It uses cached results when possible and checks in the background.
115
+ */
116
+ export async function checkForUpdates() {
117
+ const currentVersion = getCurrentVersion();
118
+ const cache = readCache();
119
+ // Check if we should use cached result
120
+ if (cache && Date.now() - cache.lastCheck < CHECK_INTERVAL_MS) {
121
+ if (cache.latestVersion && isNewerVersion(currentVersion, cache.latestVersion)) {
122
+ return formatUpdateMessage(currentVersion, cache.latestVersion);
123
+ }
124
+ return null;
125
+ }
126
+ // Fetch latest version (with timeout to not slow things down)
127
+ const latestVersion = await fetchLatestVersion();
128
+ // Update cache
129
+ writeCache({
130
+ lastCheck: Date.now(),
131
+ latestVersion,
132
+ });
133
+ if (latestVersion && isNewerVersion(currentVersion, latestVersion)) {
134
+ return formatUpdateMessage(currentVersion, latestVersion);
135
+ }
136
+ return null;
137
+ }
138
+ /**
139
+ * Format the update notification message
140
+ */
141
+ function formatUpdateMessage(current, latest) {
142
+ return `\nNote: mviz ${latest} is available (you have ${current}).\n Run: npm install -g mviz\n`;
143
+ }
144
+ /**
145
+ * Check for updates in the background (fire-and-forget)
146
+ * Prints notification to stderr if update is available
147
+ */
148
+ export function checkForUpdatesBackground() {
149
+ // Don't check if NO_UPDATE_CHECK env var is set
150
+ if (process.env.NO_UPDATE_CHECK || process.env.CI) {
151
+ return;
152
+ }
153
+ checkForUpdates()
154
+ .then((message) => {
155
+ if (message) {
156
+ process.stderr.write(message);
157
+ }
158
+ })
159
+ .catch(() => {
160
+ // Silently ignore errors
161
+ });
162
+ }
163
+ //# sourceMappingURL=version-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../core/version-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Generate a comprehensive test harness using the markdown layout system.
4
+ *
5
+ * This script reads test markdown files that demonstrate how an LLM would write
6
+ * charts following the documentation, then generates a test harness HTML using
7
+ * the parser's test mode feature.
8
+ *
9
+ * Usage:
10
+ * npx tsx ts-src/generate_test_harness.ts > test_harness_ts.html
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=generate_test_harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate_test_harness.d.ts","sourceRoot":"","sources":["../generate_test_harness.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Generate a comprehensive test harness using the markdown layout system.
4
+ *
5
+ * This script reads test markdown files that demonstrate how an LLM would write
6
+ * charts following the documentation, then generates a test harness HTML using
7
+ * the parser's test mode feature.
8
+ *
9
+ * Usage:
10
+ * npx tsx ts-src/generate_test_harness.ts > test_harness_ts.html
11
+ */
12
+ import { readFileSync } from 'fs';
13
+ import { resolve, dirname } from 'path';
14
+ import { fileURLToPath } from 'url';
15
+ import { parseMarkdownToTestHarness } from './layout/parser.js';
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
18
+ function generateTestHarness() {
19
+ // Read the test dashboard markdown
20
+ // When running from ts-src/dist, need to go up two levels to reach root
21
+ const testDir = resolve(__dirname, '..', '..', 'tests', 'harness');
22
+ const dashboardPath = resolve(testDir, 'test_dashboard.md');
23
+ let markdown;
24
+ try {
25
+ markdown = readFileSync(dashboardPath, 'utf-8');
26
+ }
27
+ catch (error) {
28
+ throw new Error(`Test dashboard not found: ${dashboardPath}`);
29
+ }
30
+ // Generate HTML using test harness renderer
31
+ return parseMarkdownToTestHarness(markdown, 'light', testDir);
32
+ }
33
+ // Main
34
+ console.log(generateTestHarness());
35
+ //# sourceMappingURL=generate_test_harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate_test_harness.js","sourceRoot":"","sources":["../generate_test_harness.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,mBAAmB;IAC1B,mCAAmC;IACnC,wEAAwE;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAE5D,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,aAAa,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,4CAA4C;IAC5C,OAAO,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED,OAAO;AACP,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * mviz - Generate clean, data-focused charts and dashboards
3
+ *
4
+ * Main entry point for library usage.
5
+ */
6
+ export { formatNumber, inferFormat, inferAxisType } from './core/formatting.js';
7
+ export { getThemeColors, getTooltipConfig, getBaseOption } from './core/themes.js';
8
+ export { hexToRgb, rgbToHex, getContrastingTextColor } from './core/colors.js';
9
+ export { ChartGeneratorError, FileLoadError, InvalidJSONError, UnknownComponentType, } from './core/exceptions.js';
10
+ export { generateChart } from './layout/dispatcher.js';
11
+ export { convertColumnarFormat } from './layout/converter.js';
12
+ export { parseMarkdownLayout, parseMarkdownToDashboard, parseMarkdownToTestHarness } from './layout/parser.js';
13
+ export { generateDashboardHtml, generateTestHarnessHtml } from './layout/templates.js';
14
+ export { CHART_REGISTRY, registerChart } from './charts/registry.js';
15
+ export { COMPONENT_REGISTRY, registerComponent } from './components/registry.js';
16
+ export type { ChartSpec, DataPoint, ThemeColors, FormatType, DashboardSpec, ComponentSpec, } from './types.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGvF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGjF,YAAY,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,GACd,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * mviz - Generate clean, data-focused charts and dashboards
3
+ *
4
+ * Main entry point for library usage.
5
+ */
6
+ // Re-export core utilities
7
+ export { formatNumber, inferFormat, inferAxisType } from './core/formatting.js';
8
+ export { getThemeColors, getTooltipConfig, getBaseOption } from './core/themes.js';
9
+ export { hexToRgb, rgbToHex, getContrastingTextColor } from './core/colors.js';
10
+ export { ChartGeneratorError, FileLoadError, InvalidJSONError, UnknownComponentType, } from './core/exceptions.js';
11
+ // Re-export layout utilities
12
+ export { generateChart } from './layout/dispatcher.js';
13
+ export { convertColumnarFormat } from './layout/converter.js';
14
+ export { parseMarkdownLayout, parseMarkdownToDashboard, parseMarkdownToTestHarness } from './layout/parser.js';
15
+ export { generateDashboardHtml, generateTestHarnessHtml } from './layout/templates.js';
16
+ // Re-export registries for extensibility
17
+ export { CHART_REGISTRY, registerChart } from './charts/registry.js';
18
+ export { COMPONENT_REGISTRY, registerComponent } from './components/registry.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,2BAA2B;AAC3B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,6BAA6B;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEvF,yCAAyC;AACzC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Data format converter for mviz
3
+ *
4
+ * Converts columnar format (from DuckDB/MotherDuck) to standard format.
5
+ */
6
+ import type { ChartSpec } from '../types.js';
7
+ /**
8
+ * Convert columnar format to standard data array format
9
+ *
10
+ * Input:
11
+ * { columns: ["category", "sales"], rows: [["Electronics", 45000], ["Clothing", 32000]] }
12
+ *
13
+ * Output:
14
+ * { data: [{category: "Electronics", sales: 45000}, {category: "Clothing", sales: 32000}] }
15
+ */
16
+ export declare function convertColumnarFormat(spec: ChartSpec): ChartSpec;
17
+ /**
18
+ * Alias for backward compatibility
19
+ * @deprecated Use convertColumnarFormat instead
20
+ */
21
+ export declare const convertMotherduckFormat: typeof convertColumnarFormat;
22
+ //# sourceMappingURL=converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../layout/converter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAA2B,MAAM,aAAa,CAAC;AActE;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAmBhE;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,8BAAwB,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Data format converter for mviz
3
+ *
4
+ * Converts columnar format (from DuckDB/MotherDuck) to standard format.
5
+ */
6
+ /**
7
+ * Check if spec is in columnar format
8
+ */
9
+ function isColumnarFormat(spec) {
10
+ return ('columns' in spec &&
11
+ 'rows' in spec &&
12
+ Array.isArray(spec.columns) &&
13
+ Array.isArray(spec.rows));
14
+ }
15
+ /**
16
+ * Convert columnar format to standard data array format
17
+ *
18
+ * Input:
19
+ * { columns: ["category", "sales"], rows: [["Electronics", 45000], ["Clothing", 32000]] }
20
+ *
21
+ * Output:
22
+ * { data: [{category: "Electronics", sales: 45000}, {category: "Clothing", sales: 32000}] }
23
+ */
24
+ export function convertColumnarFormat(spec) {
25
+ if (!isColumnarFormat(spec)) {
26
+ return spec;
27
+ }
28
+ const { columns, rows, ...rest } = spec;
29
+ const data = rows.map((row) => {
30
+ const obj = {};
31
+ columns.forEach((col, i) => {
32
+ obj[col] = row[i];
33
+ });
34
+ return obj;
35
+ });
36
+ return {
37
+ ...rest,
38
+ data,
39
+ };
40
+ }
41
+ /**
42
+ * Alias for backward compatibility
43
+ * @deprecated Use convertColumnarFormat instead
44
+ */
45
+ export const convertMotherduckFormat = convertColumnarFormat;
46
+ //# sourceMappingURL=converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converter.js","sourceRoot":"","sources":["../../layout/converter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAA8B;IACtD,OAAO,CACL,SAAS,IAAI,IAAI;QACjB,MAAM,IAAI,IAAI;QACd,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CACzB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAe;IACnD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAExC,MAAM,IAAI,GAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,MAAM,GAAG,GAAc,EAAE,CAAC;QAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACzB,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,IAAI;QACP,IAAI;KACQ,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * CSV parser for mviz
3
+ *
4
+ * Parses CSV files into chart data format.
5
+ */
6
+ /**
7
+ * Parse a CSV string into an array of objects.
8
+ * Automatically converts numeric strings to numbers.
9
+ */
10
+ export declare function parseCsvString(csvContent: string): Record<string, unknown>[];
11
+ /**
12
+ * Load and parse a CSV file.
13
+ */
14
+ export declare function parseCsv(filePath: string): Record<string, unknown>[];
15
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../layout/csv.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAyB5E;AAmDD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAGpE"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * CSV parser for mviz
3
+ *
4
+ * Parses CSV files into chart data format.
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ /**
8
+ * Parse a CSV string into an array of objects.
9
+ * Automatically converts numeric strings to numbers.
10
+ */
11
+ export function parseCsvString(csvContent) {
12
+ const lines = csvContent.trim().split('\n');
13
+ if (lines.length < 2)
14
+ return [];
15
+ // Parse header row
16
+ const headers = parseRow(lines[0]);
17
+ const data = [];
18
+ // Parse data rows
19
+ for (let i = 1; i < lines.length; i++) {
20
+ const values = parseRow(lines[i]);
21
+ const row = {};
22
+ for (let j = 0; j < headers.length; j++) {
23
+ const header = headers[j];
24
+ const value = values[j] ?? '';
25
+ // Try to convert to number
26
+ row[header] = convertValue(value);
27
+ }
28
+ data.push(row);
29
+ }
30
+ return data;
31
+ }
32
+ /**
33
+ * Parse a single CSV row, handling quoted values.
34
+ */
35
+ function parseRow(line) {
36
+ const values = [];
37
+ let current = '';
38
+ let inQuotes = false;
39
+ for (let i = 0; i < line.length; i++) {
40
+ const char = line[i];
41
+ if (char === '"') {
42
+ if (inQuotes && line[i + 1] === '"') {
43
+ // Escaped quote
44
+ current += '"';
45
+ i++;
46
+ }
47
+ else {
48
+ inQuotes = !inQuotes;
49
+ }
50
+ }
51
+ else if (char === ',' && !inQuotes) {
52
+ values.push(current.trim());
53
+ current = '';
54
+ }
55
+ else {
56
+ current += char;
57
+ }
58
+ }
59
+ values.push(current.trim());
60
+ return values;
61
+ }
62
+ /**
63
+ * Convert a string value to number if possible.
64
+ */
65
+ function convertValue(value) {
66
+ if (value === '')
67
+ return value;
68
+ // Try to convert to number
69
+ if (value.includes('.')) {
70
+ const num = parseFloat(value);
71
+ if (!isNaN(num))
72
+ return num;
73
+ }
74
+ else {
75
+ const num = parseInt(value, 10);
76
+ if (!isNaN(num) && String(num) === value)
77
+ return num;
78
+ }
79
+ return value;
80
+ }
81
+ /**
82
+ * Load and parse a CSV file.
83
+ */
84
+ export function parseCsv(filePath) {
85
+ const content = readFileSync(filePath, 'utf-8');
86
+ return parseCsvString(content);
87
+ }
88
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../layout/csv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Main dispatcher for mviz
3
+ *
4
+ * Routes chart/component specs to the appropriate generator.
5
+ */
6
+ import type { ChartSpec, ComponentSpec } from '../types.js';
7
+ import '../charts/index.js';
8
+ import '../components/index.js';
9
+ /**
10
+ * Generate HTML output for a chart or component spec
11
+ */
12
+ export declare function generateChart(spec: ChartSpec | ComponentSpec): string;
13
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../layout/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO5D,OAAO,oBAAoB,CAAC;AAC5B,OAAO,wBAAwB,CAAC;AAoBhC;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,CAoBrE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Main dispatcher for mviz
3
+ *
4
+ * Routes chart/component specs to the appropriate generator.
5
+ */
6
+ import { CHART_REGISTRY } from '../charts/registry.js';
7
+ import { COMPONENT_REGISTRY } from '../components/registry.js';
8
+ import { convertColumnarFormat } from './converter.js';
9
+ import { UnknownComponentType } from '../core/exceptions.js';
10
+ // Import chart and component modules to trigger registration
11
+ import '../charts/index.js';
12
+ import '../components/index.js';
13
+ /**
14
+ * Get similar type names for error suggestions
15
+ */
16
+ function getSimilarTypes(type) {
17
+ const allTypes = [
18
+ ...Array.from(CHART_REGISTRY.keys()),
19
+ ...Array.from(COMPONENT_REGISTRY.keys()),
20
+ ];
21
+ // Simple similarity: types that start with the same letter or contain the input
22
+ return allTypes.filter((t) => t.startsWith(type[0] ?? '') ||
23
+ t.includes(type) ||
24
+ type.includes(t)).slice(0, 3);
25
+ }
26
+ /**
27
+ * Generate HTML output for a chart or component spec
28
+ */
29
+ export function generateChart(spec) {
30
+ // Convert columnar format if needed
31
+ const converted = convertColumnarFormat(spec);
32
+ const type = converted.type;
33
+ // Try chart registry first
34
+ const chartGenerator = CHART_REGISTRY.get(type);
35
+ if (chartGenerator) {
36
+ return chartGenerator(converted);
37
+ }
38
+ // Try component registry
39
+ const componentGenerator = COMPONENT_REGISTRY.get(type);
40
+ if (componentGenerator) {
41
+ return componentGenerator(converted);
42
+ }
43
+ // Unknown type
44
+ const suggestions = getSimilarTypes(type);
45
+ throw new UnknownComponentType(type, suggestions);
46
+ }
47
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../../layout/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,6DAA6D;AAC7D,OAAO,oBAAoB,CAAC;AAC5B,OAAO,wBAAwB,CAAC;AAEhC;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,QAAQ,GAAG;QACf,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACpC,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;KACzC,CAAC;IAEF,gFAAgF;IAChF,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAA+B;IAC3D,oCAAoC;IACpC,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAiB,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAE5B,2BAA2B;IAC3B,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,yBAAyB;IACzB,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,kBAAkB,CAAC,SAA0B,CAAC,CAAC;IACxD,CAAC;IAED,eAAe;IACf,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Layout module exports
3
+ */
4
+ export * from './dispatcher.js';
5
+ export * from './converter.js';
6
+ export * from './parser.js';
7
+ export * from './templates.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../layout/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Layout module exports
3
+ */
4
+ export * from './dispatcher.js';
5
+ export * from './converter.js';
6
+ export * from './parser.js';
7
+ export * from './templates.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../layout/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Markdown dashboard parser for mviz
3
+ *
4
+ * Parses markdown files with embedded chart/component specs and generates HTML.
5
+ */
6
+ import type { DashboardSpec } from '../types.js';
7
+ /**
8
+ * Parse markdown layout and return HTML
9
+ */
10
+ export declare function parseMarkdownToDashboard(markdown: string, baseTheme?: string, _baseDir?: string, strict?: boolean, testMode?: boolean): string;
11
+ /**
12
+ * Parse markdown layout into dashboard spec (legacy API for compatibility)
13
+ */
14
+ export declare function parseMarkdownLayout(markdown: string, _baseDir?: string): DashboardSpec;
15
+ /**
16
+ * Parse markdown into test harness HTML with navigation and summary
17
+ */
18
+ export declare function parseMarkdownToTestHarness(markdown: string, baseTheme?: string, baseDir?: string, strict?: boolean): string;
19
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../layout/parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAC;AAwlB/E;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAAgB,EAC3B,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,GAAE,OAAe,EACvB,QAAQ,GAAE,OAAe,GACxB,MAAM,CAiZR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAYtF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAAgB,EAC3B,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,GAAE,OAAe,GACtB,MAAM,CAER"}