shadcn-nextjs-page-generator 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,8 +3,9 @@
3
3
  > CLI tool to generate production-ready Next.js pages with shadcn/ui, Tailwind CSS v4, and Framer Motion animations.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/shadcn-nextjs-page-generator.svg)](https://www.npmjs.com/package/shadcn-nextjs-page-generator)
6
- [![npm downloads](https://img.shields.io/npm/dm/shadcn-nextjs-page-generator.svg)](https://www.npmjs.com/package/shadcn-nextjs-page-generator)
7
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
7
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
8
+ [![Next.js](https://img.shields.io/badge/Next.js-14+-black.svg)](https://nextjs.org/)
8
9
 
9
10
  ## Features
10
11
 
package/dist/index.cjs CHANGED
@@ -1893,6 +1893,7 @@ async function run() {
1893
1893
  process.exit(1);
1894
1894
  }
1895
1895
  }
1896
+ run();
1896
1897
  // Annotate the CommonJS export names for ESM import in node:
1897
1898
  0 && (module.exports = {
1898
1899
  run
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/prompts.ts","../src/utils/string-transforms.ts","../src/cli/validators.ts","../src/utils/logger.ts","../src/generators/ddd-generator.ts","../src/utils/file-system.ts","../src/templates/ddd/entity.ts","../src/templates/ddd/repository-interface.ts","../src/templates/ddd/repository-impl.ts","../src/templates/ddd/use-case.ts","../src/templates/ddd/component.ts","../src/templates/ddd/page.ts","../src/templates/ddd/template.ts","../src/generators/simplified-generator.ts","../src/templates/simplified/component.ts","../src/templates/simplified/page.ts","../src/generators/index.ts"],"sourcesContent":["import ora from 'ora';\nimport { collectConfiguration } from './prompts.js';\nimport { logger } from '../utils/logger.js';\nimport { PageGenerator } from '../generators/index.js';\n\n/**\n * Main CLI entry point\n */\nexport async function run(): Promise<void> {\n try {\n // Show welcome banner\n console.clear();\n logger.title('šŸŽØ shadcn-page-gen');\n logger.dim('Generate production-ready Next.js pages with shadcn/ui, Tailwind v4, and Framer Motion\\n');\n\n // Collect configuration through interactive prompts\n const config = await collectConfiguration();\n\n if (!config) {\n logger.warning('Operation cancelled');\n process.exit(0);\n }\n\n // Show configuration summary\n console.log('\\n');\n logger.title('šŸ“‹ Configuration Summary');\n logger.info(`Page Name: ${config.pageName}`);\n logger.info(`Route: /${config.routePath}`);\n logger.info(`Architecture: ${config.architecture.toUpperCase()}`);\n logger.info(`Data Fetching: ${config.dataFetching}`);\n logger.info(`Animations: ${config.animations.intensity} intensity`);\n console.log('');\n\n // Generate files\n const spinner = ora('Generating files...').start();\n\n try {\n const generator = new PageGenerator(config);\n const result = await generator.generate();\n\n spinner.succeed('Files generated successfully!');\n\n // Show generated files\n console.log('');\n logger.title('šŸ“ Generated Files');\n result.files.forEach(file => {\n logger.dim(` ${file.path}`);\n });\n\n // Show next steps\n console.log('');\n logger.title('šŸŽ‰ Success!');\n logger.success('Your page has been generated!');\n\n console.log('');\n logger.title('šŸ“ Next Steps');\n result.instructions.forEach((instruction, index) => {\n logger.step(index + 1, result.instructions.length, instruction);\n });\n\n console.log('');\n logger.dim('Happy coding! šŸš€\\n');\n\n } catch (error) {\n spinner.fail('Generation failed');\n throw error;\n }\n\n } catch (error) {\n logger.error('An error occurred:');\n console.error(error);\n process.exit(1);\n }\n}\n","import prompts from 'prompts';\nimport type { GeneratorConfig, Column, Filter } from '../types/index.js';\nimport { toKebabCase, toPascalCase } from '../utils/string-transforms.js';\nimport { validateNotEmpty, validateRoutePath, validateColumnKey } from './validators.js';\n\n/**\n * Collects all configuration through interactive prompts\n */\nexport async function collectConfiguration(): Promise<GeneratorConfig | null> {\n // Handle Ctrl+C gracefully\n prompts.override({ onCancel: () => process.exit(0) });\n\n console.log('\\nšŸš€ Welcome to shadcn-page-gen!\\n');\n\n // Step 1: Page Name\n const { pageName } = await prompts({\n type: 'text',\n name: 'pageName',\n message: 'What is the name of the page? (e.g., \"User Management\")',\n validate: validateNotEmpty\n });\n\n if (!pageName) return null;\n\n // Step 2: Route Path\n const defaultRoute = toKebabCase(pageName);\n const { routePath } = await prompts({\n type: 'text',\n name: 'routePath',\n message: `What is the route path? (e.g., \"admin/users\")`,\n initial: defaultRoute,\n validate: validateRoutePath\n });\n\n if (!routePath) return null;\n\n const cleanRoutePath = routePath.replace(/^\\/+|\\/+$/g, '');\n const defaultModuleName = cleanRoutePath.replace(/\\//g, '-');\n\n // Step 3: Module Name\n const { moduleName } = await prompts({\n type: 'text',\n name: 'moduleName',\n message: `Module name?`,\n initial: defaultModuleName\n });\n\n if (!moduleName) return null;\n\n // Step 4: Architecture Choice\n const { architecture } = await prompts({\n type: 'select',\n name: 'architecture',\n message: 'Choose architecture pattern:',\n choices: [\n {\n title: 'DDD (Domain-Driven Design)',\n value: 'ddd',\n description: 'Full layers: Domain, Application, Infrastructure, Presentation'\n },\n {\n title: 'Simplified',\n value: 'simplified',\n description: 'Just components and pages - cleaner, faster'\n }\n ],\n initial: 0\n });\n\n if (!architecture) return null;\n\n // Step 5: Entity Name (if DDD)\n const pascalName = toPascalCase(pageName);\n let entityName = pascalName;\n\n if (architecture === 'ddd') {\n const response = await prompts({\n type: 'text',\n name: 'entityName',\n message: `Entity name? (e.g., Product, Ticket)`,\n initial: pascalName\n });\n\n if (!response.entityName) return null;\n entityName = response.entityName;\n }\n\n // Step 6: Columns\n const columns: Column[] = [];\n let addColumn = true;\n\n console.log('\\n--- Table Columns (ID is automatic) ---');\n\n const { useDefaultColumns } = await prompts({\n type: 'confirm',\n name: 'useDefaultColumns',\n message: 'Use default columns? (Name, Status, Created At)',\n initial: true\n });\n\n if (useDefaultColumns) {\n columns.push(\n { label: 'Name', key: 'name', type: 'string', sortable: true },\n { label: 'Status', key: 'status', type: 'string', sortable: true },\n { label: 'Created At', key: 'createdAt', type: 'date', sortable: true }\n );\n } else {\n while (addColumn) {\n const { continueAdding } = await prompts({\n type: 'confirm',\n name: 'continueAdding',\n message: columns.length === 0 ? 'Add a column?' : 'Add another column?',\n initial: true\n });\n\n if (!continueAdding) break;\n\n const columnData = await prompts([\n {\n type: 'text',\n name: 'label',\n message: 'Column Label (e.g., \"Email Address\"):',\n validate: validateNotEmpty\n },\n {\n type: 'text',\n name: 'key',\n message: 'Column Key (e.g., \"email\"):',\n validate: validateColumnKey\n },\n {\n type: 'select',\n name: 'type',\n message: 'Column Type:',\n choices: [\n { title: 'String', value: 'string' },\n { title: 'Number', value: 'number' },\n { title: 'Boolean', value: 'boolean' },\n { title: 'Date', value: 'date' }\n ],\n initial: 0\n }\n ]);\n\n if (columnData.label && columnData.key && columnData.type) {\n columns.push({\n ...columnData,\n sortable: false // Will be set later\n });\n }\n }\n\n if (columns.length === 0) {\n // If user didn't add any, use defaults\n columns.push(\n { label: 'Name', key: 'name', type: 'string', sortable: true },\n { label: 'Status', key: 'status', type: 'string', sortable: true },\n { label: 'Created At', key: 'createdAt', type: 'date', sortable: true }\n );\n }\n }\n\n // Step 7: Filters\n const filters: Filter[] = [];\n\n console.log('\\n--- Filters ---');\n\n const { addFilters } = await prompts({\n type: 'confirm',\n name: 'addFilters',\n message: 'Add filters?',\n initial: true\n });\n\n if (addFilters) {\n let addFilterLoop = true;\n\n while (addFilterLoop) {\n const { continueAddingFilter } = await prompts({\n type: 'confirm',\n name: 'continueAddingFilter',\n message: filters.length === 0 ? 'Add a filter?' : 'Add another filter?',\n initial: filters.length === 0\n });\n\n if (!continueAddingFilter) break;\n\n const filterData = await prompts([\n {\n type: 'select',\n name: 'type',\n message: 'Filter type:',\n choices: [\n { title: 'Dropdown (Select)', value: 'select' },\n { title: 'Date Picker', value: 'date' },\n { title: 'Text Input', value: 'input' }\n ]\n },\n {\n type: 'text',\n name: 'label',\n message: 'Filter Label (e.g., \"Status\"):',\n validate: validateNotEmpty\n },\n {\n type: 'text',\n name: 'key',\n message: 'Filter Key (URL param, e.g., \"status\"):',\n validate: validateColumnKey\n }\n ]);\n\n if (filterData.type && filterData.label && filterData.key) {\n filters.push(filterData);\n }\n }\n }\n\n // Step 8: UI Options\n console.log('\\n--- UI Options ---');\n\n const uiOptions = await prompts([\n {\n type: 'confirm',\n name: 'includeStats',\n message: 'Include Stats Cards at the top?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'includeRowSelection',\n message: 'Include Row Selection (Checkboxes)?',\n initial: false\n }\n ]);\n\n // Step 9: Data Fetching Strategy\n const { dataFetching } = await prompts({\n type: 'select',\n name: 'dataFetching',\n message: 'Data Fetching Strategy:',\n choices: [\n { title: 'Mock Data (Repository Pattern)', value: 'mock', description: 'Default mock data with repository pattern' },\n { title: 'TanStack Query (React Query)', value: 'tanstack', description: 'Modern data fetching with caching' },\n { title: 'Standard (fetch/useEffect)', value: 'fetch', description: 'Basic fetch with useEffect' }\n ],\n initial: 0\n });\n\n // Step 10: Sorting\n const { enableSorting } = await prompts({\n type: 'confirm',\n name: 'enableSorting',\n message: 'Enable Column Sorting?',\n initial: true\n });\n\n let sortableColumns: string[] = [];\n\n if (enableSorting && columns.length > 0) {\n const { selected } = await prompts({\n type: 'multiselect',\n name: 'selected',\n message: 'Select columns to enable sorting (Space to select, Enter to submit):',\n choices: columns.map(c => ({ title: c.label, value: c.key, selected: true })),\n min: 0\n });\n\n sortableColumns = selected || [];\n\n // Update sortable flag on columns\n columns.forEach(col => {\n col.sortable = sortableColumns.includes(col.key);\n });\n }\n\n // Step 11: Animations\n console.log('\\n--- Animations (Framer Motion) ---');\n\n const animationOptions = await prompts([\n {\n type: 'confirm',\n name: 'pageTransitions',\n message: 'Add page transition animations?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'listAnimations',\n message: 'Animate table rows on load?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'cardAnimations',\n message: 'Animate stats cards?',\n initial: uiOptions.includeStats\n },\n {\n type: 'select',\n name: 'intensity',\n message: 'Animation intensity:',\n choices: [\n { title: 'Subtle (professional)', value: 'subtle' },\n { title: 'Moderate (balanced)', value: 'moderate' },\n { title: 'Bold (eye-catching)', value: 'bold' }\n ],\n initial: 1\n }\n ]);\n\n // Build final config\n const config: GeneratorConfig = {\n pageName,\n routePath: cleanRoutePath,\n moduleName,\n architecture,\n entityName,\n columns,\n filters,\n includeStats: uiOptions.includeStats,\n includeRowSelection: uiOptions.includeRowSelection,\n includeSearch: true, // Always include search\n dataFetching,\n sortableColumns,\n animations: {\n pageTransitions: animationOptions.pageTransitions,\n listAnimations: animationOptions.listAnimations,\n cardAnimations: animationOptions.cardAnimations,\n intensity: animationOptions.intensity\n }\n };\n\n return config;\n}\n","/**\n * String transformation utilities\n */\n\n/**\n * Converts string to PascalCase\n * Example: \"user management\" => \"UserManagement\"\n */\nexport function toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())\n .replace(/^[a-z]/, (c) => c.toUpperCase())\n .replace(/[^a-zA-Z0-9]/g, '');\n}\n\n/**\n * Converts string to camelCase\n * Example: \"User Management\" => \"userManagement\"\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Converts string to kebab-case\n * Example: \"User Management\" => \"user-management\"\n */\nexport function toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)+/g, '');\n}\n\n/**\n * Converts string to snake_case\n * Example: \"User Management\" => \"user_management\"\n */\nexport function toSnakeCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/(^_|_$)+/g, '');\n}\n\n/**\n * Pluralizes a word (simple English rules)\n * Example: \"User\" => \"Users\", \"Category\" => \"Categories\"\n */\nexport function pluralize(word: string): string {\n if (word.endsWith('y') && !['ay', 'ey', 'iy', 'oy', 'uy'].some(v => word.endsWith(v))) {\n return word.slice(0, -1) + 'ies';\n }\n if (word.endsWith('s') || word.endsWith('x') || word.endsWith('z') ||\n word.endsWith('ch') || word.endsWith('sh')) {\n return word + 'es';\n }\n return word + 's';\n}\n\n/**\n * Capitalizes first letter\n * Example: \"hello\" => \"Hello\"\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Input validation functions\n */\n\nexport function validateNotEmpty(value: string): boolean | string {\n return value.length > 0 || 'This field is required';\n}\n\nexport function validateRoutePath(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'Route path is required';\n }\n\n // Check for valid characters (alphanumeric, dash, slash)\n if (!/^[a-z0-9\\-\\/]+$/.test(value)) {\n return 'Route path can only contain lowercase letters, numbers, dashes, and slashes';\n }\n\n return true;\n}\n\nexport function validateIdentifier(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'This field is required';\n }\n\n // Check for valid identifier (alphanumeric, underscore, dash)\n if (!/^[a-zA-Z][a-zA-Z0-9_\\-]*$/.test(value)) {\n return 'Must start with a letter and contain only letters, numbers, underscores, and dashes';\n }\n\n return true;\n}\n\nexport function validateColumnKey(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'Column key is required';\n }\n\n // Check for valid JavaScript identifier\n if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(value)) {\n return 'Column key must be a valid JavaScript identifier (camelCase recommended)';\n }\n\n return true;\n}\n","import chalk from 'chalk';\n\n/**\n * Logger utility with colored output\n */\n\nexport const logger = {\n success(message: string): void {\n console.log(chalk.green('āœ“'), message);\n },\n\n error(message: string): void {\n console.log(chalk.red('āœ—'), message);\n },\n\n info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n },\n\n warning(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n },\n\n log(message: string): void {\n console.log(message);\n },\n\n title(message: string): void {\n console.log(chalk.bold.cyan(`\\n${message}\\n`));\n },\n\n step(step: number, total: number, message: string): void {\n console.log(chalk.gray(`[${step}/${total}]`), message);\n },\n\n dim(message: string): void {\n console.log(chalk.dim(message));\n }\n};\n","import path from 'path';\nimport type { GeneratorConfig, GeneratorResult, GeneratedFile } from '../types/index.js';\nimport { writeFiles, createDirectories } from '../utils/file-system.js';\nimport {\n generateEntity,\n generateRepositoryInterface,\n generateRepositoryImpl,\n generateUseCase,\n generateComponent,\n generatePage,\n generateTemplate\n} from '../templates/ddd/index.js';\n\n/**\n * DDD (Domain-Driven Design) Generator\n * Generates complete module structure with all layers\n */\nexport class DDDGenerator {\n constructor(private config: GeneratorConfig) {}\n\n async generate(): Promise<GeneratorResult> {\n const files: GeneratedFile[] = [];\n const cwd = process.cwd();\n const { moduleName, routePath } = this.config;\n\n // Define directory structure\n const moduleDir = path.join(cwd, 'modules', moduleName);\n const appDir = path.join(cwd, 'app', '(dashboard)', routePath);\n\n // Create directories\n const dirs = [\n path.join(moduleDir, 'domain', 'entities'),\n path.join(moduleDir, 'domain', 'repositories'),\n path.join(moduleDir, 'application', 'use-cases'),\n path.join(moduleDir, 'infrastructure', 'repositories'),\n path.join(moduleDir, 'presentation', 'components'),\n appDir\n ];\n\n await createDirectories(dirs);\n\n // Generate files\n // 1. Domain Layer - Entity\n files.push({\n path: path.join(moduleDir, 'domain', 'entities', `${moduleName}.entity.ts`),\n content: generateEntity(this.config)\n });\n\n // 2. Domain Layer - Repository Interface\n files.push({\n path: path.join(moduleDir, 'domain', 'repositories', `${moduleName}.repository.interface.ts`),\n content: generateRepositoryInterface(this.config)\n });\n\n // 3. Infrastructure Layer - Repository Implementation\n files.push({\n path: path.join(moduleDir, 'infrastructure', 'repositories', `${moduleName}.repository.ts`),\n content: generateRepositoryImpl(this.config)\n });\n\n // 4. Application Layer - Use Case\n files.push({\n path: path.join(moduleDir, 'application', 'use-cases', `get-${moduleName}s.use-case.ts`),\n content: generateUseCase(this.config)\n });\n\n // 5. Presentation Layer - Component\n files.push({\n path: path.join(moduleDir, 'presentation', 'components', `${moduleName}-list.tsx`),\n content: generateComponent(this.config)\n });\n\n // 6. App Layer - Page\n files.push({\n path: path.join(appDir, 'page.tsx'),\n content: generatePage(this.config)\n });\n\n // 7. App Layer - Template (if animations enabled)\n if (this.config.animations.pageTransitions) {\n files.push({\n path: path.join(appDir, 'template.tsx'),\n content: generateTemplate(this.config)\n });\n }\n\n // Write all files\n await writeFiles(files);\n\n // Generate instructions\n const instructions = this.generateInstructions();\n\n return { files, instructions };\n }\n\n private generateInstructions(): string[] {\n const instructions: string[] = [];\n\n instructions.push(`Navigate to your page: http://localhost:3000/${this.config.routePath}`);\n\n // Check for dependencies\n const deps: string[] = [];\n if (this.config.dataFetching === 'tanstack') {\n deps.push('@tanstack/react-query');\n }\n if (this.config.animations.pageTransitions || this.config.animations.listAnimations) {\n deps.push('framer-motion');\n }\n\n if (deps.length > 0) {\n instructions.push(`Install dependencies: npm install ${deps.join(' ')}`);\n }\n\n instructions.push('Customize the generated code to fit your needs');\n instructions.push('Connect to your real API (replace mock repository)');\n\n if (this.config.dataFetching === 'tanstack') {\n instructions.push('Ensure your app is wrapped in <QueryClientProvider>');\n }\n\n return instructions;\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { logger } from './logger.js';\n\n/**\n * File system utilities\n */\n\n/**\n * Ensures a directory exists, creates it if it doesn't\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\n/**\n * Writes content to a file, creating parent directories if needed\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Checks if a file or directory exists\n */\nexport async function exists(pathToCheck: string): Promise<boolean> {\n try {\n await fs.access(pathToCheck);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Reads a file and returns its content\n */\nexport async function readFile(filePath: string): Promise<string> {\n return await fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Checks if path is a directory\n */\nexport async function isDirectory(pathToCheck: string): Promise<boolean> {\n try {\n const stats = await fs.stat(pathToCheck);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Removes a file or directory\n */\nexport async function remove(pathToRemove: string): Promise<void> {\n await fs.remove(pathToRemove);\n}\n\n/**\n * Creates multiple directories at once\n */\nexport async function createDirectories(dirs: string[]): Promise<void> {\n for (const dir of dirs) {\n await ensureDir(dir);\n }\n}\n\n/**\n * Writes multiple files at once\n */\nexport async function writeFiles(files: Array<{ path: string; content: string }>): Promise<void> {\n for (const file of files) {\n await writeFile(file.path, file.content);\n logger.dim(` Created: ${file.path}`);\n }\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Domain Entity interface with DTOs\n */\nexport function generateEntity(config: GeneratorConfig): string {\n const { entityName, moduleName, columns } = config;\n\n const columnFields = columns.map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string' // ISO string for dates\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n');\n\n const createDTOFields = columns\n .filter(c => !['id', 'createdAt', 'updatedAt'].includes(c.key))\n .map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string'\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n');\n\n return `/**\n * Domain Entity: ${entityName}\n * Generated by shadcn-page-gen\n */\nexport interface ${entityName} {\n id: string;\n${columnFields}\n updatedAt: Date;\n}\n\nexport interface Create${entityName}DTO {\n${createDTOFields || ' // Add your fields here'}\n}\n\nexport interface Update${entityName}DTO extends Partial<Create${entityName}DTO> {\n id: string;\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Domain Repository Interface\n */\nexport function generateRepositoryInterface(config: GeneratorConfig): string {\n const { entityName, moduleName } = config;\n\n return `import { ${entityName}, Create${entityName}DTO, Update${entityName}DTO } from '../entities/${moduleName}.entity';\n\n/**\n * Repository Interface: ${entityName}\n * Generated by shadcn-page-gen\n */\nexport interface I${entityName}Repository {\n findAll(params?: any): Promise<${entityName}[]>;\n findById(id: string): Promise<${entityName} | null>;\n create(data: Create${entityName}DTO): Promise<${entityName}>;\n update(data: Update${entityName}DTO): Promise<${entityName}>;\n delete(id: string): Promise<void>;\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Infrastructure Repository Implementation with mock data\n */\nexport function generateRepositoryImpl(config: GeneratorConfig): string {\n const { entityName, moduleName, columns } = config;\n\n // Generate mock data fields\n const mockFields = columns.map(c => {\n if (c.key === 'createdAt') {\n return ` createdAt: new Date().toISOString(),`;\n }\n if (c.key === 'status') {\n return ` status: Math.random() > 0.5 ? 'Active' : 'Inactive',`;\n }\n if (c.key === 'name') {\n return ` name: \\`${entityName} \\${i + 1}\\`,`;\n }\n if (c.type === 'number') {\n return ` ${c.key}: (i + 1) * 100,`;\n }\n if (c.type === 'boolean') {\n return ` ${c.key}: Math.random() > 0.5,`;\n }\n if (c.type === 'date') {\n return ` ${c.key}: new Date().toISOString(),`;\n }\n return ` ${c.key}: \\`${c.label} \\${i + 1}\\`,`;\n }).join('\\n');\n\n return `import { ${entityName}, Create${entityName}DTO, Update${entityName}DTO } from '../../domain/entities/${moduleName}.entity';\nimport { I${entityName}Repository } from '../../domain/repositories/${moduleName}.repository.interface';\n\n/**\n * Repository Implementation: ${entityName}\n * Generated by shadcn-page-gen\n *\n * This is a mock implementation with in-memory data.\n * Replace with your actual API calls.\n */\nexport class ${entityName}Repository implements I${entityName}Repository {\n // Mock data - replace with real API calls\n private items: ${entityName}[] = Array.from({ length: 10 }).map((_, i) => ({\n id: (i + 1).toString(),\n${mockFields}\n updatedAt: new Date(),\n })) as unknown as ${entityName}[];\n\n async findAll(params?: any): Promise<${entityName}[]> {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Implement sorting, filtering, pagination\n // const { sortBy, order, page, limit } = params || {};\n\n return [...this.items];\n }\n\n async findById(id: string): Promise<${entityName} | null> {\n await new Promise(resolve => setTimeout(resolve, 300));\n const item = this.items.find(i => i.id === id);\n return item || null;\n }\n\n async create(data: Create${entityName}DTO): Promise<${entityName}> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const newItem: ${entityName} = {\n id: Date.now().toString(),\n ...data,\n updatedAt: new Date(),\n ${columns.some(c => c.key === 'createdAt') ? 'createdAt: new Date().toISOString(),' : ''}\n } as unknown as ${entityName};\n\n this.items.push(newItem);\n return newItem;\n }\n\n async update(data: Update${entityName}DTO): Promise<${entityName}> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const index = this.items.findIndex(i => i.id === data.id);\n if (index === -1) {\n throw new Error(\\`${entityName} with id \\${data.id} not found\\`);\n }\n\n this.items[index] = {\n ...this.items[index],\n ...data,\n updatedAt: new Date(),\n } as ${entityName};\n\n return this.items[index];\n }\n\n async delete(id: string): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const index = this.items.findIndex(i => i.id === id);\n if (index === -1) {\n throw new Error(\\`${entityName} with id \\${id} not found\\`);\n }\n\n this.items.splice(index, 1);\n }\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Application Use Case\n */\nexport function generateUseCase(config: GeneratorConfig): string {\n const { entityName, moduleName } = config;\n\n return `import { ${entityName} } from '../../domain/entities/${moduleName}.entity';\nimport { I${entityName}Repository } from '../../domain/repositories/${moduleName}.repository.interface';\n\n/**\n * Use Case: Get ${entityName}s\n * Generated by shadcn-page-gen\n */\nexport class Get${entityName}sUseCase {\n constructor(private readonly repository: I${entityName}Repository) {}\n\n async execute(params?: any): Promise<${entityName}[]> {\n return await this.repository.findAll(params);\n }\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Presentation Layer Component with full CRUD features\n * This is the most complex template with all UI logic\n */\nexport function generateComponent(config: GeneratorConfig): string {\n const {\n entityName,\n moduleName,\n pageName,\n routePath,\n columns,\n filters,\n includeStats,\n includeRowSelection,\n dataFetching,\n sortableColumns,\n animations\n } = config;\n\n const isTanStack = dataFetching === 'tanstack';\n const hasAnimations = animations.listAnimations || animations.cardAnimations;\n\n // Generate imports based on features\n const imports = `'use client';\n\n${hasAnimations ? `import { motion } from 'framer-motion';` : ''}\nimport { useEffect, useState } from 'react';\nimport { ${entityName} } from '../../domain/entities/${moduleName}.entity';\nimport { Get${entityName}sUseCase } from '../../application/use-cases/get-${moduleName}s.use-case';\nimport { ${entityName}Repository } from '../../infrastructure/repositories/${moduleName}.repository';\n${isTanStack ? `import { useQuery } from '@tanstack/react-query';` : ''}\nimport { Button } from '@/components/ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Input } from '@/components/ui/input';\n${filters.some(f => f.type === 'date') ? `import { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { format } from 'date-fns';` : ''}\nimport { Badge } from '@/components/ui/badge';\n${includeStats ? `import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';` : ''}\nimport {\n Search,\n Plus,\n X,\n RefreshCcw,\n Eye,\n Pencil,\n Trash2,\n MoreHorizontal,\n ${sortableColumns.length > 0 ? 'ArrowUpDown, ArrowUp, ArrowDown,' : ''}\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/components/ui/pagination\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\n${includeRowSelection ? `import { Checkbox } from \"@/components/ui/checkbox\";` : ''}`;\n\n // Generate animation variants if needed\n const animationVariants = hasAnimations ? `\n// Framer Motion animation variants\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: ${animations.intensity === 'bold' ? '0.1' : animations.intensity === 'subtle' ? '0.03' : '0.05'}\n }\n }\n};\n\nconst itemVariants = {\n hidden: { opacity: 0, x: -20 },\n visible: {\n opacity: 1,\n x: 0,\n transition: { duration: ${animations.intensity === 'bold' ? '0.3' : animations.intensity === 'subtle' ? '0.15' : '0.2'} }\n }\n};\n` : '';\n\n // Generate data fetching code\n const dataFetchingCode = isTanStack ? `\n // TanStack Query data fetching\n const { data, isLoading: loading, refetch } = useQuery({\n queryKey: ['${moduleName}', searchParams.toString()],\n queryFn: async () => {\n const repo = new ${entityName}Repository();\n const useCase = new Get${entityName}sUseCase(repo);\n return await useCase.execute({\n q: searchParams.get('q'),\n page: searchParams.get('page'),\n limit: pageSize,\n sortBy: searchParams.get('sortBy'),\n order: searchParams.get('order'),\n ...Object.fromEntries(searchParams.entries())\n });\n }\n });` : `\n const [data, setData] = useState<${entityName}[]>([]);\n const [loading, setLoading] = useState(true);\n\n const fetchData = async () => {\n setLoading(true);\n try {\n const repo = new ${entityName}Repository();\n const useCase = new Get${entityName}sUseCase(repo);\n const result = await useCase.execute({\n q: searchParams.get('q'),\n page: searchParams.get('page'),\n limit: pageSize,\n sortBy: searchParams.get('sortBy'),\n order: searchParams.get('order'),\n ...Object.fromEntries(searchParams.entries())\n });\n setData(result);\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchData();\n }, [searchParams]);`;\n\n // Generate row selection code\n const rowSelectionCode = includeRowSelection ? `\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n const toggleRow = (id: string) => {\n const newSelected = new Set(selectedRows);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedRows(newSelected);\n };\n\n const toggleAll = () => {\n if (selectedRows.size === (data?.length || 0)) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(data?.map(i => i.id) || []));\n }\n };` : '';\n\n // Generate stats cards\n const statsCards = includeStats ? `\n {/* Stats Cards */}\n ${animations.cardAnimations ? `<motion.div\n className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >` : `<div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">`}\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total ${entityName}s</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">128</div>\n <p className=\"text-xs text-muted-foreground\">+20.1% from last month</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">12</div>\n <p className=\"text-xs text-muted-foreground\">+4 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">4</div>\n <p className=\"text-xs text-muted-foreground\">-2 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Closed</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">2</div>\n <p className=\"text-xs text-muted-foreground\">+1 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n ${animations.cardAnimations ? `</motion.div>` : `</div>`}\n` : '';\n\n // Generate filter components\n const filterComponents = filters.map(f => {\n if (f.type === 'select') {\n return `\n <Select\n value={searchParams.get('${f.key}') || 'all'}\n onValueChange={(value) => updateParam('${f.key}', value === 'all' ? null : value)}\n >\n <SelectTrigger className=\"w-[150px]\">\n <SelectValue placeholder=\"${f.label}\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All ${f.label}</SelectItem>\n <SelectItem value=\"active\">Active</SelectItem>\n <SelectItem value=\"inactive\">Inactive</SelectItem>\n </SelectContent>\n </Select>`;\n } else if (f.type === 'date') {\n return `\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"w-[200px] justify-start text-left font-normal\",\n !searchParams.get('${f.key}') && \"text-muted-foreground\"\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {searchParams.get('${f.key}') ? (\n format(new Date(searchParams.get('${f.key}')!), \"PPP\")\n ) : (\n <span>${f.label}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={searchParams.get('${f.key}') ? new Date(searchParams.get('${f.key}')!) : undefined}\n onSelect={(date) => updateParam('${f.key}', date ? date.toISOString() : null)}\n initialFocus\n />\n </PopoverContent>\n </Popover>`;\n }\n return '';\n }).join('\\n');\n\n // Generate table column headers\n const tableHeaders = columns.map(c => {\n const isSortable = sortableColumns.includes(c.key);\n if (isSortable) {\n return ` <TableHead className=\"cursor-pointer\" onClick={() => handleSort('${c.key}')}>\n <div className=\"flex items-center gap-1\">\n ${c.label.toUpperCase()}\n {searchParams.get('sortBy') === '${c.key}' ? (\n searchParams.get('order') === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : <ArrowUpDown className=\"h-3 w-3 text-muted-foreground\" />}\n </div>\n </TableHead>`;\n }\n return ` <TableHead>${c.label.toUpperCase()}</TableHead>`;\n }).join('\\n');\n\n // Generate table cells\n const tableCells = columns.map(c => {\n if (c.key === 'status') {\n return ` <TableCell>\n <Badge variant={item.status === 'Active' ? 'default' : 'secondary'} className=\"rounded-full\">\n {item.status}\n </Badge>\n </TableCell>`;\n }\n if (c.type === 'date') {\n return ` <TableCell className=\"text-muted-foreground\">{new Date(item.${c.key}).toLocaleDateString()}</TableCell>`;\n }\n return ` <TableCell>{item.${c.key}}</TableCell>`;\n }).join('\\n');\n\n const colSpan = columns.length + 2 + (includeRowSelection ? 1 : 0);\n\n return `${imports}\n\n/**\n * ${entityName} List Component\n * Generated by shadcn-page-gen\n *\n * Features:\n * - Search and filters\n * - Sorting: ${sortableColumns.length > 0 ? sortableColumns.join(', ') : 'None'}\n * - Pagination\n * - Row actions (View, Edit, Delete)\n * ${includeStats ? '- Stats cards' : ''}\n * ${includeRowSelection ? '- Row selection' : ''}\n * ${animations.listAnimations || animations.cardAnimations ? `- Framer Motion animations (${animations.intensity})` : ''}\n */\n${animationVariants}\nexport function ${entityName}List() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || '');\n const pageSize = Number(searchParams.get('limit')) || 10;\n${dataFetchingCode}\n${rowSelectionCode}\n\n const updateParam = (key: string, value: string | null) => {\n const params = new URLSearchParams(searchParams.toString());\n if (value) params.set(key, value);\n else params.delete(key);\n\n if (key !== 'page') params.set('page', '1');\n\n router.push('?' + params.toString());\n };\n\n ${sortableColumns.length > 0 ? `const handleSort = (key: string) => {\n const currentSort = searchParams.get('sortBy');\n const currentOrder = searchParams.get('order');\n\n let newOrder = 'asc';\n if (currentSort === key && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n\n const params = new URLSearchParams(searchParams.toString());\n params.set('sortBy', key);\n params.set('order', newOrder);\n router.push('?' + params.toString());\n };` : ''}\n\n return (\n <div className=\"space-y-6\">\n${statsCards}\n {/* Actions Bar */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-1 items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onBlur={() => updateParam('q', searchTerm)}\n className=\"pl-9 w-full md:max-w-md\"\n />\n </div>\n${filterComponents}\n {(searchParams.toString().length > 0) && (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => router.push('/${routePath}')} title=\"Reset Filters\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => ${isTanStack ? 'refetch()' : 'fetchData()'}}>\n <RefreshCcw className=\"mr-2 h-4 w-4\" /> Refresh\n </Button>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New ${entityName}\n </Button>\n </div>\n </div>\n\n {/* Main Table */}\n <Card>\n <CardContent className=\"p-0\">\n <Table>\n <TableHeader>\n <TableRow>\n ${includeRowSelection ? `<TableHead className=\"w-[50px]\"><Checkbox checked={data?.length > 0 && selectedRows.size === data?.length} onCheckedChange={toggleAll} /></TableHead>` : ''}\n <TableHead className=\"w-[100px]\">ID</TableHead>\n${tableHeaders}\n <TableHead className=\"text-right\">ACTIONS</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">Loading data...</TableCell>\n </TableRow>\n ) : !data || data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">No results found.</TableCell>\n </TableRow>\n ) : (\n ${animations.listAnimations ? `\n data.map((item, index) => (\n <motion.tr\n key={item.id}\n variants={itemVariants}\n initial=\"hidden\"\n animate=\"visible\"\n custom={index}\n className=\"group\"\n >` : `data.map((item) => (\n <TableRow key={item.id} className=\"group\">`}\n ${includeRowSelection ? `<TableCell><Checkbox checked={selectedRows.has(item.id)} onCheckedChange={() => toggleRow(item.id)} /></TableCell>` : ''}\n <TableCell className=\"font-medium\">{item.id}</TableCell>\n${tableCells}\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-blue-500 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-950\">\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-green-500 hover:text-green-600 hover:bg-green-50 dark:hover:bg-green-950\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-red-500 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-950\">\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuItem>View Details</DropdownMenuItem>\n <DropdownMenuItem>Edit Record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TableCell>\n ${animations.listAnimations ? `</motion.tr>` : `</TableRow>`}\n ))\n )}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n {/* Pagination */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>Show</span>\n <Select value={pageSize.toString()} onValueChange={(v) => updateParam('limit', v)}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue placeholder={pageSize.toString()} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {[10, 20, 30, 50, 100].map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>entries</span>\n </div>\n <Pagination className=\"justify-end w-auto\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates App Router Page\n */\nexport function generatePage(config: GeneratorConfig): string {\n const { pageName, moduleName, entityName } = config;\n\n return `import { Suspense } from 'react';\nimport { ${entityName}List } from '@/modules/${moduleName}/presentation/components/${moduleName}-list';\n\n/**\n * ${pageName} Page\n * Generated by shadcn-page-gen\n */\nexport default function ${entityName}Page() {\n return (\n <div className=\"container mx-auto py-10 space-y-8\">\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">${pageName}</h1>\n <p className=\"text-muted-foreground\">\n Manage your ${pageName.toLowerCase()}.\n </p>\n </div>\n\n <Suspense fallback={<div>Loading...</div>}>\n <${entityName}List />\n </Suspense>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates App Router Template for page transitions\n */\nexport function generateTemplate(config: GeneratorConfig): string {\n const { animations } = config;\n\n // Get animation config based on intensity\n const getAnimationConfig = () => {\n switch (animations.intensity) {\n case 'subtle':\n return {\n initial: '{ opacity: 0, y: 10 }',\n animate: '{ opacity: 1, y: 0 }',\n transition: '{ duration: 0.2 }'\n };\n case 'bold':\n return {\n initial: '{ opacity: 0, scale: 0.95, y: 30 }',\n animate: '{ opacity: 1, scale: 1, y: 0 }',\n transition: '{ duration: 0.4, ease: [0.43, 0.13, 0.23, 0.96] }'\n };\n default: // moderate\n return {\n initial: '{ opacity: 0, y: 20 }',\n animate: '{ opacity: 1, y: 0 }',\n transition: '{ duration: 0.3, ease: \"easeInOut\" }'\n };\n }\n };\n\n const animConfig = getAnimationConfig();\n\n return `'use client';\n\nimport { motion } from 'framer-motion';\n\n/**\n * Page Template with Framer Motion transitions\n * Generated by shadcn-page-gen\n */\nexport default function Template({ children }: { children: React.ReactNode }) {\n return (\n <motion.div\n initial=${animConfig.initial}\n animate=${animConfig.animate}\n exit={{ opacity: 0, y: -20 }}\n transition=${animConfig.transition}\n >\n {children}\n </motion.div>\n );\n}\n`;\n}\n","import path from 'path';\nimport type { GeneratorConfig, GeneratorResult, GeneratedFile } from '../types/index.js';\nimport { writeFiles, createDirectories } from '../utils/file-system.js';\nimport {\n generateSimplifiedComponent,\n generateSimplifiedPage,\n generateTemplate\n} from '../templates/simplified/index.js';\n\n/**\n * Simplified Generator\n * Generates just components and pages without DDD layers\n */\nexport class SimplifiedGenerator {\n constructor(private config: GeneratorConfig) {}\n\n async generate(): Promise<GeneratorResult> {\n const files: GeneratedFile[] = [];\n const cwd = process.cwd();\n const { moduleName, routePath } = this.config;\n\n // Define directory structure\n const componentDir = path.join(cwd, 'components', moduleName);\n const appDir = path.join(cwd, 'app', '(dashboard)', routePath);\n\n // Create directories\n await createDirectories([componentDir, appDir]);\n\n // Generate files\n // 1. Component\n files.push({\n path: path.join(componentDir, `${moduleName}-list.tsx`),\n content: generateSimplifiedComponent(this.config)\n });\n\n // 2. Page\n files.push({\n path: path.join(appDir, 'page.tsx'),\n content: generateSimplifiedPage(this.config)\n });\n\n // 3. Template (if animations enabled)\n if (this.config.animations.pageTransitions) {\n files.push({\n path: path.join(appDir, 'template.tsx'),\n content: generateTemplate(this.config)\n });\n }\n\n // Write all files\n await writeFiles(files);\n\n // Generate instructions\n const instructions = this.generateInstructions();\n\n return { files, instructions };\n }\n\n private generateInstructions(): string[] {\n const instructions: string[] = [];\n\n instructions.push(`Navigate to your page: http://localhost:3000/${this.config.routePath}`);\n\n // Check for dependencies\n const deps: string[] = [];\n if (this.config.dataFetching === 'tanstack') {\n deps.push('@tanstack/react-query');\n }\n if (this.config.animations.pageTransitions || this.config.animations.listAnimations) {\n deps.push('framer-motion');\n }\n\n if (deps.length > 0) {\n instructions.push(`Install dependencies: npm install ${deps.join(' ')}`);\n }\n\n instructions.push('Customize the generated code to fit your needs');\n instructions.push('Replace mock data with your real API');\n\n if (this.config.dataFetching === 'tanstack') {\n instructions.push('Ensure your app is wrapped in <QueryClientProvider>');\n }\n\n return instructions;\n }\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Simplified Component (without DDD layers)\n * Direct data fetching without repository pattern\n */\nexport function generateSimplifiedComponent(config: GeneratorConfig): string {\n const {\n entityName,\n moduleName,\n pageName,\n routePath,\n columns,\n filters,\n includeStats,\n includeRowSelection,\n dataFetching,\n sortableColumns,\n animations\n } = config;\n\n const isTanStack = dataFetching === 'tanstack';\n const hasAnimations = animations.listAnimations || animations.cardAnimations;\n\n // Mock data type interface\n const mockDataInterface = `interface ${entityName} {\n id: string;\n${columns.map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string'\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n')}\n updatedAt: Date;\n}`;\n\n // Generate mock data\n const mockDataFields = columns.map(c => {\n if (c.key === 'createdAt') {\n return ` createdAt: new Date().toISOString(),`;\n }\n if (c.key === 'status') {\n return ` status: Math.random() > 0.5 ? 'Active' : 'Inactive',`;\n }\n if (c.key === 'name') {\n return ` name: \\`${entityName} \\${i + 1}\\`,`;\n }\n if (c.type === 'number') {\n return ` ${c.key}: (i + 1) * 100,`;\n }\n if (c.type === 'boolean') {\n return ` ${c.key}: Math.random() > 0.5,`;\n }\n if (c.type === 'date') {\n return ` ${c.key}: new Date().toISOString(),`;\n }\n return ` ${c.key}: \\`${c.label} \\${i + 1}\\`,`;\n }).join('\\n');\n\n const mockData = `// Mock data - replace with your API call\nconst MOCK_DATA: ${entityName}[] = Array.from({ length: 10 }).map((_, i) => ({\n id: (i + 1).toString(),\n${mockDataFields}\n updatedAt: new Date(),\n})) as unknown as ${entityName}[];`;\n\n // Data fetching function\n const fetchFunction = isTanStack ? '' : `\n // Fetch data function - replace with your API call\n const fetchData = async () => {\n setLoading(true);\n try {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Replace with real API call\n // const response = await fetch('/api/${moduleName}');\n // const result = await response.json();\n\n setData(MOCK_DATA);\n } catch (error) {\n console.error('Error fetching data:', error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchData();\n }, [searchParams]);`;\n\n const dataFetchingSetup = isTanStack ? `\n // TanStack Query data fetching\n const { data, isLoading: loading, refetch } = useQuery({\n queryKey: ['${moduleName}', searchParams.toString()],\n queryFn: async () => {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Replace with real API call\n // const response = await fetch('/api/${moduleName}');\n // return await response.json();\n\n return MOCK_DATA;\n }\n });` : `\n const [data, setData] = useState<${entityName}[]>([]);\n const [loading, setLoading] = useState(true);\n${fetchFunction}`;\n\n // Similar structure to DDD component but without repository imports\n const imports = `'use client';\n\n${hasAnimations ? `import { motion } from 'framer-motion';` : ''}\nimport { useEffect, useState } from 'react';\n${isTanStack ? `import { useQuery } from '@tanstack/react-query';` : ''}\nimport { Button } from '@/components/ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Input } from '@/components/ui/input';\n${filters.some(f => f.type === 'date') ? `import { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { format } from 'date-fns';` : ''}\nimport { Badge } from '@/components/ui/badge';\n${includeStats ? `import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';` : ''}\nimport {\n Search,\n Plus,\n X,\n RefreshCcw,\n Eye,\n Pencil,\n Trash2,\n MoreHorizontal,\n ${sortableColumns.length > 0 ? 'ArrowUpDown, ArrowUp, ArrowDown,' : ''}\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/components/ui/pagination\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\n${includeRowSelection ? `import { Checkbox } from \"@/components/ui/checkbox\";` : ''}`;\n\n // Animation variants\n const animationVariants = hasAnimations ? `\n// Framer Motion animation variants\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: ${animations.intensity === 'bold' ? '0.1' : animations.intensity === 'subtle' ? '0.03' : '0.05'}\n }\n }\n};\n\nconst itemVariants = {\n hidden: { opacity: 0, x: -20 },\n visible: {\n opacity: 1,\n x: 0,\n transition: { duration: ${animations.intensity === 'bold' ? '0.3' : animations.intensity === 'subtle' ? '0.15' : '0.2'} }\n }\n};\n` : '';\n\n // Row selection\n const rowSelectionCode = includeRowSelection ? `\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n const toggleRow = (id: string) => {\n const newSelected = new Set(selectedRows);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedRows(newSelected);\n };\n\n const toggleAll = () => {\n if (selectedRows.size === (data?.length || 0)) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(data?.map(i => i.id) || []));\n }\n };` : '';\n\n // Stats cards (same as DDD)\n const statsCards = includeStats ? `\n {/* Stats Cards */}\n ${animations.cardAnimations ? `<motion.div\n className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >` : `<div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">`}\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total ${entityName}s</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">128</div>\n <p className=\"text-xs text-muted-foreground\">+20.1% from last month</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">12</div>\n <p className=\"text-xs text-muted-foreground\">+4 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">4</div>\n <p className=\"text-xs text-muted-foreground\">-2 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Closed</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">2</div>\n <p className=\"text-xs text-muted-foreground\">+1 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n ${animations.cardAnimations ? `</motion.div>` : `</div>`}\n` : '';\n\n // Filter components (same as DDD)\n const filterComponents = filters.map(f => {\n if (f.type === 'select') {\n return `\n <Select\n value={searchParams.get('${f.key}') || 'all'}\n onValueChange={(value) => updateParam('${f.key}', value === 'all' ? null : value)}\n >\n <SelectTrigger className=\"w-[150px]\">\n <SelectValue placeholder=\"${f.label}\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All ${f.label}</SelectItem>\n <SelectItem value=\"active\">Active</SelectItem>\n <SelectItem value=\"inactive\">Inactive</SelectItem>\n </SelectContent>\n </Select>`;\n } else if (f.type === 'date') {\n return `\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"w-[200px] justify-start text-left font-normal\",\n !searchParams.get('${f.key}') && \"text-muted-foreground\"\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {searchParams.get('${f.key}') ? (\n format(new Date(searchParams.get('${f.key}')!), \"PPP\")\n ) : (\n <span>${f.label}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={searchParams.get('${f.key}') ? new Date(searchParams.get('${f.key}')!) : undefined}\n onSelect={(date) => updateParam('${f.key}', date ? date.toISOString() : null)}\n initialFocus\n />\n </PopoverContent>\n </Popover>`;\n }\n return '';\n }).join('\\n');\n\n // Table headers (same as DDD)\n const tableHeaders = columns.map(c => {\n const isSortable = sortableColumns.includes(c.key);\n if (isSortable) {\n return ` <TableHead className=\"cursor-pointer\" onClick={() => handleSort('${c.key}')}>\n <div className=\"flex items-center gap-1\">\n ${c.label.toUpperCase()}\n {searchParams.get('sortBy') === '${c.key}' ? (\n searchParams.get('order') === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : <ArrowUpDown className=\"h-3 w-3 text-muted-foreground\" />}\n </div>\n </TableHead>`;\n }\n return ` <TableHead>${c.label.toUpperCase()}</TableHead>`;\n }).join('\\n');\n\n // Table cells (same as DDD)\n const tableCells = columns.map(c => {\n if (c.key === 'status') {\n return ` <TableCell>\n <Badge variant={item.status === 'Active' ? 'default' : 'secondary'} className=\"rounded-full\">\n {item.status}\n </Badge>\n </TableCell>`;\n }\n if (c.type === 'date') {\n return ` <TableCell className=\"text-muted-foreground\">{new Date(item.${c.key}).toLocaleDateString()}</TableCell>`;\n }\n return ` <TableCell>{item.${c.key}}</TableCell>`;\n }).join('\\n');\n\n const colSpan = columns.length + 2 + (includeRowSelection ? 1 : 0);\n\n return `${imports}\n\n/**\n * ${entityName} List Component (Simplified Architecture)\n * Generated by shadcn-page-gen\n */\n\n${mockDataInterface}\n\n${mockData}\n${animationVariants}\nexport function ${entityName}List() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || '');\n const pageSize = Number(searchParams.get('limit')) || 10;\n${dataFetchingSetup}\n${rowSelectionCode}\n\n const updateParam = (key: string, value: string | null) => {\n const params = new URLSearchParams(searchParams.toString());\n if (value) params.set(key, value);\n else params.delete(key);\n\n if (key !== 'page') params.set('page', '1');\n\n router.push('?' + params.toString());\n };\n\n ${sortableColumns.length > 0 ? `const handleSort = (key: string) => {\n const currentSort = searchParams.get('sortBy');\n const currentOrder = searchParams.get('order');\n\n let newOrder = 'asc';\n if (currentSort === key && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n\n const params = new URLSearchParams(searchParams.toString());\n params.set('sortBy', key);\n params.set('order', newOrder);\n router.push('?' + params.toString());\n };` : ''}\n\n return (\n <div className=\"space-y-6\">\n${statsCards}\n {/* Actions Bar */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-1 items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onBlur={() => updateParam('q', searchTerm)}\n className=\"pl-9 w-full md:max-w-md\"\n />\n </div>\n${filterComponents}\n {(searchParams.toString().length > 0) && (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => router.push('/${routePath}')} title=\"Reset Filters\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => ${isTanStack ? 'refetch()' : 'fetchData()'}}>\n <RefreshCcw className=\"mr-2 h-4 w-4\" /> Refresh\n </Button>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New ${entityName}\n </Button>\n </div>\n </div>\n\n {/* Main Table */}\n <Card>\n <CardContent className=\"p-0\">\n <Table>\n <TableHeader>\n <TableRow>\n ${includeRowSelection ? `<TableHead className=\"w-[50px]\"><Checkbox checked={data?.length > 0 && selectedRows.size === data?.length} onCheckedChange={toggleAll} /></TableHead>` : ''}\n <TableHead className=\"w-[100px]\">ID</TableHead>\n${tableHeaders}\n <TableHead className=\"text-right\">ACTIONS</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">Loading data...</TableCell>\n </TableRow>\n ) : !data || data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">No results found.</TableCell>\n </TableRow>\n ) : (\n ${animations.listAnimations ? `\n data.map((item, index) => (\n <motion.tr\n key={item.id}\n variants={itemVariants}\n initial=\"hidden\"\n animate=\"visible\"\n custom={index}\n className=\"group\"\n >` : `data.map((item) => (\n <TableRow key={item.id} className=\"group\">`}\n ${includeRowSelection ? `<TableCell><Checkbox checked={selectedRows.has(item.id)} onCheckedChange={() => toggleRow(item.id)} /></TableCell>` : ''}\n <TableCell className=\"font-medium\">{item.id}</TableCell>\n${tableCells}\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-blue-500 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-950\">\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-green-500 hover:text-green-600 hover:bg-green-50 dark:hover:bg-green-950\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-red-500 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-950\">\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuItem>View Details</DropdownMenuItem>\n <DropdownMenuItem>Edit Record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TableCell>\n ${animations.listAnimations ? `</motion.tr>` : `</TableRow>`}\n ))\n )}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n {/* Pagination */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>Show</span>\n <Select value={pageSize.toString()} onValueChange={(v) => updateParam('limit', v)}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue placeholder={pageSize.toString()} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {[10, 20, 30, 50, 100].map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>entries</span>\n </div>\n <Pagination className=\"justify-end w-auto\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Simplified Page\n */\nexport function generateSimplifiedPage(config: GeneratorConfig): string {\n const { pageName, moduleName, entityName } = config;\n\n return `import { Suspense } from 'react';\nimport { ${entityName}List } from '@/components/${moduleName}/${moduleName}-list';\n\n/**\n * ${pageName} Page\n * Generated by shadcn-page-gen (Simplified Architecture)\n */\nexport default function ${entityName}Page() {\n return (\n <div className=\"container mx-auto py-10 space-y-8\">\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">${pageName}</h1>\n <p className=\"text-muted-foreground\">\n Manage your ${pageName.toLowerCase()}.\n </p>\n </div>\n\n <Suspense fallback={<div>Loading...</div>}>\n <${entityName}List />\n </Suspense>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig, GeneratorResult } from '../types/index.js';\nimport { DDDGenerator } from './ddd-generator.js';\nimport { SimplifiedGenerator } from './simplified-generator.js';\n\n/**\n * Main page generator orchestrator\n * Chooses between DDD and Simplified generators based on config\n */\nexport class PageGenerator {\n private generator: DDDGenerator | SimplifiedGenerator;\n\n constructor(private config: GeneratorConfig) {\n // Choose generator based on architecture\n this.generator = config.architecture === 'ddd'\n ? new DDDGenerator(config)\n : new SimplifiedGenerator(config);\n }\n\n /**\n * Generates all files and returns result\n */\n async generate(): Promise<GeneratorResult> {\n return await this.generator.generate();\n }\n}\n"],"mappings":"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","names":["prompts","chalk","import_path","fs","path","path","import_path","path","ora"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/prompts.ts","../src/utils/string-transforms.ts","../src/cli/validators.ts","../src/utils/logger.ts","../src/generators/ddd-generator.ts","../src/utils/file-system.ts","../src/templates/ddd/entity.ts","../src/templates/ddd/repository-interface.ts","../src/templates/ddd/repository-impl.ts","../src/templates/ddd/use-case.ts","../src/templates/ddd/component.ts","../src/templates/ddd/page.ts","../src/templates/ddd/template.ts","../src/generators/simplified-generator.ts","../src/templates/simplified/component.ts","../src/templates/simplified/page.ts","../src/generators/index.ts"],"sourcesContent":["import ora from 'ora';\nimport { collectConfiguration } from './prompts.js';\nimport { logger } from '../utils/logger.js';\nimport { PageGenerator } from '../generators/index.js';\n\n/**\n * Main CLI entry point\n */\nexport async function run(): Promise<void> {\n try {\n // Show welcome banner\n console.clear();\n logger.title('šŸŽØ shadcn-page-gen');\n logger.dim('Generate production-ready Next.js pages with shadcn/ui, Tailwind v4, and Framer Motion\\n');\n\n // Collect configuration through interactive prompts\n const config = await collectConfiguration();\n\n if (!config) {\n logger.warning('Operation cancelled');\n process.exit(0);\n }\n\n // Show configuration summary\n console.log('\\n');\n logger.title('šŸ“‹ Configuration Summary');\n logger.info(`Page Name: ${config.pageName}`);\n logger.info(`Route: /${config.routePath}`);\n logger.info(`Architecture: ${config.architecture.toUpperCase()}`);\n logger.info(`Data Fetching: ${config.dataFetching}`);\n logger.info(`Animations: ${config.animations.intensity} intensity`);\n console.log('');\n\n // Generate files\n const spinner = ora('Generating files...').start();\n\n try {\n const generator = new PageGenerator(config);\n const result = await generator.generate();\n\n spinner.succeed('Files generated successfully!');\n\n // Show generated files\n console.log('');\n logger.title('šŸ“ Generated Files');\n result.files.forEach(file => {\n logger.dim(` ${file.path}`);\n });\n\n // Show next steps\n console.log('');\n logger.title('šŸŽ‰ Success!');\n logger.success('Your page has been generated!');\n\n console.log('');\n logger.title('šŸ“ Next Steps');\n result.instructions.forEach((instruction, index) => {\n logger.step(index + 1, result.instructions.length, instruction);\n });\n\n console.log('');\n logger.dim('Happy coding! šŸš€\\n');\n\n } catch (error) {\n spinner.fail('Generation failed');\n throw error;\n }\n\n } catch (error) {\n logger.error('An error occurred:');\n console.error(error);\n process.exit(1);\n }\n}\n\n// Auto-execute when run as CLI\nrun();\n","import prompts from 'prompts';\nimport type { GeneratorConfig, Column, Filter } from '../types/index.js';\nimport { toKebabCase, toPascalCase } from '../utils/string-transforms.js';\nimport { validateNotEmpty, validateRoutePath, validateColumnKey } from './validators.js';\n\n/**\n * Collects all configuration through interactive prompts\n */\nexport async function collectConfiguration(): Promise<GeneratorConfig | null> {\n // Handle Ctrl+C gracefully\n prompts.override({ onCancel: () => process.exit(0) });\n\n console.log('\\nšŸš€ Welcome to shadcn-page-gen!\\n');\n\n // Step 1: Page Name\n const { pageName } = await prompts({\n type: 'text',\n name: 'pageName',\n message: 'What is the name of the page? (e.g., \"User Management\")',\n validate: validateNotEmpty\n });\n\n if (!pageName) return null;\n\n // Step 2: Route Path\n const defaultRoute = toKebabCase(pageName);\n const { routePath } = await prompts({\n type: 'text',\n name: 'routePath',\n message: `What is the route path? (e.g., \"admin/users\")`,\n initial: defaultRoute,\n validate: validateRoutePath\n });\n\n if (!routePath) return null;\n\n const cleanRoutePath = routePath.replace(/^\\/+|\\/+$/g, '');\n const defaultModuleName = cleanRoutePath.replace(/\\//g, '-');\n\n // Step 3: Module Name\n const { moduleName } = await prompts({\n type: 'text',\n name: 'moduleName',\n message: `Module name?`,\n initial: defaultModuleName\n });\n\n if (!moduleName) return null;\n\n // Step 4: Architecture Choice\n const { architecture } = await prompts({\n type: 'select',\n name: 'architecture',\n message: 'Choose architecture pattern:',\n choices: [\n {\n title: 'DDD (Domain-Driven Design)',\n value: 'ddd',\n description: 'Full layers: Domain, Application, Infrastructure, Presentation'\n },\n {\n title: 'Simplified',\n value: 'simplified',\n description: 'Just components and pages - cleaner, faster'\n }\n ],\n initial: 0\n });\n\n if (!architecture) return null;\n\n // Step 5: Entity Name (if DDD)\n const pascalName = toPascalCase(pageName);\n let entityName = pascalName;\n\n if (architecture === 'ddd') {\n const response = await prompts({\n type: 'text',\n name: 'entityName',\n message: `Entity name? (e.g., Product, Ticket)`,\n initial: pascalName\n });\n\n if (!response.entityName) return null;\n entityName = response.entityName;\n }\n\n // Step 6: Columns\n const columns: Column[] = [];\n let addColumn = true;\n\n console.log('\\n--- Table Columns (ID is automatic) ---');\n\n const { useDefaultColumns } = await prompts({\n type: 'confirm',\n name: 'useDefaultColumns',\n message: 'Use default columns? (Name, Status, Created At)',\n initial: true\n });\n\n if (useDefaultColumns) {\n columns.push(\n { label: 'Name', key: 'name', type: 'string', sortable: true },\n { label: 'Status', key: 'status', type: 'string', sortable: true },\n { label: 'Created At', key: 'createdAt', type: 'date', sortable: true }\n );\n } else {\n while (addColumn) {\n const { continueAdding } = await prompts({\n type: 'confirm',\n name: 'continueAdding',\n message: columns.length === 0 ? 'Add a column?' : 'Add another column?',\n initial: true\n });\n\n if (!continueAdding) break;\n\n const columnData = await prompts([\n {\n type: 'text',\n name: 'label',\n message: 'Column Label (e.g., \"Email Address\"):',\n validate: validateNotEmpty\n },\n {\n type: 'text',\n name: 'key',\n message: 'Column Key (e.g., \"email\"):',\n validate: validateColumnKey\n },\n {\n type: 'select',\n name: 'type',\n message: 'Column Type:',\n choices: [\n { title: 'String', value: 'string' },\n { title: 'Number', value: 'number' },\n { title: 'Boolean', value: 'boolean' },\n { title: 'Date', value: 'date' }\n ],\n initial: 0\n }\n ]);\n\n if (columnData.label && columnData.key && columnData.type) {\n columns.push({\n ...columnData,\n sortable: false // Will be set later\n });\n }\n }\n\n if (columns.length === 0) {\n // If user didn't add any, use defaults\n columns.push(\n { label: 'Name', key: 'name', type: 'string', sortable: true },\n { label: 'Status', key: 'status', type: 'string', sortable: true },\n { label: 'Created At', key: 'createdAt', type: 'date', sortable: true }\n );\n }\n }\n\n // Step 7: Filters\n const filters: Filter[] = [];\n\n console.log('\\n--- Filters ---');\n\n const { addFilters } = await prompts({\n type: 'confirm',\n name: 'addFilters',\n message: 'Add filters?',\n initial: true\n });\n\n if (addFilters) {\n let addFilterLoop = true;\n\n while (addFilterLoop) {\n const { continueAddingFilter } = await prompts({\n type: 'confirm',\n name: 'continueAddingFilter',\n message: filters.length === 0 ? 'Add a filter?' : 'Add another filter?',\n initial: filters.length === 0\n });\n\n if (!continueAddingFilter) break;\n\n const filterData = await prompts([\n {\n type: 'select',\n name: 'type',\n message: 'Filter type:',\n choices: [\n { title: 'Dropdown (Select)', value: 'select' },\n { title: 'Date Picker', value: 'date' },\n { title: 'Text Input', value: 'input' }\n ]\n },\n {\n type: 'text',\n name: 'label',\n message: 'Filter Label (e.g., \"Status\"):',\n validate: validateNotEmpty\n },\n {\n type: 'text',\n name: 'key',\n message: 'Filter Key (URL param, e.g., \"status\"):',\n validate: validateColumnKey\n }\n ]);\n\n if (filterData.type && filterData.label && filterData.key) {\n filters.push(filterData);\n }\n }\n }\n\n // Step 8: UI Options\n console.log('\\n--- UI Options ---');\n\n const uiOptions = await prompts([\n {\n type: 'confirm',\n name: 'includeStats',\n message: 'Include Stats Cards at the top?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'includeRowSelection',\n message: 'Include Row Selection (Checkboxes)?',\n initial: false\n }\n ]);\n\n // Step 9: Data Fetching Strategy\n const { dataFetching } = await prompts({\n type: 'select',\n name: 'dataFetching',\n message: 'Data Fetching Strategy:',\n choices: [\n { title: 'Mock Data (Repository Pattern)', value: 'mock', description: 'Default mock data with repository pattern' },\n { title: 'TanStack Query (React Query)', value: 'tanstack', description: 'Modern data fetching with caching' },\n { title: 'Standard (fetch/useEffect)', value: 'fetch', description: 'Basic fetch with useEffect' }\n ],\n initial: 0\n });\n\n // Step 10: Sorting\n const { enableSorting } = await prompts({\n type: 'confirm',\n name: 'enableSorting',\n message: 'Enable Column Sorting?',\n initial: true\n });\n\n let sortableColumns: string[] = [];\n\n if (enableSorting && columns.length > 0) {\n const { selected } = await prompts({\n type: 'multiselect',\n name: 'selected',\n message: 'Select columns to enable sorting (Space to select, Enter to submit):',\n choices: columns.map(c => ({ title: c.label, value: c.key, selected: true })),\n min: 0\n });\n\n sortableColumns = selected || [];\n\n // Update sortable flag on columns\n columns.forEach(col => {\n col.sortable = sortableColumns.includes(col.key);\n });\n }\n\n // Step 11: Animations\n console.log('\\n--- Animations (Framer Motion) ---');\n\n const animationOptions = await prompts([\n {\n type: 'confirm',\n name: 'pageTransitions',\n message: 'Add page transition animations?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'listAnimations',\n message: 'Animate table rows on load?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'cardAnimations',\n message: 'Animate stats cards?',\n initial: uiOptions.includeStats\n },\n {\n type: 'select',\n name: 'intensity',\n message: 'Animation intensity:',\n choices: [\n { title: 'Subtle (professional)', value: 'subtle' },\n { title: 'Moderate (balanced)', value: 'moderate' },\n { title: 'Bold (eye-catching)', value: 'bold' }\n ],\n initial: 1\n }\n ]);\n\n // Build final config\n const config: GeneratorConfig = {\n pageName,\n routePath: cleanRoutePath,\n moduleName,\n architecture,\n entityName,\n columns,\n filters,\n includeStats: uiOptions.includeStats,\n includeRowSelection: uiOptions.includeRowSelection,\n includeSearch: true, // Always include search\n dataFetching,\n sortableColumns,\n animations: {\n pageTransitions: animationOptions.pageTransitions,\n listAnimations: animationOptions.listAnimations,\n cardAnimations: animationOptions.cardAnimations,\n intensity: animationOptions.intensity\n }\n };\n\n return config;\n}\n","/**\n * String transformation utilities\n */\n\n/**\n * Converts string to PascalCase\n * Example: \"user management\" => \"UserManagement\"\n */\nexport function toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())\n .replace(/^[a-z]/, (c) => c.toUpperCase())\n .replace(/[^a-zA-Z0-9]/g, '');\n}\n\n/**\n * Converts string to camelCase\n * Example: \"User Management\" => \"userManagement\"\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Converts string to kebab-case\n * Example: \"User Management\" => \"user-management\"\n */\nexport function toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)+/g, '');\n}\n\n/**\n * Converts string to snake_case\n * Example: \"User Management\" => \"user_management\"\n */\nexport function toSnakeCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/(^_|_$)+/g, '');\n}\n\n/**\n * Pluralizes a word (simple English rules)\n * Example: \"User\" => \"Users\", \"Category\" => \"Categories\"\n */\nexport function pluralize(word: string): string {\n if (word.endsWith('y') && !['ay', 'ey', 'iy', 'oy', 'uy'].some(v => word.endsWith(v))) {\n return word.slice(0, -1) + 'ies';\n }\n if (word.endsWith('s') || word.endsWith('x') || word.endsWith('z') ||\n word.endsWith('ch') || word.endsWith('sh')) {\n return word + 'es';\n }\n return word + 's';\n}\n\n/**\n * Capitalizes first letter\n * Example: \"hello\" => \"Hello\"\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Input validation functions\n */\n\nexport function validateNotEmpty(value: string): boolean | string {\n return value.length > 0 || 'This field is required';\n}\n\nexport function validateRoutePath(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'Route path is required';\n }\n\n // Check for valid characters (alphanumeric, dash, slash)\n if (!/^[a-z0-9\\-\\/]+$/.test(value)) {\n return 'Route path can only contain lowercase letters, numbers, dashes, and slashes';\n }\n\n return true;\n}\n\nexport function validateIdentifier(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'This field is required';\n }\n\n // Check for valid identifier (alphanumeric, underscore, dash)\n if (!/^[a-zA-Z][a-zA-Z0-9_\\-]*$/.test(value)) {\n return 'Must start with a letter and contain only letters, numbers, underscores, and dashes';\n }\n\n return true;\n}\n\nexport function validateColumnKey(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'Column key is required';\n }\n\n // Check for valid JavaScript identifier\n if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(value)) {\n return 'Column key must be a valid JavaScript identifier (camelCase recommended)';\n }\n\n return true;\n}\n","import chalk from 'chalk';\n\n/**\n * Logger utility with colored output\n */\n\nexport const logger = {\n success(message: string): void {\n console.log(chalk.green('āœ“'), message);\n },\n\n error(message: string): void {\n console.log(chalk.red('āœ—'), message);\n },\n\n info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n },\n\n warning(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n },\n\n log(message: string): void {\n console.log(message);\n },\n\n title(message: string): void {\n console.log(chalk.bold.cyan(`\\n${message}\\n`));\n },\n\n step(step: number, total: number, message: string): void {\n console.log(chalk.gray(`[${step}/${total}]`), message);\n },\n\n dim(message: string): void {\n console.log(chalk.dim(message));\n }\n};\n","import path from 'path';\nimport type { GeneratorConfig, GeneratorResult, GeneratedFile } from '../types/index.js';\nimport { writeFiles, createDirectories } from '../utils/file-system.js';\nimport {\n generateEntity,\n generateRepositoryInterface,\n generateRepositoryImpl,\n generateUseCase,\n generateComponent,\n generatePage,\n generateTemplate\n} from '../templates/ddd/index.js';\n\n/**\n * DDD (Domain-Driven Design) Generator\n * Generates complete module structure with all layers\n */\nexport class DDDGenerator {\n constructor(private config: GeneratorConfig) {}\n\n async generate(): Promise<GeneratorResult> {\n const files: GeneratedFile[] = [];\n const cwd = process.cwd();\n const { moduleName, routePath } = this.config;\n\n // Define directory structure\n const moduleDir = path.join(cwd, 'modules', moduleName);\n const appDir = path.join(cwd, 'app', '(dashboard)', routePath);\n\n // Create directories\n const dirs = [\n path.join(moduleDir, 'domain', 'entities'),\n path.join(moduleDir, 'domain', 'repositories'),\n path.join(moduleDir, 'application', 'use-cases'),\n path.join(moduleDir, 'infrastructure', 'repositories'),\n path.join(moduleDir, 'presentation', 'components'),\n appDir\n ];\n\n await createDirectories(dirs);\n\n // Generate files\n // 1. Domain Layer - Entity\n files.push({\n path: path.join(moduleDir, 'domain', 'entities', `${moduleName}.entity.ts`),\n content: generateEntity(this.config)\n });\n\n // 2. Domain Layer - Repository Interface\n files.push({\n path: path.join(moduleDir, 'domain', 'repositories', `${moduleName}.repository.interface.ts`),\n content: generateRepositoryInterface(this.config)\n });\n\n // 3. Infrastructure Layer - Repository Implementation\n files.push({\n path: path.join(moduleDir, 'infrastructure', 'repositories', `${moduleName}.repository.ts`),\n content: generateRepositoryImpl(this.config)\n });\n\n // 4. Application Layer - Use Case\n files.push({\n path: path.join(moduleDir, 'application', 'use-cases', `get-${moduleName}s.use-case.ts`),\n content: generateUseCase(this.config)\n });\n\n // 5. Presentation Layer - Component\n files.push({\n path: path.join(moduleDir, 'presentation', 'components', `${moduleName}-list.tsx`),\n content: generateComponent(this.config)\n });\n\n // 6. App Layer - Page\n files.push({\n path: path.join(appDir, 'page.tsx'),\n content: generatePage(this.config)\n });\n\n // 7. App Layer - Template (if animations enabled)\n if (this.config.animations.pageTransitions) {\n files.push({\n path: path.join(appDir, 'template.tsx'),\n content: generateTemplate(this.config)\n });\n }\n\n // Write all files\n await writeFiles(files);\n\n // Generate instructions\n const instructions = this.generateInstructions();\n\n return { files, instructions };\n }\n\n private generateInstructions(): string[] {\n const instructions: string[] = [];\n\n instructions.push(`Navigate to your page: http://localhost:3000/${this.config.routePath}`);\n\n // Check for dependencies\n const deps: string[] = [];\n if (this.config.dataFetching === 'tanstack') {\n deps.push('@tanstack/react-query');\n }\n if (this.config.animations.pageTransitions || this.config.animations.listAnimations) {\n deps.push('framer-motion');\n }\n\n if (deps.length > 0) {\n instructions.push(`Install dependencies: npm install ${deps.join(' ')}`);\n }\n\n instructions.push('Customize the generated code to fit your needs');\n instructions.push('Connect to your real API (replace mock repository)');\n\n if (this.config.dataFetching === 'tanstack') {\n instructions.push('Ensure your app is wrapped in <QueryClientProvider>');\n }\n\n return instructions;\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { logger } from './logger.js';\n\n/**\n * File system utilities\n */\n\n/**\n * Ensures a directory exists, creates it if it doesn't\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\n/**\n * Writes content to a file, creating parent directories if needed\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Checks if a file or directory exists\n */\nexport async function exists(pathToCheck: string): Promise<boolean> {\n try {\n await fs.access(pathToCheck);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Reads a file and returns its content\n */\nexport async function readFile(filePath: string): Promise<string> {\n return await fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Checks if path is a directory\n */\nexport async function isDirectory(pathToCheck: string): Promise<boolean> {\n try {\n const stats = await fs.stat(pathToCheck);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Removes a file or directory\n */\nexport async function remove(pathToRemove: string): Promise<void> {\n await fs.remove(pathToRemove);\n}\n\n/**\n * Creates multiple directories at once\n */\nexport async function createDirectories(dirs: string[]): Promise<void> {\n for (const dir of dirs) {\n await ensureDir(dir);\n }\n}\n\n/**\n * Writes multiple files at once\n */\nexport async function writeFiles(files: Array<{ path: string; content: string }>): Promise<void> {\n for (const file of files) {\n await writeFile(file.path, file.content);\n logger.dim(` Created: ${file.path}`);\n }\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Domain Entity interface with DTOs\n */\nexport function generateEntity(config: GeneratorConfig): string {\n const { entityName, moduleName, columns } = config;\n\n const columnFields = columns.map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string' // ISO string for dates\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n');\n\n const createDTOFields = columns\n .filter(c => !['id', 'createdAt', 'updatedAt'].includes(c.key))\n .map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string'\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n');\n\n return `/**\n * Domain Entity: ${entityName}\n * Generated by shadcn-page-gen\n */\nexport interface ${entityName} {\n id: string;\n${columnFields}\n updatedAt: Date;\n}\n\nexport interface Create${entityName}DTO {\n${createDTOFields || ' // Add your fields here'}\n}\n\nexport interface Update${entityName}DTO extends Partial<Create${entityName}DTO> {\n id: string;\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Domain Repository Interface\n */\nexport function generateRepositoryInterface(config: GeneratorConfig): string {\n const { entityName, moduleName } = config;\n\n return `import { ${entityName}, Create${entityName}DTO, Update${entityName}DTO } from '../entities/${moduleName}.entity';\n\n/**\n * Repository Interface: ${entityName}\n * Generated by shadcn-page-gen\n */\nexport interface I${entityName}Repository {\n findAll(params?: any): Promise<${entityName}[]>;\n findById(id: string): Promise<${entityName} | null>;\n create(data: Create${entityName}DTO): Promise<${entityName}>;\n update(data: Update${entityName}DTO): Promise<${entityName}>;\n delete(id: string): Promise<void>;\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Infrastructure Repository Implementation with mock data\n */\nexport function generateRepositoryImpl(config: GeneratorConfig): string {\n const { entityName, moduleName, columns } = config;\n\n // Generate mock data fields\n const mockFields = columns.map(c => {\n if (c.key === 'createdAt') {\n return ` createdAt: new Date().toISOString(),`;\n }\n if (c.key === 'status') {\n return ` status: Math.random() > 0.5 ? 'Active' : 'Inactive',`;\n }\n if (c.key === 'name') {\n return ` name: \\`${entityName} \\${i + 1}\\`,`;\n }\n if (c.type === 'number') {\n return ` ${c.key}: (i + 1) * 100,`;\n }\n if (c.type === 'boolean') {\n return ` ${c.key}: Math.random() > 0.5,`;\n }\n if (c.type === 'date') {\n return ` ${c.key}: new Date().toISOString(),`;\n }\n return ` ${c.key}: \\`${c.label} \\${i + 1}\\`,`;\n }).join('\\n');\n\n return `import { ${entityName}, Create${entityName}DTO, Update${entityName}DTO } from '../../domain/entities/${moduleName}.entity';\nimport { I${entityName}Repository } from '../../domain/repositories/${moduleName}.repository.interface';\n\n/**\n * Repository Implementation: ${entityName}\n * Generated by shadcn-page-gen\n *\n * This is a mock implementation with in-memory data.\n * Replace with your actual API calls.\n */\nexport class ${entityName}Repository implements I${entityName}Repository {\n // Mock data - replace with real API calls\n private items: ${entityName}[] = Array.from({ length: 10 }).map((_, i) => ({\n id: (i + 1).toString(),\n${mockFields}\n updatedAt: new Date(),\n })) as unknown as ${entityName}[];\n\n async findAll(params?: any): Promise<${entityName}[]> {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Implement sorting, filtering, pagination\n // const { sortBy, order, page, limit } = params || {};\n\n return [...this.items];\n }\n\n async findById(id: string): Promise<${entityName} | null> {\n await new Promise(resolve => setTimeout(resolve, 300));\n const item = this.items.find(i => i.id === id);\n return item || null;\n }\n\n async create(data: Create${entityName}DTO): Promise<${entityName}> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const newItem: ${entityName} = {\n id: Date.now().toString(),\n ...data,\n updatedAt: new Date(),\n ${columns.some(c => c.key === 'createdAt') ? 'createdAt: new Date().toISOString(),' : ''}\n } as unknown as ${entityName};\n\n this.items.push(newItem);\n return newItem;\n }\n\n async update(data: Update${entityName}DTO): Promise<${entityName}> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const index = this.items.findIndex(i => i.id === data.id);\n if (index === -1) {\n throw new Error(\\`${entityName} with id \\${data.id} not found\\`);\n }\n\n this.items[index] = {\n ...this.items[index],\n ...data,\n updatedAt: new Date(),\n } as ${entityName};\n\n return this.items[index];\n }\n\n async delete(id: string): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const index = this.items.findIndex(i => i.id === id);\n if (index === -1) {\n throw new Error(\\`${entityName} with id \\${id} not found\\`);\n }\n\n this.items.splice(index, 1);\n }\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Application Use Case\n */\nexport function generateUseCase(config: GeneratorConfig): string {\n const { entityName, moduleName } = config;\n\n return `import { ${entityName} } from '../../domain/entities/${moduleName}.entity';\nimport { I${entityName}Repository } from '../../domain/repositories/${moduleName}.repository.interface';\n\n/**\n * Use Case: Get ${entityName}s\n * Generated by shadcn-page-gen\n */\nexport class Get${entityName}sUseCase {\n constructor(private readonly repository: I${entityName}Repository) {}\n\n async execute(params?: any): Promise<${entityName}[]> {\n return await this.repository.findAll(params);\n }\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Presentation Layer Component with full CRUD features\n * This is the most complex template with all UI logic\n */\nexport function generateComponent(config: GeneratorConfig): string {\n const {\n entityName,\n moduleName,\n pageName,\n routePath,\n columns,\n filters,\n includeStats,\n includeRowSelection,\n dataFetching,\n sortableColumns,\n animations\n } = config;\n\n const isTanStack = dataFetching === 'tanstack';\n const hasAnimations = animations.listAnimations || animations.cardAnimations;\n\n // Generate imports based on features\n const imports = `'use client';\n\n${hasAnimations ? `import { motion } from 'framer-motion';` : ''}\nimport { useEffect, useState } from 'react';\nimport { ${entityName} } from '../../domain/entities/${moduleName}.entity';\nimport { Get${entityName}sUseCase } from '../../application/use-cases/get-${moduleName}s.use-case';\nimport { ${entityName}Repository } from '../../infrastructure/repositories/${moduleName}.repository';\n${isTanStack ? `import { useQuery } from '@tanstack/react-query';` : ''}\nimport { Button } from '@/components/ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Input } from '@/components/ui/input';\n${filters.some(f => f.type === 'date') ? `import { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { format } from 'date-fns';` : ''}\nimport { Badge } from '@/components/ui/badge';\n${includeStats ? `import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';` : ''}\nimport {\n Search,\n Plus,\n X,\n RefreshCcw,\n Eye,\n Pencil,\n Trash2,\n MoreHorizontal,\n ${sortableColumns.length > 0 ? 'ArrowUpDown, ArrowUp, ArrowDown,' : ''}\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/components/ui/pagination\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\n${includeRowSelection ? `import { Checkbox } from \"@/components/ui/checkbox\";` : ''}`;\n\n // Generate animation variants if needed\n const animationVariants = hasAnimations ? `\n// Framer Motion animation variants\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: ${animations.intensity === 'bold' ? '0.1' : animations.intensity === 'subtle' ? '0.03' : '0.05'}\n }\n }\n};\n\nconst itemVariants = {\n hidden: { opacity: 0, x: -20 },\n visible: {\n opacity: 1,\n x: 0,\n transition: { duration: ${animations.intensity === 'bold' ? '0.3' : animations.intensity === 'subtle' ? '0.15' : '0.2'} }\n }\n};\n` : '';\n\n // Generate data fetching code\n const dataFetchingCode = isTanStack ? `\n // TanStack Query data fetching\n const { data, isLoading: loading, refetch } = useQuery({\n queryKey: ['${moduleName}', searchParams.toString()],\n queryFn: async () => {\n const repo = new ${entityName}Repository();\n const useCase = new Get${entityName}sUseCase(repo);\n return await useCase.execute({\n q: searchParams.get('q'),\n page: searchParams.get('page'),\n limit: pageSize,\n sortBy: searchParams.get('sortBy'),\n order: searchParams.get('order'),\n ...Object.fromEntries(searchParams.entries())\n });\n }\n });` : `\n const [data, setData] = useState<${entityName}[]>([]);\n const [loading, setLoading] = useState(true);\n\n const fetchData = async () => {\n setLoading(true);\n try {\n const repo = new ${entityName}Repository();\n const useCase = new Get${entityName}sUseCase(repo);\n const result = await useCase.execute({\n q: searchParams.get('q'),\n page: searchParams.get('page'),\n limit: pageSize,\n sortBy: searchParams.get('sortBy'),\n order: searchParams.get('order'),\n ...Object.fromEntries(searchParams.entries())\n });\n setData(result);\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchData();\n }, [searchParams]);`;\n\n // Generate row selection code\n const rowSelectionCode = includeRowSelection ? `\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n const toggleRow = (id: string) => {\n const newSelected = new Set(selectedRows);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedRows(newSelected);\n };\n\n const toggleAll = () => {\n if (selectedRows.size === (data?.length || 0)) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(data?.map(i => i.id) || []));\n }\n };` : '';\n\n // Generate stats cards\n const statsCards = includeStats ? `\n {/* Stats Cards */}\n ${animations.cardAnimations ? `<motion.div\n className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >` : `<div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">`}\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total ${entityName}s</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">128</div>\n <p className=\"text-xs text-muted-foreground\">+20.1% from last month</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">12</div>\n <p className=\"text-xs text-muted-foreground\">+4 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">4</div>\n <p className=\"text-xs text-muted-foreground\">-2 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Closed</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">2</div>\n <p className=\"text-xs text-muted-foreground\">+1 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n ${animations.cardAnimations ? `</motion.div>` : `</div>`}\n` : '';\n\n // Generate filter components\n const filterComponents = filters.map(f => {\n if (f.type === 'select') {\n return `\n <Select\n value={searchParams.get('${f.key}') || 'all'}\n onValueChange={(value) => updateParam('${f.key}', value === 'all' ? null : value)}\n >\n <SelectTrigger className=\"w-[150px]\">\n <SelectValue placeholder=\"${f.label}\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All ${f.label}</SelectItem>\n <SelectItem value=\"active\">Active</SelectItem>\n <SelectItem value=\"inactive\">Inactive</SelectItem>\n </SelectContent>\n </Select>`;\n } else if (f.type === 'date') {\n return `\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"w-[200px] justify-start text-left font-normal\",\n !searchParams.get('${f.key}') && \"text-muted-foreground\"\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {searchParams.get('${f.key}') ? (\n format(new Date(searchParams.get('${f.key}')!), \"PPP\")\n ) : (\n <span>${f.label}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={searchParams.get('${f.key}') ? new Date(searchParams.get('${f.key}')!) : undefined}\n onSelect={(date) => updateParam('${f.key}', date ? date.toISOString() : null)}\n initialFocus\n />\n </PopoverContent>\n </Popover>`;\n }\n return '';\n }).join('\\n');\n\n // Generate table column headers\n const tableHeaders = columns.map(c => {\n const isSortable = sortableColumns.includes(c.key);\n if (isSortable) {\n return ` <TableHead className=\"cursor-pointer\" onClick={() => handleSort('${c.key}')}>\n <div className=\"flex items-center gap-1\">\n ${c.label.toUpperCase()}\n {searchParams.get('sortBy') === '${c.key}' ? (\n searchParams.get('order') === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : <ArrowUpDown className=\"h-3 w-3 text-muted-foreground\" />}\n </div>\n </TableHead>`;\n }\n return ` <TableHead>${c.label.toUpperCase()}</TableHead>`;\n }).join('\\n');\n\n // Generate table cells\n const tableCells = columns.map(c => {\n if (c.key === 'status') {\n return ` <TableCell>\n <Badge variant={item.status === 'Active' ? 'default' : 'secondary'} className=\"rounded-full\">\n {item.status}\n </Badge>\n </TableCell>`;\n }\n if (c.type === 'date') {\n return ` <TableCell className=\"text-muted-foreground\">{new Date(item.${c.key}).toLocaleDateString()}</TableCell>`;\n }\n return ` <TableCell>{item.${c.key}}</TableCell>`;\n }).join('\\n');\n\n const colSpan = columns.length + 2 + (includeRowSelection ? 1 : 0);\n\n return `${imports}\n\n/**\n * ${entityName} List Component\n * Generated by shadcn-page-gen\n *\n * Features:\n * - Search and filters\n * - Sorting: ${sortableColumns.length > 0 ? sortableColumns.join(', ') : 'None'}\n * - Pagination\n * - Row actions (View, Edit, Delete)\n * ${includeStats ? '- Stats cards' : ''}\n * ${includeRowSelection ? '- Row selection' : ''}\n * ${animations.listAnimations || animations.cardAnimations ? `- Framer Motion animations (${animations.intensity})` : ''}\n */\n${animationVariants}\nexport function ${entityName}List() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || '');\n const pageSize = Number(searchParams.get('limit')) || 10;\n${dataFetchingCode}\n${rowSelectionCode}\n\n const updateParam = (key: string, value: string | null) => {\n const params = new URLSearchParams(searchParams.toString());\n if (value) params.set(key, value);\n else params.delete(key);\n\n if (key !== 'page') params.set('page', '1');\n\n router.push('?' + params.toString());\n };\n\n ${sortableColumns.length > 0 ? `const handleSort = (key: string) => {\n const currentSort = searchParams.get('sortBy');\n const currentOrder = searchParams.get('order');\n\n let newOrder = 'asc';\n if (currentSort === key && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n\n const params = new URLSearchParams(searchParams.toString());\n params.set('sortBy', key);\n params.set('order', newOrder);\n router.push('?' + params.toString());\n };` : ''}\n\n return (\n <div className=\"space-y-6\">\n${statsCards}\n {/* Actions Bar */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-1 items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onBlur={() => updateParam('q', searchTerm)}\n className=\"pl-9 w-full md:max-w-md\"\n />\n </div>\n${filterComponents}\n {(searchParams.toString().length > 0) && (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => router.push('/${routePath}')} title=\"Reset Filters\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => ${isTanStack ? 'refetch()' : 'fetchData()'}}>\n <RefreshCcw className=\"mr-2 h-4 w-4\" /> Refresh\n </Button>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New ${entityName}\n </Button>\n </div>\n </div>\n\n {/* Main Table */}\n <Card>\n <CardContent className=\"p-0\">\n <Table>\n <TableHeader>\n <TableRow>\n ${includeRowSelection ? `<TableHead className=\"w-[50px]\"><Checkbox checked={data?.length > 0 && selectedRows.size === data?.length} onCheckedChange={toggleAll} /></TableHead>` : ''}\n <TableHead className=\"w-[100px]\">ID</TableHead>\n${tableHeaders}\n <TableHead className=\"text-right\">ACTIONS</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">Loading data...</TableCell>\n </TableRow>\n ) : !data || data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">No results found.</TableCell>\n </TableRow>\n ) : (\n ${animations.listAnimations ? `\n data.map((item, index) => (\n <motion.tr\n key={item.id}\n variants={itemVariants}\n initial=\"hidden\"\n animate=\"visible\"\n custom={index}\n className=\"group\"\n >` : `data.map((item) => (\n <TableRow key={item.id} className=\"group\">`}\n ${includeRowSelection ? `<TableCell><Checkbox checked={selectedRows.has(item.id)} onCheckedChange={() => toggleRow(item.id)} /></TableCell>` : ''}\n <TableCell className=\"font-medium\">{item.id}</TableCell>\n${tableCells}\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-blue-500 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-950\">\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-green-500 hover:text-green-600 hover:bg-green-50 dark:hover:bg-green-950\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-red-500 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-950\">\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuItem>View Details</DropdownMenuItem>\n <DropdownMenuItem>Edit Record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TableCell>\n ${animations.listAnimations ? `</motion.tr>` : `</TableRow>`}\n ))\n )}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n {/* Pagination */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>Show</span>\n <Select value={pageSize.toString()} onValueChange={(v) => updateParam('limit', v)}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue placeholder={pageSize.toString()} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {[10, 20, 30, 50, 100].map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>entries</span>\n </div>\n <Pagination className=\"justify-end w-auto\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates App Router Page\n */\nexport function generatePage(config: GeneratorConfig): string {\n const { pageName, moduleName, entityName } = config;\n\n return `import { Suspense } from 'react';\nimport { ${entityName}List } from '@/modules/${moduleName}/presentation/components/${moduleName}-list';\n\n/**\n * ${pageName} Page\n * Generated by shadcn-page-gen\n */\nexport default function ${entityName}Page() {\n return (\n <div className=\"container mx-auto py-10 space-y-8\">\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">${pageName}</h1>\n <p className=\"text-muted-foreground\">\n Manage your ${pageName.toLowerCase()}.\n </p>\n </div>\n\n <Suspense fallback={<div>Loading...</div>}>\n <${entityName}List />\n </Suspense>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates App Router Template for page transitions\n */\nexport function generateTemplate(config: GeneratorConfig): string {\n const { animations } = config;\n\n // Get animation config based on intensity\n const getAnimationConfig = () => {\n switch (animations.intensity) {\n case 'subtle':\n return {\n initial: '{ opacity: 0, y: 10 }',\n animate: '{ opacity: 1, y: 0 }',\n transition: '{ duration: 0.2 }'\n };\n case 'bold':\n return {\n initial: '{ opacity: 0, scale: 0.95, y: 30 }',\n animate: '{ opacity: 1, scale: 1, y: 0 }',\n transition: '{ duration: 0.4, ease: [0.43, 0.13, 0.23, 0.96] }'\n };\n default: // moderate\n return {\n initial: '{ opacity: 0, y: 20 }',\n animate: '{ opacity: 1, y: 0 }',\n transition: '{ duration: 0.3, ease: \"easeInOut\" }'\n };\n }\n };\n\n const animConfig = getAnimationConfig();\n\n return `'use client';\n\nimport { motion } from 'framer-motion';\n\n/**\n * Page Template with Framer Motion transitions\n * Generated by shadcn-page-gen\n */\nexport default function Template({ children }: { children: React.ReactNode }) {\n return (\n <motion.div\n initial=${animConfig.initial}\n animate=${animConfig.animate}\n exit={{ opacity: 0, y: -20 }}\n transition=${animConfig.transition}\n >\n {children}\n </motion.div>\n );\n}\n`;\n}\n","import path from 'path';\nimport type { GeneratorConfig, GeneratorResult, GeneratedFile } from '../types/index.js';\nimport { writeFiles, createDirectories } from '../utils/file-system.js';\nimport {\n generateSimplifiedComponent,\n generateSimplifiedPage,\n generateTemplate\n} from '../templates/simplified/index.js';\n\n/**\n * Simplified Generator\n * Generates just components and pages without DDD layers\n */\nexport class SimplifiedGenerator {\n constructor(private config: GeneratorConfig) {}\n\n async generate(): Promise<GeneratorResult> {\n const files: GeneratedFile[] = [];\n const cwd = process.cwd();\n const { moduleName, routePath } = this.config;\n\n // Define directory structure\n const componentDir = path.join(cwd, 'components', moduleName);\n const appDir = path.join(cwd, 'app', '(dashboard)', routePath);\n\n // Create directories\n await createDirectories([componentDir, appDir]);\n\n // Generate files\n // 1. Component\n files.push({\n path: path.join(componentDir, `${moduleName}-list.tsx`),\n content: generateSimplifiedComponent(this.config)\n });\n\n // 2. Page\n files.push({\n path: path.join(appDir, 'page.tsx'),\n content: generateSimplifiedPage(this.config)\n });\n\n // 3. Template (if animations enabled)\n if (this.config.animations.pageTransitions) {\n files.push({\n path: path.join(appDir, 'template.tsx'),\n content: generateTemplate(this.config)\n });\n }\n\n // Write all files\n await writeFiles(files);\n\n // Generate instructions\n const instructions = this.generateInstructions();\n\n return { files, instructions };\n }\n\n private generateInstructions(): string[] {\n const instructions: string[] = [];\n\n instructions.push(`Navigate to your page: http://localhost:3000/${this.config.routePath}`);\n\n // Check for dependencies\n const deps: string[] = [];\n if (this.config.dataFetching === 'tanstack') {\n deps.push('@tanstack/react-query');\n }\n if (this.config.animations.pageTransitions || this.config.animations.listAnimations) {\n deps.push('framer-motion');\n }\n\n if (deps.length > 0) {\n instructions.push(`Install dependencies: npm install ${deps.join(' ')}`);\n }\n\n instructions.push('Customize the generated code to fit your needs');\n instructions.push('Replace mock data with your real API');\n\n if (this.config.dataFetching === 'tanstack') {\n instructions.push('Ensure your app is wrapped in <QueryClientProvider>');\n }\n\n return instructions;\n }\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Simplified Component (without DDD layers)\n * Direct data fetching without repository pattern\n */\nexport function generateSimplifiedComponent(config: GeneratorConfig): string {\n const {\n entityName,\n moduleName,\n pageName,\n routePath,\n columns,\n filters,\n includeStats,\n includeRowSelection,\n dataFetching,\n sortableColumns,\n animations\n } = config;\n\n const isTanStack = dataFetching === 'tanstack';\n const hasAnimations = animations.listAnimations || animations.cardAnimations;\n\n // Mock data type interface\n const mockDataInterface = `interface ${entityName} {\n id: string;\n${columns.map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string'\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n')}\n updatedAt: Date;\n}`;\n\n // Generate mock data\n const mockDataFields = columns.map(c => {\n if (c.key === 'createdAt') {\n return ` createdAt: new Date().toISOString(),`;\n }\n if (c.key === 'status') {\n return ` status: Math.random() > 0.5 ? 'Active' : 'Inactive',`;\n }\n if (c.key === 'name') {\n return ` name: \\`${entityName} \\${i + 1}\\`,`;\n }\n if (c.type === 'number') {\n return ` ${c.key}: (i + 1) * 100,`;\n }\n if (c.type === 'boolean') {\n return ` ${c.key}: Math.random() > 0.5,`;\n }\n if (c.type === 'date') {\n return ` ${c.key}: new Date().toISOString(),`;\n }\n return ` ${c.key}: \\`${c.label} \\${i + 1}\\`,`;\n }).join('\\n');\n\n const mockData = `// Mock data - replace with your API call\nconst MOCK_DATA: ${entityName}[] = Array.from({ length: 10 }).map((_, i) => ({\n id: (i + 1).toString(),\n${mockDataFields}\n updatedAt: new Date(),\n})) as unknown as ${entityName}[];`;\n\n // Data fetching function\n const fetchFunction = isTanStack ? '' : `\n // Fetch data function - replace with your API call\n const fetchData = async () => {\n setLoading(true);\n try {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Replace with real API call\n // const response = await fetch('/api/${moduleName}');\n // const result = await response.json();\n\n setData(MOCK_DATA);\n } catch (error) {\n console.error('Error fetching data:', error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchData();\n }, [searchParams]);`;\n\n const dataFetchingSetup = isTanStack ? `\n // TanStack Query data fetching\n const { data, isLoading: loading, refetch } = useQuery({\n queryKey: ['${moduleName}', searchParams.toString()],\n queryFn: async () => {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Replace with real API call\n // const response = await fetch('/api/${moduleName}');\n // return await response.json();\n\n return MOCK_DATA;\n }\n });` : `\n const [data, setData] = useState<${entityName}[]>([]);\n const [loading, setLoading] = useState(true);\n${fetchFunction}`;\n\n // Similar structure to DDD component but without repository imports\n const imports = `'use client';\n\n${hasAnimations ? `import { motion } from 'framer-motion';` : ''}\nimport { useEffect, useState } from 'react';\n${isTanStack ? `import { useQuery } from '@tanstack/react-query';` : ''}\nimport { Button } from '@/components/ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Input } from '@/components/ui/input';\n${filters.some(f => f.type === 'date') ? `import { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { format } from 'date-fns';` : ''}\nimport { Badge } from '@/components/ui/badge';\n${includeStats ? `import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';` : ''}\nimport {\n Search,\n Plus,\n X,\n RefreshCcw,\n Eye,\n Pencil,\n Trash2,\n MoreHorizontal,\n ${sortableColumns.length > 0 ? 'ArrowUpDown, ArrowUp, ArrowDown,' : ''}\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/components/ui/pagination\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\n${includeRowSelection ? `import { Checkbox } from \"@/components/ui/checkbox\";` : ''}`;\n\n // Animation variants\n const animationVariants = hasAnimations ? `\n// Framer Motion animation variants\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: ${animations.intensity === 'bold' ? '0.1' : animations.intensity === 'subtle' ? '0.03' : '0.05'}\n }\n }\n};\n\nconst itemVariants = {\n hidden: { opacity: 0, x: -20 },\n visible: {\n opacity: 1,\n x: 0,\n transition: { duration: ${animations.intensity === 'bold' ? '0.3' : animations.intensity === 'subtle' ? '0.15' : '0.2'} }\n }\n};\n` : '';\n\n // Row selection\n const rowSelectionCode = includeRowSelection ? `\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n const toggleRow = (id: string) => {\n const newSelected = new Set(selectedRows);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedRows(newSelected);\n };\n\n const toggleAll = () => {\n if (selectedRows.size === (data?.length || 0)) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(data?.map(i => i.id) || []));\n }\n };` : '';\n\n // Stats cards (same as DDD)\n const statsCards = includeStats ? `\n {/* Stats Cards */}\n ${animations.cardAnimations ? `<motion.div\n className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >` : `<div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">`}\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total ${entityName}s</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">128</div>\n <p className=\"text-xs text-muted-foreground\">+20.1% from last month</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">12</div>\n <p className=\"text-xs text-muted-foreground\">+4 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">4</div>\n <p className=\"text-xs text-muted-foreground\">-2 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Closed</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">2</div>\n <p className=\"text-xs text-muted-foreground\">+1 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n ${animations.cardAnimations ? `</motion.div>` : `</div>`}\n` : '';\n\n // Filter components (same as DDD)\n const filterComponents = filters.map(f => {\n if (f.type === 'select') {\n return `\n <Select\n value={searchParams.get('${f.key}') || 'all'}\n onValueChange={(value) => updateParam('${f.key}', value === 'all' ? null : value)}\n >\n <SelectTrigger className=\"w-[150px]\">\n <SelectValue placeholder=\"${f.label}\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All ${f.label}</SelectItem>\n <SelectItem value=\"active\">Active</SelectItem>\n <SelectItem value=\"inactive\">Inactive</SelectItem>\n </SelectContent>\n </Select>`;\n } else if (f.type === 'date') {\n return `\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"w-[200px] justify-start text-left font-normal\",\n !searchParams.get('${f.key}') && \"text-muted-foreground\"\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {searchParams.get('${f.key}') ? (\n format(new Date(searchParams.get('${f.key}')!), \"PPP\")\n ) : (\n <span>${f.label}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={searchParams.get('${f.key}') ? new Date(searchParams.get('${f.key}')!) : undefined}\n onSelect={(date) => updateParam('${f.key}', date ? date.toISOString() : null)}\n initialFocus\n />\n </PopoverContent>\n </Popover>`;\n }\n return '';\n }).join('\\n');\n\n // Table headers (same as DDD)\n const tableHeaders = columns.map(c => {\n const isSortable = sortableColumns.includes(c.key);\n if (isSortable) {\n return ` <TableHead className=\"cursor-pointer\" onClick={() => handleSort('${c.key}')}>\n <div className=\"flex items-center gap-1\">\n ${c.label.toUpperCase()}\n {searchParams.get('sortBy') === '${c.key}' ? (\n searchParams.get('order') === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : <ArrowUpDown className=\"h-3 w-3 text-muted-foreground\" />}\n </div>\n </TableHead>`;\n }\n return ` <TableHead>${c.label.toUpperCase()}</TableHead>`;\n }).join('\\n');\n\n // Table cells (same as DDD)\n const tableCells = columns.map(c => {\n if (c.key === 'status') {\n return ` <TableCell>\n <Badge variant={item.status === 'Active' ? 'default' : 'secondary'} className=\"rounded-full\">\n {item.status}\n </Badge>\n </TableCell>`;\n }\n if (c.type === 'date') {\n return ` <TableCell className=\"text-muted-foreground\">{new Date(item.${c.key}).toLocaleDateString()}</TableCell>`;\n }\n return ` <TableCell>{item.${c.key}}</TableCell>`;\n }).join('\\n');\n\n const colSpan = columns.length + 2 + (includeRowSelection ? 1 : 0);\n\n return `${imports}\n\n/**\n * ${entityName} List Component (Simplified Architecture)\n * Generated by shadcn-page-gen\n */\n\n${mockDataInterface}\n\n${mockData}\n${animationVariants}\nexport function ${entityName}List() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || '');\n const pageSize = Number(searchParams.get('limit')) || 10;\n${dataFetchingSetup}\n${rowSelectionCode}\n\n const updateParam = (key: string, value: string | null) => {\n const params = new URLSearchParams(searchParams.toString());\n if (value) params.set(key, value);\n else params.delete(key);\n\n if (key !== 'page') params.set('page', '1');\n\n router.push('?' + params.toString());\n };\n\n ${sortableColumns.length > 0 ? `const handleSort = (key: string) => {\n const currentSort = searchParams.get('sortBy');\n const currentOrder = searchParams.get('order');\n\n let newOrder = 'asc';\n if (currentSort === key && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n\n const params = new URLSearchParams(searchParams.toString());\n params.set('sortBy', key);\n params.set('order', newOrder);\n router.push('?' + params.toString());\n };` : ''}\n\n return (\n <div className=\"space-y-6\">\n${statsCards}\n {/* Actions Bar */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-1 items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onBlur={() => updateParam('q', searchTerm)}\n className=\"pl-9 w-full md:max-w-md\"\n />\n </div>\n${filterComponents}\n {(searchParams.toString().length > 0) && (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => router.push('/${routePath}')} title=\"Reset Filters\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => ${isTanStack ? 'refetch()' : 'fetchData()'}}>\n <RefreshCcw className=\"mr-2 h-4 w-4\" /> Refresh\n </Button>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New ${entityName}\n </Button>\n </div>\n </div>\n\n {/* Main Table */}\n <Card>\n <CardContent className=\"p-0\">\n <Table>\n <TableHeader>\n <TableRow>\n ${includeRowSelection ? `<TableHead className=\"w-[50px]\"><Checkbox checked={data?.length > 0 && selectedRows.size === data?.length} onCheckedChange={toggleAll} /></TableHead>` : ''}\n <TableHead className=\"w-[100px]\">ID</TableHead>\n${tableHeaders}\n <TableHead className=\"text-right\">ACTIONS</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">Loading data...</TableCell>\n </TableRow>\n ) : !data || data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">No results found.</TableCell>\n </TableRow>\n ) : (\n ${animations.listAnimations ? `\n data.map((item, index) => (\n <motion.tr\n key={item.id}\n variants={itemVariants}\n initial=\"hidden\"\n animate=\"visible\"\n custom={index}\n className=\"group\"\n >` : `data.map((item) => (\n <TableRow key={item.id} className=\"group\">`}\n ${includeRowSelection ? `<TableCell><Checkbox checked={selectedRows.has(item.id)} onCheckedChange={() => toggleRow(item.id)} /></TableCell>` : ''}\n <TableCell className=\"font-medium\">{item.id}</TableCell>\n${tableCells}\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-blue-500 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-950\">\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-green-500 hover:text-green-600 hover:bg-green-50 dark:hover:bg-green-950\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-red-500 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-950\">\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuItem>View Details</DropdownMenuItem>\n <DropdownMenuItem>Edit Record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TableCell>\n ${animations.listAnimations ? `</motion.tr>` : `</TableRow>`}\n ))\n )}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n {/* Pagination */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>Show</span>\n <Select value={pageSize.toString()} onValueChange={(v) => updateParam('limit', v)}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue placeholder={pageSize.toString()} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {[10, 20, 30, 50, 100].map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>entries</span>\n </div>\n <Pagination className=\"justify-end w-auto\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Simplified Page\n */\nexport function generateSimplifiedPage(config: GeneratorConfig): string {\n const { pageName, moduleName, entityName } = config;\n\n return `import { Suspense } from 'react';\nimport { ${entityName}List } from '@/components/${moduleName}/${moduleName}-list';\n\n/**\n * ${pageName} Page\n * Generated by shadcn-page-gen (Simplified Architecture)\n */\nexport default function ${entityName}Page() {\n return (\n <div className=\"container mx-auto py-10 space-y-8\">\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">${pageName}</h1>\n <p className=\"text-muted-foreground\">\n Manage your ${pageName.toLowerCase()}.\n </p>\n </div>\n\n <Suspense fallback={<div>Loading...</div>}>\n <${entityName}List />\n </Suspense>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig, GeneratorResult } from '../types/index.js';\nimport { DDDGenerator } from './ddd-generator.js';\nimport { SimplifiedGenerator } from './simplified-generator.js';\n\n/**\n * Main page generator orchestrator\n * Chooses between DDD and Simplified generators based on config\n */\nexport class PageGenerator {\n private generator: DDDGenerator | SimplifiedGenerator;\n\n constructor(private config: GeneratorConfig) {\n // Choose generator based on architecture\n this.generator = config.architecture === 'ddd'\n ? new DDDGenerator(config)\n : new SimplifiedGenerator(config);\n }\n\n /**\n * Generates all files and returns result\n */\n async generate(): Promise<GeneratorResult> {\n return await this.generator.generate();\n }\n}\n"],"mappings":"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","names":["prompts","chalk","import_path","fs","path","path","import_path","path","ora"]}
package/dist/index.js CHANGED
@@ -1860,6 +1860,7 @@ async function run() {
1860
1860
  process.exit(1);
1861
1861
  }
1862
1862
  }
1863
+ run();
1863
1864
  export {
1864
1865
  run
1865
1866
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/prompts.ts","../src/utils/string-transforms.ts","../src/cli/validators.ts","../src/utils/logger.ts","../src/generators/ddd-generator.ts","../src/utils/file-system.ts","../src/templates/ddd/entity.ts","../src/templates/ddd/repository-interface.ts","../src/templates/ddd/repository-impl.ts","../src/templates/ddd/use-case.ts","../src/templates/ddd/component.ts","../src/templates/ddd/page.ts","../src/templates/ddd/template.ts","../src/generators/simplified-generator.ts","../src/templates/simplified/component.ts","../src/templates/simplified/page.ts","../src/generators/index.ts"],"sourcesContent":["import ora from 'ora';\nimport { collectConfiguration } from './prompts.js';\nimport { logger } from '../utils/logger.js';\nimport { PageGenerator } from '../generators/index.js';\n\n/**\n * Main CLI entry point\n */\nexport async function run(): Promise<void> {\n try {\n // Show welcome banner\n console.clear();\n logger.title('šŸŽØ shadcn-page-gen');\n logger.dim('Generate production-ready Next.js pages with shadcn/ui, Tailwind v4, and Framer Motion\\n');\n\n // Collect configuration through interactive prompts\n const config = await collectConfiguration();\n\n if (!config) {\n logger.warning('Operation cancelled');\n process.exit(0);\n }\n\n // Show configuration summary\n console.log('\\n');\n logger.title('šŸ“‹ Configuration Summary');\n logger.info(`Page Name: ${config.pageName}`);\n logger.info(`Route: /${config.routePath}`);\n logger.info(`Architecture: ${config.architecture.toUpperCase()}`);\n logger.info(`Data Fetching: ${config.dataFetching}`);\n logger.info(`Animations: ${config.animations.intensity} intensity`);\n console.log('');\n\n // Generate files\n const spinner = ora('Generating files...').start();\n\n try {\n const generator = new PageGenerator(config);\n const result = await generator.generate();\n\n spinner.succeed('Files generated successfully!');\n\n // Show generated files\n console.log('');\n logger.title('šŸ“ Generated Files');\n result.files.forEach(file => {\n logger.dim(` ${file.path}`);\n });\n\n // Show next steps\n console.log('');\n logger.title('šŸŽ‰ Success!');\n logger.success('Your page has been generated!');\n\n console.log('');\n logger.title('šŸ“ Next Steps');\n result.instructions.forEach((instruction, index) => {\n logger.step(index + 1, result.instructions.length, instruction);\n });\n\n console.log('');\n logger.dim('Happy coding! šŸš€\\n');\n\n } catch (error) {\n spinner.fail('Generation failed');\n throw error;\n }\n\n } catch (error) {\n logger.error('An error occurred:');\n console.error(error);\n process.exit(1);\n }\n}\n","import prompts from 'prompts';\nimport type { GeneratorConfig, Column, Filter } from '../types/index.js';\nimport { toKebabCase, toPascalCase } from '../utils/string-transforms.js';\nimport { validateNotEmpty, validateRoutePath, validateColumnKey } from './validators.js';\n\n/**\n * Collects all configuration through interactive prompts\n */\nexport async function collectConfiguration(): Promise<GeneratorConfig | null> {\n // Handle Ctrl+C gracefully\n prompts.override({ onCancel: () => process.exit(0) });\n\n console.log('\\nšŸš€ Welcome to shadcn-page-gen!\\n');\n\n // Step 1: Page Name\n const { pageName } = await prompts({\n type: 'text',\n name: 'pageName',\n message: 'What is the name of the page? (e.g., \"User Management\")',\n validate: validateNotEmpty\n });\n\n if (!pageName) return null;\n\n // Step 2: Route Path\n const defaultRoute = toKebabCase(pageName);\n const { routePath } = await prompts({\n type: 'text',\n name: 'routePath',\n message: `What is the route path? (e.g., \"admin/users\")`,\n initial: defaultRoute,\n validate: validateRoutePath\n });\n\n if (!routePath) return null;\n\n const cleanRoutePath = routePath.replace(/^\\/+|\\/+$/g, '');\n const defaultModuleName = cleanRoutePath.replace(/\\//g, '-');\n\n // Step 3: Module Name\n const { moduleName } = await prompts({\n type: 'text',\n name: 'moduleName',\n message: `Module name?`,\n initial: defaultModuleName\n });\n\n if (!moduleName) return null;\n\n // Step 4: Architecture Choice\n const { architecture } = await prompts({\n type: 'select',\n name: 'architecture',\n message: 'Choose architecture pattern:',\n choices: [\n {\n title: 'DDD (Domain-Driven Design)',\n value: 'ddd',\n description: 'Full layers: Domain, Application, Infrastructure, Presentation'\n },\n {\n title: 'Simplified',\n value: 'simplified',\n description: 'Just components and pages - cleaner, faster'\n }\n ],\n initial: 0\n });\n\n if (!architecture) return null;\n\n // Step 5: Entity Name (if DDD)\n const pascalName = toPascalCase(pageName);\n let entityName = pascalName;\n\n if (architecture === 'ddd') {\n const response = await prompts({\n type: 'text',\n name: 'entityName',\n message: `Entity name? (e.g., Product, Ticket)`,\n initial: pascalName\n });\n\n if (!response.entityName) return null;\n entityName = response.entityName;\n }\n\n // Step 6: Columns\n const columns: Column[] = [];\n let addColumn = true;\n\n console.log('\\n--- Table Columns (ID is automatic) ---');\n\n const { useDefaultColumns } = await prompts({\n type: 'confirm',\n name: 'useDefaultColumns',\n message: 'Use default columns? (Name, Status, Created At)',\n initial: true\n });\n\n if (useDefaultColumns) {\n columns.push(\n { label: 'Name', key: 'name', type: 'string', sortable: true },\n { label: 'Status', key: 'status', type: 'string', sortable: true },\n { label: 'Created At', key: 'createdAt', type: 'date', sortable: true }\n );\n } else {\n while (addColumn) {\n const { continueAdding } = await prompts({\n type: 'confirm',\n name: 'continueAdding',\n message: columns.length === 0 ? 'Add a column?' : 'Add another column?',\n initial: true\n });\n\n if (!continueAdding) break;\n\n const columnData = await prompts([\n {\n type: 'text',\n name: 'label',\n message: 'Column Label (e.g., \"Email Address\"):',\n validate: validateNotEmpty\n },\n {\n type: 'text',\n name: 'key',\n message: 'Column Key (e.g., \"email\"):',\n validate: validateColumnKey\n },\n {\n type: 'select',\n name: 'type',\n message: 'Column Type:',\n choices: [\n { title: 'String', value: 'string' },\n { title: 'Number', value: 'number' },\n { title: 'Boolean', value: 'boolean' },\n { title: 'Date', value: 'date' }\n ],\n initial: 0\n }\n ]);\n\n if (columnData.label && columnData.key && columnData.type) {\n columns.push({\n ...columnData,\n sortable: false // Will be set later\n });\n }\n }\n\n if (columns.length === 0) {\n // If user didn't add any, use defaults\n columns.push(\n { label: 'Name', key: 'name', type: 'string', sortable: true },\n { label: 'Status', key: 'status', type: 'string', sortable: true },\n { label: 'Created At', key: 'createdAt', type: 'date', sortable: true }\n );\n }\n }\n\n // Step 7: Filters\n const filters: Filter[] = [];\n\n console.log('\\n--- Filters ---');\n\n const { addFilters } = await prompts({\n type: 'confirm',\n name: 'addFilters',\n message: 'Add filters?',\n initial: true\n });\n\n if (addFilters) {\n let addFilterLoop = true;\n\n while (addFilterLoop) {\n const { continueAddingFilter } = await prompts({\n type: 'confirm',\n name: 'continueAddingFilter',\n message: filters.length === 0 ? 'Add a filter?' : 'Add another filter?',\n initial: filters.length === 0\n });\n\n if (!continueAddingFilter) break;\n\n const filterData = await prompts([\n {\n type: 'select',\n name: 'type',\n message: 'Filter type:',\n choices: [\n { title: 'Dropdown (Select)', value: 'select' },\n { title: 'Date Picker', value: 'date' },\n { title: 'Text Input', value: 'input' }\n ]\n },\n {\n type: 'text',\n name: 'label',\n message: 'Filter Label (e.g., \"Status\"):',\n validate: validateNotEmpty\n },\n {\n type: 'text',\n name: 'key',\n message: 'Filter Key (URL param, e.g., \"status\"):',\n validate: validateColumnKey\n }\n ]);\n\n if (filterData.type && filterData.label && filterData.key) {\n filters.push(filterData);\n }\n }\n }\n\n // Step 8: UI Options\n console.log('\\n--- UI Options ---');\n\n const uiOptions = await prompts([\n {\n type: 'confirm',\n name: 'includeStats',\n message: 'Include Stats Cards at the top?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'includeRowSelection',\n message: 'Include Row Selection (Checkboxes)?',\n initial: false\n }\n ]);\n\n // Step 9: Data Fetching Strategy\n const { dataFetching } = await prompts({\n type: 'select',\n name: 'dataFetching',\n message: 'Data Fetching Strategy:',\n choices: [\n { title: 'Mock Data (Repository Pattern)', value: 'mock', description: 'Default mock data with repository pattern' },\n { title: 'TanStack Query (React Query)', value: 'tanstack', description: 'Modern data fetching with caching' },\n { title: 'Standard (fetch/useEffect)', value: 'fetch', description: 'Basic fetch with useEffect' }\n ],\n initial: 0\n });\n\n // Step 10: Sorting\n const { enableSorting } = await prompts({\n type: 'confirm',\n name: 'enableSorting',\n message: 'Enable Column Sorting?',\n initial: true\n });\n\n let sortableColumns: string[] = [];\n\n if (enableSorting && columns.length > 0) {\n const { selected } = await prompts({\n type: 'multiselect',\n name: 'selected',\n message: 'Select columns to enable sorting (Space to select, Enter to submit):',\n choices: columns.map(c => ({ title: c.label, value: c.key, selected: true })),\n min: 0\n });\n\n sortableColumns = selected || [];\n\n // Update sortable flag on columns\n columns.forEach(col => {\n col.sortable = sortableColumns.includes(col.key);\n });\n }\n\n // Step 11: Animations\n console.log('\\n--- Animations (Framer Motion) ---');\n\n const animationOptions = await prompts([\n {\n type: 'confirm',\n name: 'pageTransitions',\n message: 'Add page transition animations?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'listAnimations',\n message: 'Animate table rows on load?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'cardAnimations',\n message: 'Animate stats cards?',\n initial: uiOptions.includeStats\n },\n {\n type: 'select',\n name: 'intensity',\n message: 'Animation intensity:',\n choices: [\n { title: 'Subtle (professional)', value: 'subtle' },\n { title: 'Moderate (balanced)', value: 'moderate' },\n { title: 'Bold (eye-catching)', value: 'bold' }\n ],\n initial: 1\n }\n ]);\n\n // Build final config\n const config: GeneratorConfig = {\n pageName,\n routePath: cleanRoutePath,\n moduleName,\n architecture,\n entityName,\n columns,\n filters,\n includeStats: uiOptions.includeStats,\n includeRowSelection: uiOptions.includeRowSelection,\n includeSearch: true, // Always include search\n dataFetching,\n sortableColumns,\n animations: {\n pageTransitions: animationOptions.pageTransitions,\n listAnimations: animationOptions.listAnimations,\n cardAnimations: animationOptions.cardAnimations,\n intensity: animationOptions.intensity\n }\n };\n\n return config;\n}\n","/**\n * String transformation utilities\n */\n\n/**\n * Converts string to PascalCase\n * Example: \"user management\" => \"UserManagement\"\n */\nexport function toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())\n .replace(/^[a-z]/, (c) => c.toUpperCase())\n .replace(/[^a-zA-Z0-9]/g, '');\n}\n\n/**\n * Converts string to camelCase\n * Example: \"User Management\" => \"userManagement\"\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Converts string to kebab-case\n * Example: \"User Management\" => \"user-management\"\n */\nexport function toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)+/g, '');\n}\n\n/**\n * Converts string to snake_case\n * Example: \"User Management\" => \"user_management\"\n */\nexport function toSnakeCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/(^_|_$)+/g, '');\n}\n\n/**\n * Pluralizes a word (simple English rules)\n * Example: \"User\" => \"Users\", \"Category\" => \"Categories\"\n */\nexport function pluralize(word: string): string {\n if (word.endsWith('y') && !['ay', 'ey', 'iy', 'oy', 'uy'].some(v => word.endsWith(v))) {\n return word.slice(0, -1) + 'ies';\n }\n if (word.endsWith('s') || word.endsWith('x') || word.endsWith('z') ||\n word.endsWith('ch') || word.endsWith('sh')) {\n return word + 'es';\n }\n return word + 's';\n}\n\n/**\n * Capitalizes first letter\n * Example: \"hello\" => \"Hello\"\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Input validation functions\n */\n\nexport function validateNotEmpty(value: string): boolean | string {\n return value.length > 0 || 'This field is required';\n}\n\nexport function validateRoutePath(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'Route path is required';\n }\n\n // Check for valid characters (alphanumeric, dash, slash)\n if (!/^[a-z0-9\\-\\/]+$/.test(value)) {\n return 'Route path can only contain lowercase letters, numbers, dashes, and slashes';\n }\n\n return true;\n}\n\nexport function validateIdentifier(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'This field is required';\n }\n\n // Check for valid identifier (alphanumeric, underscore, dash)\n if (!/^[a-zA-Z][a-zA-Z0-9_\\-]*$/.test(value)) {\n return 'Must start with a letter and contain only letters, numbers, underscores, and dashes';\n }\n\n return true;\n}\n\nexport function validateColumnKey(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'Column key is required';\n }\n\n // Check for valid JavaScript identifier\n if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(value)) {\n return 'Column key must be a valid JavaScript identifier (camelCase recommended)';\n }\n\n return true;\n}\n","import chalk from 'chalk';\n\n/**\n * Logger utility with colored output\n */\n\nexport const logger = {\n success(message: string): void {\n console.log(chalk.green('āœ“'), message);\n },\n\n error(message: string): void {\n console.log(chalk.red('āœ—'), message);\n },\n\n info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n },\n\n warning(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n },\n\n log(message: string): void {\n console.log(message);\n },\n\n title(message: string): void {\n console.log(chalk.bold.cyan(`\\n${message}\\n`));\n },\n\n step(step: number, total: number, message: string): void {\n console.log(chalk.gray(`[${step}/${total}]`), message);\n },\n\n dim(message: string): void {\n console.log(chalk.dim(message));\n }\n};\n","import path from 'path';\nimport type { GeneratorConfig, GeneratorResult, GeneratedFile } from '../types/index.js';\nimport { writeFiles, createDirectories } from '../utils/file-system.js';\nimport {\n generateEntity,\n generateRepositoryInterface,\n generateRepositoryImpl,\n generateUseCase,\n generateComponent,\n generatePage,\n generateTemplate\n} from '../templates/ddd/index.js';\n\n/**\n * DDD (Domain-Driven Design) Generator\n * Generates complete module structure with all layers\n */\nexport class DDDGenerator {\n constructor(private config: GeneratorConfig) {}\n\n async generate(): Promise<GeneratorResult> {\n const files: GeneratedFile[] = [];\n const cwd = process.cwd();\n const { moduleName, routePath } = this.config;\n\n // Define directory structure\n const moduleDir = path.join(cwd, 'modules', moduleName);\n const appDir = path.join(cwd, 'app', '(dashboard)', routePath);\n\n // Create directories\n const dirs = [\n path.join(moduleDir, 'domain', 'entities'),\n path.join(moduleDir, 'domain', 'repositories'),\n path.join(moduleDir, 'application', 'use-cases'),\n path.join(moduleDir, 'infrastructure', 'repositories'),\n path.join(moduleDir, 'presentation', 'components'),\n appDir\n ];\n\n await createDirectories(dirs);\n\n // Generate files\n // 1. Domain Layer - Entity\n files.push({\n path: path.join(moduleDir, 'domain', 'entities', `${moduleName}.entity.ts`),\n content: generateEntity(this.config)\n });\n\n // 2. Domain Layer - Repository Interface\n files.push({\n path: path.join(moduleDir, 'domain', 'repositories', `${moduleName}.repository.interface.ts`),\n content: generateRepositoryInterface(this.config)\n });\n\n // 3. Infrastructure Layer - Repository Implementation\n files.push({\n path: path.join(moduleDir, 'infrastructure', 'repositories', `${moduleName}.repository.ts`),\n content: generateRepositoryImpl(this.config)\n });\n\n // 4. Application Layer - Use Case\n files.push({\n path: path.join(moduleDir, 'application', 'use-cases', `get-${moduleName}s.use-case.ts`),\n content: generateUseCase(this.config)\n });\n\n // 5. Presentation Layer - Component\n files.push({\n path: path.join(moduleDir, 'presentation', 'components', `${moduleName}-list.tsx`),\n content: generateComponent(this.config)\n });\n\n // 6. App Layer - Page\n files.push({\n path: path.join(appDir, 'page.tsx'),\n content: generatePage(this.config)\n });\n\n // 7. App Layer - Template (if animations enabled)\n if (this.config.animations.pageTransitions) {\n files.push({\n path: path.join(appDir, 'template.tsx'),\n content: generateTemplate(this.config)\n });\n }\n\n // Write all files\n await writeFiles(files);\n\n // Generate instructions\n const instructions = this.generateInstructions();\n\n return { files, instructions };\n }\n\n private generateInstructions(): string[] {\n const instructions: string[] = [];\n\n instructions.push(`Navigate to your page: http://localhost:3000/${this.config.routePath}`);\n\n // Check for dependencies\n const deps: string[] = [];\n if (this.config.dataFetching === 'tanstack') {\n deps.push('@tanstack/react-query');\n }\n if (this.config.animations.pageTransitions || this.config.animations.listAnimations) {\n deps.push('framer-motion');\n }\n\n if (deps.length > 0) {\n instructions.push(`Install dependencies: npm install ${deps.join(' ')}`);\n }\n\n instructions.push('Customize the generated code to fit your needs');\n instructions.push('Connect to your real API (replace mock repository)');\n\n if (this.config.dataFetching === 'tanstack') {\n instructions.push('Ensure your app is wrapped in <QueryClientProvider>');\n }\n\n return instructions;\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { logger } from './logger.js';\n\n/**\n * File system utilities\n */\n\n/**\n * Ensures a directory exists, creates it if it doesn't\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\n/**\n * Writes content to a file, creating parent directories if needed\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Checks if a file or directory exists\n */\nexport async function exists(pathToCheck: string): Promise<boolean> {\n try {\n await fs.access(pathToCheck);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Reads a file and returns its content\n */\nexport async function readFile(filePath: string): Promise<string> {\n return await fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Checks if path is a directory\n */\nexport async function isDirectory(pathToCheck: string): Promise<boolean> {\n try {\n const stats = await fs.stat(pathToCheck);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Removes a file or directory\n */\nexport async function remove(pathToRemove: string): Promise<void> {\n await fs.remove(pathToRemove);\n}\n\n/**\n * Creates multiple directories at once\n */\nexport async function createDirectories(dirs: string[]): Promise<void> {\n for (const dir of dirs) {\n await ensureDir(dir);\n }\n}\n\n/**\n * Writes multiple files at once\n */\nexport async function writeFiles(files: Array<{ path: string; content: string }>): Promise<void> {\n for (const file of files) {\n await writeFile(file.path, file.content);\n logger.dim(` Created: ${file.path}`);\n }\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Domain Entity interface with DTOs\n */\nexport function generateEntity(config: GeneratorConfig): string {\n const { entityName, moduleName, columns } = config;\n\n const columnFields = columns.map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string' // ISO string for dates\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n');\n\n const createDTOFields = columns\n .filter(c => !['id', 'createdAt', 'updatedAt'].includes(c.key))\n .map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string'\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n');\n\n return `/**\n * Domain Entity: ${entityName}\n * Generated by shadcn-page-gen\n */\nexport interface ${entityName} {\n id: string;\n${columnFields}\n updatedAt: Date;\n}\n\nexport interface Create${entityName}DTO {\n${createDTOFields || ' // Add your fields here'}\n}\n\nexport interface Update${entityName}DTO extends Partial<Create${entityName}DTO> {\n id: string;\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Domain Repository Interface\n */\nexport function generateRepositoryInterface(config: GeneratorConfig): string {\n const { entityName, moduleName } = config;\n\n return `import { ${entityName}, Create${entityName}DTO, Update${entityName}DTO } from '../entities/${moduleName}.entity';\n\n/**\n * Repository Interface: ${entityName}\n * Generated by shadcn-page-gen\n */\nexport interface I${entityName}Repository {\n findAll(params?: any): Promise<${entityName}[]>;\n findById(id: string): Promise<${entityName} | null>;\n create(data: Create${entityName}DTO): Promise<${entityName}>;\n update(data: Update${entityName}DTO): Promise<${entityName}>;\n delete(id: string): Promise<void>;\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Infrastructure Repository Implementation with mock data\n */\nexport function generateRepositoryImpl(config: GeneratorConfig): string {\n const { entityName, moduleName, columns } = config;\n\n // Generate mock data fields\n const mockFields = columns.map(c => {\n if (c.key === 'createdAt') {\n return ` createdAt: new Date().toISOString(),`;\n }\n if (c.key === 'status') {\n return ` status: Math.random() > 0.5 ? 'Active' : 'Inactive',`;\n }\n if (c.key === 'name') {\n return ` name: \\`${entityName} \\${i + 1}\\`,`;\n }\n if (c.type === 'number') {\n return ` ${c.key}: (i + 1) * 100,`;\n }\n if (c.type === 'boolean') {\n return ` ${c.key}: Math.random() > 0.5,`;\n }\n if (c.type === 'date') {\n return ` ${c.key}: new Date().toISOString(),`;\n }\n return ` ${c.key}: \\`${c.label} \\${i + 1}\\`,`;\n }).join('\\n');\n\n return `import { ${entityName}, Create${entityName}DTO, Update${entityName}DTO } from '../../domain/entities/${moduleName}.entity';\nimport { I${entityName}Repository } from '../../domain/repositories/${moduleName}.repository.interface';\n\n/**\n * Repository Implementation: ${entityName}\n * Generated by shadcn-page-gen\n *\n * This is a mock implementation with in-memory data.\n * Replace with your actual API calls.\n */\nexport class ${entityName}Repository implements I${entityName}Repository {\n // Mock data - replace with real API calls\n private items: ${entityName}[] = Array.from({ length: 10 }).map((_, i) => ({\n id: (i + 1).toString(),\n${mockFields}\n updatedAt: new Date(),\n })) as unknown as ${entityName}[];\n\n async findAll(params?: any): Promise<${entityName}[]> {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Implement sorting, filtering, pagination\n // const { sortBy, order, page, limit } = params || {};\n\n return [...this.items];\n }\n\n async findById(id: string): Promise<${entityName} | null> {\n await new Promise(resolve => setTimeout(resolve, 300));\n const item = this.items.find(i => i.id === id);\n return item || null;\n }\n\n async create(data: Create${entityName}DTO): Promise<${entityName}> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const newItem: ${entityName} = {\n id: Date.now().toString(),\n ...data,\n updatedAt: new Date(),\n ${columns.some(c => c.key === 'createdAt') ? 'createdAt: new Date().toISOString(),' : ''}\n } as unknown as ${entityName};\n\n this.items.push(newItem);\n return newItem;\n }\n\n async update(data: Update${entityName}DTO): Promise<${entityName}> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const index = this.items.findIndex(i => i.id === data.id);\n if (index === -1) {\n throw new Error(\\`${entityName} with id \\${data.id} not found\\`);\n }\n\n this.items[index] = {\n ...this.items[index],\n ...data,\n updatedAt: new Date(),\n } as ${entityName};\n\n return this.items[index];\n }\n\n async delete(id: string): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const index = this.items.findIndex(i => i.id === id);\n if (index === -1) {\n throw new Error(\\`${entityName} with id \\${id} not found\\`);\n }\n\n this.items.splice(index, 1);\n }\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Application Use Case\n */\nexport function generateUseCase(config: GeneratorConfig): string {\n const { entityName, moduleName } = config;\n\n return `import { ${entityName} } from '../../domain/entities/${moduleName}.entity';\nimport { I${entityName}Repository } from '../../domain/repositories/${moduleName}.repository.interface';\n\n/**\n * Use Case: Get ${entityName}s\n * Generated by shadcn-page-gen\n */\nexport class Get${entityName}sUseCase {\n constructor(private readonly repository: I${entityName}Repository) {}\n\n async execute(params?: any): Promise<${entityName}[]> {\n return await this.repository.findAll(params);\n }\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Presentation Layer Component with full CRUD features\n * This is the most complex template with all UI logic\n */\nexport function generateComponent(config: GeneratorConfig): string {\n const {\n entityName,\n moduleName,\n pageName,\n routePath,\n columns,\n filters,\n includeStats,\n includeRowSelection,\n dataFetching,\n sortableColumns,\n animations\n } = config;\n\n const isTanStack = dataFetching === 'tanstack';\n const hasAnimations = animations.listAnimations || animations.cardAnimations;\n\n // Generate imports based on features\n const imports = `'use client';\n\n${hasAnimations ? `import { motion } from 'framer-motion';` : ''}\nimport { useEffect, useState } from 'react';\nimport { ${entityName} } from '../../domain/entities/${moduleName}.entity';\nimport { Get${entityName}sUseCase } from '../../application/use-cases/get-${moduleName}s.use-case';\nimport { ${entityName}Repository } from '../../infrastructure/repositories/${moduleName}.repository';\n${isTanStack ? `import { useQuery } from '@tanstack/react-query';` : ''}\nimport { Button } from '@/components/ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Input } from '@/components/ui/input';\n${filters.some(f => f.type === 'date') ? `import { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { format } from 'date-fns';` : ''}\nimport { Badge } from '@/components/ui/badge';\n${includeStats ? `import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';` : ''}\nimport {\n Search,\n Plus,\n X,\n RefreshCcw,\n Eye,\n Pencil,\n Trash2,\n MoreHorizontal,\n ${sortableColumns.length > 0 ? 'ArrowUpDown, ArrowUp, ArrowDown,' : ''}\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/components/ui/pagination\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\n${includeRowSelection ? `import { Checkbox } from \"@/components/ui/checkbox\";` : ''}`;\n\n // Generate animation variants if needed\n const animationVariants = hasAnimations ? `\n// Framer Motion animation variants\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: ${animations.intensity === 'bold' ? '0.1' : animations.intensity === 'subtle' ? '0.03' : '0.05'}\n }\n }\n};\n\nconst itemVariants = {\n hidden: { opacity: 0, x: -20 },\n visible: {\n opacity: 1,\n x: 0,\n transition: { duration: ${animations.intensity === 'bold' ? '0.3' : animations.intensity === 'subtle' ? '0.15' : '0.2'} }\n }\n};\n` : '';\n\n // Generate data fetching code\n const dataFetchingCode = isTanStack ? `\n // TanStack Query data fetching\n const { data, isLoading: loading, refetch } = useQuery({\n queryKey: ['${moduleName}', searchParams.toString()],\n queryFn: async () => {\n const repo = new ${entityName}Repository();\n const useCase = new Get${entityName}sUseCase(repo);\n return await useCase.execute({\n q: searchParams.get('q'),\n page: searchParams.get('page'),\n limit: pageSize,\n sortBy: searchParams.get('sortBy'),\n order: searchParams.get('order'),\n ...Object.fromEntries(searchParams.entries())\n });\n }\n });` : `\n const [data, setData] = useState<${entityName}[]>([]);\n const [loading, setLoading] = useState(true);\n\n const fetchData = async () => {\n setLoading(true);\n try {\n const repo = new ${entityName}Repository();\n const useCase = new Get${entityName}sUseCase(repo);\n const result = await useCase.execute({\n q: searchParams.get('q'),\n page: searchParams.get('page'),\n limit: pageSize,\n sortBy: searchParams.get('sortBy'),\n order: searchParams.get('order'),\n ...Object.fromEntries(searchParams.entries())\n });\n setData(result);\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchData();\n }, [searchParams]);`;\n\n // Generate row selection code\n const rowSelectionCode = includeRowSelection ? `\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n const toggleRow = (id: string) => {\n const newSelected = new Set(selectedRows);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedRows(newSelected);\n };\n\n const toggleAll = () => {\n if (selectedRows.size === (data?.length || 0)) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(data?.map(i => i.id) || []));\n }\n };` : '';\n\n // Generate stats cards\n const statsCards = includeStats ? `\n {/* Stats Cards */}\n ${animations.cardAnimations ? `<motion.div\n className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >` : `<div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">`}\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total ${entityName}s</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">128</div>\n <p className=\"text-xs text-muted-foreground\">+20.1% from last month</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">12</div>\n <p className=\"text-xs text-muted-foreground\">+4 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">4</div>\n <p className=\"text-xs text-muted-foreground\">-2 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Closed</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">2</div>\n <p className=\"text-xs text-muted-foreground\">+1 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n ${animations.cardAnimations ? `</motion.div>` : `</div>`}\n` : '';\n\n // Generate filter components\n const filterComponents = filters.map(f => {\n if (f.type === 'select') {\n return `\n <Select\n value={searchParams.get('${f.key}') || 'all'}\n onValueChange={(value) => updateParam('${f.key}', value === 'all' ? null : value)}\n >\n <SelectTrigger className=\"w-[150px]\">\n <SelectValue placeholder=\"${f.label}\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All ${f.label}</SelectItem>\n <SelectItem value=\"active\">Active</SelectItem>\n <SelectItem value=\"inactive\">Inactive</SelectItem>\n </SelectContent>\n </Select>`;\n } else if (f.type === 'date') {\n return `\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"w-[200px] justify-start text-left font-normal\",\n !searchParams.get('${f.key}') && \"text-muted-foreground\"\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {searchParams.get('${f.key}') ? (\n format(new Date(searchParams.get('${f.key}')!), \"PPP\")\n ) : (\n <span>${f.label}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={searchParams.get('${f.key}') ? new Date(searchParams.get('${f.key}')!) : undefined}\n onSelect={(date) => updateParam('${f.key}', date ? date.toISOString() : null)}\n initialFocus\n />\n </PopoverContent>\n </Popover>`;\n }\n return '';\n }).join('\\n');\n\n // Generate table column headers\n const tableHeaders = columns.map(c => {\n const isSortable = sortableColumns.includes(c.key);\n if (isSortable) {\n return ` <TableHead className=\"cursor-pointer\" onClick={() => handleSort('${c.key}')}>\n <div className=\"flex items-center gap-1\">\n ${c.label.toUpperCase()}\n {searchParams.get('sortBy') === '${c.key}' ? (\n searchParams.get('order') === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : <ArrowUpDown className=\"h-3 w-3 text-muted-foreground\" />}\n </div>\n </TableHead>`;\n }\n return ` <TableHead>${c.label.toUpperCase()}</TableHead>`;\n }).join('\\n');\n\n // Generate table cells\n const tableCells = columns.map(c => {\n if (c.key === 'status') {\n return ` <TableCell>\n <Badge variant={item.status === 'Active' ? 'default' : 'secondary'} className=\"rounded-full\">\n {item.status}\n </Badge>\n </TableCell>`;\n }\n if (c.type === 'date') {\n return ` <TableCell className=\"text-muted-foreground\">{new Date(item.${c.key}).toLocaleDateString()}</TableCell>`;\n }\n return ` <TableCell>{item.${c.key}}</TableCell>`;\n }).join('\\n');\n\n const colSpan = columns.length + 2 + (includeRowSelection ? 1 : 0);\n\n return `${imports}\n\n/**\n * ${entityName} List Component\n * Generated by shadcn-page-gen\n *\n * Features:\n * - Search and filters\n * - Sorting: ${sortableColumns.length > 0 ? sortableColumns.join(', ') : 'None'}\n * - Pagination\n * - Row actions (View, Edit, Delete)\n * ${includeStats ? '- Stats cards' : ''}\n * ${includeRowSelection ? '- Row selection' : ''}\n * ${animations.listAnimations || animations.cardAnimations ? `- Framer Motion animations (${animations.intensity})` : ''}\n */\n${animationVariants}\nexport function ${entityName}List() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || '');\n const pageSize = Number(searchParams.get('limit')) || 10;\n${dataFetchingCode}\n${rowSelectionCode}\n\n const updateParam = (key: string, value: string | null) => {\n const params = new URLSearchParams(searchParams.toString());\n if (value) params.set(key, value);\n else params.delete(key);\n\n if (key !== 'page') params.set('page', '1');\n\n router.push('?' + params.toString());\n };\n\n ${sortableColumns.length > 0 ? `const handleSort = (key: string) => {\n const currentSort = searchParams.get('sortBy');\n const currentOrder = searchParams.get('order');\n\n let newOrder = 'asc';\n if (currentSort === key && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n\n const params = new URLSearchParams(searchParams.toString());\n params.set('sortBy', key);\n params.set('order', newOrder);\n router.push('?' + params.toString());\n };` : ''}\n\n return (\n <div className=\"space-y-6\">\n${statsCards}\n {/* Actions Bar */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-1 items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onBlur={() => updateParam('q', searchTerm)}\n className=\"pl-9 w-full md:max-w-md\"\n />\n </div>\n${filterComponents}\n {(searchParams.toString().length > 0) && (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => router.push('/${routePath}')} title=\"Reset Filters\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => ${isTanStack ? 'refetch()' : 'fetchData()'}}>\n <RefreshCcw className=\"mr-2 h-4 w-4\" /> Refresh\n </Button>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New ${entityName}\n </Button>\n </div>\n </div>\n\n {/* Main Table */}\n <Card>\n <CardContent className=\"p-0\">\n <Table>\n <TableHeader>\n <TableRow>\n ${includeRowSelection ? `<TableHead className=\"w-[50px]\"><Checkbox checked={data?.length > 0 && selectedRows.size === data?.length} onCheckedChange={toggleAll} /></TableHead>` : ''}\n <TableHead className=\"w-[100px]\">ID</TableHead>\n${tableHeaders}\n <TableHead className=\"text-right\">ACTIONS</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">Loading data...</TableCell>\n </TableRow>\n ) : !data || data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">No results found.</TableCell>\n </TableRow>\n ) : (\n ${animations.listAnimations ? `\n data.map((item, index) => (\n <motion.tr\n key={item.id}\n variants={itemVariants}\n initial=\"hidden\"\n animate=\"visible\"\n custom={index}\n className=\"group\"\n >` : `data.map((item) => (\n <TableRow key={item.id} className=\"group\">`}\n ${includeRowSelection ? `<TableCell><Checkbox checked={selectedRows.has(item.id)} onCheckedChange={() => toggleRow(item.id)} /></TableCell>` : ''}\n <TableCell className=\"font-medium\">{item.id}</TableCell>\n${tableCells}\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-blue-500 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-950\">\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-green-500 hover:text-green-600 hover:bg-green-50 dark:hover:bg-green-950\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-red-500 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-950\">\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuItem>View Details</DropdownMenuItem>\n <DropdownMenuItem>Edit Record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TableCell>\n ${animations.listAnimations ? `</motion.tr>` : `</TableRow>`}\n ))\n )}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n {/* Pagination */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>Show</span>\n <Select value={pageSize.toString()} onValueChange={(v) => updateParam('limit', v)}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue placeholder={pageSize.toString()} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {[10, 20, 30, 50, 100].map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>entries</span>\n </div>\n <Pagination className=\"justify-end w-auto\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates App Router Page\n */\nexport function generatePage(config: GeneratorConfig): string {\n const { pageName, moduleName, entityName } = config;\n\n return `import { Suspense } from 'react';\nimport { ${entityName}List } from '@/modules/${moduleName}/presentation/components/${moduleName}-list';\n\n/**\n * ${pageName} Page\n * Generated by shadcn-page-gen\n */\nexport default function ${entityName}Page() {\n return (\n <div className=\"container mx-auto py-10 space-y-8\">\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">${pageName}</h1>\n <p className=\"text-muted-foreground\">\n Manage your ${pageName.toLowerCase()}.\n </p>\n </div>\n\n <Suspense fallback={<div>Loading...</div>}>\n <${entityName}List />\n </Suspense>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates App Router Template for page transitions\n */\nexport function generateTemplate(config: GeneratorConfig): string {\n const { animations } = config;\n\n // Get animation config based on intensity\n const getAnimationConfig = () => {\n switch (animations.intensity) {\n case 'subtle':\n return {\n initial: '{ opacity: 0, y: 10 }',\n animate: '{ opacity: 1, y: 0 }',\n transition: '{ duration: 0.2 }'\n };\n case 'bold':\n return {\n initial: '{ opacity: 0, scale: 0.95, y: 30 }',\n animate: '{ opacity: 1, scale: 1, y: 0 }',\n transition: '{ duration: 0.4, ease: [0.43, 0.13, 0.23, 0.96] }'\n };\n default: // moderate\n return {\n initial: '{ opacity: 0, y: 20 }',\n animate: '{ opacity: 1, y: 0 }',\n transition: '{ duration: 0.3, ease: \"easeInOut\" }'\n };\n }\n };\n\n const animConfig = getAnimationConfig();\n\n return `'use client';\n\nimport { motion } from 'framer-motion';\n\n/**\n * Page Template with Framer Motion transitions\n * Generated by shadcn-page-gen\n */\nexport default function Template({ children }: { children: React.ReactNode }) {\n return (\n <motion.div\n initial=${animConfig.initial}\n animate=${animConfig.animate}\n exit={{ opacity: 0, y: -20 }}\n transition=${animConfig.transition}\n >\n {children}\n </motion.div>\n );\n}\n`;\n}\n","import path from 'path';\nimport type { GeneratorConfig, GeneratorResult, GeneratedFile } from '../types/index.js';\nimport { writeFiles, createDirectories } from '../utils/file-system.js';\nimport {\n generateSimplifiedComponent,\n generateSimplifiedPage,\n generateTemplate\n} from '../templates/simplified/index.js';\n\n/**\n * Simplified Generator\n * Generates just components and pages without DDD layers\n */\nexport class SimplifiedGenerator {\n constructor(private config: GeneratorConfig) {}\n\n async generate(): Promise<GeneratorResult> {\n const files: GeneratedFile[] = [];\n const cwd = process.cwd();\n const { moduleName, routePath } = this.config;\n\n // Define directory structure\n const componentDir = path.join(cwd, 'components', moduleName);\n const appDir = path.join(cwd, 'app', '(dashboard)', routePath);\n\n // Create directories\n await createDirectories([componentDir, appDir]);\n\n // Generate files\n // 1. Component\n files.push({\n path: path.join(componentDir, `${moduleName}-list.tsx`),\n content: generateSimplifiedComponent(this.config)\n });\n\n // 2. Page\n files.push({\n path: path.join(appDir, 'page.tsx'),\n content: generateSimplifiedPage(this.config)\n });\n\n // 3. Template (if animations enabled)\n if (this.config.animations.pageTransitions) {\n files.push({\n path: path.join(appDir, 'template.tsx'),\n content: generateTemplate(this.config)\n });\n }\n\n // Write all files\n await writeFiles(files);\n\n // Generate instructions\n const instructions = this.generateInstructions();\n\n return { files, instructions };\n }\n\n private generateInstructions(): string[] {\n const instructions: string[] = [];\n\n instructions.push(`Navigate to your page: http://localhost:3000/${this.config.routePath}`);\n\n // Check for dependencies\n const deps: string[] = [];\n if (this.config.dataFetching === 'tanstack') {\n deps.push('@tanstack/react-query');\n }\n if (this.config.animations.pageTransitions || this.config.animations.listAnimations) {\n deps.push('framer-motion');\n }\n\n if (deps.length > 0) {\n instructions.push(`Install dependencies: npm install ${deps.join(' ')}`);\n }\n\n instructions.push('Customize the generated code to fit your needs');\n instructions.push('Replace mock data with your real API');\n\n if (this.config.dataFetching === 'tanstack') {\n instructions.push('Ensure your app is wrapped in <QueryClientProvider>');\n }\n\n return instructions;\n }\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Simplified Component (without DDD layers)\n * Direct data fetching without repository pattern\n */\nexport function generateSimplifiedComponent(config: GeneratorConfig): string {\n const {\n entityName,\n moduleName,\n pageName,\n routePath,\n columns,\n filters,\n includeStats,\n includeRowSelection,\n dataFetching,\n sortableColumns,\n animations\n } = config;\n\n const isTanStack = dataFetching === 'tanstack';\n const hasAnimations = animations.listAnimations || animations.cardAnimations;\n\n // Mock data type interface\n const mockDataInterface = `interface ${entityName} {\n id: string;\n${columns.map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string'\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n')}\n updatedAt: Date;\n}`;\n\n // Generate mock data\n const mockDataFields = columns.map(c => {\n if (c.key === 'createdAt') {\n return ` createdAt: new Date().toISOString(),`;\n }\n if (c.key === 'status') {\n return ` status: Math.random() > 0.5 ? 'Active' : 'Inactive',`;\n }\n if (c.key === 'name') {\n return ` name: \\`${entityName} \\${i + 1}\\`,`;\n }\n if (c.type === 'number') {\n return ` ${c.key}: (i + 1) * 100,`;\n }\n if (c.type === 'boolean') {\n return ` ${c.key}: Math.random() > 0.5,`;\n }\n if (c.type === 'date') {\n return ` ${c.key}: new Date().toISOString(),`;\n }\n return ` ${c.key}: \\`${c.label} \\${i + 1}\\`,`;\n }).join('\\n');\n\n const mockData = `// Mock data - replace with your API call\nconst MOCK_DATA: ${entityName}[] = Array.from({ length: 10 }).map((_, i) => ({\n id: (i + 1).toString(),\n${mockDataFields}\n updatedAt: new Date(),\n})) as unknown as ${entityName}[];`;\n\n // Data fetching function\n const fetchFunction = isTanStack ? '' : `\n // Fetch data function - replace with your API call\n const fetchData = async () => {\n setLoading(true);\n try {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Replace with real API call\n // const response = await fetch('/api/${moduleName}');\n // const result = await response.json();\n\n setData(MOCK_DATA);\n } catch (error) {\n console.error('Error fetching data:', error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchData();\n }, [searchParams]);`;\n\n const dataFetchingSetup = isTanStack ? `\n // TanStack Query data fetching\n const { data, isLoading: loading, refetch } = useQuery({\n queryKey: ['${moduleName}', searchParams.toString()],\n queryFn: async () => {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Replace with real API call\n // const response = await fetch('/api/${moduleName}');\n // return await response.json();\n\n return MOCK_DATA;\n }\n });` : `\n const [data, setData] = useState<${entityName}[]>([]);\n const [loading, setLoading] = useState(true);\n${fetchFunction}`;\n\n // Similar structure to DDD component but without repository imports\n const imports = `'use client';\n\n${hasAnimations ? `import { motion } from 'framer-motion';` : ''}\nimport { useEffect, useState } from 'react';\n${isTanStack ? `import { useQuery } from '@tanstack/react-query';` : ''}\nimport { Button } from '@/components/ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Input } from '@/components/ui/input';\n${filters.some(f => f.type === 'date') ? `import { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { format } from 'date-fns';` : ''}\nimport { Badge } from '@/components/ui/badge';\n${includeStats ? `import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';` : ''}\nimport {\n Search,\n Plus,\n X,\n RefreshCcw,\n Eye,\n Pencil,\n Trash2,\n MoreHorizontal,\n ${sortableColumns.length > 0 ? 'ArrowUpDown, ArrowUp, ArrowDown,' : ''}\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/components/ui/pagination\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\n${includeRowSelection ? `import { Checkbox } from \"@/components/ui/checkbox\";` : ''}`;\n\n // Animation variants\n const animationVariants = hasAnimations ? `\n// Framer Motion animation variants\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: ${animations.intensity === 'bold' ? '0.1' : animations.intensity === 'subtle' ? '0.03' : '0.05'}\n }\n }\n};\n\nconst itemVariants = {\n hidden: { opacity: 0, x: -20 },\n visible: {\n opacity: 1,\n x: 0,\n transition: { duration: ${animations.intensity === 'bold' ? '0.3' : animations.intensity === 'subtle' ? '0.15' : '0.2'} }\n }\n};\n` : '';\n\n // Row selection\n const rowSelectionCode = includeRowSelection ? `\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n const toggleRow = (id: string) => {\n const newSelected = new Set(selectedRows);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedRows(newSelected);\n };\n\n const toggleAll = () => {\n if (selectedRows.size === (data?.length || 0)) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(data?.map(i => i.id) || []));\n }\n };` : '';\n\n // Stats cards (same as DDD)\n const statsCards = includeStats ? `\n {/* Stats Cards */}\n ${animations.cardAnimations ? `<motion.div\n className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >` : `<div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">`}\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total ${entityName}s</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">128</div>\n <p className=\"text-xs text-muted-foreground\">+20.1% from last month</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">12</div>\n <p className=\"text-xs text-muted-foreground\">+4 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">4</div>\n <p className=\"text-xs text-muted-foreground\">-2 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Closed</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">2</div>\n <p className=\"text-xs text-muted-foreground\">+1 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n ${animations.cardAnimations ? `</motion.div>` : `</div>`}\n` : '';\n\n // Filter components (same as DDD)\n const filterComponents = filters.map(f => {\n if (f.type === 'select') {\n return `\n <Select\n value={searchParams.get('${f.key}') || 'all'}\n onValueChange={(value) => updateParam('${f.key}', value === 'all' ? null : value)}\n >\n <SelectTrigger className=\"w-[150px]\">\n <SelectValue placeholder=\"${f.label}\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All ${f.label}</SelectItem>\n <SelectItem value=\"active\">Active</SelectItem>\n <SelectItem value=\"inactive\">Inactive</SelectItem>\n </SelectContent>\n </Select>`;\n } else if (f.type === 'date') {\n return `\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"w-[200px] justify-start text-left font-normal\",\n !searchParams.get('${f.key}') && \"text-muted-foreground\"\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {searchParams.get('${f.key}') ? (\n format(new Date(searchParams.get('${f.key}')!), \"PPP\")\n ) : (\n <span>${f.label}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={searchParams.get('${f.key}') ? new Date(searchParams.get('${f.key}')!) : undefined}\n onSelect={(date) => updateParam('${f.key}', date ? date.toISOString() : null)}\n initialFocus\n />\n </PopoverContent>\n </Popover>`;\n }\n return '';\n }).join('\\n');\n\n // Table headers (same as DDD)\n const tableHeaders = columns.map(c => {\n const isSortable = sortableColumns.includes(c.key);\n if (isSortable) {\n return ` <TableHead className=\"cursor-pointer\" onClick={() => handleSort('${c.key}')}>\n <div className=\"flex items-center gap-1\">\n ${c.label.toUpperCase()}\n {searchParams.get('sortBy') === '${c.key}' ? (\n searchParams.get('order') === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : <ArrowUpDown className=\"h-3 w-3 text-muted-foreground\" />}\n </div>\n </TableHead>`;\n }\n return ` <TableHead>${c.label.toUpperCase()}</TableHead>`;\n }).join('\\n');\n\n // Table cells (same as DDD)\n const tableCells = columns.map(c => {\n if (c.key === 'status') {\n return ` <TableCell>\n <Badge variant={item.status === 'Active' ? 'default' : 'secondary'} className=\"rounded-full\">\n {item.status}\n </Badge>\n </TableCell>`;\n }\n if (c.type === 'date') {\n return ` <TableCell className=\"text-muted-foreground\">{new Date(item.${c.key}).toLocaleDateString()}</TableCell>`;\n }\n return ` <TableCell>{item.${c.key}}</TableCell>`;\n }).join('\\n');\n\n const colSpan = columns.length + 2 + (includeRowSelection ? 1 : 0);\n\n return `${imports}\n\n/**\n * ${entityName} List Component (Simplified Architecture)\n * Generated by shadcn-page-gen\n */\n\n${mockDataInterface}\n\n${mockData}\n${animationVariants}\nexport function ${entityName}List() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || '');\n const pageSize = Number(searchParams.get('limit')) || 10;\n${dataFetchingSetup}\n${rowSelectionCode}\n\n const updateParam = (key: string, value: string | null) => {\n const params = new URLSearchParams(searchParams.toString());\n if (value) params.set(key, value);\n else params.delete(key);\n\n if (key !== 'page') params.set('page', '1');\n\n router.push('?' + params.toString());\n };\n\n ${sortableColumns.length > 0 ? `const handleSort = (key: string) => {\n const currentSort = searchParams.get('sortBy');\n const currentOrder = searchParams.get('order');\n\n let newOrder = 'asc';\n if (currentSort === key && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n\n const params = new URLSearchParams(searchParams.toString());\n params.set('sortBy', key);\n params.set('order', newOrder);\n router.push('?' + params.toString());\n };` : ''}\n\n return (\n <div className=\"space-y-6\">\n${statsCards}\n {/* Actions Bar */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-1 items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onBlur={() => updateParam('q', searchTerm)}\n className=\"pl-9 w-full md:max-w-md\"\n />\n </div>\n${filterComponents}\n {(searchParams.toString().length > 0) && (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => router.push('/${routePath}')} title=\"Reset Filters\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => ${isTanStack ? 'refetch()' : 'fetchData()'}}>\n <RefreshCcw className=\"mr-2 h-4 w-4\" /> Refresh\n </Button>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New ${entityName}\n </Button>\n </div>\n </div>\n\n {/* Main Table */}\n <Card>\n <CardContent className=\"p-0\">\n <Table>\n <TableHeader>\n <TableRow>\n ${includeRowSelection ? `<TableHead className=\"w-[50px]\"><Checkbox checked={data?.length > 0 && selectedRows.size === data?.length} onCheckedChange={toggleAll} /></TableHead>` : ''}\n <TableHead className=\"w-[100px]\">ID</TableHead>\n${tableHeaders}\n <TableHead className=\"text-right\">ACTIONS</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">Loading data...</TableCell>\n </TableRow>\n ) : !data || data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">No results found.</TableCell>\n </TableRow>\n ) : (\n ${animations.listAnimations ? `\n data.map((item, index) => (\n <motion.tr\n key={item.id}\n variants={itemVariants}\n initial=\"hidden\"\n animate=\"visible\"\n custom={index}\n className=\"group\"\n >` : `data.map((item) => (\n <TableRow key={item.id} className=\"group\">`}\n ${includeRowSelection ? `<TableCell><Checkbox checked={selectedRows.has(item.id)} onCheckedChange={() => toggleRow(item.id)} /></TableCell>` : ''}\n <TableCell className=\"font-medium\">{item.id}</TableCell>\n${tableCells}\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-blue-500 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-950\">\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-green-500 hover:text-green-600 hover:bg-green-50 dark:hover:bg-green-950\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-red-500 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-950\">\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuItem>View Details</DropdownMenuItem>\n <DropdownMenuItem>Edit Record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TableCell>\n ${animations.listAnimations ? `</motion.tr>` : `</TableRow>`}\n ))\n )}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n {/* Pagination */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>Show</span>\n <Select value={pageSize.toString()} onValueChange={(v) => updateParam('limit', v)}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue placeholder={pageSize.toString()} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {[10, 20, 30, 50, 100].map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>entries</span>\n </div>\n <Pagination className=\"justify-end w-auto\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Simplified Page\n */\nexport function generateSimplifiedPage(config: GeneratorConfig): string {\n const { pageName, moduleName, entityName } = config;\n\n return `import { Suspense } from 'react';\nimport { ${entityName}List } from '@/components/${moduleName}/${moduleName}-list';\n\n/**\n * ${pageName} Page\n * Generated by shadcn-page-gen (Simplified Architecture)\n */\nexport default function ${entityName}Page() {\n return (\n <div className=\"container mx-auto py-10 space-y-8\">\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">${pageName}</h1>\n <p className=\"text-muted-foreground\">\n Manage your ${pageName.toLowerCase()}.\n </p>\n </div>\n\n <Suspense fallback={<div>Loading...</div>}>\n <${entityName}List />\n </Suspense>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig, GeneratorResult } from '../types/index.js';\nimport { DDDGenerator } from './ddd-generator.js';\nimport { SimplifiedGenerator } from './simplified-generator.js';\n\n/**\n * Main page generator orchestrator\n * Chooses between DDD and Simplified generators based on config\n */\nexport class PageGenerator {\n private generator: DDDGenerator | SimplifiedGenerator;\n\n constructor(private config: GeneratorConfig) {\n // Choose generator based on architecture\n this.generator = config.architecture === 'ddd'\n ? new DDDGenerator(config)\n : new SimplifiedGenerator(config);\n }\n\n /**\n * Generates all files and returns result\n */\n async generate(): Promise<GeneratorResult> {\n return await this.generator.generate();\n }\n}\n"],"mappings":"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","names":["path","path","path","path"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/prompts.ts","../src/utils/string-transforms.ts","../src/cli/validators.ts","../src/utils/logger.ts","../src/generators/ddd-generator.ts","../src/utils/file-system.ts","../src/templates/ddd/entity.ts","../src/templates/ddd/repository-interface.ts","../src/templates/ddd/repository-impl.ts","../src/templates/ddd/use-case.ts","../src/templates/ddd/component.ts","../src/templates/ddd/page.ts","../src/templates/ddd/template.ts","../src/generators/simplified-generator.ts","../src/templates/simplified/component.ts","../src/templates/simplified/page.ts","../src/generators/index.ts"],"sourcesContent":["import ora from 'ora';\nimport { collectConfiguration } from './prompts.js';\nimport { logger } from '../utils/logger.js';\nimport { PageGenerator } from '../generators/index.js';\n\n/**\n * Main CLI entry point\n */\nexport async function run(): Promise<void> {\n try {\n // Show welcome banner\n console.clear();\n logger.title('šŸŽØ shadcn-page-gen');\n logger.dim('Generate production-ready Next.js pages with shadcn/ui, Tailwind v4, and Framer Motion\\n');\n\n // Collect configuration through interactive prompts\n const config = await collectConfiguration();\n\n if (!config) {\n logger.warning('Operation cancelled');\n process.exit(0);\n }\n\n // Show configuration summary\n console.log('\\n');\n logger.title('šŸ“‹ Configuration Summary');\n logger.info(`Page Name: ${config.pageName}`);\n logger.info(`Route: /${config.routePath}`);\n logger.info(`Architecture: ${config.architecture.toUpperCase()}`);\n logger.info(`Data Fetching: ${config.dataFetching}`);\n logger.info(`Animations: ${config.animations.intensity} intensity`);\n console.log('');\n\n // Generate files\n const spinner = ora('Generating files...').start();\n\n try {\n const generator = new PageGenerator(config);\n const result = await generator.generate();\n\n spinner.succeed('Files generated successfully!');\n\n // Show generated files\n console.log('');\n logger.title('šŸ“ Generated Files');\n result.files.forEach(file => {\n logger.dim(` ${file.path}`);\n });\n\n // Show next steps\n console.log('');\n logger.title('šŸŽ‰ Success!');\n logger.success('Your page has been generated!');\n\n console.log('');\n logger.title('šŸ“ Next Steps');\n result.instructions.forEach((instruction, index) => {\n logger.step(index + 1, result.instructions.length, instruction);\n });\n\n console.log('');\n logger.dim('Happy coding! šŸš€\\n');\n\n } catch (error) {\n spinner.fail('Generation failed');\n throw error;\n }\n\n } catch (error) {\n logger.error('An error occurred:');\n console.error(error);\n process.exit(1);\n }\n}\n\n// Auto-execute when run as CLI\nrun();\n","import prompts from 'prompts';\nimport type { GeneratorConfig, Column, Filter } from '../types/index.js';\nimport { toKebabCase, toPascalCase } from '../utils/string-transforms.js';\nimport { validateNotEmpty, validateRoutePath, validateColumnKey } from './validators.js';\n\n/**\n * Collects all configuration through interactive prompts\n */\nexport async function collectConfiguration(): Promise<GeneratorConfig | null> {\n // Handle Ctrl+C gracefully\n prompts.override({ onCancel: () => process.exit(0) });\n\n console.log('\\nšŸš€ Welcome to shadcn-page-gen!\\n');\n\n // Step 1: Page Name\n const { pageName } = await prompts({\n type: 'text',\n name: 'pageName',\n message: 'What is the name of the page? (e.g., \"User Management\")',\n validate: validateNotEmpty\n });\n\n if (!pageName) return null;\n\n // Step 2: Route Path\n const defaultRoute = toKebabCase(pageName);\n const { routePath } = await prompts({\n type: 'text',\n name: 'routePath',\n message: `What is the route path? (e.g., \"admin/users\")`,\n initial: defaultRoute,\n validate: validateRoutePath\n });\n\n if (!routePath) return null;\n\n const cleanRoutePath = routePath.replace(/^\\/+|\\/+$/g, '');\n const defaultModuleName = cleanRoutePath.replace(/\\//g, '-');\n\n // Step 3: Module Name\n const { moduleName } = await prompts({\n type: 'text',\n name: 'moduleName',\n message: `Module name?`,\n initial: defaultModuleName\n });\n\n if (!moduleName) return null;\n\n // Step 4: Architecture Choice\n const { architecture } = await prompts({\n type: 'select',\n name: 'architecture',\n message: 'Choose architecture pattern:',\n choices: [\n {\n title: 'DDD (Domain-Driven Design)',\n value: 'ddd',\n description: 'Full layers: Domain, Application, Infrastructure, Presentation'\n },\n {\n title: 'Simplified',\n value: 'simplified',\n description: 'Just components and pages - cleaner, faster'\n }\n ],\n initial: 0\n });\n\n if (!architecture) return null;\n\n // Step 5: Entity Name (if DDD)\n const pascalName = toPascalCase(pageName);\n let entityName = pascalName;\n\n if (architecture === 'ddd') {\n const response = await prompts({\n type: 'text',\n name: 'entityName',\n message: `Entity name? (e.g., Product, Ticket)`,\n initial: pascalName\n });\n\n if (!response.entityName) return null;\n entityName = response.entityName;\n }\n\n // Step 6: Columns\n const columns: Column[] = [];\n let addColumn = true;\n\n console.log('\\n--- Table Columns (ID is automatic) ---');\n\n const { useDefaultColumns } = await prompts({\n type: 'confirm',\n name: 'useDefaultColumns',\n message: 'Use default columns? (Name, Status, Created At)',\n initial: true\n });\n\n if (useDefaultColumns) {\n columns.push(\n { label: 'Name', key: 'name', type: 'string', sortable: true },\n { label: 'Status', key: 'status', type: 'string', sortable: true },\n { label: 'Created At', key: 'createdAt', type: 'date', sortable: true }\n );\n } else {\n while (addColumn) {\n const { continueAdding } = await prompts({\n type: 'confirm',\n name: 'continueAdding',\n message: columns.length === 0 ? 'Add a column?' : 'Add another column?',\n initial: true\n });\n\n if (!continueAdding) break;\n\n const columnData = await prompts([\n {\n type: 'text',\n name: 'label',\n message: 'Column Label (e.g., \"Email Address\"):',\n validate: validateNotEmpty\n },\n {\n type: 'text',\n name: 'key',\n message: 'Column Key (e.g., \"email\"):',\n validate: validateColumnKey\n },\n {\n type: 'select',\n name: 'type',\n message: 'Column Type:',\n choices: [\n { title: 'String', value: 'string' },\n { title: 'Number', value: 'number' },\n { title: 'Boolean', value: 'boolean' },\n { title: 'Date', value: 'date' }\n ],\n initial: 0\n }\n ]);\n\n if (columnData.label && columnData.key && columnData.type) {\n columns.push({\n ...columnData,\n sortable: false // Will be set later\n });\n }\n }\n\n if (columns.length === 0) {\n // If user didn't add any, use defaults\n columns.push(\n { label: 'Name', key: 'name', type: 'string', sortable: true },\n { label: 'Status', key: 'status', type: 'string', sortable: true },\n { label: 'Created At', key: 'createdAt', type: 'date', sortable: true }\n );\n }\n }\n\n // Step 7: Filters\n const filters: Filter[] = [];\n\n console.log('\\n--- Filters ---');\n\n const { addFilters } = await prompts({\n type: 'confirm',\n name: 'addFilters',\n message: 'Add filters?',\n initial: true\n });\n\n if (addFilters) {\n let addFilterLoop = true;\n\n while (addFilterLoop) {\n const { continueAddingFilter } = await prompts({\n type: 'confirm',\n name: 'continueAddingFilter',\n message: filters.length === 0 ? 'Add a filter?' : 'Add another filter?',\n initial: filters.length === 0\n });\n\n if (!continueAddingFilter) break;\n\n const filterData = await prompts([\n {\n type: 'select',\n name: 'type',\n message: 'Filter type:',\n choices: [\n { title: 'Dropdown (Select)', value: 'select' },\n { title: 'Date Picker', value: 'date' },\n { title: 'Text Input', value: 'input' }\n ]\n },\n {\n type: 'text',\n name: 'label',\n message: 'Filter Label (e.g., \"Status\"):',\n validate: validateNotEmpty\n },\n {\n type: 'text',\n name: 'key',\n message: 'Filter Key (URL param, e.g., \"status\"):',\n validate: validateColumnKey\n }\n ]);\n\n if (filterData.type && filterData.label && filterData.key) {\n filters.push(filterData);\n }\n }\n }\n\n // Step 8: UI Options\n console.log('\\n--- UI Options ---');\n\n const uiOptions = await prompts([\n {\n type: 'confirm',\n name: 'includeStats',\n message: 'Include Stats Cards at the top?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'includeRowSelection',\n message: 'Include Row Selection (Checkboxes)?',\n initial: false\n }\n ]);\n\n // Step 9: Data Fetching Strategy\n const { dataFetching } = await prompts({\n type: 'select',\n name: 'dataFetching',\n message: 'Data Fetching Strategy:',\n choices: [\n { title: 'Mock Data (Repository Pattern)', value: 'mock', description: 'Default mock data with repository pattern' },\n { title: 'TanStack Query (React Query)', value: 'tanstack', description: 'Modern data fetching with caching' },\n { title: 'Standard (fetch/useEffect)', value: 'fetch', description: 'Basic fetch with useEffect' }\n ],\n initial: 0\n });\n\n // Step 10: Sorting\n const { enableSorting } = await prompts({\n type: 'confirm',\n name: 'enableSorting',\n message: 'Enable Column Sorting?',\n initial: true\n });\n\n let sortableColumns: string[] = [];\n\n if (enableSorting && columns.length > 0) {\n const { selected } = await prompts({\n type: 'multiselect',\n name: 'selected',\n message: 'Select columns to enable sorting (Space to select, Enter to submit):',\n choices: columns.map(c => ({ title: c.label, value: c.key, selected: true })),\n min: 0\n });\n\n sortableColumns = selected || [];\n\n // Update sortable flag on columns\n columns.forEach(col => {\n col.sortable = sortableColumns.includes(col.key);\n });\n }\n\n // Step 11: Animations\n console.log('\\n--- Animations (Framer Motion) ---');\n\n const animationOptions = await prompts([\n {\n type: 'confirm',\n name: 'pageTransitions',\n message: 'Add page transition animations?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'listAnimations',\n message: 'Animate table rows on load?',\n initial: true\n },\n {\n type: 'confirm',\n name: 'cardAnimations',\n message: 'Animate stats cards?',\n initial: uiOptions.includeStats\n },\n {\n type: 'select',\n name: 'intensity',\n message: 'Animation intensity:',\n choices: [\n { title: 'Subtle (professional)', value: 'subtle' },\n { title: 'Moderate (balanced)', value: 'moderate' },\n { title: 'Bold (eye-catching)', value: 'bold' }\n ],\n initial: 1\n }\n ]);\n\n // Build final config\n const config: GeneratorConfig = {\n pageName,\n routePath: cleanRoutePath,\n moduleName,\n architecture,\n entityName,\n columns,\n filters,\n includeStats: uiOptions.includeStats,\n includeRowSelection: uiOptions.includeRowSelection,\n includeSearch: true, // Always include search\n dataFetching,\n sortableColumns,\n animations: {\n pageTransitions: animationOptions.pageTransitions,\n listAnimations: animationOptions.listAnimations,\n cardAnimations: animationOptions.cardAnimations,\n intensity: animationOptions.intensity\n }\n };\n\n return config;\n}\n","/**\n * String transformation utilities\n */\n\n/**\n * Converts string to PascalCase\n * Example: \"user management\" => \"UserManagement\"\n */\nexport function toPascalCase(str: string): string {\n return str\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())\n .replace(/^[a-z]/, (c) => c.toUpperCase())\n .replace(/[^a-zA-Z0-9]/g, '');\n}\n\n/**\n * Converts string to camelCase\n * Example: \"User Management\" => \"userManagement\"\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Converts string to kebab-case\n * Example: \"User Management\" => \"user-management\"\n */\nexport function toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)+/g, '');\n}\n\n/**\n * Converts string to snake_case\n * Example: \"User Management\" => \"user_management\"\n */\nexport function toSnakeCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/(^_|_$)+/g, '');\n}\n\n/**\n * Pluralizes a word (simple English rules)\n * Example: \"User\" => \"Users\", \"Category\" => \"Categories\"\n */\nexport function pluralize(word: string): string {\n if (word.endsWith('y') && !['ay', 'ey', 'iy', 'oy', 'uy'].some(v => word.endsWith(v))) {\n return word.slice(0, -1) + 'ies';\n }\n if (word.endsWith('s') || word.endsWith('x') || word.endsWith('z') ||\n word.endsWith('ch') || word.endsWith('sh')) {\n return word + 'es';\n }\n return word + 's';\n}\n\n/**\n * Capitalizes first letter\n * Example: \"hello\" => \"Hello\"\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Input validation functions\n */\n\nexport function validateNotEmpty(value: string): boolean | string {\n return value.length > 0 || 'This field is required';\n}\n\nexport function validateRoutePath(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'Route path is required';\n }\n\n // Check for valid characters (alphanumeric, dash, slash)\n if (!/^[a-z0-9\\-\\/]+$/.test(value)) {\n return 'Route path can only contain lowercase letters, numbers, dashes, and slashes';\n }\n\n return true;\n}\n\nexport function validateIdentifier(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'This field is required';\n }\n\n // Check for valid identifier (alphanumeric, underscore, dash)\n if (!/^[a-zA-Z][a-zA-Z0-9_\\-]*$/.test(value)) {\n return 'Must start with a letter and contain only letters, numbers, underscores, and dashes';\n }\n\n return true;\n}\n\nexport function validateColumnKey(value: string): boolean | string {\n if (!value || value.length === 0) {\n return 'Column key is required';\n }\n\n // Check for valid JavaScript identifier\n if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(value)) {\n return 'Column key must be a valid JavaScript identifier (camelCase recommended)';\n }\n\n return true;\n}\n","import chalk from 'chalk';\n\n/**\n * Logger utility with colored output\n */\n\nexport const logger = {\n success(message: string): void {\n console.log(chalk.green('āœ“'), message);\n },\n\n error(message: string): void {\n console.log(chalk.red('āœ—'), message);\n },\n\n info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n },\n\n warning(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n },\n\n log(message: string): void {\n console.log(message);\n },\n\n title(message: string): void {\n console.log(chalk.bold.cyan(`\\n${message}\\n`));\n },\n\n step(step: number, total: number, message: string): void {\n console.log(chalk.gray(`[${step}/${total}]`), message);\n },\n\n dim(message: string): void {\n console.log(chalk.dim(message));\n }\n};\n","import path from 'path';\nimport type { GeneratorConfig, GeneratorResult, GeneratedFile } from '../types/index.js';\nimport { writeFiles, createDirectories } from '../utils/file-system.js';\nimport {\n generateEntity,\n generateRepositoryInterface,\n generateRepositoryImpl,\n generateUseCase,\n generateComponent,\n generatePage,\n generateTemplate\n} from '../templates/ddd/index.js';\n\n/**\n * DDD (Domain-Driven Design) Generator\n * Generates complete module structure with all layers\n */\nexport class DDDGenerator {\n constructor(private config: GeneratorConfig) {}\n\n async generate(): Promise<GeneratorResult> {\n const files: GeneratedFile[] = [];\n const cwd = process.cwd();\n const { moduleName, routePath } = this.config;\n\n // Define directory structure\n const moduleDir = path.join(cwd, 'modules', moduleName);\n const appDir = path.join(cwd, 'app', '(dashboard)', routePath);\n\n // Create directories\n const dirs = [\n path.join(moduleDir, 'domain', 'entities'),\n path.join(moduleDir, 'domain', 'repositories'),\n path.join(moduleDir, 'application', 'use-cases'),\n path.join(moduleDir, 'infrastructure', 'repositories'),\n path.join(moduleDir, 'presentation', 'components'),\n appDir\n ];\n\n await createDirectories(dirs);\n\n // Generate files\n // 1. Domain Layer - Entity\n files.push({\n path: path.join(moduleDir, 'domain', 'entities', `${moduleName}.entity.ts`),\n content: generateEntity(this.config)\n });\n\n // 2. Domain Layer - Repository Interface\n files.push({\n path: path.join(moduleDir, 'domain', 'repositories', `${moduleName}.repository.interface.ts`),\n content: generateRepositoryInterface(this.config)\n });\n\n // 3. Infrastructure Layer - Repository Implementation\n files.push({\n path: path.join(moduleDir, 'infrastructure', 'repositories', `${moduleName}.repository.ts`),\n content: generateRepositoryImpl(this.config)\n });\n\n // 4. Application Layer - Use Case\n files.push({\n path: path.join(moduleDir, 'application', 'use-cases', `get-${moduleName}s.use-case.ts`),\n content: generateUseCase(this.config)\n });\n\n // 5. Presentation Layer - Component\n files.push({\n path: path.join(moduleDir, 'presentation', 'components', `${moduleName}-list.tsx`),\n content: generateComponent(this.config)\n });\n\n // 6. App Layer - Page\n files.push({\n path: path.join(appDir, 'page.tsx'),\n content: generatePage(this.config)\n });\n\n // 7. App Layer - Template (if animations enabled)\n if (this.config.animations.pageTransitions) {\n files.push({\n path: path.join(appDir, 'template.tsx'),\n content: generateTemplate(this.config)\n });\n }\n\n // Write all files\n await writeFiles(files);\n\n // Generate instructions\n const instructions = this.generateInstructions();\n\n return { files, instructions };\n }\n\n private generateInstructions(): string[] {\n const instructions: string[] = [];\n\n instructions.push(`Navigate to your page: http://localhost:3000/${this.config.routePath}`);\n\n // Check for dependencies\n const deps: string[] = [];\n if (this.config.dataFetching === 'tanstack') {\n deps.push('@tanstack/react-query');\n }\n if (this.config.animations.pageTransitions || this.config.animations.listAnimations) {\n deps.push('framer-motion');\n }\n\n if (deps.length > 0) {\n instructions.push(`Install dependencies: npm install ${deps.join(' ')}`);\n }\n\n instructions.push('Customize the generated code to fit your needs');\n instructions.push('Connect to your real API (replace mock repository)');\n\n if (this.config.dataFetching === 'tanstack') {\n instructions.push('Ensure your app is wrapped in <QueryClientProvider>');\n }\n\n return instructions;\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { logger } from './logger.js';\n\n/**\n * File system utilities\n */\n\n/**\n * Ensures a directory exists, creates it if it doesn't\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\n/**\n * Writes content to a file, creating parent directories if needed\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Checks if a file or directory exists\n */\nexport async function exists(pathToCheck: string): Promise<boolean> {\n try {\n await fs.access(pathToCheck);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Reads a file and returns its content\n */\nexport async function readFile(filePath: string): Promise<string> {\n return await fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Checks if path is a directory\n */\nexport async function isDirectory(pathToCheck: string): Promise<boolean> {\n try {\n const stats = await fs.stat(pathToCheck);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Removes a file or directory\n */\nexport async function remove(pathToRemove: string): Promise<void> {\n await fs.remove(pathToRemove);\n}\n\n/**\n * Creates multiple directories at once\n */\nexport async function createDirectories(dirs: string[]): Promise<void> {\n for (const dir of dirs) {\n await ensureDir(dir);\n }\n}\n\n/**\n * Writes multiple files at once\n */\nexport async function writeFiles(files: Array<{ path: string; content: string }>): Promise<void> {\n for (const file of files) {\n await writeFile(file.path, file.content);\n logger.dim(` Created: ${file.path}`);\n }\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Domain Entity interface with DTOs\n */\nexport function generateEntity(config: GeneratorConfig): string {\n const { entityName, moduleName, columns } = config;\n\n const columnFields = columns.map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string' // ISO string for dates\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n');\n\n const createDTOFields = columns\n .filter(c => !['id', 'createdAt', 'updatedAt'].includes(c.key))\n .map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string'\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n');\n\n return `/**\n * Domain Entity: ${entityName}\n * Generated by shadcn-page-gen\n */\nexport interface ${entityName} {\n id: string;\n${columnFields}\n updatedAt: Date;\n}\n\nexport interface Create${entityName}DTO {\n${createDTOFields || ' // Add your fields here'}\n}\n\nexport interface Update${entityName}DTO extends Partial<Create${entityName}DTO> {\n id: string;\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Domain Repository Interface\n */\nexport function generateRepositoryInterface(config: GeneratorConfig): string {\n const { entityName, moduleName } = config;\n\n return `import { ${entityName}, Create${entityName}DTO, Update${entityName}DTO } from '../entities/${moduleName}.entity';\n\n/**\n * Repository Interface: ${entityName}\n * Generated by shadcn-page-gen\n */\nexport interface I${entityName}Repository {\n findAll(params?: any): Promise<${entityName}[]>;\n findById(id: string): Promise<${entityName} | null>;\n create(data: Create${entityName}DTO): Promise<${entityName}>;\n update(data: Update${entityName}DTO): Promise<${entityName}>;\n delete(id: string): Promise<void>;\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Infrastructure Repository Implementation with mock data\n */\nexport function generateRepositoryImpl(config: GeneratorConfig): string {\n const { entityName, moduleName, columns } = config;\n\n // Generate mock data fields\n const mockFields = columns.map(c => {\n if (c.key === 'createdAt') {\n return ` createdAt: new Date().toISOString(),`;\n }\n if (c.key === 'status') {\n return ` status: Math.random() > 0.5 ? 'Active' : 'Inactive',`;\n }\n if (c.key === 'name') {\n return ` name: \\`${entityName} \\${i + 1}\\`,`;\n }\n if (c.type === 'number') {\n return ` ${c.key}: (i + 1) * 100,`;\n }\n if (c.type === 'boolean') {\n return ` ${c.key}: Math.random() > 0.5,`;\n }\n if (c.type === 'date') {\n return ` ${c.key}: new Date().toISOString(),`;\n }\n return ` ${c.key}: \\`${c.label} \\${i + 1}\\`,`;\n }).join('\\n');\n\n return `import { ${entityName}, Create${entityName}DTO, Update${entityName}DTO } from '../../domain/entities/${moduleName}.entity';\nimport { I${entityName}Repository } from '../../domain/repositories/${moduleName}.repository.interface';\n\n/**\n * Repository Implementation: ${entityName}\n * Generated by shadcn-page-gen\n *\n * This is a mock implementation with in-memory data.\n * Replace with your actual API calls.\n */\nexport class ${entityName}Repository implements I${entityName}Repository {\n // Mock data - replace with real API calls\n private items: ${entityName}[] = Array.from({ length: 10 }).map((_, i) => ({\n id: (i + 1).toString(),\n${mockFields}\n updatedAt: new Date(),\n })) as unknown as ${entityName}[];\n\n async findAll(params?: any): Promise<${entityName}[]> {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Implement sorting, filtering, pagination\n // const { sortBy, order, page, limit } = params || {};\n\n return [...this.items];\n }\n\n async findById(id: string): Promise<${entityName} | null> {\n await new Promise(resolve => setTimeout(resolve, 300));\n const item = this.items.find(i => i.id === id);\n return item || null;\n }\n\n async create(data: Create${entityName}DTO): Promise<${entityName}> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const newItem: ${entityName} = {\n id: Date.now().toString(),\n ...data,\n updatedAt: new Date(),\n ${columns.some(c => c.key === 'createdAt') ? 'createdAt: new Date().toISOString(),' : ''}\n } as unknown as ${entityName};\n\n this.items.push(newItem);\n return newItem;\n }\n\n async update(data: Update${entityName}DTO): Promise<${entityName}> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const index = this.items.findIndex(i => i.id === data.id);\n if (index === -1) {\n throw new Error(\\`${entityName} with id \\${data.id} not found\\`);\n }\n\n this.items[index] = {\n ...this.items[index],\n ...data,\n updatedAt: new Date(),\n } as ${entityName};\n\n return this.items[index];\n }\n\n async delete(id: string): Promise<void> {\n await new Promise(resolve => setTimeout(resolve, 500));\n\n const index = this.items.findIndex(i => i.id === id);\n if (index === -1) {\n throw new Error(\\`${entityName} with id \\${id} not found\\`);\n }\n\n this.items.splice(index, 1);\n }\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Application Use Case\n */\nexport function generateUseCase(config: GeneratorConfig): string {\n const { entityName, moduleName } = config;\n\n return `import { ${entityName} } from '../../domain/entities/${moduleName}.entity';\nimport { I${entityName}Repository } from '../../domain/repositories/${moduleName}.repository.interface';\n\n/**\n * Use Case: Get ${entityName}s\n * Generated by shadcn-page-gen\n */\nexport class Get${entityName}sUseCase {\n constructor(private readonly repository: I${entityName}Repository) {}\n\n async execute(params?: any): Promise<${entityName}[]> {\n return await this.repository.findAll(params);\n }\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Presentation Layer Component with full CRUD features\n * This is the most complex template with all UI logic\n */\nexport function generateComponent(config: GeneratorConfig): string {\n const {\n entityName,\n moduleName,\n pageName,\n routePath,\n columns,\n filters,\n includeStats,\n includeRowSelection,\n dataFetching,\n sortableColumns,\n animations\n } = config;\n\n const isTanStack = dataFetching === 'tanstack';\n const hasAnimations = animations.listAnimations || animations.cardAnimations;\n\n // Generate imports based on features\n const imports = `'use client';\n\n${hasAnimations ? `import { motion } from 'framer-motion';` : ''}\nimport { useEffect, useState } from 'react';\nimport { ${entityName} } from '../../domain/entities/${moduleName}.entity';\nimport { Get${entityName}sUseCase } from '../../application/use-cases/get-${moduleName}s.use-case';\nimport { ${entityName}Repository } from '../../infrastructure/repositories/${moduleName}.repository';\n${isTanStack ? `import { useQuery } from '@tanstack/react-query';` : ''}\nimport { Button } from '@/components/ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Input } from '@/components/ui/input';\n${filters.some(f => f.type === 'date') ? `import { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { format } from 'date-fns';` : ''}\nimport { Badge } from '@/components/ui/badge';\n${includeStats ? `import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';` : ''}\nimport {\n Search,\n Plus,\n X,\n RefreshCcw,\n Eye,\n Pencil,\n Trash2,\n MoreHorizontal,\n ${sortableColumns.length > 0 ? 'ArrowUpDown, ArrowUp, ArrowDown,' : ''}\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/components/ui/pagination\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\n${includeRowSelection ? `import { Checkbox } from \"@/components/ui/checkbox\";` : ''}`;\n\n // Generate animation variants if needed\n const animationVariants = hasAnimations ? `\n// Framer Motion animation variants\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: ${animations.intensity === 'bold' ? '0.1' : animations.intensity === 'subtle' ? '0.03' : '0.05'}\n }\n }\n};\n\nconst itemVariants = {\n hidden: { opacity: 0, x: -20 },\n visible: {\n opacity: 1,\n x: 0,\n transition: { duration: ${animations.intensity === 'bold' ? '0.3' : animations.intensity === 'subtle' ? '0.15' : '0.2'} }\n }\n};\n` : '';\n\n // Generate data fetching code\n const dataFetchingCode = isTanStack ? `\n // TanStack Query data fetching\n const { data, isLoading: loading, refetch } = useQuery({\n queryKey: ['${moduleName}', searchParams.toString()],\n queryFn: async () => {\n const repo = new ${entityName}Repository();\n const useCase = new Get${entityName}sUseCase(repo);\n return await useCase.execute({\n q: searchParams.get('q'),\n page: searchParams.get('page'),\n limit: pageSize,\n sortBy: searchParams.get('sortBy'),\n order: searchParams.get('order'),\n ...Object.fromEntries(searchParams.entries())\n });\n }\n });` : `\n const [data, setData] = useState<${entityName}[]>([]);\n const [loading, setLoading] = useState(true);\n\n const fetchData = async () => {\n setLoading(true);\n try {\n const repo = new ${entityName}Repository();\n const useCase = new Get${entityName}sUseCase(repo);\n const result = await useCase.execute({\n q: searchParams.get('q'),\n page: searchParams.get('page'),\n limit: pageSize,\n sortBy: searchParams.get('sortBy'),\n order: searchParams.get('order'),\n ...Object.fromEntries(searchParams.entries())\n });\n setData(result);\n } catch (error) {\n console.error(error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchData();\n }, [searchParams]);`;\n\n // Generate row selection code\n const rowSelectionCode = includeRowSelection ? `\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n const toggleRow = (id: string) => {\n const newSelected = new Set(selectedRows);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedRows(newSelected);\n };\n\n const toggleAll = () => {\n if (selectedRows.size === (data?.length || 0)) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(data?.map(i => i.id) || []));\n }\n };` : '';\n\n // Generate stats cards\n const statsCards = includeStats ? `\n {/* Stats Cards */}\n ${animations.cardAnimations ? `<motion.div\n className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >` : `<div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">`}\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total ${entityName}s</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">128</div>\n <p className=\"text-xs text-muted-foreground\">+20.1% from last month</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">12</div>\n <p className=\"text-xs text-muted-foreground\">+4 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">4</div>\n <p className=\"text-xs text-muted-foreground\">-2 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Closed</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">2</div>\n <p className=\"text-xs text-muted-foreground\">+1 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n ${animations.cardAnimations ? `</motion.div>` : `</div>`}\n` : '';\n\n // Generate filter components\n const filterComponents = filters.map(f => {\n if (f.type === 'select') {\n return `\n <Select\n value={searchParams.get('${f.key}') || 'all'}\n onValueChange={(value) => updateParam('${f.key}', value === 'all' ? null : value)}\n >\n <SelectTrigger className=\"w-[150px]\">\n <SelectValue placeholder=\"${f.label}\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All ${f.label}</SelectItem>\n <SelectItem value=\"active\">Active</SelectItem>\n <SelectItem value=\"inactive\">Inactive</SelectItem>\n </SelectContent>\n </Select>`;\n } else if (f.type === 'date') {\n return `\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"w-[200px] justify-start text-left font-normal\",\n !searchParams.get('${f.key}') && \"text-muted-foreground\"\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {searchParams.get('${f.key}') ? (\n format(new Date(searchParams.get('${f.key}')!), \"PPP\")\n ) : (\n <span>${f.label}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={searchParams.get('${f.key}') ? new Date(searchParams.get('${f.key}')!) : undefined}\n onSelect={(date) => updateParam('${f.key}', date ? date.toISOString() : null)}\n initialFocus\n />\n </PopoverContent>\n </Popover>`;\n }\n return '';\n }).join('\\n');\n\n // Generate table column headers\n const tableHeaders = columns.map(c => {\n const isSortable = sortableColumns.includes(c.key);\n if (isSortable) {\n return ` <TableHead className=\"cursor-pointer\" onClick={() => handleSort('${c.key}')}>\n <div className=\"flex items-center gap-1\">\n ${c.label.toUpperCase()}\n {searchParams.get('sortBy') === '${c.key}' ? (\n searchParams.get('order') === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : <ArrowUpDown className=\"h-3 w-3 text-muted-foreground\" />}\n </div>\n </TableHead>`;\n }\n return ` <TableHead>${c.label.toUpperCase()}</TableHead>`;\n }).join('\\n');\n\n // Generate table cells\n const tableCells = columns.map(c => {\n if (c.key === 'status') {\n return ` <TableCell>\n <Badge variant={item.status === 'Active' ? 'default' : 'secondary'} className=\"rounded-full\">\n {item.status}\n </Badge>\n </TableCell>`;\n }\n if (c.type === 'date') {\n return ` <TableCell className=\"text-muted-foreground\">{new Date(item.${c.key}).toLocaleDateString()}</TableCell>`;\n }\n return ` <TableCell>{item.${c.key}}</TableCell>`;\n }).join('\\n');\n\n const colSpan = columns.length + 2 + (includeRowSelection ? 1 : 0);\n\n return `${imports}\n\n/**\n * ${entityName} List Component\n * Generated by shadcn-page-gen\n *\n * Features:\n * - Search and filters\n * - Sorting: ${sortableColumns.length > 0 ? sortableColumns.join(', ') : 'None'}\n * - Pagination\n * - Row actions (View, Edit, Delete)\n * ${includeStats ? '- Stats cards' : ''}\n * ${includeRowSelection ? '- Row selection' : ''}\n * ${animations.listAnimations || animations.cardAnimations ? `- Framer Motion animations (${animations.intensity})` : ''}\n */\n${animationVariants}\nexport function ${entityName}List() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || '');\n const pageSize = Number(searchParams.get('limit')) || 10;\n${dataFetchingCode}\n${rowSelectionCode}\n\n const updateParam = (key: string, value: string | null) => {\n const params = new URLSearchParams(searchParams.toString());\n if (value) params.set(key, value);\n else params.delete(key);\n\n if (key !== 'page') params.set('page', '1');\n\n router.push('?' + params.toString());\n };\n\n ${sortableColumns.length > 0 ? `const handleSort = (key: string) => {\n const currentSort = searchParams.get('sortBy');\n const currentOrder = searchParams.get('order');\n\n let newOrder = 'asc';\n if (currentSort === key && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n\n const params = new URLSearchParams(searchParams.toString());\n params.set('sortBy', key);\n params.set('order', newOrder);\n router.push('?' + params.toString());\n };` : ''}\n\n return (\n <div className=\"space-y-6\">\n${statsCards}\n {/* Actions Bar */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-1 items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onBlur={() => updateParam('q', searchTerm)}\n className=\"pl-9 w-full md:max-w-md\"\n />\n </div>\n${filterComponents}\n {(searchParams.toString().length > 0) && (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => router.push('/${routePath}')} title=\"Reset Filters\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => ${isTanStack ? 'refetch()' : 'fetchData()'}}>\n <RefreshCcw className=\"mr-2 h-4 w-4\" /> Refresh\n </Button>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New ${entityName}\n </Button>\n </div>\n </div>\n\n {/* Main Table */}\n <Card>\n <CardContent className=\"p-0\">\n <Table>\n <TableHeader>\n <TableRow>\n ${includeRowSelection ? `<TableHead className=\"w-[50px]\"><Checkbox checked={data?.length > 0 && selectedRows.size === data?.length} onCheckedChange={toggleAll} /></TableHead>` : ''}\n <TableHead className=\"w-[100px]\">ID</TableHead>\n${tableHeaders}\n <TableHead className=\"text-right\">ACTIONS</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">Loading data...</TableCell>\n </TableRow>\n ) : !data || data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">No results found.</TableCell>\n </TableRow>\n ) : (\n ${animations.listAnimations ? `\n data.map((item, index) => (\n <motion.tr\n key={item.id}\n variants={itemVariants}\n initial=\"hidden\"\n animate=\"visible\"\n custom={index}\n className=\"group\"\n >` : `data.map((item) => (\n <TableRow key={item.id} className=\"group\">`}\n ${includeRowSelection ? `<TableCell><Checkbox checked={selectedRows.has(item.id)} onCheckedChange={() => toggleRow(item.id)} /></TableCell>` : ''}\n <TableCell className=\"font-medium\">{item.id}</TableCell>\n${tableCells}\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-blue-500 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-950\">\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-green-500 hover:text-green-600 hover:bg-green-50 dark:hover:bg-green-950\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-red-500 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-950\">\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuItem>View Details</DropdownMenuItem>\n <DropdownMenuItem>Edit Record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TableCell>\n ${animations.listAnimations ? `</motion.tr>` : `</TableRow>`}\n ))\n )}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n {/* Pagination */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>Show</span>\n <Select value={pageSize.toString()} onValueChange={(v) => updateParam('limit', v)}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue placeholder={pageSize.toString()} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {[10, 20, 30, 50, 100].map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>entries</span>\n </div>\n <Pagination className=\"justify-end w-auto\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates App Router Page\n */\nexport function generatePage(config: GeneratorConfig): string {\n const { pageName, moduleName, entityName } = config;\n\n return `import { Suspense } from 'react';\nimport { ${entityName}List } from '@/modules/${moduleName}/presentation/components/${moduleName}-list';\n\n/**\n * ${pageName} Page\n * Generated by shadcn-page-gen\n */\nexport default function ${entityName}Page() {\n return (\n <div className=\"container mx-auto py-10 space-y-8\">\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">${pageName}</h1>\n <p className=\"text-muted-foreground\">\n Manage your ${pageName.toLowerCase()}.\n </p>\n </div>\n\n <Suspense fallback={<div>Loading...</div>}>\n <${entityName}List />\n </Suspense>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates App Router Template for page transitions\n */\nexport function generateTemplate(config: GeneratorConfig): string {\n const { animations } = config;\n\n // Get animation config based on intensity\n const getAnimationConfig = () => {\n switch (animations.intensity) {\n case 'subtle':\n return {\n initial: '{ opacity: 0, y: 10 }',\n animate: '{ opacity: 1, y: 0 }',\n transition: '{ duration: 0.2 }'\n };\n case 'bold':\n return {\n initial: '{ opacity: 0, scale: 0.95, y: 30 }',\n animate: '{ opacity: 1, scale: 1, y: 0 }',\n transition: '{ duration: 0.4, ease: [0.43, 0.13, 0.23, 0.96] }'\n };\n default: // moderate\n return {\n initial: '{ opacity: 0, y: 20 }',\n animate: '{ opacity: 1, y: 0 }',\n transition: '{ duration: 0.3, ease: \"easeInOut\" }'\n };\n }\n };\n\n const animConfig = getAnimationConfig();\n\n return `'use client';\n\nimport { motion } from 'framer-motion';\n\n/**\n * Page Template with Framer Motion transitions\n * Generated by shadcn-page-gen\n */\nexport default function Template({ children }: { children: React.ReactNode }) {\n return (\n <motion.div\n initial=${animConfig.initial}\n animate=${animConfig.animate}\n exit={{ opacity: 0, y: -20 }}\n transition=${animConfig.transition}\n >\n {children}\n </motion.div>\n );\n}\n`;\n}\n","import path from 'path';\nimport type { GeneratorConfig, GeneratorResult, GeneratedFile } from '../types/index.js';\nimport { writeFiles, createDirectories } from '../utils/file-system.js';\nimport {\n generateSimplifiedComponent,\n generateSimplifiedPage,\n generateTemplate\n} from '../templates/simplified/index.js';\n\n/**\n * Simplified Generator\n * Generates just components and pages without DDD layers\n */\nexport class SimplifiedGenerator {\n constructor(private config: GeneratorConfig) {}\n\n async generate(): Promise<GeneratorResult> {\n const files: GeneratedFile[] = [];\n const cwd = process.cwd();\n const { moduleName, routePath } = this.config;\n\n // Define directory structure\n const componentDir = path.join(cwd, 'components', moduleName);\n const appDir = path.join(cwd, 'app', '(dashboard)', routePath);\n\n // Create directories\n await createDirectories([componentDir, appDir]);\n\n // Generate files\n // 1. Component\n files.push({\n path: path.join(componentDir, `${moduleName}-list.tsx`),\n content: generateSimplifiedComponent(this.config)\n });\n\n // 2. Page\n files.push({\n path: path.join(appDir, 'page.tsx'),\n content: generateSimplifiedPage(this.config)\n });\n\n // 3. Template (if animations enabled)\n if (this.config.animations.pageTransitions) {\n files.push({\n path: path.join(appDir, 'template.tsx'),\n content: generateTemplate(this.config)\n });\n }\n\n // Write all files\n await writeFiles(files);\n\n // Generate instructions\n const instructions = this.generateInstructions();\n\n return { files, instructions };\n }\n\n private generateInstructions(): string[] {\n const instructions: string[] = [];\n\n instructions.push(`Navigate to your page: http://localhost:3000/${this.config.routePath}`);\n\n // Check for dependencies\n const deps: string[] = [];\n if (this.config.dataFetching === 'tanstack') {\n deps.push('@tanstack/react-query');\n }\n if (this.config.animations.pageTransitions || this.config.animations.listAnimations) {\n deps.push('framer-motion');\n }\n\n if (deps.length > 0) {\n instructions.push(`Install dependencies: npm install ${deps.join(' ')}`);\n }\n\n instructions.push('Customize the generated code to fit your needs');\n instructions.push('Replace mock data with your real API');\n\n if (this.config.dataFetching === 'tanstack') {\n instructions.push('Ensure your app is wrapped in <QueryClientProvider>');\n }\n\n return instructions;\n }\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Simplified Component (without DDD layers)\n * Direct data fetching without repository pattern\n */\nexport function generateSimplifiedComponent(config: GeneratorConfig): string {\n const {\n entityName,\n moduleName,\n pageName,\n routePath,\n columns,\n filters,\n includeStats,\n includeRowSelection,\n dataFetching,\n sortableColumns,\n animations\n } = config;\n\n const isTanStack = dataFetching === 'tanstack';\n const hasAnimations = animations.listAnimations || animations.cardAnimations;\n\n // Mock data type interface\n const mockDataInterface = `interface ${entityName} {\n id: string;\n${columns.map(c => {\n const typeMap: Record<string, string> = {\n 'string': 'string',\n 'number': 'number',\n 'boolean': 'boolean',\n 'date': 'string'\n };\n return ` ${c.key}: ${typeMap[c.type]};`;\n }).join('\\n')}\n updatedAt: Date;\n}`;\n\n // Generate mock data\n const mockDataFields = columns.map(c => {\n if (c.key === 'createdAt') {\n return ` createdAt: new Date().toISOString(),`;\n }\n if (c.key === 'status') {\n return ` status: Math.random() > 0.5 ? 'Active' : 'Inactive',`;\n }\n if (c.key === 'name') {\n return ` name: \\`${entityName} \\${i + 1}\\`,`;\n }\n if (c.type === 'number') {\n return ` ${c.key}: (i + 1) * 100,`;\n }\n if (c.type === 'boolean') {\n return ` ${c.key}: Math.random() > 0.5,`;\n }\n if (c.type === 'date') {\n return ` ${c.key}: new Date().toISOString(),`;\n }\n return ` ${c.key}: \\`${c.label} \\${i + 1}\\`,`;\n }).join('\\n');\n\n const mockData = `// Mock data - replace with your API call\nconst MOCK_DATA: ${entityName}[] = Array.from({ length: 10 }).map((_, i) => ({\n id: (i + 1).toString(),\n${mockDataFields}\n updatedAt: new Date(),\n})) as unknown as ${entityName}[];`;\n\n // Data fetching function\n const fetchFunction = isTanStack ? '' : `\n // Fetch data function - replace with your API call\n const fetchData = async () => {\n setLoading(true);\n try {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Replace with real API call\n // const response = await fetch('/api/${moduleName}');\n // const result = await response.json();\n\n setData(MOCK_DATA);\n } catch (error) {\n console.error('Error fetching data:', error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n fetchData();\n }, [searchParams]);`;\n\n const dataFetchingSetup = isTanStack ? `\n // TanStack Query data fetching\n const { data, isLoading: loading, refetch } = useQuery({\n queryKey: ['${moduleName}', searchParams.toString()],\n queryFn: async () => {\n // Simulate API delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // TODO: Replace with real API call\n // const response = await fetch('/api/${moduleName}');\n // return await response.json();\n\n return MOCK_DATA;\n }\n });` : `\n const [data, setData] = useState<${entityName}[]>([]);\n const [loading, setLoading] = useState(true);\n${fetchFunction}`;\n\n // Similar structure to DDD component but without repository imports\n const imports = `'use client';\n\n${hasAnimations ? `import { motion } from 'framer-motion';` : ''}\nimport { useEffect, useState } from 'react';\n${isTanStack ? `import { useQuery } from '@tanstack/react-query';` : ''}\nimport { Button } from '@/components/ui/button';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select';\nimport { Input } from '@/components/ui/input';\n${filters.some(f => f.type === 'date') ? `import { Calendar } from '@/components/ui/calendar';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Calendar as CalendarIcon } from 'lucide-react';\nimport { format } from 'date-fns';` : ''}\nimport { Badge } from '@/components/ui/badge';\n${includeStats ? `import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';` : ''}\nimport {\n Search,\n Plus,\n X,\n RefreshCcw,\n Eye,\n Pencil,\n Trash2,\n MoreHorizontal,\n ${sortableColumns.length > 0 ? 'ArrowUpDown, ArrowUp, ArrowDown,' : ''}\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useRouter, useSearchParams } from 'next/navigation';\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/components/ui/pagination\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\n${includeRowSelection ? `import { Checkbox } from \"@/components/ui/checkbox\";` : ''}`;\n\n // Animation variants\n const animationVariants = hasAnimations ? `\n// Framer Motion animation variants\nconst containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: ${animations.intensity === 'bold' ? '0.1' : animations.intensity === 'subtle' ? '0.03' : '0.05'}\n }\n }\n};\n\nconst itemVariants = {\n hidden: { opacity: 0, x: -20 },\n visible: {\n opacity: 1,\n x: 0,\n transition: { duration: ${animations.intensity === 'bold' ? '0.3' : animations.intensity === 'subtle' ? '0.15' : '0.2'} }\n }\n};\n` : '';\n\n // Row selection\n const rowSelectionCode = includeRowSelection ? `\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n\n const toggleRow = (id: string) => {\n const newSelected = new Set(selectedRows);\n if (newSelected.has(id)) newSelected.delete(id);\n else newSelected.add(id);\n setSelectedRows(newSelected);\n };\n\n const toggleAll = () => {\n if (selectedRows.size === (data?.length || 0)) {\n setSelectedRows(new Set());\n } else {\n setSelectedRows(new Set(data?.map(i => i.id) || []));\n }\n };` : '';\n\n // Stats cards (same as DDD)\n const statsCards = includeStats ? `\n {/* Stats Cards */}\n ${animations.cardAnimations ? `<motion.div\n className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >` : `<div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">`}\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total ${entityName}s</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">128</div>\n <p className=\"text-xs text-muted-foreground\">+20.1% from last month</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">12</div>\n <p className=\"text-xs text-muted-foreground\">+4 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">4</div>\n <p className=\"text-xs text-muted-foreground\">-2 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n\n ${animations.cardAnimations ? `<motion.div variants={itemVariants}>` : ''}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Closed</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">2</div>\n <p className=\"text-xs text-muted-foreground\">+1 since yesterday</p>\n </CardContent>\n </Card>\n ${animations.cardAnimations ? `</motion.div>` : ''}\n ${animations.cardAnimations ? `</motion.div>` : `</div>`}\n` : '';\n\n // Filter components (same as DDD)\n const filterComponents = filters.map(f => {\n if (f.type === 'select') {\n return `\n <Select\n value={searchParams.get('${f.key}') || 'all'}\n onValueChange={(value) => updateParam('${f.key}', value === 'all' ? null : value)}\n >\n <SelectTrigger className=\"w-[150px]\">\n <SelectValue placeholder=\"${f.label}\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All ${f.label}</SelectItem>\n <SelectItem value=\"active\">Active</SelectItem>\n <SelectItem value=\"inactive\">Inactive</SelectItem>\n </SelectContent>\n </Select>`;\n } else if (f.type === 'date') {\n return `\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"w-[200px] justify-start text-left font-normal\",\n !searchParams.get('${f.key}') && \"text-muted-foreground\"\n )}\n >\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\n {searchParams.get('${f.key}') ? (\n format(new Date(searchParams.get('${f.key}')!), \"PPP\")\n ) : (\n <span>${f.label}</span>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={searchParams.get('${f.key}') ? new Date(searchParams.get('${f.key}')!) : undefined}\n onSelect={(date) => updateParam('${f.key}', date ? date.toISOString() : null)}\n initialFocus\n />\n </PopoverContent>\n </Popover>`;\n }\n return '';\n }).join('\\n');\n\n // Table headers (same as DDD)\n const tableHeaders = columns.map(c => {\n const isSortable = sortableColumns.includes(c.key);\n if (isSortable) {\n return ` <TableHead className=\"cursor-pointer\" onClick={() => handleSort('${c.key}')}>\n <div className=\"flex items-center gap-1\">\n ${c.label.toUpperCase()}\n {searchParams.get('sortBy') === '${c.key}' ? (\n searchParams.get('order') === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : <ArrowUpDown className=\"h-3 w-3 text-muted-foreground\" />}\n </div>\n </TableHead>`;\n }\n return ` <TableHead>${c.label.toUpperCase()}</TableHead>`;\n }).join('\\n');\n\n // Table cells (same as DDD)\n const tableCells = columns.map(c => {\n if (c.key === 'status') {\n return ` <TableCell>\n <Badge variant={item.status === 'Active' ? 'default' : 'secondary'} className=\"rounded-full\">\n {item.status}\n </Badge>\n </TableCell>`;\n }\n if (c.type === 'date') {\n return ` <TableCell className=\"text-muted-foreground\">{new Date(item.${c.key}).toLocaleDateString()}</TableCell>`;\n }\n return ` <TableCell>{item.${c.key}}</TableCell>`;\n }).join('\\n');\n\n const colSpan = columns.length + 2 + (includeRowSelection ? 1 : 0);\n\n return `${imports}\n\n/**\n * ${entityName} List Component (Simplified Architecture)\n * Generated by shadcn-page-gen\n */\n\n${mockDataInterface}\n\n${mockData}\n${animationVariants}\nexport function ${entityName}List() {\n const router = useRouter();\n const searchParams = useSearchParams();\n\n const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || '');\n const pageSize = Number(searchParams.get('limit')) || 10;\n${dataFetchingSetup}\n${rowSelectionCode}\n\n const updateParam = (key: string, value: string | null) => {\n const params = new URLSearchParams(searchParams.toString());\n if (value) params.set(key, value);\n else params.delete(key);\n\n if (key !== 'page') params.set('page', '1');\n\n router.push('?' + params.toString());\n };\n\n ${sortableColumns.length > 0 ? `const handleSort = (key: string) => {\n const currentSort = searchParams.get('sortBy');\n const currentOrder = searchParams.get('order');\n\n let newOrder = 'asc';\n if (currentSort === key && currentOrder === 'asc') {\n newOrder = 'desc';\n }\n\n const params = new URLSearchParams(searchParams.toString());\n params.set('sortBy', key);\n params.set('order', newOrder);\n router.push('?' + params.toString());\n };` : ''}\n\n return (\n <div className=\"space-y-6\">\n${statsCards}\n {/* Actions Bar */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-1 items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n onBlur={() => updateParam('q', searchTerm)}\n className=\"pl-9 w-full md:max-w-md\"\n />\n </div>\n${filterComponents}\n {(searchParams.toString().length > 0) && (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => router.push('/${routePath}')} title=\"Reset Filters\">\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => ${isTanStack ? 'refetch()' : 'fetchData()'}}>\n <RefreshCcw className=\"mr-2 h-4 w-4\" /> Refresh\n </Button>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New ${entityName}\n </Button>\n </div>\n </div>\n\n {/* Main Table */}\n <Card>\n <CardContent className=\"p-0\">\n <Table>\n <TableHeader>\n <TableRow>\n ${includeRowSelection ? `<TableHead className=\"w-[50px]\"><Checkbox checked={data?.length > 0 && selectedRows.size === data?.length} onCheckedChange={toggleAll} /></TableHead>` : ''}\n <TableHead className=\"w-[100px]\">ID</TableHead>\n${tableHeaders}\n <TableHead className=\"text-right\">ACTIONS</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">Loading data...</TableCell>\n </TableRow>\n ) : !data || data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={${colSpan}} className=\"text-center h-24 text-muted-foreground\">No results found.</TableCell>\n </TableRow>\n ) : (\n ${animations.listAnimations ? `\n data.map((item, index) => (\n <motion.tr\n key={item.id}\n variants={itemVariants}\n initial=\"hidden\"\n animate=\"visible\"\n custom={index}\n className=\"group\"\n >` : `data.map((item) => (\n <TableRow key={item.id} className=\"group\">`}\n ${includeRowSelection ? `<TableCell><Checkbox checked={selectedRows.has(item.id)} onCheckedChange={() => toggleRow(item.id)} /></TableCell>` : ''}\n <TableCell className=\"font-medium\">{item.id}</TableCell>\n${tableCells}\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-blue-500 hover:text-blue-600 hover:bg-blue-50 dark:hover:bg-blue-950\">\n <Eye className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-green-500 hover:text-green-600 hover:bg-green-50 dark:hover:bg-green-950\">\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8 text-red-500 hover:text-red-600 hover:bg-red-50 dark:hover:bg-red-950\">\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuItem>View Details</DropdownMenuItem>\n <DropdownMenuItem>Edit Record</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </TableCell>\n ${animations.listAnimations ? `</motion.tr>` : `</TableRow>`}\n ))\n )}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n {/* Pagination */}\n <div className=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>Show</span>\n <Select value={pageSize.toString()} onValueChange={(v) => updateParam('limit', v)}>\n <SelectTrigger className=\"h-8 w-[70px]\">\n <SelectValue placeholder={pageSize.toString()} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {[10, 20, 30, 50, 100].map((size) => (\n <SelectItem key={size} value={size.toString()}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span>entries</span>\n </div>\n <Pagination className=\"justify-end w-auto\">\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig } from '../../types/index.js';\n\n/**\n * Generates Simplified Page\n */\nexport function generateSimplifiedPage(config: GeneratorConfig): string {\n const { pageName, moduleName, entityName } = config;\n\n return `import { Suspense } from 'react';\nimport { ${entityName}List } from '@/components/${moduleName}/${moduleName}-list';\n\n/**\n * ${pageName} Page\n * Generated by shadcn-page-gen (Simplified Architecture)\n */\nexport default function ${entityName}Page() {\n return (\n <div className=\"container mx-auto py-10 space-y-8\">\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">${pageName}</h1>\n <p className=\"text-muted-foreground\">\n Manage your ${pageName.toLowerCase()}.\n </p>\n </div>\n\n <Suspense fallback={<div>Loading...</div>}>\n <${entityName}List />\n </Suspense>\n </div>\n );\n}\n`;\n}\n","import type { GeneratorConfig, GeneratorResult } from '../types/index.js';\nimport { DDDGenerator } from './ddd-generator.js';\nimport { SimplifiedGenerator } from './simplified-generator.js';\n\n/**\n * Main page generator orchestrator\n * Chooses between DDD and Simplified generators based on config\n */\nexport class PageGenerator {\n private generator: DDDGenerator | SimplifiedGenerator;\n\n constructor(private config: GeneratorConfig) {\n // Choose generator based on architecture\n this.generator = config.architecture === 'ddd'\n ? new DDDGenerator(config)\n : new SimplifiedGenerator(config);\n }\n\n /**\n * Generates all files and returns result\n */\n async generate(): Promise<GeneratorResult> {\n return await this.generator.generate();\n }\n}\n"],"mappings":";;;AAAA,OAAO,SAAS;;;ACAhB,OAAO,aAAa;;;ACQb,SAAS,aAAa,KAAqB;AAChD,SAAO,IACJ,QAAQ,qBAAqB,CAAC,GAAG,QAAQ,IAAI,YAAY,CAAC,EAC1D,QAAQ,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,EACxC,QAAQ,iBAAiB,EAAE;AAChC;AAeO,SAAS,YAAY,KAAqB;AAC/C,SAAO,IACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,aAAa,EAAE;AAC5B;;;AC7BO,SAAS,iBAAiB,OAAiC;AAChE,SAAO,MAAM,SAAS,KAAK;AAC7B;AAEO,SAAS,kBAAkB,OAAiC;AACjE,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,kBAAkB,KAAK,KAAK,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAeO,SAAS,kBAAkB,OAAiC;AACjE,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,6BAA6B,KAAK,KAAK,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AFrCA,eAAsB,uBAAwD;AAE5E,UAAQ,SAAS,EAAE,UAAU,MAAM,QAAQ,KAAK,CAAC,EAAE,CAAC;AAEpD,UAAQ,IAAI,2CAAoC;AAGhD,QAAM,EAAE,SAAS,IAAI,MAAM,QAAQ;AAAA,IACjC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAED,MAAI,CAAC,SAAU,QAAO;AAGtB,QAAM,eAAe,YAAY,QAAQ;AACzC,QAAM,EAAE,UAAU,IAAI,MAAM,QAAQ;AAAA,IAClC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,CAAC;AAED,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,iBAAiB,UAAU,QAAQ,cAAc,EAAE;AACzD,QAAM,oBAAoB,eAAe,QAAQ,OAAO,GAAG;AAG3D,QAAM,EAAE,WAAW,IAAI,MAAM,QAAQ;AAAA,IACnC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,CAAC,WAAY,QAAO;AAGxB,QAAM,EAAE,aAAa,IAAI,MAAM,QAAQ;AAAA,IACrC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,MACP;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AAED,MAAI,CAAC,aAAc,QAAO;AAG1B,QAAM,aAAa,aAAa,QAAQ;AACxC,MAAI,aAAa;AAEjB,MAAI,iBAAiB,OAAO;AAC1B,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,SAAS,WAAY,QAAO;AACjC,iBAAa,SAAS;AAAA,EACxB;AAGA,QAAM,UAAoB,CAAC;AAC3B,MAAI,YAAY;AAEhB,UAAQ,IAAI,2CAA2C;AAEvD,QAAM,EAAE,kBAAkB,IAAI,MAAM,QAAQ;AAAA,IAC1C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,mBAAmB;AACrB,YAAQ;AAAA,MACN,EAAE,OAAO,QAAQ,KAAK,QAAQ,MAAM,UAAU,UAAU,KAAK;AAAA,MAC7D,EAAE,OAAO,UAAU,KAAK,UAAU,MAAM,UAAU,UAAU,KAAK;AAAA,MACjE,EAAE,OAAO,cAAc,KAAK,aAAa,MAAM,QAAQ,UAAU,KAAK;AAAA,IACxE;AAAA,EACF,OAAO;AACL,WAAO,WAAW;AAChB,YAAM,EAAE,eAAe,IAAI,MAAM,QAAQ;AAAA,QACvC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,QAAQ,WAAW,IAAI,kBAAkB;AAAA,QAClD,SAAS;AAAA,MACX,CAAC;AAED,UAAI,CAAC,eAAgB;AAErB,YAAM,aAAa,MAAM,QAAQ;AAAA,QAC/B;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,YACP,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,YACnC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,YACnC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,YACrC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,UACjC;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAED,UAAI,WAAW,SAAS,WAAW,OAAO,WAAW,MAAM;AACzD,gBAAQ,KAAK;AAAA,UACX,GAAG;AAAA,UACH,UAAU;AAAA;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,GAAG;AAExB,cAAQ;AAAA,QACN,EAAE,OAAO,QAAQ,KAAK,QAAQ,MAAM,UAAU,UAAU,KAAK;AAAA,QAC7D,EAAE,OAAO,UAAU,KAAK,UAAU,MAAM,UAAU,UAAU,KAAK;AAAA,QACjE,EAAE,OAAO,cAAc,KAAK,aAAa,MAAM,QAAQ,UAAU,KAAK;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAoB,CAAC;AAE3B,UAAQ,IAAI,mBAAmB;AAE/B,QAAM,EAAE,WAAW,IAAI,MAAM,QAAQ;AAAA,IACnC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,YAAY;AACd,QAAI,gBAAgB;AAEpB,WAAO,eAAe;AACpB,YAAM,EAAE,qBAAqB,IAAI,MAAM,QAAQ;AAAA,QAC7C,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,QAAQ,WAAW,IAAI,kBAAkB;AAAA,QAClD,SAAS,QAAQ,WAAW;AAAA,MAC9B,CAAC;AAED,UAAI,CAAC,qBAAsB;AAE3B,YAAM,aAAa,MAAM,QAAQ;AAAA,QAC/B;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,YACP,EAAE,OAAO,qBAAqB,OAAO,SAAS;AAAA,YAC9C,EAAE,OAAO,eAAe,OAAO,OAAO;AAAA,YACtC,EAAE,OAAO,cAAc,OAAO,QAAQ;AAAA,UACxC;AAAA,QACF;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAED,UAAI,WAAW,QAAQ,WAAW,SAAS,WAAW,KAAK;AACzD,gBAAQ,KAAK,UAAU;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,IAAI,sBAAsB;AAElC,QAAM,YAAY,MAAM,QAAQ;AAAA,IAC9B;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,EAAE,aAAa,IAAI,MAAM,QAAQ;AAAA,IACrC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,kCAAkC,OAAO,QAAQ,aAAa,4CAA4C;AAAA,MACnH,EAAE,OAAO,gCAAgC,OAAO,YAAY,aAAa,oCAAoC;AAAA,MAC7G,EAAE,OAAO,8BAA8B,OAAO,SAAS,aAAa,6BAA6B;AAAA,IACnG;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,EAAE,cAAc,IAAI,MAAM,QAAQ;AAAA,IACtC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,kBAA4B,CAAC;AAEjC,MAAI,iBAAiB,QAAQ,SAAS,GAAG;AACvC,UAAM,EAAE,SAAS,IAAI,MAAM,QAAQ;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,QAAQ,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,UAAU,KAAK,EAAE;AAAA,MAC5E,KAAK;AAAA,IACP,CAAC;AAED,sBAAkB,YAAY,CAAC;AAG/B,YAAQ,QAAQ,SAAO;AACrB,UAAI,WAAW,gBAAgB,SAAS,IAAI,GAAG;AAAA,IACjD,CAAC;AAAA,EACH;AAGA,UAAQ,IAAI,sCAAsC;AAElD,QAAM,mBAAmB,MAAM,QAAQ;AAAA,IACrC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,UAAU;AAAA,IACrB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,yBAAyB,OAAO,SAAS;AAAA,QAClD,EAAE,OAAO,uBAAuB,OAAO,WAAW;AAAA,QAClD,EAAE,OAAO,uBAAuB,OAAO,OAAO;AAAA,MAChD;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,SAA0B;AAAA,IAC9B;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB,qBAAqB,UAAU;AAAA,IAC/B,eAAe;AAAA;AAAA,IACf;AAAA,IACA;AAAA,IACA,YAAY;AAAA,MACV,iBAAiB,iBAAiB;AAAA,MAClC,gBAAgB,iBAAiB;AAAA,MACjC,gBAAgB,iBAAiB;AAAA,MACjC,WAAW,iBAAiB;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;;;AG9UA,OAAO,WAAW;AAMX,IAAM,SAAS;AAAA,EACpB,QAAQ,SAAuB;AAC7B,YAAQ,IAAI,MAAM,MAAM,QAAG,GAAG,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,SAAuB;AAC3B,YAAQ,IAAI,MAAM,IAAI,QAAG,GAAG,OAAO;AAAA,EACrC;AAAA,EAEA,KAAK,SAAuB;AAC1B,YAAQ,IAAI,MAAM,KAAK,QAAG,GAAG,OAAO;AAAA,EACtC;AAAA,EAEA,QAAQ,SAAuB;AAC7B,YAAQ,IAAI,MAAM,OAAO,QAAG,GAAG,OAAO;AAAA,EACxC;AAAA,EAEA,IAAI,SAAuB;AACzB,YAAQ,IAAI,OAAO;AAAA,EACrB;AAAA,EAEA,MAAM,SAAuB;AAC3B,YAAQ,IAAI,MAAM,KAAK,KAAK;AAAA,EAAK,OAAO;AAAA,CAAI,CAAC;AAAA,EAC/C;AAAA,EAEA,KAAK,MAAc,OAAe,SAAuB;AACvD,YAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,GAAG,OAAO;AAAA,EACvD;AAAA,EAEA,IAAI,SAAuB;AACzB,YAAQ,IAAI,MAAM,IAAI,OAAO,CAAC;AAAA,EAChC;AACF;;;ACtCA,OAAOA,WAAU;;;ACAjB,OAAO,QAAQ;AACf,OAAO,UAAU;AAUjB,eAAsB,UAAU,SAAgC;AAC9D,QAAM,GAAG,UAAU,OAAO;AAC5B;AAKA,eAAsB,UAAU,UAAkB,SAAgC;AAChF,QAAM,MAAM,KAAK,QAAQ,QAAQ;AACjC,QAAM,UAAU,GAAG;AACnB,QAAM,GAAG,UAAU,UAAU,SAAS,OAAO;AAC/C;AA2CA,eAAsB,kBAAkB,MAA+B;AACrE,aAAW,OAAO,MAAM;AACtB,UAAM,UAAU,GAAG;AAAA,EACrB;AACF;AAKA,eAAsB,WAAW,OAAgE;AAC/F,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,MAAM,KAAK,OAAO;AACvC,WAAO,IAAI,cAAc,KAAK,IAAI,EAAE;AAAA,EACtC;AACF;;;AC1EO,SAAS,eAAe,QAAiC;AAC9D,QAAM,EAAE,YAAY,YAAY,QAAQ,IAAI;AAE5C,QAAM,eAAe,QAAQ,IAAI,OAAK;AACpC,UAAM,UAAkC;AAAA,MACtC,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA;AAAA,IACV;AACA,WAAO,KAAK,EAAE,GAAG,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,EACvC,CAAC,EAAE,KAAK,IAAI;AAEZ,QAAM,kBAAkB,QACrB,OAAO,OAAK,CAAC,CAAC,MAAM,aAAa,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,EAC7D,IAAI,OAAK;AACR,UAAM,UAAkC;AAAA,MACtC,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AACA,WAAO,KAAK,EAAE,GAAG,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,EACvC,CAAC,EAAE,KAAK,IAAI;AAEd,SAAO;AAAA,oBACW,UAAU;AAAA;AAAA;AAAA,mBAGX,UAAU;AAAA;AAAA,EAE3B,YAAY;AAAA;AAAA;AAAA;AAAA,yBAIW,UAAU;AAAA,EACjC,mBAAmB,2BAA2B;AAAA;AAAA;AAAA,yBAGvB,UAAU,6BAA6B,UAAU;AAAA;AAAA;AAAA;AAI1E;;;AC3CO,SAAS,4BAA4B,QAAiC;AAC3E,QAAM,EAAE,YAAY,WAAW,IAAI;AAEnC,SAAO,YAAY,UAAU,WAAW,UAAU,cAAc,UAAU,2BAA2B,UAAU;AAAA;AAAA;AAAA,2BAGtF,UAAU;AAAA;AAAA;AAAA,oBAGjB,UAAU;AAAA,mCACK,UAAU;AAAA,kCACX,UAAU;AAAA,uBACrB,UAAU,iBAAiB,UAAU;AAAA,uBACrC,UAAU,iBAAiB,UAAU;AAAA;AAAA;AAAA;AAI5D;;;ACjBO,SAAS,uBAAuB,QAAiC;AACtE,QAAM,EAAE,YAAY,YAAY,QAAQ,IAAI;AAG5C,QAAM,aAAa,QAAQ,IAAI,OAAK;AAClC,QAAI,EAAE,QAAQ,aAAa;AACzB,aAAO;AAAA,IACT;AACA,QAAI,EAAE,QAAQ,UAAU;AACtB,aAAO;AAAA,IACT;AACA,QAAI,EAAE,QAAQ,QAAQ;AACpB,aAAO,iBAAiB,UAAU;AAAA,IACpC;AACA,QAAI,EAAE,SAAS,UAAU;AACvB,aAAO,SAAS,EAAE,GAAG;AAAA,IACvB;AACA,QAAI,EAAE,SAAS,WAAW;AACxB,aAAO,SAAS,EAAE,GAAG;AAAA,IACvB;AACA,QAAI,EAAE,SAAS,QAAQ;AACrB,aAAO,SAAS,EAAE,GAAG;AAAA,IACvB;AACA,WAAO,SAAS,EAAE,GAAG,OAAO,EAAE,KAAK;AAAA,EACrC,CAAC,EAAE,KAAK,IAAI;AAEZ,SAAO,YAAY,UAAU,WAAW,UAAU,cAAc,UAAU,qCAAqC,UAAU;AAAA,YAC/G,UAAU,gDAAgD,UAAU;AAAA;AAAA;AAAA,gCAGhD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAM3B,UAAU,0BAA0B,UAAU;AAAA;AAAA,mBAE1C,UAAU;AAAA;AAAA,EAE3B,UAAU;AAAA;AAAA,sBAEU,UAAU;AAAA;AAAA,yCAES,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAUX,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAMrB,UAAU,iBAAiB,UAAU;AAAA;AAAA;AAAA,qBAG7C,UAAU;AAAA;AAAA;AAAA;AAAA,QAIvB,QAAQ,KAAK,OAAK,EAAE,QAAQ,WAAW,IAAI,yCAAyC,EAAE;AAAA,sBACxE,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAMH,UAAU,iBAAiB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,0BAKxC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAOzB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAUK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOpC;;;ACvGO,SAAS,gBAAgB,QAAiC;AAC/D,QAAM,EAAE,YAAY,WAAW,IAAI;AAEnC,SAAO,YAAY,UAAU,kCAAkC,UAAU;AAAA,YAC/D,UAAU,gDAAgD,UAAU;AAAA;AAAA;AAAA,mBAG7D,UAAU;AAAA;AAAA;AAAA,kBAGX,UAAU;AAAA,8CACkB,UAAU;AAAA;AAAA,yCAEf,UAAU;AAAA;AAAA;AAAA;AAAA;AAKnD;;;ACjBO,SAAS,kBAAkB,QAAiC;AACjE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,aAAa,iBAAiB;AACpC,QAAM,gBAAgB,WAAW,kBAAkB,WAAW;AAG9D,QAAM,UAAU;AAAA;AAAA,EAEhB,gBAAgB,4CAA4C,EAAE;AAAA;AAAA,WAErD,UAAU,kCAAkC,UAAU;AAAA,cACnD,UAAU,oDAAoD,UAAU;AAAA,WAC3E,UAAU,wDAAwD,UAAU;AAAA,EACrF,aAAa,sDAAsD,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBrE,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM,IAAI;AAAA;AAAA;AAAA,sCAGH,EAAE;AAAA;AAAA,EAEtC,eAAe,qFAAqF,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUpG,gBAAgB,SAAS,IAAI,qCAAqC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBtE,sBAAsB,yDAAyD,EAAE;AAGjF,QAAM,oBAAoB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOnB,WAAW,cAAc,SAAS,QAAQ,WAAW,cAAc,WAAW,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAUxF,WAAW,cAAc,SAAS,QAAQ,WAAW,cAAc,WAAW,SAAS,KAAK;AAAA;AAAA;AAAA,IAGtH;AAGF,QAAM,mBAAmB,aAAa;AAAA;AAAA;AAAA,kBAGtB,UAAU;AAAA;AAAA,yBAEH,UAAU;AAAA,+BACJ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAUhC;AAAA,qCAC4B,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMtB,UAAU;AAAA,+BACJ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBvC,QAAM,mBAAmB,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAgBzC;AAGN,QAAM,aAAa,eAAe;AAAA;AAAA,QAE5B,WAAW,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,WAKzB,4DAA4D;AAAA,UAC7D,WAAW,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA,iEAGhB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOjE,WAAW,iBAAiB,kBAAkB,EAAE;AAAA;AAAA,UAEhD,WAAW,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUvE,WAAW,iBAAiB,kBAAkB,EAAE;AAAA;AAAA,UAEhD,WAAW,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUvE,WAAW,iBAAiB,kBAAkB,EAAE;AAAA;AAAA,UAEhD,WAAW,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUvE,WAAW,iBAAiB,kBAAkB,EAAE;AAAA,QAClD,WAAW,iBAAiB,kBAAkB,QAAQ;AAAA,IAC1D;AAGF,QAAM,mBAAmB,QAAQ,IAAI,OAAK;AACxC,QAAI,EAAE,SAAS,UAAU;AACvB,aAAO;AAAA;AAAA,yCAE4B,EAAE,GAAG;AAAA,uDACS,EAAE,GAAG;AAAA;AAAA;AAAA,4CAGhB,EAAE,KAAK;AAAA;AAAA;AAAA,8CAGL,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAKjD,WAAW,EAAE,SAAS,QAAQ;AAC5B,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAO4B,EAAE,GAAG;AAAA;AAAA;AAAA;AAAA,uCAIP,EAAE,GAAG;AAAA,wDACY,EAAE,GAAG;AAAA;AAAA,4BAEjC,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAOa,EAAE,GAAG,mCAAmC,EAAE,GAAG;AAAA,qDACxC,EAAE,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,IAKtD;AACA,WAAO;AAAA,EACT,CAAC,EAAE,KAAK,IAAI;AAGZ,QAAM,eAAe,QAAQ,IAAI,OAAK;AACpC,UAAM,aAAa,gBAAgB,SAAS,EAAE,GAAG;AACjD,QAAI,YAAY;AACd,aAAO,oFAAoF,EAAE,GAAG;AAAA;AAAA,sBAEhF,EAAE,MAAM,YAAY,CAAC;AAAA,uDACY,EAAE,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,IAKxD;AACA,WAAO,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAAA,EAC5D,CAAC,EAAE,KAAK,IAAI;AAGZ,QAAM,aAAa,QAAQ,IAAI,OAAK;AAClC,QAAI,EAAE,QAAQ,UAAU;AACtB,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT;AACA,QAAI,EAAE,SAAS,QAAQ;AACrB,aAAO,2FAA2F,EAAE,GAAG;AAAA,IACzG;AACA,WAAO,gDAAgD,EAAE,GAAG;AAAA,EAC9D,CAAC,EAAE,KAAK,IAAI;AAEZ,QAAM,UAAU,QAAQ,SAAS,KAAK,sBAAsB,IAAI;AAEhE,SAAO,GAAG,OAAO;AAAA;AAAA;AAAA,KAGd,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKC,gBAAgB,SAAS,IAAI,gBAAgB,KAAK,IAAI,IAAI,MAAM;AAAA;AAAA;AAAA,KAG3E,eAAe,kBAAkB,EAAE;AAAA,KACnC,sBAAsB,oBAAoB,EAAE;AAAA,KAC5C,WAAW,kBAAkB,WAAW,iBAAiB,+BAA+B,WAAW,SAAS,MAAM,EAAE;AAAA;AAAA,EAEvH,iBAAiB;AAAA,kBACD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,gBAAgB;AAAA,EAChB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYd,gBAAgB,SAAS,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAazB,EAAE;AAAA;AAAA;AAAA;AAAA,EAIR,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcV,gBAAgB;AAAA;AAAA,+EAE6D,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+DAOzB,aAAa,cAAc,aAAa;AAAA;AAAA;AAAA;AAAA,oDAInD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAW5C,sBAAsB,0JAA0J,EAAE;AAAA;AAAA,EAElM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAO0B,OAAO;AAAA;AAAA;AAAA;AAAA,wCAIP,OAAO;AAAA;AAAA;AAAA,kBAG7B,WAAW,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBASvB;AAAA,6DACsC;AAAA,sBACvC,sBAAsB,uHAAuH,EAAE;AAAA;AAAA,EAEnK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBA0BQ,WAAW,iBAAiB,iBAAiB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkD9E;;;ACzfO,SAAS,aAAa,QAAiC;AAC5D,QAAM,EAAE,UAAU,YAAY,WAAW,IAAI;AAE7C,SAAO;AAAA,WACE,UAAU,0BAA0B,UAAU,4BAA4B,UAAU;AAAA;AAAA;AAAA,KAG1F,QAAQ;AAAA;AAAA;AAAA,0BAGa,UAAU;AAAA;AAAA;AAAA;AAAA,4DAIwB,QAAQ;AAAA;AAAA,wBAE5C,SAAS,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,WAKnC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAMrB;;;AC3BO,SAAS,iBAAiB,QAAiC;AAChE,QAAM,EAAE,WAAW,IAAI;AAGvB,QAAM,qBAAqB,MAAM;AAC/B,YAAQ,WAAW,WAAW;AAAA,MAC5B,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,MACF;AACE,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,aAAa,mBAAmB;AAEtC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAWO,WAAW,OAAO;AAAA,gBAClB,WAAW,OAAO;AAAA;AAAA,mBAEf,WAAW,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOxC;;;ARtCO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA,EAE9C,MAAM,WAAqC;AACzC,UAAM,QAAyB,CAAC;AAChC,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,EAAE,YAAY,UAAU,IAAI,KAAK;AAGvC,UAAM,YAAYC,MAAK,KAAK,KAAK,WAAW,UAAU;AACtD,UAAM,SAASA,MAAK,KAAK,KAAK,OAAO,eAAe,SAAS;AAG7D,UAAM,OAAO;AAAA,MACXA,MAAK,KAAK,WAAW,UAAU,UAAU;AAAA,MACzCA,MAAK,KAAK,WAAW,UAAU,cAAc;AAAA,MAC7CA,MAAK,KAAK,WAAW,eAAe,WAAW;AAAA,MAC/CA,MAAK,KAAK,WAAW,kBAAkB,cAAc;AAAA,MACrDA,MAAK,KAAK,WAAW,gBAAgB,YAAY;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,kBAAkB,IAAI;AAI5B,UAAM,KAAK;AAAA,MACT,MAAMA,MAAK,KAAK,WAAW,UAAU,YAAY,GAAG,UAAU,YAAY;AAAA,MAC1E,SAAS,eAAe,KAAK,MAAM;AAAA,IACrC,CAAC;AAGD,UAAM,KAAK;AAAA,MACT,MAAMA,MAAK,KAAK,WAAW,UAAU,gBAAgB,GAAG,UAAU,0BAA0B;AAAA,MAC5F,SAAS,4BAA4B,KAAK,MAAM;AAAA,IAClD,CAAC;AAGD,UAAM,KAAK;AAAA,MACT,MAAMA,MAAK,KAAK,WAAW,kBAAkB,gBAAgB,GAAG,UAAU,gBAAgB;AAAA,MAC1F,SAAS,uBAAuB,KAAK,MAAM;AAAA,IAC7C,CAAC;AAGD,UAAM,KAAK;AAAA,MACT,MAAMA,MAAK,KAAK,WAAW,eAAe,aAAa,OAAO,UAAU,eAAe;AAAA,MACvF,SAAS,gBAAgB,KAAK,MAAM;AAAA,IACtC,CAAC;AAGD,UAAM,KAAK;AAAA,MACT,MAAMA,MAAK,KAAK,WAAW,gBAAgB,cAAc,GAAG,UAAU,WAAW;AAAA,MACjF,SAAS,kBAAkB,KAAK,MAAM;AAAA,IACxC,CAAC;AAGD,UAAM,KAAK;AAAA,MACT,MAAMA,MAAK,KAAK,QAAQ,UAAU;AAAA,MAClC,SAAS,aAAa,KAAK,MAAM;AAAA,IACnC,CAAC;AAGD,QAAI,KAAK,OAAO,WAAW,iBAAiB;AAC1C,YAAM,KAAK;AAAA,QACT,MAAMA,MAAK,KAAK,QAAQ,cAAc;AAAA,QACtC,SAAS,iBAAiB,KAAK,MAAM;AAAA,MACvC,CAAC;AAAA,IACH;AAGA,UAAM,WAAW,KAAK;AAGtB,UAAM,eAAe,KAAK,qBAAqB;AAE/C,WAAO,EAAE,OAAO,aAAa;AAAA,EAC/B;AAAA,EAEQ,uBAAiC;AACvC,UAAM,eAAyB,CAAC;AAEhC,iBAAa,KAAK,gDAAgD,KAAK,OAAO,SAAS,EAAE;AAGzF,UAAM,OAAiB,CAAC;AACxB,QAAI,KAAK,OAAO,iBAAiB,YAAY;AAC3C,WAAK,KAAK,uBAAuB;AAAA,IACnC;AACA,QAAI,KAAK,OAAO,WAAW,mBAAmB,KAAK,OAAO,WAAW,gBAAgB;AACnF,WAAK,KAAK,eAAe;AAAA,IAC3B;AAEA,QAAI,KAAK,SAAS,GAAG;AACnB,mBAAa,KAAK,qCAAqC,KAAK,KAAK,GAAG,CAAC,EAAE;AAAA,IACzE;AAEA,iBAAa,KAAK,gDAAgD;AAClE,iBAAa,KAAK,oDAAoD;AAEtE,QAAI,KAAK,OAAO,iBAAiB,YAAY;AAC3C,mBAAa,KAAK,qDAAqD;AAAA,IACzE;AAEA,WAAO;AAAA,EACT;AACF;;;AS1HA,OAAOC,WAAU;;;ACMV,SAAS,4BAA4B,QAAiC;AAC3E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,aAAa,iBAAiB;AACpC,QAAM,gBAAgB,WAAW,kBAAkB,WAAW;AAG9D,QAAM,oBAAoB,aAAa,UAAU;AAAA;AAAA,EAEjD,QAAQ,IAAI,OAAK;AACf,UAAM,UAAkC;AAAA,MACtC,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AACA,WAAO,KAAK,EAAE,GAAG,KAAK,QAAQ,EAAE,IAAI,CAAC;AAAA,EACvC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAKb,QAAM,iBAAiB,QAAQ,IAAI,OAAK;AACtC,QAAI,EAAE,QAAQ,aAAa;AACzB,aAAO;AAAA,IACT;AACA,QAAI,EAAE,QAAQ,UAAU;AACtB,aAAO;AAAA,IACT;AACA,QAAI,EAAE,QAAQ,QAAQ;AACpB,aAAO,eAAe,UAAU;AAAA,IAClC;AACA,QAAI,EAAE,SAAS,UAAU;AACvB,aAAO,OAAO,EAAE,GAAG;AAAA,IACrB;AACA,QAAI,EAAE,SAAS,WAAW;AACxB,aAAO,OAAO,EAAE,GAAG;AAAA,IACrB;AACA,QAAI,EAAE,SAAS,QAAQ;AACrB,aAAO,OAAO,EAAE,GAAG;AAAA,IACrB;AACA,WAAO,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK;AAAA,EACnC,CAAC,EAAE,KAAK,IAAI;AAEZ,QAAM,WAAW;AAAA,mBACA,UAAU;AAAA;AAAA,EAE3B,cAAc;AAAA;AAAA,oBAEI,UAAU;AAG5B,QAAM,gBAAgB,aAAa,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CASI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAetD,QAAM,oBAAoB,aAAa;AAAA;AAAA;AAAA,kBAGvB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAMkB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,SAK/C;AAAA,qCAC4B,UAAU;AAAA;AAAA,EAE7C,aAAa;AAGb,QAAM,UAAU;AAAA;AAAA,EAEhB,gBAAgB,4CAA4C,EAAE;AAAA;AAAA,EAE9D,aAAa,sDAAsD,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBrE,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM,IAAI;AAAA;AAAA;AAAA,sCAGH,EAAE;AAAA;AAAA,EAEtC,eAAe,qFAAqF,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUpG,gBAAgB,SAAS,IAAI,qCAAqC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBtE,sBAAsB,yDAAyD,EAAE;AAGjF,QAAM,oBAAoB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAOnB,WAAW,cAAc,SAAS,QAAQ,WAAW,cAAc,WAAW,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAUxF,WAAW,cAAc,SAAS,QAAQ,WAAW,cAAc,WAAW,SAAS,KAAK;AAAA;AAAA;AAAA,IAGtH;AAGF,QAAM,mBAAmB,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAgBzC;AAGN,QAAM,aAAa,eAAe;AAAA;AAAA,QAE5B,WAAW,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,WAKzB,4DAA4D;AAAA,UAC7D,WAAW,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA,iEAGhB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOjE,WAAW,iBAAiB,kBAAkB,EAAE;AAAA;AAAA,UAEhD,WAAW,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUvE,WAAW,iBAAiB,kBAAkB,EAAE;AAAA;AAAA,UAEhD,WAAW,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUvE,WAAW,iBAAiB,kBAAkB,EAAE;AAAA;AAAA,UAEhD,WAAW,iBAAiB,yCAAyC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUvE,WAAW,iBAAiB,kBAAkB,EAAE;AAAA,QAClD,WAAW,iBAAiB,kBAAkB,QAAQ;AAAA,IAC1D;AAGF,QAAM,mBAAmB,QAAQ,IAAI,OAAK;AACxC,QAAI,EAAE,SAAS,UAAU;AACvB,aAAO;AAAA;AAAA,yCAE4B,EAAE,GAAG;AAAA,uDACS,EAAE,GAAG;AAAA;AAAA;AAAA,4CAGhB,EAAE,KAAK;AAAA;AAAA;AAAA,8CAGL,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,IAKjD,WAAW,EAAE,SAAS,QAAQ;AAC5B,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAO4B,EAAE,GAAG;AAAA;AAAA;AAAA;AAAA,uCAIP,EAAE,GAAG;AAAA,wDACY,EAAE,GAAG;AAAA;AAAA,4BAEjC,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDAOa,EAAE,GAAG,mCAAmC,EAAE,GAAG;AAAA,qDACxC,EAAE,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,IAKtD;AACA,WAAO;AAAA,EACT,CAAC,EAAE,KAAK,IAAI;AAGZ,QAAM,eAAe,QAAQ,IAAI,OAAK;AACpC,UAAM,aAAa,gBAAgB,SAAS,EAAE,GAAG;AACjD,QAAI,YAAY;AACd,aAAO,oFAAoF,EAAE,GAAG;AAAA;AAAA,sBAEhF,EAAE,MAAM,YAAY,CAAC;AAAA,uDACY,EAAE,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,IAKxD;AACA,WAAO,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAAA,EAC5D,CAAC,EAAE,KAAK,IAAI;AAGZ,QAAM,aAAa,QAAQ,IAAI,OAAK;AAClC,QAAI,EAAE,QAAQ,UAAU;AACtB,aAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT;AACA,QAAI,EAAE,SAAS,QAAQ;AACrB,aAAO,2FAA2F,EAAE,GAAG;AAAA,IACzG;AACA,WAAO,gDAAgD,EAAE,GAAG;AAAA,EAC9D,CAAC,EAAE,KAAK,IAAI;AAEZ,QAAM,UAAU,QAAQ,SAAS,KAAK,sBAAsB,IAAI;AAEhE,SAAO,GAAG,OAAO;AAAA;AAAA;AAAA,KAGd,UAAU;AAAA;AAAA;AAAA;AAAA,EAIb,iBAAiB;AAAA;AAAA,EAEjB,QAAQ;AAAA,EACR,iBAAiB;AAAA,kBACD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,iBAAiB;AAAA,EACjB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYd,gBAAgB,SAAS,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAazB,EAAE;AAAA;AAAA;AAAA;AAAA,EAIR,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcV,gBAAgB;AAAA;AAAA,+EAE6D,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+DAOzB,aAAa,cAAc,aAAa;AAAA;AAAA;AAAA;AAAA,oDAInD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAW5C,sBAAsB,0JAA0J,EAAE;AAAA;AAAA,EAElM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAO0B,OAAO;AAAA;AAAA;AAAA;AAAA,wCAIP,OAAO;AAAA;AAAA;AAAA,kBAG7B,WAAW,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBASvB;AAAA,6DACsC;AAAA,sBACvC,sBAAsB,uHAAuH,EAAE;AAAA;AAAA,EAEnK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBA0BQ,WAAW,iBAAiB,iBAAiB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkD9E;;;AC5hBO,SAAS,uBAAuB,QAAiC;AACtE,QAAM,EAAE,UAAU,YAAY,WAAW,IAAI;AAE7C,SAAO;AAAA,WACE,UAAU,6BAA6B,UAAU,IAAI,UAAU;AAAA;AAAA;AAAA,KAGrE,QAAQ;AAAA;AAAA;AAAA,0BAGa,UAAU;AAAA;AAAA;AAAA;AAAA,4DAIwB,QAAQ;AAAA;AAAA,wBAE5C,SAAS,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,WAKnC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAMrB;;;AFnBO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAAoB,QAAyB;AAAzB;AAAA,EAA0B;AAAA,EAE9C,MAAM,WAAqC;AACzC,UAAM,QAAyB,CAAC;AAChC,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,EAAE,YAAY,UAAU,IAAI,KAAK;AAGvC,UAAM,eAAeC,MAAK,KAAK,KAAK,cAAc,UAAU;AAC5D,UAAM,SAASA,MAAK,KAAK,KAAK,OAAO,eAAe,SAAS;AAG7D,UAAM,kBAAkB,CAAC,cAAc,MAAM,CAAC;AAI9C,UAAM,KAAK;AAAA,MACT,MAAMA,MAAK,KAAK,cAAc,GAAG,UAAU,WAAW;AAAA,MACtD,SAAS,4BAA4B,KAAK,MAAM;AAAA,IAClD,CAAC;AAGD,UAAM,KAAK;AAAA,MACT,MAAMA,MAAK,KAAK,QAAQ,UAAU;AAAA,MAClC,SAAS,uBAAuB,KAAK,MAAM;AAAA,IAC7C,CAAC;AAGD,QAAI,KAAK,OAAO,WAAW,iBAAiB;AAC1C,YAAM,KAAK;AAAA,QACT,MAAMA,MAAK,KAAK,QAAQ,cAAc;AAAA,QACtC,SAAS,iBAAiB,KAAK,MAAM;AAAA,MACvC,CAAC;AAAA,IACH;AAGA,UAAM,WAAW,KAAK;AAGtB,UAAM,eAAe,KAAK,qBAAqB;AAE/C,WAAO,EAAE,OAAO,aAAa;AAAA,EAC/B;AAAA,EAEQ,uBAAiC;AACvC,UAAM,eAAyB,CAAC;AAEhC,iBAAa,KAAK,gDAAgD,KAAK,OAAO,SAAS,EAAE;AAGzF,UAAM,OAAiB,CAAC;AACxB,QAAI,KAAK,OAAO,iBAAiB,YAAY;AAC3C,WAAK,KAAK,uBAAuB;AAAA,IACnC;AACA,QAAI,KAAK,OAAO,WAAW,mBAAmB,KAAK,OAAO,WAAW,gBAAgB;AACnF,WAAK,KAAK,eAAe;AAAA,IAC3B;AAEA,QAAI,KAAK,SAAS,GAAG;AACnB,mBAAa,KAAK,qCAAqC,KAAK,KAAK,GAAG,CAAC,EAAE;AAAA,IACzE;AAEA,iBAAa,KAAK,gDAAgD;AAClE,iBAAa,KAAK,sCAAsC;AAExD,QAAI,KAAK,OAAO,iBAAiB,YAAY;AAC3C,mBAAa,KAAK,qDAAqD;AAAA,IACzE;AAEA,WAAO;AAAA,EACT;AACF;;;AG7EO,IAAM,gBAAN,MAAoB;AAAA,EAGzB,YAAoB,QAAyB;AAAzB;AAElB,SAAK,YAAY,OAAO,iBAAiB,QACrC,IAAI,aAAa,MAAM,IACvB,IAAI,oBAAoB,MAAM;AAAA,EACpC;AAAA,EAPQ;AAAA;AAAA;AAAA;AAAA,EAYR,MAAM,WAAqC;AACzC,WAAO,MAAM,KAAK,UAAU,SAAS;AAAA,EACvC;AACF;;;AjBhBA,eAAsB,MAAqB;AACzC,MAAI;AAEF,YAAQ,MAAM;AACd,WAAO,MAAM,2BAAoB;AACjC,WAAO,IAAI,0FAA0F;AAGrG,UAAM,SAAS,MAAM,qBAAqB;AAE1C,QAAI,CAAC,QAAQ;AACX,aAAO,QAAQ,qBAAqB;AACpC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,YAAQ,IAAI,IAAI;AAChB,WAAO,MAAM,iCAA0B;AACvC,WAAO,KAAK,cAAc,OAAO,QAAQ,EAAE;AAC3C,WAAO,KAAK,WAAW,OAAO,SAAS,EAAE;AACzC,WAAO,KAAK,iBAAiB,OAAO,aAAa,YAAY,CAAC,EAAE;AAChE,WAAO,KAAK,kBAAkB,OAAO,YAAY,EAAE;AACnD,WAAO,KAAK,eAAe,OAAO,WAAW,SAAS,YAAY;AAClE,YAAQ,IAAI,EAAE;AAGd,UAAM,UAAU,IAAI,qBAAqB,EAAE,MAAM;AAEjD,QAAI;AACF,YAAM,YAAY,IAAI,cAAc,MAAM;AAC1C,YAAM,SAAS,MAAM,UAAU,SAAS;AAExC,cAAQ,QAAQ,+BAA+B;AAG/C,cAAQ,IAAI,EAAE;AACd,aAAO,MAAM,2BAAoB;AACjC,aAAO,MAAM,QAAQ,UAAQ;AAC3B,eAAO,IAAI,KAAK,KAAK,IAAI,EAAE;AAAA,MAC7B,CAAC;AAGD,cAAQ,IAAI,EAAE;AACd,aAAO,MAAM,oBAAa;AAC1B,aAAO,QAAQ,+BAA+B;AAE9C,cAAQ,IAAI,EAAE;AACd,aAAO,MAAM,sBAAe;AAC5B,aAAO,aAAa,QAAQ,CAAC,aAAa,UAAU;AAClD,eAAO,KAAK,QAAQ,GAAG,OAAO,aAAa,QAAQ,WAAW;AAAA,MAChE,CAAC;AAED,cAAQ,IAAI,EAAE;AACd,aAAO,IAAI,2BAAoB;AAAA,IAEjC,SAAS,OAAO;AACd,cAAQ,KAAK,mBAAmB;AAChC,YAAM;AAAA,IACR;AAAA,EAEF,SAAS,OAAO;AACd,WAAO,MAAM,oBAAoB;AACjC,YAAQ,MAAM,KAAK;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,IAAI;","names":["path","path","path","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shadcn-nextjs-page-generator",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "CLI tool to generate Next.js pages with shadcn/ui, Tailwind v4, and Framer Motion",
5
5
  "author": "Jatmiko",
6
6
  "license": "MIT",