app
Adom Chip Fetcher
Public Made by Adomby adom
Your whole parts library — manufacturer-grade chip CAD (symbol, footprint, 3D) one tap from your EDA tool.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
#!/usr/bin/env node
/**
* gen-symbol-viewer.mjs — generate <MPN>-symbol-viewer.html for one chip.
*
* Bypasses symbol-creator's HTTP service entirely. Pre-renders the symbol
* SVG via LOCAL kicad-cli (gallia's HTTP route doesn't accept arbitrary
* file uploads) and passes it directly to generateBrandedViewer via the
* `svgContent` option. This sidesteps:
* - Port collisions (no localhost service required)
* - Stale env state on background symbol-creator processes
* - service-kicad's `/sym/export/svg` POST route not being implemented
* for arbitrary kicad_sym uploads (only `<library>/<name>` GETs work)
*
* Usage:
* node gen-symbol-viewer.mjs <library-dir>/<MPN>
*
* Writes <MPN>-symbol-viewer.html into the same dir.
*/
import { existsSync, mkdtempSync, readFileSync, readdirSync, writeFileSync, rmSync } from 'fs';
import { tmpdir } from 'os';
import { execFileSync } from 'child_process';
import { join, basename, resolve } from 'path';
const arg = process.argv[2];
if (!arg) {
console.error('usage: gen-symbol-viewer.mjs <library-dir>/<MPN>');
process.exit(2);
}
const dir = resolve(arg);
const mpn = basename(dir);
const symPath = join(dir, `${mpn}.kicad_sym`);
if (!existsSync(symPath)) {
console.error(`ERROR: ${symPath} not found`);
process.exit(1);
}
// ── Local SVG render via kicad-cli — same approach chip-thumbnailer uses ──
const tmp = mkdtempSync(join(tmpdir(), 'cf-symview-'));
try {
execFileSync('kicad-cli', ['sym', 'export', 'svg', '--output', tmp, symPath], { stdio: 'pipe' });
} catch (e) {
console.error('ERROR: kicad-cli sym export svg failed:', e.stderr?.toString() || e.message);
rmSync(tmp, { recursive: true, force: true });
process.exit(1);
}
const svgFile = readdirSync(tmp).find(f => f.endsWith('.svg'));
if (!svgFile) {
console.error('ERROR: kicad-cli produced no svg in', tmp);
rmSync(tmp, { recursive: true, force: true });
process.exit(1);
}
const svgContent = readFileSync(join(tmp, svgFile), 'utf-8');
rmSync(tmp, { recursive: true, force: true });
// ── Build viewer HTML via gallia's generateBrandedViewer ──
const { generateBrandedViewer } = await import(
'/home/adom/project/gallia/symbol-creator/lib/viewer-gen.js'
);
const infoPath = join(dir, 'info.json');
let info = {};
if (existsSync(infoPath)) {
try { info = JSON.parse(readFileSync(infoPath, 'utf-8')); } catch {}
}
const html = await generateBrandedViewer(symPath, mpn, {
pinDescriptions: {},
groupDescriptions: {},
datasheetUrl: info.datasheet_url && info.datasheet_url !== '?' ? info.datasheet_url : '',
manufacturer: info.manufacturer && info.manufacturer !== '?' ? info.manufacturer : '',
svgContent,
});
const outPath = join(dir, `${mpn}-symbol-viewer.html`);
writeFileSync(outPath, html);
console.log(`OK: ${outPath} (${html.length} bytes)`);