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.
- package/README.md +174 -0
- package/dist/charts/area.d.ts +14 -0
- package/dist/charts/area.d.ts.map +1 -0
- package/dist/charts/area.js +137 -0
- package/dist/charts/area.js.map +1 -0
- package/dist/charts/bar.d.ts +14 -0
- package/dist/charts/bar.d.ts.map +1 -0
- package/dist/charts/bar.js +191 -0
- package/dist/charts/bar.js.map +1 -0
- package/dist/charts/boxplot.d.ts +14 -0
- package/dist/charts/boxplot.d.ts.map +1 -0
- package/dist/charts/boxplot.js +79 -0
- package/dist/charts/boxplot.js.map +1 -0
- package/dist/charts/bubble.d.ts +14 -0
- package/dist/charts/bubble.d.ts.map +1 -0
- package/dist/charts/bubble.js +127 -0
- package/dist/charts/bubble.js.map +1 -0
- package/dist/charts/calendar.d.ts +14 -0
- package/dist/charts/calendar.d.ts.map +1 -0
- package/dist/charts/calendar.js +94 -0
- package/dist/charts/calendar.js.map +1 -0
- package/dist/charts/combo.d.ts +14 -0
- package/dist/charts/combo.d.ts.map +1 -0
- package/dist/charts/combo.js +163 -0
- package/dist/charts/combo.js.map +1 -0
- package/dist/charts/dumbbell.d.ts +17 -0
- package/dist/charts/dumbbell.d.ts.map +1 -0
- package/dist/charts/dumbbell.js +368 -0
- package/dist/charts/dumbbell.js.map +1 -0
- package/dist/charts/funnel.d.ts +14 -0
- package/dist/charts/funnel.d.ts.map +1 -0
- package/dist/charts/funnel.js +145 -0
- package/dist/charts/funnel.js.map +1 -0
- package/dist/charts/heatmap.d.ts +14 -0
- package/dist/charts/heatmap.d.ts.map +1 -0
- package/dist/charts/heatmap.js +202 -0
- package/dist/charts/heatmap.js.map +1 -0
- package/dist/charts/histogram.d.ts +14 -0
- package/dist/charts/histogram.d.ts.map +1 -0
- package/dist/charts/histogram.js +103 -0
- package/dist/charts/histogram.js.map +1 -0
- package/dist/charts/index.d.ts +40 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +42 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/line.d.ts +14 -0
- package/dist/charts/line.d.ts.map +1 -0
- package/dist/charts/line.js +134 -0
- package/dist/charts/line.js.map +1 -0
- package/dist/charts/pie.d.ts +14 -0
- package/dist/charts/pie.d.ts.map +1 -0
- package/dist/charts/pie.js +75 -0
- package/dist/charts/pie.js.map +1 -0
- package/dist/charts/registry.d.ts +36 -0
- package/dist/charts/registry.d.ts.map +1 -0
- package/dist/charts/registry.js +55 -0
- package/dist/charts/registry.js.map +1 -0
- package/dist/charts/sankey.d.ts +14 -0
- package/dist/charts/sankey.d.ts.map +1 -0
- package/dist/charts/sankey.js +74 -0
- package/dist/charts/sankey.js.map +1 -0
- package/dist/charts/scatter.d.ts +14 -0
- package/dist/charts/scatter.d.ts.map +1 -0
- package/dist/charts/scatter.js +130 -0
- package/dist/charts/scatter.js.map +1 -0
- package/dist/charts/sparkline.d.ts +19 -0
- package/dist/charts/sparkline.d.ts.map +1 -0
- package/dist/charts/sparkline.js +154 -0
- package/dist/charts/sparkline.js.map +1 -0
- package/dist/charts/waterfall.d.ts +14 -0
- package/dist/charts/waterfall.d.ts.map +1 -0
- package/dist/charts/waterfall.js +232 -0
- package/dist/charts/waterfall.js.map +1 -0
- package/dist/charts/xmr.d.ts +14 -0
- package/dist/charts/xmr.d.ts.map +1 -0
- package/dist/charts/xmr.js +456 -0
- package/dist/charts/xmr.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +120 -0
- package/dist/cli.js.map +1 -0
- package/dist/components/alert.d.ts +10 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +65 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/big_value.d.ts +10 -0
- package/dist/components/big_value.d.ts.map +1 -0
- package/dist/components/big_value.js +78 -0
- package/dist/components/big_value.js.map +1 -0
- package/dist/components/delta.d.ts +10 -0
- package/dist/components/delta.d.ts.map +1 -0
- package/dist/components/delta.js +83 -0
- package/dist/components/delta.js.map +1 -0
- package/dist/components/empty_space.d.ts +10 -0
- package/dist/components/empty_space.d.ts.map +1 -0
- package/dist/components/empty_space.js +29 -0
- package/dist/components/empty_space.js.map +1 -0
- package/dist/components/index.d.ts +21 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +23 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/note.d.ts +10 -0
- package/dist/components/note.d.ts.map +1 -0
- package/dist/components/note.js +66 -0
- package/dist/components/note.js.map +1 -0
- package/dist/components/registry.d.ts +24 -0
- package/dist/components/registry.d.ts.map +1 -0
- package/dist/components/registry.js +36 -0
- package/dist/components/registry.js.map +1 -0
- package/dist/components/table.d.ts +90 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +610 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/text.d.ts +10 -0
- package/dist/components/text.d.ts.map +1 -0
- package/dist/components/text.js +46 -0
- package/dist/components/text.js.map +1 -0
- package/dist/components/textarea.d.ts +10 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +79 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/core/colors.d.ts +45 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +93 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/css.d.ts +20 -0
- package/dist/core/css.d.ts.map +1 -0
- package/dist/core/css.js +97 -0
- package/dist/core/css.js.map +1 -0
- package/dist/core/exceptions.d.ts +59 -0
- package/dist/core/exceptions.d.ts.map +1 -0
- package/dist/core/exceptions.js +100 -0
- package/dist/core/exceptions.js.map +1 -0
- package/dist/core/formatting.d.ts +53 -0
- package/dist/core/formatting.d.ts.map +1 -0
- package/dist/core/formatting.js +491 -0
- package/dist/core/formatting.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/serializer.d.ts +29 -0
- package/dist/core/serializer.d.ts.map +1 -0
- package/dist/core/serializer.js +84 -0
- package/dist/core/serializer.js.map +1 -0
- package/dist/core/themes.d.ts +138 -0
- package/dist/core/themes.d.ts.map +1 -0
- package/dist/core/themes.js +484 -0
- package/dist/core/themes.js.map +1 -0
- package/dist/core/version-check.d.ts +23 -0
- package/dist/core/version-check.d.ts.map +1 -0
- package/dist/core/version-check.js +163 -0
- package/dist/core/version-check.js.map +1 -0
- package/dist/generate_test_harness.d.ts +13 -0
- package/dist/generate_test_harness.d.ts.map +1 -0
- package/dist/generate_test_harness.js +35 -0
- package/dist/generate_test_harness.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/converter.d.ts +22 -0
- package/dist/layout/converter.d.ts.map +1 -0
- package/dist/layout/converter.js +46 -0
- package/dist/layout/converter.js.map +1 -0
- package/dist/layout/csv.d.ts +15 -0
- package/dist/layout/csv.d.ts.map +1 -0
- package/dist/layout/csv.js +88 -0
- package/dist/layout/csv.js.map +1 -0
- package/dist/layout/dispatcher.d.ts +13 -0
- package/dist/layout/dispatcher.d.ts.map +1 -0
- package/dist/layout/dispatcher.js +47 -0
- package/dist/layout/dispatcher.js.map +1 -0
- package/dist/layout/index.d.ts +8 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +8 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/parser.d.ts +19 -0
- package/dist/layout/parser.d.ts.map +1 -0
- package/dist/layout/parser.js +888 -0
- package/dist/layout/parser.js.map +1 -0
- package/dist/layout/templates.d.ts +32 -0
- package/dist/layout/templates.d.ts.map +1 -0
- package/dist/layout/templates.js +1016 -0
- package/dist/layout/templates.js.map +1 -0
- package/dist/types.d.ts +144 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +14 -0
- package/dist/vitest.config.js.map +1 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|