From acabd32b2d2513981793709ee73b2c087e6b7a22 Mon Sep 17 00:00:00 2001 From: pheralb Date: Fri, 29 Aug 2025 12:42:22 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9A=99=EF=B8=8F=20Refactor=20SVG=20filename?= =?UTF-8?q?=20parsing=20and=20replace=20toComponentName=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- generate-registry.ts | 45 +++++++++-------------------------- src/utils/parseSvgFilename.ts | 42 ++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 34 deletions(-) create mode 100644 src/utils/parseSvgFilename.ts diff --git a/generate-registry.ts b/generate-registry.ts index 9969164..69e5e81 100644 --- a/generate-registry.ts +++ b/generate-registry.ts @@ -7,6 +7,7 @@ import { promisify } from "util"; import { svgs } from "./src/data/svgs"; import { optimizeSvg } from "./src/utils/optimizeSvg"; +import { parseSvgFilename } from "./src/utils/parseSvgFilename"; import { parseReactSvgContent } from "./src/utils/parseReactSvgContent"; const execAsync = promisify(exec); @@ -58,12 +59,16 @@ function prepareRegistryJson(): ShadcnSchema { .toLowerCase() .replace(/\s+/g, "-") .replace(/[^a-z0-9-]/g, ""); + const files: RegistryFile[] = []; const svgPaths = extractSvgPaths(svg); svgPaths.forEach((svgFile) => { - const tsxComponentName = toComponentName(svgFile.filename); + const tsxComponentName = parseSvgFilename({ + file: svgFile.filename, + log: false, + }); files.push({ path: `./${OUTPUT_DIR}/${tsxComponentName}.tsx`, type: "registry:component", @@ -209,7 +214,10 @@ function createSpinner() { async function convertSvgToReact(svgPath: string): Promise { const rawSvg = await fs.promises.readFile(svgPath, "utf-8"); 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({ componentName, svgCode: optimizedSvg, @@ -219,37 +227,6 @@ async function convertSvgToReact(svgPath: string): Promise { 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) { try { if ( @@ -333,7 +310,7 @@ async function run() { const tsx = await convertSvgToReact(filesystemPath); const outPath = path.join( OUTPUT_DIR, - toComponentName(svgFile.filename) + ".tsx", + parseSvgFilename({ file: svgFile.filename, log: false }) + ".tsx", ); await fs.promises.writeFile(outPath, tsx, "utf-8"); convertedCount++; diff --git a/src/utils/parseSvgFilename.ts b/src/utils/parseSvgFilename.ts new file mode 100644 index 0000000..c568622 --- /dev/null +++ b/src/utils/parseSvgFilename.ts @@ -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; +};