{"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { spawnSync } from 'child_process';\nimport { createRequire } from 'module';\nimport { logger } from '../core/logger';\nimport { formatWextsError, WextsError } from '../errors';\n\ninterface CommonOptions {\n    cwd?: string;\n}\n\nexport function createCliProgram(): Command {\n    const program = new Command();\n\n    program\n        .name('wexts')\n        .description('Wexts - production-focused single-runtime Next.js + NestJS toolkit')\n        .version(readPackageVersion());\n\n    program\n        .command('create <project-name>')\n        .description('Create a verified Wexts starter')\n        .option('-t, --template <template>', 'Template to use (starter|legacy)', 'starter')\n        .option('--skip-install', 'Skip dependency installation', false)\n        .action(async (projectName: string, options: { template: string; skipInstall: boolean }) => {\n            await createProject(projectName, options.template, { skipInstall: options.skipInstall });\n        });\n\n    program\n        .command('dev')\n        .description('Start local development processes')\n        .option('-a, --api <path>', 'Path to API project', './apps/api')\n        .option('-w, --web <path>', 'Path to Web project', './apps/web')\n        .option('-p, --port <port>', 'Port for web server', '3000')\n        .option('--api-port <port>', 'Port for API server', '5050')\n        .option('--proxy', 'Enable development proxy on a separate proxy port', false)\n        .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n        .action(async (options: { api: string; web: string; port: string; apiPort: string; proxy: boolean; config: string }) => {\n            const { FusionDevServer } = await import('../dev-server/index.js');\n            const server = new FusionDevServer();\n            await server.start({\n                apiPath: options.api,\n                webPath: options.web,\n                webPort: Number(options.port),\n                apiPort: Number(options.apiPort),\n                useProxy: options.proxy,\n                rootDir: process.cwd(),\n                runtimeConfigPath: options.config,\n            });\n        });\n\n    program\n        .command('generate [type] [name]')\n        .alias('g')\n        .description('Generate RPC manifest/client, or scaffold a minimal RPC service')\n        .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n        .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n        .option('--force', 'Overwrite generated files if they already exist', false)\n        .action(async (type: string | undefined, name: string | undefined, options: { project: string; output: string; force: boolean }) => {\n            if (!type || (type === 'rpc' && !name)) {\n                const { generateRpcClient } = await import('../codegen/index.js');\n                const manifest = await generateRpcClient({\n                    projectPath: path.resolve(options.project),\n                    outputPath: path.resolve(options.output),\n                });\n                logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n                return;\n            }\n\n            if (isScaffoldGenerator(type)) {\n                const targetRoot = type === 'config' ? process.cwd() : path.resolve(options.project);\n                const changedFiles = await scaffoldGenerator({\n                    type,\n                    name,\n                    targetRoot,\n                    force: options.force,\n                });\n                for (const file of changedFiles) logger.info(`created ${path.relative(process.cwd(), file)}`);\n                logger.success(`Generated ${type}${name ? ` ${name}` : ''}.`);\n                return;\n            }\n\n            throw new Error(`Unknown generator \"${type}\". Supported generators: rpc, service, module, entity, guard, config.`);\n        });\n\n    program\n        .command('codegen')\n        .description('Alias for wexts generate rpc')\n        .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n        .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n        .action(async (options: { project: string; output: string }) => {\n            const { generateRpcClient } = await import('../codegen/index.js');\n            const manifest = await generateRpcClient({\n                projectPath: path.resolve(options.project),\n                outputPath: path.resolve(options.output),\n            });\n            logger.success(`Generated Wexts RPC client for ${manifest.services.length} service(s).`);\n        });\n\n    program\n        .command('build')\n        .description('Build a Wexts project for production')\n        .option('--skip-generate', 'Skip RPC generation before build', false)\n        .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n        .option('-o, --output <path>', 'Output directory for generated RPC client', './apps/web/lib/wexts')\n        .action(async (options: { skipGenerate: boolean; project: string; output: string }) => {\n            if (!options.skipGenerate && fs.existsSync(options.project)) {\n                const { generateRpcClient } = await import('../codegen/index.js');\n                await generateRpcClient({\n                    projectPath: path.resolve(options.project),\n                    outputPath: path.resolve(options.output),\n                });\n            }\n            runScript('build', { cwd: process.cwd() });\n        });\n\n    program\n        .command('start')\n        .description('Start the Wexts runtime')\n        .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n        .option('-p, --port <port>', 'Port to listen on', process.env.PORT ?? '3000')\n        .option('--dev', 'Run the runtime in development mode', false)\n        .action(async (options: { config: string; port: string; dev: boolean }) => {\n            const { startWextsRuntime } = await import('../runtime/index.js');\n            const configPath = path.resolve(options.config);\n            const runtimeConfig = fs.existsSync(configPath)\n                ? await loadRuntimeConfig(configPath, options.dev)\n                : {};\n            await startWextsRuntime({\n                ...runtimeConfig,\n                port: Number(options.port),\n                dev: options.dev,\n            });\n        });\n\n    program\n        .command('vercel-build')\n        .description('Build for Vercel using Build Output API v3')\n        .option('-p, --project <path>', 'Path to NestJS project', './apps/api')\n        .option('-o, --output <path>', 'Output dir for RPC client', './apps/web/lib/wexts')\n        .option('-c, --config <path>', 'Runtime config module path', './wexts.runtime.js')\n        .option('--skip-codegen', 'Skip RPC generation', false)\n        .option('--skip-build', 'Skip project build step', false)\n        .option('--node-version <version>', 'Node.js version for Vercel function', '20')\n        .option('--max-duration <seconds>', 'Max duration for serverless function', '30')\n        .action(async (options: {\n            project: string;\n            output: string;\n            config: string;\n            skipCodegen: boolean;\n            skipBuild: boolean;\n            nodeVersion: string;\n            maxDuration: string;\n        }) => {\n            const { buildVercelOutput } = await import('../vercel-builder/index.js');\n            const result = await buildVercelOutput({\n                rootDir: process.cwd(),\n                apiProjectPath: options.project,\n                rpcOutputPath: options.output,\n                runtimeConfigPath: options.config,\n                skipCodegen: options.skipCodegen,\n                skipBuild: options.skipBuild,\n                nodeVersion: options.nodeVersion,\n                maxDuration: Number(options.maxDuration),\n            });\n            if (result.warnings.length > 0) {\n                for (const warning of result.warnings) logger.warn(warning);\n            }\n            if (result.errors.length > 0) {\n                for (const error of result.errors) logger.error(error);\n                process.exit(1);\n            }\n            logger.success('Vercel build output ready at .vercel/output');\n        });\n\n    program\n        .command('doctor')\n        .description('Validate Wexts project configuration')\n        .option('--security', 'Run security-specific checks', false)\n        .action(async (options: { security: boolean }) => {\n            const result = runDoctor(process.cwd(), options.security);\n            for (const warning of result.warnings) logger.warn(warning);\n            for (const error of result.errors) logger.error(error);\n            if (result.errors.length > 0) process.exit(1);\n            logger.success(options.security ? 'Security doctor passed.' : 'Doctor passed.');\n        });\n\n    return program;\n}\n\nexport interface DoctorResult {\n    errors: string[];\n    warnings: string[];\n}\n\nexport function runDoctor(cwd: string, security = false): DoctorResult {\n    const result: DoctorResult = { errors: [], warnings: [] };\n    const pkgPath = path.join(cwd, 'package.json');\n\n    if (!fs.existsSync(pkgPath)) {\n        result.errors.push('package.json not found.');\n        return result;\n    }\n\n    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n    if (!pkg.packageManager?.startsWith('pnpm@')) {\n        result.warnings.push('packageManager should pin pnpm.');\n    }\n\n    for (const dir of ['apps/api', 'apps/web']) {\n        if (!fs.existsSync(path.join(cwd, dir))) {\n            result.warnings.push(`${dir} not found; some Wexts commands may need explicit paths.`);\n        }\n    }\n\n    if (fs.existsSync(path.join(cwd, 'apps/api')) && fs.existsSync(path.join(cwd, 'apps/web'))) {\n        result.warnings.push('Development mode starts an API compiler plus the Wexts runtime so `/rpc` and Next routes share the web port.');\n    }\n\n    if (security) {\n        const source = readAllText(cwd, ['apps/api/src', 'packages/templates/nestjs-api/src']);\n        if (source.includes('default-secret')) {\n            result.errors.push('JWT fallback \"default-secret\" found. Production apps must fail without a strong JWT_SECRET.');\n        }\n        if (/origin:\\s*['\"]\\*['\"]/.test(source)) {\n            result.errors.push('Wildcard CORS origin found. Use an explicit origin allowlist.');\n        }\n    }\n\n    return result;\n}\n\nexport async function createProject(\n    projectName: string,\n    template: string,\n    options: { skipInstall: boolean; wextsDependency?: string }\n): Promise<void> {\n    const projectPath = path.join(process.cwd(), projectName);\n    if (fs.existsSync(projectPath)) {\n        throw new Error(`Directory already exists: ${projectName}`);\n    }\n\n    fs.mkdirSync(projectPath, { recursive: true });\n\n    if (template === 'starter') {\n        await createVerifiedStarter(projectPath, projectName, options.wextsDependency ?? resolveCreateWextsDependency(projectPath));\n    } else if (template === 'legacy') {\n        createLegacyProject(projectPath, projectName);\n    } else {\n        throw new Error(`Unknown template \"${template}\". Supported templates: starter, legacy.`);\n    }\n\n    if (!options.skipInstall) {\n        runCommand(detectPackageManager(projectPath), ['install'], projectPath);\n    }\n}\n\nasync function createVerifiedStarter(projectPath: string, projectName: string, wextsDependency: string): Promise<void> {\n    const files: Record<string, string> = {\n        'pnpm-workspace.yaml': \"packages:\\n  - 'apps/*'\\n\",\n        'package.json': JSON.stringify({\n            name: projectName,\n            version: '0.1.0',\n            private: true,\n            packageManager: 'pnpm@10.22.0',\n            scripts: {\n                dev: 'wexts dev',\n                generate: 'wexts generate -p apps/api -o apps/web/lib/wexts',\n                build: 'pnpm run generate && tsc -p apps/api/tsconfig.json && next build apps/web',\n                start: 'wexts start -c ./wexts.runtime.js',\n                'vercel-build': 'wexts vercel-build -p apps/api -o apps/web/lib/wexts -c ./wexts.runtime.js',\n                doctor: 'wexts doctor',\n                'doctor:security': 'wexts doctor --security',\n            },\n            dependencies: {\n                wexts: wextsDependency,\n            },\n        }, null, 2),\n        'wexts.runtime.js': `const { HelloService } = require('./apps/api/dist/hello.service.js');\n\nmodule.exports = {\n  nextDir: './apps/web',\n  rpcManifestPath: './apps/web/lib/wexts/wexts.rpc.manifest.json',\n  rpcServices: {\n    hello: new HelloService(),\n  },\n  security: {\n    allowedOrigins: ['http://localhost:3000'],\n  },\n};\n`,\n        'README.md': `# ${projectName}\n\nVerified Wexts starter with Next.js and NestJS.\n\n\\`\\`\\`bash\npnpm install\npnpm run generate\npnpm run build\npnpm run dev\n\\`\\`\\`\n`,\n        '.cursorrules': `# Wexts Project AI Rules\n\nYou are an expert full-stack developer working on a Wexts application.\nWexts is a unified single-runtime toolkit that combines Next.js (frontend) and NestJS (backend) using a highly typed RPC bridge.\n\n## Project Structure\n- \\`apps/api/\\`: The NestJS backend. Contains business logic, database models, and RPC services.\n- \\`apps/web/\\`: The Next.js frontend. Contains UI components, pages, and consumes the RPC client.\n- \\`apps/web/lib/wexts\\`: The auto-generated typed RPC client (DO NOT EDIT MANUALLY).\n\n## Backend Guidelines (NestJS)\n1. **RPC Services**: To create an API endpoint, create a NestJS provider decorated with \\`@RpcService({ name: 'serviceName' })\\` and methods decorated with \\`@RpcMethod()\\`.\n2. **Imports**: Import \\`@RpcService\\` and \\`@RpcMethod\\` from \\`wexts/nest\\`.\n3. Do NOT manually create REST controllers unless explicitly needed for webhooks. Use the RPC bridge for all internal frontend-backend communication.\n4. **Auth**: If a service requires authentication, set \\`@RpcService({ requireAuth: true })\\`.\n\n## Frontend Guidelines (Next.js)\n1. **RPC Usage**: To call the backend, import the \\`api\\` client from \\`@/lib/wexts\\` or your designated Wexts client file (e.g., \\`useWexts()\\`).\n2. **Syntax**: \\`const data = await api.serviceName.methodName(args);\\`\n3. The \\`api\\` object is fully type-safe. Rely on TypeScript autocomplete rather than guessing endpoints.\n`,\n    };\n\n    // Write root files\n    for (const [relativePath, content] of Object.entries(files)) {\n        const absolutePath = path.join(projectPath, relativePath);\n        fs.mkdirSync(path.dirname(absolutePath), { recursive: true });\n        fs.writeFileSync(absolutePath, content);\n    }\n\n    const templatePath = findTemplatePath();\n    if (!templatePath) {\n        throw new Error('Template directory not found in package.');\n    }\n\n    // Copy API template\n    const apiTemplatePath = path.join(templatePath, 'nestjs-api');\n    const apiDestPath = path.join(projectPath, 'apps/api');\n    if (fs.existsSync(apiTemplatePath)) {\n        fs.cpSync(apiTemplatePath, apiDestPath, {\n            recursive: true,\n            filter: (src) => {\n                const basename = path.basename(src);\n                return basename !== 'node_modules' && basename !== 'dist' && basename !== 'package-lock.json';\n            },\n        });\n        const apiPkgPath = path.join(apiDestPath, 'package.json');\n        if (fs.existsSync(apiPkgPath)) {\n            const apiPkg = JSON.parse(fs.readFileSync(apiPkgPath, 'utf8'));\n            apiPkg.name = `${projectName}-api`;\n            if (apiPkg.dependencies?.wexts) apiPkg.dependencies.wexts = wextsDependency;\n            fs.writeFileSync(apiPkgPath, JSON.stringify(apiPkg, null, 2));\n        }\n    }\n\n    // Copy Web template\n    const webTemplatePath = path.join(templatePath, 'nextjs-web');\n    const webDestPath = path.join(projectPath, 'apps/web');\n    if (fs.existsSync(webTemplatePath)) {\n        fs.cpSync(webTemplatePath, webDestPath, {\n            recursive: true,\n            filter: (src) => {\n                const basename = path.basename(src);\n                return basename !== 'node_modules' && basename !== '.next' && basename !== 'package-lock.json';\n            },\n        });\n        const webPkgPath = path.join(webDestPath, 'package.json');\n        if (fs.existsSync(webPkgPath)) {\n            const webPkg = JSON.parse(fs.readFileSync(webPkgPath, 'utf8'));\n            webPkg.name = `${projectName}-web`;\n            if (webPkg.dependencies?.wexts) webPkg.dependencies.wexts = wextsDependency;\n            fs.writeFileSync(webPkgPath, JSON.stringify(webPkg, null, 2));\n        }\n    }\n\n    // Attempt RPC generation if api exists\n    if (fs.existsSync(path.join(apiDestPath, 'src'))) {\n        try {\n            const { generateRpcClient } = await import('../codegen/index.js');\n            await generateRpcClient({\n                projectPath: path.join(projectPath, 'apps/api'),\n                outputPath: path.join(projectPath, 'apps/web/lib/wexts'),\n            });\n        } catch (e) {\n            logger.warn('Initial RPC generation failed; you may need to run \"wexts generate\" after setup.');\n        }\n    }\n}\n\nfunction createLegacyProject(projectPath: string, projectName: string): void {\n    const templatePath = findTemplatePath();\n    if (!templatePath) {\n        throw new Error('Template directory not found in package.');\n    }\n\n    fs.mkdirSync(path.join(projectPath, 'apps'), { recursive: true });\n    fs.cpSync(path.join(templatePath, 'nestjs-api'), path.join(projectPath, 'apps/api'), { recursive: true });\n    fs.cpSync(path.join(templatePath, 'nextjs-web'), path.join(projectPath, 'apps/web'), { recursive: true });\n    fs.rmSync(path.join(projectPath, 'apps/web/package-lock.json'), { force: true });\n    fs.rmSync(path.join(projectPath, 'apps/api/package-lock.json'), { force: true });\n    fs.writeFileSync(path.join(projectPath, 'pnpm-workspace.yaml'), \"packages:\\n  - 'apps/*'\\n\");\n    fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify({\n        name: projectName,\n        private: true,\n        packageManager: 'pnpm@10.22.0',\n        scripts: {\n            dev: 'wexts dev',\n            generate: 'wexts generate',\n            build: 'wexts build',\n            start: 'wexts start',\n            doctor: 'wexts doctor',\n        },\n        devDependencies: {\n            wexts: `^${readPackageVersion()}`,\n        },\n    }, null, 2));\n}\n\nfunction resolveCreateWextsDependency(projectPath: string): string {\n    const packageRoot = path.resolve(__dirname, '../..');\n    const cwdLocalPackage = path.join(process.cwd(), 'node_modules/wexts');\n\n    try {\n        if (fs.existsSync(cwdLocalPackage) && fs.realpathSync(cwdLocalPackage) === fs.realpathSync(packageRoot)) {\n            return `file:${path.relative(projectPath, cwdLocalPackage)}`;\n        }\n    } catch {\n        // Fall back to semver for normal npx/npm usage.\n    }\n\n    return `^${readPackageVersion()}`;\n}\n\ntype ScaffoldGeneratorType = 'rpc' | 'service' | 'module' | 'entity' | 'guard' | 'config';\n\ninterface ScaffoldGeneratorOptions {\n    type: ScaffoldGeneratorType;\n    name?: string;\n    targetRoot: string;\n    force?: boolean;\n}\n\nexport async function scaffoldGenerator(options: ScaffoldGeneratorOptions): Promise<string[]> {\n    if (options.type !== 'config' && !options.name) {\n        throw new WextsError({\n            code: 'WEXTS_CLI_GENERATOR_NAME_REQUIRED',\n            message: `Generator \"${options.type}\" requires a name.`,\n            suggestedFix: `Run \\`wexts generate ${options.type} hello\\` or use \\`wexts generate config\\`.`,\n            docsSlug: 'cli',\n        });\n    }\n\n    if (options.type === 'config') {\n        return writeGeneratedFiles(options.targetRoot, [{\n            relativePath: 'wexts.runtime.js',\n            content: `/** @type {import('wexts/runtime').WextsRuntimeConfig} */\nmodule.exports = {\n  rootDir: __dirname,\n  port: Number(process.env.PORT || 3000),\n  rpcManifestPath: 'apps/web/lib/wexts/wexts.rpc.manifest.json',\n  security: {\n    enabled: true,\n    production: process.env.NODE_ENV === 'production',\n    allowedOrigins: process.env.WEXTS_ALLOWED_ORIGINS?.split(',').filter(Boolean) || [],\n  },\n};\n`,\n        }], Boolean(options.force));\n    }\n\n    const rawName = options.name!;\n    const name = toKebabCase(rawName);\n    const classBase = toPascalCase(name);\n    const srcRoot = path.join(options.targetRoot, 'src');\n\n    const filesByType: Record<Exclude<ScaffoldGeneratorType, 'config'>, { relativePath: string; content: string }[]> = {\n        rpc: rpcServiceFiles(name, classBase),\n        service: [{\n            relativePath: path.join('src', name, `${name}.service.ts`),\n            content: `import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class ${classBase}Service {\n  async execute(): Promise<string> {\n    return '${toCamelCase(name)}';\n  }\n}\n`,\n        }],\n        module: [{\n            relativePath: path.join('src', name, `${name}.module.ts`),\n            content: `import { Module } from '@nestjs/common';\n\n@Module({})\nexport class ${classBase}Module {}\n`,\n        }],\n        entity: [{\n            relativePath: path.join('src', name, `${name}.entity.ts`),\n            content: `export interface ${classBase}Entity {\n  id: string;\n  createdAt: Date;\n  updatedAt: Date;\n}\n`,\n        }],\n        guard: [{\n            relativePath: path.join('src', name, `${name}.guard.ts`),\n            content: `import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class ${classBase}Guard implements CanActivate {\n  canActivate(_context: ExecutionContext): boolean {\n    return true;\n  }\n}\n`,\n        }],\n    };\n\n    fs.mkdirSync(srcRoot, { recursive: true });\n    return writeGeneratedFiles(options.targetRoot, filesByType[options.type], Boolean(options.force));\n}\n\nfunction isScaffoldGenerator(type: string): type is ScaffoldGeneratorType {\n    return ['rpc', 'service', 'module', 'entity', 'guard', 'config'].includes(type);\n}\n\nfunction rpcServiceFiles(serviceName: string, classBase: string): { relativePath: string; content: string }[] {\n    return [{\n        relativePath: path.join('src', serviceName, `${serviceName}.service.ts`),\n        content: `import { Injectable } from '@nestjs/common';\nimport { RpcMethod, RpcService } from 'wexts/nest';\n\n@Injectable()\n@RpcService({ name: '${toCamelCase(serviceName)}', requireAuth: false })\nexport class ${classBase}Service {\n  @RpcMethod()\n  async sayHello(name: string): Promise<string> {\n    return \\`Hello, \\${name}!\\`;\n  }\n}\n`,\n    }];\n}\n\nfunction writeGeneratedFiles(root: string, files: { relativePath: string; content: string }[], force: boolean): string[] {\n    const changedFiles: string[] = [];\n\n    for (const file of files) {\n        const absolutePath = path.join(root, file.relativePath);\n        if (fs.existsSync(absolutePath) && !force) {\n            throw new WextsError({\n                code: 'WEXTS_CLI_GENERATOR_FILE_EXISTS',\n                message: `Refusing to overwrite existing file: ${absolutePath}`,\n                suggestedFix: 'Review the file, then rerun with --force if overwriting is intentional.',\n                docsSlug: 'cli',\n            });\n        }\n        fs.mkdirSync(path.dirname(absolutePath), { recursive: true });\n        fs.writeFileSync(absolutePath, file.content);\n        changedFiles.push(absolutePath);\n    }\n\n    return changedFiles;\n}\n\nfunction runScript(script: string, options: CommonOptions): void {\n    const cwd = options.cwd ?? process.cwd();\n    const packageManager = detectPackageManager(cwd);\n    const args = packageManager === 'npm' ? ['run', script] : ['run', script];\n    runCommand(packageManager, args, cwd);\n}\n\nfunction runCommand(command: string, args: string[], cwd: string): void {\n    const result = spawnSync(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\n    if (result.status !== 0) {\n        throw new Error(`${command} ${args.join(' ')} failed with exit code ${result.status}`);\n    }\n}\n\nfunction detectPackageManager(cwd: string): 'pnpm' | 'npm' {\n    const packageJsonPath = path.join(cwd, 'package.json');\n    if (fs.existsSync(packageJsonPath)) {\n        const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as { packageManager?: string };\n        if (pkg.packageManager?.startsWith('pnpm@')) return 'pnpm';\n    }\n    if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n    if (fs.existsSync(path.join(cwd, 'pnpm-workspace.yaml'))) return 'pnpm';\n    return 'npm';\n}\n\nfunction findTemplatePath(): string | undefined {\n    const candidates = [\n        path.resolve(__dirname, '../../templates'),\n        path.resolve(__dirname, '../templates'),\n        path.resolve(process.cwd(), 'packages/templates'),\n    ];\n\n    return candidates.find((candidate) => fs.existsSync(candidate));\n}\n\nfunction readPackageVersion(): string {\n    const packageJsonPath = path.resolve(__dirname, '../../package.json');\n    if (!fs.existsSync(packageJsonPath)) return '0.0.0';\n    return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')).version as string;\n}\n\nfunction readAllText(cwd: string, dirs: string[]): string {\n    let text = '';\n    for (const dir of dirs) {\n        const absolute = path.join(cwd, dir);\n        if (!fs.existsSync(absolute)) continue;\n        for (const file of walk(absolute)) {\n            if (file.endsWith('.ts') || file.endsWith('.tsx') || file.endsWith('.js')) {\n                text += fs.readFileSync(file, 'utf8');\n            }\n        }\n    }\n    return text;\n}\n\nfunction walk(dir: string): string[] {\n    return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {\n        const absolute = path.join(dir, entry.name);\n        if (entry.isDirectory()) return walk(absolute);\n        return [absolute];\n    });\n}\n\nfunction toKebabCase(value: string): string {\n    return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[_\\s]+/g, '-').toLowerCase();\n}\n\nfunction toPascalCase(value: string): string {\n    return toKebabCase(value).split('-').map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join('');\n}\n\nfunction toCamelCase(value: string): string {\n    const pascal = toPascalCase(value);\n    return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nfunction pathToFileUrl(filePath: string): string {\n    return `file://${filePath}`;\n}\n\nasync function loadRuntimeConfig(configPath: string, retry = false): Promise<Record<string, unknown>> {\n    const deadline = Date.now() + (retry ? 15_000 : 0);\n    let lastError: unknown;\n\n    do {\n        try {\n            if (configPath.endsWith('.mjs')) {\n                const mod = await import(pathToFileUrl(configPath));\n                return (mod.default ?? mod) as Record<string, unknown>;\n            }\n\n            const require = createRequire(__filename);\n            delete require.cache[require.resolve(configPath)];\n            const mod = require(configPath);\n            return (mod.default ?? mod) as Record<string, unknown>;\n        } catch (error) {\n            lastError = error;\n            if (!retry || Date.now() >= deadline) break;\n            await new Promise((resolve) => setTimeout(resolve, 500));\n        }\n    } while (retry);\n\n    throw lastError;\n}\n\nconst invokedAsCli = process.argv[1]\n    && (path.basename(process.argv[1]) === 'wexts' || path.basename(process.argv[1]) === 'wexts.cjs' || path.resolve(process.argv[1]).includes(`${path.sep}dist${path.sep}cli${path.sep}index`));\n\nif (invokedAsCli && !process.env.VITEST) {\n    createCliProgram().parseAsync(process.argv).catch((error) => {\n        logger.error(formatWextsError(error));\n        process.exit(1);\n    });\n}\n"],"mappings":"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","names":["Command","fs","path","spawnSync","createRequire","createCliProgram","program","Command","name","description","version","readPackageVersion","command","option","action","projectName","options","createProject","template","skipInstall","FusionDevServer","server","start","apiPath","api","webPath","web","webPort","Number","port","apiPort","useProxy","proxy","rootDir","process","cwd","runtimeConfigPath","config","alias","type","generateRpcClient","manifest","projectPath","resolve","project","outputPath","output","logger","success","services","length","isScaffoldGenerator","targetRoot","changedFiles","scaffoldGenerator","force","file","info","relative","Error","skipGenerate","existsSync","runScript","env","PORT","startWextsRuntime","configPath","runtimeConfig","loadRuntimeConfig","dev","buildVercelOutput","result","apiProjectPath","rpcOutputPath","skipCodegen","skipBuild","nodeVersion","maxDuration","warnings","warning","warn","errors","error","exit","runDoctor","security","pkgPath","join","push","pkg","JSON","parse","readFileSync","packageManager","startsWith","dir","source","readAllText","includes","test","fs","mkdirSync","recursive","createVerifiedStarter","wextsDependency","resolveCreateWextsDependency","createLegacyProject","runCommand","detectPackageManager","files","stringify","private","scripts","generate","build","doctor","dependencies","wexts","relativePath","content","Object","entries","absolutePath","dirname","writeFileSync","templatePath","findTemplatePath","apiTemplatePath","apiDestPath","cpSync","filter","src","basename","apiPkgPath","apiPkg","webTemplatePath","webDestPath","webPkgPath","webPkg","e","rmSync","devDependencies","packageRoot","__dirname","cwdLocalPackage","realpathSync","WextsError","code","message","suggestedFix","docsSlug","writeGeneratedFiles","Boolean","rawName","toKebabCase","classBase","toPascalCase","srcRoot","filesByType","rpc","rpcServiceFiles","service","toCamelCase","module","entity","guard","serviceName","root","script","args","spawnSync","stdio","shell","platform","status","packageJsonPath","candidates","find","candidate","dirs","text","absolute","walk","endsWith","readdirSync","withFileTypes","flatMap","entry","isDirectory","value","replace","toLowerCase","split","map","part","charAt","toUpperCase","slice","pascal","pathToFileUrl","filePath","retry","deadline","Date","now","lastError","mod","default","require","createRequire","__filename","cache","Promise","setTimeout","invokedAsCli","argv","sep","VITEST","parseAsync","catch","formatWextsError"]}