{"version":3,"file":"index.cjs","names":["platform","execFile"],"sources":["../src/config/index.ts","../src/cli/banner.ts","../src/utils/shell.ts","../src/utils/terminate.ts","../src/utils/package-utils.ts","../src/utils/utility.ts","../src/cli/prompts.ts","../src/cli/display.ts","../src/generators/env.ts","../src/generators/scripts.ts","../src/generators/package-config.ts","../src/generators/prettier-config.ts","../src/managers/config-manager.ts","../src/managers/package-manager.ts","../src/core/installer.ts","../src/core/validator.ts","../src/core/config-builder.ts","../src/devtools/docker.ts","../src/devtools/git.ts","../src/devtools/husky.ts","../src/devtools/prettier.ts","../src/devtools/orms.ts","../src/auth/clerk.ts","../src/auth/better-auth.ts","../src/auth/auth.ts","../src/devtools/proxy.ts","../src/devtools/redis.ts","../src/devtools/vitest.ts","../src/devtools/logger.ts","../src/devtools/dev-tools.ts","../src/devtools/directories.ts","../src/core/project-manager.ts","../src/index.ts"],"sourcesContent":["import type { ScriptConfig, INTERACTIVE_PROMPTS } from \"../types\";\n\nexport const tsconfigJson = \"tsconfig.json\";\n\nexport const languages: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"JavaScript\",\n        emoji: \"🟡\",\n        value: \"js\",\n        hint: \"Flexible and forgiving\",\n    },\n    {\n        label: \"TypeScript\",\n        emoji: \"🔵\",\n        value: \"ts\",\n        hint: \"JavaScript with trust issues\",\n    },\n];\n\nexport const modes: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"Development\",\n        emoji: \"🛠️\",\n        value: \"development\",\n        hint: \"Break things freely\",\n    },\n    {\n        label: \"Production\",\n        emoji: \"🚀\",\n        value: \"production\",\n        hint: \"No room for mistakes\",\n    },\n];\n\nexport const tools: INTERACTIVE_PROMPTS[] = [\n    { label: \"Git\", emoji: \"🐙\", value: \"git\", hint: \"Real version control\" },\n    {\n        label: \"Prettier\",\n        emoji: \"✨\",\n        value: \"prettier\",\n        hint: \"Ends formatting wars\",\n    },\n    {\n        label: \"Logger\",\n        emoji: \"🪵\",\n        value: \"logger\",\n        hint: \"Structured app logging\",\n    },\n    {\n        label: \"Vitest\",\n        emoji: \"🧪\",\n        value: \"vitest\",\n        hint: \"Fast, modern testing\",\n    },\n    {\n        label: \"Docker\",\n        emoji: \"🐳\",\n        value: \"docker\",\n        hint: \"Works everywhere, promise\",\n    },\n    { label: \"Husky\", emoji: \"🐶\", value: \"husky\", hint: \"Blocks bad commits\" },\n];\n\nexport const loggers: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"Winston\",\n        emoji: \"🪵\",\n        value: \"winston\",\n        hint: \"Flexible and widely used\",\n    },\n    {\n        label: \"Pino\",\n        emoji: \"🌲\",\n        value: \"pino\",\n        hint: \"Blazing fast, low overhead\",\n    },\n];\n\nexport const database_types: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"SQL\",\n        emoji: \"🗃️\",\n        value: \"sql\",\n        hint: \"Structured and relational\",\n    },\n    {\n        label: \"NoSQL\",\n        emoji: \"🌿\",\n        value: \"no_sql\",\n        hint: \"Flexible schemas\",\n    },\n];\n\nexport const pkg_managers: INTERACTIVE_PROMPTS[] = [\n    { label: \"None\", emoji: \"🚫\", value: \"none\", hint: \"Living dangerously\" },\n    { label: \"npm\", emoji: \"📦\", value: \"npm\", hint: \"The default choice\" },\n    {\n        label: \"yarn\",\n        emoji: \"🧶\",\n        value: \"yarn\",\n        hint: \"Deterministic lockfiles\",\n    },\n    {\n        label: \"pnpm\",\n        emoji: \"🚀\",\n        value: \"pnpm\",\n        hint: \"Fast and disk-friendly\",\n    },\n    {\n        label: \"bun\",\n        emoji: \"🥟\",\n        value: \"bun\",\n        hint: \"Runtime and manager in one\",\n    },\n];\n\nexport const sql_database: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"MySQL\",\n        emoji: \"🐬\",\n        value: \"mysql\",\n        hint: \"Industry standard\",\n    },\n    {\n        label: \"MariaDB\",\n        emoji: \"🦭\",\n        value: \"mariadb\",\n        hint: \"MySQL's open-source cousin\",\n    },\n    {\n        label: \"SQLite\",\n        emoji: \"🪶\",\n        value: \"sqlite\",\n        hint: \"Zero-config, file-based\",\n    },\n    {\n        label: \"PostgreSQL\",\n        emoji: \"🐘\",\n        value: \"postgres\",\n        hint: \"Developer favorite\",\n    },\n];\n\nexport const no_sql_database: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"MongoDB\",\n        emoji: \"🍃\",\n        value: \"mongodb\",\n        hint: \"Document-based storage\",\n    },\n];\n\nexport const sql_orms: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"Prisma\",\n        emoji: \"📐\",\n        value: \"prisma\",\n        hint: \"Type-safe and intuitive\",\n    },\n    {\n        label: \"Drizzle\",\n        emoji: \"⚡\",\n        value: \"drizzle\",\n        hint: \"Lightweight, SQL-first\",\n    },\n    {\n        label: \"TypeORM\",\n        emoji: \"🏗️\",\n        value: \"typeorm\",\n        hint: \"Classic decorator-based ORM\",\n    },\n    {\n        label: \"Sequelize\",\n        emoji: \"🐚\",\n        value: \"sequelize\",\n        hint: \"Battle-tested for Node.js\",\n    },\n];\n\nexport const no_sql_orms: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"Prisma\",\n        emoji: \"📐\",\n        value: \"prisma\",\n        hint: \"Type-safe and intuitive\",\n    },\n    {\n        label: \"TypeORM\",\n        emoji: \"🏗️\",\n        value: \"typeorm\",\n        hint: \"Classic decorator-based ORM\",\n    },\n    {\n        label: \"Mongoose\",\n        emoji: \"🦦\",\n        value: \"mongoose\",\n        hint: \"Schema-based modeling\",\n    },\n    {\n        label: \"Native Driver\",\n        emoji: \"🌱\",\n        value: \"native_driver\",\n        hint: \"Raw, direct access\",\n    },\n];\n\nexport const authLibraries: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"Better Auth\",\n        emoji: \"🔒\",\n        value: \"better-auth\",\n        hint: \"Drizzle, Prisma, Mongo native only\",\n    },\n    {\n        label: \"Clerk\",\n        emoji: \"🔑\",\n        value: \"clerk\",\n        hint: \"Drop-in auth, zero hassle\",\n    },\n];\n\nexport const WEB_SERVERS: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"Nginx\",\n        emoji: \"⚡\",\n        value: \"nginx\",\n        hint: \"Battle-tested go-to\",\n    },\n    {\n        label: \"Caddy\",\n        emoji: \"🪄\",\n        value: \"caddy\",\n        hint: \"Automatic HTTPS\",\n    },\n    {\n        label: \"Traefik\",\n        emoji: \"🛣️\",\n        value: \"traefik\",\n        hint: \"Built for containers\",\n    },\n];\n\nexport const USES_OF_WEB_SERVER: INTERACTIVE_PROMPTS[] = [\n    {\n        label: \"Reverse Proxy\",\n        emoji: \"🚦\",\n        value: \"reverse_proxy\",\n        hint: \"Route to the right service\",\n    },\n    {\n        label: \"Load Balancing\",\n        emoji: \"⚖️\",\n        value: \"load_balancing\",\n        hint: \"Spread the load\",\n    },\n];\n\nexport const DIRECTORIES: string[] = [\n    \"middlewares\",\n    \"services\",\n    \"types\",\n    \"lib\",\n];\n\nexport const BASE_PACKAGES = [\"express\"];\nexport const DEV_DEPENDENCIES = [\"vitest\", \"supertest\"];\nexport const ADDITION_PACKAGES = [\"cors\", \"helmet\", \"express-rate-limit\"];\n\nexport const TS_DEV_PACKAGES = [\n    \"@types/node\",\n    \"@types/express\",\n    \"typescript\",\n    \"concurrently\",\n];\nexport const TS_DEV_DEPENDENCIES = [\"@types/supertest\"];\nexport const TS_ADDITIONAL_PACKAGES = [\"@types/cors\"];\n\nexport const installCmdMap: Record<string, string> = {\n    npm: \"install\",\n    pnpm: \"add\",\n    yarn: \"add\",\n    bun: \"add\",\n};\n\nexport const envConfig = {\n    NODE_ENV: \"development\",\n    PORT: \"3000\",\n    CLIENT_ORIGIN: \"http://localhost:5173\",\n    BETTER_AUTH_URL: \"http://localhost:3000\",\n    BETTER_AUTH_SECRET: \"D6XJhKQQAYOc4StRfLV0qibGhN3WMEiP\",\n    CLERK_PUBLISHABLE_KEY: \"<clerk-publishable-key>\",\n    CLERK_SECRET_KEY: \"<clerk-secret-key>\",\n};\n\nexport const tsScripts: ScriptConfig = {\n    build: \"tsc\",\n    \"build:watch\": \"tsc --watch\",\n    start: \"node --env-file=.env dist/main.js\",\n    \"start:watch\": \"node --watch --env-file=.env dist/main.js\",\n    dev: 'concurrently \"npm run build:watch\" \"npm run start:watch\"',\n};\n\nexport const jsScripts: ScriptConfig = {\n    dev: \"node --watch --env-file=.env src/main.js\",\n    start: \"node --env-file=.env src/main.js\",\n};\n\nexport const prettierScripts: ScriptConfig = {\n    format: \"prettier --write .\",\n};\n\nexport const vitestScripts: ScriptConfig = {\n    test: \"vitest\",\n};\n\nexport const dockerScripts: ScriptConfig = {\n    \"docker:dev\": \"docker compose -f compose.yaml -f compose.dev.yaml up -d\",\n    \"docker:dev:down\":\n        \"docker compose -f compose.yaml -f compose.dev.yaml down\",\n    \"docker:prod\": \"docker compose -f compose.yaml -f compose.prod.yaml up -d\",\n    \"docker:prod:down\":\n        \"docker compose -f compose.yaml -f compose.prod.yaml down\",\n    \"docker:prod:build\":\n        \"docker compose -f compose.yaml -f compose.prod.yaml up -d --build\",\n    \"docker:prod:scale\":\n        \"docker compose -f compose.yaml -f compose.prod.yaml up -d --scale server=3\",\n};\n\nexport const BANNER_FONT = \"Standard\";\nexport const HUSKY_COMMIT_FILE_NAME = \"pre-commit\";\nexport const betterAuthAdapterSupport = [\"drizzle\", \"prisma\", \"native_driver\"];\n","import figlet from \"figlet\";\nimport { BANNER_FONT } from \"../config\";\n\nexport function displayBanner(): void {\n    console.clear();\n\n    const banner = figlet.textSync(\"Excli\", {\n        font: BANNER_FONT,\n        horizontalLayout: \"full\",\n        verticalLayout: \"full\",\n    });\n\n    console.log(`\\x1b[96m ${banner} \\x1b[0m`);\n}\n","import { platform } from \"node:process\";\nimport { spawnSync, spawn } from \"node:child_process\";\nimport type { PackageManager } from \"../types\";\n\nexport function hasPkManager(pkgM: PackageManager): boolean {\n    if (pkgM === \"none\") return true;\n    const command = platform !== \"win32\" ? \"which\" : \"where\";\n    const result = spawnSync(command, [pkgM], { encoding: \"utf-8\" });\n    return result.status === 0;\n}\n\nexport function hasGit() {\n    const command = platform !== \"win32\" ? \"which\" : \"where\";\n    const result = spawnSync(command, [\"git\"], { encoding: \"utf-8\" });\n    return result.status === 0;\n}\n\nexport function fireShell(command: string, targetDir: string = process.cwd()) {\n    return new Promise((resolve, reject) => {\n        const child = spawn(command, {\n            cwd: targetDir,\n            stdio: \"ignore\",\n            shell: true,\n        });\n\n        child.on(\"close\", (code) => {\n            if (code !== 0)\n                reject(new Error(`Command failed with code ${code}`));\n            else resolve(\"\");\n        });\n\n        child.on(\"error\", (err) => reject(err));\n    });\n}\n","import { cancel } from \"@clack/prompts\";\n\nexport function terminate(message: string): never {\n    cancel(message);\n    process.exit(0);\n}\n","export async function getPackageLatestVersion(packageName: string) {\n    const URL = `https://registry.npmjs.org/${packageName}/latest`;\n    try {\n        const response = await fetch(URL);\n        if (!response.ok) throw new Error(\"failed to fetch:\");\n        const { version } = (await response.json()) as { version: string };\n        return version;\n    } catch (error) {\n        throw new Error(\n            `Failed to fetch version for ${packageName}: Error: ${error}`,\n        );\n    }\n}\n\nexport async function formatPackageVersions(packages: string[] = []) {\n    const formattedPackages = Object.fromEntries(\n        await Promise.all(\n            packages.map(async (pkg) => [\n                pkg,\n                `^${await getPackageLatestVersion(pkg)}`,\n            ]),\n        ),\n    );\n    return formattedPackages;\n}\n","import { cp, mkdir, writeFile } from \"node:fs/promises\";\nimport type {\n    GenerateFileArgs,\n    INTERACTIVE_PROMPTS,\n    Language,\n    ProjectConfig,\n} from \"../types\";\nimport { betterAuthAdapterSupport } from \"../config\";\n\nexport async function makeDirectory(directoryPath: string) {\n    try {\n        await mkdir(directoryPath, { recursive: true });\n    } catch (error) {\n        throw new Error(`Failed to create directory: ${error}`);\n    }\n}\n\nexport async function copy(\n    config: Pick<ProjectConfig, \"templatePath\" | \"targetDir\">,\n) {\n    const { templatePath: copyPath, targetDir } = config;\n    try {\n        await cp(copyPath, targetDir, { recursive: true });\n    } catch (error) {\n        throw new Error(`Failed to copy: ${error}`);\n    }\n}\n\nexport async function generateFile(fileArgs: GenerateFileArgs) {\n    try {\n        const { fileLocation, fileContent } = fileArgs;\n        await writeFile(fileLocation, fileContent, \"utf-8\");\n    } catch (error) {\n        throw new Error(`failed to generate file: ${error}`);\n    }\n}\n\nexport function generateOptions(options: INTERACTIVE_PROMPTS[]) {\n    return options.map(({ label, emoji, value, disabled, hint }) => ({\n        label: `${label} ${emoji}`,\n        value,\n        disabled,\n        hint,\n    }));\n}\n\nexport function appendLanguageExtension(lang: Language, ...paths: string[]) {\n    const extension = lang === \"ts\" ? \".ts\" : \".js\";\n    const files = paths.map((file) => file.concat(extension));\n    return files;\n}\n\nexport function getAuthLibraryOptions(\n    databaseOrm?: string,\n): INTERACTIVE_PROMPTS[] {\n    return [\n        {\n            label: \"Better Auth\",\n            emoji: \"🔒\",\n            value: \"better-auth\",\n            disabled: !betterAuthAdapterSupport.includes(databaseOrm ?? \"\"),\n            hint: \"Drizzle, Prisma, Mongo native only\",\n        },\n        {\n            label: \"Clerk\",\n            emoji: \"🔑\",\n            value: \"clerk\",\n            disabled: false,\n            hint: \"Drop-in auth, zero hassle\",\n        },\n    ];\n}\n","import {\n    text,\n    select,\n    multiselect,\n    isCancel,\n    confirm,\n    note,\n} from \"@clack/prompts\";\nimport { generateOptions, getAuthLibraryOptions, terminate } from \"../utils\";\nimport type { Cache, DATABASE_TYPE, ProjectConfig } from \"../types\";\nimport {\n    database_types,\n    languages,\n    loggers,\n    modes,\n    no_sql_database,\n    no_sql_orms,\n    pkg_managers,\n    sql_database,\n    sql_orms,\n    tools,\n    USES_OF_WEB_SERVER,\n    WEB_SERVERS,\n} from \"../config\";\n\nexport async function promptDirectory(): Promise<string> {\n    const directory = (await text({\n        message: \"What should we name your server directory?\",\n        placeholder: \"server (press Enter for current directory)\",\n    })) as string;\n\n    if (isCancel(directory)) terminate(\"Process cancelled ❌\");\n\n    return directory;\n}\n\nexport async function promptLanguage(): Promise<ProjectConfig[\"language\"]> {\n    const language = await select({\n        message: \"Select your programming language:\",\n        options: generateOptions(languages),\n    });\n\n    if (isCancel(language)) terminate(\"Process cancelled ❌\");\n\n    return language as ProjectConfig[\"language\"];\n}\n\nexport async function promptMode(): Promise<ProjectConfig[\"mode\"]> {\n    const mode = await select({\n        message: \"Select project mode:\",\n        options: generateOptions(modes),\n    });\n\n    if (isCancel(mode)) terminate(\"Process cancelled ❌\");\n\n    return mode as ProjectConfig[\"mode\"];\n}\n\nexport async function promptDevTools(): Promise<ProjectConfig[\"devTools\"]> {\n    const devTools = await multiselect({\n        message: \"Select development tools:\",\n        options: generateOptions(tools),\n    });\n\n    if (isCancel(devTools)) terminate(\"Process cancelled ❌\");\n\n    return devTools as ProjectConfig[\"devTools\"];\n}\n\nexport async function promptLogger(): Promise<ProjectConfig[\"logger\"]> {\n    const logger = await select({\n        message: \"Select your logging solution:\",\n        options: generateOptions(loggers),\n    });\n\n    if (isCancel(logger)) terminate(\"Process cancelled ❌\");\n\n    return logger as ProjectConfig[\"logger\"];\n}\n\nexport async function promptDatabaseType(): Promise<\n    ProjectConfig[\"databaseType\"]\n> {\n    const databaseType = await select({\n        message: \"Select your Database type:\",\n        options: generateOptions(database_types),\n    });\n\n    if (isCancel(databaseType)) terminate(\"Process cancelled ❌\");\n\n    return databaseType as ProjectConfig[\"databaseType\"];\n}\n\nexport async function promptDatabase(\n    type: DATABASE_TYPE,\n): Promise<ProjectConfig[\"database\"]> {\n    const options = type === \"sql\" ? sql_database : no_sql_database;\n\n    const database = await select({\n        message: \"Choose your database\",\n        options: generateOptions(options),\n    });\n\n    if (isCancel(database)) terminate(\"Process cancelled ❌\");\n\n    return database as ProjectConfig[\"database\"];\n}\n\nexport async function promptDatabaseOrm(\n    type: DATABASE_TYPE,\n): Promise<ProjectConfig[\"databaseOrm\"]> {\n    const options = type === \"sql\" ? sql_orms : no_sql_orms;\n\n    const orm = await select({\n        message: \"Choose your ORM\",\n        options: generateOptions(options),\n    });\n\n    if (isCancel(orm)) terminate(\"Process cancelled ❌\");\n\n    return orm as ProjectConfig[\"databaseOrm\"];\n}\n\nexport async function promptAuthLibraries(\n    databaseOrm: string,\n): Promise<ProjectConfig[\"auth\"]> {\n    const options = generateOptions(getAuthLibraryOptions(databaseOrm));\n\n    while (true) {\n        const authLib = await select({\n            message: \"Select your Authentication library:\",\n            options,\n        });\n\n        if (isCancel(authLib)) terminate(\"Process cancelled ❌\");\n\n        const selected = options.find((o) => o.value === authLib);\n\n        if (selected?.disabled) {\n            note(\n                \"Better Auth supports Drizzle, Prisma, and MongoDB native drivers\",\n                \"Invalid selection\",\n            );\n            continue;\n        }\n\n        return authLib as ProjectConfig[\"auth\"];\n    }\n}\n\nexport async function promptWebServer(): Promise<ProjectConfig[\"webServer\"]> {\n    const webServer = await select({\n        message: \"Select your proxy server:\",\n        options: generateOptions(WEB_SERVERS),\n    });\n\n    if (isCancel(webServer)) terminate(\"Process cancelled ❌\");\n\n    return webServer as ProjectConfig[\"webServer\"];\n}\n\nexport async function promptProxyMode(): Promise<\n    ProjectConfig[\"webServerMode\"]\n> {\n    const webServerMode = await select({\n        message: \"Select proxy mode:\",\n        options: generateOptions(USES_OF_WEB_SERVER),\n    });\n\n    if (isCancel(webServerMode)) terminate(\"Process cancelled ❌\");\n\n    return webServerMode as ProjectConfig[\"webServerMode\"];\n}\n\nexport async function promptCache(): Promise<Cache | undefined> {\n    const shouldUseRedisCache = await confirm({\n        message: \"Do you want to integrate Redis for Cache?\",\n    });\n\n    if (isCancel(shouldUseRedisCache)) terminate(\"Process cancelled ❌\");\n\n    return shouldUseRedisCache ? \"redis\" : undefined;\n}\n\nexport async function promptPackageManager(\n    mode: ProjectConfig[\"mode\"],\n): Promise<ProjectConfig[\"pkgManager\"]> {\n    const withoutNoneManagers = pkg_managers.filter(\n        (manager) => manager.value !== \"none\",\n    );\n\n    const managers =\n        mode === \"development\" ? pkg_managers : withoutNoneManagers;\n\n    const pkgManager = await select({\n        message: \"Select your package manager:\",\n        options: generateOptions(managers),\n    });\n\n    if (isCancel(pkgManager)) terminate(\"Process cancelled ❌\");\n\n    return pkgManager as ProjectConfig[\"pkgManager\"];\n}\n","import { note, outro } from \"@clack/prompts\";\nimport type { ProjectConfig } from \"../types\";\n\nexport function showCompletionMessage(config: ProjectConfig) {\n    const { pkgManager, directory } = config;\n    const hasDirectory = typeof directory === \"string\" && directory.length > 0;\n\n    if (pkgManager === \"none\" && !hasDirectory) {\n        note(\n            `\nInstall dependencies:\n  npm install\n\nStart development:\n  npm run dev`,\n            \"📦 Setup Complete\",\n        );\n    } else if (pkgManager === \"none\" && hasDirectory) {\n        note(\n            `\nTo get started:\n  cd ${directory}\n\nInstall dependencies:\n  npm install\n\nStart development:\n  npm run dev`,\n            \"📦 Setup Complete\",\n        );\n    } else if (pkgManager !== \"none\" && hasDirectory) {\n        note(\n            `cd ${directory}\n${pkgManager} run dev`,\n            \"🚀 Ready to start\",\n        );\n    } else {\n        note(`${pkgManager} run dev`, \"🚀 Ready to start\");\n    }\n\n    outro(\"Happy coding! ✨\");\n}\n","import { join } from \"node:path\";\nimport { envConfig } from \"../config\";\nimport { generateFile } from \"../utils\";\nimport type {\n    EnvFileReturnType,\n    GenerateFileArgs,\n    ProjectConfig,\n} from \"../types\";\n\nfunction formatEnvWithComments(auth: ProjectConfig[\"auth\"]): EnvFileReturnType {\n    const envLines: string[] = [];\n    const exampleEnvLines: string[] = [];\n    const prodEnvLines: string[] = [];\n\n    envLines.push(\"# Application Configuration\");\n    envLines.push(`NODE_ENV=${envConfig.NODE_ENV}`);\n    envLines.push(`PORT=${envConfig.PORT}`);\n    envLines.push(`CLIENT_ORIGIN=${envConfig.CLIENT_ORIGIN}\\n`);\n\n    exampleEnvLines.push(\"# Application Configuration\");\n    exampleEnvLines.push(\"NODE_ENV=\");\n    exampleEnvLines.push(\"PORT=\");\n    exampleEnvLines.push(`CLIENT_ORIGIN=\\n`);\n\n    prodEnvLines.push(\"# Application Configuration\");\n    prodEnvLines.push(\n        `NODE_ENV=${envConfig.NODE_ENV.replace(\"development\", \"production\")}`,\n    );\n    prodEnvLines.push(`PORT=${envConfig.PORT}`);\n    prodEnvLines.push(`CLIENT_ORIGIN=${envConfig.CLIENT_ORIGIN}\\n`);\n\n    if (auth === \"better-auth\") {\n        envLines.push(\"# Better Auth\");\n        envLines.push(`BETTER_AUTH_URL=${envConfig.BETTER_AUTH_URL}`);\n        envLines.push(`BETTER_AUTH_SECRET=${envConfig.BETTER_AUTH_SECRET}\\n`);\n\n        exampleEnvLines.push(\"# Better Auth\");\n        exampleEnvLines.push(\"BETTER_AUTH_URL=\");\n        exampleEnvLines.push(`BETTER_AUTH_SECRET=\\n`);\n\n        prodEnvLines.push(\"# Better Auth\");\n        prodEnvLines.push(`BETTER_AUTH_URL=${envConfig.BETTER_AUTH_URL}`);\n        prodEnvLines.push(\n            `BETTER_AUTH_SECRET=${envConfig.BETTER_AUTH_SECRET}\\n`,\n        );\n    }\n\n    if (auth === \"clerk\") {\n        envLines.push(\"# Clerk\");\n        envLines.push(\n            `CLERK_PUBLISHABLE_KEY=${envConfig.CLERK_PUBLISHABLE_KEY}`,\n        );\n        envLines.push(`CLERK_SECRET_KEY=${envConfig.CLERK_SECRET_KEY}\\n`);\n\n        exampleEnvLines.push(\"# Clerk\");\n        exampleEnvLines.push(\"CLERK_PUBLISHABLE_KEY=\");\n        exampleEnvLines.push(`CLERK_SECRET_KEY=\\n`);\n\n        prodEnvLines.push(\"# Clerk\");\n        prodEnvLines.push(\n            `CLERK_PUBLISHABLE_KEY=${envConfig.CLERK_PUBLISHABLE_KEY}`,\n        );\n        prodEnvLines.push(`CLERK_SECRET_KEY=${envConfig.CLERK_SECRET_KEY}\\n`);\n    }\n\n    return {\n        envContent: envLines.join(\"\\n\"),\n        exEnvContent: exampleEnvLines.join(\"\\n\"),\n        prodEnvContent: prodEnvLines.join(\"\\n\"),\n    };\n}\n\nexport async function setupEnv(config: ProjectConfig) {\n    const { targetDir, auth, mode } = config;\n\n    const { envContent, exEnvContent, prodEnvContent } =\n        formatEnvWithComments(auth);\n    try {\n        const envLocation = join(targetDir, \".env\");\n        const exEnvLocation = join(targetDir, \".env.example\");\n        const prodEnvLocation = join(targetDir, \".env.production\");\n\n        const envs: GenerateFileArgs[] = [\n            { fileLocation: envLocation, fileContent: envContent },\n            { fileLocation: exEnvLocation, fileContent: exEnvContent },\n        ];\n\n        if (mode === \"production\") {\n            envs.push({\n                fileLocation: prodEnvLocation,\n                fileContent: prodEnvContent,\n            });\n        }\n\n        await Promise.all(envs.map((env) => generateFile({ ...env })));\n    } catch (error) {\n        throw new Error(`failed to setup env: ${error}`);\n    }\n}\n","import {\n    dockerScripts,\n    jsScripts,\n    prettierScripts,\n    tsScripts,\n    vitestScripts,\n} from \"../config\";\nimport type { ScriptConfig, Language, DevTools } from \"../types\";\n\nexport function generateScripts(\n    language: Language,\n    devTools: DevTools[],\n): ScriptConfig {\n    const baseScripts = language === \"ts\" ? tsScripts : jsScripts;\n    const isPrettier = devTools.includes(\"prettier\");\n    const isDocker = devTools.includes(\"docker\");\n    const isVitest = devTools.includes(\"vitest\");\n\n    return {\n        ...(isVitest ? vitestScripts : {}),\n        ...baseScripts,\n        ...(isPrettier ? prettierScripts : {}),\n        ...(isDocker ? dockerScripts : {}),\n    };\n}\n","import {\n    BASE_PACKAGES,\n    TS_DEV_PACKAGES,\n    ADDITION_PACKAGES,\n    TS_ADDITIONAL_PACKAGES,\n    DEV_DEPENDENCIES,\n    TS_DEV_DEPENDENCIES,\n} from \"../config\";\nimport type { CollectPackagesParams } from \"../types\";\n\nexport function collectPackages(config: CollectPackagesParams) {\n    const { devTools, language, mode, cache, auth, logger } = config;\n\n    const packages: string[] = [...BASE_PACKAGES];\n    const devPackages: string[] = [];\n\n    if (mode === \"production\") {\n        packages.push(...ADDITION_PACKAGES);\n        if (devTools.includes(\"vitest\")) devPackages.push(...DEV_DEPENDENCIES);\n    }\n\n    if (language === \"ts\") {\n        devPackages.push(...TS_DEV_PACKAGES);\n    }\n\n    if (language === \"ts\" && mode === \"production\") {\n        devPackages.push(...TS_ADDITIONAL_PACKAGES);\n        if (devTools.includes(\"vitest\")) {\n            devPackages.push(...TS_DEV_DEPENDENCIES);\n        }\n    }\n\n    if (cache === \"redis\") packages.push(\"ioredis\");\n    if (auth === \"better-auth\") packages.push(\"better-auth\");\n    if (auth === \"clerk\") packages.push(\"@clerk/express\");\n    if (devTools.includes(\"prettier\")) devPackages.push(\"prettier\");\n    if (devTools.includes(\"husky\")) devPackages.push(\"husky\");\n    if (devTools.includes(\"logger\")) {\n        if (logger === \"winston\") packages.push(\"winston\");\n        if (logger === \"pino\") packages.push(\"pino\", \"pino-pretty\");\n    }\n\n    return { packages, devPackages };\n}\n","import type { ConfigFile } from \"../types\";\n\nconst prettierrcContent = `\n{\n  \"semi\": true,\n  \"singleQuote\": false,\n  \"tabWidth\": 4\n}\n`;\n\nconst prettierignoreContent = `\n# Build outputs\nbuild/\ndist/\nout/\noutput/\ncoverage/\n.tmp/\n.temp/\n\n# Dependencies\nnode_modules/\n\n# Environment files\n.env\n.env.*\n.env.*.local\n\n# Package manager lock files (do not touch)\npackage-lock.json\nnpm-shrinkwrap.json\nyarn.lock\npnpm-lock.yaml\nbun.lockb\n\n# Editor & IDE\n.vscode/\n.idea/\n*.swp\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\npnpm-debug.log*\n\n# OS files\n.DS_Store\nThumbs.db\n\n# Cache directories\n.cache/\n.parcel-cache/\n.next/\n.nuxt/\n.svelte-kit/\n.turbo/\n\n# Misc\n*.snap\n`;\n\nexport function generatePrettierConfig(): ConfigFile[] {\n    return [\n        { filename: \".prettierrc\", content: prettierrcContent.trim() },\n        { filename: \".prettierignore\", content: prettierignoreContent.trim() },\n    ];\n}\n","import { join } from \"node:path\";\nimport { generateFile } from \"../utils\";\n\nexport async function writeConfigFiles(\n    targetDir: string,\n    configs: Array<{ filename: string; content: string }>,\n): Promise<void> {\n    for (const { filename, content } of configs) {\n        const fullPath = join(targetDir, filename);\n        await generateFile({ fileLocation: fullPath, fileContent: content });\n    }\n}\n","import { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { formatPackageVersions, generateFile } from \"../utils\";\nimport type { Language, ScriptConfig } from \"../types\";\n\nexport async function modifyPackageJson(\n    targetDir: string,\n    language: Language,\n    dirName: string,\n    scripts: ScriptConfig,\n) {\n    const execFileAsync = promisify(execFile);\n\n    const args = [\n        \"pkg\",\n        \"set\",\n        `name=${dirName}`,\n        `main=src/main.${language}`,\n        `type=module`,\n        `--prefix=${targetDir}`,\n    ];\n\n    for (const [key, value] of Object.entries(scripts)) {\n        args.push(`scripts.${key}=${value}`);\n    }\n\n    await execFileAsync(\"npm\", args);\n}\n\nexport async function addPackagesToJson(\n    targetDir: string,\n    packages: string[],\n    devPackages: string[] = [],\n) {\n    const packageJsonPath = join(targetDir, \"package.json\");\n    const content = await readFile(packageJsonPath, \"utf-8\");\n    const packageData = JSON.parse(content);\n\n    const depVersions = await formatPackageVersions(packages);\n\n    let devDepVersions = {};\n    if (devPackages.length > 0) {\n        devDepVersions = await formatPackageVersions(devPackages);\n    }\n\n    packageData.dependencies = {\n        ...packageData.dependencies,\n        ...depVersions,\n    };\n\n    if (Object.keys(devDepVersions).length > 0) {\n        packageData.devDependencies = {\n            ...packageData.devDependencies,\n            ...devDepVersions,\n        };\n    }\n\n    await generateFile({\n        fileLocation: packageJsonPath,\n        fileContent: JSON.stringify(packageData, null, 2) + \"\\n\",\n    });\n}\n","import { fireShell } from \"../utils\";\nimport { installCmdMap } from \"../config\";\nimport { collectPackages, generateScripts } from \"../generators\";\nimport { addPackagesToJson, modifyPackageJson } from \"../managers\";\nimport type { PackageManager, ProjectConfig } from \"../types\";\n\nexport async function installPackages(config: ProjectConfig) {\n    const { targetDir, language, devTools, dirName, pkgManager } = config;\n\n    const { packages, devPackages } = collectPackages(config);\n\n    await initializeNodeProject(targetDir);\n    const scripts = generateScripts(language, devTools);\n    await modifyPackageJson(targetDir, language, dirName, scripts);\n\n    if (pkgManager === \"none\") {\n        await addPackagesToJson(targetDir, packages, devPackages);\n        return;\n    }\n\n    await installPackagesWithManager(\n        pkgManager,\n        targetDir,\n        packages,\n        devPackages,\n    );\n}\n\nasync function installPackagesWithManager(\n    pkgManager: PackageManager,\n    targetDir: string,\n    packages: string[],\n    devPackages: string[],\n) {\n    const installCmd = installCmdMap[pkgManager] ?? null;\n\n    await fireShell(\n        `${pkgManager} ${installCmd} ${packages.join(\" \")}`,\n        targetDir,\n    );\n\n    if (devPackages.length > 0) {\n        await fireShell(\n            `${pkgManager} ${installCmd} ${devPackages.join(\" \")} -D`,\n            targetDir,\n        );\n    }\n}\n\nexport async function initializeNodeProject(targetDir: string) {\n    await fireShell(\"npm init -y\", targetDir);\n}\n","import { existsSync } from \"node:fs\";\nimport { hasPkManager, terminate } from \"../utils\";\nimport type { PackageManager } from \"../types\";\n\nexport function validateDirectory(targetDir: string, directory: string): void {\n    if (existsSync(targetDir) && directory?.trim()) {\n        terminate(\n            `${directory} already exists. Please choose a different name.`,\n        );\n    }\n}\n\nexport function validatePackageManager(pkgManager: PackageManager): void {\n    if (!hasPkManager(pkgManager)) {\n        terminate(\n            `❌ ${pkgManager} is not installed on your system! Please install it first.`,\n        );\n    }\n}\n\nexport function validateTemplate(templatePath: string): void {\n    if (!existsSync(templatePath)) {\n        terminate(`❌ Template not found at: ${templatePath}`);\n    }\n}\n","import { cwd } from \"node:process\";\nimport { cp, copyFile } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport { copy } from \"../utils\";\nimport { tsconfigJson } from \"../config\";\nimport {\n    promptAuthLibraries,\n    promptCache,\n    promptDatabase,\n    promptDatabaseOrm,\n    promptDatabaseType,\n    promptDevTools,\n    promptDirectory,\n    promptLanguage,\n    promptLogger,\n    promptMode,\n    promptPackageManager,\n    promptProxyMode,\n    promptWebServer,\n} from \"../cli\";\nimport {\n    validateDirectory,\n    validatePackageManager,\n    validateTemplate,\n} from \"./validator\";\nimport type { Auth, Language, ProjectConfig } from \"../types\";\n\nexport async function getUserInputs() {\n    const directory = await promptDirectory();\n\n    const rootDir = cwd();\n    const targetDir = !directory?.trim() ? rootDir : join(rootDir, directory);\n    validateDirectory(targetDir, directory);\n\n    const language = await promptLanguage();\n    const mode = await promptMode();\n\n    let devTools: ProjectConfig[\"devTools\"] = [];\n    let databaseType: ProjectConfig[\"databaseType\"];\n    let database: ProjectConfig[\"database\"];\n    let databaseOrm: ProjectConfig[\"databaseOrm\"];\n    let auth: ProjectConfig[\"auth\"];\n    let webServer: ProjectConfig[\"webServer\"];\n    let webServerMode: ProjectConfig[\"webServerMode\"];\n    let cache: ProjectConfig[\"cache\"];\n    let logger: ProjectConfig[\"logger\"];\n\n    if (mode === \"production\") {\n        devTools = await promptDevTools();\n        if (devTools.includes(\"logger\")) logger = await promptLogger();\n        if (devTools.includes(\"docker\")) {\n            databaseType = await promptDatabaseType();\n            database = await promptDatabase(databaseType!);\n            databaseOrm = await promptDatabaseOrm(databaseType!);\n            auth = await promptAuthLibraries(databaseOrm!);\n            cache = await promptCache();\n            webServer = await promptWebServer();\n            webServerMode = await promptProxyMode();\n        }\n    }\n\n    const pkgManager = await promptPackageManager(mode);\n\n    return {\n        directory,\n        language,\n        mode,\n        devTools,\n        databaseType,\n        database,\n        databaseOrm,\n        webServer,\n        webServerMode,\n        pkgManager,\n        targetDir,\n        rootDir,\n        cache,\n        logger,\n        auth,\n    };\n}\n\nexport async function prepareProjectConfig(\n    userInputs: Awaited<ReturnType<typeof getUserInputs>>,\n    underScoreDirname: string,\n) {\n    const { language, pkgManager, targetDir, mode, auth } = userInputs;\n\n    const dirName = basename(targetDir) || \"container_app\";\n\n    validatePackageManager(pkgManager);\n\n    const templateBase = join(underScoreDirname, \"..\", \"templates\");\n    const templatePath = join(templateBase, mode, language);\n\n    validateTemplate(templatePath);\n\n    if (mode === \"production\") {\n        await copyDynamicFile(templatePath, targetDir, language, auth!);\n    } else {\n        await copy({ targetDir, templatePath });\n    }\n\n    if (language === \"ts\") {\n        const tsConfigJsonPath = join(templateBase, tsconfigJson);\n        const tsConfigJsonDestination = join(targetDir, tsconfigJson);\n        await copy({\n            templatePath: tsConfigJsonPath,\n            targetDir: tsConfigJsonDestination,\n        });\n    }\n\n    const sourceDir = join(targetDir, \"src\");\n    const publicDir = join(targetDir, \"public\");\n\n    const config: ProjectConfig = {\n        ...userInputs,\n        sourceDir,\n        publicDir,\n        templatePath,\n        dirName,\n    };\n\n    return config;\n}\n\nasync function copyDynamicFile(\n    templatePath: string,\n    targetDir: string,\n    language: Language,\n    auth: Auth,\n) {\n    const templateSrcPath = join(templatePath, \"src\");\n    const targetSrcPath = join(targetDir, \"src\");\n\n    await cp(templatePath, targetDir, {\n        recursive: true,\n        filter: (src) => {\n            const normalizedSrc = src.replace(/\\\\/g, \"/\");\n            return (\n                !normalizedSrc.endsWith(`src/app.normal.${language}`) &&\n                !normalizedSrc.endsWith(`src/app.better.auth.${language}`) &&\n                !normalizedSrc.endsWith(`src/app.clerk.${language}`)\n            );\n        },\n    });\n\n    if (auth === \"clerk\") {\n        await copyFile(\n            join(templateSrcPath, `app.clerk.${language}`),\n            join(targetSrcPath, `app.${language}`),\n        );\n    } else if (auth === \"better-auth\") {\n        await copyFile(\n            join(templateSrcPath, `app.better.auth.${language}`),\n            join(targetSrcPath, `app.${language}`),\n        );\n    } else {\n        await copyFile(\n            join(templateSrcPath, `app.normal.${language}`),\n            join(targetSrcPath, `app.${language}`),\n        );\n    }\n}\n","import { fireShell } from \"../utils\";\nimport type { DockerParams } from \"../types\";\n\nexport async function setupDocker(config: DockerParams): Promise<void> {\n    try {\n        const { database, language, pkgManager, cache, targetDir } = config;\n        await fireShell(\n            `npx -y @excli/docker --${language} --${database} --${pkgManager} --${cache}`,\n            targetDir,\n        );\n    } catch (error) {\n        throw new Error(`failed to setup docker: ${error}`);\n    }\n}\n","import { fireShell } from \"../utils\";\n\nexport async function setupGit(targetDir: string): Promise<void> {\n    try {\n        await Promise.all([\n            fireShell(\"git init\", targetDir),\n            fireShell(`npx gitignore node`, targetDir),\n        ]);\n    } catch (error) {\n        throw new Error(`failed to setup git: ${error}`);\n    }\n}\n","import { join } from \"node:path\";\nimport { fireShell, generateFile } from \"../utils\";\nimport { HUSKY_COMMIT_FILE_NAME } from \"../config\";\n\nexport async function setupHusky(targetDir: string): Promise<void> {\n    try {\n        await fireShell(\"npx husky init\", targetDir);\n        const huskyFileLocation = join(\n            targetDir,\n            \".husky\",\n            HUSKY_COMMIT_FILE_NAME,\n        );\n        await generateFile({\n            fileLocation: huskyFileLocation,\n            fileContent: \"\",\n        });\n    } catch (error) {\n        throw new Error(`failed to setup husky: ${error}`);\n    }\n}\n","import { writeConfigFiles } from \"../managers\";\nimport { generatePrettierConfig } from \"../generators\";\n\nexport async function setupPrettier(targetDir: string): Promise<void> {\n    try {\n        const prettierConfigs = generatePrettierConfig();\n        await writeConfigFiles(targetDir, prettierConfigs);\n    } catch (error) {\n        throw new Error(`failed to setup prettier: ${error}`);\n    }\n}\n","import { fireShell } from \"../utils\";\nimport type { OrmParams } from \"../types\";\n\nexport async function setupOrm(config: OrmParams): Promise<void> {\n    try {\n        const { language, database, databaseOrm, pkgManager, targetDir } =\n            config;\n\n        const modifyORM =\n            databaseOrm === \"native_driver\"\n                ? databaseOrm.replace(\"_\", \"-\")\n                : databaseOrm;\n\n        await fireShell(\n            `npx -y @excli/orm-init --${language} --${pkgManager} --${database} --${modifyORM}`,\n            targetDir,\n        );\n    } catch (error) {\n        throw new Error(`failed to setup orm: ${error}`);\n    }\n}\n","import { join } from \"node:path\";\nimport type { ProjectConfig } from \"../types\";\nimport { appendLanguageExtension, generateFile } from \"../utils\";\n\nfunction clerkMiddleware(lang: ProjectConfig[\"language\"]) {\n    const isTypeScript = lang === \"ts\";\n\n    return `import { getAuth } from \"@clerk/express\";\n${isTypeScript ? 'import type { Request, Response, NextFunction } from \"express\";' : \"\"}\n\nexport function authMiddleware(\n    req${isTypeScript ? \": Request\" : \"\"},\n    res${isTypeScript ? \": Response\" : \"\"},\n    next${isTypeScript ? \": NextFunction\" : \"\"},\n) {\n    const { userId } = getAuth(req);\n\n    if (!userId) {\n        return res.status(401).json({ success: false, error: \"Unauthorized\" });\n    }\n\n    next();\n}\n`;\n}\n\nexport async function setupClerk(config: ProjectConfig) {\n    const middlewareName = join(\n        config.targetDir,\n        \"src\",\n        \"middlewares\",\n        \"auth.middleware\",\n    );\n    const [middlewareFile] = appendLanguageExtension(\n        config.language,\n        middlewareName,\n    );\n\n    const middleware = clerkMiddleware(config.language);\n    await generateFile({\n        fileLocation: middlewareFile!,\n        fileContent: middleware,\n    });\n}\n","import { join } from \"node:path\";\nimport type { ProjectConfig, SQL_DATABASE } from \"../types\";\nimport { appendLanguageExtension, generateFile } from \"../utils\";\n\nconst betterAuthDrizzleProvider = {\n    mysql: \"mysql\",\n    mariadb: \"mysql\",\n    postgres: \"pg\",\n    sqlite: \"sqlite\",\n};\n\nconst betterAuthPrismaProvider = {\n    mysql: \"mysql\",\n    mariadb: \"mysql\",\n    postgres: \"postgresql\",\n    sqlite: \"sqlite\",\n    mongodb: \"mongodb\",\n};\n\nfunction drizzleBetterAuth(config: ProjectConfig) {\n    const sqlDatabase = config.database as SQL_DATABASE;\n    const provider = betterAuthDrizzleProvider[sqlDatabase];\n\n    return `import { db } from \"../db/index.js\";\nimport { betterAuth } from \"better-auth\";\nimport { drizzleAdapter } from \"better-auth/adapters/drizzle\";\n\nexport const auth = betterAuth({\n    appName: \"${config.directory ?? \"better-express\"}\",\n    baseURL: process.env.BETTER_AUTH_URL,\n    secret: process.env.BETTER_AUTH_SECRET,\n    trustedOrigins: [process.env.CLIENT_ORIGIN ${config.language === \"ts\" ? \"as string\" : \"\"}],\n    emailAndPassword: { enabled: true },\n    database: drizzleAdapter(db, { provider: \"${provider}\", usePlural: true }),\n});\n`;\n}\n\nfunction prismaBetterAuth(config: ProjectConfig) {\n    const database = config.database as ProjectConfig[\"database\"];\n    const provider = betterAuthPrismaProvider[database!];\n\n    return `import { prisma } from \"../db/index.js\";\nimport { betterAuth } from \"better-auth\";\nimport { prismaAdapter } from \"better-auth/adapters/prisma\";\n\nexport const auth = betterAuth({\n    appName: \"${config.directory ?? \"better-express\"}\",\n    baseURL: process.env.BETTER_AUTH_URL,\n    secret: process.env.BETTER_AUTH_SECRET,\n    trustedOrigins: [process.env.CLIENT_ORIGIN ${config.language === \"ts\" ? \"as string\" : \"\"}],\n    emailAndPassword: { enabled: true },\n    database: prismaAdapter(prisma, { provider: \"${provider}\", usePlural: true }),\n});\n`;\n}\n\nfunction mongodbBetterAuth(config: ProjectConfig) {\n    return `import { betterAuth } from \"better-auth\";\nimport { database } from \"../db/index.js\";\nimport { mongodbAdapter } from \"better-auth/adapters/mongodb\";\n\nconst db = await database();\n\nexport const auth = betterAuth({\n    appName: \"${config.directory ?? \"better-express\"}\",\n    baseURL: process.env.BETTER_AUTH_URL,\n    secret: process.env.BETTER_AUTH_SECRET,\n    trustedOrigins: [process.env.CLIENT_ORIGIN ${config.language === \"ts\" ? \"as string\" : \"\"}],\n    emailAndPassword: { enabled: true },\n    database: mongodbAdapter(db, { usePlural: true }),\n});\n`;\n}\n\nexport async function setupBetterAuth(config: ProjectConfig) {\n    const authName = join(config.targetDir, \"src\", \"lib\", \"auth\");\n    const [authFile] = appendLanguageExtension(config.language, authName);\n\n    if (config.databaseOrm === \"drizzle\") {\n        const auth = drizzleBetterAuth(config);\n        await generateFile({ fileLocation: authFile!, fileContent: auth });\n    }\n\n    if (config.databaseOrm === \"prisma\") {\n        const auth = prismaBetterAuth(config);\n        await generateFile({ fileLocation: authFile!, fileContent: auth });\n    }\n\n    if (config.databaseOrm === \"native_driver\") {\n        const auth = mongodbBetterAuth(config);\n        await generateFile({ fileLocation: authFile!, fileContent: auth });\n    }\n}\n","import type { Auth, ProjectConfig } from \"../types\";\nimport { setupClerk } from \"./clerk\";\nimport { setupBetterAuth } from \"./better-auth\";\n\nconst authList = {\n    \"better-auth\": setupBetterAuth,\n    clerk: setupClerk,\n};\n\nexport async function setupAuth(config: ProjectConfig) {\n    try {\n        const auth = authList[config.auth as Auth];\n        await auth(config);\n    } catch (error) {\n        throw new Error(`failed to setup Auth: ${error}`);\n    }\n}\n","import { fireShell } from \"../utils\";\nimport type { ProxyParams } from \"../types\";\n\nexport async function setupProxy(config: ProxyParams): Promise<void> {\n    try {\n        const { webServer, webServerMode, targetDir } = config;\n        const modifyFormat = webServerMode?.replace(\"_\", \"-\");\n        await fireShell(\n            `npx -y @excli/proxy --${webServer} --${modifyFormat}`,\n            targetDir,\n        );\n    } catch (error) {\n        throw new Error(`failed to setup proxy: ${error}`);\n    }\n}\n","import { join } from \"node:path\";\nimport type { RedisParams } from \"../types\";\nimport { appendLanguageExtension, generateFile } from \"../utils\";\n\nfunction redisConnection() {\n    return `import { Redis } from \"ioredis\";\n\nif (!process.env.REDIS_URL) throw new Error(\"REDIS_URL is not set\")\n\nexport const redis = new Redis(process.env.REDIS_URL);\n\nexport async function redisPing() {\n    try {\n        await redis.ping();\n        console.log(\"Redis is connected!\");\n    } catch (error) {\n        throw new Error(\"failed to connect with redis: \", { cause: error });\n    }\n}\n`;\n}\n\nexport async function setupRedis({ language, targetDir }: RedisParams) {\n    const redisFile = join(targetDir, \"src\", \"lib\", \"redis\");\n    const [redisFileLocation] = appendLanguageExtension(language, redisFile);\n    const redisConnectionContent = redisConnection();\n\n    await generateFile({\n        fileLocation: redisFileLocation as string,\n        fileContent: redisConnectionContent,\n    });\n}\n","import { join } from \"node:path\";\nimport { appendLanguageExtension, generateFile, makeDirectory } from \"../utils\";\nimport type { GenerateFileArgs, VitestParams } from \"../types\";\n\nfunction generateTestTemplate() {\n    return `import request from \"supertest\";\nimport { app } from \"../src/app.js\";\nimport { describe, it, expect } from \"vitest\";\n\ndescribe(\"GET /\", () => {\n    it(\"should return the status of app\", async () => {\n        const response = await request(app).get(\"/\");\n        expect(response.status).toBe(200);\n        expect(response.headers[\"content-type\"]).toMatch(/json/);\n        expect(response.body).toStrictEqual({\n            status: \"OK\"\n        });\n    });\n});\n`;\n}\n\nfunction vitestConfig() {\n    return `import { defineConfig } from \"vitest/config\";\n\nexport default defineConfig({\n    test: {\n        globals: true,\n        environment: \"node\",\n        include: [\"src/**/*.test.{js,ts}\", \"tests/**/*.spec.{js,ts}\"],\n        exclude: [\"**/node_modules/**\", \"**/dist/**\"],\n    },\n});\n`;\n}\n\nexport async function setupVitest({ language, targetDir }: VitestParams) {\n    try {\n        const vitestLang = appendLanguageExtension(\n            language,\n            \"app.spec\",\n            \"vitest.config\",\n        );\n        const testDirectory = join(targetDir, \"tests\");\n        const appPath = join(testDirectory, vitestLang[0] as string);\n        const vitestPath = join(targetDir, vitestLang[1] as string);\n\n        const vitest: GenerateFileArgs[] = [\n            { fileLocation: appPath, fileContent: generateTestTemplate() },\n            { fileLocation: vitestPath, fileContent: vitestConfig() },\n        ];\n\n        await makeDirectory(testDirectory);\n        await Promise.all(vitest.map((vite) => generateFile({ ...vite })));\n    } catch (error) {\n        throw new Error(`failed to setup vitest: ${error}`);\n    }\n}\n","import { join } from \"node:path\";\nimport type { GenerateFileArgs, Logger, LoggerParams } from \"../types\";\nimport { appendLanguageExtension, generateFile } from \"../utils\";\n\nfunction winstonLogger() {\n    return `import winston from \"winston\";\n\nconst { combine, timestamp, printf, colorize, errors } = winston.format;\n\nexport const logger = winston.createLogger({\n    level: process.env.LOG_LEVEL || \"info\",\n    format: combine(\n        colorize(),\n        timestamp(),\n        errors({ stack: true }),\n        printf(({ level, message, timestamp, ...meta }) => {\n            const metaString = Object.keys(meta).length\n                ? \\` \\${JSON.stringify(meta)}\\`\n                : \"\";\n            return \\`\\${timestamp} [\\${level}]: \\${message}\\${metaString}\\`;\n        }),\n    ),\n    transports: [new winston.transports.Console()],\n});\n`;\n}\n\nfunction pinoLogger() {\n    return `import pino from \"pino\";\n\nexport const logger = pino({\n    level: process.env.LOG_LEVEL || \"info\",\n    timestamp: pino.stdTimeFunctions.isoTime,\n    transport: {\n        pipeline: [{ target: \"pino-pretty\", options: { colorize: true } }],\n    },\n});\n`;\n}\n\nconst loggerList = {\n    winston: winstonLogger,\n    pino: pinoLogger,\n};\n\nexport async function setupLogger({\n    targetDir,\n    logger,\n    language,\n}: LoggerParams): Promise<void> {\n    try {\n        const [loggerLang] = appendLanguageExtension(language, \"logger\");\n        const loggerPath = join(\n            targetDir,\n            \"src\",\n            \"utils\",\n            loggerLang as string,\n        );\n        const loggerContent = loggerList[logger as Logger];\n\n        const files: GenerateFileArgs[] = [\n            { fileLocation: loggerPath, fileContent: loggerContent() },\n        ];\n\n        await Promise.all(files.map((file) => generateFile({ ...file })));\n    } catch (error) {\n        throw new Error(`Failed to setup logger: ${error}`);\n    }\n}\n","import { setupGit } from \"./git\";\nimport { setupOrm } from \"./orms\";\nimport { hasGit } from \"../utils\";\nimport { setupAuth } from \"../auth\";\nimport { setupHusky } from \"./husky\";\nimport { setupProxy } from \"./proxy\";\nimport { setupRedis } from \"./redis\";\nimport { setupDocker } from \"./docker\";\nimport { setupVitest } from \"./vitest\";\nimport { setupPrettier } from \"./prettier\";\nimport { installPackages } from \"../core\";\nimport type { ProjectConfig } from \"../types\";\nimport { setupLogger } from \"./logger\";\n\nexport async function setupDevTools(config: ProjectConfig) {\n    const { devTools, targetDir, cache, auth } = config;\n    try {\n        if (devTools.includes(\"prettier\")) await setupPrettier(targetDir);\n        if (devTools.includes(\"vitest\")) await setupVitest(config);\n        if (devTools.includes(\"git\") && hasGit()) await setupGit(targetDir);\n        if (devTools.includes(\"logger\")) await setupLogger(config);\n        if (devTools.includes(\"docker\")) {\n            await Promise.all([setupDocker(config), setupOrm(config)]);\n            if (typeof auth !== \"undefined\") await setupAuth(config);\n            if (cache === \"redis\") await setupRedis(config);\n            await setupProxy(config);\n        }\n\n        await installPackages(config);\n        if (devTools.includes(\"husky\")) await setupHusky(targetDir);\n    } catch (error) {\n        throw new Error(`failed to setup devTools: ${error}`);\n    }\n}\n","import { join } from \"node:path\";\nimport { DIRECTORIES } from \"../config\";\nimport type { ProjectConfig } from \"../types\";\nimport { makeDirectory } from \"../utils\";\n\nexport async function setupProjectDirectories(\n    config: Pick<ProjectConfig, \"language\" | \"sourceDir\">,\n): Promise<void> {\n    const { language, sourceDir } = config;\n    for (const dir of DIRECTORIES) {\n        if (language !== \"ts\" && dir === \"types\") continue;\n        const directoryPath = join(sourceDir, dir);\n        await makeDirectory(directoryPath);\n    }\n}\n\nexport async function createDirectoryStructure(\n    config: Pick<ProjectConfig, \"publicDir\" | \"templatePath\" | \"targetDir\">,\n): Promise<void> {\n    const { publicDir } = config;\n    await Promise.all([makeDirectory(publicDir)]);\n}\n","import { existsSync } from \"node:fs\";\nimport { log, spinner } from \"@clack/prompts\";\nimport {\n    createDirectoryStructure,\n    setupDevTools,\n    setupProjectDirectories,\n} from \"../devtools\";\nimport { fireShell, makeDirectory } from \"../utils\";\nimport { setupEnv } from \"../generators\";\nimport { installPackages } from \"./installer\";\nimport type { ProjectConfig } from \"../types\";\n\nasync function setupProductionProject(config: ProjectConfig) {\n    try {\n        await Promise.all([\n            setupProjectDirectories(config),\n            setupDevTools(config),\n        ]);\n    } catch (error) {\n        throw new Error(`failed to setup production project: ${error}`);\n    }\n}\n\nasync function setupDevelopmentProject(config: ProjectConfig) {\n    try {\n        await installPackages(config);\n    } catch (error) {\n        throw new Error(`failed to setup development project: ${error}`);\n    }\n}\n\nexport async function createProject(config: ProjectConfig) {\n    const {\n        targetDir,\n        mode,\n        dirName,\n        language,\n        pkgManager,\n        databaseOrm,\n        auth,\n        databaseType,\n    } = config;\n\n    const s = spinner();\n    s.start(\"Creating project...\");\n\n    try {\n        if (!existsSync(targetDir)) await makeDirectory(targetDir);\n\n        await Promise.all([createDirectoryStructure(config), setupEnv(config)]);\n\n        if (mode === \"production\") {\n            await setupProductionProject(config);\n        } else {\n            await setupDevelopmentProject(config);\n        }\n\n        if (\n            auth === \"better-auth\" &&\n            databaseType === \"sql\" &&\n            databaseOrm === \"drizzle\"\n        ) {\n            await fireShell(\n                `npx auth@latest generate --config src/lib/auth.${language} --output src/db/schemas.${language} --yes`,\n                targetDir,\n            );\n        }\n\n        await fireShell(\"npx prettier --write . --tab-width 4\", targetDir);\n\n        if (language === \"ts\" && pkgManager !== \"none\") {\n            await fireShell(\"node --run build\", targetDir);\n        }\n\n        s.stop(`Successfully created project \\x1b[32m${dirName}\\x1b[0m`);\n        log.success(`Scaffolding project in ${targetDir}...`);\n    } catch (error) {\n        s.stop(\"Failed to create project\");\n        throw error;\n    }\n}\n","#!/usr/bin/env node\n\nimport { dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { displayBanner, showCompletionMessage } from \"./cli\";\nimport { createProject, getUserInputs, prepareProjectConfig } from \"./core\";\n\nasync function main() {\n    displayBanner();\n    const underScoreFilename = fileURLToPath(import.meta.url);\n    const underScoreDirname = dirname(underScoreFilename);\n\n    const userInputs = await getUserInputs();\n    const config = await prepareProjectConfig(userInputs, underScoreDirname);\n\n    await createProject(config);\n    showCompletionMessage(config);\n}\n\nmain().catch((error) => {\n    console.error(\"❌ Error creating project:\", error);\n    process.exit(1);\n});\n"],"mappings":";8sBAEA,MAAa,EAAe,gBAEf,EAAmC,CAC5C,CACI,MAAO,aACP,MAAO,KACP,MAAO,KACP,KAAM,yBACT,CACD,CACI,MAAO,aACP,MAAO,KACP,MAAO,KACP,KAAM,+BACT,CACJ,CAEY,EAA+B,CACxC,CACI,MAAO,cACP,MAAO,MACP,MAAO,cACP,KAAM,sBACT,CACD,CACI,MAAO,aACP,MAAO,KACP,MAAO,aACP,KAAM,uBACT,CACJ,CAEY,EAA+B,CACxC,CAAE,MAAO,MAAO,MAAO,KAAM,MAAO,MAAO,KAAM,uBAAwB,CACzE,CACI,MAAO,WACP,MAAO,IACP,MAAO,WACP,KAAM,uBACT,CACD,CACI,MAAO,SACP,MAAO,KACP,MAAO,SACP,KAAM,yBACT,CACD,CACI,MAAO,SACP,MAAO,KACP,MAAO,SACP,KAAM,uBACT,CACD,CACI,MAAO,SACP,MAAO,KACP,MAAO,SACP,KAAM,4BACT,CACD,CAAE,MAAO,QAAS,MAAO,KAAM,MAAO,QAAS,KAAM,qBAAsB,CAC9E,CAEY,EAAiC,CAC1C,CACI,MAAO,UACP,MAAO,KACP,MAAO,UACP,KAAM,2BACT,CACD,CACI,MAAO,OACP,MAAO,KACP,MAAO,OACP,KAAM,6BACT,CACJ,CAEY,EAAwC,CACjD,CACI,MAAO,MACP,MAAO,MACP,MAAO,MACP,KAAM,4BACT,CACD,CACI,MAAO,QACP,MAAO,KACP,MAAO,SACP,KAAM,mBACT,CACJ,CAEY,EAAsC,CAC/C,CAAE,MAAO,OAAQ,MAAO,KAAM,MAAO,OAAQ,KAAM,qBAAsB,CACzE,CAAE,MAAO,MAAO,MAAO,KAAM,MAAO,MAAO,KAAM,qBAAsB,CACvE,CACI,MAAO,OACP,MAAO,KACP,MAAO,OACP,KAAM,0BACT,CACD,CACI,MAAO,OACP,MAAO,KACP,MAAO,OACP,KAAM,yBACT,CACD,CACI,MAAO,MACP,MAAO,KACP,MAAO,MACP,KAAM,6BACT,CACJ,CAEY,EAAsC,CAC/C,CACI,MAAO,QACP,MAAO,KACP,MAAO,QACP,KAAM,oBACT,CACD,CACI,MAAO,UACP,MAAO,KACP,MAAO,UACP,KAAM,6BACT,CACD,CACI,MAAO,SACP,MAAO,KACP,MAAO,SACP,KAAM,0BACT,CACD,CACI,MAAO,aACP,MAAO,KACP,MAAO,WACP,KAAM,qBACT,CACJ,CAEY,EAAyC,CAClD,CACI,MAAO,UACP,MAAO,KACP,MAAO,UACP,KAAM,yBACT,CACJ,CAEY,GAAkC,CAC3C,CACI,MAAO,SACP,MAAO,KACP,MAAO,SACP,KAAM,0BACT,CACD,CACI,MAAO,UACP,MAAO,IACP,MAAO,UACP,KAAM,yBACT,CACD,CACI,MAAO,UACP,MAAO,MACP,MAAO,UACP,KAAM,8BACT,CACD,CACI,MAAO,YACP,MAAO,KACP,MAAO,YACP,KAAM,4BACT,CACJ,CAEY,GAAqC,CAC9C,CACI,MAAO,SACP,MAAO,KACP,MAAO,SACP,KAAM,0BACT,CACD,CACI,MAAO,UACP,MAAO,MACP,MAAO,UACP,KAAM,8BACT,CACD,CACI,MAAO,WACP,MAAO,KACP,MAAO,WACP,KAAM,wBACT,CACD,CACI,MAAO,gBACP,MAAO,KACP,MAAO,gBACP,KAAM,qBACT,CACJ,CAiBY,GAAqC,CAC9C,CACI,MAAO,QACP,MAAO,IACP,MAAO,QACP,KAAM,sBACT,CACD,CACI,MAAO,QACP,MAAO,KACP,MAAO,QACP,KAAM,kBACT,CACD,CACI,MAAO,UACP,MAAO,MACP,MAAO,UACP,KAAM,uBACT,CACJ,CAEY,GAA4C,CACrD,CACI,MAAO,gBACP,MAAO,KACP,MAAO,gBACP,KAAM,6BACT,CACD,CACI,MAAO,iBACP,MAAO,KACP,MAAO,iBACP,KAAM,kBACT,CACJ,CAEY,GAAwB,CACjC,cACA,WACA,QACA,MACH,CAEY,EAAgB,CAAC,UAAU,CAC3B,EAAmB,CAAC,SAAU,YAAY,CAC1C,EAAoB,CAAC,OAAQ,SAAU,qBAAqB,CAE5D,EAAkB,CAC3B,cACA,iBACA,aACA,eACH,CACY,EAAsB,CAAC,mBAAmB,CAC1C,EAAyB,CAAC,cAAc,CAExC,EAAwC,CACjD,IAAK,UACL,KAAM,MACN,KAAM,MACN,IAAK,MACR,CAEY,EAAY,CACr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"}