53 lines
1.5 KiB
JavaScript
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 }
|