#!/usr/bin/env node /** * Usage: node convert-svg-to-svelte.js [inputDir] [outputDir] * Defaults: ./svgs ./svelte */ import fs from 'fs'; import path from 'path'; const INPUT_DIR = process.argv[2] || '../svgs'; const OUTPUT_DIR = process.argv[3] || '../src/lib/icons'; if (!fs.existsSync(OUTPUT_DIR)) fs.mkdirSync(OUTPUT_DIR, { recursive: true }); function processSvg(svgContent) { // Strip XML/DOCTYPE let out = svgContent.replace(/<\?xml[\s\S]*?\?>\s*/i, '').replace(/\s*/i, ''); // Remove ALL comments out = out.replace(/\s*/g, ''); // Remove with any whitespace between tags out = out.replace(/\s*<\/g>\s*/gi, ''); // Ensure only width="100%" height="100%" on the tag out = out.replace(/]*>/i, (match) => { let tag = match .replace(/\s+(width|height)\s*=\s*"[^"]*"/gi, '') .replace(/\s+(width|height)\s*=\s*'[^']*'/gi, ''); return tag.replace(/>$/, ' width="100%" height="100%">'); }); // Prepend the single license comment out = '\n' + out.replace(/^\s+/, ''); return out; } function convertSvgs(inputDir = INPUT_DIR, outputDir = OUTPUT_DIR) { if (!fs.existsSync(inputDir)) { console.warn(`Input directory not found: ${inputDir}`); return; } const files = fs.readdirSync(inputDir).filter((f) => f.toLowerCase().endsWith('.svg')); files.forEach((file) => { const src = path.join(inputDir, file); const dest = path.join(outputDir, file.replace(/\.svg$/i, '.svelte')); const svgContent = fs.readFileSync(src, 'utf8'); const processed = processSvg(svgContent); fs.writeFileSync(dest, processed, 'utf8'); console.log(`Converted: ${file} -> ${path.basename(dest)}`); }); } convertSvgs();