⚙️ Refactor SVG filename parsing and replace toComponentName function

This commit is contained in:
pheralb
2025-08-29 12:42:22 +01:00
parent 47bcca1bdc
commit acabd32b2d
2 changed files with 53 additions and 34 deletions
+11 -34
View File
@@ -7,6 +7,7 @@ import { promisify } from "util";
import { svgs } from "./src/data/svgs"; import { svgs } from "./src/data/svgs";
import { optimizeSvg } from "./src/utils/optimizeSvg"; import { optimizeSvg } from "./src/utils/optimizeSvg";
import { parseSvgFilename } from "./src/utils/parseSvgFilename";
import { parseReactSvgContent } from "./src/utils/parseReactSvgContent"; import { parseReactSvgContent } from "./src/utils/parseReactSvgContent";
const execAsync = promisify(exec); const execAsync = promisify(exec);
@@ -58,12 +59,16 @@ function prepareRegistryJson(): ShadcnSchema {
.toLowerCase() .toLowerCase()
.replace(/\s+/g, "-") .replace(/\s+/g, "-")
.replace(/[^a-z0-9-]/g, ""); .replace(/[^a-z0-9-]/g, "");
const files: RegistryFile[] = []; const files: RegistryFile[] = [];
const svgPaths = extractSvgPaths(svg); const svgPaths = extractSvgPaths(svg);
svgPaths.forEach((svgFile) => { svgPaths.forEach((svgFile) => {
const tsxComponentName = toComponentName(svgFile.filename); const tsxComponentName = parseSvgFilename({
file: svgFile.filename,
log: false,
});
files.push({ files.push({
path: `./${OUTPUT_DIR}/${tsxComponentName}.tsx`, path: `./${OUTPUT_DIR}/${tsxComponentName}.tsx`,
type: "registry:component", type: "registry:component",
@@ -209,7 +214,10 @@ function createSpinner() {
async function convertSvgToReact(svgPath: string): Promise<string> { async function convertSvgToReact(svgPath: string): Promise<string> {
const rawSvg = await fs.promises.readFile(svgPath, "utf-8"); const rawSvg = await fs.promises.readFile(svgPath, "utf-8");
const optimizedSvg = optimizeSvg({ svgCode: rawSvg }); const optimizedSvg = optimizeSvg({ svgCode: rawSvg });
const componentName = toComponentName(path.basename(svgPath, ".svg")); const componentName = parseSvgFilename({
file: path.basename(svgPath, ".svg"),
log: true,
});
const code = await parseReactSvgContent({ const code = await parseReactSvgContent({
componentName, componentName,
svgCode: optimizedSvg, svgCode: optimizedSvg,
@@ -219,37 +227,6 @@ async function convertSvgToReact(svgPath: string): Promise<string> {
return code; return code;
} }
function toComponentName(file: string): string {
const name = file.replace(/\.svg$/i, "");
let component = name.replace(/(^\w|[-_]\w)/g, (m) =>
m.replace(/[-_]/, "").toUpperCase(),
);
if (/^\d/.test(component)) {
component = "Icon" + component;
}
const reserved = new Set([
"default",
"class",
"function",
"var",
"export",
"import",
"extends",
"new",
"delete",
"enum",
"package",
]);
if (reserved.has(component)) {
component = "Icon" + component[0].toUpperCase() + component.slice(1);
}
return component;
}
async function cleanupDirectory(dirPath: string) { async function cleanupDirectory(dirPath: string) {
try { try {
if ( if (
@@ -333,7 +310,7 @@ async function run() {
const tsx = await convertSvgToReact(filesystemPath); const tsx = await convertSvgToReact(filesystemPath);
const outPath = path.join( const outPath = path.join(
OUTPUT_DIR, OUTPUT_DIR,
toComponentName(svgFile.filename) + ".tsx", parseSvgFilename({ file: svgFile.filename, log: false }) + ".tsx",
); );
await fs.promises.writeFile(outPath, tsx, "utf-8"); await fs.promises.writeFile(outPath, tsx, "utf-8");
convertedCount++; convertedCount++;
+42
View File
@@ -0,0 +1,42 @@
interface ParseSvgFilename {
file: string;
log?: boolean;
}
export const parseSvgFilename = (params: ParseSvgFilename): string => {
const { file, log } = params;
const name = file.replace(/\.svg$/i, "");
let component = name.replace(/(^\w|[-_]\w)/g, (m) =>
m.replace(/[-_]/, "").toUpperCase(),
);
if (/^\d/.test(component)) {
if (log) {
console.log(`[⚠️] Component name starts with a number: ${component}`);
}
component = "Icon" + component;
}
const reserved = new Set([
"default",
"class",
"function",
"var",
"export",
"import",
"extends",
"new",
"delete",
"enum",
"package",
]);
if (reserved.has(component)) {
if (log) {
console.log(`[⚠️] Component name is a reserved keyword: ${component}`);
}
component = "Icon" + component[0].toUpperCase() + component.slice(1);
}
return component;
};