import path from 'node:path' import fs from 'fs-extra' import inquirer from 'inquirer' import colors from 'picocolors' import pkg from '../../../package.json' async function generateIcon() { const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json') const raw = await fs.readJSON(path.join(dir, 'collections.json')) const collections = Object.entries(raw).map(([id, v]) => ({ ...(v as any), id, })) const choices = collections.map(item => ({ key: item.id, value: item.id, name: item.name })) inquirer .prompt([ { type: 'list', name: 'useType', choices: [ { key: 'local', value: 'local', name: 'Local' }, { key: 'onLine', value: 'onLine', name: 'OnLine' }, ], message: 'How to use icons?', }, { type: 'list', name: 'iconSet', choices, message: 'Select the icon set that needs to be generated?', }, { type: 'input', name: 'output', message: 'Select the icon set that needs to be generated?', default: 'src/components/Icon/data', }, ]) .then(async (answers) => { const { iconSet, output, useType } = answers const outputDir = path.resolve(process.cwd(), output) await fs.ensureDir(outputDir) const genCollections = collections.filter(item => [iconSet].includes(item.id)) const prefixSet: string[] = [] for (const info of genCollections) { const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`)) if (data) { const { prefix } = data const isLocal = useType === 'local' const icons = Object.keys(data.icons).map(item => `${isLocal ? `${prefix}:` : ''}${item}`) fs.writeFileSync( path.join(output, 'icons.data.ts'), `export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}`, ) prefixSet.push(prefix) } } await fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite')) console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`) }) } generateIcon()