flowbite-react
Version:
Official React components built for Flowbite and Tailwind CSS
1 lines • 9.48 kB
Source Map (JSON)
{"version":3,"file":"create.cjs","sources":["../../../src/cli/commands/create.ts"],"sourcesContent":["import fs from \"fs/promises\";\nimport path from \"path\";\nimport readline from \"readline\";\nimport { getConfig } from \"../utils/get-config\";\n\nexport async function create(componentName?: string) {\n try {\n const config = await getConfig();\n\n let finalComponentName = componentName;\n\n // If no component name was provided, prompt the user\n if (!finalComponentName) {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n finalComponentName = await new Promise<string>((resolve) => {\n rl.question('Enter component name (e.g., \"my-component\"): ', (answer) => {\n resolve(answer.trim());\n });\n });\n\n rl.close();\n }\n\n if (!finalComponentName) {\n console.error(\"Component name is required\");\n process.exit(1);\n }\n\n // Format component name to ensure it starts with uppercase and remove special characters\n const formattedName = finalComponentName\n .split(/[^a-zA-Z0-9]/) // Split on any non-alphanumeric characters\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) // Capitalize each word\n .join(\"\"); // Join back together\n\n // Create camelCase version for theme usage\n const camelCaseName = formattedName.charAt(0).toLowerCase() + formattedName.slice(1);\n\n if (!formattedName) {\n console.error(\"Component name must contain at least one letter or number\");\n process.exit(1);\n }\n\n // Determine file extension based on tsx config\n const fileExtension = config.tsx ? \".tsx\" : \".jsx\";\n const componentFilePath = path.join(config.path, `${finalComponentName}${fileExtension}`);\n\n // Ensure the components directory exists\n try {\n await fs.access(config.path);\n } catch {\n console.log(`Creating components directory at ${config.path}...`);\n await fs.mkdir(config.path, { recursive: true });\n }\n\n // Check if file already exists\n try {\n await fs.access(componentFilePath);\n console.error(`Component file already exists at ${componentFilePath}`);\n process.exit(1);\n } catch {\n // File doesn't exist, we can proceed\n }\n\n // Create component content with or without \"use client\" directive based on config\n const useClientDirective = config.rsc ? `\"use client\";\\n\\n` : \"\";\n\n // Create different content based on whether we're using TypeScript or JavaScript\n let componentContent;\n\n if (config.tsx) {\n // TypeScript version\n componentContent = `${useClientDirective}import { createTheme } from \"flowbite-react/helpers/create-theme\";\nimport { get } from \"flowbite-react/helpers/get\";\nimport { resolveProps } from \"flowbite-react/helpers/resolve-props\";\nimport { useResolveTheme } from \"flowbite-react/helpers/resolve-theme\";\nimport { twMerge } from \"flowbite-react/helpers/tailwind-merge\";\nimport { useThemeProvider } from \"flowbite-react/theme/provider\";\nimport type { ThemingProps } from \"flowbite-react/types\";\nimport { forwardRef, type ComponentProps } from \"react\";\n\ndeclare module \"flowbite-react/types\" {\n interface FlowbiteTheme {\n ${camelCaseName}: ${formattedName}Theme;\n }\n\n interface FlowbiteProps {\n ${camelCaseName}: Partial<WithoutThemingProps<${formattedName}Props>>;\n }\n}\n\nexport interface ${formattedName}Theme {\n base: string;\n // ...\n}\n\nexport const ${camelCaseName}Theme = createTheme<${formattedName}Theme>({\n base: \"\",\n // ...\n});\n\nexport interface ${formattedName}Props extends ComponentProps<\"div\">, ThemingProps<${formattedName}Theme> {\n // ...\n}\n\nexport const ${formattedName} = forwardRef<HTMLDivElement, ${formattedName}Props>((props, ref) => {\n const provider = useThemeProvider();\n\n const theme = useResolveTheme(\n [${camelCaseName}Theme, provider.theme?.${camelCaseName}, props.theme],\n [get(provider.clearTheme, \"${camelCaseName}\"), props.clearTheme],\n [get(provider.applyTheme, \"${camelCaseName}\"), props.applyTheme],\n );\n\n const { children, className, ...restProps } = resolveProps(props, provider.props?.${camelCaseName});\n\n return (\n <div ref={ref} className={twMerge(theme.base, className)} {...restProps}>\n {children}\n </div>\n );\n});\n\n${formattedName}.displayName = \"${formattedName}\";`;\n } else {\n // JavaScript version (without TypeScript syntax)\n componentContent = `${useClientDirective}import { createTheme } from \"flowbite-react/helpers/create-theme\";\nimport { get } from \"flowbite-react/helpers/get\";\nimport { resolveProps } from \"flowbite-react/helpers/resolve-props\";\nimport { useResolveTheme } from \"flowbite-react/helpers/resolve-theme\";\nimport { twMerge } from \"flowbite-react/helpers/tailwind-merge\";\nimport { useThemeProvider } from \"flowbite-react/theme/provider\";\nimport { forwardRef } from \"react\";\n\nexport const ${camelCaseName}Theme = createTheme({\n base: \"\",\n // ...\n});\n\nexport const ${formattedName} = forwardRef((props, ref) => {\n const provider = useThemeProvider();\n\n const theme = useResolveTheme(\n [${camelCaseName}Theme, provider.theme?.${camelCaseName}, props.theme],\n [get(provider.clearTheme, \"${camelCaseName}\"), props.clearTheme],\n [get(provider.applyTheme, \"${camelCaseName}\"), props.applyTheme],\n );\n\n const { children, className, ...restProps } = resolveProps(props, provider.props?.${camelCaseName});\n\n return (\n <div ref={ref} className={twMerge(theme.base, className)} {...restProps}>\n {children}\n </div>\n );\n});\n\n${formattedName}.displayName = \"${formattedName}\";`;\n }\n\n // Write the component file\n console.log(`Creating component file at ${componentFilePath}...`);\n await fs.writeFile(componentFilePath, componentContent, { flag: \"w\" });\n\n console.log(`\\n✅ Component ${formattedName} created successfully!`);\n } catch (error) {\n console.error(\"Failed to create component:\", error);\n }\n}\n"],"names":["getConfig"],"mappings":"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"}