Files
banu-front/scripts/vite-icon-names.js
sajjadtalkhabi c82701888a fix
2026-05-15 17:12:51 +03:30

53 lines
1.5 KiB
JavaScript

import fs from 'node:fs'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const ICONS_DIR = path.resolve(__dirname, '../src/assets/icons')
const OUTPUT_FILE = path.resolve(__dirname, '../src/components/icons/icon-names.d.ts')
const readNames = () =>
fs
.readdirSync(ICONS_DIR)
.filter((f) => f.endsWith('.svg'))
.map((f) => f.replace(/\.svg$/, ''))
.sort()
const buildContent = (names) => {
const union = names.length > 0 ? names.map((n) => ` | '${n}'`).join('\n') : ' | never'
return `// AUTO-GENERATED — do not edit by hand.
// Regenerated whenever src/assets/icons/*.svg changes (via scripts/vite-icon-names.js).
export type IconName =
${union}
export const iconNames: readonly IconName[]
`
}
const writeIfChanged = () => {
const content = buildContent(readNames())
const prev = fs.existsSync(OUTPUT_FILE) ? fs.readFileSync(OUTPUT_FILE, 'utf8') : ''
if (prev !== content) fs.writeFileSync(OUTPUT_FILE, content)
}
export default function viteIconNames() {
return {
name: 'vite-icon-names',
buildStart() {
writeIfChanged()
},
configureServer(server) {
writeIfChanged()
server.watcher.add(path.join(ICONS_DIR, '*.svg'))
const handler = (file) => {
if (file.startsWith(ICONS_DIR) && file.endsWith('.svg')) writeIfChanged()
}
server.watcher.on('add', handler)
server.watcher.on('unlink', handler)
},
}
}
export { writeIfChanged as generateIconNames }