mirror of
https://github.com/vastxie/99AI.git
synced 2025-11-12 11:43:42 +08:00
v4.3.0
This commit is contained in:
81
admin/scripts/generate.icons.ts
Normal file
81
admin/scripts/generate.icons.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
import { lookupCollection, lookupCollections } from '@iconify/json';
|
||||
import fs from 'fs-extra';
|
||||
import inquirer from 'inquirer';
|
||||
import { exec } from 'node:child_process';
|
||||
import path from 'node:path';
|
||||
import process from 'node:process';
|
||||
|
||||
async function generateIcons() {
|
||||
// 拿到全部图标集的原始数据
|
||||
const raw = await lookupCollections();
|
||||
|
||||
let lastChoose = fs.readFileSync(path.resolve(process.cwd(), 'src/iconify/index.json'), 'utf-8');
|
||||
lastChoose = JSON.parse(lastChoose);
|
||||
|
||||
// 取出可使用的图标集数据用于 inquirer 选择,并按名称排序
|
||||
const collections = Object.entries(raw)
|
||||
.map(([id, item]) => ({
|
||||
...item,
|
||||
id,
|
||||
}))
|
||||
.sort((a, b) => a.name.localeCompare(b.name));
|
||||
|
||||
/**
|
||||
* 分别会在对应目录下生成以下文件,其中(1)(3)用于离线下载并安装图标,(2)用于图标选择器使用
|
||||
* (1) src/iconify/index.json 记录用户 inquirer 的交互信息
|
||||
* (2) src/iconify/data.json 包含多个图标集数据,仅记录图标名
|
||||
* (3) public/icons/*-raw.json 多个图标集的原始数据,独立存放,用于离线使用
|
||||
*/
|
||||
inquirer
|
||||
.prompt([
|
||||
{
|
||||
type: 'checkbox',
|
||||
message: '请选择需要生成的图标集',
|
||||
name: 'collections',
|
||||
choices: collections.map((item) => ({
|
||||
name: `${item.name} (${item.total} icons)`,
|
||||
value: item.id,
|
||||
})),
|
||||
default: lastChoose.collections,
|
||||
},
|
||||
{
|
||||
type: 'confirm',
|
||||
name: 'isOfflineUse',
|
||||
message: '是否需要离线使用',
|
||||
default: false,
|
||||
},
|
||||
])
|
||||
.then(async (answers) => {
|
||||
await fs.writeJSON(path.resolve(process.cwd(), 'src/iconify/index.json'), {
|
||||
collections: answers.collections,
|
||||
isOfflineUse: answers.isOfflineUse,
|
||||
});
|
||||
|
||||
const outputDir = path.resolve(process.cwd(), 'public/icons');
|
||||
await fs.ensureDir(outputDir);
|
||||
await fs.emptyDir(outputDir);
|
||||
|
||||
const collectionsMeta: object[] = [];
|
||||
for (const info of answers.collections) {
|
||||
const setData = await lookupCollection(info);
|
||||
|
||||
collectionsMeta.push({
|
||||
prefix: setData.prefix,
|
||||
info: setData.info,
|
||||
icons: Object.keys(setData.icons),
|
||||
});
|
||||
|
||||
const offlineFilePath = path.join(outputDir, `${info}-raw.json`);
|
||||
|
||||
if (answers.isOfflineUse) {
|
||||
await fs.writeJSON(offlineFilePath, setData);
|
||||
}
|
||||
}
|
||||
|
||||
await fs.writeJSON(path.resolve(process.cwd(), 'src/iconify/data.json'), collectionsMeta);
|
||||
|
||||
exec('eslint src/iconify/data.json src/iconify/index.json --cache --fix');
|
||||
});
|
||||
}
|
||||
|
||||
generateIcons();
|
||||
Reference in New Issue
Block a user