create-enterprise-next 0.1.0 → 0.2.0
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/dist/index.js +1774 -13
- package/dist/index.js.map +1 -1
- package/package.json +5 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/cli/flags.ts","../src/config/schema.ts","../src/config/resolve.ts","../src/config/defaults.ts","../src/prompts/interactive.ts","../src/utils/validate-project-name.ts","../src/utils/logger.ts"],"sourcesContent":["import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { setupCliFlags, type CliOptions } from './cli/flags.js';\nimport { resolveConfig } from './config/resolve.js';\nimport { runInteractivePrompts } from './prompts/interactive.js';\nimport { logger } from './utils/logger.js';\nimport { validateProjectName, validateTargetDirectory } from './utils/validate-project-name.js';\n\nfunction getPackageVersion(): string {\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const pkgPath = path.resolve(__dirname, '../package.json');\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.version) return pkg.version as string;\n }\n } catch {\n // fallback if package.json cannot be read\n }\n return '0.1.0';\n}\n\nasync function main() {\n const program = new Command();\n\n program\n .name('cen')\n .description('Scaffold enterprise-grade Next.js applications')\n .version(getPackageVersion());\n\n setupCliFlags(program);\n\n program.action(async (positionalProjectName: string | undefined, flags: CliOptions) => {\n try {\n if (positionalProjectName) {\n const nameErr = validateProjectName(positionalProjectName);\n if (nameErr) {\n logger.error(nameErr);\n process.exit(1);\n }\n const dirErr = validateTargetDirectory(positionalProjectName);\n if (dirErr) {\n logger.error(dirErr);\n process.exit(1);\n }\n }\n\n const config = await resolveConfig(\n {\n projectName: positionalProjectName,\n cliOptions: flags,\n },\n runInteractivePrompts,\n );\n\n if (flags.dryRun) {\n console.log(JSON.stringify(config, null, 2));\n process.exit(0);\n }\n\n console.log(JSON.stringify(config, null, 2));\n logger.success('Config resolved — scaffolding logic not yet implemented');\n } catch (err) {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","import { Command, InvalidArgumentError, Option } from 'commander';\nimport {\n AuthEnum,\n CiEnum,\n DatabaseEnum,\n OrmEnum,\n PackageManagerEnum,\n StateManagementEnum,\n StylingEnum,\n TestingEnum,\n type TestingOption,\n} from '../config/schema.js';\n\nexport interface CliOptions {\n typescript?: boolean;\n styling?: string;\n auth?: string;\n orm?: string;\n database?: string;\n db?: string;\n testing?: TestingOption[];\n ci?: string;\n docker?: boolean;\n monorepo?: boolean;\n stateManagement?: string;\n packageManager?: string;\n yes?: boolean;\n dryRun?: boolean;\n config?: string;\n}\n\nfunction parseBoolean(val: string | boolean): boolean {\n if (typeof val === 'boolean') return val;\n if (val === 'true' || val === '1') return true;\n if (val === 'false' || val === '0') return false;\n throw new InvalidArgumentError(`Invalid boolean value '${val}'. Expected true or false.`);\n}\n\nfunction parseTesting(val: string): TestingOption[] {\n const allowed = TestingEnum.options;\n const items = val.split(',').map((item) => item.trim()).filter(Boolean);\n if (items.length === 0) {\n throw new InvalidArgumentError('Testing option cannot be empty.');\n }\n for (const item of items) {\n if (!allowed.includes(item as TestingOption)) {\n throw new InvalidArgumentError(\n `Invalid testing framework '${item}'. Allowed choices are: ${allowed.join(', ')}.`,\n );\n }\n }\n return items as TestingOption[];\n}\n\nexport function setupCliFlags(program: Command): Command {\n return program\n .argument('[project-name]', 'Target project directory / name')\n .addOption(\n new Option('--ts, --typescript [boolean]', 'Use TypeScript').argParser(parseBoolean),\n )\n .addOption(new Option('--no-ts', 'Do not use TypeScript'))\n .addOption(\n new Option('--styling <styling>', 'Styling framework').choices(StylingEnum.options),\n )\n .addOption(new Option('--auth <auth>', 'Authentication provider').choices(AuthEnum.options))\n .addOption(new Option('--orm <orm>', 'ORM selection').choices(OrmEnum.options))\n .addOption(\n new Option('--db, --database <database>', 'Database solution').choices(DatabaseEnum.options),\n )\n .addOption(\n new Option(\n '--testing <frameworks>',\n 'Comma-separated testing frameworks (e.g. vitest,playwright)',\n ).argParser(parseTesting),\n )\n .addOption(new Option('--ci <ci>', 'CI workflow setup').choices(CiEnum.options))\n .addOption(new Option('--docker [boolean]', 'Include Docker setup').argParser(parseBoolean))\n .addOption(new Option('--no-docker', 'Disable Docker setup'))\n .addOption(\n new Option('--monorepo [boolean]', 'Set up project as a monorepo').argParser(parseBoolean),\n )\n .addOption(new Option('--no-monorepo', 'Do not set up as monorepo'))\n .addOption(\n new Option('--state-management <state>', 'State management solution').choices(\n StateManagementEnum.options,\n ),\n )\n .addOption(\n new Option('--package-manager <packageManager>', 'Package manager').choices(\n PackageManagerEnum.options,\n ),\n )\n .addOption(new Option('-y, --yes', 'Skip interactive prompts and use default values'))\n .addOption(new Option('--dry-run', 'Output resolved configuration JSON without scaffolding'))\n .addOption(new Option('-c, --config <path>', 'Path to JSON configuration file'));\n}\n","import { z } from 'zod';\n\nexport const StylingEnum = z.enum(['tailwind', 'css-modules', 'styled-components']);\nexport const AuthEnum = z.enum(['none', 'clerk', 'next-auth', 'auth0']);\nexport const OrmEnum = z.enum(['none', 'prisma', 'drizzle']);\nexport const DatabaseEnum = z.enum(['postgres', 'mysql', 'sqlite', 'mongo']);\nexport const TestingEnum = z.enum(['vitest', 'jest', 'playwright', 'cypress']);\nexport const CiEnum = z.enum(['none', 'github-actions', 'gitlab-ci']);\nexport const StateManagementEnum = z.enum(['none', 'zustand', 'redux', 'jotai']);\nexport const PackageManagerEnum = z.enum(['npm', 'pnpm', 'yarn', 'bun']);\n\nexport const projectConfigSchema = z\n .object({\n projectName: z.string().min(1, 'Project name is required'),\n typescript: z.boolean(),\n styling: StylingEnum,\n auth: AuthEnum,\n orm: OrmEnum,\n database: DatabaseEnum.optional(),\n testing: z.array(TestingEnum),\n ci: CiEnum,\n docker: z.boolean(),\n monorepo: z.boolean(),\n stateManagement: StateManagementEnum,\n packageManager: PackageManagerEnum,\n })\n .superRefine((data, ctx) => {\n if (data.orm === 'none' && data.database !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Database must not be specified when ORM is \"none\".',\n path: ['database'],\n });\n }\n if (data.orm !== 'none' && !data.database) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Database must be specified when an ORM is selected.',\n path: ['database'],\n });\n }\n });\n\n// Single source of truth inferred TypeScript type\nexport type ProjectConfig = z.infer<typeof projectConfigSchema>;\n\nexport type StylingOption = z.infer<typeof StylingEnum>;\nexport type AuthOption = z.infer<typeof AuthEnum>;\nexport type OrmOption = z.infer<typeof OrmEnum>;\nexport type DatabaseOption = z.infer<typeof DatabaseEnum>;\nexport type TestingOption = z.infer<typeof TestingEnum>;\nexport type CiOption = z.infer<typeof CiEnum>;\nexport type StateManagementOption = z.infer<typeof StateManagementEnum>;\nexport type PackageManagerOption = z.infer<typeof PackageManagerEnum>;\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { CliOptions } from '../cli/flags.js';\nimport { defaultConfig } from './defaults.js';\nimport {\n projectConfigSchema,\n type ProjectConfig,\n} from './schema.js';\n\nexport interface ResolveConfigInput {\n projectName?: string;\n cliOptions: CliOptions;\n cwd?: string;\n interactive?: boolean;\n}\n\n/**\n * Merges configuration sources according to strict precedence rules:\n * 1. Authoritative positional project name\n * 2. Explicit CLI configuration flags\n * 3. Config file options\n * 4. Interactive prompt answers (if TTY & `--yes` is not set)\n * 5. Enterprise default values (fallback)\n */\nexport async function resolveConfig(\n input: ResolveConfigInput,\n prompter?: (partial: Partial<ProjectConfig>) => Promise<Partial<ProjectConfig>>,\n): Promise<ProjectConfig> {\n const cwd = input.cwd ?? process.cwd();\n const flags = input.cliOptions;\n let fileConfig: Partial<ProjectConfig> = {};\n\n // 1. If `--config` is provided, read and parse the JSON file\n if (flags.config) {\n const configPath = path.resolve(cwd, flags.config);\n if (!fs.existsSync(configPath)) {\n throw new Error(`Config file not found at path: ${flags.config}`);\n }\n\n try {\n const fileContent = fs.readFileSync(configPath, 'utf-8');\n fileConfig = JSON.parse(fileContent) as Partial<ProjectConfig>;\n } catch (err) {\n if (err instanceof SyntaxError) {\n throw new Error(`Failed to parse \"${flags.config}\". The file does not contain valid JSON.`);\n }\n throw new Error(`Failed to read config file at \"${flags.config}\": ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // 2. Extract CLI options explicitly supplied by the user\n const cliConfig: Partial<ProjectConfig> = {};\n\n if (flags.typescript !== undefined) cliConfig.typescript = flags.typescript;\n if (flags.styling !== undefined) cliConfig.styling = flags.styling as ProjectConfig['styling'];\n if (flags.auth !== undefined) cliConfig.auth = flags.auth as ProjectConfig['auth'];\n if (flags.orm !== undefined) cliConfig.orm = flags.orm as ProjectConfig['orm'];\n\n const dbFlag = flags.db ?? flags.database;\n if (dbFlag !== undefined) cliConfig.database = dbFlag as ProjectConfig['database'];\n\n if (flags.testing !== undefined) cliConfig.testing = flags.testing;\n if (flags.ci !== undefined) cliConfig.ci = flags.ci as ProjectConfig['ci'];\n if (flags.docker !== undefined) cliConfig.docker = flags.docker;\n if (flags.monorepo !== undefined) cliConfig.monorepo = flags.monorepo;\n if (flags.stateManagement !== undefined)\n cliConfig.stateManagement = flags.stateManagement as ProjectConfig['stateManagement'];\n if (flags.packageManager !== undefined)\n cliConfig.packageManager = flags.packageManager as ProjectConfig['packageManager'];\n\n // CLI flags override config file values\n let resolvedPartial: Partial<ProjectConfig> = {\n ...fileConfig,\n ...cliConfig,\n };\n\n // Authoritative positional project name overrides config file / flags if provided\n if (input.projectName) {\n resolvedPartial.projectName = input.projectName;\n }\n\n // 3. Interactivity step\n const shouldPrompt =\n input.interactive ?? (!flags.yes && Boolean(process.stdout.isTTY));\n\n if (shouldPrompt && prompter) {\n resolvedPartial = await prompter(resolvedPartial);\n }\n\n // 4. Fall back to defaults for remaining unresolved fields\n const finalProjectName = resolvedPartial.projectName || defaultConfig.projectName;\n const finalOrm = resolvedPartial.orm ?? defaultConfig.orm;\n\n let finalDatabase = resolvedPartial.database;\n if (finalOrm !== 'none' && !finalDatabase) {\n finalDatabase = 'postgres';\n }\n\n const finalMerged: ProjectConfig = {\n projectName: finalProjectName,\n typescript: resolvedPartial.typescript ?? defaultConfig.typescript,\n styling: resolvedPartial.styling ?? defaultConfig.styling,\n auth: resolvedPartial.auth ?? defaultConfig.auth,\n orm: finalOrm,\n database: finalDatabase,\n testing: resolvedPartial.testing ?? defaultConfig.testing,\n ci: resolvedPartial.ci ?? defaultConfig.ci,\n docker: resolvedPartial.docker ?? defaultConfig.docker,\n monorepo: resolvedPartial.monorepo ?? defaultConfig.monorepo,\n stateManagement: resolvedPartial.stateManagement ?? defaultConfig.stateManagement,\n packageManager: resolvedPartial.packageManager ?? defaultConfig.packageManager,\n };\n\n // 5. Final validation against Zod schema\n const validationResult = projectConfigSchema.safeParse(finalMerged);\n\n if (!validationResult.success) {\n const issueMessages = validationResult.error.issues\n .map((issue) => ` - [${issue.path.join('.')}]: ${issue.message}`)\n .join('\\n');\n throw new Error(`Invalid configuration:\\n${issueMessages}`);\n }\n\n return validationResult.data;\n}\n","import type { ProjectConfig } from './schema.js';\n\nexport const defaultConfig: ProjectConfig = {\n projectName: 'my-app',\n typescript: true,\n styling: 'tailwind',\n auth: 'none',\n orm: 'none',\n database: undefined,\n testing: ['vitest'],\n ci: 'github-actions',\n docker: true,\n monorepo: false,\n stateManagement: 'none',\n packageManager: 'pnpm',\n};\n","import * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport type {\n AuthOption,\n CiOption,\n DatabaseOption,\n OrmOption,\n PackageManagerOption,\n ProjectConfig,\n StateManagementOption,\n StylingOption,\n TestingOption,\n} from '../config/schema.js';\nimport { validateProjectName, validateTargetDirectory } from '../utils/validate-project-name.js';\n\nfunction handleCancel<T>(value: T | symbol): T {\n if (clack.isCancel(value)) {\n clack.cancel('Operation cancelled.');\n process.exit(1);\n }\n return value as T;\n}\n\nexport async function promptForProjectName(initial?: string): Promise<string> {\n if (initial) return initial;\n const name = await clack.text({\n message: 'What is your project name?',\n placeholder: 'my-app',\n defaultValue: 'my-app',\n validate(val) {\n const nameErr = validateProjectName(val);\n if (nameErr) return nameErr;\n const dirErr = validateTargetDirectory(val);\n if (dirErr) return dirErr;\n },\n });\n return handleCancel(name).trim();\n}\n\nexport async function promptForTypeScript(initial?: boolean): Promise<boolean> {\n if (initial !== undefined) return initial;\n const ts = await clack.confirm({\n message: 'Would you like to use TypeScript?',\n initialValue: true,\n });\n return handleCancel(ts);\n}\n\nexport async function promptForStyling(initial?: StylingOption): Promise<StylingOption> {\n if (initial) return initial;\n const styling = await clack.select<StylingOption>({\n message: 'Which styling solution would you like to use?',\n options: [\n { value: 'tailwind', label: 'Tailwind CSS', hint: 'Recommended' },\n { value: 'css-modules', label: 'CSS Modules' },\n { value: 'styled-components', label: 'Styled Components' },\n ],\n initialValue: 'tailwind',\n });\n return handleCancel(styling);\n}\n\nexport async function promptForAuth(initial?: AuthOption): Promise<AuthOption> {\n if (initial) return initial;\n const auth = await clack.select<AuthOption>({\n message: 'Which authentication provider would you like to use?',\n options: [\n { value: 'none', label: 'None' },\n { value: 'clerk', label: 'Clerk', hint: 'User management platform' },\n { value: 'next-auth', label: 'NextAuth.js / Auth.js', hint: 'Open source auth' },\n { value: 'auth0', label: 'Auth0', hint: 'Enterprise Identity Platform' },\n ],\n initialValue: 'none',\n });\n return handleCancel(auth);\n}\n\nexport async function promptForOrm(initial?: OrmOption): Promise<OrmOption> {\n if (initial) return initial;\n const orm = await clack.select<OrmOption>({\n message: 'Which ORM / Database abstraction would you like to use?',\n options: [\n { value: 'none', label: 'None' },\n { value: 'prisma', label: 'Prisma', hint: 'Next-gen ORM' },\n { value: 'drizzle', label: 'Drizzle ORM', hint: 'Lightweight & fast' },\n ],\n initialValue: 'none',\n });\n return handleCancel(orm);\n}\n\nexport async function promptForDatabase(\n orm: OrmOption,\n initial?: DatabaseOption,\n): Promise<DatabaseOption | undefined> {\n if (orm === 'none') return undefined;\n if (initial) return initial;\n const db = await clack.select<DatabaseOption>({\n message: 'Which database would you like to connect to?',\n options: [\n { value: 'postgres', label: 'PostgreSQL' },\n { value: 'mysql', label: 'MySQL' },\n { value: 'sqlite', label: 'SQLite' },\n { value: 'mongo', label: 'MongoDB' },\n ],\n initialValue: 'postgres',\n });\n return handleCancel(db);\n}\n\nexport async function promptForTesting(initial?: TestingOption[]): Promise<TestingOption[]> {\n if (initial && initial.length > 0) return initial;\n const testing = await clack.multiselect<TestingOption>({\n message: 'Select testing frameworks to include:',\n options: [\n { value: 'vitest', label: 'Vitest', hint: 'Fast unit/integration test runner' },\n { value: 'jest', label: 'Jest', hint: 'Delightful JS testing' },\n { value: 'playwright', label: 'Playwright', hint: 'End-to-end browser testing' },\n { value: 'cypress', label: 'Cypress', hint: 'E2E & component testing' },\n ],\n required: false,\n initialValues: ['vitest'],\n });\n return handleCancel(testing);\n}\n\nexport async function promptForCi(initial?: CiOption): Promise<CiOption> {\n if (initial) return initial;\n const ci = await clack.select<CiOption>({\n message: 'Which Continuous Integration (CI) setup would you like?',\n options: [\n { value: 'github-actions', label: 'GitHub Actions', hint: 'Recommended' },\n { value: 'gitlab-ci', label: 'GitLab CI' },\n { value: 'none', label: 'None' },\n ],\n initialValue: 'github-actions',\n });\n return handleCancel(ci);\n}\n\nexport async function promptForDocker(initial?: boolean): Promise<boolean> {\n if (initial !== undefined) return initial;\n const docker = await clack.confirm({\n message: 'Would you like to include a Docker container setup?',\n initialValue: true,\n });\n return handleCancel(docker);\n}\n\nexport async function promptForMonorepo(initial?: boolean): Promise<boolean> {\n if (initial !== undefined) return initial;\n const monorepo = await clack.confirm({\n message: 'Would you like to configure this project as a monorepo?',\n initialValue: false,\n });\n return handleCancel(monorepo);\n}\n\nexport async function promptForStateManagement(\n initial?: StateManagementOption,\n): Promise<StateManagementOption> {\n if (initial) return initial;\n const stateManagement = await clack.select<StateManagementOption>({\n message: 'Which state management solution would you like?',\n options: [\n { value: 'none', label: 'None' },\n { value: 'zustand', label: 'Zustand', hint: 'Small, fast, scaleable' },\n { value: 'redux', label: 'Redux Toolkit', hint: 'Opinionated toolset for Redux' },\n { value: 'jotai', label: 'Jotai', hint: 'Primitive and flexible state management' },\n ],\n initialValue: 'none',\n });\n return handleCancel(stateManagement);\n}\n\nexport async function promptForPackageManager(\n initial?: PackageManagerOption,\n): Promise<PackageManagerOption> {\n if (initial) return initial;\n const packageManager = await clack.select<PackageManagerOption>({\n message: 'Which package manager would you like to use?',\n options: [\n { value: 'pnpm', label: 'pnpm', hint: 'Recommended' },\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' },\n { value: 'bun', label: 'bun' },\n ],\n initialValue: 'pnpm',\n });\n return handleCancel(packageManager);\n}\n\nexport async function runInteractivePrompts(\n partial: Partial<ProjectConfig>,\n): Promise<Partial<ProjectConfig>> {\n clack.intro(pc.bgCyan(pc.black(' create-enterprise-next ')));\n\n const projectName = await promptForProjectName(partial.projectName);\n const typescript = await promptForTypeScript(partial.typescript);\n const styling = await promptForStyling(partial.styling);\n const auth = await promptForAuth(partial.auth);\n const orm = await promptForOrm(partial.orm);\n const database = await promptForDatabase(orm, partial.database);\n const testing = await promptForTesting(partial.testing);\n const ci = await promptForCi(partial.ci);\n const docker = await promptForDocker(partial.docker);\n const monorepo = await promptForMonorepo(partial.monorepo);\n const stateManagement = await promptForStateManagement(partial.stateManagement);\n const packageManager = await promptForPackageManager(partial.packageManager);\n\n clack.outro(pc.green('Configuration completed!'));\n\n return {\n projectName,\n typescript,\n styling,\n auth,\n orm,\n database,\n testing,\n ci,\n docker,\n monorepo,\n stateManagement,\n packageManager,\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport validateNpmName from 'validate-npm-package-name';\n\n/**\n * Validates project name for filesystem safety and npm package name compliance.\n */\nexport function validateProjectName(name: string, cwd: string = process.cwd()): string | undefined {\n if (!name || name.trim().length === 0) {\n return 'Project name cannot be empty.';\n }\n\n const trimmed = name.trim();\n\n if (trimmed.includes(' ')) {\n return 'Project name cannot contain spaces.';\n }\n\n // Path traversal check\n const targetPath = path.resolve(cwd, trimmed);\n const relativePath = path.relative(cwd, targetPath);\n if (relativePath.startsWith('..') || path.isAbsolute(trimmed) && !targetPath.startsWith(cwd)) {\n return 'Project name cannot resolve outside the current working directory.';\n }\n\n const basename = path.basename(trimmed);\n const npmValidation = validateNpmName(basename);\n if (!npmValidation.validForNewPackages) {\n const errors = [...(npmValidation.errors || []), ...(npmValidation.warnings || [])];\n return `Invalid npm package name: ${errors.join(', ')}`;\n }\n\n return undefined;\n}\n\n/**\n * Validates that target directory path does not exist or is an empty directory.\n */\nexport function validateTargetDirectory(targetPath: string, cwd: string = process.cwd()): string | undefined {\n const absolutePath = path.resolve(cwd, targetPath);\n\n if (!fs.existsSync(absolutePath)) {\n return undefined;\n }\n\n const stats = fs.statSync(absolutePath);\n if (!stats.isDirectory()) {\n return `Target path \"${targetPath}\" exists and is a file, not a directory.`;\n }\n\n const files = fs.readdirSync(absolutePath);\n const nonHiddenFiles = files.filter((file) => !file.startsWith('.'));\n if (nonHiddenFiles.length > 0) {\n return `Target directory \"${targetPath}\" is not empty. Please choose another name or empty the directory.`;\n }\n\n return undefined;\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (msg: string) => console.log(pc.blue('ℹ ') + msg),\n success: (msg: string) => console.log(pc.green('✔ ') + msg),\n warn: (msg: string) => console.warn(pc.yellow('⚠ ') + msg),\n error: (msg: string) => console.error(pc.red('✖ ') + msg),\n log: (msg: string) => console.log(msg),\n};\n"],"mappings":"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","names":["Command","fs","path","fs","path","pc","path","fs","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/cli/flags.ts","../src/config/schema.ts","../src/config/resolve.ts","../src/config/defaults.ts","../src/prompts/interactive.ts","../src/utils/validate-project-name.ts","../src/generate/generate-project.ts","../src/generate/context.ts","../src/generate/filesystem.ts","../src/generate/dependencies.ts","../src/generate/base/index.ts","../src/generate/base/readme.ts","../src/generate/features/styling/index.ts","../src/generate/features/auth/index.ts","../src/generate/features/orm/index.ts","../src/generate/features/state-management/index.ts","../src/generate/features/testing/index.ts","../src/generate/features/ci/index.ts","../src/generate/features/docker/index.ts","../src/generate/features/monorepo/index.ts","../src/generate/package-json.ts","../src/generate/summary.ts","../src/utils/logger.ts"],"sourcesContent":["import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { setupCliFlags, type CliOptions } from './cli/flags.js';\nimport { resolveConfig } from './config/resolve.js';\nimport { runInteractivePrompts } from './prompts/interactive.js';\nimport { generateProject } from './generate/generate-project.js';\nimport { logger } from './utils/logger.js';\nimport { validateProjectName, validateTargetDirectory } from './utils/validate-project-name.js';\n\nfunction getPackageVersion(): string {\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const pkgPath = path.resolve(__dirname, '../package.json');\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.version) return pkg.version as string;\n }\n } catch {\n // fallback if package.json cannot be read\n }\n return '0.1.0';\n}\n\nasync function main() {\n const program = new Command();\n\n program\n .name('cen')\n .description('Scaffold enterprise-grade Next.js applications')\n .version(getPackageVersion());\n\n setupCliFlags(program);\n\n program.action(async (positionalProjectName: string | undefined, flags: CliOptions) => {\n try {\n if (positionalProjectName) {\n const nameErr = validateProjectName(positionalProjectName);\n if (nameErr) {\n logger.error(nameErr);\n process.exit(1);\n }\n const dirErr = validateTargetDirectory(positionalProjectName);\n if (dirErr) {\n logger.error(dirErr);\n process.exit(1);\n }\n }\n\n const config = await resolveConfig(\n {\n projectName: positionalProjectName,\n cliOptions: flags,\n },\n runInteractivePrompts,\n );\n\n if (flags.dryRun) {\n console.log(JSON.stringify(config, null, 2));\n process.exit(0);\n }\n\n await generateProject(config);\n } catch (err) {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n logger.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","import { Command, InvalidArgumentError, Option } from 'commander';\nimport {\n AuthEnum,\n CiEnum,\n DatabaseEnum,\n OrmEnum,\n PackageManagerEnum,\n StateManagementEnum,\n StylingEnum,\n TestingEnum,\n type TestingOption,\n} from '../config/schema.js';\n\nexport interface CliOptions {\n typescript?: boolean;\n styling?: string;\n auth?: string;\n orm?: string;\n database?: string;\n db?: string;\n testing?: TestingOption[];\n ci?: string;\n docker?: boolean;\n monorepo?: boolean;\n stateManagement?: string;\n packageManager?: string;\n yes?: boolean;\n dryRun?: boolean;\n config?: string;\n}\n\nfunction parseBoolean(val: string | boolean): boolean {\n if (typeof val === 'boolean') return val;\n if (val === 'true' || val === '1') return true;\n if (val === 'false' || val === '0') return false;\n throw new InvalidArgumentError(`Invalid boolean value '${val}'. Expected true or false.`);\n}\n\nfunction parseTesting(val: string): TestingOption[] {\n const allowed = TestingEnum.options;\n const items = val.split(',').map((item) => item.trim()).filter(Boolean);\n if (items.length === 0) {\n throw new InvalidArgumentError('Testing option cannot be empty.');\n }\n for (const item of items) {\n if (!allowed.includes(item as TestingOption)) {\n throw new InvalidArgumentError(\n `Invalid testing framework '${item}'. Allowed choices are: ${allowed.join(', ')}.`,\n );\n }\n }\n return items as TestingOption[];\n}\n\nexport function setupCliFlags(program: Command): Command {\n return program\n .argument('[project-name]', 'Target project directory / name')\n .addOption(\n new Option('--ts, --typescript [boolean]', 'Use TypeScript').argParser(parseBoolean),\n )\n .addOption(new Option('--no-ts', 'Do not use TypeScript'))\n .addOption(\n new Option('--styling <styling>', 'Styling framework').choices(StylingEnum.options),\n )\n .addOption(new Option('--auth <auth>', 'Authentication provider').choices(AuthEnum.options))\n .addOption(new Option('--orm <orm>', 'ORM selection').choices(OrmEnum.options))\n .addOption(\n new Option('--db, --database <database>', 'Database solution').choices(DatabaseEnum.options),\n )\n .addOption(\n new Option(\n '--testing <frameworks>',\n 'Comma-separated testing frameworks (e.g. vitest,playwright)',\n ).argParser(parseTesting),\n )\n .addOption(new Option('--ci <ci>', 'CI workflow setup').choices(CiEnum.options))\n .addOption(new Option('--docker [boolean]', 'Include Docker setup').argParser(parseBoolean))\n .addOption(new Option('--no-docker', 'Disable Docker setup'))\n .addOption(\n new Option('--monorepo [boolean]', 'Set up project as a monorepo').argParser(parseBoolean),\n )\n .addOption(new Option('--no-monorepo', 'Do not set up as monorepo'))\n .addOption(\n new Option('--state-management <state>', 'State management solution').choices(\n StateManagementEnum.options,\n ),\n )\n .addOption(\n new Option('--package-manager <packageManager>', 'Package manager').choices(\n PackageManagerEnum.options,\n ),\n )\n .addOption(new Option('-y, --yes', 'Skip interactive prompts and use default values'))\n .addOption(new Option('--dry-run', 'Output resolved configuration JSON without scaffolding'))\n .addOption(new Option('-c, --config <path>', 'Path to JSON configuration file'));\n}\n","import { z } from 'zod';\n\nexport const StylingEnum = z.enum(['tailwind', 'css-modules', 'styled-components']);\nexport const AuthEnum = z.enum(['none', 'clerk', 'next-auth', 'auth0']);\nexport const OrmEnum = z.enum(['none', 'prisma', 'drizzle']);\nexport const DatabaseEnum = z.enum(['postgres', 'mysql', 'sqlite', 'mongo']);\nexport const TestingEnum = z.enum(['vitest', 'jest', 'playwright', 'cypress']);\nexport const CiEnum = z.enum(['none', 'github-actions', 'gitlab-ci']);\nexport const StateManagementEnum = z.enum(['none', 'zustand', 'redux', 'jotai']);\nexport const PackageManagerEnum = z.enum(['npm', 'pnpm', 'yarn', 'bun']);\n\nexport const projectConfigSchema = z\n .object({\n projectName: z.string().min(1, 'Project name is required'),\n typescript: z.boolean(),\n styling: StylingEnum,\n auth: AuthEnum,\n orm: OrmEnum,\n database: DatabaseEnum.optional(),\n testing: z.array(TestingEnum),\n ci: CiEnum,\n docker: z.boolean(),\n monorepo: z.boolean(),\n stateManagement: StateManagementEnum,\n packageManager: PackageManagerEnum,\n })\n .superRefine((data, ctx) => {\n if (data.orm === 'none' && data.database !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Database must not be specified when ORM is \"none\".',\n path: ['database'],\n });\n }\n if (data.orm !== 'none' && !data.database) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Database must be specified when an ORM is selected.',\n path: ['database'],\n });\n }\n if (data.orm === 'drizzle' && data.database === 'mongo') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Drizzle ORM does not support MongoDB.',\n path: ['database'],\n });\n }\n if (data.monorepo && data.packageManager !== 'pnpm') {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Monorepo setup is only supported with pnpm package manager.',\n path: ['packageManager'],\n });\n }\n });\n\n// Single source of truth inferred TypeScript type\nexport type ProjectConfig = z.infer<typeof projectConfigSchema>;\n\nexport type StylingOption = z.infer<typeof StylingEnum>;\nexport type AuthOption = z.infer<typeof AuthEnum>;\nexport type OrmOption = z.infer<typeof OrmEnum>;\nexport type DatabaseOption = z.infer<typeof DatabaseEnum>;\nexport type TestingOption = z.infer<typeof TestingEnum>;\nexport type CiOption = z.infer<typeof CiEnum>;\nexport type StateManagementOption = z.infer<typeof StateManagementEnum>;\nexport type PackageManagerOption = z.infer<typeof PackageManagerEnum>;\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { CliOptions } from '../cli/flags.js';\nimport { defaultConfig } from './defaults.js';\nimport {\n projectConfigSchema,\n type ProjectConfig,\n} from './schema.js';\n\nexport interface ResolveConfigInput {\n projectName?: string;\n cliOptions: CliOptions;\n cwd?: string;\n interactive?: boolean;\n}\n\n/**\n * Merges configuration sources according to strict precedence rules:\n * 1. Authoritative positional project name\n * 2. Explicit CLI configuration flags\n * 3. Config file options\n * 4. Interactive prompt answers (if TTY & `--yes` is not set)\n * 5. Enterprise default values (fallback)\n */\nexport async function resolveConfig(\n input: ResolveConfigInput,\n prompter?: (partial: Partial<ProjectConfig>) => Promise<Partial<ProjectConfig>>,\n): Promise<ProjectConfig> {\n const cwd = input.cwd ?? process.cwd();\n const flags = input.cliOptions;\n let fileConfig: Partial<ProjectConfig> = {};\n\n // 1. If `--config` is provided, read and parse the JSON file\n if (flags.config) {\n const configPath = path.resolve(cwd, flags.config);\n if (!fs.existsSync(configPath)) {\n throw new Error(`Config file not found at path: ${flags.config}`);\n }\n\n try {\n const fileContent = fs.readFileSync(configPath, 'utf-8');\n fileConfig = JSON.parse(fileContent) as Partial<ProjectConfig>;\n } catch (err) {\n if (err instanceof SyntaxError) {\n throw new Error(`Failed to parse \"${flags.config}\". The file does not contain valid JSON.`);\n }\n throw new Error(`Failed to read config file at \"${flags.config}\": ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // 2. Extract CLI options explicitly supplied by the user\n const cliConfig: Partial<ProjectConfig> = {};\n\n if (flags.typescript !== undefined) cliConfig.typescript = flags.typescript;\n if (flags.styling !== undefined) cliConfig.styling = flags.styling as ProjectConfig['styling'];\n if (flags.auth !== undefined) cliConfig.auth = flags.auth as ProjectConfig['auth'];\n if (flags.orm !== undefined) cliConfig.orm = flags.orm as ProjectConfig['orm'];\n\n const dbFlag = flags.db ?? flags.database;\n if (dbFlag !== undefined) cliConfig.database = dbFlag as ProjectConfig['database'];\n\n if (flags.testing !== undefined) cliConfig.testing = flags.testing;\n if (flags.ci !== undefined) cliConfig.ci = flags.ci as ProjectConfig['ci'];\n if (flags.docker !== undefined) cliConfig.docker = flags.docker;\n if (flags.monorepo !== undefined) cliConfig.monorepo = flags.monorepo;\n if (flags.stateManagement !== undefined)\n cliConfig.stateManagement = flags.stateManagement as ProjectConfig['stateManagement'];\n if (flags.packageManager !== undefined)\n cliConfig.packageManager = flags.packageManager as ProjectConfig['packageManager'];\n\n // CLI flags override config file values\n let resolvedPartial: Partial<ProjectConfig> = {\n ...fileConfig,\n ...cliConfig,\n };\n\n // Authoritative positional project name overrides config file / flags if provided\n if (input.projectName) {\n resolvedPartial.projectName = input.projectName;\n }\n\n // 3. Interactivity step\n const shouldPrompt =\n input.interactive ?? (!flags.yes && Boolean(process.stdout.isTTY));\n\n if (shouldPrompt && prompter) {\n resolvedPartial = await prompter(resolvedPartial);\n }\n\n // 4. Fall back to defaults for remaining unresolved fields\n const finalProjectName = resolvedPartial.projectName || defaultConfig.projectName;\n const finalOrm = resolvedPartial.orm ?? defaultConfig.orm;\n\n let finalDatabase = resolvedPartial.database;\n if (finalOrm !== 'none' && !finalDatabase) {\n finalDatabase = 'postgres';\n }\n\n const finalMerged: ProjectConfig = {\n projectName: finalProjectName,\n typescript: resolvedPartial.typescript ?? defaultConfig.typescript,\n styling: resolvedPartial.styling ?? defaultConfig.styling,\n auth: resolvedPartial.auth ?? defaultConfig.auth,\n orm: finalOrm,\n database: finalDatabase,\n testing: resolvedPartial.testing ?? defaultConfig.testing,\n ci: resolvedPartial.ci ?? defaultConfig.ci,\n docker: resolvedPartial.docker ?? defaultConfig.docker,\n monorepo: resolvedPartial.monorepo ?? defaultConfig.monorepo,\n stateManagement: resolvedPartial.stateManagement ?? defaultConfig.stateManagement,\n packageManager: resolvedPartial.packageManager ?? defaultConfig.packageManager,\n };\n\n // 5. Final validation against Zod schema\n const validationResult = projectConfigSchema.safeParse(finalMerged);\n\n if (!validationResult.success) {\n const issueMessages = validationResult.error.issues\n .map((issue) => ` - [${issue.path.join('.')}]: ${issue.message}`)\n .join('\\n');\n throw new Error(`Invalid configuration:\\n${issueMessages}`);\n }\n\n return validationResult.data;\n}\n","import type { ProjectConfig } from './schema.js';\n\nexport const defaultConfig: ProjectConfig = {\n projectName: 'my-app',\n typescript: true,\n styling: 'tailwind',\n auth: 'none',\n orm: 'none',\n database: undefined,\n testing: ['vitest'],\n ci: 'github-actions',\n docker: true,\n monorepo: false,\n stateManagement: 'none',\n packageManager: 'pnpm',\n};\n","import * as clack from '@clack/prompts';\nimport pc from 'picocolors';\nimport type {\n AuthOption,\n CiOption,\n DatabaseOption,\n OrmOption,\n PackageManagerOption,\n ProjectConfig,\n StateManagementOption,\n StylingOption,\n TestingOption,\n} from '../config/schema.js';\nimport { validateProjectName, validateTargetDirectory } from '../utils/validate-project-name.js';\n\nfunction handleCancel<T>(value: T | symbol): T {\n if (clack.isCancel(value)) {\n clack.cancel('Operation cancelled.');\n process.exit(1);\n }\n return value as T;\n}\n\nexport async function promptForProjectName(initial?: string): Promise<string> {\n if (initial) return initial;\n const name = await clack.text({\n message: 'What is your project name?',\n placeholder: 'my-app',\n defaultValue: 'my-app',\n validate(val) {\n const nameErr = validateProjectName(val);\n if (nameErr) return nameErr;\n const dirErr = validateTargetDirectory(val);\n if (dirErr) return dirErr;\n },\n });\n return handleCancel(name).trim();\n}\n\nexport async function promptForTypeScript(initial?: boolean): Promise<boolean> {\n if (initial !== undefined) return initial;\n const ts = await clack.confirm({\n message: 'Would you like to use TypeScript?',\n initialValue: true,\n });\n return handleCancel(ts);\n}\n\nexport async function promptForStyling(initial?: StylingOption): Promise<StylingOption> {\n if (initial) return initial;\n const styling = await clack.select<StylingOption>({\n message: 'Which styling solution would you like to use?',\n options: [\n { value: 'tailwind', label: 'Tailwind CSS', hint: 'Recommended' },\n { value: 'css-modules', label: 'CSS Modules' },\n { value: 'styled-components', label: 'Styled Components' },\n ],\n initialValue: 'tailwind',\n });\n return handleCancel(styling);\n}\n\nexport async function promptForAuth(initial?: AuthOption): Promise<AuthOption> {\n if (initial) return initial;\n const auth = await clack.select<AuthOption>({\n message: 'Which authentication provider would you like to use?',\n options: [\n { value: 'none', label: 'None' },\n { value: 'clerk', label: 'Clerk', hint: 'User management platform' },\n { value: 'next-auth', label: 'NextAuth.js / Auth.js', hint: 'Open source auth' },\n { value: 'auth0', label: 'Auth0', hint: 'Enterprise Identity Platform' },\n ],\n initialValue: 'none',\n });\n return handleCancel(auth);\n}\n\nexport async function promptForOrm(initial?: OrmOption): Promise<OrmOption> {\n if (initial) return initial;\n const orm = await clack.select<OrmOption>({\n message: 'Which ORM / Database abstraction would you like to use?',\n options: [\n { value: 'none', label: 'None' },\n { value: 'prisma', label: 'Prisma', hint: 'Next-gen ORM' },\n { value: 'drizzle', label: 'Drizzle ORM', hint: 'Lightweight & fast' },\n ],\n initialValue: 'none',\n });\n return handleCancel(orm);\n}\n\nexport async function promptForDatabase(\n orm: OrmOption,\n initial?: DatabaseOption,\n): Promise<DatabaseOption | undefined> {\n if (orm === 'none') return undefined;\n if (initial) return initial;\n const db = await clack.select<DatabaseOption>({\n message: 'Which database would you like to connect to?',\n options: [\n { value: 'postgres', label: 'PostgreSQL' },\n { value: 'mysql', label: 'MySQL' },\n { value: 'sqlite', label: 'SQLite' },\n { value: 'mongo', label: 'MongoDB' },\n ],\n initialValue: 'postgres',\n });\n return handleCancel(db);\n}\n\nexport async function promptForTesting(initial?: TestingOption[]): Promise<TestingOption[]> {\n if (initial && initial.length > 0) return initial;\n const testing = await clack.multiselect<TestingOption>({\n message: 'Select testing frameworks to include:',\n options: [\n { value: 'vitest', label: 'Vitest', hint: 'Fast unit/integration test runner' },\n { value: 'jest', label: 'Jest', hint: 'Delightful JS testing' },\n { value: 'playwright', label: 'Playwright', hint: 'End-to-end browser testing' },\n { value: 'cypress', label: 'Cypress', hint: 'E2E & component testing' },\n ],\n required: false,\n initialValues: ['vitest'],\n });\n return handleCancel(testing);\n}\n\nexport async function promptForCi(initial?: CiOption): Promise<CiOption> {\n if (initial) return initial;\n const ci = await clack.select<CiOption>({\n message: 'Which Continuous Integration (CI) setup would you like?',\n options: [\n { value: 'github-actions', label: 'GitHub Actions', hint: 'Recommended' },\n { value: 'gitlab-ci', label: 'GitLab CI' },\n { value: 'none', label: 'None' },\n ],\n initialValue: 'github-actions',\n });\n return handleCancel(ci);\n}\n\nexport async function promptForDocker(initial?: boolean): Promise<boolean> {\n if (initial !== undefined) return initial;\n const docker = await clack.confirm({\n message: 'Would you like to include a Docker container setup?',\n initialValue: true,\n });\n return handleCancel(docker);\n}\n\nexport async function promptForMonorepo(initial?: boolean): Promise<boolean> {\n if (initial !== undefined) return initial;\n const monorepo = await clack.confirm({\n message: 'Would you like to configure this project as a monorepo?',\n initialValue: false,\n });\n return handleCancel(monorepo);\n}\n\nexport async function promptForStateManagement(\n initial?: StateManagementOption,\n): Promise<StateManagementOption> {\n if (initial) return initial;\n const stateManagement = await clack.select<StateManagementOption>({\n message: 'Which state management solution would you like?',\n options: [\n { value: 'none', label: 'None' },\n { value: 'zustand', label: 'Zustand', hint: 'Small, fast, scaleable' },\n { value: 'redux', label: 'Redux Toolkit', hint: 'Opinionated toolset for Redux' },\n { value: 'jotai', label: 'Jotai', hint: 'Primitive and flexible state management' },\n ],\n initialValue: 'none',\n });\n return handleCancel(stateManagement);\n}\n\nexport async function promptForPackageManager(\n initial?: PackageManagerOption,\n): Promise<PackageManagerOption> {\n if (initial) return initial;\n const packageManager = await clack.select<PackageManagerOption>({\n message: 'Which package manager would you like to use?',\n options: [\n { value: 'pnpm', label: 'pnpm', hint: 'Recommended' },\n { value: 'npm', label: 'npm' },\n { value: 'yarn', label: 'yarn' },\n { value: 'bun', label: 'bun' },\n ],\n initialValue: 'pnpm',\n });\n return handleCancel(packageManager);\n}\n\nexport async function runInteractivePrompts(\n partial: Partial<ProjectConfig>,\n): Promise<Partial<ProjectConfig>> {\n clack.intro(pc.bgCyan(pc.black(' create-enterprise-next ')));\n\n const projectName = await promptForProjectName(partial.projectName);\n const typescript = await promptForTypeScript(partial.typescript);\n const styling = await promptForStyling(partial.styling);\n const auth = await promptForAuth(partial.auth);\n const orm = await promptForOrm(partial.orm);\n const database = await promptForDatabase(orm, partial.database);\n const testing = await promptForTesting(partial.testing);\n const ci = await promptForCi(partial.ci);\n const docker = await promptForDocker(partial.docker);\n const monorepo = await promptForMonorepo(partial.monorepo);\n const stateManagement = await promptForStateManagement(partial.stateManagement);\n const packageManager = await promptForPackageManager(partial.packageManager);\n\n clack.outro(pc.green('Configuration completed!'));\n\n return {\n projectName,\n typescript,\n styling,\n auth,\n orm,\n database,\n testing,\n ci,\n docker,\n monorepo,\n stateManagement,\n packageManager,\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport validateNpmName from 'validate-npm-package-name';\n\n/**\n * Validates project name for filesystem safety and npm package name compliance.\n */\nexport function validateProjectName(name: string, cwd: string = process.cwd()): string | undefined {\n if (!name || name.trim().length === 0) {\n return 'Project name cannot be empty.';\n }\n\n const trimmed = name.trim();\n\n if (trimmed.includes(' ')) {\n return 'Project name cannot contain spaces.';\n }\n\n // Path traversal check\n const targetPath = path.resolve(cwd, trimmed);\n const relativePath = path.relative(cwd, targetPath);\n if (relativePath.startsWith('..') || path.isAbsolute(trimmed) && !targetPath.startsWith(cwd)) {\n return 'Project name cannot resolve outside the current working directory.';\n }\n\n const basename = path.basename(trimmed);\n const npmValidation = validateNpmName(basename);\n if (!npmValidation.validForNewPackages) {\n const errors = [...(npmValidation.errors || []), ...(npmValidation.warnings || [])];\n return `Invalid npm package name: ${errors.join(', ')}`;\n }\n\n return undefined;\n}\n\n/**\n * Validates that target directory path does not exist or is an empty directory.\n */\nexport function validateTargetDirectory(targetPath: string, cwd: string = process.cwd()): string | undefined {\n const absolutePath = path.resolve(cwd, targetPath);\n\n if (!fs.existsSync(absolutePath)) {\n return undefined;\n }\n\n const stats = fs.statSync(absolutePath);\n if (!stats.isDirectory()) {\n return `Target path \"${targetPath}\" exists and is a file, not a directory.`;\n }\n\n const files = fs.readdirSync(absolutePath);\n const nonHiddenFiles = files.filter((file) => !file.startsWith('.'));\n if (nonHiddenFiles.length > 0) {\n return `Target directory \"${targetPath}\" is not empty. Please choose another name or empty the directory.`;\n }\n\n return undefined;\n}\n","import * as clack from '@clack/prompts';\nimport { type ProjectConfig } from '../config/schema.js';\nimport { createGenerationContext, addAppFile, type GenerationContext } from './context.js';\nimport { ensureDirectory, writeFile, directoryIsEmpty } from './filesystem.js';\nimport { generateBaseProject } from './base/index.js';\nimport { generateReadme } from './base/readme.js';\nimport { generateStyling } from './features/styling/index.js';\nimport { generateAuthentication } from './features/auth/index.js';\nimport { generateOrm } from './features/orm/index.js';\nimport { generateStateManagement } from './features/state-management/index.js';\nimport { generateTesting } from './features/testing/index.js';\nimport { generateCi } from './features/ci/index.js';\nimport { generateDocker } from './features/docker/index.js';\nimport { generateMonorepo } from './features/monorepo/index.js';\nimport { compilePackageJsons } from './package-json.js';\nimport { printGenerationSummary } from './summary.js';\n\nfunction compileEnvExample(context: GenerationContext) {\n const keys = Object.keys(context.manifest.env);\n let content = '# Environment Variables\\n\\n';\n if (keys.length === 0) {\n content += '# No environment variables required for this setup.\\n';\n } else {\n for (const key of keys) {\n content += `${key}=${context.manifest.env[key] || ''}\\n`;\n }\n }\n addAppFile(context, '.env.example', content);\n}\n\nexport async function generateProject(config: ProjectConfig, cwd?: string): Promise<void> {\n const context = createGenerationContext(config, cwd);\n const { targetDir, manifest } = context;\n\n const s = clack.spinner();\n s.start('Initializing project structure');\n\n try {\n // 1. Run all generators in memory (Accumulator pattern)\n s.message('Configuring base Next.js templates');\n await generateBaseProject(context);\n\n s.message('Configuring styling');\n await generateStyling(context);\n\n s.message('Configuring authentication');\n await generateAuthentication(context);\n\n s.message('Configuring database & ORM');\n await generateOrm(context);\n\n s.message('Configuring state management');\n await generateStateManagement(context);\n\n s.message('Configuring testing suites');\n await generateTesting(context);\n\n s.message('Configuring CI workflows');\n await generateCi(context);\n\n s.message('Configuring Docker environment');\n await generateDocker(context);\n\n s.message('Configuring monorepo structures');\n await generateMonorepo(context);\n\n // Compile dynamic accumulators\n generateReadme(context);\n compileEnvExample(context);\n compilePackageJsons(context);\n\n // 2. Perform filesystem validations before writing anything\n s.message('Validating destination directory');\n const isTargetEmpty = await directoryIsEmpty(targetDir, '.');\n if (!isTargetEmpty) {\n throw new Error(`Destination directory \"${targetDir}\" is not empty.`);\n }\n\n // 3. Perform batch writes safely\n s.message('Writing files to disk');\n \n // Ensure the main project directory exists first\n await ensureDirectory(targetDir, '.');\n\n for (const [relPath, content] of manifest.files.entries()) {\n // safeResolve is called inside writeFile to guard against path traversal\n await writeFile(targetDir, relPath, content);\n }\n\n s.stop('Project configuration completed successfully');\n\n // 4. Print final completion summary\n printGenerationSummary(context);\n\n } catch (error) {\n s.stop('Generation failed', 1);\n throw error;\n }\n}\n","import type { ProjectConfig } from '../config/schema.js';\n\nexport interface ProjectManifest {\n // Dependencies for the Next.js app (either root or apps/web in monorepo)\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n\n // Root dependencies/scripts (used for monorepo root)\n rootDependencies: Record<string, string>;\n rootDevDependencies: Record<string, string>;\n rootScripts: Record<string, string>;\n\n // Environment variables (.env.example)\n env: Record<string, string>;\n\n // Virtual file system mapping: relative path -> content\n files: Map<string, string>;\n}\n\nexport interface GenerationContext {\n config: ProjectConfig;\n cwd: string;\n targetDir: string;\n manifest: ProjectManifest;\n}\n\nexport function createGenerationContext(config: ProjectConfig, cwd: string = process.cwd()): GenerationContext {\n return {\n config,\n cwd,\n targetDir: config.projectName.startsWith('/') ? config.projectName : `${cwd}/${config.projectName}`,\n manifest: {\n dependencies: {},\n devDependencies: {},\n scripts: {},\n rootDependencies: {},\n rootDevDependencies: {},\n rootScripts: {},\n env: {},\n files: new Map(),\n },\n };\n}\n\nexport function addDependency(context: GenerationContext, name: string, version: string) {\n context.manifest.dependencies[name] = version;\n}\n\nexport function addDevDependency(context: GenerationContext, name: string, version: string) {\n context.manifest.devDependencies[name] = version;\n}\n\nexport function addScript(context: GenerationContext, name: string, command: string) {\n context.manifest.scripts[name] = command;\n}\n\nexport function addRootDependency(context: GenerationContext, name: string, version: string) {\n context.manifest.rootDependencies[name] = version;\n}\n\nexport function addRootDevDependency(context: GenerationContext, name: string, version: string) {\n context.manifest.rootDevDependencies[name] = version;\n}\n\nexport function addRootScript(context: GenerationContext, name: string, command: string) {\n context.manifest.rootScripts[name] = command;\n}\n\nexport function addEnv(context: GenerationContext, key: string, defaultValue = '') {\n context.manifest.env[key] = defaultValue;\n}\n\n/**\n * Registers a file associated with the application code.\n * In a monorepo structure, this file will be written under apps/web/.\n * In a single-application structure, it will be written at the root.\n */\nexport function addAppFile(context: GenerationContext, relativePath: string, content: string) {\n const normalizedPath = context.config.monorepo ? `apps/web/${relativePath}` : relativePath;\n context.manifest.files.set(normalizedPath, content);\n}\n\n/**\n * Registers a project-level file (such as turbo.json or pnpm-workspace.yaml).\n * This will always be written relative to the project root.\n */\nexport function addProjectFile(context: GenerationContext, relativePath: string, content: string) {\n context.manifest.files.set(relativePath, content);\n}\n","import fs from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Resolves a path relative to targetDir and ensures it does not escape the boundary.\n */\nexport function safeResolve(targetDir: string, relativePath: string): string {\n const absoluteTarget = path.resolve(targetDir);\n const resolved = path.resolve(absoluteTarget, relativePath);\n \n const relative = path.relative(absoluteTarget, resolved);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`Directory traversal detected: \"${relativePath}\" resolves outside of target directory \"${absoluteTarget}\".`);\n }\n return resolved;\n}\n\n/**\n * Ensures a directory exists within targetDir.\n */\nexport async function ensureDirectory(targetDir: string, relativePath: string): Promise<string> {\n const resolved = safeResolve(targetDir, relativePath);\n await fs.mkdir(resolved, { recursive: true });\n return resolved;\n}\n\n/**\n * Checks if a file/directory exists relative to targetDir.\n */\nexport function fileExists(targetDir: string, relativePath: string): boolean {\n const resolved = safeResolve(targetDir, relativePath);\n return existsSync(resolved);\n}\n\n/**\n * Writes a string value to a file within targetDir.\n */\nexport async function writeFile(targetDir: string, relativePath: string, content: string): Promise<void> {\n const resolved = safeResolve(targetDir, relativePath);\n await fs.mkdir(path.dirname(resolved), { recursive: true });\n await fs.writeFile(resolved, content, 'utf-8');\n}\n\n/**\n * Writes a JSON object to a file within targetDir.\n */\nexport async function writeJson(targetDir: string, relativePath: string, json: unknown): Promise<void> {\n const content = JSON.stringify(json, null, 2) + '\\n';\n await writeFile(targetDir, relativePath, content);\n}\n\n/**\n * Checks if a directory is empty (or only contains hidden files like .git).\n */\nexport async function directoryIsEmpty(targetDir: string, relativePath: string): Promise<boolean> {\n const resolved = safeResolve(targetDir, relativePath);\n if (!existsSync(resolved)) {\n return true;\n }\n const files = await fs.readdir(resolved);\n const nonHiddenFiles = files.filter(f => !f.startsWith('.'));\n return nonHiddenFiles.length === 0;\n}\n","export const dependencyVersions = {\n // Base\n next: '^15.1.0',\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n typescript: '^5.7.2',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n '@types/node': '^20.11.30',\n eslint: '^9.16.0',\n 'eslint-config-next': '^15.1.0',\n\n // Styling\n tailwindcss: '^3.4.15',\n postcss: '^8.4.49',\n autoprefixer: '^10.4.20',\n 'styled-components': '^6.1.13',\n\n // Auth\n '@clerk/nextjs': '^6.9.6',\n 'next-auth': '^5.0.0-beta.25',\n '@auth0/nextjs-auth0': '^3.5.0',\n\n // ORM\n prisma: '^6.1.0',\n '@prisma/client': '^6.1.0',\n 'drizzle-orm': '^0.38.2',\n 'drizzle-kit': '^0.30.1',\n pg: '^8.13.1',\n '@types/pg': '^8.11.10',\n mysql2: '^3.11.5',\n 'better-sqlite3': '^11.7.0',\n '@types/better-sqlite3': '^11.6.0',\n\n // State Management\n zustand: '^5.0.2',\n '@reduxjs/toolkit': '^2.5.0',\n 'react-redux': '^9.2.0',\n jotai: '^2.11.0',\n\n // Testing\n vitest: '^2.1.8',\n '@vitejs/plugin-react': '^4.3.4',\n jsdom: '^25.0.1',\n jest: '^29.7.0',\n 'jest-environment-jsdom': '^29.7.0',\n '@testing-library/react': '^16.1.0',\n '@testing-library/jest-dom': '^6.6.3',\n 'ts-jest': '^29.2.5',\n 'ts-node': '^10.9.2',\n '@types/jest': '^29.5.14',\n '@playwright/test': '^1.49.1',\n cypress: '^13.16.1',\n\n // Monorepo\n turbo: '^2.3.3',\n} as const;\n\nexport type DependencyName = keyof typeof dependencyVersions;\n","import { dependencyVersions } from '../dependencies.js';\nimport {\n type GenerationContext,\n addAppFile,\n addProjectFile,\n addDependency,\n addDevDependency,\n} from '../context.js';\n\nexport async function generateBaseProject(context: GenerationContext): Promise<void> {\n const { config } = context;\n const ext = config.typescript ? 'tsx' : 'jsx';\n const jsExt = config.typescript ? 'ts' : 'js';\n\n // 1. Add base dependencies\n addDependency(context, 'next', dependencyVersions['next']);\n addDependency(context, 'react', dependencyVersions['react']);\n addDependency(context, 'react-dom', dependencyVersions['react-dom']);\n\n addDevDependency(context, 'eslint', dependencyVersions['eslint']);\n addDevDependency(context, 'eslint-config-next', dependencyVersions['eslint-config-next']);\n\n if (config.typescript) {\n addDevDependency(context, 'typescript', dependencyVersions['typescript']);\n addDevDependency(context, '@types/react', dependencyVersions['@types/react']);\n addDevDependency(context, '@types/react-dom', dependencyVersions['@types/react-dom']);\n addDevDependency(context, '@types/node', dependencyVersions['@types/node']);\n }\n\n // 2. Generate configuration files\n\n // next-env.d.ts\n if (config.typescript) {\n addAppFile(context, 'next-env.d.ts', `/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/app/api-reference/config/typescript for more information\n`);\n }\n\n // tsconfig.json\n if (config.typescript) {\n addAppFile(\n context,\n 'tsconfig.json',\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n lib: ['dom', 'dom.iterable', 'esnext'],\n allowJs: true,\n skipLibCheck: true,\n strict: true,\n noEmit: true,\n esModuleInterop: true,\n module: 'esnext',\n moduleResolution: 'bundler',\n resolveJsonModule: true,\n isolatedModules: true,\n jsx: 'preserve',\n incremental: true,\n plugins: [\n {\n name: 'next',\n },\n ],\n paths: {\n '@/*': ['./src/*'],\n },\n },\n include: ['next-env.d.ts', '**/*.ts', '**/*.tsx', '.next/types/**/*.ts'],\n exclude: ['node_modules'],\n },\n null,\n 2\n ) + '\\n'\n );\n }\n\n // next.config.ts\n const nextConfigOptions: string[] = [];\n if (config.docker) {\n nextConfigOptions.push(' output: \"standalone\",');\n }\n if (config.styling === 'styled-components') {\n nextConfigOptions.push(' compiler: {\\n styledComponents: true,\\n },');\n }\n\n const nextConfigContent = config.typescript\n ? `import type { NextConfig } from \"next\";\n\nconst nextConfig: NextConfig = {\n${nextConfigOptions.join('\\n')}\n};\n\nexport default nextConfig;\n`\n : `/** @type {import('next').NextConfig} */\nconst nextConfig = {\n${nextConfigOptions.join('\\n')}\n};\n\nexport default nextConfig;\n`;\n addAppFile(context, `next.config.${jsExt}`, nextConfigContent);\n\n // eslint.config.mjs\n addAppFile(\n context,\n 'eslint.config.mjs',\n `import { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { FlatCompat } from \"@eslint/eslintrc\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst compat = new FlatCompat({\n baseDirectory: __dirname,\n});\n\nconst eslintConfig = [\n ...compat.extends(\"next/core-web-vitals\"),\n ${config.typescript ? '...compat.extends(\"next/typescript\"),' : ''}\n];\n\nexport default eslintConfig;\n`\n );\n\n // .gitignore (project level)\n addProjectFile(\n context,\n '.gitignore',\n `# dependencies\n/node_modules\n/.pnpm-store\n\n# testing\n/coverage\n/cypress/videos\n/cypress/screenshots\n/playwright-report\n/test-results\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\n\n# local env files\n.env*.local\n.env\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n`\n );\n\n // 3. Generate source base layouts & pages\n\n // Render Root Layout with composable wrappers\n const layoutImports: string[] = [];\n let childrenWrapped = '{children}';\n\n if (config.styling === 'styled-components') {\n layoutImports.push(\"import StyledComponentsRegistry from '@/lib/registry';\");\n childrenWrapped = `<StyledComponentsRegistry>${childrenWrapped}</StyledComponentsRegistry>`;\n }\n\n if (config.auth === 'clerk') {\n layoutImports.push(\"import { ClerkProvider } from '@clerk/nextjs';\");\n childrenWrapped = `<ClerkProvider>${childrenWrapped}</ClerkProvider>`;\n } else if (config.auth === 'auth0') {\n layoutImports.push(\"import { UserProvider } from '@auth0/nextjs-auth0/client';\");\n childrenWrapped = `<UserProvider>${childrenWrapped}</UserProvider>`;\n }\n\n if (config.stateManagement === 'redux') {\n layoutImports.push(\"import StoreProvider from './StoreProvider';\");\n childrenWrapped = `<StoreProvider>${childrenWrapped}</StoreProvider>`;\n } else if (config.stateManagement === 'jotai') {\n layoutImports.push(\"import JotaiProvider from './JotaiProvider';\");\n childrenWrapped = `<JotaiProvider>${childrenWrapped}</JotaiProvider>`;\n }\n\n const layoutContent = `${config.typescript ? 'import type { Metadata } from \"next\";\\n' : ''}import \"./globals.css\";\n${layoutImports.join('\\n')}\n\nexport const metadata${config.typescript ? ': Metadata' : ''} = {\n title: \"${config.projectName}\",\n description: \"Generated by create-enterprise-next\",\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\">\n <body>\n ${childrenWrapped}\n </body>\n </html>\n );\n}\n`;\n addAppFile(context, `src/app/layout.${ext}`, layoutContent);\n\n // Render Welcome Page dynamically displaying active configuration\n const testingLabel = config.testing.length > 0 ? config.testing.join(', ') : 'None';\n const modules = [\n `<li><strong>Styling:</strong> ${config.styling}</li>`,\n `<li><strong>Authentication:</strong> ${config.auth}</li>`,\n `<li><strong>ORM:</strong> ${config.orm} (${config.database || 'None'})</li>`,\n `<li><strong>Testing:</strong> ${testingLabel}</li>`,\n `<li><strong>State Management:</strong> ${config.stateManagement}</li>`,\n `<li><strong>CI Setup:</strong> ${config.ci}</li>`,\n `<li><strong>Docker Configuration:</strong> ${config.docker ? 'Enabled' : 'Disabled'}</li>`,\n `<li><strong>Monorepo Structure:</strong> ${config.monorepo ? 'Enabled' : 'Disabled'}</li>`,\n `<li><strong>Package Manager:</strong> ${config.packageManager}</li>`,\n ].join('\\n ');\n\n let pageContent = '';\n if (config.styling === 'tailwind') {\n pageContent = `export default function Page() {\n return (\n <main className=\"flex min-h-screen flex-col items-center justify-center bg-slate-950 text-white p-6\">\n <div className=\"max-w-2xl text-center space-y-6\">\n <h1 className=\"text-4xl font-extrabold tracking-tight bg-clip-text text-transparent bg-gradient-to-r from-blue-400 to-emerald-400\">\n create-enterprise-next\n </h1>\n <p className=\"text-lg text-slate-400\">\n Your enterprise Next.js foundation is ready.\n </p>\n <div className=\"mt-8 p-6 bg-slate-900 rounded-xl border border-slate-800 text-left\">\n <h2 className=\"text-xl font-semibold mb-4 text-slate-200\">Enabled Modules</h2>\n <ul className=\"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm text-slate-400\">\n ${modules}\n </ul>\n </div>\n </div>\n </main>\n );\n}\n`;\n } else if (config.styling === 'styled-components') {\n pageContent = `import styled from 'styled-components';\n\nconst Container = styled.main\\`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n background-color: #020617;\n color: #ffffff;\n padding: 24px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n\\`;\n\nconst Title = styled.h1\\`\n font-size: 36px;\n font-weight: 800;\n margin-bottom: 12px;\n background: linear-gradient(to right, #60a5fa, #34d399);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n\\`;\n\nconst Subtitle = styled.p\\`\n font-size: 18px;\n color: #94a3b8;\n margin-bottom: 32px;\n\\`;\n\nconst ModuleCard = styled.div\\`\n background-color: #0f172a;\n border: 1px solid #1e293b;\n border-radius: 12px;\n padding: 24px;\n max-width: 600px;\n width: 100%;\n text-align: left;\n\\`;\n\nconst CardTitle = styled.h2\\`\n font-size: 20px;\n font-weight: 600;\n margin-bottom: 16px;\n color: #e2e8f0;\n\\`;\n\nconst ModuleList = styled.ul\\`\n display: grid;\n grid-template-columns: 1fr;\n gap: 12px;\n list-style: none;\n padding: 0;\n margin: 0;\n color: #94a3b8;\n font-size: 14px;\n\n @media (min-width: 768px) {\n grid-template-columns: 1fr 1fr;\n }\n\\`;\n\nexport default function Page() {\n return (\n <Container>\n <Title>create-enterprise-next</Title>\n <Subtitle>Your enterprise Next.js foundation is ready.</Subtitle>\n <ModuleCard>\n <CardTitle>Enabled Modules</CardTitle>\n <ModuleList>\n ${modules}\n </ModuleList>\n </ModuleCard>\n </Container>\n );\n}\n`;\n } else {\n // CSS Modules / fallback\n pageContent = `import styles from './page.module.css';\n\nexport default function Page() {\n return (\n <main className={styles.main}>\n <div className={styles.container}>\n <h1 className={styles.title}>create-enterprise-next</h1>\n <p className={styles.subtitle}>Your enterprise Next.js foundation is ready.</p>\n <div className={styles.card}>\n <h2 className={styles.cardTitle}>Enabled Modules</h2>\n <ul className={styles.list}>\n ${modules}\n </ul>\n </div>\n </div>\n </main>\n );\n}\n`;\n }\n addAppFile(context, `src/app/page.${ext}`, pageContent);\n}\n","import type { GenerationContext } from '../context.js';\nimport { addAppFile } from '../context.js';\n\nexport function generateReadme(context: GenerationContext) {\n const { config } = context;\n\n const pm = config.packageManager;\n const pmRun = pm === 'yarn' ? 'yarn' : `${pm} run`;\n const pmInstall = pm === 'yarn' ? 'yarn' : `${pm} install`;\n\n let content = `# ${config.projectName}\\n\\n`;\n content += `This is an enterprise-grade Next.js application scaffolded with \\`create-enterprise-next\\`.\\n\\n`;\n\n content += `## Tech Stack\\n\\n`;\n content += `- **Framework:** Next.js (App Router)\\n`;\n content += `- **Language:** ${config.typescript ? 'TypeScript' : 'JavaScript'}\\n`;\n content += `- **Styling:** ${config.styling}\\n`;\n content += `- **Authentication:** ${config.auth}\\n`;\n content += `- **ORM:** ${config.orm}${config.database ? ` (${config.database})` : ''}\\n`;\n content += `- **State Management:** ${config.stateManagement}\\n`;\n content += `- **Testing:** ${config.testing.join(', ') || 'None'}\\n`;\n content += `- **CI Pipeline:** ${config.ci}\\n`;\n content += `- **Docker:** ${config.docker ? 'Yes' : 'No'}\\n`;\n content += `- **Monorepo:** ${config.monorepo ? 'Yes' : 'No'}\\n\\n`;\n\n content += `## Getting Started\\n\\n`;\n content += `### 1. Install Dependencies\\n\\n`;\n content += `\\`\\`\\`bash\\n${pmInstall}\\n\\`\\`\\`\\n\\n`;\n\n if (config.orm !== 'none') {\n content += `### 2. Database Setup\\n\\n`;\n content += `Ensure your database is running and the \\`DATABASE_URL\\` is defined in your \\`.env\\` file.\\n\\n`;\n content += `Generate ORM client:\\n`;\n content += `\\`\\`\\`bash\\n${pmRun} db:generate\\n\\`\\`\\`\\n\\n`;\n content += `Push schema / run migrations:\\n`;\n content += `\\`\\`\\`bash\\n${pmRun} db:migrate\\n\\`\\`\\`\\n\\n`;\n }\n\n content += `### 3. Run Development Server\\n\\n`;\n content += `\\`\\`\\`bash\\n${pm} dev\\n\\`\\`\\`\\n\\n`;\n content += `Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.\\n\\n`;\n\n if (config.testing.length > 0) {\n content += `## Testing\\n\\n`;\n if (config.testing.includes('vitest')) {\n content += `- **Vitest:** Run unit/integration tests: \\`${pmRun} test:vitest\\` (or \\`${pmRun} test\\`)\\n`;\n }\n if (config.testing.includes('jest')) {\n content += `- **Jest:** Run unit/integration tests: \\`${pmRun} test:jest\\` (or \\`${pmRun} test\\`)\\n`;\n }\n if (config.testing.includes('playwright')) {\n content += `- **Playwright:** Run end-to-end tests: \\`${pmRun} test:e2e\\`\\n`;\n }\n if (config.testing.includes('cypress')) {\n content += `- **Cypress:** Run Cypress: \\`${pmRun} test:cypress\\` / \\`${pmRun} cypress:open\\`\\n`;\n }\n content += `\\n`;\n }\n\n if (config.docker) {\n content += `## Docker\\n\\n`;\n content += `Build the production Docker image:\\n`;\n content += `\\`\\`\\`bash\\ndocker build -t ${config.projectName} .\\n\\`\\`\\`\\n\\n`;\n content += `Run the container:\\n`;\n content += `\\`\\`\\`bash\\ndocker run -p 3000:3000 ${config.projectName}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (config.auth !== 'none') {\n content += `## Authentication Setup\\n\\n`;\n if (config.auth === 'clerk') {\n content += `This project uses Clerk for authentication. Configure your credentials in \\`.env.local\\`:\\n`;\n content += `- \\`NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY\\`\\n`;\n content += `- \\`CLERK_SECRET_KEY\\`\\n`;\n } else if (config.auth === 'next-auth') {\n content += `This project uses NextAuth.js. Configure \\`AUTH_SECRET\\` in \\`.env.local\\`.\\n`;\n } else if (config.auth === 'auth0') {\n content += `This project uses Auth0. Configure \\`AUTH0_SECRET\\`, \\`AUTH0_BASE_URL\\`, and client variables in \\`.env.local\\`.\\n`;\n }\n content += `\\n`;\n }\n\n addAppFile(context, 'README.md', content);\n}\n","import { dependencyVersions } from '../../dependencies.js';\nimport {\n type GenerationContext,\n addAppFile,\n addDependency,\n addDevDependency,\n} from '../../context.js';\n\nexport async function generateStyling(context: GenerationContext): Promise<void> {\n const { config } = context;\n const ext = config.typescript ? 'tsx' : 'jsx';\n\n if (config.styling === 'tailwind') {\n // Add tailwind dependencies\n addDevDependency(context, 'tailwindcss', dependencyVersions['tailwindcss']);\n addDevDependency(context, 'postcss', dependencyVersions['postcss']);\n addDevDependency(context, 'autoprefixer', dependencyVersions['autoprefixer']);\n\n // PostCSS config\n addAppFile(\n context,\n 'postcss.config.mjs',\n `const config = {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n};\nexport default config;\n`\n );\n\n // Tailwind config\n const tailwindConfigContent = config.typescript\n ? `import type { Config } from \"tailwindcss\";\n\nconst config: Config = {\n content: [\n \"./src/pages/**/*.{js,ts,jsx,tsx,mdx}\",\n \"./src/components/**/*.{js,ts,jsx,tsx,mdx}\",\n \"./src/app/**/*.{js,ts,jsx,tsx,mdx}\",\n ],\n theme: {\n extend: {},\n },\n plugins: [],\n};\nexport default config;\n`\n : `/** @type {import('tailwindcss').Config} */\nconst config = {\n content: [\n \"./src/pages/**/*.{js,ts,jsx,tsx,mdx}\",\n \"./src/components/**/*.{js,ts,jsx,tsx,mdx}\",\n \"./src/app/**/*.{js,ts,jsx,tsx,mdx}\",\n ],\n theme: {\n extend: {},\n },\n plugins: [],\n};\nexport default config;\n`;\n addAppFile(context, `tailwind.config.${config.typescript ? 'ts' : 'js'}`, tailwindConfigContent);\n\n // Globals css with tailwind directives\n addAppFile(\n context,\n 'src/app/globals.css',\n `@tailwind base;\n@tailwind components;\n@tailwind utilities;\n`\n );\n } else if (config.styling === 'css-modules') {\n // Globals CSS\n addAppFile(\n context,\n 'src/app/globals.css',\n `body {\n margin: 0;\n padding: 0;\n background-color: #020617;\n color: #ffffff;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n}\n`\n );\n\n // Page modules\n addAppFile(\n context,\n 'src/app/page.module.css',\n `.main {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n background-color: #020617;\n color: #ffffff;\n padding: 24px;\n}\n.container {\n text-align: center;\n max-width: 640px;\n}\n.title {\n font-size: 36px;\n font-weight: 800;\n margin-bottom: 12px;\n background: linear-gradient(to right, #60a5fa, #34d399);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n.subtitle {\n font-size: 18px;\n color: #94a3b8;\n margin-bottom: 32px;\n}\n.card {\n background-color: #0f172a;\n border: 1px solid #1e293b;\n border-radius: 12px;\n padding: 24px;\n text-align: left;\n}\n.cardTitle {\n font-size: 20px;\n font-weight: 600;\n margin-bottom: 16px;\n color: #e2e8f0;\n}\n.list {\n display: grid;\n grid-template-columns: 1fr;\n gap: 12px;\n list-style: none;\n padding: 0;\n margin: 0;\n color: #94a3b8;\n font-size: 14px;\n}\n@media (min-width: 768px) {\n .list {\n grid-template-columns: 1fr 1fr;\n }\n}\n`\n );\n } else if (config.styling === 'styled-components') {\n // Add styled-components dependency\n addDependency(context, 'styled-components', dependencyVersions['styled-components']);\n\n // Plain globals CSS\n addAppFile(\n context,\n 'src/app/globals.css',\n `body {\n margin: 0;\n padding: 0;\n background-color: #020617;\n color: #ffffff;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n}\n`\n );\n\n // SSR Styled Components Registry\n const registryContent = config.typescript\n ? `'use client';\n\nimport React, { useState } from 'react';\nimport { useServerInsertedHTML } from 'next/navigation';\nimport { ServerStyleSheet, StyleSheetManager } from 'styled-components';\n\nexport default function StyledComponentsRegistry({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [jsxStyleSheet] = useState(() => new ServerStyleSheet());\n\n useServerInsertedHTML(() => {\n const styles = jsxStyleSheet.getStyleElement();\n jsxStyleSheet.instance.clearTag();\n return <>{styles}</>;\n });\n\n if (typeof window !== 'undefined') return <>{children}</>;\n\n return (\n <StyleSheetManager sheet={jsxStyleSheet.instance}>\n {children}\n </StyleSheetManager>\n );\n}\n`\n : `'use client';\n\nimport React, { useState } from 'react';\nimport { useServerInsertedHTML } from 'next/navigation';\nimport { ServerStyleSheet, StyleSheetManager } from 'styled-components';\n\nexport default function StyledComponentsRegistry({ children }) {\n const [jsxStyleSheet] = useState(() => new ServerStyleSheet());\n\n useServerInsertedHTML(() => {\n const styles = jsxStyleSheet.getStyleElement();\n jsxStyleSheet.instance.clearTag();\n return <>{styles}</>;\n });\n\n if (typeof window !== 'undefined') return <>{children}</>;\n\n return (\n <StyleSheetManager sheet={jsxStyleSheet.instance}>\n {children}\n </StyleSheetManager>\n );\n}\n`;\n addAppFile(context, `src/lib/registry.${ext}`, registryContent);\n }\n}\n","import { dependencyVersions } from '../../dependencies.js';\nimport {\n type GenerationContext,\n addAppFile,\n addDependency,\n addEnv,\n} from '../../context.js';\n\nexport async function generateAuthentication(context: GenerationContext): Promise<void> {\n const { config } = context;\n const jsExt = config.typescript ? 'ts' : 'js';\n\n if (config.auth === 'none') {\n return;\n }\n\n if (config.auth === 'clerk') {\n addDependency(context, '@clerk/nextjs', dependencyVersions['@clerk/nextjs']);\n\n // Environment variables\n addEnv(context, 'NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY');\n addEnv(context, 'CLERK_SECRET_KEY');\n addEnv(context, 'NEXT_PUBLIC_CLERK_SIGN_IN_URL', '/sign-in');\n addEnv(context, 'NEXT_PUBLIC_CLERK_SIGN_UP_URL', '/sign-up');\n\n // Middleware\n const middlewareContent = `import { clerkMiddleware } from \"@clerk/nextjs/server\";\n\nexport default clerkMiddleware();\n\nexport const config = {\n matcher: [\n // Skip Next.js internals and all static files, unless found in search params\n '/((?!_next|[^?]*\\\\\\\\.[\\\\\\\\w]+$|_next/image|_next/static|favicon.ico).*)',\n // Always run for API routes\n '/(api|trpc)(.*)',\n ],\n};\n`;\n addAppFile(context, `src/middleware.${jsExt}`, middlewareContent);\n } else if (config.auth === 'next-auth') {\n addDependency(context, 'next-auth', dependencyVersions['next-auth']);\n\n // Environment variables\n addEnv(context, 'AUTH_SECRET');\n addEnv(context, 'AUTH_URL', 'http://localhost:3000');\n\n // auth.ts config\n const authConfigContent = `import NextAuth from \"next-auth\";\n\nexport const { handlers, auth, signIn, signOut } = NextAuth({\n providers: [],\n});\n`;\n addAppFile(context, `src/auth.${jsExt}`, authConfigContent);\n\n // API Route handlers\n const routeContent = `import { handlers } from \"@/auth\";\nexport const { GET, POST } = handlers;\n`;\n addAppFile(context, `src/app/api/auth/[...nextauth]/route.${jsExt}`, routeContent);\n\n // Middleware config\n const middlewareContent = `export { auth as middleware } from \"@/auth\";\n`;\n addAppFile(context, `src/middleware.${jsExt}`, middlewareContent);\n } else if (config.auth === 'auth0') {\n addDependency(context, '@auth0/nextjs-auth0', dependencyVersions['@auth0/nextjs-auth0']);\n\n // Environment variables\n addEnv(context, 'AUTH0_SECRET');\n addEnv(context, 'AUTH0_BASE_URL', 'http://localhost:3000');\n addEnv(context, 'AUTH0_ISSUER_BASE_URL');\n addEnv(context, 'AUTH0_CLIENT_ID');\n addEnv(context, 'AUTH0_CLIENT_SECRET');\n\n // API Route handler\n const routeContent = `import { handleAuth } from '@auth0/nextjs-auth0';\nexport const GET = handleAuth();\n`;\n addAppFile(context, `src/app/api/auth/[auth0]/route.${jsExt}`, routeContent);\n }\n}\n","import { dependencyVersions } from '../../dependencies.js';\nimport {\n type GenerationContext,\n addAppFile,\n addProjectFile,\n addDependency,\n addDevDependency,\n addScript,\n addEnv,\n} from '../../context.js';\n\nexport async function generateOrm(context: GenerationContext): Promise<void> {\n const { config } = context;\n const jsExt = config.typescript ? 'ts' : 'js';\n\n if (config.orm === 'none') {\n return;\n }\n\n // 1. Prisma Scaffolding\n if (config.orm === 'prisma') {\n addDependency(context, '@prisma/client', dependencyVersions['@prisma/client']);\n addDevDependency(context, 'prisma', dependencyVersions['prisma']);\n\n // Add scripts\n addScript(context, 'db:generate', 'prisma generate');\n addScript(context, 'db:migrate', 'prisma migrate dev');\n addScript(context, 'db:studio', 'prisma studio');\n\n // Determine database provider\n let prismaProvider = 'postgresql';\n let defaultDbUrl = '';\n if (config.database === 'mysql') {\n prismaProvider = 'mysql';\n } else if (config.database === 'sqlite') {\n prismaProvider = 'sqlite';\n defaultDbUrl = 'file:./dev.db';\n } else if (config.database === 'mongo') {\n prismaProvider = 'mongodb';\n }\n\n addEnv(context, 'DATABASE_URL', defaultDbUrl);\n\n // prisma/schema.prisma\n const schemaContent = `generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"${prismaProvider}\"\n url = env(\"DATABASE_URL\")\n}\n`;\n addProjectFile(context, 'prisma/schema.prisma', schemaContent);\n\n // Reusable prisma client helper\n const clientContent = config.typescript\n ? `import { PrismaClient } from '@prisma/client';\n\nconst globalForPrisma = globalThis as unknown as {\n prisma: PrismaClient | undefined;\n};\n\nexport const db = globalForPrisma.prisma ?? new PrismaClient();\n\nif (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = db;\n`\n : `import { PrismaClient } from '@prisma/client';\n\nconst globalForPrisma = globalThis;\n\nexport const db = globalForPrisma.prisma ?? new PrismaClient();\n\nif (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = db;\n`;\n addAppFile(context, `src/lib/db.${jsExt}`, clientContent);\n }\n\n // 2. Drizzle Scaffolding\n if (config.orm === 'drizzle') {\n addDependency(context, 'drizzle-orm', dependencyVersions['drizzle-orm']);\n addDevDependency(context, 'drizzle-kit', dependencyVersions['drizzle-kit']);\n\n // Add scripts\n addScript(context, 'db:generate', 'drizzle-kit generate');\n addScript(context, 'db:migrate', 'drizzle-kit migrate');\n addScript(context, 'db:studio', 'drizzle-kit studio');\n\n let drizzleDialect = 'postgresql';\n let defaultDbUrl = '';\n\n if (config.database === 'postgres') {\n drizzleDialect = 'postgresql';\n addDependency(context, 'pg', dependencyVersions['pg']);\n if (config.typescript) {\n addDevDependency(context, '@types/pg', dependencyVersions['@types/pg']);\n }\n } else if (config.database === 'mysql') {\n drizzleDialect = 'mysql';\n addDependency(context, 'mysql2', dependencyVersions['mysql2']);\n } else if (config.database === 'sqlite') {\n drizzleDialect = 'sqlite';\n addDependency(context, 'better-sqlite3', dependencyVersions['better-sqlite3']);\n if (config.typescript) {\n addDevDependency(context, '@types/better-sqlite3', dependencyVersions['@types/better-sqlite3']);\n }\n defaultDbUrl = 'sqlite.db';\n }\n\n addEnv(context, 'DATABASE_URL', defaultDbUrl);\n\n // drizzle.config.ts\n const drizzleConfigContent = `import { defineConfig } from 'drizzle-kit';\n\nexport default defineConfig({\n schema: './src/db/schema.${jsExt}',\n out: './drizzle',\n dialect: '${drizzleDialect}',\n dbCredentials: {\n url: process.env.DATABASE_URL!,\n },\n});\n`;\n addAppFile(context, `drizzle.config.${jsExt}`, drizzleConfigContent);\n\n // src/db/schema.ts\n addAppFile(context, `src/db/schema.${jsExt}`, '// Define your database schema here\\n');\n\n // src/db/index.ts client\n let clientContent = '';\n if (config.database === 'postgres') {\n clientContent = `import { drizzle } from 'drizzle-orm/node-postgres';\nimport pg from 'pg';\nimport * as schema from './schema';\n\nconst pool = new pg.Pool({\n connectionString: process.env.DATABASE_URL,\n});\n\nexport const db = drizzle(pool, { schema });\n`;\n } else if (config.database === 'mysql') {\n clientContent = `import { drizzle } from 'drizzle-orm/mysql2';\nimport mysql from 'mysql2/promise';\nimport * as schema from './schema';\n\nconst pool = mysql.createPool({\n uri: process.env.DATABASE_URL,\n});\n\nexport const db = drizzle(pool, { schema });\n`;\n } else if (config.database === 'sqlite') {\n clientContent = `import { drizzle } from 'drizzle-orm/better-sqlite3';\nimport Database from 'better-sqlite3';\nimport * as schema from './schema';\n\nconst sqlite = new Database(process.env.DATABASE_URL || 'sqlite.db');\nexport const db = drizzle(sqlite, { schema });\n`;\n }\n\n addAppFile(context, `src/db/index.${jsExt}`, clientContent);\n }\n}\n","import { dependencyVersions } from '../../dependencies.js';\nimport {\n type GenerationContext,\n addAppFile,\n addDependency,\n} from '../../context.js';\n\nexport async function generateStateManagement(context: GenerationContext): Promise<void> {\n const { config } = context;\n const ext = config.typescript ? 'tsx' : 'jsx';\n const jsExt = config.typescript ? 'ts' : 'js';\n\n if (config.stateManagement === 'none') {\n return;\n }\n\n if (config.stateManagement === 'zustand') {\n addDependency(context, 'zustand', dependencyVersions['zustand']);\n\n const storeContent = config.typescript\n ? `import { create } from 'zustand';\n\ninterface CounterState {\n count: number;\n increment: () => void;\n decrement: () => void;\n}\n\nexport const useCounterStore = create<CounterState>((set) => ({\n count: 0,\n increment: () => set((state) => ({ count: state.count + 1 })),\n decrement: () => set((state) => ({ count: state.count - 1 })),\n}));\n`\n : `import { create } from 'zustand';\n\nexport const useCounterStore = create((set) => ({\n count: 0,\n increment: () => set((state) => ({ count: state.count + 1 })),\n decrement: () => set((state) => ({ count: state.count - 1 })),\n}));\n`;\n addAppFile(context, `src/stores/counter-store.${jsExt}`, storeContent);\n } else if (config.stateManagement === 'redux') {\n addDependency(context, '@reduxjs/toolkit', dependencyVersions['@reduxjs/toolkit']);\n addDependency(context, 'react-redux', dependencyVersions['react-redux']);\n\n // store.ts configuration\n const storeContent = config.typescript\n ? `import { configureStore } from '@reduxjs/toolkit';\n\nexport const makeStore = () => {\n return configureStore({\n reducer: {},\n });\n};\n\nexport type AppStore = ReturnType<typeof makeStore>;\nexport type RootState = ReturnType<AppStore['getState']>;\nexport type AppDispatch = AppStore['dispatch'];\n`\n : `import { configureStore } from '@reduxjs/toolkit';\n\nexport const makeStore = () => {\n return configureStore({\n reducer: {},\n });\n};\n`;\n addAppFile(context, `src/lib/store.${jsExt}`, storeContent);\n\n // StoreProvider client component wrapper\n const providerContent = config.typescript\n ? `'use client';\nimport { useRef } from 'react';\nimport { Provider } from 'react-redux';\nimport { makeStore, AppStore } from '../lib/store';\n\nexport default function StoreProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const storeRef = useRef<AppStore>(undefined);\n if (!storeRef.current) {\n storeRef.current = makeStore();\n }\n\n return <Provider store={storeRef.current}>{children}</Provider>;\n}\n`\n : `'use client';\nimport { useRef } from 'react';\nimport { Provider } from 'react-redux';\nimport { makeStore } from '../lib/store';\n\nexport default function StoreProvider({ children }) {\n const storeRef = useRef();\n if (!storeRef.current) {\n storeRef.current = makeStore();\n }\n\n return <Provider store={storeRef.current}>{children}</Provider>;\n}\n`;\n addAppFile(context, `src/app/StoreProvider.${ext}`, providerContent);\n } else if (config.stateManagement === 'jotai') {\n addDependency(context, 'jotai', dependencyVersions['jotai']);\n\n // JotaiProvider client component wrapper\n const providerContent = config.typescript\n ? `'use client';\nimport { Provider } from 'jotai';\n\nexport default function JotaiProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n return <Provider>{children}</Provider>;\n}\n`\n : `'use client';\nimport { Provider } from 'jotai';\n\nexport default function JotaiProvider({ children }) {\n return <Provider>{children}</Provider>;\n}\n`;\n addAppFile(context, `src/app/JotaiProvider.${ext}`, providerContent);\n }\n}\n","import { dependencyVersions } from '../../dependencies.js';\nimport {\n type GenerationContext,\n addAppFile,\n addDevDependency,\n addScript,\n} from '../../context.js';\n\nexport async function generateTesting(context: GenerationContext): Promise<void> {\n const { config } = context;\n const ext = config.typescript ? 'tsx' : 'jsx';\n const jsExt = config.typescript ? 'ts' : 'js';\n\n const hasVitest = config.testing.includes('vitest');\n const hasJest = config.testing.includes('jest');\n const hasPlaywright = config.testing.includes('playwright');\n const hasCypress = config.testing.includes('cypress');\n\n if (config.testing.length === 0) {\n return;\n }\n\n const pmRun = config.packageManager === 'yarn' ? 'yarn' : `${config.packageManager} run`;\n\n // 1. Vitest Configuration\n if (hasVitest) {\n addDevDependency(context, 'vitest', dependencyVersions['vitest']);\n addDevDependency(context, '@vitejs/plugin-react', dependencyVersions['@vitejs/plugin-react']);\n addDevDependency(context, 'jsdom', dependencyVersions['jsdom']);\n addDevDependency(context, '@testing-library/react', dependencyVersions['@testing-library/react']);\n addDevDependency(context, '@testing-library/jest-dom', dependencyVersions['@testing-library/jest-dom']);\n\n addScript(context, 'test:vitest', 'vitest run');\n\n const vitestConfig = `import { defineConfig } from 'vitest/config';\nimport react from '@vitejs/plugin-react';\nimport path from 'path';\n\nexport default defineConfig({\n plugins: [react()],\n test: {\n environment: 'jsdom',\n globals: true,\n setupFiles: ['./vitest.setup.${jsExt}'],\n },\n resolve: {\n alias: {\n '@': path.resolve(__dirname, './src'),\n },\n },\n});\n`;\n addAppFile(context, `vitest.config.${jsExt}`, vitestConfig);\n addAppFile(context, `vitest.setup.${jsExt}`, `import '@testing-library/jest-dom';\\n`);\n }\n\n // 2. Jest Configuration\n if (hasJest) {\n addDevDependency(context, 'jest', dependencyVersions['jest']);\n addDevDependency(context, 'jest-environment-jsdom', dependencyVersions['jest-environment-jsdom']);\n addDevDependency(context, '@testing-library/react', dependencyVersions['@testing-library/react']);\n addDevDependency(context, '@testing-library/jest-dom', dependencyVersions['@testing-library/jest-dom']);\n\n if (config.typescript) {\n addDevDependency(context, 'ts-jest', dependencyVersions['ts-jest']);\n addDevDependency(context, 'ts-node', dependencyVersions['ts-node']);\n addDevDependency(context, '@types/jest', dependencyVersions['@types/jest']);\n }\n\n addScript(context, 'test:jest', 'jest');\n\n const jestConfig = config.typescript\n ? `import type { Config } from 'jest';\n\nconst config: Config = {\n preset: 'ts-jest',\n testEnvironment: 'jest-environment-jsdom',\n setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],\n moduleNameMapper: {\n '^@/(.*)$': '<rootDir>/src/$1',\n '\\\\\\\\.css$': 'identity-obj-proxy',\n },\n};\n\nexport default config;\n`\n : `/** @type {import('jest').Config} */\nconst config = {\n testEnvironment: 'jest-environment-jsdom',\n setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],\n moduleNameMapper: {\n '^@/(.*)$': '<rootDir>/src/$1',\n '\\\\\\\\.css$': 'identity-obj-proxy',\n },\n};\n\nexport default config;\n`;\n addAppFile(context, `jest.config.${jsExt}`, jestConfig);\n addAppFile(context, `jest.setup.${jsExt}`, `import '@testing-library/jest-dom';\\n`);\n }\n\n // Generate a shared smoke unit test file if we have either Vitest or Jest\n if (hasVitest || hasJest) {\n // If we only have Vitest, it doesn't need jest/globals.\n // If we have Jest, we can use the Jest specific imports or standard globals.\n // Actually, Vitest has globals: true so test/expect are injected, and Jest does the same natively.\n // Let's generate a perfectly clean global-compatible test file that works in both:\n const cleanSmokeTest = `import { render, screen } from '@testing-library/react';\nimport Page from './page';\n\ntest('renders welcome page', () => {\n render(<Page />);\n const heading = screen.getByRole('heading', { level: 1 });\n expect(heading).toBeInTheDocument();\n});\n`;\n addAppFile(context, `src/app/page.test.${ext}`, cleanSmokeTest);\n }\n\n // 3. Playwright Configuration\n if (hasPlaywright) {\n addDevDependency(context, '@playwright/test', dependencyVersions['@playwright/test']);\n addScript(context, 'test:e2e', 'playwright test');\n\n const devCommand = config.packageManager === 'npm' ? 'npm run dev' : `${config.packageManager} dev`;\n\n const playwrightConfig = `import { defineConfig, devices } from '@playwright/test';\n\nexport default defineConfig({\n testDir: './tests/e2e',\n fullyParallel: true,\n forbidOnly: !!process.env.CI,\n retries: process.env.CI ? 2 : 0,\n workers: process.env.CI ? 1 : undefined,\n reporter: 'html',\n use: {\n baseURL: 'http://localhost:3000',\n trace: 'on-first-retry',\n },\n projects: [\n {\n name: 'chromium',\n use: { ...devices['Desktop Chrome'] },\n },\n ],\n webServer: {\n command: '${devCommand}',\n url: 'http://localhost:3000',\n reuseExistingServer: !process.env.CI,\n },\n});\n`;\n addAppFile(context, `playwright.config.${jsExt}`, playwrightConfig);\n\n const playwrightSmokeTest = `import { test, expect } from '@playwright/test';\n\ntest('should display home page', async ({ page }) => {\n await page.goto('/');\n await expect(page.locator('h1')).toContainText('create-enterprise-next');\n});\n`;\n addAppFile(context, `tests/e2e/smoke.spec.${jsExt}`, playwrightSmokeTest);\n }\n\n // 4. Cypress Configuration\n if (hasCypress) {\n addDevDependency(context, 'cypress', dependencyVersions['cypress']);\n addScript(context, 'test:cypress', 'cypress run');\n addScript(context, 'cypress:open', 'cypress open');\n\n const cypressConfig = `import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n e2e: {\n baseUrl: 'http://localhost:3000',\n supportFile: false,\n },\n});\n`;\n addAppFile(context, `cypress.config.${jsExt}`, cypressConfig);\n\n const cypressSmokeTest = `describe('Smoke Test', () => {\n it('should display home page', () => {\n cy.visit('/');\n cy.get('h1').should('contain', 'create-enterprise-next');\n });\n});\n`;\n addAppFile(context, `cypress/e2e/smoke.cy.${jsExt}`, cypressSmokeTest);\n }\n\n // 5. Consolidated unit test script\n if (hasVitest && hasJest) {\n addScript(context, 'test', `${pmRun} test:vitest && ${pmRun} test:jest`);\n } else if (hasVitest) {\n addScript(context, 'test', `${pmRun} test:vitest`);\n } else if (hasJest) {\n addScript(context, 'test', `${pmRun} test:jest`);\n }\n}\n","import type { GenerationContext } from '../../context.js';\nimport { addProjectFile } from '../../context.js';\n\nexport async function generateCi(context: GenerationContext): Promise<void> {\n const { config } = context;\n\n if (config.ci === 'none') {\n return;\n }\n\n const pm = config.packageManager;\n const hasTesting = config.testing.length > 0;\n\n // Determine commands dynamically based on package manager\n let installCmd = 'npm ci';\n let runPrefix = 'npm run';\n let cacheName = 'npm';\n\n if (pm === 'pnpm') {\n installCmd = 'pnpm install';\n runPrefix = 'pnpm run';\n cacheName = 'pnpm';\n } else if (pm === 'yarn') {\n installCmd = 'yarn install';\n runPrefix = 'yarn';\n cacheName = 'yarn';\n } else if (pm === 'bun') {\n installCmd = 'bun install';\n runPrefix = 'bun run';\n cacheName = 'bun';\n }\n\n // 1. GitHub Actions Scaffolding\n if (config.ci === 'github-actions') {\n let steps = ` - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: 20\n`;\n\n if (pm === 'pnpm') {\n steps += `\n - name: Setup pnpm\n uses: pnpm/action-setup@v3\n with:\n version: 9\n`;\n } else if (pm === 'bun') {\n steps += `\n - name: Setup Bun\n uses: oven-sh/setup-bun@v1\n with:\n bun-version: latest\n`;\n }\n\n // Add cache if setup-node supports it\n if (pm === 'npm' || pm === 'yarn') {\n steps += ` cache: '${cacheName}'\\n`;\n }\n\n steps += `\n - name: Install dependencies\n run: ${installCmd}\n\n - name: Lint\n run: ${runPrefix} lint\n`;\n\n if (config.typescript) {\n steps += `\n - name: Typecheck\n run: ${runPrefix} typecheck\n`;\n }\n\n if (hasTesting) {\n steps += `\n - name: Run tests\n run: ${runPrefix} test\n`;\n }\n\n steps += `\n - name: Build\n run: ${runPrefix} build\n`;\n\n const workflowContent = `name: CI\n\non:\n push:\n branches: [ main, master ]\n pull_request:\n branches: [ main, master ]\n\njobs:\n validate:\n runs-on: ubuntu-latest\n\n steps:\n${steps}\n`;\n addProjectFile(context, '.github/workflows/ci.yml', workflowContent);\n }\n\n // 2. GitLab CI Scaffolding\n if (config.ci === 'gitlab-ci') {\n let beforeScript = '';\n let image = 'node:20';\n\n if (pm === 'pnpm') {\n beforeScript = ` - corepack enable pnpm\n - pnpm install\n`;\n } else if (pm === 'bun') {\n image = 'oven/bun:latest';\n beforeScript = ` - bun install\n`;\n } else if (pm === 'yarn') {\n beforeScript = ` - yarn install\n`;\n } else {\n beforeScript = ` - npm ci\n`;\n }\n\n let scriptSteps = ` - ${runPrefix} lint\\n`;\n if (config.typescript) {\n scriptSteps += ` - ${runPrefix} typecheck\\n`;\n }\n if (hasTesting) {\n scriptSteps += ` - ${runPrefix} test\\n`;\n }\n scriptSteps += ` - ${runPrefix} build`;\n\n const gitlabContent = `image: ${image}\n\ncache:\n paths:\n - node_modules/\n ${pm === 'pnpm' ? '- .pnpm-store/' : ''}\n\nstages:\n - validate\n\nvalidate_job:\n stage: validate\n before_script:\n${beforeScript}\n script:\n${scriptSteps}\n`;\n addProjectFile(context, '.gitlab-ci.yml', gitlabContent);\n }\n}\n","import type { GenerationContext } from '../../context.js';\nimport { addAppFile } from '../../context.js';\n\nexport async function generateDocker(context: GenerationContext): Promise<void> {\n const { config } = context;\n\n if (!config.docker) {\n return;\n }\n\n // Dockerfile using standalone output\n const dockerfileContent = `# Multi-stage production Dockerfile for Next.js standalone output\nFROM node:20-alpine AS base\n\n# Stage 1: Install dependencies\nFROM base AS deps\nRUN apk add --no-cache libc6-compat\nWORKDIR /app\n\n# Copy lockfiles and package definitions\nCOPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* bun.lockb* ./\n\nRUN \\\\\n if [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \\\\\n elif [ -f package-lock.json ]; then npm ci; \\\\\n elif [ -f yarn.lock ]; then yarn --frozen-lockfile; \\\\\n elif [ -f bun.lockb ]; then bun install --frozen-lockfile; \\\\\n else echo \"Warning: No lockfile found. Installing normal dependencies.\" && npm install; \\\\\n fi\n\n# Stage 2: Build the application\nFROM base AS builder\nWORKDIR /app\nCOPY --from=deps /app/node_modules ./node_modules\nCOPY . .\n\n# Disable Next.js telemetry during build\nENV NEXT_TELEMETRY_DISABLED=1\n\nRUN \\\\\n if [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \\\\\n elif [ -f package-lock.json ]; then npm run build; \\\\\n elif [ -f yarn.lock ]; then yarn build; \\\\\n elif [ -f bun.lockb ]; then bun run build; \\\\\n else npm run build; \\\\\n fi\n\n# Stage 3: Production runner\nFROM base AS runner\nWORKDIR /app\n\nENV NODE_ENV=production\nENV NEXT_TELEMETRY_DISABLED=1\n\nRUN addgroup --system --gid 1001 nodejs\nRUN adduser --system --uid 1001 nextjs\n\n# Copy static assets and public directory\nCOPY --from=builder /app/public ./public\n\n# Setup prerender cache directory permissions\nRUN mkdir .next\nRUN chown nextjs:nodejs .next\n\n# Leverage output traces to reduce image size (standalone output copy)\nCOPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./\nCOPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static\n\nUSER nextjs\n\nEXPOSE 3000\nENV PORT=3000\nENV HOSTNAME=\"0.0.0.0\"\n\nCMD [\"node\", \"server.js\"]\n`;\n\n const dockerignoreContent = `node_modules\n.next\nout\nbuild\n.dockerignore\nDockerfile\n.git\n.github\n.gitlab-ci.yml\nREADME.md\n`;\n\n addAppFile(context, 'Dockerfile', dockerfileContent);\n addAppFile(context, '.dockerignore', dockerignoreContent);\n}\n","import { dependencyVersions } from '../../dependencies.js';\nimport type { GenerationContext } from '../../context.js';\nimport {\n addProjectFile,\n addRootDevDependency,\n} from '../../context.js';\n\nexport async function generateMonorepo(context: GenerationContext): Promise<void> {\n const { config } = context;\n\n if (!config.monorepo) {\n return;\n }\n\n // Add turbo to root devDependencies\n addRootDevDependency(context, 'turbo', dependencyVersions['turbo']);\n\n // pnpm-workspace.yaml\n const workspaceContent = `packages:\n - 'apps/*'\n - 'packages/*'\n`;\n addProjectFile(context, 'pnpm-workspace.yaml', workspaceContent);\n\n // turbo.json\n const turboContent = {\n $schema: 'https://turbo.build/schema.json',\n tasks: {\n build: {\n dependsOn: ['^build'],\n outputs: ['.next/**', '!.next/cache/**'],\n },\n lint: {},\n typecheck: {},\n },\n };\n addProjectFile(context, 'turbo.json', JSON.stringify(turboContent, null, 2) + '\\n');\n\n // Scaffold subpackages placeholders\n const configPkg = {\n name: '@enterprise/config',\n version: '0.0.0',\n private: true,\n };\n addProjectFile(context, 'packages/config/package.json', JSON.stringify(configPkg, null, 2) + '\\n');\n\n const typesPkg = {\n name: '@enterprise/types',\n version: '0.0.0',\n private: true,\n };\n addProjectFile(context, 'packages/types/package.json', JSON.stringify(typesPkg, null, 2) + '\\n');\n\n const uiPkg = {\n name: '@enterprise/ui',\n version: '0.0.0',\n private: true,\n };\n addProjectFile(context, 'packages/ui/package.json', JSON.stringify(uiPkg, null, 2) + '\\n');\n}\n","import type { GenerationContext } from './context.js';\n\n/**\n * Compiles the manifest data into package.json virtual files.\n */\nexport function compilePackageJsons(context: GenerationContext) {\n const { config, manifest } = context;\n\n const sortKeys = (obj: Record<string, string>): Record<string, string> => {\n const sorted: Record<string, string> = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = obj[key]!;\n }\n return sorted;\n };\n\n // Base application scripts\n const appScripts: Record<string, string> = {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n lint: 'next lint',\n ...manifest.scripts,\n };\n\n if (config.typescript) {\n appScripts.typecheck = 'tsc --noEmit';\n }\n\n const appPkg: Record<string, unknown> = {\n name: config.monorepo ? 'web' : config.projectName,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: sortKeys(appScripts),\n dependencies: sortKeys(manifest.dependencies),\n devDependencies: sortKeys(manifest.devDependencies),\n };\n\n if (config.monorepo) {\n // Add app package.json under apps/web\n context.manifest.files.set(\n 'apps/web/package.json',\n JSON.stringify(appPkg, null, 2) + '\\n'\n );\n\n // Build root package.json scripts\n const rootScripts: Record<string, string> = {\n dev: 'turbo dev',\n build: 'turbo build',\n lint: 'turbo lint',\n ...manifest.rootScripts,\n };\n if (config.typescript) {\n rootScripts.typecheck = 'turbo typecheck';\n }\n\n const rootPkg: Record<string, unknown> = {\n name: config.projectName,\n version: '0.1.0',\n private: true,\n type: 'module',\n workspaces: ['apps/*', 'packages/*'],\n scripts: sortKeys(rootScripts),\n dependencies: sortKeys(manifest.rootDependencies),\n devDependencies: sortKeys(manifest.rootDevDependencies),\n };\n\n context.manifest.files.set(\n 'package.json',\n JSON.stringify(rootPkg, null, 2) + '\\n'\n );\n } else {\n // Single application package.json at root\n context.manifest.files.set(\n 'package.json',\n JSON.stringify(appPkg, null, 2) + '\\n'\n );\n }\n}\n","import pc from 'picocolors';\nimport type { GenerationContext } from './context.js';\n\nexport function printGenerationSummary(context: GenerationContext) {\n const { config } = context;\n\n const getTestingLabel = () => {\n if (config.testing.length === 0) return 'None';\n return config.testing.map((t) => {\n if (t === 'vitest') return 'Vitest';\n if (t === 'jest') return 'Jest';\n if (t === 'playwright') return 'Playwright';\n if (t === 'cypress') return 'Cypress';\n return t;\n }).join(', ');\n };\n\n const getStylingLabel = () => {\n if (config.styling === 'tailwind') return 'Tailwind CSS';\n if (config.styling === 'css-modules') return 'CSS Modules';\n if (config.styling === 'styled-components') return 'Styled Components';\n return config.styling;\n };\n\n const getAuthLabel = () => {\n if (config.auth === 'none') return 'None';\n if (config.auth === 'clerk') return 'Clerk';\n if (config.auth === 'next-auth') return 'NextAuth.js';\n if (config.auth === 'auth0') return 'Auth0';\n return config.auth;\n };\n\n const getOrmLabel = () => {\n if (config.orm === 'none') return 'None';\n if (config.orm === 'prisma') return 'Prisma';\n if (config.orm === 'drizzle') return 'Drizzle';\n return config.orm;\n };\n\n const getDbLabel = () => {\n if (!config.database) return 'None';\n if (config.database === 'postgres') return 'PostgreSQL';\n if (config.database === 'mysql') return 'MySQL';\n if (config.database === 'sqlite') return 'SQLite';\n if (config.database === 'mongo') return 'MongoDB';\n return config.database;\n };\n\n const getCiLabel = () => {\n if (config.ci === 'none') return 'None';\n if (config.ci === 'github-actions') return 'GitHub Actions';\n if (config.ci === 'gitlab-ci') return 'GitLab CI';\n return config.ci;\n };\n\n const getStateLabel = () => {\n if (config.stateManagement === 'none') return 'None';\n if (config.stateManagement === 'zustand') return 'Zustand';\n if (config.stateManagement === 'redux') return 'Redux Toolkit';\n if (config.stateManagement === 'jotai') return 'Jotai';\n return config.stateManagement;\n };\n\n console.log('\\n' + pc.green('✔ Project created successfully') + '\\n');\n\n console.log(` ${pc.bold('Project:')} ${config.projectName}`);\n console.log(` ${pc.bold('Language:')} ${config.typescript ? 'TypeScript' : 'JavaScript'}`);\n console.log(` ${pc.bold('Framework:')} Next.js (App Router)`);\n console.log(` ${pc.bold('Styling:')} ${getStylingLabel()}`);\n console.log(` ${pc.bold('Auth:')} ${getAuthLabel()}`);\n console.log(` ${pc.bold('ORM:')} ${getOrmLabel()}`);\n if (config.orm !== 'none') {\n console.log(` ${pc.bold('Database:')} ${getDbLabel()}`);\n }\n console.log(` ${pc.bold('State Mgmt:')} ${getStateLabel()}`);\n console.log(` ${pc.bold('Testing:')} ${getTestingLabel()}`);\n console.log(` ${pc.bold('CI:')} ${getCiLabel()}`);\n console.log(` ${pc.bold('Docker:')} ${config.docker ? 'Yes' : 'No'}`);\n console.log(` ${pc.bold('Monorepo:')} ${config.monorepo ? 'Yes (Turborepo)' : 'No'}`);\n console.log(` ${pc.bold('Package Mgr:')} ${config.packageManager}`);\n console.log();\n\n console.log(pc.cyan('Next steps:'));\n console.log();\n console.log(` cd ${config.projectName}`);\n\n const pm = config.packageManager;\n if (pm === 'npm') {\n console.log(` npm install`);\n console.log(` npm run dev`);\n } else if (pm === 'pnpm') {\n console.log(` pnpm install`);\n console.log(` pnpm dev`);\n } else if (pm === 'yarn') {\n console.log(` yarn`);\n console.log(` yarn dev`);\n } else if (pm === 'bun') {\n console.log(` bun install`);\n console.log(` bun dev`);\n }\n console.log();\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (msg: string) => console.log(pc.blue('ℹ ') + msg),\n success: (msg: string) => console.log(pc.green('✔ ') + msg),\n warn: (msg: string) => console.warn(pc.yellow('⚠ ') + msg),\n error: (msg: string) => console.error(pc.red('✖ ') + msg),\n log: (msg: string) => console.log(msg),\n};\n"],"mappings":"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","names":["Command","fs","path","fs","path","clack","fs","path","fs","path","fs","pc","pc","path","fs","Command"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-enterprise-next",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "CLI tool to scaffold enterprise-grade Next.js projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -44,13 +44,15 @@
|
|
|
44
44
|
"eslint": "^8.57.0",
|
|
45
45
|
"prettier": "^3.3.2",
|
|
46
46
|
"tsup": "^8.1.0",
|
|
47
|
-
"typescript": "^5.5.2"
|
|
47
|
+
"typescript": "^5.5.2",
|
|
48
|
+
"vitest": "^2.1.8"
|
|
48
49
|
},
|
|
49
50
|
"scripts": {
|
|
50
51
|
"build": "tsup",
|
|
51
52
|
"dev": "tsup --watch",
|
|
52
53
|
"typecheck": "tsc --noEmit",
|
|
53
54
|
"lint": "eslint src --ext .ts",
|
|
54
|
-
"format": "prettier --write \"src/**/*.ts\""
|
|
55
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
56
|
+
"test": "vitest run"
|
|
55
57
|
}
|
|
56
58
|
}
|