plazercli 1.0.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/README.md +227 -0
- package/dist/index.js +4059 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
- package/templates/base/root/editorconfig +9 -0
- package/templates/base/root/gitignore +14 -0
- package/templates/base/root/nvmrc +1 -0
- package/templates/base/root/package.json.ejs +19 -0
- package/templates/base/root/pnpm-workspace.yaml +2 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/args.ts","../src/cli/prompts.ts","../src/helpers/logger.ts","../src/generators/project.ts","../src/generators/base.ts","../src/helpers/filesystem.ts","../src/helpers/template.ts","../src/helpers/runtime.ts","../src/generators/frontend.ts","../src/installers/dependencyVersionMap.ts","../src/generators/backend.ts","../src/generators/docker.ts","../src/generators/env.ts","../src/generators/readme.ts","../src/generators/wiring.ts","../src/generators/liz.ts","../src/installers/database/prisma.ts","../src/installers/database/mongoose.ts","../src/installers/auth/jwt.ts","../src/installers/auth/magicLink.ts","../src/installers/auth/googleOauth.ts","../src/installers/queue/bullmq.ts","../src/installers/queue/rabbitmq.ts","../src/installers/infra/redis.ts","../src/installers/infra/smtp.ts","../src/installers/infra/minio.ts","../src/installers/infra/pm2.ts","../src/installers/multiTenant.ts","../src/installers/integrations/viacep.ts","../src/installers/integrations/whatsapp.ts","../src/installers/integrations/stripe.ts","../src/installers/integrations/mercadoPago.ts","../src/installers/integrations/abacatePay.ts","../src/installers/index.ts","../src/helpers/spinner.ts","../src/helpers/git.ts","../src/helpers/packages.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport path from 'path';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n// Works from both src/cli/ (dev) and dist/ (built)\nconst pkgPath = path.resolve(__dirname, '../package.json');\nconst pkgPathAlt = path.resolve(__dirname, '../../package.json');\nconst pkg = JSON.parse(\n (() => {\n try { return readFileSync(pkgPath, 'utf-8'); }\n catch { return readFileSync(pkgPathAlt, 'utf-8'); }\n })()\n);\n\nexport interface CliFlags {\n name?: string;\n yes?: boolean;\n}\n\nexport function parseArgs(): CliFlags {\n const program = new Command();\n\n program\n .name('plazercli')\n .description('CLI para gerar projetos fullstack boilerplate')\n .version(pkg.version, '-v, --version')\n .option('-n, --name <name>', 'Nome do projeto')\n .option('-y, --yes', 'Usar valores padrão (skip prompts)')\n .parse();\n\n const opts = program.opts();\n return {\n name: opts.name,\n yes: opts.yes,\n };\n}\n","import { input, select, confirm, checkbox } from '@inquirer/prompts';\nimport type { ProjectConfig } from '../types/config.js';\nimport type { CliFlags } from './args.js';\nimport path from 'path';\n\nexport async function runPrompts(flags: CliFlags): Promise<ProjectConfig> {\n // 1. Nome do projeto\n const projectName = flags.name ?? await input({\n message: '📦 Qual o nome do projeto?',\n validate: (value) => {\n if (!value.trim()) return 'O nome do projeto é obrigatório';\n if (!/^[a-z0-9-]+$/.test(value)) return 'Use apenas letras minúsculas, números e hífens';\n return true;\n },\n });\n\n // 2. Descrição\n const projectDescription = await input({\n message: '📝 Descreva brevemente o projeto:',\n default: `Projeto ${projectName}`,\n });\n\n // 3. Runtime / Package Manager\n const runtime = await select({\n message: '⚡ Qual runtime/gerenciador de pacotes usar?',\n choices: [\n { name: 'pnpm (Recomendado)', value: 'pnpm' as const },\n { name: 'bun', value: 'bun' as const },\n { name: 'npm', value: 'npm' as const },\n ],\n });\n\n // 4. Banco de dados\n const database = await select({\n message: '🗄️ Qual banco de dados usar?',\n choices: [\n { name: 'PostgreSQL', value: 'postgresql' as const },\n { name: 'MySQL', value: 'mysql' as const },\n { name: 'MongoDB', value: 'mongodb' as const },\n { name: 'Nenhum', value: 'none' as const },\n ],\n });\n\n // 5. Multi-tenant\n const multiTenant = await confirm({\n message: '🏢 Usar multi-tenant?',\n default: false,\n });\n\n // 6. SMTP\n let smtp = await confirm({\n message: '📧 Configurar servidor SMTP (envio de emails)?',\n default: false,\n });\n\n // 7. Autenticação\n const authChoices = await checkbox({\n message: '🔐 Quais métodos de autenticação usar?',\n choices: [\n { name: 'JWT (JSON Web Token)', value: 'jwt' },\n { name: 'Magic Link (login por email)', value: 'magicLink' },\n { name: 'Google OAuth', value: 'googleOAuth' },\n ],\n });\n\n const auth = {\n jwt: authChoices.includes('jwt'),\n magicLink: authChoices.includes('magicLink'),\n googleOAuth: authChoices.includes('googleOAuth'),\n };\n\n // Auto-habilitar SMTP se Magic Link selecionado\n if (auth.magicLink && !smtp) {\n smtp = true;\n console.log(' ℹ SMTP habilitado automaticamente (necessário para Magic Link)');\n }\n\n // 8. Redis\n let redis = await confirm({\n message: '🔴 Usar Redis (cache/sessões)?',\n default: false,\n });\n\n // 9. Filas e Jobs\n const queue = await select({\n message: '📬 Usar filas e jobs?',\n choices: [\n { name: 'BullMQ (requer Redis)', value: 'bullmq' as const },\n { name: 'RabbitMQ', value: 'rabbitmq' as const },\n { name: 'Nenhum', value: 'none' as const },\n ],\n });\n\n // Auto-habilitar Redis se BullMQ\n if (queue === 'bullmq' && !redis) {\n redis = true;\n console.log(' ℹ Redis habilitado automaticamente (necessário para BullMQ)');\n }\n\n // 10. Frontend\n const frontend = await select({\n message: '🎨 Qual framework de frontend?',\n choices: [\n { name: 'Next.js', value: 'nextjs' as const },\n { name: 'React (Vite)', value: 'react-vite' as const },\n { name: 'Vue', value: 'vue' as const },\n { name: 'Angular', value: 'angular' as const },\n ],\n });\n\n // 11. Backend\n const backend = await select({\n message: '🔧 Qual framework de backend?',\n choices: [\n { name: 'Express', value: 'express' as const },\n { name: 'Fastify', value: 'fastify' as const },\n { name: 'NestJS', value: 'nestjs' as const },\n ],\n });\n\n // 12. Integrações\n const integrationChoices = await checkbox({\n message: '🔌 Quais integrações usar?',\n choices: [\n { name: 'ViaCEP (consulta CEP)', value: 'viacep' },\n { name: 'WhatsApp', value: 'whatsapp' },\n { name: 'Stripe (pagamentos)', value: 'stripe' },\n { name: 'Mercado Pago (pagamentos)', value: 'mercadoPago' },\n { name: 'AbacatePay (pagamentos)', value: 'abacatePay' },\n ],\n });\n\n const integrations = {\n viacep: integrationChoices.includes('viacep'),\n whatsapp: integrationChoices.includes('whatsapp'),\n stripe: integrationChoices.includes('stripe'),\n mercadoPago: integrationChoices.includes('mercadoPago'),\n abacatePay: integrationChoices.includes('abacatePay'),\n };\n\n // 13. MinIO\n const minio = await confirm({\n message: '📦 Usar MinIO para storage (S3-compatible)?',\n default: false,\n });\n\n // 14. PM2\n const pm2 = await confirm({\n message: '🔄 Usar PM2 para atualizações sem downtime?',\n default: false,\n });\n\n // Computed fields\n const projectDir = path.resolve(process.cwd(), projectName);\n const usePrisma = database === 'postgresql' || database === 'mysql';\n const useMongoose = database === 'mongodb';\n const hasAnyAuth = auth.jwt || auth.magicLink || auth.googleOAuth;\n const hasAnyIntegration = Object.values(integrations).some(Boolean);\n const hasAnyQueue = queue !== 'none';\n\n return {\n projectName,\n projectDescription,\n runtime,\n database,\n multiTenant,\n smtp,\n redis,\n minio,\n pm2,\n auth,\n queue,\n frontend,\n backend,\n integrations,\n projectDir,\n usePrisma,\n useMongoose,\n hasAnyAuth,\n hasAnyIntegration,\n hasAnyQueue,\n };\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n info: (msg: string) => console.log(chalk.cyan(' ℹ'), msg),\n success: (msg: string) => console.log(chalk.green(' ✔'), msg),\n warn: (msg: string) => console.log(chalk.yellow(' ⚠'), msg),\n error: (msg: string) => console.log(chalk.red(' ✖'), msg),\n step: (msg: string) => console.log(chalk.blue(' →'), msg),\n title: (msg: string) => console.log(chalk.bold.white(`\\n ${msg}\\n`)),\n blank: () => console.log(),\n};\n\nexport function printBanner() {\n console.log(\n chalk.bold.cyan(`\n ╔═══════════════════════════════════════════════╗\n ║ ║\n ║ 🚀 PlazerCLI v1.0 ║\n ║ Fullstack Boilerplate Generator ║\n ║ ║\n ║ Oi! Eu sou a Liz, sua assistente. ║\n ║ Vou configurar seu projeto inteiro. ║\n ║ ║\n ╚═══════════════════════════════════════════════╝\n`)\n );\n}\n\nexport function printSummary(config: {\n projectName: string;\n frontend: string;\n backend: string;\n database: string;\n auth: { jwt: boolean; magicLink: boolean; googleOAuth: boolean };\n queue: string;\n redis: boolean;\n smtp: boolean;\n minio: boolean;\n pm2: boolean;\n multiTenant: boolean;\n integrations: Record<string, boolean>;\n}) {\n const authMethods = [\n config.auth.jwt && 'JWT',\n config.auth.magicLink && 'Magic Link',\n config.auth.googleOAuth && 'Google OAuth',\n ].filter(Boolean);\n\n const integrations = Object.entries(config.integrations)\n .filter(([, v]) => v)\n .map(([k]) => k);\n\n const infra = [\n config.redis && 'Redis',\n config.smtp && 'SMTP',\n config.minio && 'MinIO',\n config.pm2 && 'PM2',\n config.multiTenant && 'Multi-tenant',\n ].filter(Boolean);\n\n console.log(chalk.bold.white('\\n 📋 Liz preparou o resumo do projeto:\\n'));\n console.log(chalk.white(` Projeto: ${chalk.cyan(config.projectName)}`));\n console.log(chalk.white(` Frontend: ${chalk.cyan(config.frontend)}`));\n console.log(chalk.white(` Backend: ${chalk.cyan(config.backend)}`));\n console.log(chalk.white(` Banco de dados: ${chalk.cyan(config.database)}`));\n if (authMethods.length > 0) {\n console.log(chalk.white(` Autenticação: ${chalk.cyan(authMethods.join(', '))}`));\n }\n if (config.queue !== 'none') {\n console.log(chalk.white(` Filas: ${chalk.cyan(config.queue)}`));\n }\n if (infra.length > 0) {\n console.log(chalk.white(` Infra: ${chalk.cyan(infra.join(', '))}`));\n }\n if (integrations.length > 0) {\n console.log(chalk.white(` Integrações: ${chalk.cyan(integrations.join(', '))}`));\n }\n console.log();\n}\n","import path from 'path';\nimport chalk from 'chalk';\nimport type { ProjectConfig, EnvEntry } from '../types/config.js';\nimport type { InstallerOptions } from '../types/installers.js';\nimport { generateBase } from './base.js';\nimport { generateFrontend } from './frontend.js';\nimport { generateBackend } from './backend.js';\nimport { generateDocker } from './docker.js';\nimport { generateEnv } from './env.js';\nimport { generateReadme } from './readme.js';\nimport { generateWiring } from './wiring.js';\nimport { generateLiz } from './liz.js';\nimport { buildInstallerMap } from '../installers/index.js';\nimport { withSpinner } from '../helpers/spinner.js';\nimport { installDependencies } from '../helpers/runtime.js';\nimport { initGit } from '../helpers/git.js';\nimport { logger } from '../helpers/logger.js';\nimport { readPackageJson, writePackageJson, sortDeps } from '../helpers/packages.js';\nimport { getRunCommand } from '../helpers/runtime.js';\n\nexport async function generateProject(config: ProjectConfig): Promise<void> {\n const projectDir = config.projectDir;\n const apiDir = path.join(projectDir, 'apps', 'api');\n const webDir = path.join(projectDir, 'apps', 'web');\n\n const envEntries: EnvEntry[] = [];\n const dependencies: Record<string, string> = {};\n const devDependencies: Record<string, string> = {};\n const scripts: Record<string, string> = {};\n const dockerServices: string[] = [];\n\n const opts: InstallerOptions = {\n config,\n projectDir,\n apiDir,\n webDir,\n envEntries,\n dependencies,\n devDependencies,\n scripts,\n dockerServices,\n };\n\n console.log(chalk.cyan('\\n Liz está preparando seu projeto...\\n'));\n\n // 1. Base monorepo structure\n await withSpinner('Criando estrutura do monorepo...', async () => {\n await generateBase(config);\n });\n\n // 2. Frontend\n await withSpinner(`Configurando frontend (${config.frontend})...`, async () => {\n await generateFrontend(config, webDir);\n });\n\n // 3. Backend\n await withSpinner(`Configurando backend (${config.backend})...`, async () => {\n await generateBackend(config, apiDir);\n });\n\n // 4. Run installers\n const installerMap = buildInstallerMap(config);\n for (const [name, entry] of Object.entries(installerMap)) {\n if (entry.inUse) {\n await withSpinner(`Configurando ${name}...`, async () => {\n await entry.installer(opts);\n });\n }\n }\n\n // 5. Merge accumulated dependencies into API package.json\n if (Object.keys(dependencies).length > 0 || Object.keys(devDependencies).length > 0 || Object.keys(scripts).length > 0) {\n const apiPkg = await readPackageJson(apiDir);\n if (!apiPkg.dependencies) apiPkg.dependencies = {};\n if (!apiPkg.devDependencies) apiPkg.devDependencies = {};\n if (!apiPkg.scripts) apiPkg.scripts = {};\n Object.assign(apiPkg.dependencies, dependencies);\n Object.assign(apiPkg.devDependencies, devDependencies);\n Object.assign(apiPkg.scripts, scripts);\n await writePackageJson(apiDir, sortDeps(apiPkg));\n }\n\n // 6. Auto-wiring: connect all modules in the main app file\n await withSpinner('Conectando módulos automaticamente...', async () => {\n await generateWiring(config, apiDir);\n });\n\n // 7. Docker compose\n if (config.database !== 'none' || config.redis || config.queue === 'rabbitmq' || config.minio) {\n await withSpinner('Gerando docker-compose.yml...', async () => {\n await generateDocker(config, projectDir, dockerServices);\n });\n }\n\n // 8. Environment files\n await withSpinner('Gerando arquivos .env...', async () => {\n await generateEnv(config, apiDir, envEntries);\n });\n\n // 9. README\n await withSpinner('Gerando README.md...', async () => {\n await generateReadme(config, projectDir);\n });\n\n // 10. Liz - AI Agent config\n await withSpinner('Configurando Liz (AI Agent)...', async () => {\n await generateLiz(config, projectDir);\n });\n\n // 11. Install dependencies\n let installResult: { success: boolean; fallback?: string } = { success: false };\n try {\n await withSpinner(`Instalando dependências (${config.runtime})...`, async () => {\n installResult = await installDependencies(projectDir, config.runtime);\n });\n if (installResult.fallback) {\n logger.warn(`${config.runtime} não encontrado. Dependências instaladas com ${installResult.fallback}.`);\n }\n } catch {\n logger.warn(`Não foi possível instalar dependências automaticamente.`);\n logger.info(`Rode manualmente: cd ${config.projectName} && ${config.runtime} install`);\n }\n\n // 12. Git init\n try {\n await withSpinner('Inicializando repositório git...', async () => {\n await initGit(projectDir);\n });\n } catch {\n logger.warn('Git não encontrado. Inicialize manualmente com: git init');\n }\n\n // 13. Print success & next steps\n printNextSteps(config, installResult.success);\n}\n\nfunction printNextSteps(config: ProjectConfig, depsInstalled = true): void {\n const runCmd = getRunCommand(config.runtime);\n const hasDocker = config.database !== 'none' || config.redis || config.queue === 'rabbitmq' || config.minio;\n\n const authMethods = [\n config.auth.jwt && 'JWT',\n config.auth.magicLink && 'Magic Link',\n config.auth.googleOAuth && 'Google OAuth',\n ].filter(Boolean);\n\n const integrations = Object.entries(config.integrations)\n .filter(([, v]) => v)\n .map(([k]) => k);\n\n console.log(\n chalk.bold.green(`\n ╔═══════════════════════════════════════════════════╗\n ║ ║\n ║ ✅ Projeto \"${config.projectName}\" criado! ║\n ║ Tudo configurado pela Liz ║\n ║ ║\n ╚═══════════════════════════════════════════════════╝\n`)\n );\n\n // Show what was auto-configured\n console.log(chalk.bold.white(' O que a Liz configurou pra você:\\n'));\n\n console.log(chalk.green(' ✔ ') + chalk.white(`Frontend ${chalk.cyan(config.frontend)} pronto em apps/web/`));\n console.log(chalk.green(' ✔ ') + chalk.white(`Backend ${chalk.cyan(config.backend)} pronto em apps/api/`));\n\n if (config.database !== 'none') {\n console.log(chalk.green(' ✔ ') + chalk.white(`Banco ${chalk.cyan(config.database)} configurado com nome \"${chalk.cyan(config.projectName.replace(/-/g, '_'))}\"`));\n }\n if (authMethods.length > 0) {\n console.log(chalk.green(' ✔ ') + chalk.white(`Autenticação: ${chalk.cyan(authMethods.join(', '))} com rotas prontas`));\n }\n if (config.redis) {\n console.log(chalk.green(' ✔ ') + chalk.white(`Redis configurado e conectado`));\n }\n if (config.queue !== 'none') {\n console.log(chalk.green(' ✔ ') + chalk.white(`Filas ${chalk.cyan(config.queue)} com worker de exemplo`));\n }\n if (config.smtp) {\n console.log(chalk.green(' ✔ ') + chalk.white(`SMTP com serviço de email e template HTML`));\n }\n if (config.minio) {\n console.log(chalk.green(' ✔ ') + chalk.white(`MinIO storage com upload/download prontos`));\n }\n if (config.multiTenant) {\n console.log(chalk.green(' ✔ ') + chalk.white(`Multi-tenant com middleware de isolamento`));\n }\n if (config.pm2) {\n console.log(chalk.green(' ✔ ') + chalk.white(`PM2 com cluster mode para zero-downtime`));\n }\n if (integrations.length > 0) {\n console.log(chalk.green(' ✔ ') + chalk.white(`Integrações: ${chalk.cyan(integrations.join(', '))}`));\n }\n console.log(chalk.green(' ✔ ') + chalk.white(`Liz (AI Agent) configurada para te ajudar`));\n\n if (hasDocker) {\n console.log(chalk.green(' ✔ ') + chalk.white(`Docker Compose com todos os serviços`));\n }\n\n console.log(chalk.bold.white('\\n Próximos passos:\\n'));\n\n let step = 1;\n console.log(chalk.white(` ${step}. ${chalk.cyan(`cd ${config.projectName}`)}`));\n step++;\n\n if (!depsInstalled) {\n console.log(chalk.white(` ${step}. ${chalk.cyan(`${config.runtime} install`)}`));\n console.log(chalk.gray(' Instala as dependências do projeto'));\n step++;\n }\n\n if (hasDocker) {\n console.log(chalk.white(` ${step}. ${chalk.cyan('docker compose up -d')}`));\n console.log(chalk.gray(' Sobe banco, redis, minio, etc em containers'));\n step++;\n }\n\n if (config.usePrisma) {\n console.log(chalk.white(` ${step}. ${chalk.cyan('cd apps/api && npx prisma db push && cd ../..')}`));\n console.log(chalk.gray(' Cria as tabelas no banco de dados'));\n step++;\n }\n\n console.log(chalk.white(` ${step}. ${chalk.cyan(`${runCmd} dev`)}`));\n console.log(chalk.gray(' Inicia frontend e API em modo desenvolvimento'));\n\n console.log(chalk.bold.white('\\n URLs:\\n'));\n console.log(chalk.white(` Frontend: ${chalk.cyan('http://localhost:3000')}`));\n console.log(chalk.white(` API: ${chalk.cyan('http://localhost:3001')}`));\n console.log(chalk.white(` Health: ${chalk.cyan('http://localhost:3001/api/health')}`));\n if (config.usePrisma) {\n console.log(chalk.white(` DB Studio: ${chalk.cyan('npx prisma studio')} (na pasta apps/api)`));\n }\n if (config.queue === 'rabbitmq') {\n console.log(chalk.white(` RabbitMQ: ${chalk.cyan('http://localhost:15672')} (guest/guest)`));\n }\n if (config.minio) {\n console.log(chalk.white(` MinIO: ${chalk.cyan('http://localhost:9001')} (minioadmin/minioadmin)`));\n }\n\n if (config.pm2) {\n console.log(chalk.bold.white('\\n Produção com PM2:\\n'));\n console.log(chalk.white(` ${chalk.cyan(`${runCmd} build`)} && ${chalk.cyan('pm2 start ecosystem.config.cjs')}`));\n }\n\n console.log(chalk.gray(`\\n Precisa de ajuda? A Liz está disponível no seu editor.`));\n console.log(chalk.gray(` Documentação: https://github.com/pablocarss/plazercli\\n`));\n}\n","import path from 'path';\nimport type { ProjectConfig } from '../types/config.js';\nimport { ensureDir, writeFile, copyFile, getTemplatePath } from '../helpers/filesystem.js';\nimport { renderTemplate } from '../helpers/template.js';\nimport { getRunCommand } from '../helpers/runtime.js';\n\nexport async function generateBase(config: ProjectConfig): Promise<void> {\n const { projectDir, projectName, projectDescription, runtime } = config;\n\n // Create root directories\n await ensureDir(projectDir);\n await ensureDir(path.join(projectDir, 'apps'));\n await ensureDir(path.join(projectDir, 'apps', 'api'));\n await ensureDir(path.join(projectDir, 'apps', 'web'));\n\n // Render root package.json\n const runCmd = getRunCommand(runtime);\n const packageJsonTemplate = getTemplatePath('base', 'root', 'package.json.ejs');\n const packageJsonContent = await renderTemplate(packageJsonTemplate, {\n projectName,\n projectDescription,\n runCmd,\n });\n await writeFile(path.join(projectDir, 'package.json'), packageJsonContent);\n\n // Copy static root files\n await copyFile(\n getTemplatePath('base', 'root', 'gitignore'),\n path.join(projectDir, '.gitignore')\n );\n await copyFile(\n getTemplatePath('base', 'root', 'editorconfig'),\n path.join(projectDir, '.editorconfig')\n );\n await copyFile(\n getTemplatePath('base', 'root', 'nvmrc'),\n path.join(projectDir, '.nvmrc')\n );\n\n // pnpm-workspace.yaml only for pnpm\n if (runtime === 'pnpm') {\n await copyFile(\n getTemplatePath('base', 'root', 'pnpm-workspace.yaml'),\n path.join(projectDir, 'pnpm-workspace.yaml')\n );\n }\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n// Resolve templates dir from both src/helpers/ (dev) and dist/ (built)\nconst TEMPLATE_DIR = fs.existsSync(path.resolve(__dirname, '../../templates'))\n ? path.resolve(__dirname, '../../templates')\n : path.resolve(__dirname, '../templates');\n\nexport function getTemplatePath(...segments: string[]): string {\n return path.join(TEMPLATE_DIR, ...segments);\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.ensureDir(dir);\n}\n\nexport async function copyDir(src: string, dest: string): Promise<void> {\n await fs.copy(src, dest, { overwrite: true });\n}\n\nexport async function copyFile(src: string, dest: string): Promise<void> {\n await fs.ensureDir(path.dirname(dest));\n await fs.copyFile(src, dest);\n}\n\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\nexport async function readFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf-8');\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n return fs.pathExists(filePath);\n}\n","import ejs from 'ejs';\nimport { readFile, writeFile, getTemplatePath } from './filesystem.js';\nimport path from 'path';\n\nexport async function renderTemplate(\n templatePath: string,\n data: Record<string, unknown>\n): Promise<string> {\n const template = await readFile(templatePath);\n return ejs.render(template, data, { async: false });\n}\n\nexport async function renderTemplateToFile(\n templateRelativePath: string,\n destPath: string,\n data: Record<string, unknown>\n): Promise<void> {\n const templatePath = getTemplatePath(templateRelativePath);\n const rendered = await renderTemplate(templatePath, data);\n\n // Remove .ejs extension from destination if present\n const finalDest = destPath.endsWith('.ejs')\n ? destPath.slice(0, -4)\n : destPath;\n\n await writeFile(finalDest, rendered);\n}\n\nexport async function renderAndWrite(\n templateDir: string,\n destDir: string,\n fileName: string,\n data: Record<string, unknown>\n): Promise<void> {\n const templatePath = path.join(templateDir, `${fileName}.ejs`);\n const rendered = await renderTemplate(templatePath, data);\n await writeFile(path.join(destDir, fileName), rendered);\n}\n","import { execa } from 'execa';\nimport type { ProjectConfig } from '../types/config.js';\n\nexport function getInstallCommand(runtime: ProjectConfig['runtime']): [string, string[]] {\n switch (runtime) {\n case 'bun':\n return ['bun', ['install']];\n case 'pnpm':\n return ['pnpm', ['install']];\n case 'npm':\n return ['npm', ['install']];\n }\n}\n\nexport function getRunCommand(runtime: ProjectConfig['runtime']): string {\n switch (runtime) {\n case 'bun':\n return 'bun run';\n case 'pnpm':\n return 'pnpm run';\n case 'npm':\n return 'npm run';\n }\n}\n\nasync function isCommandAvailable(cmd: string): Promise<boolean> {\n try {\n await execa('which', [cmd]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function installDependencies(\n projectDir: string,\n runtime: ProjectConfig['runtime']\n): Promise<{ success: boolean; fallback?: string }> {\n const [cmd, args] = getInstallCommand(runtime);\n\n // Check if selected runtime is available\n if (await isCommandAvailable(cmd)) {\n await execa(cmd, args, { cwd: projectDir, stdio: 'pipe' });\n return { success: true };\n }\n\n // Try fallback runtimes\n const fallbacks: ProjectConfig['runtime'][] = ['npm', 'pnpm', 'bun'];\n for (const fb of fallbacks) {\n if (fb === runtime) continue;\n const [fbCmd, fbArgs] = getInstallCommand(fb);\n if (await isCommandAvailable(fbCmd)) {\n await execa(fbCmd, fbArgs, { cwd: projectDir, stdio: 'pipe' });\n return { success: true, fallback: fb };\n }\n }\n\n return { success: false };\n}\n","import path from 'path';\nimport type { ProjectConfig } from '../types/config.js';\nimport { writeFile, ensureDir } from '../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../installers/dependencyVersionMap.js';\n\nexport async function generateFrontend(config: ProjectConfig, webDir: string): Promise<void> {\n switch (config.frontend) {\n case 'nextjs':\n await generateNextjs(config, webDir);\n break;\n case 'react-vite':\n await generateReactVite(config, webDir);\n break;\n case 'vue':\n await generateVue(config, webDir);\n break;\n case 'angular':\n await generateAngular(config, webDir);\n break;\n }\n}\n\nasync function generateNextjs(config: ProjectConfig, webDir: string): Promise<void> {\n await ensureDir(path.join(webDir, 'src', 'app'));\n await ensureDir(path.join(webDir, 'public'));\n\n await writeFile(path.join(webDir, 'package.json'), JSON.stringify({\n name: `@${config.projectName}/web`,\n version: '0.1.0',\n private: true,\n scripts: {\n dev: 'next dev',\n build: 'next build',\n start: 'next start',\n lint: 'next lint',\n },\n dependencies: {\n next: deps.next,\n react: deps.react,\n 'react-dom': deps['react-dom'],\n },\n devDependencies: {\n '@types/node': deps['@types/node'],\n '@types/react': deps['@types/react'],\n '@types/react-dom': deps['@types/react-dom'],\n typescript: deps.typescript,\n },\n }, null, 2) + '\\n');\n\n await writeFile(path.join(webDir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2017',\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: [{ name: 'next' }],\n paths: { '@/*': ['./src/*'] },\n },\n include: ['next-env.d.ts', '**/*.ts', '**/*.tsx', '.next/types/**/*.ts'],\n exclude: ['node_modules'],\n }, null, 2) + '\\n');\n\n await writeFile(path.join(webDir, 'next.config.ts'), `import type { NextConfig } from 'next';\n\nconst nextConfig: NextConfig = {};\n\nexport default nextConfig;\n`);\n\n await writeFile(path.join(webDir, 'src', 'app', 'layout.tsx'), `import type { Metadata } from 'next';\nimport './globals.css';\n\nexport const metadata: Metadata = {\n title: '${config.projectName}',\n description: '${config.projectDescription}',\n};\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode;\n}) {\n return (\n <html lang=\"pt-BR\">\n <body>{children}</body>\n </html>\n );\n}\n`);\n\n await writeFile(path.join(webDir, 'src', 'app', 'page.tsx'), `export default function Home() {\n return (\n <main style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', fontFamily: 'system-ui' }}>\n <h1>${config.projectName}</h1>\n <p>${config.projectDescription}</p>\n <p style={{ marginTop: '2rem', color: '#666' }}>\n API rodando em <a href=\"http://localhost:3001\" style={{ color: '#0070f3' }}>http://localhost:3001</a>\n </p>\n </main>\n );\n}\n`);\n\n await writeFile(path.join(webDir, 'src', 'app', 'globals.css'), `* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n font-family: system-ui, -apple-system, sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n\na {\n color: inherit;\n text-decoration: none;\n}\n`);\n}\n\nasync function generateReactVite(config: ProjectConfig, webDir: string): Promise<void> {\n await ensureDir(path.join(webDir, 'src'));\n await ensureDir(path.join(webDir, 'public'));\n\n await writeFile(path.join(webDir, 'package.json'), JSON.stringify({\n name: `@${config.projectName}/web`,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc -b && vite build',\n preview: 'vite preview',\n },\n dependencies: {\n react: deps.react,\n 'react-dom': deps['react-dom'],\n },\n devDependencies: {\n '@types/react': deps['@types/react'],\n '@types/react-dom': deps['@types/react-dom'],\n '@vitejs/plugin-react': '^4.3.0',\n typescript: deps.typescript,\n vite: deps.vite,\n },\n }, null, 2) + '\\n');\n\n await writeFile(path.join(webDir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2020',\n useDefineForClassFields: true,\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n },\n include: ['src'],\n }, null, 2) + '\\n');\n\n await writeFile(path.join(webDir, 'vite.config.ts'), `import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n plugins: [react()],\n server: {\n port: 3000,\n },\n});\n`);\n\n await writeFile(path.join(webDir, 'index.html'), `<!doctype html>\n<html lang=\"pt-BR\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${config.projectName}</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`);\n\n await writeFile(path.join(webDir, 'src', 'main.tsx'), `import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport './index.css';\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n);\n`);\n\n await writeFile(path.join(webDir, 'src', 'App.tsx'), `function App() {\n return (\n <main style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', fontFamily: 'system-ui' }}>\n <h1>${config.projectName}</h1>\n <p>${config.projectDescription}</p>\n <p style={{ marginTop: '2rem', color: '#666' }}>\n API rodando em <a href=\"http://localhost:3001\" style={{ color: '#0070f3' }}>http://localhost:3001</a>\n </p>\n </main>\n );\n}\n\nexport default App;\n`);\n\n await writeFile(path.join(webDir, 'src', 'index.css'), `* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n font-family: system-ui, -apple-system, sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n`);\n}\n\nasync function generateVue(config: ProjectConfig, webDir: string): Promise<void> {\n await ensureDir(path.join(webDir, 'src'));\n await ensureDir(path.join(webDir, 'public'));\n\n await writeFile(path.join(webDir, 'package.json'), JSON.stringify({\n name: `@${config.projectName}/web`,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'vue-tsc -b && vite build',\n preview: 'vite preview',\n },\n dependencies: {\n vue: deps.vue,\n 'vue-router': deps['vue-router'],\n },\n devDependencies: {\n '@vitejs/plugin-vue': deps['@vitejs/plugin-vue'],\n typescript: deps.typescript,\n vite: deps.vite,\n 'vue-tsc': '^2.1.0',\n },\n }, null, 2) + '\\n');\n\n await writeFile(path.join(webDir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2020',\n module: 'ESNext',\n lib: ['ES2020', 'DOM', 'DOM.Iterable'],\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n isolatedModules: true,\n noEmit: true,\n jsx: 'preserve',\n strict: true,\n },\n include: ['src/**/*.ts', 'src/**/*.vue'],\n }, null, 2) + '\\n');\n\n await writeFile(path.join(webDir, 'vite.config.ts'), `import { defineConfig } from 'vite';\nimport vue from '@vitejs/plugin-vue';\n\nexport default defineConfig({\n plugins: [vue()],\n server: {\n port: 3000,\n },\n});\n`);\n\n await writeFile(path.join(webDir, 'index.html'), `<!doctype html>\n<html lang=\"pt-BR\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${config.projectName}</title>\n </head>\n <body>\n <div id=\"app\"></div>\n <script type=\"module\" src=\"/src/main.ts\"></script>\n </body>\n</html>\n`);\n\n await writeFile(path.join(webDir, 'src', 'main.ts'), `import { createApp } from 'vue';\nimport App from './App.vue';\nimport './style.css';\n\ncreateApp(App).mount('#app');\n`);\n\n await writeFile(path.join(webDir, 'src', 'App.vue'), `<template>\n <main class=\"container\">\n <h1>${config.projectName}</h1>\n <p>${config.projectDescription}</p>\n <p class=\"api-link\">\n API rodando em <a href=\"http://localhost:3001\">http://localhost:3001</a>\n </p>\n </main>\n</template>\n\n<style scoped>\n.container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n font-family: system-ui;\n}\n.api-link {\n margin-top: 2rem;\n color: #666;\n}\n.api-link a {\n color: #42b883;\n}\n</style>\n`);\n\n await writeFile(path.join(webDir, 'src', 'style.css'), `* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n font-family: system-ui, -apple-system, sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n`);\n\n await writeFile(path.join(webDir, 'env.d.ts'), `/// <reference types=\"vite/client\" />\n`);\n}\n\nasync function generateAngular(config: ProjectConfig, webDir: string): Promise<void> {\n await ensureDir(path.join(webDir, 'src', 'app'));\n\n await writeFile(path.join(webDir, 'package.json'), JSON.stringify({\n name: `@${config.projectName}/web`,\n version: '0.1.0',\n private: true,\n scripts: {\n dev: 'ng serve --port 3000',\n build: 'ng build',\n lint: 'ng lint',\n },\n dependencies: {\n '@angular/animations': deps['@angular/core'],\n '@angular/common': deps['@angular/core'],\n '@angular/compiler': deps['@angular/core'],\n '@angular/core': deps['@angular/core'],\n '@angular/forms': deps['@angular/core'],\n '@angular/platform-browser': deps['@angular/core'],\n '@angular/platform-browser-dynamic': deps['@angular/core'],\n '@angular/router': deps['@angular/core'],\n rxjs: deps.rxjs,\n 'zone.js': '^0.15.0',\n },\n devDependencies: {\n '@angular/cli': deps['@angular/cli'],\n '@angular/compiler-cli': deps['@angular/core'],\n typescript: deps.typescript,\n },\n }, null, 2) + '\\n');\n\n await writeFile(path.join(webDir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ES2022',\n lib: ['ES2022', 'dom'],\n skipLibCheck: true,\n moduleResolution: 'bundler',\n strict: true,\n noEmit: false,\n declaration: false,\n experimentalDecorators: true,\n emitDecoratorMetadata: true,\n outDir: './dist',\n },\n include: ['src/**/*.ts'],\n }, null, 2) + '\\n');\n\n await writeFile(path.join(webDir, 'angular.json'), JSON.stringify({\n $schema: './node_modules/@angular/cli/lib/config/schema.json',\n version: 1,\n newProjectRoot: 'projects',\n projects: {\n web: {\n projectType: 'application',\n root: '',\n sourceRoot: 'src',\n architect: {\n build: {\n builder: '@angular-devkit/build-angular:application',\n options: {\n outputPath: 'dist',\n index: 'src/index.html',\n browser: 'src/main.ts',\n tsConfig: 'tsconfig.json',\n },\n },\n serve: {\n builder: '@angular-devkit/build-angular:dev-server',\n configurations: {\n development: { buildTarget: 'web:build' },\n },\n defaultConfiguration: 'development',\n },\n },\n },\n },\n }, null, 2) + '\\n');\n\n await writeFile(path.join(webDir, 'src', 'index.html'), `<!doctype html>\n<html lang=\"pt-BR\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${config.projectName}</title>\n </head>\n <body>\n <app-root></app-root>\n </body>\n</html>\n`);\n\n await writeFile(path.join(webDir, 'src', 'main.ts'), `import { bootstrapApplication } from '@angular/platform-browser';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent).catch((err) => console.error(err));\n`);\n\n await writeFile(path.join(webDir, 'src', 'app', 'app.component.ts'), `import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-root',\n standalone: true,\n template: \\`\n <main style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 100vh; font-family: system-ui;\">\n <h1>${config.projectName}</h1>\n <p>${config.projectDescription}</p>\n <p style=\"margin-top: 2rem; color: #666;\">\n API rodando em <a href=\"http://localhost:3001\" style=\"color: #dd0031;\">http://localhost:3001</a>\n </p>\n </main>\n \\`,\n})\nexport class AppComponent {}\n`);\n\n await writeFile(path.join(webDir, 'src', 'styles.css'), `* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n font-family: system-ui, -apple-system, sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n`);\n}\n","export const dependencyVersionMap = {\n // Prisma\n 'prisma': '^6.3.0',\n '@prisma/client': '^6.3.0',\n\n // Mongoose\n 'mongoose': '^8.9.0',\n\n // Auth\n 'jsonwebtoken': '^9.0.2',\n '@types/jsonwebtoken': '^9.0.7',\n 'bcryptjs': '^2.4.3',\n '@types/bcryptjs': '^2.4.6',\n 'passport': '^0.7.0',\n 'passport-jwt': '^4.0.1',\n '@types/passport-jwt': '^4.0.1',\n 'passport-google-oauth20': '^2.0.0',\n '@types/passport-google-oauth20': '^2.0.16',\n '@nestjs/jwt': '^11.0.0',\n '@nestjs/passport': '^11.0.0',\n 'nanoid': '^5.0.9',\n\n // Queues\n 'bullmq': '^5.30.0',\n '@nestjs/bullmq': '^11.0.0',\n 'amqplib': '^0.10.5',\n '@types/amqplib': '^0.10.6',\n\n // Redis\n 'ioredis': '^5.4.0',\n\n // SMTP\n 'nodemailer': '^6.9.0',\n '@types/nodemailer': '^6.4.17',\n\n // Storage\n 'minio': '^8.0.0',\n\n // Integrations\n 'axios': '^1.7.0',\n 'stripe': '^17.4.0',\n 'mercadopago': '^2.0.0',\n\n // Express\n 'express': '^4.21.0',\n '@types/express': '^4.17.21',\n 'cors': '^2.8.5',\n '@types/cors': '^2.8.17',\n 'helmet': '^8.0.0',\n 'dotenv': '^16.4.0',\n\n // Fastify\n '@fastify/cors': '^10.0.0',\n '@fastify/helmet': '^12.0.0',\n 'fastify': '^5.0.0',\n\n // NestJS\n '@nestjs/common': '^11.0.0',\n '@nestjs/core': '^11.0.0',\n '@nestjs/platform-express': '^11.0.0',\n '@nestjs/config': '^4.0.0',\n '@nestjs/cli': '^11.0.0',\n 'reflect-metadata': '^0.2.2',\n 'rxjs': '^7.8.1',\n\n // Next.js\n 'next': '^15.0.0',\n 'react': '^19.0.0',\n 'react-dom': '^19.0.0',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n\n // Vue\n 'vue': '^3.5.0',\n 'vue-router': '^4.5.0',\n '@vitejs/plugin-vue': '^5.0.0',\n\n // Angular\n '@angular/core': '^19.0.0',\n '@angular/cli': '^19.0.0',\n\n // Common\n 'typescript': '^5.7.0',\n 'vite': '^6.0.0',\n '@types/node': '^22.10.0',\n 'tsx': '^4.19.0',\n 'pm2': '^5.4.0',\n} as const;\n","import path from 'path';\nimport type { ProjectConfig } from '../types/config.js';\nimport { writeFile, ensureDir } from '../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../installers/dependencyVersionMap.js';\n\nexport async function generateBackend(config: ProjectConfig, apiDir: string): Promise<void> {\n switch (config.backend) {\n case 'express':\n await generateExpress(config, apiDir);\n break;\n case 'fastify':\n await generateFastify(config, apiDir);\n break;\n case 'nestjs':\n await generateNestjs(config, apiDir);\n break;\n }\n}\n\nasync function generateExpress(config: ProjectConfig, apiDir: string): Promise<void> {\n await ensureDir(path.join(apiDir, 'src', 'routes'));\n await ensureDir(path.join(apiDir, 'src', 'middlewares'));\n await ensureDir(path.join(apiDir, 'src', 'config'));\n\n await writeFile(path.join(apiDir, 'package.json'), JSON.stringify({\n name: `@${config.projectName}/api`,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'tsx watch src/index.ts',\n build: 'tsc',\n start: 'node dist/index.js',\n lint: 'tsc --noEmit',\n },\n dependencies: {\n express: deps.express,\n cors: deps.cors,\n helmet: deps.helmet,\n dotenv: deps.dotenv,\n },\n devDependencies: {\n '@types/express': deps['@types/express'],\n '@types/cors': deps['@types/cors'],\n '@types/node': deps['@types/node'],\n typescript: deps.typescript,\n tsx: deps.tsx,\n },\n }, null, 2) + '\\n');\n\n await writeFile(path.join(apiDir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n outDir: 'dist',\n rootDir: 'src',\n skipLibCheck: true,\n declaration: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules', 'dist'],\n }, null, 2) + '\\n');\n\n await writeFile(path.join(apiDir, 'src', 'config', 'index.ts'), `import 'dotenv/config';\n\nexport const config = {\n port: Number(process.env.PORT) || 3001,\n nodeEnv: process.env.NODE_ENV || 'development',\n corsOrigin: process.env.CORS_ORIGIN || 'http://localhost:3000',\n};\n`);\n\n await writeFile(path.join(apiDir, 'src', 'app.ts'), `import express from 'express';\nimport cors from 'cors';\nimport helmet from 'helmet';\nimport { config } from './config/index.js';\nimport { router } from './routes/index.js';\nimport { errorHandler } from './middlewares/errorHandler.js';\n\nconst app = express();\n\napp.use(helmet());\napp.use(cors({ origin: config.corsOrigin }));\napp.use(express.json());\n\napp.use('/api', router);\n\napp.use(errorHandler);\n\nexport { app };\n`);\n\n await writeFile(path.join(apiDir, 'src', 'index.ts'), `import { app } from './app.js';\nimport { config } from './config/index.js';\n\napp.listen(config.port, () => {\n console.log(\\`🚀 API rodando em http://localhost:\\${config.port}\\`);\n});\n`);\n\n await writeFile(path.join(apiDir, 'src', 'routes', 'index.ts'), `import { Router } from 'express';\n\nconst router = Router();\n\nrouter.get('/health', (_req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\nexport { router };\n`);\n\n await writeFile(path.join(apiDir, 'src', 'middlewares', 'errorHandler.ts'), `import type { Request, Response, NextFunction } from 'express';\n\nexport function errorHandler(err: Error, _req: Request, res: Response, _next: NextFunction) {\n console.error(err.stack);\n res.status(500).json({\n error: 'Internal Server Error',\n message: process.env.NODE_ENV === 'development' ? err.message : undefined,\n });\n}\n`);\n}\n\nasync function generateFastify(config: ProjectConfig, apiDir: string): Promise<void> {\n await ensureDir(path.join(apiDir, 'src', 'routes'));\n await ensureDir(path.join(apiDir, 'src', 'plugins'));\n await ensureDir(path.join(apiDir, 'src', 'config'));\n\n await writeFile(path.join(apiDir, 'package.json'), JSON.stringify({\n name: `@${config.projectName}/api`,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts: {\n dev: 'tsx watch src/index.ts',\n build: 'tsc',\n start: 'node dist/index.js',\n lint: 'tsc --noEmit',\n },\n dependencies: {\n fastify: deps.fastify,\n '@fastify/cors': deps['@fastify/cors'],\n '@fastify/helmet': deps['@fastify/helmet'],\n dotenv: deps.dotenv,\n },\n devDependencies: {\n '@types/node': deps['@types/node'],\n typescript: deps.typescript,\n tsx: deps.tsx,\n },\n }, null, 2) + '\\n');\n\n await writeFile(path.join(apiDir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n outDir: 'dist',\n rootDir: 'src',\n skipLibCheck: true,\n declaration: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules', 'dist'],\n }, null, 2) + '\\n');\n\n await writeFile(path.join(apiDir, 'src', 'config', 'index.ts'), `import 'dotenv/config';\n\nexport const config = {\n port: Number(process.env.PORT) || 3001,\n host: process.env.HOST || '0.0.0.0',\n nodeEnv: process.env.NODE_ENV || 'development',\n corsOrigin: process.env.CORS_ORIGIN || 'http://localhost:3000',\n};\n`);\n\n await writeFile(path.join(apiDir, 'src', 'app.ts'), `import Fastify from 'fastify';\nimport cors from '@fastify/cors';\nimport helmet from '@fastify/helmet';\nimport { config } from './config/index.js';\nimport { registerRoutes } from './routes/index.js';\n\nexport async function buildApp() {\n const app = Fastify({\n logger: config.nodeEnv === 'development',\n });\n\n await app.register(helmet);\n await app.register(cors, { origin: config.corsOrigin });\n\n registerRoutes(app);\n\n return app;\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'index.ts'), `import { buildApp } from './app.js';\nimport { config } from './config/index.js';\n\nasync function start() {\n const app = await buildApp();\n\n await app.listen({ port: config.port, host: config.host });\n console.log(\\`🚀 API rodando em http://localhost:\\${config.port}\\`);\n}\n\nstart().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n`);\n\n await writeFile(path.join(apiDir, 'src', 'routes', 'index.ts'), `import type { FastifyInstance } from 'fastify';\n\nexport function registerRoutes(app: FastifyInstance) {\n app.get('/api/health', async () => {\n return { status: 'ok', timestamp: new Date().toISOString() };\n });\n}\n`);\n}\n\nasync function generateNestjs(config: ProjectConfig, apiDir: string): Promise<void> {\n await ensureDir(path.join(apiDir, 'src'));\n\n await writeFile(path.join(apiDir, 'package.json'), JSON.stringify({\n name: `@${config.projectName}/api`,\n version: '0.1.0',\n private: true,\n scripts: {\n dev: 'nest start --watch',\n build: 'nest build',\n start: 'node dist/main.js',\n 'start:prod': 'node dist/main.js',\n lint: 'tsc --noEmit',\n },\n dependencies: {\n '@nestjs/common': deps['@nestjs/common'],\n '@nestjs/core': deps['@nestjs/core'],\n '@nestjs/platform-express': deps['@nestjs/platform-express'],\n '@nestjs/config': deps['@nestjs/config'],\n 'reflect-metadata': deps['reflect-metadata'],\n rxjs: deps.rxjs,\n },\n devDependencies: {\n '@nestjs/cli': deps['@nestjs/cli'],\n '@types/node': deps['@types/node'],\n typescript: deps.typescript,\n },\n }, null, 2) + '\\n');\n\n await writeFile(path.join(apiDir, 'tsconfig.json'), JSON.stringify({\n compilerOptions: {\n module: 'commonjs',\n declaration: true,\n removeComments: true,\n emitDecoratorMetadata: true,\n experimentalDecorators: true,\n allowSyntheticDefaultImports: true,\n target: 'ES2021',\n sourceMap: true,\n outDir: './dist',\n rootDir: './src',\n strict: true,\n skipLibCheck: true,\n },\n include: ['src/**/*'],\n exclude: ['node_modules', 'dist'],\n }, null, 2) + '\\n');\n\n await writeFile(path.join(apiDir, 'nest-cli.json'), JSON.stringify({\n $schema: 'https://json.schemastore.org/nest-cli',\n collection: '@nestjs/schematics',\n sourceRoot: 'src',\n }, null, 2) + '\\n');\n\n await writeFile(path.join(apiDir, 'src', 'main.ts'), `import { NestFactory } from '@nestjs/core';\nimport { AppModule } from './app.module';\n\nasync function bootstrap() {\n const app = await NestFactory.create(AppModule);\n app.enableCors({ origin: process.env.CORS_ORIGIN || 'http://localhost:3000' });\n app.setGlobalPrefix('api');\n\n const port = process.env.PORT || 3001;\n await app.listen(port);\n console.log(\\`🚀 API rodando em http://localhost:\\${port}\\`);\n}\n\nbootstrap();\n`);\n\n await writeFile(path.join(apiDir, 'src', 'app.module.ts'), `import { Module } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { AppController } from './app.controller';\nimport { AppService } from './app.service';\n\n@Module({\n imports: [\n ConfigModule.forRoot({ isGlobal: true }),\n ],\n controllers: [AppController],\n providers: [AppService],\n})\nexport class AppModule {}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'app.controller.ts'), `import { Controller, Get } from '@nestjs/common';\nimport { AppService } from './app.service';\n\n@Controller()\nexport class AppController {\n constructor(private readonly appService: AppService) {}\n\n @Get('health')\n getHealth() {\n return this.appService.getHealth();\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'app.service.ts'), `import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class AppService {\n getHealth() {\n return { status: 'ok', timestamp: new Date().toISOString() };\n }\n}\n`);\n}\n","import path from 'path';\nimport type { ProjectConfig } from '../types/config.js';\nimport { writeFile } from '../helpers/filesystem.js';\n\nexport async function generateDocker(\n config: ProjectConfig,\n projectDir: string,\n extraServices: string[]\n): Promise<void> {\n const services: string[] = [];\n\n // Database services\n if (config.database === 'postgresql') {\n services.push(` postgres:\n image: postgres:16-alpine\n container_name: ${config.projectName}-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: ${config.projectName.replace(/-/g, '_')}\n ports:\n - \"5432:5432\"\n volumes:\n - postgres_data:/var/lib/postgresql/data`);\n }\n\n if (config.database === 'mysql') {\n services.push(` mysql:\n image: mysql:8\n container_name: ${config.projectName}-mysql\n restart: unless-stopped\n environment:\n MYSQL_ROOT_PASSWORD: root\n MYSQL_DATABASE: ${config.projectName.replace(/-/g, '_')}\n MYSQL_USER: user\n MYSQL_PASSWORD: password\n ports:\n - \"3306:3306\"\n volumes:\n - mysql_data:/var/lib/mysql`);\n }\n\n if (config.database === 'mongodb') {\n services.push(` mongodb:\n image: mongo:7\n container_name: ${config.projectName}-mongodb\n restart: unless-stopped\n environment:\n MONGO_INITDB_ROOT_USERNAME: root\n MONGO_INITDB_ROOT_PASSWORD: root\n MONGO_INITDB_DATABASE: ${config.projectName.replace(/-/g, '_')}\n ports:\n - \"27017:27017\"\n volumes:\n - mongodb_data:/data/db`);\n }\n\n // Redis\n if (config.redis) {\n services.push(` redis:\n image: redis:7-alpine\n container_name: ${config.projectName}-redis\n restart: unless-stopped\n ports:\n - \"6379:6379\"\n volumes:\n - redis_data:/data`);\n }\n\n // RabbitMQ\n if (config.queue === 'rabbitmq') {\n services.push(` rabbitmq:\n image: rabbitmq:3-management-alpine\n container_name: ${config.projectName}-rabbitmq\n restart: unless-stopped\n environment:\n RABBITMQ_DEFAULT_USER: guest\n RABBITMQ_DEFAULT_PASS: guest\n ports:\n - \"5672:5672\"\n - \"15672:15672\"\n volumes:\n - rabbitmq_data:/var/lib/rabbitmq`);\n }\n\n // MinIO\n if (config.minio) {\n services.push(` minio:\n image: minio/minio\n container_name: ${config.projectName}-minio\n restart: unless-stopped\n command: server /data --console-address \":9001\"\n environment:\n MINIO_ROOT_USER: minioadmin\n MINIO_ROOT_PASSWORD: minioadmin\n ports:\n - \"9000:9000\"\n - \"9001:9001\"\n volumes:\n - minio_data:/data`);\n }\n\n // Extra services from installers\n services.push(...extraServices);\n\n // Volumes\n const volumes: string[] = [];\n if (config.database === 'postgresql') volumes.push(' postgres_data:');\n if (config.database === 'mysql') volumes.push(' mysql_data:');\n if (config.database === 'mongodb') volumes.push(' mongodb_data:');\n if (config.redis) volumes.push(' redis_data:');\n if (config.queue === 'rabbitmq') volumes.push(' rabbitmq_data:');\n if (config.minio) volumes.push(' minio_data:');\n\n const content = `services:\n${services.join('\\n\\n')}\n\nvolumes:\n${volumes.join('\\n')}\n`;\n\n await writeFile(path.join(projectDir, 'docker-compose.yml'), content);\n}\n","import path from 'path';\nimport type { ProjectConfig, EnvEntry } from '../types/config.js';\nimport { writeFile } from '../helpers/filesystem.js';\n\nexport async function generateEnv(\n config: ProjectConfig,\n apiDir: string,\n envEntries: EnvEntry[]\n): Promise<void> {\n // Add base entries\n const baseEntries: EnvEntry[] = [\n { key: 'NODE_ENV', value: 'development', category: 'App', comment: 'Ambiente' },\n { key: 'PORT', value: '3001', category: 'App' },\n ];\n\n // Database entries\n if (config.database === 'postgresql') {\n baseEntries.push({\n key: 'DATABASE_URL',\n value: `postgresql://postgres:postgres@localhost:5432/${config.projectName.replace(/-/g, '_')}`,\n category: 'Database',\n });\n } else if (config.database === 'mysql') {\n baseEntries.push({\n key: 'DATABASE_URL',\n value: `mysql://user:password@localhost:3306/${config.projectName.replace(/-/g, '_')}`,\n category: 'Database',\n });\n } else if (config.database === 'mongodb') {\n baseEntries.push({\n key: 'MONGODB_URI',\n value: `mongodb://root:root@localhost:27017/${config.projectName.replace(/-/g, '_')}?authSource=admin`,\n category: 'Database',\n });\n }\n\n const allEntries = [...baseEntries, ...envEntries];\n\n // Group by category\n const categories = new Map<string, EnvEntry[]>();\n for (const entry of allEntries) {\n const cat = entry.category;\n if (!categories.has(cat)) categories.set(cat, []);\n categories.get(cat)!.push(entry);\n }\n\n // Build .env content\n const lines: string[] = [];\n for (const [category, entries] of categories) {\n lines.push(`# ${category}`);\n for (const entry of entries) {\n if (entry.comment) lines.push(`# ${entry.comment}`);\n lines.push(`${entry.key}=\"${entry.value}\"`);\n }\n lines.push('');\n }\n\n const envContent = lines.join('\\n');\n\n // Write .env and .env.example\n await writeFile(path.join(apiDir, '.env'), envContent);\n await writeFile(path.join(apiDir, '.env.example'), envContent);\n}\n","import path from 'path';\nimport type { ProjectConfig } from '../types/config.js';\nimport { writeFile } from '../helpers/filesystem.js';\nimport { getRunCommand } from '../helpers/runtime.js';\n\nexport async function generateReadme(config: ProjectConfig, projectDir: string): Promise<void> {\n const runCmd = getRunCommand(config.runtime);\n const hasDocker = config.database !== 'none' || config.redis || config.queue === 'rabbitmq' || config.minio;\n\n const authMethods = [\n config.auth.jwt && 'JWT',\n config.auth.magicLink && 'Magic Link',\n config.auth.googleOAuth && 'Google OAuth',\n ].filter(Boolean);\n\n const integrations = [\n config.integrations.viacep && 'ViaCEP',\n config.integrations.whatsapp && 'WhatsApp',\n config.integrations.stripe && 'Stripe',\n config.integrations.mercadoPago && 'Mercado Pago',\n config.integrations.abacatePay && 'AbacatePay',\n ].filter(Boolean);\n\n const infra = [\n config.redis && 'Redis',\n config.smtp && 'SMTP',\n config.minio && 'MinIO',\n config.pm2 && 'PM2',\n ].filter(Boolean);\n\n let content = `# ${config.projectName}\n\n${config.projectDescription}\n\n> Projeto gerado com [PlazerCLI](https://github.com/pablocarss/plazercli) + Liz AI Agent\n\n## Stack\n\n| Camada | Tecnologia |\n|--------|-----------|\n| Frontend | ${config.frontend} |\n| Backend | ${config.backend} |\n${config.database !== 'none' ? `| Banco de dados | ${config.database} ${config.usePrisma ? '(Prisma)' : '(Mongoose)'} |` : ''}\n${authMethods.length > 0 ? `| Autenticacao | ${authMethods.join(', ')} |` : ''}\n${config.queue !== 'none' ? `| Filas | ${config.queue} |` : ''}\n${infra.length > 0 ? `| Infraestrutura | ${infra.join(', ')} |` : ''}\n${integrations.length > 0 ? `| Integracoes | ${integrations.join(', ')} |` : ''}\n| Runtime | ${config.runtime} |\n\n## Estrutura\n\n\\`\\`\\`\n${config.projectName}/\n├── apps/\n│ ├── api/ # Backend ${config.backend}\n│ │ ├── src/\n${config.usePrisma ? '│ │ │ ├── database/ # Prisma service\\n' : ''}${config.useMongoose ? '│ │ │ ├── database/ # Mongoose models\\n' : ''}${config.hasAnyAuth ? '│ │ │ ├── auth/ # Autenticacao\\n' : ''}${config.redis || config.smtp || config.minio ? '│ │ │ ├── infra/ # Redis, Email, Storage\\n' : ''}${config.hasAnyQueue ? '│ │ │ ├── queue/ # Workers e jobs\\n' : ''}${config.hasAnyIntegration ? '│ │ │ ├── integrations/ # APIs externas\\n' : ''}${config.multiTenant ? '│ │ │ ├── tenant/ # Multi-tenant\\n' : ''}│ │ │ ├── routes/\n│ │ │ └── config/\n${config.usePrisma ? '│ │ └── prisma/schema.prisma\\n' : ''}│ │ └── .env\n│ └── web/ # Frontend ${config.frontend}\n│ └── src/\n├── docker-compose.yml\n├── CLAUDE.md # Liz config (Claude Code)\n├── AGENTS.md # Liz config (geral)\n└── README.md\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`bash\n# Pre-requisitos: Node.js >= 20, ${config.runtime}${hasDocker ? ', Docker' : ''}\n`;\n\n let step = 1;\n\n if (hasDocker) {\n content += `\n# ${step}. Subir infraestrutura\ndocker compose up -d\n`;\n step++;\n }\n\n if (config.usePrisma) {\n content += `\n# ${step}. Criar tabelas no banco\ncd apps/api && npx prisma db push && cd ../..\n`;\n step++;\n }\n\n content += `\n# ${step}. Iniciar em modo desenvolvimento\n${runCmd} dev\n\\`\\`\\`\n\nPronto! Frontend em **http://localhost:3000** e API em **http://localhost:3001**\n`;\n\n // Auth endpoints documentation\n if (config.hasAnyAuth) {\n content += `\n## Autenticacao\n\n### Endpoints\n`;\n if (config.auth.jwt) {\n content += `\n**JWT:**\n- \\`POST /api/auth/register\\` - Criar conta\n \\`\\`\\`json\n { \"email\": \"user@email.com\", \"password\": \"123456\", \"name\": \"Nome\" }\n \\`\\`\\`\n- \\`POST /api/auth/login\\` - Login (retorna access_token)\n \\`\\`\\`json\n { \"email\": \"user@email.com\", \"password\": \"123456\" }\n \\`\\`\\`\n- Header: \\`Authorization: Bearer <token>\\`\n`;\n }\n if (config.auth.magicLink) {\n content += `\n**Magic Link:**\n- \\`POST /api/auth/magic-link/send\\` - Enviar link por email\n \\`\\`\\`json\n { \"email\": \"user@email.com\" }\n \\`\\`\\`\n- \\`GET /api/auth/magic-link/verify?token=xxx\\` - Verificar token\n`;\n }\n if (config.auth.googleOAuth) {\n content += `\n**Google OAuth:**\n- \\`GET /api/auth/google\\` - Redireciona para login Google\n- \\`GET /api/auth/google/callback\\` - Callback (configurar no Google Console)\n`;\n }\n }\n\n // Integrations documentation\n if (config.hasAnyIntegration) {\n content += `\n## Integracoes\n`;\n if (config.integrations.viacep) {\n content += `\n### ViaCEP\nServico em \\`apps/api/src/integrations/viacep/\\`\n\\`\\`\\`typescript\nimport { fetchAddress } from './integrations/viacep/viacep.service';\nconst endereco = await fetchAddress('01001000');\n\\`\\`\\`\n`;\n }\n if (config.integrations.stripe) {\n content += `\n### Stripe\nConfigurar \\`STRIPE_SECRET_KEY\\` e \\`STRIPE_WEBHOOK_SECRET\\` no .env\n\\`\\`\\`typescript\nimport { createCheckoutSession } from './integrations/stripe/stripe.service';\n\\`\\`\\`\n`;\n }\n if (config.integrations.mercadoPago) {\n content += `\n### Mercado Pago\nConfigurar \\`MERCADOPAGO_ACCESS_TOKEN\\` no .env\n\\`\\`\\`typescript\nimport { createPreference } from './integrations/mercado-pago/mercado-pago.service';\n\\`\\`\\`\n`;\n }\n if (config.integrations.whatsapp) {\n content += `\n### WhatsApp\nConfigurar \\`WHATSAPP_API_TOKEN\\` e \\`WHATSAPP_PHONE_ID\\` no .env\n\\`\\`\\`typescript\nimport { sendMessage } from './integrations/whatsapp/whatsapp.service';\nawait sendMessage('5511999999999', 'Olá!');\n\\`\\`\\`\n`;\n }\n }\n\n // Environment variables\n content += `\n## Variaveis de Ambiente\n\nEdite \\`apps/api/.env\\` com suas credenciais:\n\n| Variavel | Descricao |\n|----------|----------|\n| \\`PORT\\` | Porta da API (default: 3001) |\n`;\n\n if (config.database === 'postgresql' || config.database === 'mysql') {\n content += `| \\`DATABASE_URL\\` | URL de conexao do banco |\n`;\n }\n if (config.database === 'mongodb') {\n content += `| \\`MONGODB_URI\\` | URL de conexao do MongoDB |\n`;\n }\n if (config.auth.jwt) {\n content += `| \\`JWT_SECRET\\` | **Alterar em producao!** Secret para tokens |\n`;\n }\n if (config.auth.googleOAuth) {\n content += `| \\`GOOGLE_CLIENT_ID\\` | ID do app no Google Console |\n| \\`GOOGLE_CLIENT_SECRET\\` | Secret do app no Google Console |\n`;\n }\n if (config.redis) {\n content += `| \\`REDIS_HOST\\` | Host do Redis (default: localhost) |\n`;\n }\n if (config.smtp) {\n content += `| \\`SMTP_HOST\\`, \\`SMTP_USER\\`, \\`SMTP_PASS\\` | Credenciais SMTP |\n`;\n }\n if (config.minio) {\n content += `| \\`MINIO_ACCESS_KEY\\`, \\`MINIO_SECRET_KEY\\` | Credenciais MinIO |\n`;\n }\n if (config.integrations.stripe) {\n content += `| \\`STRIPE_SECRET_KEY\\` | Chave secreta do Stripe |\n`;\n }\n if (config.integrations.mercadoPago) {\n content += `| \\`MERCADOPAGO_ACCESS_TOKEN\\` | Token do Mercado Pago |\n`;\n }\n\n content += `\n## Scripts\n\n| Comando | Descricao |\n|---------|----------|\n| \\`${runCmd} dev\\` | Inicia todos os apps |\n| \\`${runCmd} build\\` | Build de producao |\n| \\`${runCmd} dev:api\\` | Inicia apenas a API |\n| \\`${runCmd} dev:web\\` | Inicia apenas o frontend |\n${config.usePrisma ? `| \\`cd apps/api && npx prisma studio\\` | Admin visual do banco |\\n| \\`cd apps/api && npx prisma db push\\` | Sync schema com banco |` : ''}\n${config.pm2 ? `| \\`pm2 start ecosystem.config.cjs\\` | Deploy com zero-downtime |` : ''}\n${hasDocker ? `| \\`docker compose up -d\\` | Subir infraestrutura |` : ''}\n\n## Liz - AI Agent\n\nEste projeto vem com a **Liz**, uma assistente de IA configurada para conhecer a arquitetura do projeto.\n\n- **Claude Code:** Liz carrega automaticamente via \\`CLAUDE.md\\`\n- **Cursor:** Regras em \\`.cursor/rules/liz.mdc\\`\n- **Outros:** Consulte \\`AGENTS.md\\` para contexto completo\n\n---\n\nGerado com [PlazerCLI](https://github.com/pablocarss/plazercli)\n`;\n\n await writeFile(path.join(projectDir, 'README.md'), content);\n}\n","import path from 'path';\nimport type { ProjectConfig } from '../types/config.js';\nimport { writeFile } from '../helpers/filesystem.js';\n\nexport async function generateWiring(config: ProjectConfig, apiDir: string): Promise<void> {\n switch (config.backend) {\n case 'nestjs':\n await wireNestjs(config, apiDir);\n break;\n case 'express':\n await wireExpress(config, apiDir);\n break;\n case 'fastify':\n await wireFastify(config, apiDir);\n break;\n }\n}\n\nasync function wireNestjs(config: ProjectConfig, apiDir: string): Promise<void> {\n const imports: string[] = [];\n const modules: string[] = [];\n\n imports.push(`import { Module } from '@nestjs/common';`);\n imports.push(`import { ConfigModule } from '@nestjs/config';`);\n imports.push(`import { AppController } from './app.controller';`);\n imports.push(`import { AppService } from './app.service';`);\n\n modules.push(`ConfigModule.forRoot({ isGlobal: true })`);\n\n if (config.usePrisma) {\n imports.push(`import { PrismaModule } from './database/prisma.module';`);\n modules.push('PrismaModule');\n }\n\n if (config.redis) {\n imports.push(`import { RedisModule } from './infra/redis/redis.module';`);\n modules.push('RedisModule');\n }\n\n if (config.smtp) {\n imports.push(`import { EmailModule } from './infra/email/email.module';`);\n modules.push('EmailModule');\n }\n\n if (config.minio) {\n imports.push(`import { StorageModule } from './infra/storage/storage.module';`);\n modules.push('StorageModule');\n }\n\n if (config.auth.jwt) {\n imports.push(`import { AuthModule } from './auth/auth.module';`);\n modules.push('AuthModule');\n }\n\n if (config.multiTenant) {\n imports.push(`import { TenantModule } from './tenant/tenant.module';`);\n modules.push('TenantModule');\n }\n\n if (config.queue === 'bullmq') {\n imports.push(`import { QueueModule } from './queue/queue.module';`);\n modules.push('QueueModule');\n }\n\n if (config.queue === 'rabbitmq') {\n imports.push(`import { RabbitMQModule } from './queue/rabbitmq.config';`);\n modules.push('RabbitMQModule');\n }\n\n const content = `${imports.join('\\n')}\n\n@Module({\n imports: [\n ${modules.join(',\\n ')},\n ],\n controllers: [AppController],\n providers: [AppService],\n})\nexport class AppModule {}\n`;\n\n await writeFile(path.join(apiDir, 'src', 'app.module.ts'), content);\n}\n\nasync function wireExpress(config: ProjectConfig, apiDir: string): Promise<void> {\n const imports: string[] = [];\n const setupLines: string[] = [];\n const routeLines: string[] = [];\n\n imports.push(`import express from 'express';`);\n imports.push(`import cors from 'cors';`);\n imports.push(`import helmet from 'helmet';`);\n imports.push(`import { config } from './config/index.js';`);\n imports.push(`import { router } from './routes/index.js';`);\n imports.push(`import { errorHandler } from './middlewares/errorHandler.js';`);\n\n if (config.useMongoose) {\n imports.push(`import { connectDB } from './database/connection.js';`);\n setupLines.push(` // Conectar ao MongoDB`);\n setupLines.push(` await connectDB();`);\n }\n\n if (config.multiTenant) {\n imports.push(`import { tenantMiddleware } from './tenant/tenant.middleware.js';`);\n }\n\n if (config.auth.jwt) {\n imports.push(`import { authRouter } from './auth/auth.routes.js';`);\n }\n\n if (config.auth.magicLink) {\n imports.push(`import { magicLinkRouter } from './auth/magic-link.routes.js';`);\n }\n\n if (config.auth.googleOAuth) {\n imports.push(`import { googleRouter } from './auth/google.routes.js';`);\n }\n\n if (config.queue === 'rabbitmq') {\n imports.push(`import { connectRabbitMQ } from './queue/rabbitmq.js';`);\n setupLines.push(` // Conectar ao RabbitMQ`);\n setupLines.push(` await connectRabbitMQ();`);\n }\n\n if (config.minio) {\n imports.push(`import { initStorage } from './infra/storage/storage.js';`);\n setupLines.push(` // Inicializar MinIO storage`);\n setupLines.push(` await initStorage();`);\n }\n\n // Build middleware registration\n if (config.multiTenant) {\n routeLines.push(`app.use(tenantMiddleware);`);\n }\n if (config.auth.jwt) {\n routeLines.push(`app.use('/api/auth', authRouter);`);\n }\n if (config.auth.magicLink) {\n routeLines.push(`app.use('/api/auth/magic-link', magicLinkRouter);`);\n }\n if (config.auth.googleOAuth) {\n routeLines.push(`app.use('/api/auth/google', googleRouter);`);\n }\n\n const appContent = `${imports.join('\\n')}\n\nconst app = express();\n\napp.use(helmet());\napp.use(cors({ origin: config.corsOrigin }));\napp.use(express.json());\n\n${routeLines.length > 0 ? '// Rotas auto-configuradas\\n' + routeLines.join('\\n') + '\\n' : ''}\napp.use('/api', router);\n\napp.use(errorHandler);\n\nexport { app };\n`;\n\n // Also rewrite index.ts with setup\n const indexContent = `import { app } from './app.js';\nimport { config } from './config/index.js';\n\nasync function start() {\n${setupLines.length > 0 ? setupLines.join('\\n') + '\\n' : ''}\n app.listen(config.port, () => {\n console.log(\\`🚀 API rodando em http://localhost:\\${config.port}\\`);\n });\n}\n\nstart().catch((err) => {\n console.error('Erro ao iniciar:', err);\n process.exit(1);\n});\n`;\n\n await writeFile(path.join(apiDir, 'src', 'app.ts'), appContent);\n await writeFile(path.join(apiDir, 'src', 'index.ts'), indexContent);\n}\n\nasync function wireFastify(config: ProjectConfig, apiDir: string): Promise<void> {\n const imports: string[] = [];\n const pluginLines: string[] = [];\n const setupLines: string[] = [];\n\n imports.push(`import Fastify from 'fastify';`);\n imports.push(`import cors from '@fastify/cors';`);\n imports.push(`import helmet from '@fastify/helmet';`);\n imports.push(`import { config } from './config/index.js';`);\n imports.push(`import { registerRoutes } from './routes/index.js';`);\n\n if (config.useMongoose) {\n imports.push(`import { connectDB } from './database/connection.js';`);\n setupLines.push(` await connectDB();`);\n }\n\n if (config.multiTenant) {\n imports.push(`import tenantPlugin from './tenant/tenant.plugin.js';`);\n pluginLines.push(` await app.register(tenantPlugin);`);\n }\n\n if (config.auth.jwt) {\n imports.push(`import { authRoutes } from './auth/auth.routes.js';`);\n pluginLines.push(` await app.register(authRoutes);`);\n }\n\n if (config.auth.magicLink) {\n imports.push(`import { magicLinkRoutes } from './auth/magic-link.routes.js';`);\n pluginLines.push(` await app.register(magicLinkRoutes);`);\n }\n\n if (config.auth.googleOAuth) {\n imports.push(`import { googleAuthRoutes } from './auth/google.routes.js';`);\n pluginLines.push(` await app.register(googleAuthRoutes);`);\n }\n\n if (config.queue === 'rabbitmq') {\n imports.push(`import { connectRabbitMQ } from './queue/rabbitmq.js';`);\n setupLines.push(` await connectRabbitMQ();`);\n }\n\n if (config.minio) {\n imports.push(`import { initStorage } from './infra/storage/storage.js';`);\n setupLines.push(` await initStorage();`);\n }\n\n const appContent = `${imports.join('\\n')}\n\nexport async function buildApp() {\n const app = Fastify({\n logger: config.nodeEnv === 'development',\n });\n\n await app.register(helmet);\n await app.register(cors, { origin: config.corsOrigin });\n\n${pluginLines.length > 0 ? ' // Plugins auto-configurados\\n' + pluginLines.join('\\n') + '\\n' : ''}\n registerRoutes(app);\n\n return app;\n}\n`;\n\n const indexContent = `import { buildApp } from './app.js';\nimport { config } from './config/index.js';\n\nasync function start() {\n${setupLines.length > 0 ? setupLines.join('\\n') + '\\n' : ''}\n const app = await buildApp();\n\n await app.listen({ port: config.port, host: config.host });\n console.log(\\`🚀 API rodando em http://localhost:\\${config.port}\\`);\n}\n\nstart().catch((err) => {\n console.error('Erro ao iniciar:', err);\n process.exit(1);\n});\n`;\n\n await writeFile(path.join(apiDir, 'src', 'app.ts'), appContent);\n await writeFile(path.join(apiDir, 'src', 'index.ts'), indexContent);\n}\n","import path from 'path';\nimport type { ProjectConfig } from '../types/config.js';\nimport { writeFile, ensureDir } from '../helpers/filesystem.js';\n\nexport async function generateLiz(config: ProjectConfig, projectDir: string): Promise<void> {\n // Generate AGENTS.md (Claude Code / Copilot identity)\n await generateAgentsMd(config, projectDir);\n\n // Generate .cursor/rules (Cursor AI rules)\n await generateCursorRules(config, projectDir);\n\n // Generate CLAUDE.md (Claude Code specific)\n await generateClaudeMd(config, projectDir);\n}\n\nasync function generateAgentsMd(config: ProjectConfig, projectDir: string): Promise<void> {\n const authMethods = [\n config.auth.jwt && 'JWT',\n config.auth.magicLink && 'Magic Link',\n config.auth.googleOAuth && 'Google OAuth',\n ].filter(Boolean);\n\n const integrations = [\n config.integrations.viacep && 'ViaCEP',\n config.integrations.whatsapp && 'WhatsApp',\n config.integrations.stripe && 'Stripe',\n config.integrations.mercadoPago && 'Mercado Pago',\n config.integrations.abacatePay && 'AbacatePay',\n ].filter(Boolean);\n\n const content = `# Liz - AI Development Agent\n\n## Identidade\n\nEu sou a **Liz**, a assistente de desenvolvimento do projeto **${config.projectName}**. Fui configurada pelo PlazerCLI para conhecer profundamente a arquitetura deste projeto e ajudar no desenvolvimento.\n\n## Stack do Projeto\n\n- **Estrutura:** Monorepo com workspaces\n- **Frontend:** ${config.frontend} (apps/web/)\n- **Backend:** ${config.backend} (apps/api/)\n- **Runtime:** ${config.runtime}\n${config.database !== 'none' ? `- **Banco de dados:** ${config.database} ${config.usePrisma ? '(Prisma ORM)' : '(Mongoose ODM)'}` : ''}\n${authMethods.length > 0 ? `- **Autenticação:** ${authMethods.join(', ')}` : ''}\n${config.redis ? '- **Cache:** Redis (ioredis)' : ''}\n${config.queue !== 'none' ? `- **Filas:** ${config.queue}` : ''}\n${config.smtp ? '- **Email:** Nodemailer (SMTP)' : ''}\n${config.minio ? '- **Storage:** MinIO (S3-compatible)' : ''}\n${config.multiTenant ? '- **Multi-tenant:** Sim (isolamento por header/subdomain)' : ''}\n${config.pm2 ? '- **Deploy:** PM2 (cluster mode, zero-downtime)' : ''}\n${integrations.length > 0 ? `- **Integrações:** ${integrations.join(', ')}` : ''}\n\n## Estrutura de Diretórios\n\n\\`\\`\\`\n${config.projectName}/\n├── apps/\n│ ├── api/ # Backend (${config.backend})\n│ │ ├── src/\n${config.usePrisma ? '│ │ │ ├── database/ # Prisma service e conexão\\n' : ''}${config.useMongoose ? '│ │ │ ├── database/ # Mongoose models e conexão\\n' : ''}${config.hasAnyAuth ? '│ │ │ ├── auth/ # Autenticação e guards\\n' : ''}${config.redis ? '│ │ │ ├── infra/redis/ # Redis service\\n' : ''}${config.smtp ? '│ │ │ ├── infra/email/ # Email service e templates\\n' : ''}${config.minio ? '│ │ │ ├── infra/storage/ # MinIO storage service\\n' : ''}${config.hasAnyQueue ? '│ │ │ ├── queue/ # Workers e processadores\\n' : ''}${config.hasAnyIntegration ? '│ │ │ ├── integrations/ # Integrações externas\\n' : ''}${config.multiTenant ? '│ │ │ ├── tenant/ # Multi-tenant middleware\\n' : ''}│ │ │ ├── routes/ # Rotas da API\n│ │ │ ├── config/ # Configurações\n│ │ │ └── middlewares/ # Middlewares\n${config.usePrisma ? '│ │ └── prisma/ # Schema do banco\\n' : ''}│ │ └── .env # Variáveis de ambiente\n│ └── web/ # Frontend (${config.frontend})\n│ └── src/\n├── docker-compose.yml\n├── .env.example\n└── README.md\n\\`\\`\\`\n\n## Convenções\n\n### Código\n- TypeScript strict mode\n- ESM modules (import/export)\n- Async/await para operações assíncronas\n- Nomes em inglês para código, comentários podem ser em português\n\n### API\n- Prefixo \\`/api\\` em todas as rotas\n- Health check em \\`GET /api/health\\`\n${config.hasAnyAuth ? `- Rotas de auth em \\`/api/auth/*\\`` : ''}\n- Respostas JSON com status HTTP corretos\n\n### Banco de Dados\n${config.usePrisma ? `- Prisma como ORM\n- Schema em \\`apps/api/prisma/schema.prisma\\`\n- Rodar \\`npx prisma db push\\` após alterar schema\n- Rodar \\`npx prisma generate\\` após alterar models` : ''}\n${config.useMongoose ? `- Mongoose como ODM\n- Models em \\`apps/api/src/database/models/\\`\n- Conexão em \\`apps/api/src/database/connection.ts\\`` : ''}\n\n## Como me usar\n\nAo desenvolver, me peça para:\n- Criar novas features seguindo a arquitetura existente\n- Criar novos endpoints/rotas\n- Adicionar models ao banco de dados\n- Criar novos workers/jobs\n- Integrar novos serviços\n- Debugar erros com contexto do projeto\n- Escrever testes\n\nEu conheço toda a stack e vou seguir as convenções do projeto.\n\n---\n*Configurada por PlazerCLI - https://github.com/pablocarss/plazercli*\n`;\n\n await writeFile(path.join(projectDir, 'AGENTS.md'), content);\n}\n\nasync function generateCursorRules(config: ProjectConfig, projectDir: string): Promise<void> {\n await ensureDir(path.join(projectDir, '.cursor', 'rules'));\n\n const content = `# Liz - PlazerCLI AI Agent Rules\n\nYou are Liz, the AI development assistant for the \"${config.projectName}\" project.\n\n## Project Context\n- Monorepo with apps/api (${config.backend}) and apps/web (${config.frontend})\n- Runtime: ${config.runtime}\n${config.database !== 'none' ? `- Database: ${config.database} ${config.usePrisma ? 'with Prisma ORM' : 'with Mongoose ODM'}` : ''}\n${config.hasAnyAuth ? '- Authentication configured and wired' : ''}\n${config.redis ? '- Redis for caching' : ''}\n${config.queue !== 'none' ? `- Queue system: ${config.queue}` : ''}\n\n## Rules\n- Always use TypeScript with strict mode\n- Follow existing patterns in the codebase\n- Use ESM imports (import/export, .js extensions)\n- API routes must be prefixed with /api\n- Use the existing database service/ORM for all DB operations\n${config.usePrisma ? '- After schema changes, remind to run: npx prisma db push' : ''}\n${config.backend === 'nestjs' ? '- Follow NestJS patterns: modules, controllers, services, guards' : ''}\n${config.backend === 'express' ? '- Use Express Router for new route groups' : ''}\n${config.backend === 'fastify' ? '- Use Fastify plugins for new functionality' : ''}\n- Write clean, minimal code - no over-engineering\n- Handle errors properly with appropriate HTTP status codes\n`;\n\n await writeFile(path.join(projectDir, '.cursor', 'rules', 'liz.mdc'), content);\n}\n\nasync function generateClaudeMd(config: ProjectConfig, projectDir: string): Promise<void> {\n const content = `# CLAUDE.md - Liz Agent Configuration\n\nYou are **Liz**, the AI development assistant for **${config.projectName}**.\n\n## Project Overview\nThis is a fullstack monorepo generated by PlazerCLI.\n\n- \\`apps/api/\\` - Backend (${config.backend})\n- \\`apps/web/\\` - Frontend (${config.frontend})\n- Runtime: ${config.runtime}\n${config.database !== 'none' ? `- Database: ${config.database}` : ''}\n\n## Key Files\n${config.backend === 'nestjs' ? '- `apps/api/src/app.module.ts` - Main module (all features auto-imported)' : ''}\n${config.backend === 'express' ? '- `apps/api/src/app.ts` - Express app (all routes auto-registered)' : ''}\n${config.backend === 'fastify' ? '- `apps/api/src/app.ts` - Fastify app (all plugins auto-registered)' : ''}\n${config.usePrisma ? '- `apps/api/prisma/schema.prisma` - Database schema' : ''}\n- \\`apps/api/.env\\` - Environment variables\n- \\`docker-compose.yml\\` - Infrastructure services\n\n## Commands\n- \\`${config.runtime} run dev\\` - Start all apps\n- \\`${config.runtime} run dev:api\\` - Start only API\n- \\`${config.runtime} run dev:web\\` - Start only frontend\n${config.usePrisma ? '- `cd apps/api && npx prisma db push` - Push schema to DB\\n- `cd apps/api && npx prisma studio` - Open DB admin' : ''}\n- \\`docker compose up -d\\` - Start infrastructure\n\n## Conventions\n- TypeScript strict, ESM modules\n- API prefix: /api\n- Follow existing patterns when creating new features\n`;\n\n await writeFile(path.join(projectDir, 'CLAUDE.md'), content);\n}\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const prismaInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies, devDependencies, scripts } = opts;\n const provider = config.database === 'postgresql' ? 'postgresql' : 'mysql';\n const dbName = config.projectName.replace(/-/g, '_');\n\n await ensureDir(path.join(apiDir, 'prisma'));\n await ensureDir(path.join(apiDir, 'src', 'database'));\n\n // Schema\n let schema = `generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"${provider}\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id String @id @default(cuid())\n email String @unique\n name String?\n password String?\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n`;\n\n if (config.multiTenant) {\n schema += ` tenantId String @map(\"tenant_id\")\n tenant Tenant @relation(fields: [tenantId], references: [id])\n`;\n }\n\n schema += `\n @@map(\"users\")\n}\n`;\n\n if (config.multiTenant) {\n schema += `\nmodel Tenant {\n id String @id @default(cuid())\n name String\n slug String @unique\n users User[]\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@map(\"tenants\")\n}\n`;\n }\n\n await writeFile(path.join(apiDir, 'prisma', 'schema.prisma'), schema);\n\n // Prisma service\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'database', 'prisma.service.ts'), `import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';\nimport { PrismaClient } from '@prisma/client';\n\n@Injectable()\nexport class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {\n async onModuleInit() {\n await this.$connect();\n }\n\n async onModuleDestroy() {\n await this.$disconnect();\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'database', 'prisma.module.ts'), `import { Global, Module } from '@nestjs/common';\nimport { PrismaService } from './prisma.service';\n\n@Global()\n@Module({\n providers: [PrismaService],\n exports: [PrismaService],\n})\nexport class PrismaModule {}\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'database', 'prisma.ts'), `import { PrismaClient } from '@prisma/client';\n\nconst globalForPrisma = globalThis as unknown as { prisma: PrismaClient };\n\nexport const prisma = globalForPrisma.prisma || new PrismaClient();\n\nif (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;\n\nexport default prisma;\n`);\n }\n\n // Dependencies\n dependencies['@prisma/client'] = deps['@prisma/client'];\n devDependencies['prisma'] = deps.prisma;\n\n // Scripts\n scripts['db:push'] = 'prisma db push';\n scripts['db:migrate'] = 'prisma migrate dev';\n scripts['db:studio'] = 'prisma studio';\n scripts['db:seed'] = 'prisma db seed';\n scripts['db:generate'] = 'prisma generate';\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const mongooseInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'database'));\n await ensureDir(path.join(apiDir, 'src', 'database', 'models'));\n\n // Connection\n if (config.multiTenant) {\n await writeFile(path.join(apiDir, 'src', 'database', 'connection.ts'), `import mongoose from 'mongoose';\n\nconst connections = new Map<string, mongoose.Connection>();\n\nexport async function connectDB(): Promise<mongoose.Connection> {\n const uri = process.env.MONGODB_URI || 'mongodb://localhost:27017/${config.projectName.replace(/-/g, '_')}';\n const conn = await mongoose.connect(uri);\n console.log('MongoDB conectado');\n return conn.connection;\n}\n\nexport function getTenantConnection(tenantId: string): mongoose.Connection {\n if (connections.has(tenantId)) {\n return connections.get(tenantId)!;\n }\n\n const uri = process.env.MONGODB_URI || 'mongodb://localhost:27017';\n const conn = mongoose.createConnection(\\`\\${uri}/tenant_\\${tenantId}\\`);\n connections.set(tenantId, conn);\n return conn;\n}\n\nexport default { connectDB, getTenantConnection };\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'database', 'connection.ts'), `import mongoose from 'mongoose';\n\nexport async function connectDB(): Promise<void> {\n const uri = process.env.MONGODB_URI || 'mongodb://localhost:27017/${config.projectName.replace(/-/g, '_')}';\n await mongoose.connect(uri);\n console.log('MongoDB conectado');\n}\n\nexport default { connectDB };\n`);\n }\n\n // User model\n await writeFile(path.join(apiDir, 'src', 'database', 'models', 'user.model.ts'), `import mongoose, { Schema, Document } from 'mongoose';\n\nexport interface IUser extends Document {\n email: string;\n name?: string;\n password?: string;\n${config.multiTenant ? ' tenantId: string;\\n' : ''} createdAt: Date;\n updatedAt: Date;\n}\n\nconst UserSchema = new Schema<IUser>(\n {\n email: { type: String, required: true, unique: true },\n name: { type: String },\n password: { type: String },\n${config.multiTenant ? \" tenantId: { type: String, required: true, index: true },\\n\" : ''} },\n { timestamps: true }\n);\n\nexport const User = mongoose.model<IUser>('User', UserSchema);\n`);\n\n dependencies['mongoose'] = deps.mongoose;\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const jwtInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies, devDependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'auth'));\n\n envEntries.push(\n { key: 'JWT_SECRET', value: 'change-me-in-production-use-a-strong-secret', category: 'Authentication' },\n { key: 'JWT_EXPIRES_IN', value: '7d', category: 'Authentication' },\n );\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'auth', 'jwt.strategy.ts'), `import { Injectable, UnauthorizedException } from '@nestjs/common';\nimport { PassportStrategy } from '@nestjs/passport';\nimport { ExtractJwt, Strategy } from 'passport-jwt';\nimport { ConfigService } from '@nestjs/config';\n\n@Injectable()\nexport class JwtStrategy extends PassportStrategy(Strategy) {\n constructor(configService: ConfigService) {\n super({\n jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),\n ignoreExpiration: false,\n secretOrKey: configService.get<string>('JWT_SECRET'),\n });\n }\n\n async validate(payload: { sub: string; email: string }) {\n return { id: payload.sub, email: payload.email };\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'auth', 'auth.module.ts'), `import { Module } from '@nestjs/common';\nimport { JwtModule } from '@nestjs/jwt';\nimport { PassportModule } from '@nestjs/passport';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport { AuthService } from './auth.service';\nimport { AuthController } from './auth.controller';\nimport { JwtStrategy } from './jwt.strategy';\n\n@Module({\n imports: [\n PassportModule,\n JwtModule.registerAsync({\n imports: [ConfigModule],\n useFactory: (configService: ConfigService) => ({\n secret: configService.get<string>('JWT_SECRET'),\n signOptions: { expiresIn: configService.get<string>('JWT_EXPIRES_IN', '7d') },\n }),\n inject: [ConfigService],\n }),\n ],\n controllers: [AuthController],\n providers: [AuthService, JwtStrategy],\n exports: [AuthService],\n})\nexport class AuthModule {}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'auth', 'auth.service.ts'), `import { Injectable, UnauthorizedException } from '@nestjs/common';\nimport { JwtService } from '@nestjs/jwt';\nimport * as bcrypt from 'bcryptjs';\n\n@Injectable()\nexport class AuthService {\n constructor(private jwtService: JwtService) {}\n\n async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 10);\n }\n\n async comparePassword(password: string, hash: string): Promise<boolean> {\n return bcrypt.compare(password, hash);\n }\n\n async generateToken(payload: { sub: string; email: string }): Promise<string> {\n return this.jwtService.sign(payload);\n }\n\n async validateToken(token: string) {\n try {\n return this.jwtService.verify(token);\n } catch {\n throw new UnauthorizedException('Token inválido');\n }\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'auth', 'auth.controller.ts'), `import { Controller, Post, Body } from '@nestjs/common';\nimport { AuthService } from './auth.service';\n\n@Controller('auth')\nexport class AuthController {\n constructor(private readonly authService: AuthService) {}\n\n @Post('login')\n async login(@Body() body: { email: string; password: string }) {\n // TODO: Buscar usuario no banco e validar password\n const token = await this.authService.generateToken({\n sub: 'user-id',\n email: body.email,\n });\n return { access_token: token };\n }\n\n @Post('register')\n async register(@Body() body: { email: string; password: string; name?: string }) {\n const hashedPassword = await this.authService.hashPassword(body.password);\n // TODO: Criar usuario no banco com hashedPassword\n const token = await this.authService.generateToken({\n sub: 'new-user-id',\n email: body.email,\n });\n return { access_token: token };\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'auth', 'jwt-auth.guard.ts'), `import { Injectable } from '@nestjs/common';\nimport { AuthGuard } from '@nestjs/passport';\n\n@Injectable()\nexport class JwtAuthGuard extends AuthGuard('jwt') {}\n`);\n\n dependencies['@nestjs/jwt'] = deps['@nestjs/jwt'];\n dependencies['@nestjs/passport'] = deps['@nestjs/passport'];\n dependencies['passport'] = deps.passport;\n dependencies['passport-jwt'] = deps['passport-jwt'];\n devDependencies['@types/passport-jwt'] = deps['@types/passport-jwt'];\n } else {\n // Express / Fastify\n await writeFile(path.join(apiDir, 'src', 'auth', 'jwt.ts'), `import jwt from 'jsonwebtoken';\n\nconst JWT_SECRET = process.env.JWT_SECRET || 'change-me';\nconst JWT_EXPIRES_IN = process.env.JWT_EXPIRES_IN || '7d';\n\nexport function generateToken(payload: { sub: string; email: string }): string {\n return jwt.sign(payload, JWT_SECRET, { expiresIn: JWT_EXPIRES_IN });\n}\n\nexport function verifyToken(token: string) {\n return jwt.verify(token, JWT_SECRET);\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'auth', 'hash.ts'), `import bcrypt from 'bcryptjs';\n\nexport async function hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 10);\n}\n\nexport async function comparePassword(password: string, hash: string): Promise<boolean> {\n return bcrypt.compare(password, hash);\n}\n`);\n\n if (config.backend === 'express') {\n await writeFile(path.join(apiDir, 'src', 'auth', 'auth.middleware.ts'), `import type { Request, Response, NextFunction } from 'express';\nimport { verifyToken } from './jwt.js';\n\nexport function authMiddleware(req: Request, res: Response, next: NextFunction) {\n const authHeader = req.headers.authorization;\n if (!authHeader?.startsWith('Bearer ')) {\n return res.status(401).json({ error: 'Token não fornecido' });\n }\n\n try {\n const token = authHeader.split(' ')[1];\n const payload = verifyToken(token);\n (req as any).user = payload;\n next();\n } catch {\n return res.status(401).json({ error: 'Token inválido' });\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'auth', 'auth.routes.ts'), `import { Router } from 'express';\nimport { generateToken } from './jwt.js';\nimport { hashPassword, comparePassword } from './hash.js';\n\nconst authRouter = Router();\n\nauthRouter.post('/login', async (req, res) => {\n const { email, password } = req.body;\n // TODO: Buscar usuario no banco e validar password\n const token = generateToken({ sub: 'user-id', email });\n res.json({ access_token: token });\n});\n\nauthRouter.post('/register', async (req, res) => {\n const { email, password, name } = req.body;\n const hashedPassword = await hashPassword(password);\n // TODO: Criar usuario no banco com hashedPassword\n const token = generateToken({ sub: 'new-user-id', email });\n res.json({ access_token: token });\n});\n\nexport { authRouter };\n`);\n } else {\n // Fastify\n await writeFile(path.join(apiDir, 'src', 'auth', 'auth.hook.ts'), `import type { FastifyRequest, FastifyReply } from 'fastify';\nimport { verifyToken } from './jwt.js';\n\nexport async function authHook(request: FastifyRequest, reply: FastifyReply) {\n const authHeader = request.headers.authorization;\n if (!authHeader?.startsWith('Bearer ')) {\n return reply.status(401).send({ error: 'Token não fornecido' });\n }\n\n try {\n const token = authHeader.split(' ')[1];\n const payload = verifyToken(token);\n (request as any).user = payload;\n } catch {\n return reply.status(401).send({ error: 'Token inválido' });\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'auth', 'auth.routes.ts'), `import type { FastifyInstance } from 'fastify';\nimport { generateToken } from './jwt.js';\nimport { hashPassword } from './hash.js';\n\nexport async function authRoutes(app: FastifyInstance) {\n app.post('/api/auth/login', async (request) => {\n const { email, password } = request.body as { email: string; password: string };\n // TODO: Buscar usuario no banco e validar password\n const token = generateToken({ sub: 'user-id', email });\n return { access_token: token };\n });\n\n app.post('/api/auth/register', async (request) => {\n const { email, password, name } = request.body as { email: string; password: string; name?: string };\n const hashedPassword = await hashPassword(password);\n // TODO: Criar usuario no banco com hashedPassword\n const token = generateToken({ sub: 'new-user-id', email });\n return { access_token: token };\n });\n}\n`);\n }\n\n dependencies['jsonwebtoken'] = deps.jsonwebtoken;\n devDependencies['@types/jsonwebtoken'] = deps['@types/jsonwebtoken'];\n }\n\n dependencies['bcryptjs'] = deps.bcryptjs;\n devDependencies['@types/bcryptjs'] = deps['@types/bcryptjs'];\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const magicLinkInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'auth'));\n\n envEntries.push(\n { key: 'MAGIC_LINK_EXPIRY_MINUTES', value: '15', category: 'Authentication' },\n { key: 'APP_URL', value: 'http://localhost:3000', category: 'Authentication', comment: 'URL do frontend para o magic link' },\n );\n\n const serviceContent = `import { nanoid } from 'nanoid';\n\ninterface MagicLinkToken {\n token: string;\n email: string;\n expiresAt: Date;\n}\n\n// Em producao, armazene no banco de dados ou Redis\nconst tokens = new Map<string, MagicLinkToken>();\n\nconst EXPIRY_MINUTES = Number(process.env.MAGIC_LINK_EXPIRY_MINUTES) || 15;\nconst APP_URL = process.env.APP_URL || 'http://localhost:3000';\n\nexport function generateMagicLink(email: string): { token: string; url: string } {\n const token = nanoid(32);\n const expiresAt = new Date(Date.now() + EXPIRY_MINUTES * 60 * 1000);\n\n tokens.set(token, { token, email, expiresAt });\n\n const url = \\`\\${APP_URL}/auth/verify?token=\\${token}\\`;\n return { token, url };\n}\n\nexport function verifyMagicLinkToken(token: string): { valid: boolean; email?: string } {\n const entry = tokens.get(token);\n if (!entry) return { valid: false };\n if (entry.expiresAt < new Date()) {\n tokens.delete(token);\n return { valid: false };\n }\n tokens.delete(token);\n return { valid: true, email: entry.email };\n}\n`;\n\n await writeFile(path.join(apiDir, 'src', 'auth', 'magic-link.service.ts'), serviceContent);\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'auth', 'magic-link.controller.ts'), `import { Controller, Post, Body, Get, Query, BadRequestException } from '@nestjs/common';\nimport { generateMagicLink, verifyMagicLinkToken } from './magic-link.service';\n\n@Controller('auth/magic-link')\nexport class MagicLinkController {\n @Post('send')\n async sendMagicLink(@Body() body: { email: string }) {\n const { url } = generateMagicLink(body.email);\n // TODO: Enviar email com o magic link usando o email service\n console.log('Magic link:', url);\n return { message: 'Magic link enviado para o email' };\n }\n\n @Get('verify')\n async verify(@Query('token') token: string) {\n const result = verifyMagicLinkToken(token);\n if (!result.valid) {\n throw new BadRequestException('Token inválido ou expirado');\n }\n // TODO: Criar sessao/JWT para o usuario\n return { message: 'Login realizado', email: result.email };\n }\n}\n`);\n } else if (config.backend === 'express') {\n await writeFile(path.join(apiDir, 'src', 'auth', 'magic-link.routes.ts'), `import { Router } from 'express';\nimport { generateMagicLink, verifyMagicLinkToken } from './magic-link.service.js';\n\nconst magicLinkRouter = Router();\n\nmagicLinkRouter.post('/send', async (req, res) => {\n const { email } = req.body;\n const { url } = generateMagicLink(email);\n // TODO: Enviar email com o magic link usando o email service\n console.log('Magic link:', url);\n res.json({ message: 'Magic link enviado para o email' });\n});\n\nmagicLinkRouter.get('/verify', async (req, res) => {\n const token = req.query.token as string;\n const result = verifyMagicLinkToken(token);\n if (!result.valid) {\n return res.status(400).json({ error: 'Token inválido ou expirado' });\n }\n // TODO: Criar sessao/JWT para o usuario\n res.json({ message: 'Login realizado', email: result.email });\n});\n\nexport { magicLinkRouter };\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'auth', 'magic-link.routes.ts'), `import type { FastifyInstance } from 'fastify';\nimport { generateMagicLink, verifyMagicLinkToken } from './magic-link.service.js';\n\nexport async function magicLinkRoutes(app: FastifyInstance) {\n app.post('/api/auth/magic-link/send', async (request) => {\n const { email } = request.body as { email: string };\n const { url } = generateMagicLink(email);\n // TODO: Enviar email com o magic link usando o email service\n console.log('Magic link:', url);\n return { message: 'Magic link enviado para o email' };\n });\n\n app.get('/api/auth/magic-link/verify', async (request, reply) => {\n const { token } = request.query as { token: string };\n const result = verifyMagicLinkToken(token);\n if (!result.valid) {\n return reply.status(400).send({ error: 'Token inválido ou expirado' });\n }\n // TODO: Criar sessao/JWT para o usuario\n return { message: 'Login realizado', email: result.email };\n });\n}\n`);\n }\n\n dependencies['nanoid'] = deps.nanoid;\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const googleOauthInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies, devDependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'auth'));\n\n envEntries.push(\n { key: 'GOOGLE_CLIENT_ID', value: '', category: 'Google OAuth', comment: 'Obtenha em https://console.cloud.google.com' },\n { key: 'GOOGLE_CLIENT_SECRET', value: '', category: 'Google OAuth' },\n { key: 'GOOGLE_CALLBACK_URL', value: 'http://localhost:3001/api/auth/google/callback', category: 'Google OAuth' },\n );\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'auth', 'google.strategy.ts'), `import { Injectable } from '@nestjs/common';\nimport { PassportStrategy } from '@nestjs/passport';\nimport { Strategy, VerifyCallback, Profile } from 'passport-google-oauth20';\nimport { ConfigService } from '@nestjs/config';\n\n@Injectable()\nexport class GoogleStrategy extends PassportStrategy(Strategy, 'google') {\n constructor(configService: ConfigService) {\n super({\n clientID: configService.get<string>('GOOGLE_CLIENT_ID'),\n clientSecret: configService.get<string>('GOOGLE_CLIENT_SECRET'),\n callbackURL: configService.get<string>('GOOGLE_CALLBACK_URL'),\n scope: ['email', 'profile'],\n });\n }\n\n async validate(\n accessToken: string,\n refreshToken: string,\n profile: Profile,\n done: VerifyCallback,\n ) {\n const user = {\n email: profile.emails?.[0]?.value,\n name: profile.displayName,\n googleId: profile.id,\n avatar: profile.photos?.[0]?.value,\n };\n done(null, user);\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'auth', 'google.controller.ts'), `import { Controller, Get, Req, Res, UseGuards } from '@nestjs/common';\nimport { AuthGuard } from '@nestjs/passport';\nimport type { Request, Response } from 'express';\n\n@Controller('auth/google')\nexport class GoogleController {\n @Get()\n @UseGuards(AuthGuard('google'))\n async googleAuth() {\n // Redireciona para o Google\n }\n\n @Get('callback')\n @UseGuards(AuthGuard('google'))\n async googleCallback(@Req() req: Request, @Res() res: Response) {\n const user = req.user;\n // TODO: Criar/buscar usuario no banco, gerar JWT\n console.log('Google user:', user);\n res.redirect(process.env.APP_URL || 'http://localhost:3000');\n }\n}\n`);\n\n dependencies['@nestjs/passport'] = deps['@nestjs/passport'];\n dependencies['passport'] = deps.passport;\n } else if (config.backend === 'express') {\n await writeFile(path.join(apiDir, 'src', 'auth', 'google.routes.ts'), `import { Router } from 'express';\nimport passport from 'passport';\nimport { Strategy as GoogleStrategy } from 'passport-google-oauth20';\n\npassport.use(\n new GoogleStrategy(\n {\n clientID: process.env.GOOGLE_CLIENT_ID || '',\n clientSecret: process.env.GOOGLE_CLIENT_SECRET || '',\n callbackURL: process.env.GOOGLE_CALLBACK_URL || 'http://localhost:3001/api/auth/google/callback',\n },\n async (accessToken, refreshToken, profile, done) => {\n const user = {\n email: profile.emails?.[0]?.value,\n name: profile.displayName,\n googleId: profile.id,\n avatar: profile.photos?.[0]?.value,\n };\n // TODO: Criar/buscar usuario no banco\n done(null, user);\n }\n )\n);\n\nconst googleRouter = Router();\n\ngoogleRouter.get('/', passport.authenticate('google', { scope: ['profile', 'email'] }));\n\ngoogleRouter.get(\n '/callback',\n passport.authenticate('google', { session: false }),\n (req, res) => {\n // TODO: Gerar JWT e redirecionar\n console.log('Google user:', req.user);\n res.redirect(process.env.APP_URL || 'http://localhost:3000');\n }\n);\n\nexport { googleRouter };\n`);\n\n dependencies['passport'] = deps.passport;\n } else {\n // Fastify\n await writeFile(path.join(apiDir, 'src', 'auth', 'google.routes.ts'), `import type { FastifyInstance } from 'fastify';\n\n// Para Fastify, recomendamos usar @fastify/oauth2\n// npm install @fastify/oauth2\nexport async function googleAuthRoutes(app: FastifyInstance) {\n // TODO: Configurar @fastify/oauth2 para Google\n // Documentacao: https://github.com/fastify/fastify-oauth2\n\n app.get('/api/auth/google', async (request, reply) => {\n const clientId = process.env.GOOGLE_CLIENT_ID;\n const redirectUri = process.env.GOOGLE_CALLBACK_URL;\n const url = \\`https://accounts.google.com/o/oauth2/v2/auth?client_id=\\${clientId}&redirect_uri=\\${redirectUri}&response_type=code&scope=email profile\\`;\n reply.redirect(url);\n });\n\n app.get('/api/auth/google/callback', async (request) => {\n const { code } = request.query as { code: string };\n // TODO: Trocar code por tokens, buscar perfil, criar/buscar usuario\n return { message: 'Google OAuth callback', code };\n });\n}\n`);\n }\n\n dependencies['passport-google-oauth20'] = deps['passport-google-oauth20'];\n devDependencies['@types/passport-google-oauth20'] = deps['@types/passport-google-oauth20'];\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const bullmqInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'queue'));\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'queue', 'queue.module.ts'), `import { Module } from '@nestjs/common';\nimport { BullModule } from '@nestjs/bullmq';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport { ExampleProcessor } from './example.processor';\n\n@Module({\n imports: [\n BullModule.forRootAsync({\n imports: [ConfigModule],\n useFactory: (configService: ConfigService) => ({\n connection: {\n host: configService.get('REDIS_HOST', 'localhost'),\n port: configService.get('REDIS_PORT', 6379),\n password: configService.get('REDIS_PASSWORD') || undefined,\n },\n }),\n inject: [ConfigService],\n }),\n BullModule.registerQueue({ name: 'example' }),\n ],\n providers: [ExampleProcessor],\n exports: [BullModule],\n})\nexport class QueueModule {}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'queue', 'example.processor.ts'), `import { Processor, WorkerHost } from '@nestjs/bullmq';\nimport { Job } from 'bullmq';\n\n@Processor('example')\nexport class ExampleProcessor extends WorkerHost {\n async process(job: Job<{ message: string }>) {\n console.log(\\`Processando job \\${job.id}: \\${job.data.message}\\`);\n // TODO: Implemente a logica do job aqui\n return { success: true };\n }\n}\n`);\n\n dependencies['@nestjs/bullmq'] = deps['@nestjs/bullmq'];\n } else {\n await writeFile(path.join(apiDir, 'src', 'queue', 'queue.config.ts'), `import { Queue, Worker } from 'bullmq';\n\nconst connection = {\n host: process.env.REDIS_HOST || 'localhost',\n port: Number(process.env.REDIS_PORT) || 6379,\n password: process.env.REDIS_PASSWORD || undefined,\n};\n\nexport function createQueue(name: string) {\n return new Queue(name, { connection });\n}\n\nexport function createWorker(\n name: string,\n processor: (job: any) => Promise<any>\n) {\n const worker = new Worker(name, processor, { connection });\n\n worker.on('completed', (job) => {\n console.log(\\`Job \\${job.id} concluido\\`);\n });\n\n worker.on('failed', (job, err) => {\n console.error(\\`Job \\${job?.id} falhou:\\`, err);\n });\n\n return worker;\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'queue', 'example.worker.ts'), `import { createQueue, createWorker } from './queue.config.js';\n\n// Criar fila\nexport const exampleQueue = createQueue('example');\n\n// Criar worker\nexport const exampleWorker = createWorker('example', async (job) => {\n console.log(\\`Processando job \\${job.id}: \\${job.data.message}\\`);\n // TODO: Implemente a logica do job aqui\n return { success: true };\n});\n\n// Funcao helper para adicionar job na fila\nexport async function addExampleJob(data: { message: string }) {\n return exampleQueue.add('process', data);\n}\n`);\n }\n\n dependencies['bullmq'] = deps.bullmq;\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const rabbitmqInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies, devDependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'queue'));\n\n envEntries.push(\n { key: 'RABBITMQ_URL', value: 'amqp://guest:guest@localhost:5672', category: 'RabbitMQ' },\n );\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'queue', 'rabbitmq.config.ts'), `import { Module } from '@nestjs/common';\nimport { ClientsModule, Transport } from '@nestjs/microservices';\n\n@Module({\n imports: [\n ClientsModule.register([\n {\n name: 'RABBITMQ_SERVICE',\n transport: Transport.RMQ,\n options: {\n urls: [process.env.RABBITMQ_URL || 'amqp://guest:guest@localhost:5672'],\n queue: 'main_queue',\n queueOptions: { durable: true },\n },\n },\n ]),\n ],\n exports: [ClientsModule],\n})\nexport class RabbitMQModule {}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'queue', 'rabbitmq.consumer.ts'), `import { Controller } from '@nestjs/common';\nimport { MessagePattern, Payload } from '@nestjs/microservices';\n\n@Controller()\nexport class RabbitMQConsumer {\n @MessagePattern('example_pattern')\n async handleMessage(@Payload() data: any) {\n console.log('Mensagem recebida:', data);\n // TODO: Processar mensagem\n return { success: true };\n }\n}\n`);\n\n dependencies['@nestjs/microservices'] = deps['@nestjs/common'];\n } else {\n await writeFile(path.join(apiDir, 'src', 'queue', 'rabbitmq.ts'), `import amqplib, { type Channel, type Connection } from 'amqplib';\n\nlet connection: Connection | null = null;\nlet channel: Channel | null = null;\n\nexport async function connectRabbitMQ(): Promise<Channel> {\n const url = process.env.RABBITMQ_URL || 'amqp://guest:guest@localhost:5672';\n connection = await amqplib.connect(url);\n channel = await connection.createChannel();\n console.log('RabbitMQ conectado');\n return channel;\n}\n\nexport async function publishMessage(queue: string, message: unknown): Promise<void> {\n if (!channel) throw new Error('RabbitMQ nao conectado');\n await channel.assertQueue(queue, { durable: true });\n channel.sendToQueue(queue, Buffer.from(JSON.stringify(message)), { persistent: true });\n}\n\nexport async function consumeMessages(\n queue: string,\n handler: (msg: unknown) => Promise<void>\n): Promise<void> {\n if (!channel) throw new Error('RabbitMQ nao conectado');\n await channel.assertQueue(queue, { durable: true });\n channel.consume(queue, async (msg) => {\n if (!msg) return;\n try {\n const data = JSON.parse(msg.content.toString());\n await handler(data);\n channel!.ack(msg);\n } catch (err) {\n console.error('Erro ao processar mensagem:', err);\n channel!.nack(msg, false, true);\n }\n });\n}\n\nexport async function closeRabbitMQ(): Promise<void> {\n await channel?.close();\n await connection?.close();\n}\n`);\n }\n\n dependencies['amqplib'] = deps.amqplib;\n devDependencies['@types/amqplib'] = deps['@types/amqplib'];\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const redisInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'infra', 'redis'));\n\n envEntries.push(\n { key: 'REDIS_HOST', value: 'localhost', category: 'Redis' },\n { key: 'REDIS_PORT', value: '6379', category: 'Redis' },\n { key: 'REDIS_PASSWORD', value: '', category: 'Redis' },\n );\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'infra', 'redis', 'redis.service.ts'), `import { Injectable, OnModuleDestroy } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Redis from 'ioredis';\n\n@Injectable()\nexport class RedisService implements OnModuleDestroy {\n public readonly client: Redis;\n\n constructor(private configService: ConfigService) {\n this.client = new Redis({\n host: this.configService.get('REDIS_HOST', 'localhost'),\n port: this.configService.get('REDIS_PORT', 6379),\n password: this.configService.get('REDIS_PASSWORD') || undefined,\n });\n }\n\n async get(key: string): Promise<string | null> {\n return this.client.get(key);\n }\n\n async set(key: string, value: string, ttlSeconds?: number): Promise<void> {\n if (ttlSeconds) {\n await this.client.set(key, value, 'EX', ttlSeconds);\n } else {\n await this.client.set(key, value);\n }\n }\n\n async del(key: string): Promise<void> {\n await this.client.del(key);\n }\n\n async onModuleDestroy() {\n await this.client.quit();\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'infra', 'redis', 'redis.module.ts'), `import { Global, Module } from '@nestjs/common';\nimport { RedisService } from './redis.service';\n\n@Global()\n@Module({\n providers: [RedisService],\n exports: [RedisService],\n})\nexport class RedisModule {}\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'infra', 'redis', 'redis.ts'), `import Redis from 'ioredis';\n\nconst redis = new Redis({\n host: process.env.REDIS_HOST || 'localhost',\n port: Number(process.env.REDIS_PORT) || 6379,\n password: process.env.REDIS_PASSWORD || undefined,\n});\n\nredis.on('connect', () => console.log('Redis conectado'));\nredis.on('error', (err) => console.error('Redis erro:', err));\n\nexport default redis;\n`);\n }\n\n dependencies['ioredis'] = deps.ioredis;\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const smtpInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies, devDependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'infra', 'email'));\n await ensureDir(path.join(apiDir, 'src', 'infra', 'email', 'templates'));\n\n envEntries.push(\n { key: 'SMTP_HOST', value: '', category: 'SMTP', comment: 'Ex: smtp.gmail.com' },\n { key: 'SMTP_PORT', value: '587', category: 'SMTP' },\n { key: 'SMTP_USER', value: '', category: 'SMTP' },\n { key: 'SMTP_PASS', value: '', category: 'SMTP' },\n { key: 'SMTP_FROM', value: `noreply@${config.projectName}.com`, category: 'SMTP' },\n );\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'infra', 'email', 'email.service.ts'), `import { Injectable } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport * as nodemailer from 'nodemailer';\n\n@Injectable()\nexport class EmailService {\n private transporter: nodemailer.Transporter;\n\n constructor(private configService: ConfigService) {\n this.transporter = nodemailer.createTransport({\n host: this.configService.get('SMTP_HOST'),\n port: this.configService.get('SMTP_PORT', 587),\n secure: false,\n auth: {\n user: this.configService.get('SMTP_USER'),\n pass: this.configService.get('SMTP_PASS'),\n },\n });\n }\n\n async sendEmail(to: string, subject: string, html: string): Promise<void> {\n await this.transporter.sendMail({\n from: this.configService.get('SMTP_FROM'),\n to,\n subject,\n html,\n });\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'infra', 'email', 'email.module.ts'), `import { Global, Module } from '@nestjs/common';\nimport { EmailService } from './email.service';\n\n@Global()\n@Module({\n providers: [EmailService],\n exports: [EmailService],\n})\nexport class EmailModule {}\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'infra', 'email', 'email.service.ts'), `import nodemailer from 'nodemailer';\n\nconst transporter = nodemailer.createTransport({\n host: process.env.SMTP_HOST,\n port: Number(process.env.SMTP_PORT) || 587,\n secure: false,\n auth: {\n user: process.env.SMTP_USER,\n pass: process.env.SMTP_PASS,\n },\n});\n\nexport async function sendEmail(to: string, subject: string, html: string): Promise<void> {\n await transporter.sendMail({\n from: process.env.SMTP_FROM,\n to,\n subject,\n html,\n });\n}\n\nexport default { sendEmail };\n`);\n }\n\n await writeFile(path.join(apiDir, 'src', 'infra', 'email', 'templates', 'welcome.html'), `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <style>\n body { font-family: system-ui, sans-serif; margin: 0; padding: 20px; background: #f5f5f5; }\n .container { max-width: 600px; margin: 0 auto; background: white; border-radius: 8px; padding: 40px; }\n h1 { color: #333; }\n .btn { display: inline-block; padding: 12px 24px; background: #0070f3; color: white; text-decoration: none; border-radius: 6px; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>Bem-vindo ao ${config.projectName}!</h1>\n <p>Sua conta foi criada com sucesso.</p>\n <a href=\"{{APP_URL}}\" class=\"btn\">Acessar</a>\n </div>\n</body>\n</html>\n`);\n\n dependencies['nodemailer'] = deps.nodemailer;\n devDependencies['@types/nodemailer'] = deps['@types/nodemailer'];\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const minioInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'infra', 'storage'));\n\n envEntries.push(\n { key: 'MINIO_ENDPOINT', value: 'localhost', category: 'MinIO Storage' },\n { key: 'MINIO_PORT', value: '9000', category: 'MinIO Storage' },\n { key: 'MINIO_ACCESS_KEY', value: 'minioadmin', category: 'MinIO Storage' },\n { key: 'MINIO_SECRET_KEY', value: 'minioadmin', category: 'MinIO Storage' },\n { key: 'MINIO_BUCKET', value: config.projectName.replace(/-/g, '-'), category: 'MinIO Storage' },\n { key: 'MINIO_USE_SSL', value: 'false', category: 'MinIO Storage' },\n );\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'infra', 'storage', 'storage.service.ts'), `import { Injectable, OnModuleInit } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport * as Minio from 'minio';\n\n@Injectable()\nexport class StorageService implements OnModuleInit {\n private client: Minio.Client;\n private bucket: string;\n\n constructor(private configService: ConfigService) {\n this.bucket = this.configService.get('MINIO_BUCKET', '${config.projectName}');\n this.client = new Minio.Client({\n endPoint: this.configService.get('MINIO_ENDPOINT', 'localhost'),\n port: this.configService.get('MINIO_PORT', 9000),\n useSSL: this.configService.get('MINIO_USE_SSL') === 'true',\n accessKey: this.configService.get('MINIO_ACCESS_KEY', 'minioadmin'),\n secretKey: this.configService.get('MINIO_SECRET_KEY', 'minioadmin'),\n });\n }\n\n async onModuleInit() {\n const exists = await this.client.bucketExists(this.bucket);\n if (!exists) {\n await this.client.makeBucket(this.bucket);\n console.log(\\`Bucket \"\\${this.bucket}\" criado\\`);\n }\n }\n\n async upload(fileName: string, buffer: Buffer, contentType?: string): Promise<string> {\n await this.client.putObject(this.bucket, fileName, buffer, buffer.length, {\n 'Content-Type': contentType || 'application/octet-stream',\n });\n return fileName;\n }\n\n async getFileUrl(fileName: string, expirySeconds = 3600): Promise<string> {\n return this.client.presignedGetObject(this.bucket, fileName, expirySeconds);\n }\n\n async delete(fileName: string): Promise<void> {\n await this.client.removeObject(this.bucket, fileName);\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'infra', 'storage', 'storage.module.ts'), `import { Global, Module } from '@nestjs/common';\nimport { StorageService } from './storage.service';\n\n@Global()\n@Module({\n providers: [StorageService],\n exports: [StorageService],\n})\nexport class StorageModule {}\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'infra', 'storage', 'storage.ts'), `import * as Minio from 'minio';\n\nconst BUCKET = process.env.MINIO_BUCKET || '${config.projectName}';\n\nconst minioClient = new Minio.Client({\n endPoint: process.env.MINIO_ENDPOINT || 'localhost',\n port: Number(process.env.MINIO_PORT) || 9000,\n useSSL: process.env.MINIO_USE_SSL === 'true',\n accessKey: process.env.MINIO_ACCESS_KEY || 'minioadmin',\n secretKey: process.env.MINIO_SECRET_KEY || 'minioadmin',\n});\n\nexport async function initStorage(): Promise<void> {\n const exists = await minioClient.bucketExists(BUCKET);\n if (!exists) {\n await minioClient.makeBucket(BUCKET);\n console.log(\\`Bucket \"\\${BUCKET}\" criado\\`);\n }\n}\n\nexport async function upload(fileName: string, buffer: Buffer, contentType?: string): Promise<string> {\n await minioClient.putObject(BUCKET, fileName, buffer, buffer.length, {\n 'Content-Type': contentType || 'application/octet-stream',\n });\n return fileName;\n}\n\nexport async function getFileUrl(fileName: string, expirySeconds = 3600): Promise<string> {\n return minioClient.presignedGetObject(BUCKET, fileName, expirySeconds);\n}\n\nexport async function deleteFile(fileName: string): Promise<void> {\n await minioClient.removeObject(BUCKET, fileName);\n}\n\nexport default { initStorage, upload, getFileUrl, deleteFile };\n`);\n }\n\n dependencies['minio'] = deps.minio;\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const pm2Installer: InstallerFn = async (opts) => {\n const { config, projectDir, devDependencies, scripts } = opts;\n\n const ecosystem = `module.exports = {\n apps: [\n {\n name: '${config.projectName}-api',\n script: '${config.backend === 'nestjs' ? 'dist/main.js' : 'dist/index.js'}',\n cwd: './apps/api',\n instances: 'max',\n exec_mode: 'cluster',\n env: {\n NODE_ENV: 'production',\n PORT: 3001,\n },\n watch: false,\n max_memory_restart: '1G',\n // Zero-downtime reload\n wait_ready: true,\n listen_timeout: 10000,\n kill_timeout: 5000,\n },\n ],\n};\n`;\n\n await writeFile(path.join(projectDir, 'ecosystem.config.cjs'), ecosystem);\n\n devDependencies['pm2'] = deps.pm2;\n scripts['pm2:start'] = 'pm2 start ecosystem.config.cjs';\n scripts['pm2:stop'] = 'pm2 stop ecosystem.config.cjs';\n scripts['pm2:restart'] = 'pm2 reload ecosystem.config.cjs';\n scripts['pm2:logs'] = 'pm2 logs';\n};\n","import path from 'path';\nimport type { InstallerFn } from '../types/installers.js';\nimport { ensureDir, writeFile } from '../helpers/filesystem.js';\n\nexport const multiTenantInstaller: InstallerFn = async (opts) => {\n const { config, apiDir } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'tenant'));\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'tenant', 'tenant.middleware.ts'), `import { Injectable, NestMiddleware } from '@nestjs/common';\nimport type { Request, Response, NextFunction } from 'express';\n\n@Injectable()\nexport class TenantMiddleware implements NestMiddleware {\n use(req: Request, _res: Response, next: NextFunction) {\n // Extrair tenant do header, subdomain ou path\n const tenantId = req.headers['x-tenant-id'] as string\n || this.extractFromSubdomain(req)\n || 'default';\n\n (req as any).tenantId = tenantId;\n next();\n }\n\n private extractFromSubdomain(req: Request): string | null {\n const host = req.hostname;\n const parts = host.split('.');\n if (parts.length >= 3) {\n return parts[0]; // subdomain como tenant\n }\n return null;\n }\n}\n`);\n\n await writeFile(path.join(apiDir, 'src', 'tenant', 'tenant.decorator.ts'), `import { createParamDecorator, ExecutionContext } from '@nestjs/common';\n\nexport const TenantId = createParamDecorator(\n (data: unknown, ctx: ExecutionContext): string => {\n const request = ctx.switchToHttp().getRequest();\n return request.tenantId || 'default';\n },\n);\n`);\n\n await writeFile(path.join(apiDir, 'src', 'tenant', 'tenant.module.ts'), `import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';\nimport { TenantMiddleware } from './tenant.middleware';\n\n@Module({})\nexport class TenantModule implements NestModule {\n configure(consumer: MiddlewareConsumer) {\n consumer.apply(TenantMiddleware).forRoutes('*');\n }\n}\n`);\n } else if (config.backend === 'express') {\n await writeFile(path.join(apiDir, 'src', 'tenant', 'tenant.middleware.ts'), `import type { Request, Response, NextFunction } from 'express';\n\nexport function tenantMiddleware(req: Request, _res: Response, next: NextFunction) {\n const tenantId = req.headers['x-tenant-id'] as string\n || extractFromSubdomain(req)\n || 'default';\n\n (req as any).tenantId = tenantId;\n next();\n}\n\nfunction extractFromSubdomain(req: Request): string | null {\n const host = req.hostname;\n const parts = host.split('.');\n if (parts.length >= 3) {\n return parts[0];\n }\n return null;\n}\n`);\n } else {\n // Fastify\n await writeFile(path.join(apiDir, 'src', 'tenant', 'tenant.plugin.ts'), `import type { FastifyInstance, FastifyRequest } from 'fastify';\nimport fp from 'fastify-plugin';\n\ndeclare module 'fastify' {\n interface FastifyRequest {\n tenantId: string;\n }\n}\n\nasync function tenantPlugin(app: FastifyInstance) {\n app.decorateRequest('tenantId', 'default');\n\n app.addHook('onRequest', async (request: FastifyRequest) => {\n const tenantId = (request.headers['x-tenant-id'] as string)\n || extractFromSubdomain(request)\n || 'default';\n\n request.tenantId = tenantId;\n });\n}\n\nfunction extractFromSubdomain(request: FastifyRequest): string | null {\n const host = request.hostname;\n const parts = host.split('.');\n if (parts.length >= 3) {\n return parts[0];\n }\n return null;\n}\n\nexport default fp(tenantPlugin, { name: 'tenant' });\n`);\n }\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const viacepInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'integrations', 'viacep'));\n\n const serviceContent = `import axios from 'axios';\n\nexport interface ViaCepResponse {\n cep: string;\n logradouro: string;\n complemento: string;\n bairro: string;\n localidade: string;\n uf: string;\n ibge: string;\n erro?: boolean;\n}\n\nconst VIACEP_URL = 'https://viacep.com.br/ws';\n\nexport async function fetchAddress(cep: string): Promise<ViaCepResponse | null> {\n const cleanCep = cep.replace(/\\\\D/g, '');\n if (cleanCep.length !== 8) throw new Error('CEP deve ter 8 dígitos');\n\n const { data } = await axios.get<ViaCepResponse>(\\`\\${VIACEP_URL}/\\${cleanCep}/json\\`);\n if (data.erro) return null;\n return data;\n}\n`;\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'integrations', 'viacep', 'viacep.service.ts'), `import { Injectable } from '@nestjs/common';\nimport axios from 'axios';\n\nexport interface ViaCepResponse {\n cep: string;\n logradouro: string;\n complemento: string;\n bairro: string;\n localidade: string;\n uf: string;\n ibge: string;\n erro?: boolean;\n}\n\n@Injectable()\nexport class ViaCepService {\n private readonly baseUrl = 'https://viacep.com.br/ws';\n\n async fetchAddress(cep: string): Promise<ViaCepResponse | null> {\n const cleanCep = cep.replace(/\\\\D/g, '');\n if (cleanCep.length !== 8) throw new Error('CEP deve ter 8 dígitos');\n\n const { data } = await axios.get<ViaCepResponse>(\\`\\${this.baseUrl}/\\${cleanCep}/json\\`);\n if (data.erro) return null;\n return data;\n }\n}\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'integrations', 'viacep', 'viacep.service.ts'), serviceContent);\n }\n\n dependencies['axios'] = deps.axios;\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const whatsappInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'integrations', 'whatsapp'));\n\n envEntries.push(\n { key: 'WHATSAPP_API_TOKEN', value: '', category: 'WhatsApp', comment: 'Token da API Meta WhatsApp Business' },\n { key: 'WHATSAPP_PHONE_ID', value: '', category: 'WhatsApp' },\n { key: 'WHATSAPP_VERIFY_TOKEN', value: 'my-verify-token', category: 'WhatsApp', comment: 'Token de verificacao do webhook' },\n );\n\n const serviceContent = config.backend === 'nestjs'\n ? `import { Injectable } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport axios from 'axios';\n\n@Injectable()\nexport class WhatsAppService {\n private readonly apiUrl: string;\n private readonly token: string;\n\n constructor(private configService: ConfigService) {\n const phoneId = this.configService.get('WHATSAPP_PHONE_ID');\n this.apiUrl = \\`https://graph.facebook.com/v18.0/\\${phoneId}/messages\\`;\n this.token = this.configService.get('WHATSAPP_API_TOKEN', '');\n }\n\n async sendMessage(to: string, message: string): Promise<void> {\n await axios.post(\n this.apiUrl,\n {\n messaging_product: 'whatsapp',\n to,\n type: 'text',\n text: { body: message },\n },\n {\n headers: {\n Authorization: \\`Bearer \\${this.token}\\`,\n 'Content-Type': 'application/json',\n },\n }\n );\n }\n\n async sendTemplate(to: string, templateName: string, language = 'pt_BR'): Promise<void> {\n await axios.post(\n this.apiUrl,\n {\n messaging_product: 'whatsapp',\n to,\n type: 'template',\n template: { name: templateName, language: { code: language } },\n },\n {\n headers: {\n Authorization: \\`Bearer \\${this.token}\\`,\n 'Content-Type': 'application/json',\n },\n }\n );\n }\n}\n`\n : `import axios from 'axios';\n\nconst PHONE_ID = process.env.WHATSAPP_PHONE_ID;\nconst API_URL = \\`https://graph.facebook.com/v18.0/\\${PHONE_ID}/messages\\`;\nconst TOKEN = process.env.WHATSAPP_API_TOKEN || '';\n\nconst headers = {\n Authorization: \\`Bearer \\${TOKEN}\\`,\n 'Content-Type': 'application/json',\n};\n\nexport async function sendMessage(to: string, message: string): Promise<void> {\n await axios.post(API_URL, {\n messaging_product: 'whatsapp',\n to,\n type: 'text',\n text: { body: message },\n }, { headers });\n}\n\nexport async function sendTemplate(to: string, templateName: string, language = 'pt_BR'): Promise<void> {\n await axios.post(API_URL, {\n messaging_product: 'whatsapp',\n to,\n type: 'template',\n template: { name: templateName, language: { code: language } },\n }, { headers });\n}\n`;\n\n await writeFile(path.join(apiDir, 'src', 'integrations', 'whatsapp', 'whatsapp.service.ts'), serviceContent);\n\n dependencies['axios'] = deps.axios;\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const stripeInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'integrations', 'stripe'));\n\n envEntries.push(\n { key: 'STRIPE_SECRET_KEY', value: '', category: 'Stripe', comment: 'Obtenha em https://dashboard.stripe.com' },\n { key: 'STRIPE_WEBHOOK_SECRET', value: '', category: 'Stripe' },\n );\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'integrations', 'stripe', 'stripe.service.ts'), `import { Injectable } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport Stripe from 'stripe';\n\n@Injectable()\nexport class StripeService {\n private stripe: Stripe;\n\n constructor(private configService: ConfigService) {\n this.stripe = new Stripe(this.configService.get('STRIPE_SECRET_KEY', ''), {\n apiVersion: '2024-12-18.acacia',\n });\n }\n\n async createCheckoutSession(params: {\n priceId: string;\n successUrl: string;\n cancelUrl: string;\n customerEmail?: string;\n }) {\n return this.stripe.checkout.sessions.create({\n mode: 'subscription',\n payment_method_types: ['card'],\n line_items: [{ price: params.priceId, quantity: 1 }],\n success_url: params.successUrl,\n cancel_url: params.cancelUrl,\n customer_email: params.customerEmail,\n });\n }\n\n async createPaymentIntent(amount: number, currency = 'brl') {\n return this.stripe.paymentIntents.create({\n amount,\n currency,\n });\n }\n\n constructWebhookEvent(body: Buffer, signature: string) {\n const webhookSecret = this.configService.get('STRIPE_WEBHOOK_SECRET', '');\n return this.stripe.webhooks.constructEvent(body, signature, webhookSecret);\n }\n}\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'integrations', 'stripe', 'stripe.service.ts'), `import Stripe from 'stripe';\n\nconst stripe = new Stripe(process.env.STRIPE_SECRET_KEY || '', {\n apiVersion: '2024-12-18.acacia',\n});\n\nexport async function createCheckoutSession(params: {\n priceId: string;\n successUrl: string;\n cancelUrl: string;\n customerEmail?: string;\n}) {\n return stripe.checkout.sessions.create({\n mode: 'subscription',\n payment_method_types: ['card'],\n line_items: [{ price: params.priceId, quantity: 1 }],\n success_url: params.successUrl,\n cancel_url: params.cancelUrl,\n customer_email: params.customerEmail,\n });\n}\n\nexport async function createPaymentIntent(amount: number, currency = 'brl') {\n return stripe.paymentIntents.create({ amount, currency });\n}\n\nexport function constructWebhookEvent(body: Buffer, signature: string) {\n return stripe.webhooks.constructEvent(\n body,\n signature,\n process.env.STRIPE_WEBHOOK_SECRET || ''\n );\n}\n`);\n }\n\n dependencies['stripe'] = deps.stripe;\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const mercadoPagoInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'integrations', 'mercado-pago'));\n\n envEntries.push(\n { key: 'MERCADOPAGO_ACCESS_TOKEN', value: '', category: 'Mercado Pago', comment: 'Obtenha em https://www.mercadopago.com.br/developers' },\n );\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'integrations', 'mercado-pago', 'mercado-pago.service.ts'), `import { Injectable } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport { MercadoPagoConfig, Preference, Payment } from 'mercadopago';\n\n@Injectable()\nexport class MercadoPagoService {\n private client: MercadoPagoConfig;\n\n constructor(private configService: ConfigService) {\n this.client = new MercadoPagoConfig({\n accessToken: this.configService.get('MERCADOPAGO_ACCESS_TOKEN', ''),\n });\n }\n\n async createPreference(params: {\n title: string;\n quantity: number;\n unitPrice: number;\n successUrl?: string;\n failureUrl?: string;\n }) {\n const preference = new Preference(this.client);\n return preference.create({\n body: {\n items: [\n {\n id: 'item-1',\n title: params.title,\n quantity: params.quantity,\n unit_price: params.unitPrice,\n currency_id: 'BRL',\n },\n ],\n back_urls: {\n success: params.successUrl || 'http://localhost:3000/success',\n failure: params.failureUrl || 'http://localhost:3000/failure',\n },\n auto_return: 'approved',\n },\n });\n }\n\n async getPayment(paymentId: string) {\n const payment = new Payment(this.client);\n return payment.get({ id: paymentId });\n }\n}\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'integrations', 'mercado-pago', 'mercado-pago.service.ts'), `import { MercadoPagoConfig, Preference, Payment } from 'mercadopago';\n\nconst client = new MercadoPagoConfig({\n accessToken: process.env.MERCADOPAGO_ACCESS_TOKEN || '',\n});\n\nexport async function createPreference(params: {\n title: string;\n quantity: number;\n unitPrice: number;\n successUrl?: string;\n failureUrl?: string;\n}) {\n const preference = new Preference(client);\n return preference.create({\n body: {\n items: [\n {\n id: 'item-1',\n title: params.title,\n quantity: params.quantity,\n unit_price: params.unitPrice,\n currency_id: 'BRL',\n },\n ],\n back_urls: {\n success: params.successUrl || 'http://localhost:3000/success',\n failure: params.failureUrl || 'http://localhost:3000/failure',\n },\n auto_return: 'approved',\n },\n });\n}\n\nexport async function getPayment(paymentId: string) {\n const payment = new Payment(client);\n return payment.get({ id: paymentId });\n}\n`);\n }\n\n dependencies['mercadopago'] = deps.mercadopago;\n};\n","import path from 'path';\nimport type { InstallerFn } from '../../types/installers.js';\nimport { ensureDir, writeFile } from '../../helpers/filesystem.js';\nimport { dependencyVersionMap as deps } from '../dependencyVersionMap.js';\n\nexport const abacatePayInstaller: InstallerFn = async (opts) => {\n const { config, apiDir, envEntries, dependencies } = opts;\n\n await ensureDir(path.join(apiDir, 'src', 'integrations', 'abacate-pay'));\n\n envEntries.push(\n { key: 'ABACATEPAY_API_KEY', value: '', category: 'AbacatePay', comment: 'Obtenha em https://abacatepay.com' },\n { key: 'ABACATEPAY_API_URL', value: 'https://api.abacatepay.com/v1', category: 'AbacatePay' },\n );\n\n if (config.backend === 'nestjs') {\n await writeFile(path.join(apiDir, 'src', 'integrations', 'abacate-pay', 'abacate-pay.service.ts'), `import { Injectable } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport axios, { type AxiosInstance } from 'axios';\n\n@Injectable()\nexport class AbacatePayService {\n private client: AxiosInstance;\n\n constructor(private configService: ConfigService) {\n this.client = axios.create({\n baseURL: this.configService.get('ABACATEPAY_API_URL', 'https://api.abacatepay.com/v1'),\n headers: {\n Authorization: \\`Bearer \\${this.configService.get('ABACATEPAY_API_KEY')}\\`,\n 'Content-Type': 'application/json',\n },\n });\n }\n\n async createPayment(params: {\n amount: number;\n description: string;\n customerEmail: string;\n }) {\n const { data } = await this.client.post('/payments', {\n amount: params.amount,\n description: params.description,\n customer: { email: params.customerEmail },\n });\n return data;\n }\n\n async getPayment(paymentId: string) {\n const { data } = await this.client.get(\\`/payments/\\${paymentId}\\`);\n return data;\n }\n\n async createPixPayment(params: {\n amount: number;\n description: string;\n customerEmail: string;\n }) {\n const { data } = await this.client.post('/payments/pix', {\n amount: params.amount,\n description: params.description,\n customer: { email: params.customerEmail },\n });\n return data;\n }\n}\n`);\n } else {\n await writeFile(path.join(apiDir, 'src', 'integrations', 'abacate-pay', 'abacate-pay.service.ts'), `import axios from 'axios';\n\nconst API_URL = process.env.ABACATEPAY_API_URL || 'https://api.abacatepay.com/v1';\nconst API_KEY = process.env.ABACATEPAY_API_KEY || '';\n\nconst client = axios.create({\n baseURL: API_URL,\n headers: {\n Authorization: \\`Bearer \\${API_KEY}\\`,\n 'Content-Type': 'application/json',\n },\n});\n\nexport async function createPayment(params: {\n amount: number;\n description: string;\n customerEmail: string;\n}) {\n const { data } = await client.post('/payments', {\n amount: params.amount,\n description: params.description,\n customer: { email: params.customerEmail },\n });\n return data;\n}\n\nexport async function getPayment(paymentId: string) {\n const { data } = await client.get(\\`/payments/\\${paymentId}\\`);\n return data;\n}\n\nexport async function createPixPayment(params: {\n amount: number;\n description: string;\n customerEmail: string;\n}) {\n const { data } = await client.post('/payments/pix', {\n amount: params.amount,\n description: params.description,\n customer: { email: params.customerEmail },\n });\n return data;\n}\n`);\n }\n\n dependencies['axios'] = deps.axios;\n};\n","import type { ProjectConfig } from '../types/config.js';\nimport type { InstallerMap } from '../types/installers.js';\n\nimport { prismaInstaller } from './database/prisma.js';\nimport { mongooseInstaller } from './database/mongoose.js';\nimport { jwtInstaller } from './auth/jwt.js';\nimport { magicLinkInstaller } from './auth/magicLink.js';\nimport { googleOauthInstaller } from './auth/googleOauth.js';\nimport { bullmqInstaller } from './queue/bullmq.js';\nimport { rabbitmqInstaller } from './queue/rabbitmq.js';\nimport { redisInstaller } from './infra/redis.js';\nimport { smtpInstaller } from './infra/smtp.js';\nimport { minioInstaller } from './infra/minio.js';\nimport { pm2Installer } from './infra/pm2.js';\nimport { multiTenantInstaller } from './multiTenant.js';\nimport { viacepInstaller } from './integrations/viacep.js';\nimport { whatsappInstaller } from './integrations/whatsapp.js';\nimport { stripeInstaller } from './integrations/stripe.js';\nimport { mercadoPagoInstaller } from './integrations/mercadoPago.js';\nimport { abacatePayInstaller } from './integrations/abacatePay.js';\n\nexport function buildInstallerMap(config: ProjectConfig): InstallerMap {\n return {\n // Database (must run before auth since auth may depend on user model)\n 'Prisma': {\n inUse: config.usePrisma,\n installer: prismaInstaller,\n },\n 'Mongoose': {\n inUse: config.useMongoose,\n installer: mongooseInstaller,\n },\n\n // Multi-tenant (after database)\n 'Multi-tenant': {\n inUse: config.multiTenant,\n installer: multiTenantInstaller,\n },\n\n // Infrastructure\n 'Redis': {\n inUse: config.redis,\n installer: redisInstaller,\n },\n 'SMTP': {\n inUse: config.smtp,\n installer: smtpInstaller,\n },\n 'MinIO': {\n inUse: config.minio,\n installer: minioInstaller,\n },\n 'PM2': {\n inUse: config.pm2,\n installer: pm2Installer,\n },\n\n // Auth\n 'JWT Auth': {\n inUse: config.auth.jwt,\n installer: jwtInstaller,\n },\n 'Magic Link': {\n inUse: config.auth.magicLink,\n installer: magicLinkInstaller,\n },\n 'Google OAuth': {\n inUse: config.auth.googleOAuth,\n installer: googleOauthInstaller,\n },\n\n // Queues\n 'BullMQ': {\n inUse: config.queue === 'bullmq',\n installer: bullmqInstaller,\n },\n 'RabbitMQ': {\n inUse: config.queue === 'rabbitmq',\n installer: rabbitmqInstaller,\n },\n\n // Integrations\n 'ViaCEP': {\n inUse: config.integrations.viacep,\n installer: viacepInstaller,\n },\n 'WhatsApp': {\n inUse: config.integrations.whatsapp,\n installer: whatsappInstaller,\n },\n 'Stripe': {\n inUse: config.integrations.stripe,\n installer: stripeInstaller,\n },\n 'Mercado Pago': {\n inUse: config.integrations.mercadoPago,\n installer: mercadoPagoInstaller,\n },\n 'AbacatePay': {\n inUse: config.integrations.abacatePay,\n installer: abacatePayInstaller,\n },\n };\n}\n","import ora, { type Ora } from 'ora';\n\nexport function createSpinner(text: string): Ora {\n return ora({ text, color: 'cyan' });\n}\n\nexport async function withSpinner<T>(text: string, fn: () => Promise<T>): Promise<T> {\n const spinner = createSpinner(text);\n spinner.start();\n try {\n const result = await fn();\n spinner.succeed();\n return result;\n } catch (error) {\n spinner.fail();\n throw error;\n }\n}\n","import { execa } from 'execa';\n\nexport async function initGit(projectDir: string): Promise<void> {\n await execa('git', ['init'], { cwd: projectDir });\n await execa('git', ['add', '-A'], { cwd: projectDir });\n await execa('git', ['commit', '-m', 'chore: initial commit from plazercli'], {\n cwd: projectDir,\n });\n}\n","import { readFile, writeFile } from './filesystem.js';\nimport path from 'path';\n\nexport interface PackageJson {\n name: string;\n version: string;\n private?: boolean;\n description?: string;\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: string[];\n [key: string]: unknown;\n}\n\nexport async function readPackageJson(dir: string): Promise<PackageJson> {\n const content = await readFile(path.join(dir, 'package.json'));\n return JSON.parse(content);\n}\n\nexport async function writePackageJson(dir: string, pkg: PackageJson): Promise<void> {\n await writeFile(path.join(dir, 'package.json'), JSON.stringify(pkg, null, 2) + '\\n');\n}\n\nexport function addDependency(\n pkg: PackageJson,\n name: string,\n version: string\n): void {\n if (!pkg.dependencies) pkg.dependencies = {};\n pkg.dependencies[name] = version;\n}\n\nexport function addDevDependency(\n pkg: PackageJson,\n name: string,\n version: string\n): void {\n if (!pkg.devDependencies) pkg.devDependencies = {};\n pkg.devDependencies[name] = version;\n}\n\nexport function addScript(\n pkg: PackageJson,\n name: string,\n command: string\n): void {\n if (!pkg.scripts) pkg.scripts = {};\n pkg.scripts[name] = command;\n}\n\nexport function sortDeps(pkg: PackageJson): PackageJson {\n if (pkg.dependencies) {\n pkg.dependencies = Object.fromEntries(\n Object.entries(pkg.dependencies).sort(([a], [b]) => a.localeCompare(b))\n );\n }\n if (pkg.devDependencies) {\n pkg.devDependencies = Object.fromEntries(\n Object.entries(pkg.devDependencies).sort(([a], [b]) => a.localeCompare(b))\n );\n }\n return pkg;\n}\n","import { parseArgs } from './cli/args.js';\nimport { runPrompts } from './cli/prompts.js';\nimport { printBanner, printSummary, logger } from './helpers/logger.js';\nimport { generateProject } from './generators/project.js';\nimport { confirm } from '@inquirer/prompts';\n\nasync function main() {\n const flags = parseArgs();\n\n printBanner();\n const config = await runPrompts(flags);\n\n printSummary(config);\n\n const confirmed = await confirm({\n message: '✅ Confirma a criação do projeto com essas configurações?',\n default: true,\n });\n\n if (!confirmed) {\n logger.warn('Criação cancelada.');\n process.exit(0);\n }\n\n await generateProject(config);\n}\n\nmain().catch((error) => {\n logger.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n});\n"],"mappings":"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","names":["path","path","chalk","path","path","fileURLToPath","__dirname","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","execa","path","pkg","pkg","path","chalk","confirm"]}
|