/** * FSD Component Generator - Flat Structure * * Creates components with flat structure: * ComponentName/ * ├── index.ts * ├── ComponentName.tsx * ├── ComponentName.module.scss * └── ComponentName.d.ts * * Usage: bun gc * Example: bun gc entity ProjectCard */ import { mkdir, writeFile } from "node:fs/promises" const args = Bun.argv.slice(2) function printUsageAndExit(): never { console.error("Error: Please provide and ") console.log("Usage: bun gc ") console.log("Layers: shared, entity, feature, widget, page") console.log("Example: bun gc entity ProjectCard") process.exit(1) } function getComponentPath(layer: string, component: string): string { const base = "./src/" switch (layer) { case "shared": return `${base}shared/ui/${component}` case "app": return `${base}app/${component}` case "entity": case "entities": return `${base}entities/${component}` case "feature": case "features": return `${base}features/${component}` case "widget": case "widgets": return `${base}widgets/${component}` case "page": case "pages": return `${base}pages/${component}` default: return `${base}${layer}s/${component}` } } function generateIndexTemplate(component: string): string { return `export * from "./${component}" ` } function generateComponentTemplate(component: string): string { return `import type { I${component}Props } from "./${component}.d" import type { JSX } from "react" import { FunctionComponent } from "react" import styles from "./${component}.module.scss" export const ${component}: FunctionComponent = (): JSX.Element => { return (
${component}
) } ` } function generateTypesTemplate(component: string): string { return `export interface I${component}Props { className?: string } ` } function generateStylesTemplate(): string { return `.root { } ` } if (args.length < 2) { printUsageAndExit() } const layer = args[0] const component = args[1] const componentPath = getComponentPath(layer, component) console.log(`Creating ${component} in ${componentPath}...`) try { await mkdir(componentPath, { recursive: true }) await Promise.all([ writeFile(`${componentPath}/index.ts`, generateIndexTemplate(component)), writeFile( `${componentPath}/${component}.tsx`, generateComponentTemplate(component), ), writeFile( `${componentPath}/${component}.d.ts`, generateTypesTemplate(component), ), writeFile( `${componentPath}/${component}.module.scss`, generateStylesTemplate(), ), ]) console.log(`✅ Created ${component}:`) console.log(` ${componentPath}/index.ts`) console.log(` ${componentPath}/${component}.tsx`) console.log(` ${componentPath}/${component}.d.ts`) console.log(` ${componentPath}/${component}.module.scss`) } catch (error) { console.error(`Error: ${(error as Error).message}`) process.exit(1) }