Files
lucide/scripts/generateNextJSAliases.mts
Eric FennisandCopilot Autofix powered by AI 53fab88ff9 fix(scripts): Fixes generateNextJSAliases.mts on commit hook (#5167)
* Fix nextjs aliases path generator

* Add deprecation fields to alias type definition

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-11-06 13:25:23 +00:00

62 lines
2.1 KiB
TypeScript

import path from 'path';
import { promises as fs } from 'fs';
import { getCurrentDirPath, readSvgDirectory } from '../tools/build-helpers/helpers.ts';
// This is a special case convertion NextJS uses for their modularize imports. We try to follow the same convention, to generate the same imports.
function pascalToKebabNextJSFlavour(str: string) {
return str
.replace(/([a-z])([A-Z])/g, '$1-$2')
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')
.replace(/([a-z])-?([0-9]+|[A-Z])/g, '$1-$2')
.replace(/([0-9]+)-?([a-zA-Z])/g, '$1-$2')
.replace(/([0-9])-([0-9])/g, '$1$2')
.split('-')
.map((word) => word.toLowerCase())
.join('-');
}
const currentDir = getCurrentDirPath(import.meta.url);
const ICONS_DIR = path.resolve(currentDir, '../icons');
const svgFiles = await readSvgDirectory(ICONS_DIR);
const iconNames = svgFiles.map((icon) => icon.split('.')[0]).reverse();
console.log('Creating aliases for NextJS imports: ');
Promise.all(
iconNames.map(async (iconName) => {
const pascalCaseName = iconName.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
const iconNameKebabCaseNextjsFlavour = pascalToKebabNextJSFlavour(pascalCaseName);
if (iconName !== iconNameKebabCaseNextjsFlavour) {
console.log(iconName, '➡️', iconNameKebabCaseNextjsFlavour);
const metaJson = await fs.readFile(path.resolve(ICONS_DIR, `${iconName}.json`), 'utf-8');
const iconMetaData = JSON.parse(metaJson);
const aliases: (
| string
| { name: string; deprecationReason?: string; deprecated?: boolean }
)[] = iconMetaData.aliases ?? [];
const hasAlias = aliases.some(
(alias) =>
(typeof alias === 'string' ? alias : alias.name) === iconNameKebabCaseNextjsFlavour,
);
if (!hasAlias) {
aliases.push({
name: iconNameKebabCaseNextjsFlavour,
deprecationReason: 'alias.name',
deprecated: true,
});
}
let output = JSON.stringify({ ...iconMetaData, aliases }, null, 2);
output = `${output}\n`;
fs.writeFile(path.resolve(ICONS_DIR, `${iconName}.json`), output, 'utf-8');
}
}),
);