generate-admin-icon-catalog.mjs 1.2 KB

123456789101112131415161718192021222324252627
  1. #!/usr/bin/env node
  2. import { mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
  3. import { dirname, resolve } from 'node:path';
  4. const root = resolve(import.meta.dirname, '..');
  5. const sourceDir = resolve(root, 'node_modules/lucide-angular/icons');
  6. const outputPath = resolve(root, 'public/static/admin/lucide-icons.json');
  7. const checkOnly = process.argv.includes('--check');
  8. const entries = [];
  9. for (const file of readdirSync(sourceDir).filter((name) => name.endsWith('.d.ts') && name !== 'lucide-icons.d.ts').sort()) {
  10. const source = readFileSync(resolve(sourceDir, file), 'utf8');
  11. const preview = source.match(/data:image\/svg\+xml;base64,([A-Za-z0-9+/=]+)/)?.[1];
  12. if (!preview) continue;
  13. entries.push({ name: file.slice(0, -5), data: preview });
  14. }
  15. const output = JSON.stringify({ version: 1, total: entries.length, icons: entries });
  16. if (checkOnly) {
  17. if (readFileSync(outputPath, 'utf8') !== output) throw new Error('图标目录已过期,请运行 npm run admin-icons:generate');
  18. console.log(`Admin icon catalog is current: ${entries.length} icons.`);
  19. } else {
  20. mkdirSync(dirname(outputPath), { recursive: true });
  21. writeFileSync(outputPath, output);
  22. console.log(`Generated ${outputPath}: ${entries.length} icons.`);
  23. }