@shumoku/renderer 0.2.6 → 0.2.14

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/dist/cli.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Shumoku CLI - Render NetworkGraph JSON to SVG/HTML
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;GAEG"}
package/dist/cli.js ADDED
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Shumoku CLI - Render NetworkGraph JSON to SVG/HTML
4
+ */
5
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
6
+ import { dirname, resolve } from 'node:path';
7
+ import { parseArgs } from 'node:util';
8
+ import { buildHierarchicalSheets, HierarchicalLayout } from '@shumoku/core';
9
+ import pkg from '../package.json' with { type: 'json' };
10
+ import * as html from './html/index.js';
11
+ import { INTERACTIVE_IIFE } from './iife-string.js';
12
+ import * as svg from './svg.js';
13
+ const VERSION = pkg.version;
14
+ const HELP = `
15
+ shumoku v${VERSION} - Render NetworkGraph JSON to SVG/HTML
16
+
17
+ Usage: shumoku render [options] <input.json>
18
+
19
+ Input:
20
+ <input.json> NetworkGraph JSON file (use - for stdin)
21
+
22
+ Output:
23
+ -f, --format <type> Output format: svg|html (default: auto from extension)
24
+ -o, --output <file> Output file (default: output.svg)
25
+ --theme <theme> Theme: light|dark (default: light)
26
+
27
+ Other:
28
+ -h, --help Show help
29
+ -v, --version Show version
30
+
31
+ Examples:
32
+ shumoku render topology.json -o diagram.svg
33
+ shumoku render topology.json -f html -o diagram.html
34
+ cat topology.json | shumoku render - -o diagram.svg
35
+ netbox-to-shumoku -f json -o netbox.json && shumoku render netbox.json -o netbox.svg
36
+ `;
37
+ function cli() {
38
+ const args = process.argv.slice(2);
39
+ // Handle subcommand
40
+ if (args[0] === 'render') {
41
+ args.shift();
42
+ }
43
+ const { values, positionals } = parseArgs({
44
+ args,
45
+ options: {
46
+ format: { type: 'string', short: 'f' },
47
+ output: { type: 'string', short: 'o', default: 'output' },
48
+ theme: { type: 'string' },
49
+ help: { type: 'boolean', short: 'h', default: false },
50
+ version: { type: 'boolean', short: 'v', default: false },
51
+ },
52
+ allowPositionals: true,
53
+ strict: true,
54
+ });
55
+ if (values.help) {
56
+ console.log(HELP);
57
+ process.exit(0);
58
+ }
59
+ if (values.version) {
60
+ console.log(VERSION);
61
+ process.exit(0);
62
+ }
63
+ return { values, inputFile: positionals[0] };
64
+ }
65
+ async function main() {
66
+ const { values, inputFile } = cli();
67
+ if (!inputFile) {
68
+ console.error('Error: Input file required.');
69
+ console.error('Usage: shumoku render <input.json>');
70
+ console.error('Use --help for more information.');
71
+ process.exit(1);
72
+ }
73
+ try {
74
+ // Read input
75
+ let jsonContent;
76
+ if (inputFile === '-') {
77
+ // Read from stdin
78
+ console.log('Reading from stdin...');
79
+ const chunks = [];
80
+ for await (const chunk of process.stdin) {
81
+ chunks.push(chunk);
82
+ }
83
+ jsonContent = Buffer.concat(chunks).toString('utf-8');
84
+ }
85
+ else {
86
+ console.log(`Reading ${inputFile}...`);
87
+ jsonContent = readFileSync(resolve(process.cwd(), inputFile), 'utf-8');
88
+ }
89
+ // Parse JSON
90
+ const graph = JSON.parse(jsonContent);
91
+ console.log(`Loaded graph: ${graph.nodes.length} nodes, ${graph.links.length} links`);
92
+ if (graph.subgraphs) {
93
+ console.log(` ${graph.subgraphs.length} subgraphs`);
94
+ }
95
+ // Determine format
96
+ const outputBase = values.output;
97
+ const extMatch = outputBase.toLowerCase().match(/\.(svg|html|htm)$/);
98
+ const format = values.format ??
99
+ (extMatch ? (extMatch[1] === 'htm' ? 'html' : extMatch[1]) : 'svg');
100
+ // Build output path
101
+ const hasExt = /\.(svg|html|htm)$/i.test(outputBase);
102
+ const outputPath = resolve(process.cwd(), hasExt ? outputBase : `${outputBase}.${format}`);
103
+ // Ensure output directory exists
104
+ mkdirSync(dirname(outputPath), { recursive: true });
105
+ // Layout
106
+ console.log('Generating layout...');
107
+ const layout = new HierarchicalLayout();
108
+ const layoutResult = await layout.layoutAsync(graph);
109
+ // Render
110
+ if (format === 'html') {
111
+ console.log('Rendering HTML...');
112
+ html.setIIFE(INTERACTIVE_IIFE);
113
+ const sheets = await buildHierarchicalSheets(graph, layoutResult, layout);
114
+ if (sheets.size > 1) {
115
+ writeFileSync(outputPath, html.renderHierarchical(sheets), 'utf-8');
116
+ }
117
+ else {
118
+ writeFileSync(outputPath, html.render(graph, layoutResult), 'utf-8');
119
+ }
120
+ }
121
+ else {
122
+ console.log('Rendering SVG...');
123
+ writeFileSync(outputPath, svg.render(graph, layoutResult), 'utf-8');
124
+ }
125
+ console.log(`Output written to: ${outputPath}`);
126
+ console.log('Done!');
127
+ }
128
+ catch (err) {
129
+ if (err instanceof SyntaxError) {
130
+ console.error('Error: Invalid JSON format');
131
+ console.error(err.message);
132
+ }
133
+ else {
134
+ console.error('Error:', err instanceof Error ? err.message : String(err));
135
+ }
136
+ process.exit(1);
137
+ }
138
+ }
139
+ main();
140
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/html/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAA4B,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,iBAAiB,CAAA;AAExB,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE1E,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAK9C;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IACxD;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B;AAQD;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAmBjG;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,YAAY,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC9B,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAgDR"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/html/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAA4B,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,iBAAiB,CAAA;AAExB,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE1E,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAK9C;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IACxD;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B;AAQD;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAmBjG;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,YAAY,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC9B,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAmDR"}