zuro-cli 0.0.2-beta.13 → 0.0.2-beta.15
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 +2 -1
- package/dist/chunk-R3MGV5UR.mjs +322 -0
- package/dist/chunk-R3MGV5UR.mjs.map +1 -0
- package/dist/chunk-VMOTWTER.mjs +37 -0
- package/dist/chunk-VMOTWTER.mjs.map +1 -0
- package/dist/chunk-YBAO5SKK.mjs +87 -0
- package/dist/chunk-YBAO5SKK.mjs.map +1 -0
- package/dist/database.handler-5OUD6XJZ.mjs +32 -0
- package/dist/database.handler-5OUD6XJZ.mjs.map +1 -0
- package/dist/docs.handler-JL3ZIVJQ.mjs +12 -0
- package/dist/docs.handler-JL3ZIVJQ.mjs.map +1 -0
- package/dist/index.js +1706 -535
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1247 -514
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils/registry.ts","../src/utils/pm.ts","../src/utils/env-manager.ts","../src/utils/config.ts","../src/utils/project-guard.ts","../src/commands/add.ts","../src/utils/dependency.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { init } from \"./commands/init\";\nimport { add } from \"./commands/add\";\n\nconst program = new Command();\n\nprogram\n .name(\"zuro-cli\")\n .description(\"Zuro CLI tool\")\n .version(\"0.0.1\");\n\nprogram\n .command(\"init\")\n .description(\"Initialize a new Zuro project\")\n .action(init);\n\nprogram\n .command(\"add <module>\")\n .description(\"Add a module to your project\")\n .action((module, options) => add(module, options));\n\nprogram.parse(process.argv);\n","import ora from \"ora\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport prompts from \"prompts\";\nimport { fetchRegistry, fetchFile, RegistryFile } from \"../utils/registry\";\nimport { initPackageJson, installDependencies, ensurePackageManagerAvailable } from \"../utils/pm\";\nimport { createInitialEnv } from \"../utils/env-manager\";\nimport { readZuroConfig, writeZuroConfig } from \"../utils/config\";\nimport { showNonZuroProjectMessage } from \"../utils/project-guard\";\nimport type { ZuroConfig } from \"../utils/config\";\n\nfunction resolveSafeTargetPath(projectRoot: string, srcDir: string, file: RegistryFile) {\n const relativeTargetPath = path.join(srcDir, file.target);\n const targetPath = path.resolve(projectRoot, relativeTargetPath);\n const normalizedRoot = path.resolve(projectRoot);\n\n if (targetPath !== normalizedRoot && !targetPath.startsWith(`${normalizedRoot}${path.sep}`)) {\n throw new Error(`Refusing to write outside project directory: ${file.target}`);\n }\n\n return {\n relativeTargetPath,\n targetPath,\n };\n}\n\nasync function ensureSafeTargetDirectory(targetDir: string, cwd: string, projectName: string) {\n await fs.ensureDir(targetDir);\n const entries = await fs.readdir(targetDir);\n\n if (entries.length === 0) {\n return true;\n }\n\n const isCurrentFolder = targetDir === cwd;\n const response = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: isCurrentFolder\n ? `Current folder '${projectName}' is not empty. Continue anyway?`\n : `Target folder '${projectName}' already exists and is not empty. Continue anyway?`,\n initial: false,\n });\n\n return response.proceed === true;\n}\n\nasync function setupPrettier(targetDir: string) {\n const prettierConfigPath = path.join(targetDir, \".prettierrc\");\n const prettierIgnorePath = path.join(targetDir, \".prettierignore\");\n\n if (!await fs.pathExists(prettierConfigPath)) {\n const prettierConfig = {\n semi: true,\n singleQuote: false,\n trailingComma: \"es5\",\n printWidth: 100,\n tabWidth: 2,\n };\n await fs.writeJson(prettierConfigPath, prettierConfig, { spaces: 2 });\n }\n\n if (!await fs.pathExists(prettierIgnorePath)) {\n const ignoreContent = `node_modules\ndist\nbuild\ncoverage\n.next\npnpm-lock.yaml\npackage-lock.json\nbun.lock\nbun.lockb\n`;\n await fs.writeFile(prettierIgnorePath, ignoreContent);\n }\n}\n\nexport async function init() {\n const cwd = process.cwd();\n const isExistingProject = await fs.pathExists(path.join(cwd, \"package.json\"));\n const existingZuroConfig = await readZuroConfig(cwd);\n\n if (isExistingProject && !existingZuroConfig) {\n showNonZuroProjectMessage();\n return;\n }\n\n let targetDir = cwd;\n let pm = \"npm\";\n let srcDir = \"src\";\n let projectName = path.basename(cwd);\n let enablePrettier = false;\n\n if (isExistingProject) {\n console.log(chalk.blue(\"ℹ Existing project detected.\"));\n\n projectName = path.basename(cwd);\n\n if (await fs.pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) {\n pm = \"pnpm\";\n } else if (await fs.pathExists(path.join(cwd, \"bun.lockb\"))) {\n pm = \"bun\";\n } else if (await fs.pathExists(path.join(cwd, \"yarn.lock\"))) {\n pm = \"yarn\";\n }\n\n const response = await prompts({\n type: \"text\",\n name: \"srcDir\",\n message: \"Where is your source code located?\",\n initial: \"src\",\n });\n\n srcDir = response.srcDir || \"src\";\n } else {\n console.log(chalk.dim(` Tip: Leave blank to use current folder (${path.basename(cwd)})\\n`));\n\n const response = await prompts([\n {\n type: \"text\",\n name: \"path\",\n message: \"Project name (blank for current folder)\",\n initial: \"\",\n },\n {\n type: \"select\",\n name: \"pm\",\n message: \"Package Manager?\",\n choices: [\n { title: \"npm\", value: \"npm\" },\n { title: \"pnpm\", value: \"pnpm\" },\n { title: \"bun\", value: \"bun\" },\n ],\n initial: 0,\n },\n {\n type: \"confirm\",\n name: \"prettier\",\n message: \"Setup Prettier?\",\n initial: true,\n },\n ]);\n\n if (response.pm === undefined) {\n console.log(chalk.red(\"Operation cancelled.\"));\n return;\n }\n\n pm = response.pm;\n enablePrettier = response.prettier === true;\n srcDir = \"src\";\n\n if (!response.path || response.path.trim() === \"\") {\n projectName = path.basename(cwd);\n targetDir = cwd;\n console.log(chalk.blue(`ℹ Using current folder: ${projectName}`));\n } else {\n projectName = response.path.trim();\n targetDir = path.resolve(cwd, projectName);\n }\n\n const isSafeTarget = await ensureSafeTargetDirectory(targetDir, cwd, projectName);\n if (!isSafeTarget) {\n console.log(chalk.red(\"Operation cancelled.\"));\n return;\n }\n }\n\n const existingConfig = targetDir === cwd ? existingZuroConfig : await readZuroConfig(targetDir);\n\n const zuroConfig: ZuroConfig = {\n name: projectName,\n pm,\n srcDir: srcDir || existingConfig?.srcDir || \"src\",\n };\n\n const spinner = ora(\"Connecting to Zuro Registry...\").start();\n let currentStep = \"package manager preflight\";\n\n try {\n spinner.text = `Checking ${pm} availability...`;\n await ensurePackageManagerAvailable(pm);\n\n currentStep = \"registry fetch\";\n spinner.text = \"Connecting to Zuro Registry...\";\n const registryContext = await fetchRegistry();\n\n const coreModule = registryContext.manifest.modules.core;\n\n if (!coreModule) {\n spinner.fail(\"Core module not found in registry.\");\n return;\n }\n\n currentStep = \"project initialization\";\n spinner.text = \"Initializing project...\";\n\n const hasPackageJson = await fs.pathExists(path.join(targetDir, \"package.json\"));\n if (!hasPackageJson) {\n await initPackageJson(targetDir, true, projectName, srcDir, { enablePrettier });\n }\n\n currentStep = \"dependency installation\";\n spinner.text = `Installing dependencies using ${pm}...`;\n\n let runtimeDeps: string[] = [];\n let devDeps: string[] = [];\n\n if (isExistingProject) {\n const safeDeps = [\"zod\", \"dotenv\"];\n const coreDeps = coreModule.dependencies || [];\n runtimeDeps = coreDeps.filter((dependency) => safeDeps.includes(dependency));\n devDeps = coreModule.devDependencies || [];\n } else {\n runtimeDeps = coreModule.dependencies || [];\n devDeps = coreModule.devDependencies || [];\n }\n\n await installDependencies(pm, runtimeDeps, targetDir);\n await installDependencies(pm, devDeps, targetDir, { dev: true });\n\n if (enablePrettier) {\n await installDependencies(pm, [\"prettier\"], targetDir, { dev: true });\n }\n\n currentStep = \"module file generation\";\n spinner.text = \"Fetching core module files...\";\n\n for (const file of coreModule.files) {\n const { relativeTargetPath, targetPath } = resolveSafeTargetPath(targetDir, srcDir, file);\n const fileName = path.basename(targetPath);\n\n if (isExistingProject) {\n if (fileName === \"app.ts\" || fileName === \"server.ts\") {\n continue;\n }\n\n const relativeParts = relativeTargetPath.split(path.sep);\n const isSafe = fileName === \"env.ts\" || relativeParts.includes(\"lib\");\n if (!isSafe) {\n continue;\n }\n }\n\n const content = await fetchFile(file.path, {\n baseUrl: registryContext.fileBaseUrl,\n expectedSha256: file.sha256,\n expectedSize: file.size,\n });\n\n await fs.ensureDir(path.dirname(targetPath));\n await fs.writeFile(targetPath, content);\n }\n\n currentStep = \"environment file setup\";\n await createInitialEnv(targetDir);\n\n if (enablePrettier) {\n currentStep = \"prettier setup\";\n await setupPrettier(targetDir);\n }\n\n currentStep = \"config write\";\n await writeZuroConfig(targetDir, zuroConfig);\n\n spinner.succeed(chalk.green(\"Project initialized successfully!\"));\n\n console.log(`\\n${chalk.bold(\"Next steps:\")}`);\n if (targetDir !== cwd) {\n console.log(chalk.cyan(` cd ${projectName}`));\n }\n console.log(chalk.cyan(` ${pm} run dev`));\n console.log(`\\n${chalk.dim(\"Add modules: zuro-cli add database, zuro-cli add auth\")}`);\n } catch (error) {\n spinner.fail(chalk.red(`Failed during ${currentStep}.`));\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(chalk.red(errorMessage));\n console.log(`\\n${chalk.bold(\"Retry:\")}`);\n if (targetDir !== cwd) {\n console.log(chalk.cyan(` cd ${projectName}`));\n }\n console.log(chalk.cyan(\" npx zuro-cli init\"));\n }\n}\n","import { createHash } from \"node:crypto\";\n\nconst DEFAULT_REGISTRY_BASE_URL = \"https://registry.devbybriyan.com\";\nconst DEFAULT_REGISTRY_ENTRY_URL = `${DEFAULT_REGISTRY_BASE_URL}/channels/stable.json`;\nconst REGISTRY_ENV_VAR = \"ZURO_REGISTRY_URL\";\nconst REQUEST_TIMEOUT_MS = 8000;\nconst MAX_RETRIES = 2;\n\nexport interface RegistryFile {\n path: string;\n target: string;\n type: string;\n sha256?: string;\n size?: number;\n}\n\nexport interface RegistryModule {\n type: string;\n files: RegistryFile[];\n moduleDependencies?: string[];\n dependencies?: string[];\n devDependencies?: string[];\n}\n\nexport interface RegistryManifest {\n schemaVersion?: number;\n status?: string;\n templateVersion?: string;\n generatedAt?: string;\n modules: Record<string, RegistryModule>;\n}\n\ninterface RegistryChannelPointer {\n schemaVersion?: number;\n channel?: string;\n templateVersion?: string;\n generatedAt?: string;\n indexPath?: string;\n indexUrl?: string;\n}\n\nexport interface RegistryContext {\n manifest: RegistryManifest;\n manifestUrl: string;\n fileBaseUrl: string;\n}\n\ninterface FetchFileOptions {\n baseUrl: string;\n expectedSha256?: string;\n expectedSize?: number;\n}\n\nexport function getRegistryUrl() {\n return resolveRegistryEntryUrl();\n}\n\nfunction withTrailingSlash(url: string) {\n return url.endsWith(\"/\") ? url : `${url}/`;\n}\n\nfunction resolveRegistryEntryUrl() {\n const override = process.env[REGISTRY_ENV_VAR]?.trim();\n\n if (!override) {\n return DEFAULT_REGISTRY_ENTRY_URL;\n }\n\n let parsed: URL;\n\n try {\n parsed = new URL(override);\n } catch {\n throw new Error(\n `Invalid ${REGISTRY_ENV_VAR} value '${override}'. Expected a valid http(s) URL.`\n );\n }\n\n if (parsed.pathname.endsWith(\".json\")) {\n return parsed.toString();\n }\n\n return new URL(\"channels/stable.json\", withTrailingSlash(parsed.toString())).toString();\n}\n\nfunction isRegistryManifest(data: unknown): data is RegistryManifest {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n const candidate = data as Partial<RegistryManifest>;\n return !!candidate.modules && typeof candidate.modules === \"object\";\n}\n\nfunction isChannelPointer(data: unknown): data is RegistryChannelPointer {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n const candidate = data as Partial<RegistryChannelPointer>;\n return typeof candidate.indexPath === \"string\" || typeof candidate.indexUrl === \"string\";\n}\n\nfunction delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function fetchWithRetry(url: string): Promise<Response> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n headers: { Accept: \"application/json, text/plain, */*\" },\n signal: controller.signal,\n });\n\n if (response.ok) {\n return response;\n }\n\n const shouldRetry = response.status >= 500 && attempt < MAX_RETRIES;\n if (shouldRetry) {\n await delay(250 * (attempt + 1));\n continue;\n }\n\n throw new Error(`Request failed (${response.status} ${response.statusText}) for ${url}`);\n } catch (error) {\n lastError = error;\n\n if (attempt === MAX_RETRIES) {\n break;\n }\n\n await delay(250 * (attempt + 1));\n } finally {\n clearTimeout(timeout);\n }\n }\n\n if (lastError instanceof Error) {\n throw lastError;\n }\n\n throw new Error(`Failed to fetch ${url}`);\n}\n\nasync function fetchJson<T>(url: string): Promise<{ data: T; resolvedUrl: string }> {\n const response = await fetchWithRetry(url);\n const data = (await response.json()) as T;\n\n return {\n data,\n resolvedUrl: response.url || url,\n };\n}\n\nfunction resolveManifestUrl(pointer: RegistryChannelPointer, pointerUrl: string): string {\n const explicit = pointer.indexUrl || pointer.indexPath;\n\n if (!explicit) {\n throw new Error(\"Registry channel pointer is missing indexUrl/indexPath\");\n }\n\n return new URL(explicit, pointerUrl).toString();\n}\n\nexport async function fetchRegistry(): Promise<RegistryContext> {\n const registryEntryUrl = resolveRegistryEntryUrl();\n let entry: { data: unknown; resolvedUrl: string };\n\n try {\n entry = await fetchJson<unknown>(registryEntryUrl);\n } catch (error) {\n throw new Error(\n `Unable to fetch registry from ${registryEntryUrl}. For local testing set ${REGISTRY_ENV_VAR}=http://127.0.0.1:8787.`,\n { cause: error as Error }\n );\n }\n\n if (isRegistryManifest(entry.data)) {\n return {\n manifest: entry.data,\n manifestUrl: entry.resolvedUrl,\n fileBaseUrl: withTrailingSlash(new URL(\".\", entry.resolvedUrl).toString()),\n };\n }\n\n if (!isChannelPointer(entry.data)) {\n throw new Error(\n `Invalid registry payload at ${registryEntryUrl}. Expected manifest or channel pointer.`\n );\n }\n\n const manifestUrl = resolveManifestUrl(entry.data, entry.resolvedUrl);\n const manifestResult = await fetchJson<unknown>(manifestUrl);\n\n if (!isRegistryManifest(manifestResult.data)) {\n throw new Error(`Invalid manifest payload at ${manifestUrl}.`);\n }\n\n return {\n manifest: manifestResult.data,\n manifestUrl: manifestResult.resolvedUrl,\n fileBaseUrl: withTrailingSlash(new URL(\".\", manifestResult.resolvedUrl).toString()),\n };\n}\n\nexport async function fetchFile(filePath: string, options: FetchFileOptions) {\n const normalizedPath = filePath.replace(/^\\//, \"\");\n const fileUrl = new URL(normalizedPath, withTrailingSlash(options.baseUrl)).toString();\n const response = await fetchWithRetry(fileUrl);\n const content = await response.text();\n\n if (typeof options.expectedSize === \"number\") {\n const actualSize = Buffer.byteLength(content, \"utf8\");\n if (actualSize !== options.expectedSize) {\n throw new Error(\n `Size mismatch for ${filePath}. Expected ${options.expectedSize}, got ${actualSize}.`\n );\n }\n }\n\n if (options.expectedSha256) {\n const actualSha256 = createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\n if (actualSha256 !== options.expectedSha256) {\n throw new Error(\n `Checksum mismatch for ${filePath}. Expected ${options.expectedSha256}, got ${actualSha256}.`\n );\n }\n }\n\n return content;\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { execa } from \"execa\";\n\nfunction normalizePackageName(name: string) {\n const normalized = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[._-]+|[._-]+$/g, \"\");\n\n return normalized || \"zuro-app\";\n}\n\nexport async function ensurePackageManagerAvailable(pm: string) {\n try {\n await execa(pm, [\"--version\"], { stdio: \"ignore\" });\n } catch {\n throw new Error(\n `Package manager '${pm}' is not installed or not available in PATH. Install it or choose npm.`\n );\n }\n}\n\nexport async function initPackageJson(\n cwd: string,\n force: boolean = false,\n packageName = \"zuro-app\",\n srcDir = \"src\",\n options: { enablePrettier?: boolean } = {}\n) {\n const pkgPath = path.join(cwd, \"package.json\");\n if (force || !await fs.pathExists(pkgPath)) {\n const scripts: Record<string, string> = {\n \"dev\": `tsx watch ${srcDir}/server.ts`,\n \"build\": \"tsc\",\n \"start\": \"node dist/server.js\"\n };\n\n if (options.enablePrettier) {\n scripts[\"format\"] = \"prettier --write .\";\n scripts[\"format:check\"] = \"prettier --check .\";\n }\n\n await fs.writeJson(pkgPath, {\n name: normalizePackageName(packageName),\n version: \"0.0.1\",\n private: true,\n scripts\n }, { spaces: 2 });\n }\n}\n\ninterface InstallOptions {\n dev?: boolean;\n}\n\nexport async function installDependencies(\n pm: string,\n deps: string[],\n cwd: string,\n options: InstallOptions = {}\n) {\n const uniqueDeps = [...new Set(deps)].filter(Boolean);\n\n if (uniqueDeps.length === 0) {\n return;\n }\n\n const isDev = options.dev ?? false;\n\n if (pm === \"npm\") {\n const args = [\"install\", ...(isDev ? [\"--save-dev\"] : []), ...uniqueDeps];\n await execa(\"npm\", args, { cwd });\n return;\n }\n\n if (pm === \"pnpm\") {\n const args = [\"add\", ...(isDev ? [\"-D\"] : []), ...uniqueDeps];\n await execa(\"pnpm\", args, { cwd });\n return;\n }\n\n if (pm === \"yarn\") {\n const args = [\"add\", ...(isDev ? [\"-D\"] : []), ...uniqueDeps];\n await execa(\"yarn\", args, { cwd });\n return;\n }\n\n if (pm === \"bun\") {\n const args = [\"add\", ...(isDev ? [\"-d\"] : []), ...uniqueDeps];\n await execa(\"bun\", args, { cwd });\n return;\n }\n\n throw new Error(`Unsupported package manager: ${pm}`);\n}\n","import fs from \"fs-extra\";\r\nimport path from \"path\";\r\nimport os from \"os\";\r\n\r\n/**\r\n * Creates or updates .env file with new variables\r\n */\r\nexport const updateEnvFile = async (\r\n cwd: string,\r\n variables: Record<string, string>,\r\n createIfMissing = true,\r\n options: { overwriteExisting?: boolean } = {}\r\n) => {\r\n const envPath = path.join(cwd, \".env\");\r\n const overwriteExisting = options.overwriteExisting ?? false;\r\n\r\n let content = \"\";\r\n if (fs.existsSync(envPath)) {\r\n content = await fs.readFile(envPath, \"utf-8\");\r\n } else if (!createIfMissing) {\r\n return;\r\n }\r\n\r\n let modified = false;\r\n\r\n for (const [key, value] of Object.entries(variables)) {\r\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n const regex = new RegExp(`^${escapedKey}=.*$`, \"m\");\r\n\r\n if (regex.test(content)) {\r\n if (!overwriteExisting) {\r\n continue;\r\n }\r\n\r\n const nextLine = `${key}=${value}`;\r\n const updated = content.replace(regex, nextLine);\r\n if (updated !== content) {\r\n content = updated;\r\n modified = true;\r\n }\r\n continue;\r\n }\r\n\r\n // Add newline if content doesn't end with one\r\n if (content && !content.endsWith(\"\\n\")) {\r\n content += os.EOL;\r\n }\r\n content += `${key}=${value}${os.EOL}`;\r\n modified = true;\r\n }\r\n\r\n if (modified || !fs.existsSync(envPath)) {\r\n await fs.writeFile(envPath, content);\r\n }\r\n};\r\n\r\n/**\r\n * Updates env.ts to add new schema fields\r\n */\r\nexport const updateEnvSchema = async (\r\n cwd: string,\r\n srcDir: string,\r\n fields: Array<{ name: string; schema: string }>\r\n) => {\r\n const envPath = path.join(cwd, srcDir, \"env.ts\");\r\n\r\n if (!fs.existsSync(envPath)) {\r\n return false;\r\n }\r\n\r\n let content = await fs.readFile(envPath, \"utf-8\");\r\n let modified = false;\r\n\r\n for (const field of fields) {\r\n // Check if field already exists in schema\r\n if (content.includes(`${field.name}:`)) {\r\n continue;\r\n }\r\n\r\n // Find the closing of envSchema z.object({ ... })\r\n // Insert before the closing });\r\n const schemaEndRegex = /(\\n\\s*)(}\\);?\\s*\\n\\s*export const env)/;\r\n const match = content.match(schemaEndRegex);\r\n\r\n if (match) {\r\n const indent = \" \"; // 4 spaces\r\n const newField = `${indent}${field.name}: ${field.schema},\\n`;\r\n content = content.replace(\r\n schemaEndRegex,\r\n `\\n${newField}$1$2`\r\n );\r\n modified = true;\r\n }\r\n }\r\n\r\n if (modified) {\r\n await fs.writeFile(envPath, content);\r\n }\r\n\r\n return modified;\r\n};\r\n\r\n/**\r\n * Creates initial .env file for new projects\r\n */\r\nexport const createInitialEnv = async (cwd: string) => {\r\n const envPath = path.join(cwd, \".env\");\r\n\r\n if (fs.existsSync(envPath)) {\r\n return; // Don't overwrite existing\r\n }\r\n\r\n const content = `# Environment Variables\r\nPORT=3000\r\nNODE_ENV=development\r\n`;\r\n\r\n await fs.writeFile(envPath, content);\r\n};\r\n\r\n/**\r\n * Module-specific env configurations\r\n */\r\nexport const ENV_CONFIGS = {\r\n \"database-pg\": {\r\n envVars: {\r\n DATABASE_URL: \"postgresql://postgres@localhost:5432/mydb\",\r\n },\r\n schemaFields: [\r\n { name: \"DATABASE_URL\", schema: \"z.string().url()\" },\r\n ],\r\n },\r\n \"database-mysql\": {\r\n envVars: {\r\n DATABASE_URL: \"mysql://root@localhost:3306/mydb\",\r\n },\r\n schemaFields: [\r\n { name: \"DATABASE_URL\", schema: \"z.string().url()\" },\r\n ],\r\n },\r\n auth: {\r\n envVars: {\r\n BETTER_AUTH_SECRET: \"your-secret-key-at-least-32-characters-long\",\r\n BETTER_AUTH_URL: \"http://localhost:3000\",\r\n },\r\n schemaFields: [\r\n { name: \"BETTER_AUTH_SECRET\", schema: \"z.string().min(32)\" },\r\n { name: \"BETTER_AUTH_URL\", schema: \"z.string().url()\" },\r\n ],\r\n },\r\n mailer: {\r\n envVars: {\r\n SMTP_HOST: \"smtp.example.com\",\r\n SMTP_PORT: \"587\",\r\n SMTP_USER: \"your-email@example.com\",\r\n SMTP_PASS: \"your-password\",\r\n MAIL_FROM: \"noreply@example.com\",\r\n },\r\n schemaFields: [\r\n { name: \"SMTP_HOST\", schema: \"z.string().min(1)\" },\r\n { name: \"SMTP_PORT\", schema: \"z.coerce.number().default(587)\" },\r\n { name: \"SMTP_USER\", schema: \"z.string().min(1)\" },\r\n { name: \"SMTP_PASS\", schema: \"z.string().min(1)\" },\r\n { name: \"MAIL_FROM\", schema: \"z.string().email()\" },\r\n ],\r\n },\r\n \"mailer-resend\": {\r\n envVars: {\r\n RESEND_API_KEY: \"re_your_api_key\",\r\n MAIL_FROM: \"onboarding@resend.dev\",\r\n },\r\n schemaFields: [\r\n { name: \"RESEND_API_KEY\", schema: \"z.string().min(1)\" },\r\n { name: \"MAIL_FROM\", schema: \"z.string().min(1)\" },\r\n ],\r\n },\r\n};\r\n","import fs from \"fs-extra\";\nimport path from \"path\";\n\nexport interface ZuroConfig {\n name?: string;\n pm?: string;\n srcDir?: string;\n}\n\nfunction sanitizeConfig(input: unknown): ZuroConfig {\n if (!input || typeof input !== \"object\") {\n return {};\n }\n\n const raw = input as Record<string, unknown>;\n const config: ZuroConfig = {};\n\n if (typeof raw.name === \"string\") {\n config.name = raw.name;\n }\n\n if (typeof raw.pm === \"string\") {\n config.pm = raw.pm;\n }\n\n if (typeof raw.srcDir === \"string\") {\n config.srcDir = raw.srcDir;\n }\n\n return config;\n}\n\nexport function getConfigPath(cwd: string) {\n return path.join(cwd, \"zuro.json\");\n}\n\nexport async function readZuroConfig(cwd: string): Promise<ZuroConfig | null> {\n const configPath = getConfigPath(cwd);\n\n if (!(await fs.pathExists(configPath))) {\n return null;\n }\n\n const raw = await fs.readJson(configPath);\n return sanitizeConfig(raw);\n}\n\nexport async function writeZuroConfig(cwd: string, config: ZuroConfig) {\n const configPath = getConfigPath(cwd);\n await fs.writeJson(configPath, sanitizeConfig(config), { spaces: 2 });\n}\n","import chalk from \"chalk\";\n\nexport function showNonZuroProjectMessage() {\n console.log(chalk.yellow(\"This directory looks like an existing project that wasn't created with Zuro CLI.\"));\n console.log(\"\");\n console.log(chalk.yellow(\"We stopped here because we don't want to make unnecessary changes to your project.\"));\n console.log(\"\");\n console.log(\"Zuro CLI works in:\");\n console.log(\"- a fresh/empty directory, or\");\n console.log(\"- an existing project already managed by Zuro CLI.\");\n}\n\nexport function showInitFirstMessage() {\n console.log(chalk.yellow(\"No Zuro project found in this directory.\"));\n console.log(\"\");\n console.log(chalk.yellow(\"Run init first, then add modules.\"));\n console.log(\"\");\n console.log(chalk.cyan(\"npx zuro-cli init\"));\n}\n","import prompts from \"prompts\";\nimport ora from \"ora\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { randomBytes } from \"node:crypto\";\nimport { fetchRegistry, fetchFile, RegistryFile } from \"../utils/registry\";\nimport { installDependencies, ensurePackageManagerAvailable } from \"../utils/pm\";\nimport { resolveDependencies } from \"../utils/dependency\";\nimport { updateEnvFile, updateEnvSchema, ENV_CONFIGS } from \"../utils/env-manager\";\nimport chalk from \"chalk\";\nimport { readZuroConfig } from \"../utils/config\";\nimport { showNonZuroProjectMessage, showInitFirstMessage } from \"../utils/project-guard\";\n\ntype DatabaseModuleName = \"database-pg\" | \"database-mysql\";\n\nexport interface AddCommandOptions {\n dialect?: string;\n dbUrl?: string;\n yes?: boolean;\n}\n\nconst DEFAULT_DATABASE_URLS: Record<DatabaseModuleName, string> = {\n \"database-pg\": \"postgresql://postgres@localhost:5432/mydb\",\n \"database-mysql\": \"mysql://root@localhost:3306/mydb\",\n};\n\nfunction resolveSafeTargetPath(projectRoot: string, srcDir: string, file: RegistryFile) {\n const targetPath = path.resolve(projectRoot, srcDir, file.target);\n const normalizedRoot = path.resolve(projectRoot);\n\n if (targetPath !== normalizedRoot && !targetPath.startsWith(`${normalizedRoot}${path.sep}`)) {\n throw new Error(`Refusing to write outside project directory: ${file.target}`);\n }\n\n return targetPath;\n}\n\nfunction resolvePackageManager(projectRoot: string) {\n if (fs.existsSync(path.join(projectRoot, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n\n if (fs.existsSync(path.join(projectRoot, \"bun.lockb\")) || fs.existsSync(path.join(projectRoot, \"bun.lock\"))) {\n return \"bun\";\n }\n\n if (fs.existsSync(path.join(projectRoot, \"yarn.lock\"))) {\n return \"yarn\";\n }\n\n return \"npm\";\n}\n\nfunction parseDatabaseDialect(value?: string): DatabaseModuleName | null {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return null;\n }\n\n if (normalized === \"pg\" || normalized === \"postgres\" || normalized === \"postgresql\" || normalized === \"database-pg\") {\n return \"database-pg\";\n }\n\n if (normalized === \"mysql\" || normalized === \"database-mysql\") {\n return \"database-mysql\";\n }\n\n return null;\n}\n\nfunction isDatabaseModule(moduleName: string): moduleName is DatabaseModuleName {\n return moduleName === \"database-pg\" || moduleName === \"database-mysql\";\n}\n\nfunction validateDatabaseUrl(rawUrl: string, moduleName: DatabaseModuleName) {\n const dbUrl = rawUrl.trim();\n if (!dbUrl) {\n throw new Error(\"Database URL cannot be empty.\");\n }\n\n let parsed: URL;\n try {\n parsed = new URL(dbUrl);\n } catch {\n throw new Error(`Invalid database URL: '${dbUrl}'.`);\n }\n\n const protocol = parsed.protocol.toLowerCase();\n if (moduleName === \"database-pg\" && protocol !== \"postgresql:\" && protocol !== \"postgres:\") {\n throw new Error(\"PostgreSQL URL must start with postgres:// or postgresql://\");\n }\n\n if (moduleName === \"database-mysql\" && protocol !== \"mysql:\") {\n throw new Error(\"MySQL URL must start with mysql://\");\n }\n\n return dbUrl;\n}\n\nasync function detectInstalledDatabaseDialect(projectRoot: string, srcDir: string): Promise<DatabaseModuleName | null> {\n const dbIndexPath = path.join(projectRoot, srcDir, \"db\", \"index.ts\");\n if (!fs.existsSync(dbIndexPath)) {\n return null;\n }\n\n const content = await fs.readFile(dbIndexPath, \"utf-8\");\n if (content.includes(\"drizzle-orm/node-postgres\") || content.includes(`from \"pg\"`)) {\n return \"database-pg\";\n }\n\n if (content.includes(\"drizzle-orm/mysql2\") || content.includes(`from \"mysql2`)) {\n return \"database-mysql\";\n }\n\n return null;\n}\n\nasync function backupDatabaseFiles(projectRoot: string, srcDir: string): Promise<string | null> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupRoot = path.join(projectRoot, \".zuro\", \"backups\", `database-${timestamp}`);\n const candidates = [\n path.join(projectRoot, srcDir, \"db\", \"index.ts\"),\n path.join(projectRoot, \"drizzle.config.ts\"),\n ];\n\n let copied = false;\n for (const filePath of candidates) {\n if (!fs.existsSync(filePath)) {\n continue;\n }\n\n const relativePath = path.relative(projectRoot, filePath);\n const backupPath = path.join(backupRoot, relativePath);\n await fs.ensureDir(path.dirname(backupPath));\n await fs.copyFile(filePath, backupPath);\n copied = true;\n }\n\n return copied ? backupRoot : null;\n}\n\nfunction databaseLabel(moduleName: DatabaseModuleName) {\n return moduleName === \"database-pg\" ? \"PostgreSQL\" : \"MySQL\";\n}\n\nfunction getDatabaseSetupHint(moduleName: DatabaseModuleName, dbUrl: string) {\n try {\n const parsed = new URL(dbUrl);\n const dbName = parsed.pathname.replace(/^\\/+/, \"\") || \"mydb\";\n\n if (moduleName === \"database-pg\") {\n return `createdb ${dbName}`;\n }\n\n return `mysql -e \"CREATE DATABASE IF NOT EXISTS ${dbName};\"`;\n } catch {\n return moduleName === \"database-pg\"\n ? \"createdb <database_name>\"\n : `mysql -e \"CREATE DATABASE IF NOT EXISTS <database_name>;\"`;\n }\n}\n\nfunction getModuleDocsPath(moduleName: string) {\n if (isDatabaseModule(moduleName)) {\n return \"database\";\n }\n\n return moduleName;\n}\n\nfunction escapeRegex(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction appendImport(source: string, line: string) {\n if (source.includes(line)) {\n return { source, inserted: true };\n }\n\n const importRegex = /^import .+ from .+;?\\s*$/gm;\n let lastImportIndex = 0;\n let match;\n\n while ((match = importRegex.exec(source)) !== null) {\n lastImportIndex = match.index + match[0].length;\n }\n\n if (lastImportIndex <= 0) {\n return { source, inserted: false };\n }\n\n return {\n source: source.slice(0, lastImportIndex) + `\\n${line}` + source.slice(lastImportIndex),\n inserted: true,\n };\n}\n\nasync function hasEnvVariable(projectRoot: string, key: string): Promise<boolean> {\n const envPath = path.join(projectRoot, \".env\");\n if (!await fs.pathExists(envPath)) {\n return false;\n }\n\n const content = await fs.readFile(envPath, \"utf-8\");\n const pattern = new RegExp(`^${escapeRegex(key)}=`, \"m\");\n return pattern.test(content);\n}\n\nasync function isLikelyEmptyDirectory(cwd: string): Promise<boolean> {\n const entries = await fs.readdir(cwd);\n const ignored = new Set([\".ds_store\", \"thumbs.db\"]);\n\n return entries.filter((entry) => !ignored.has(entry.toLowerCase())).length === 0;\n}\n\nasync function ensureSchemaExport(projectRoot: string, srcDir: string, schemaFileName: string) {\n const schemaIndexPath = path.join(projectRoot, srcDir, \"db\", \"schema\", \"index.ts\");\n if (!await fs.pathExists(schemaIndexPath)) {\n return;\n }\n\n const exportLine = `export * from \"./${schemaFileName}\";`;\n const content = await fs.readFile(schemaIndexPath, \"utf-8\");\n const normalized = content.replace(/\\r\\n/g, \"\\n\");\n const exportPattern = new RegExp(\n `^\\\\s*export\\\\s*\\\\*\\\\s*from\\\\s*[\"']\\\\./${escapeRegex(schemaFileName)}[\"'];?\\\\s*$`,\n \"m\"\n );\n\n if (exportPattern.test(normalized)) {\n return;\n }\n\n let next = normalized\n .replace(/^\\s*export\\s*\\{\\s*\\};?\\s*$/m, \"\")\n .trimEnd();\n\n if (next.length > 0) {\n next += \"\\n\\n\";\n }\n\n next += `${exportLine}\\n`;\n await fs.writeFile(schemaIndexPath, next);\n}\n\nasync function isDocsModuleInstalled(projectRoot: string, srcDir: string): Promise<boolean> {\n return await fs.pathExists(path.join(projectRoot, srcDir, \"lib\", \"openapi.ts\"));\n}\n\nasync function isAuthModuleInstalled(projectRoot: string, srcDir: string): Promise<boolean> {\n return await fs.pathExists(path.join(projectRoot, srcDir, \"lib\", \"auth.ts\"));\n}\n\n/**\n * Modifies app.ts to include error handler middleware\n */\nasync function injectErrorHandler(projectRoot: string, srcDir: string): Promise<boolean> {\n const appPath = path.join(projectRoot, srcDir, \"app.ts\");\n\n if (!fs.existsSync(appPath)) {\n return false;\n }\n\n let content = await fs.readFile(appPath, \"utf-8\");\n\n const errorImport = `import { errorHandler, notFoundHandler } from \"./middleware/error-handler\";`;\n const hasErrorImport = content.includes(errorImport);\n const hasNotFoundUse = /app\\.use\\(\\s*notFoundHandler\\s*\\)/.test(content);\n const hasErrorUse = /app\\.use\\(\\s*errorHandler\\s*\\)/.test(content);\n let modified = false;\n let importInserted = hasErrorImport;\n\n if (!hasErrorImport) {\n const importRegex = /^import .+ from .+;?\\s*$/gm;\n let lastImportIndex = 0;\n let match;\n\n while ((match = importRegex.exec(content)) !== null) {\n lastImportIndex = match.index + match[0].length;\n }\n\n if (lastImportIndex > 0) {\n content = content.slice(0, lastImportIndex) + `\\n${errorImport}` + content.slice(lastImportIndex);\n modified = true;\n importInserted = true;\n }\n }\n\n let setupInserted = hasNotFoundUse && hasErrorUse;\n if (!setupInserted) {\n const setupLines: string[] = [];\n if (!hasNotFoundUse) {\n setupLines.push(\"app.use(notFoundHandler);\");\n }\n\n if (!hasErrorUse) {\n setupLines.push(\"app.use(errorHandler);\");\n }\n\n const errorSetup = `\\n// Error handling (must be last)\\n${setupLines.join(\"\\n\")}\\n`;\n const exportMatch = content.match(/export default app;?\\s*$/m);\n if (exportMatch && exportMatch.index !== undefined) {\n content = content.slice(0, exportMatch.index) + errorSetup + \"\\n\" + content.slice(exportMatch.index);\n modified = true;\n setupInserted = true;\n }\n }\n\n if (modified) {\n await fs.writeFile(appPath, content);\n }\n\n return importInserted && setupInserted;\n}\n\n/**\n * Modifies app.ts to include auth routes\n */\nasync function injectAuthRoutes(projectRoot: string, srcDir: string): Promise<boolean> {\n const appPath = path.join(projectRoot, srcDir, \"app.ts\");\n if (!await fs.pathExists(appPath)) {\n return false;\n }\n\n let appContent = await fs.readFile(appPath, \"utf-8\");\n const authHandlerImport = `import { toNodeHandler } from \"better-auth/node\";`;\n const authImport = `import { auth } from \"./lib/auth\";`;\n const routeIndexUserImport = `import userRoutes from \"./user.routes\";`;\n const appUserImport = `import userRoutes from \"./routes/user.routes\";`;\n\n let appModified = false;\n\n for (const importLine of [authHandlerImport, authImport]) {\n const next = appendImport(appContent, importLine);\n if (!next.inserted) {\n return false;\n }\n\n if (next.source !== appContent) {\n appContent = next.source;\n appModified = true;\n }\n }\n\n const hasAuthMount = /toNodeHandler\\(\\s*auth\\s*\\)/.test(appContent)\n && /\\/api\\/auth/.test(appContent);\n if (!hasAuthMount) {\n const authMountLine = \"app.all(/^\\\\/api\\\\/auth(?:\\\\/.*)?$/, toNodeHandler(auth));\\n\";\n const jsonIndex = appContent.search(/^\\s*app\\.use\\(\\s*express\\.json\\(\\)\\s*\\);\\s*$/m);\n\n let insertionIndex = jsonIndex;\n if (insertionIndex < 0) {\n const healthIndex = appContent.search(/^\\s*app\\.get\\(\\s*[\"']\\/health[\"']\\s*,/m);\n insertionIndex = healthIndex;\n }\n\n if (insertionIndex < 0) {\n const exportMatch = appContent.match(/export default app;?\\s*$/m);\n insertionIndex = exportMatch?.index ?? -1;\n }\n\n if (insertionIndex < 0) {\n return false;\n }\n\n appContent = appContent.slice(0, insertionIndex) + authMountLine + appContent.slice(insertionIndex);\n appModified = true;\n }\n\n const routeIndexPath = path.join(projectRoot, srcDir, \"routes\", \"index.ts\");\n if (await fs.pathExists(routeIndexPath)) {\n let routeContent = await fs.readFile(routeIndexPath, \"utf-8\");\n let routeModified = false;\n\n const userImportResult = appendImport(routeContent, routeIndexUserImport);\n if (!userImportResult.inserted) {\n return false;\n }\n\n if (userImportResult.source !== routeContent) {\n routeContent = userImportResult.source;\n routeModified = true;\n }\n\n const hasUserRoute = /rootRouter\\.use\\(\\s*[\"']\\/users[\"']\\s*,\\s*userRoutes\\s*\\)/.test(routeContent);\n if (!hasUserRoute) {\n const routeSetup = `\\n// User routes\\nrootRouter.use(\"/users\", userRoutes);\\n`;\n const exportMatch = routeContent.match(/export default rootRouter;?\\s*$/m);\n\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n routeContent = routeContent.slice(0, exportMatch.index) + routeSetup + \"\\n\" + routeContent.slice(exportMatch.index);\n routeModified = true;\n }\n\n if (routeModified) {\n await fs.writeFile(routeIndexPath, routeContent);\n }\n } else {\n const hasUserRoute = /app\\.use\\(\\s*[\"']\\/api\\/users[\"']\\s*,\\s*userRoutes\\s*\\)/.test(appContent);\n if (!hasUserRoute) {\n const exportMatch = appContent.match(/export default app;?\\s*$/m);\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n const routeSetup = `\\n// User routes\\napp.use(\"/api/users\", userRoutes);\\n`;\n appContent = appContent.slice(0, exportMatch.index) + routeSetup + \"\\n\" + appContent.slice(exportMatch.index);\n appModified = true;\n }\n\n const userImportResult = appendImport(appContent, appUserImport);\n if (!userImportResult.inserted) {\n return false;\n }\n\n if (userImportResult.source !== appContent) {\n appContent = userImportResult.source;\n appModified = true;\n }\n }\n\n if (appModified) {\n await fs.writeFile(appPath, appContent);\n }\n\n return true;\n}\n\nasync function injectDocsRoutes(projectRoot: string, srcDir: string): Promise<boolean> {\n const routeIndexPath = path.join(projectRoot, srcDir, \"routes\", \"index.ts\");\n const routeImport = `import docsRoutes from \"./docs.routes\";`;\n const routeMountPattern = /rootRouter\\.use\\(\\s*[\"']\\/docs[\"']\\s*,\\s*docsRoutes\\s*\\)/;\n\n if (await fs.pathExists(routeIndexPath)) {\n let routeContent = await fs.readFile(routeIndexPath, \"utf-8\");\n let routeModified = false;\n\n const importResult = appendImport(routeContent, routeImport);\n if (!importResult.inserted) {\n return false;\n }\n\n if (importResult.source !== routeContent) {\n routeContent = importResult.source;\n routeModified = true;\n }\n\n if (!routeMountPattern.test(routeContent)) {\n const routeSetup = `\\n// API docs\\nrootRouter.use(\"/docs\", docsRoutes);\\n`;\n const exportMatch = routeContent.match(/export default rootRouter;?\\s*$/m);\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n routeContent = routeContent.slice(0, exportMatch.index) + routeSetup + \"\\n\" + routeContent.slice(exportMatch.index);\n routeModified = true;\n }\n\n if (routeModified) {\n await fs.writeFile(routeIndexPath, routeContent);\n }\n\n return true;\n }\n\n const appPath = path.join(projectRoot, srcDir, \"app.ts\");\n if (!await fs.pathExists(appPath)) {\n return false;\n }\n\n let appContent = await fs.readFile(appPath, \"utf-8\");\n let appModified = false;\n\n const appImportResult = appendImport(appContent, `import docsRoutes from \"./routes/docs.routes\";`);\n if (!appImportResult.inserted) {\n return false;\n }\n\n if (appImportResult.source !== appContent) {\n appContent = appImportResult.source;\n appModified = true;\n }\n\n const hasMount = /app\\.use\\(\\s*[\"']\\/api\\/docs[\"']\\s*,\\s*docsRoutes\\s*\\)/.test(appContent);\n if (!hasMount) {\n const setup = `\\n// API docs\\napp.use(\"/api/docs\", docsRoutes);\\n`;\n const exportMatch = appContent.match(/export default app;?\\s*$/m);\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n appContent = appContent.slice(0, exportMatch.index) + setup + \"\\n\" + appContent.slice(exportMatch.index);\n appModified = true;\n }\n\n if (appModified) {\n await fs.writeFile(appPath, appContent);\n }\n\n return true;\n}\n\nasync function injectAuthDocs(projectRoot: string, srcDir: string): Promise<boolean> {\n const openApiPath = path.join(projectRoot, srcDir, \"lib\", \"openapi.ts\");\n if (!await fs.pathExists(openApiPath)) {\n return false;\n }\n\n const authMarker = \"// ZURO_AUTH_DOCS\";\n let content = await fs.readFile(openApiPath, \"utf-8\");\n if (content.includes(authMarker)) {\n return true;\n }\n\n const moduleDocsEndMarker = \"// ZURO_DOCS_MODULES_END\";\n if (!content.includes(moduleDocsEndMarker)) {\n return false;\n }\n\n const authBlock = `\\nconst authSignUpSchema = z.object({\n email: z.string().email().openapi({ example: \"dev@company.com\" }),\n password: z.string().min(8).openapi({ example: \"strong-password\" }),\n name: z.string().min(1).optional().openapi({ example: \"Dev User\" }),\n});\n\nconst authSignInSchema = z.object({\n email: z.string().email().openapi({ example: \"dev@company.com\" }),\n password: z.string().min(8).openapi({ example: \"strong-password\" }),\n});\n\nconst authUserSchema = z.object({\n id: z.string().openapi({ example: \"user_123\" }),\n email: z.string().email().openapi({ example: \"dev@company.com\" }),\n name: z.string().nullable().openapi({ example: \"Dev User\" }),\n});\n\n${authMarker}\nregistry.registerPath({\n method: \"post\",\n path: \"/api/auth/sign-up/email\",\n tags: [\"Auth\"],\n summary: \"Register using email and password\",\n request: {\n body: {\n content: {\n \"application/json\": {\n schema: authSignUpSchema,\n },\n },\n },\n },\n responses: {\n 200: { description: \"Registration successful\" },\n },\n});\n\nregistry.registerPath({\n method: \"post\",\n path: \"/api/auth/sign-in/email\",\n tags: [\"Auth\"],\n summary: \"Sign in using email and password\",\n request: {\n body: {\n content: {\n \"application/json\": {\n schema: authSignInSchema,\n },\n },\n },\n },\n responses: {\n 200: { description: \"Sign in successful\" },\n 401: { description: \"Invalid credentials\" },\n },\n});\n\nregistry.registerPath({\n method: \"post\",\n path: \"/api/auth/sign-out\",\n tags: [\"Auth\"],\n summary: \"Sign out current user\",\n responses: {\n 200: { description: \"Sign out successful\" },\n },\n});\n\nregistry.registerPath({\n method: \"get\",\n path: \"/api/users/me\",\n tags: [\"Auth\"],\n summary: \"Get current authenticated user\",\n security: [{ bearerAuth: [] }],\n responses: {\n 200: {\n description: \"Current user\",\n content: {\n \"application/json\": {\n schema: z.object({ user: authUserSchema }),\n },\n },\n },\n 401: { description: \"Not authenticated\" },\n },\n});\n`;\n\n content = content.replace(moduleDocsEndMarker, `${authBlock}\\n${moduleDocsEndMarker}`);\n await fs.writeFile(openApiPath, content);\n\n return true;\n}\n\nexport const add = async (moduleName: string, options: AddCommandOptions = {}) => {\n const projectRoot = process.cwd();\n const projectConfig = await readZuroConfig(projectRoot);\n if (!projectConfig) {\n if (await isLikelyEmptyDirectory(projectRoot)) {\n showInitFirstMessage();\n return;\n }\n\n showNonZuroProjectMessage();\n return;\n }\n const srcDir = projectConfig.srcDir || \"src\";\n let resolvedModuleName = moduleName;\n const parsedDialect = parseDatabaseDialect(moduleName);\n if (parsedDialect) {\n resolvedModuleName = parsedDialect;\n }\n\n let customDbUrl: string | undefined;\n let usedDefaultDbUrl = false;\n let databaseBackupPath: string | null = null;\n let generatedAuthSecret = false;\n let authDatabaseDialect: DatabaseModuleName | null = null;\n let customSmtpVars: Record<string, string> | undefined;\n let usedDefaultSmtp = false;\n let mailerProvider: \"smtp\" | \"resend\" = \"smtp\";\n let shouldInstallDocsForAuth = false;\n\n if (resolvedModuleName === \"database\") {\n const variantResponse = await prompts({\n type: \"select\",\n name: \"variant\",\n message: \"Which database dialect?\",\n choices: [\n { title: \"PostgreSQL\", value: \"database-pg\" },\n { title: \"MySQL\", value: \"database-mysql\" },\n ],\n });\n\n if (!variantResponse.variant) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return;\n }\n\n resolvedModuleName = variantResponse.variant;\n }\n\n if (isDatabaseModule(resolvedModuleName)) {\n const installedDialect = await detectInstalledDatabaseDialect(projectRoot, srcDir);\n\n if (installedDialect && installedDialect !== resolvedModuleName) {\n console.log(\n chalk.yellow(\n `\\n⚠ Existing database setup detected: ${databaseLabel(installedDialect)}.`\n )\n );\n console.log(\n chalk.yellow(\n ` Switching to ${databaseLabel(resolvedModuleName)} will overwrite db files and drizzle config.\\n`\n )\n );\n\n const switchResponse = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: \"Continue and switch database dialect?\",\n initial: false,\n });\n\n if (!switchResponse.proceed) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return;\n }\n\n databaseBackupPath = await backupDatabaseFiles(projectRoot, srcDir);\n }\n\n const defaultUrl = DEFAULT_DATABASE_URLS[resolvedModuleName];\n console.log(chalk.dim(` Tip: Leave blank to use ${defaultUrl}\\n`));\n\n const response = await prompts({\n type: \"text\",\n name: \"dbUrl\",\n message: \"Database URL\",\n initial: \"\",\n });\n\n if (response.dbUrl === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return;\n }\n\n const enteredUrl = response.dbUrl?.trim() || \"\";\n usedDefaultDbUrl = enteredUrl.length === 0;\n customDbUrl = validateDatabaseUrl(enteredUrl || defaultUrl, resolvedModuleName);\n }\n\n if (resolvedModuleName === \"mailer\") {\n const providerResponse = await prompts({\n type: \"select\",\n name: \"provider\",\n message: \"Which email provider?\",\n choices: [\n { title: \"SMTP (Nodemailer)\", description: \"Gmail, Mailtrap, any SMTP server\", value: \"smtp\" },\n { title: \"Resend\", description: \"API-based, easiest setup\", value: \"resend\" },\n ],\n });\n\n if (providerResponse.provider === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return;\n }\n\n mailerProvider = providerResponse.provider;\n\n console.log(chalk.dim(\" Tip: Leave fields blank to use placeholder values and configure later\\n\"));\n\n if (mailerProvider === \"smtp\") {\n const smtpResponse = await prompts([\n {\n type: \"text\",\n name: \"host\",\n message: \"SMTP Host\",\n initial: \"\",\n },\n {\n type: \"text\",\n name: \"port\",\n message: \"SMTP Port\",\n initial: \"587\",\n },\n {\n type: \"text\",\n name: \"user\",\n message: \"SMTP User\",\n initial: \"\",\n },\n {\n type: \"password\",\n name: \"pass\",\n message: \"SMTP Password\",\n },\n {\n type: \"text\",\n name: \"from\",\n message: \"Mail From address\",\n initial: \"\",\n },\n ]);\n\n if (smtpResponse.host === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return;\n }\n\n const host = smtpResponse.host?.trim() || \"\";\n const user = smtpResponse.user?.trim() || \"\";\n const pass = smtpResponse.pass?.trim() || \"\";\n const from = smtpResponse.from?.trim() || \"\";\n const port = smtpResponse.port?.trim() || \"587\";\n\n usedDefaultSmtp = !host && !user;\n\n if (!usedDefaultSmtp) {\n customSmtpVars = {\n SMTP_HOST: host || \"smtp.example.com\",\n SMTP_PORT: port,\n SMTP_USER: user || \"your-email@example.com\",\n SMTP_PASS: pass || \"your-password\",\n MAIL_FROM: from || \"noreply@example.com\",\n };\n }\n } else {\n const resendResponse = await prompts([\n {\n type: \"text\",\n name: \"apiKey\",\n message: \"Resend API Key\",\n initial: \"\",\n },\n {\n type: \"text\",\n name: \"from\",\n message: \"Mail From address\",\n initial: \"\",\n },\n ]);\n\n if (resendResponse.apiKey === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return;\n }\n\n const apiKey = resendResponse.apiKey?.trim() || \"\";\n const from = resendResponse.from?.trim() || \"\";\n\n usedDefaultSmtp = !apiKey;\n\n if (!usedDefaultSmtp) {\n customSmtpVars = {\n RESEND_API_KEY: apiKey || \"re_your_api_key\",\n MAIL_FROM: from || \"onboarding@resend.dev\",\n };\n }\n }\n }\n\n if (resolvedModuleName === \"auth\") {\n const docsInstalled = await isDocsModuleInstalled(projectRoot, srcDir);\n if (!docsInstalled) {\n if (options.yes) {\n shouldInstallDocsForAuth = true;\n } else {\n const docsResponse = await prompts({\n type: \"confirm\",\n name: \"installDocs\",\n message: \"Install API docs module (Scalar + OpenAPI) too?\",\n initial: true,\n });\n\n if (docsResponse.installDocs === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return;\n }\n\n shouldInstallDocsForAuth = docsResponse.installDocs;\n }\n }\n }\n\n const pm = resolvePackageManager(projectRoot);\n const spinner = ora(`Checking registry for ${resolvedModuleName}...`).start();\n let currentStep = \"package manager preflight\";\n\n try {\n spinner.text = `Checking ${pm} availability...`;\n await ensurePackageManagerAvailable(pm);\n\n currentStep = \"registry fetch\";\n spinner.text = `Checking registry for ${resolvedModuleName}...`;\n const registryContext = await fetchRegistry();\n const module = registryContext.manifest.modules[resolvedModuleName];\n\n if (!module) {\n spinner.fail(`Module '${resolvedModuleName}' not found.`);\n return;\n }\n\n spinner.succeed(`Found module: ${chalk.cyan(resolvedModuleName)}`);\n\n const moduleDeps = module.moduleDependencies || [];\n currentStep = \"module dependency resolution\";\n await resolveDependencies(moduleDeps, projectRoot);\n\n currentStep = \"dependency installation\";\n spinner.start(\"Installing dependencies...\");\n\n let runtimeDeps = module.dependencies || [];\n let devDeps = module.devDependencies || [];\n\n if (resolvedModuleName === \"mailer\") {\n if (mailerProvider === \"resend\") {\n runtimeDeps = [\"resend\"];\n devDeps = [];\n } else {\n runtimeDeps = [\"nodemailer\"];\n devDeps = [\"@types/nodemailer\"];\n }\n }\n\n await installDependencies(pm, runtimeDeps, projectRoot);\n await installDependencies(pm, devDeps, projectRoot, { dev: true });\n\n spinner.succeed(\"Dependencies installed\");\n\n currentStep = \"module scaffolding\";\n spinner.start(\"Scaffolding files...\");\n\n if (resolvedModuleName === \"auth\") {\n authDatabaseDialect = await detectInstalledDatabaseDialect(projectRoot, srcDir);\n }\n\n for (const file of module.files) {\n let fetchPath = file.path;\n let expectedSha256 = file.sha256;\n let expectedSize = file.size;\n\n if (\n resolvedModuleName === \"auth\"\n && file.target === \"db/schema/auth.ts\"\n && authDatabaseDialect === \"database-mysql\"\n ) {\n fetchPath = \"express/db/schema/auth.mysql.ts\";\n expectedSha256 = undefined;\n expectedSize = undefined;\n }\n\n if (\n resolvedModuleName === \"mailer\"\n && file.target === \"lib/mailer.ts\"\n && mailerProvider === \"resend\"\n ) {\n fetchPath = \"express/lib/mailer.resend.ts\";\n expectedSha256 = undefined;\n expectedSize = undefined;\n }\n\n let content = await fetchFile(fetchPath, {\n baseUrl: registryContext.fileBaseUrl,\n expectedSha256,\n expectedSize,\n });\n\n if (isDatabaseModule(resolvedModuleName) && file.target === \"../drizzle.config.ts\") {\n const normalizedSrcDir = srcDir.replace(/\\\\/g, \"/\");\n content = content.replace(\n /schema:\\s*[\"'][^\"']+[\"']/,\n `schema: \"./${normalizedSrcDir}/db/schema/*\"`\n );\n }\n\n const targetPath = resolveSafeTargetPath(projectRoot, srcDir, file);\n\n await fs.ensureDir(path.dirname(targetPath));\n await fs.writeFile(targetPath, content);\n }\n\n const schemaExports = module.files\n .map((file) => file.target.replace(/\\\\/g, \"/\"))\n .filter((target) => /^db\\/schema\\/[^/]+\\.ts$/.test(target))\n .map((target) => path.posix.basename(target, \".ts\"))\n .filter((name) => name !== \"index\");\n\n for (const schemaFileName of schemaExports) {\n await ensureSchemaExport(projectRoot, srcDir, schemaFileName);\n }\n\n spinner.succeed(\"Files generated\");\n\n if (resolvedModuleName === \"auth\") {\n spinner.start(\"Configuring routes...\");\n const injected = await injectAuthRoutes(projectRoot, srcDir);\n if (injected) {\n spinner.succeed(\"Routes configured\");\n } else {\n spinner.warn(\"Could not configure routes automatically\");\n }\n\n const docsInstalled = await isDocsModuleInstalled(projectRoot, srcDir);\n if (docsInstalled) {\n spinner.start(\"Adding auth endpoints to API docs...\");\n const authDocsInjected = await injectAuthDocs(projectRoot, srcDir);\n if (authDocsInjected) {\n spinner.succeed(\"Auth endpoints added to API docs\");\n } else {\n spinner.warn(\"Could not update API docs automatically\");\n }\n }\n }\n\n if (resolvedModuleName === \"error-handler\") {\n spinner.start(\"Configuring error handler in app.ts...\");\n const injected = await injectErrorHandler(projectRoot, srcDir);\n if (injected) {\n spinner.succeed(\"Error handler configured in app.ts\");\n } else {\n spinner.warn(\"Could not find app.ts - error handler needs manual setup\");\n }\n }\n\n if (resolvedModuleName === \"docs\") {\n spinner.start(\"Configuring docs routes...\");\n const injected = await injectDocsRoutes(projectRoot, srcDir);\n if (injected) {\n spinner.succeed(\"Docs routes configured\");\n } else {\n spinner.warn(\"Could not configure docs routes automatically\");\n }\n\n const authInstalled = await isAuthModuleInstalled(projectRoot, srcDir);\n if (authInstalled) {\n spinner.start(\"Adding auth endpoints to API docs...\");\n const authDocsInjected = await injectAuthDocs(projectRoot, srcDir);\n if (authDocsInjected) {\n spinner.succeed(\"Auth endpoints added to API docs\");\n } else {\n spinner.warn(\"Could not update API docs automatically\");\n }\n }\n }\n\n let envConfigKey = resolvedModuleName;\n if (resolvedModuleName === \"mailer\" && mailerProvider === \"resend\") {\n envConfigKey = \"mailer-resend\";\n }\n\n const envConfig = ENV_CONFIGS[envConfigKey as keyof typeof ENV_CONFIGS];\n if (envConfig) {\n currentStep = \"environment configuration\";\n spinner.start(\"Updating environment configuration...\");\n\n const envVars: Record<string, string> = { ...envConfig.envVars };\n if (customDbUrl && isDatabaseModule(resolvedModuleName)) {\n envVars.DATABASE_URL = customDbUrl;\n }\n\n if (resolvedModuleName === \"mailer\" && customSmtpVars) {\n Object.assign(envVars, customSmtpVars);\n }\n\n if (resolvedModuleName === \"auth\") {\n const hasExistingSecret = await hasEnvVariable(projectRoot, \"BETTER_AUTH_SECRET\");\n if (!hasExistingSecret) {\n envVars.BETTER_AUTH_SECRET = randomBytes(32).toString(\"hex\");\n generatedAuthSecret = true;\n }\n }\n\n await updateEnvFile(projectRoot, envVars, true, {\n overwriteExisting: isDatabaseModule(resolvedModuleName),\n });\n await updateEnvSchema(projectRoot, srcDir, envConfig.schemaFields);\n\n spinner.succeed(\"Environment configured\");\n }\n\n console.log(chalk.green(`\\n✔ ${resolvedModuleName} added successfully!\\n`));\n\n if (databaseBackupPath) {\n console.log(chalk.blue(`ℹ Backup created at: ${databaseBackupPath}\\n`));\n }\n\n const docsPath = getModuleDocsPath(resolvedModuleName);\n const docsUrl = `https://zuro-cli.devbybriyan.com/docs/${docsPath}`;\n console.log(chalk.blue(`ℹ Docs: ${docsUrl}`));\n\n if (isDatabaseModule(resolvedModuleName)) {\n if (usedDefaultDbUrl) {\n console.log(chalk.yellow(\"ℹ Review DATABASE_URL in .env if your local DB config differs.\"));\n }\n\n const setupHint = getDatabaseSetupHint(\n resolvedModuleName,\n customDbUrl || DEFAULT_DATABASE_URLS[resolvedModuleName]\n );\n console.log(chalk.yellow(`ℹ Ensure DB exists: ${setupHint}`));\n console.log(chalk.yellow(\"ℹ Run migrations: npx drizzle-kit generate && npx drizzle-kit migrate\"));\n }\n\n if (resolvedModuleName === \"auth\") {\n if (generatedAuthSecret) {\n console.log(chalk.yellow(\"ℹ BETTER_AUTH_SECRET was generated automatically.\"));\n } else {\n console.log(chalk.yellow(\"ℹ Review BETTER_AUTH_SECRET and BETTER_AUTH_URL in .env.\"));\n }\n\n console.log(chalk.yellow(\"ℹ Run migrations: npx drizzle-kit generate && npx drizzle-kit migrate\"));\n }\n\n if (resolvedModuleName === \"mailer\") {\n if (usedDefaultSmtp) {\n console.log(chalk.yellow(\"ℹ Placeholder SMTP values added to .env — update them before sending emails.\"));\n } else {\n console.log(chalk.yellow(\"ℹ Review SMTP configuration in .env to ensure values are correct.\"));\n }\n }\n\n if (resolvedModuleName === \"docs\") {\n console.log(chalk.yellow(\"ℹ API docs available at: /api/docs\"));\n console.log(chalk.yellow(\"ℹ OpenAPI spec available at: /api/docs/openapi.json\"));\n }\n\n if (resolvedModuleName === \"auth\" && shouldInstallDocsForAuth) {\n console.log(chalk.blue(\"\\nℹ Installing API docs module...\"));\n await add(\"docs\", { yes: true });\n }\n } catch (error) {\n spinner.fail(chalk.red(`Failed during ${currentStep}.`));\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(chalk.red(errorMessage));\n console.log(`\\n${chalk.bold(\"Retry:\")}`);\n console.log(chalk.cyan(` npx zuro-cli add ${resolvedModuleName}`));\n }\n};\n","import { add } from \"../commands/add\";\nimport { readZuroConfig } from \"./config\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\n\n// Signature files to check if a Zuro module is installed\nconst BLOCK_SIGNATURES: Record<string, string> = {\n core: \"env.ts\",\n \"database-pg\": \"db/index.ts\",\n \"database-mysql\": \"db/index.ts\",\n validator: \"middleware/validate.ts\",\n \"error-handler\": \"lib/errors.ts\",\n logger: \"lib/logger.ts\",\n auth: \"lib/auth.ts\",\n mailer: \"lib/mailer.ts\",\n docs: \"lib/openapi.ts\",\n};\n\n/**\n * Resolves Zuro module dependencies (NOT npm packages).\n * Only handles module dependencies like \"core\", \"database\", \"validator\", \"auth\".\n */\nexport const resolveDependencies = async (\n moduleDependencies: string[] | undefined,\n cwd: string\n) => {\n if (!moduleDependencies || moduleDependencies.length === 0) {\n return;\n }\n\n const config = await readZuroConfig(cwd);\n const srcDir = config?.srcDir || \"src\";\n\n for (const dep of moduleDependencies) {\n if (dep === \"database\") {\n const pgExists = fs.existsSync(path.join(cwd, srcDir, BLOCK_SIGNATURES[\"database-pg\"]));\n const mysqlExists = fs.existsSync(path.join(cwd, srcDir, BLOCK_SIGNATURES[\"database-mysql\"]));\n\n if (pgExists || mysqlExists) {\n continue;\n }\n\n console.log(chalk.blue(`ℹ Dependency '${dep}' is missing. Triggering install...`));\n await add(\"database\");\n continue;\n }\n\n const signature = BLOCK_SIGNATURES[dep];\n if (!signature) {\n continue;\n }\n\n if (fs.existsSync(path.join(cwd, srcDir, signature))) {\n continue;\n }\n\n console.log(chalk.blue(`ℹ Installing missing dependency: ${dep}...`));\n await add(dep);\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uBAAwB;;;ACDxB,iBAAgB;AAChB,IAAAA,gBAAkB;AAClB,IAAAC,mBAAe;AACf,IAAAC,eAAiB;AACjB,qBAAoB;;;ACJpB,yBAA2B;AAE3B,IAAM,4BAA4B;AAClC,IAAM,6BAA6B,GAAG,yBAAyB;AAC/D,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,cAAc;AAmDpB,SAAS,kBAAkB,KAAa;AACtC,SAAO,IAAI,SAAS,GAAG,IAAI,MAAM,GAAG,GAAG;AACzC;AAEA,SAAS,0BAA0B;AACjC,QAAM,WAAW,QAAQ,IAAI,gBAAgB,GAAG,KAAK;AAErD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI;AAEJ,MAAI;AACF,aAAS,IAAI,IAAI,QAAQ;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,WAAW,gBAAgB,WAAW,QAAQ;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,SAAS,OAAO,GAAG;AACrC,WAAO,OAAO,SAAS;AAAA,EACzB;AAEA,SAAO,IAAI,IAAI,wBAAwB,kBAAkB,OAAO,SAAS,CAAC,CAAC,EAAE,SAAS;AACxF;AAEA,SAAS,mBAAmB,MAAyC;AACnE,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SAAO,CAAC,CAAC,UAAU,WAAW,OAAO,UAAU,YAAY;AAC7D;AAEA,SAAS,iBAAiB,MAA+C;AACvE,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SAAO,OAAO,UAAU,cAAc,YAAY,OAAO,UAAU,aAAa;AAClF;AAEA,SAAS,MAAM,IAAY;AACzB,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,eAAe,eAAe,KAAgC;AAC5D,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,aAAa,WAAW;AACvD,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,kBAAkB;AAEvE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,SAAS,EAAE,QAAQ,oCAAoC;AAAA,QACvD,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,UAAI,SAAS,IAAI;AACf,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,SAAS,UAAU,OAAO,UAAU;AACxD,UAAI,aAAa;AACf,cAAM,MAAM,OAAO,UAAU,EAAE;AAC/B;AAAA,MACF;AAEA,YAAM,IAAI,MAAM,mBAAmB,SAAS,MAAM,IAAI,SAAS,UAAU,SAAS,GAAG,EAAE;AAAA,IACzF,SAAS,OAAO;AACd,kBAAY;AAEZ,UAAI,YAAY,aAAa;AAC3B;AAAA,MACF;AAEA,YAAM,MAAM,OAAO,UAAU,EAAE;AAAA,IACjC,UAAE;AACA,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,qBAAqB,OAAO;AAC9B,UAAM;AAAA,EACR;AAEA,QAAM,IAAI,MAAM,mBAAmB,GAAG,EAAE;AAC1C;AAEA,eAAe,UAAa,KAAwD;AAClF,QAAM,WAAW,MAAM,eAAe,GAAG;AACzC,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,SAAO;AAAA,IACL;AAAA,IACA,aAAa,SAAS,OAAO;AAAA,EAC/B;AACF;AAEA,SAAS,mBAAmB,SAAiC,YAA4B;AACvF,QAAM,WAAW,QAAQ,YAAY,QAAQ;AAE7C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,SAAO,IAAI,IAAI,UAAU,UAAU,EAAE,SAAS;AAChD;AAEA,eAAsB,gBAA0C;AAC9D,QAAM,mBAAmB,wBAAwB;AACjD,MAAI;AAEJ,MAAI;AACF,YAAQ,MAAM,UAAmB,gBAAgB;AAAA,EACnD,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,iCAAiC,gBAAgB,2BAA2B,gBAAgB;AAAA,MAC5F,EAAE,OAAO,MAAe;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,mBAAmB,MAAM,IAAI,GAAG;AAClC,WAAO;AAAA,MACL,UAAU,MAAM;AAAA,MAChB,aAAa,MAAM;AAAA,MACnB,aAAa,kBAAkB,IAAI,IAAI,KAAK,MAAM,WAAW,EAAE,SAAS,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,MAAI,CAAC,iBAAiB,MAAM,IAAI,GAAG;AACjC,UAAM,IAAI;AAAA,MACR,+BAA+B,gBAAgB;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,cAAc,mBAAmB,MAAM,MAAM,MAAM,WAAW;AACpE,QAAM,iBAAiB,MAAM,UAAmB,WAAW;AAE3D,MAAI,CAAC,mBAAmB,eAAe,IAAI,GAAG;AAC5C,UAAM,IAAI,MAAM,+BAA+B,WAAW,GAAG;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL,UAAU,eAAe;AAAA,IACzB,aAAa,eAAe;AAAA,IAC5B,aAAa,kBAAkB,IAAI,IAAI,KAAK,eAAe,WAAW,EAAE,SAAS,CAAC;AAAA,EACpF;AACF;AAEA,eAAsB,UAAU,UAAkB,SAA2B;AAC3E,QAAM,iBAAiB,SAAS,QAAQ,OAAO,EAAE;AACjD,QAAM,UAAU,IAAI,IAAI,gBAAgB,kBAAkB,QAAQ,OAAO,CAAC,EAAE,SAAS;AACrF,QAAM,WAAW,MAAM,eAAe,OAAO;AAC7C,QAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,MAAI,OAAO,QAAQ,iBAAiB,UAAU;AAC5C,UAAM,aAAa,OAAO,WAAW,SAAS,MAAM;AACpD,QAAI,eAAe,QAAQ,cAAc;AACvC,YAAM,IAAI;AAAA,QACR,qBAAqB,QAAQ,cAAc,QAAQ,YAAY,SAAS,UAAU;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,gBAAgB;AAC1B,UAAM,mBAAe,+BAAW,QAAQ,EAAE,OAAO,SAAS,MAAM,EAAE,OAAO,KAAK;AAC9E,QAAI,iBAAiB,QAAQ,gBAAgB;AAC3C,YAAM,IAAI;AAAA,QACR,yBAAyB,QAAQ,cAAc,QAAQ,cAAc,SAAS,YAAY;AAAA,MAC5F;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC7OA,sBAAe;AACf,kBAAiB;AACjB,mBAAsB;AAEtB,SAAS,qBAAqB,MAAc;AACxC,QAAM,aAAa,KACd,KAAK,EACL,YAAY,EACZ,QAAQ,iBAAiB,GAAG,EAC5B,QAAQ,OAAO,GAAG,EAClB,QAAQ,oBAAoB,EAAE;AAEnC,SAAO,cAAc;AACzB;AAEA,eAAsB,8BAA8B,IAAY;AAC5D,MAAI;AACA,cAAM,oBAAM,IAAI,CAAC,WAAW,GAAG,EAAE,OAAO,SAAS,CAAC;AAAA,EACtD,QAAQ;AACJ,UAAM,IAAI;AAAA,MACN,oBAAoB,EAAE;AAAA,IAC1B;AAAA,EACJ;AACJ;AAEA,eAAsB,gBAClB,KACA,QAAiB,OACjB,cAAc,YACd,SAAS,OACT,UAAwC,CAAC,GAC3C;AACE,QAAM,UAAU,YAAAC,QAAK,KAAK,KAAK,cAAc;AAC7C,MAAI,SAAS,CAAC,MAAM,gBAAAC,QAAG,WAAW,OAAO,GAAG;AACxC,UAAM,UAAkC;AAAA,MACpC,OAAO,aAAa,MAAM;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,IACb;AAEA,QAAI,QAAQ,gBAAgB;AACxB,cAAQ,QAAQ,IAAI;AACpB,cAAQ,cAAc,IAAI;AAAA,IAC9B;AAEA,UAAM,gBAAAA,QAAG,UAAU,SAAS;AAAA,MACxB,MAAM,qBAAqB,WAAW;AAAA,MACtC,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,IACJ,GAAG,EAAE,QAAQ,EAAE,CAAC;AAAA,EACpB;AACJ;AAMA,eAAsB,oBAClB,IACA,MACA,KACA,UAA0B,CAAC,GAC7B;AACE,QAAM,aAAa,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,EAAE,OAAO,OAAO;AAEpD,MAAI,WAAW,WAAW,GAAG;AACzB;AAAA,EACJ;AAEA,QAAM,QAAQ,QAAQ,OAAO;AAE7B,MAAI,OAAO,OAAO;AACd,UAAM,OAAO,CAAC,WAAW,GAAI,QAAQ,CAAC,YAAY,IAAI,CAAC,GAAI,GAAG,UAAU;AACxE,cAAM,oBAAM,OAAO,MAAM,EAAE,IAAI,CAAC;AAChC;AAAA,EACJ;AAEA,MAAI,OAAO,QAAQ;AACf,UAAM,OAAO,CAAC,OAAO,GAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,UAAU;AAC5D,cAAM,oBAAM,QAAQ,MAAM,EAAE,IAAI,CAAC;AACjC;AAAA,EACJ;AAEA,MAAI,OAAO,QAAQ;AACf,UAAM,OAAO,CAAC,OAAO,GAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,UAAU;AAC5D,cAAM,oBAAM,QAAQ,MAAM,EAAE,IAAI,CAAC;AACjC;AAAA,EACJ;AAEA,MAAI,OAAO,OAAO;AACd,UAAM,OAAO,CAAC,OAAO,GAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAI,GAAG,UAAU;AAC5D,cAAM,oBAAM,OAAO,MAAM,EAAE,IAAI,CAAC;AAChC;AAAA,EACJ;AAEA,QAAM,IAAI,MAAM,gCAAgC,EAAE,EAAE;AACxD;;;ACjGA,IAAAC,mBAAe;AACf,IAAAC,eAAiB;AACjB,gBAAe;AAKR,IAAM,gBAAgB,OACzB,KACA,WACA,kBAAkB,MAClB,UAA2C,CAAC,MAC3C;AACD,QAAM,UAAU,aAAAC,QAAK,KAAK,KAAK,MAAM;AACrC,QAAM,oBAAoB,QAAQ,qBAAqB;AAEvD,MAAI,UAAU;AACd,MAAI,iBAAAC,QAAG,WAAW,OAAO,GAAG;AACxB,cAAU,MAAM,iBAAAA,QAAG,SAAS,SAAS,OAAO;AAAA,EAChD,WAAW,CAAC,iBAAiB;AACzB;AAAA,EACJ;AAEA,MAAI,WAAW;AAEf,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AAClD,UAAM,aAAa,IAAI,QAAQ,uBAAuB,MAAM;AAC5D,UAAM,QAAQ,IAAI,OAAO,IAAI,UAAU,QAAQ,GAAG;AAElD,QAAI,MAAM,KAAK,OAAO,GAAG;AACrB,UAAI,CAAC,mBAAmB;AACpB;AAAA,MACJ;AAEA,YAAM,WAAW,GAAG,GAAG,IAAI,KAAK;AAChC,YAAM,UAAU,QAAQ,QAAQ,OAAO,QAAQ;AAC/C,UAAI,YAAY,SAAS;AACrB,kBAAU;AACV,mBAAW;AAAA,MACf;AACA;AAAA,IACJ;AAGA,QAAI,WAAW,CAAC,QAAQ,SAAS,IAAI,GAAG;AACpC,iBAAW,UAAAC,QAAG;AAAA,IAClB;AACA,eAAW,GAAG,GAAG,IAAI,KAAK,GAAG,UAAAA,QAAG,GAAG;AACnC,eAAW;AAAA,EACf;AAEA,MAAI,YAAY,CAAC,iBAAAD,QAAG,WAAW,OAAO,GAAG;AACrC,UAAM,iBAAAA,QAAG,UAAU,SAAS,OAAO;AAAA,EACvC;AACJ;AAKO,IAAM,kBAAkB,OAC3B,KACA,QACA,WACC;AACD,QAAM,UAAU,aAAAD,QAAK,KAAK,KAAK,QAAQ,QAAQ;AAE/C,MAAI,CAAC,iBAAAC,QAAG,WAAW,OAAO,GAAG;AACzB,WAAO;AAAA,EACX;AAEA,MAAI,UAAU,MAAM,iBAAAA,QAAG,SAAS,SAAS,OAAO;AAChD,MAAI,WAAW;AAEf,aAAW,SAAS,QAAQ;AAExB,QAAI,QAAQ,SAAS,GAAG,MAAM,IAAI,GAAG,GAAG;AACpC;AAAA,IACJ;AAIA,UAAM,iBAAiB;AACvB,UAAM,QAAQ,QAAQ,MAAM,cAAc;AAE1C,QAAI,OAAO;AACP,YAAM,SAAS;AACf,YAAM,WAAW,GAAG,MAAM,GAAG,MAAM,IAAI,KAAK,MAAM,MAAM;AAAA;AACxD,gBAAU,QAAQ;AAAA,QACd;AAAA,QACA;AAAA,EAAK,QAAQ;AAAA,MACjB;AACA,iBAAW;AAAA,IACf;AAAA,EACJ;AAEA,MAAI,UAAU;AACV,UAAM,iBAAAA,QAAG,UAAU,SAAS,OAAO;AAAA,EACvC;AAEA,SAAO;AACX;AAKO,IAAM,mBAAmB,OAAO,QAAgB;AACnD,QAAM,UAAU,aAAAD,QAAK,KAAK,KAAK,MAAM;AAErC,MAAI,iBAAAC,QAAG,WAAW,OAAO,GAAG;AACxB;AAAA,EACJ;AAEA,QAAM,UAAU;AAAA;AAAA;AAAA;AAKhB,QAAM,iBAAAA,QAAG,UAAU,SAAS,OAAO;AACvC;AAKO,IAAM,cAAc;AAAA,EACvB,eAAe;AAAA,IACX,SAAS;AAAA,MACL,cAAc;AAAA,IAClB;AAAA,IACA,cAAc;AAAA,MACV,EAAE,MAAM,gBAAgB,QAAQ,mBAAmB;AAAA,IACvD;AAAA,EACJ;AAAA,EACA,kBAAkB;AAAA,IACd,SAAS;AAAA,MACL,cAAc;AAAA,IAClB;AAAA,IACA,cAAc;AAAA,MACV,EAAE,MAAM,gBAAgB,QAAQ,mBAAmB;AAAA,IACvD;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACF,SAAS;AAAA,MACL,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,IACrB;AAAA,IACA,cAAc;AAAA,MACV,EAAE,MAAM,sBAAsB,QAAQ,qBAAqB;AAAA,MAC3D,EAAE,MAAM,mBAAmB,QAAQ,mBAAmB;AAAA,IAC1D;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACJ,SAAS;AAAA,MACL,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,IACf;AAAA,IACA,cAAc;AAAA,MACV,EAAE,MAAM,aAAa,QAAQ,oBAAoB;AAAA,MACjD,EAAE,MAAM,aAAa,QAAQ,iCAAiC;AAAA,MAC9D,EAAE,MAAM,aAAa,QAAQ,oBAAoB;AAAA,MACjD,EAAE,MAAM,aAAa,QAAQ,oBAAoB;AAAA,MACjD,EAAE,MAAM,aAAa,QAAQ,qBAAqB;AAAA,IACtD;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb,SAAS;AAAA,MACL,gBAAgB;AAAA,MAChB,WAAW;AAAA,IACf;AAAA,IACA,cAAc;AAAA,MACV,EAAE,MAAM,kBAAkB,QAAQ,oBAAoB;AAAA,MACtD,EAAE,MAAM,aAAa,QAAQ,oBAAoB;AAAA,IACrD;AAAA,EACJ;AACJ;;;AChLA,IAAAE,mBAAe;AACf,IAAAC,eAAiB;AAQjB,SAAS,eAAe,OAA4B;AAClD,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAM;AACZ,QAAM,SAAqB,CAAC;AAE5B,MAAI,OAAO,IAAI,SAAS,UAAU;AAChC,WAAO,OAAO,IAAI;AAAA,EACpB;AAEA,MAAI,OAAO,IAAI,OAAO,UAAU;AAC9B,WAAO,KAAK,IAAI;AAAA,EAClB;AAEA,MAAI,OAAO,IAAI,WAAW,UAAU;AAClC,WAAO,SAAS,IAAI;AAAA,EACtB;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,KAAa;AACzC,SAAO,aAAAC,QAAK,KAAK,KAAK,WAAW;AACnC;AAEA,eAAsB,eAAe,KAAyC;AAC5E,QAAM,aAAa,cAAc,GAAG;AAEpC,MAAI,CAAE,MAAM,iBAAAC,QAAG,WAAW,UAAU,GAAI;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,MAAM,iBAAAA,QAAG,SAAS,UAAU;AACxC,SAAO,eAAe,GAAG;AAC3B;AAEA,eAAsB,gBAAgB,KAAa,QAAoB;AACrE,QAAM,aAAa,cAAc,GAAG;AACpC,QAAM,iBAAAA,QAAG,UAAU,YAAY,eAAe,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC;AACtE;;;AClDA,mBAAkB;AAEX,SAAS,4BAA4B;AACxC,UAAQ,IAAI,aAAAC,QAAM,OAAO,kFAAkF,CAAC;AAC5G,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,aAAAA,QAAM,OAAO,oFAAoF,CAAC;AAC9G,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,oBAAoB;AAChC,UAAQ,IAAI,+BAA+B;AAC3C,UAAQ,IAAI,oDAAoD;AACpE;AAEO,SAAS,uBAAuB;AACnC,UAAQ,IAAI,aAAAA,QAAM,OAAO,0CAA0C,CAAC;AACpE,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,aAAAA,QAAM,OAAO,mCAAmC,CAAC;AAC7D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,aAAAA,QAAM,KAAK,mBAAmB,CAAC;AAC/C;;;ALNA,SAAS,sBAAsB,aAAqB,QAAgB,MAAoB;AACpF,QAAM,qBAAqB,aAAAC,QAAK,KAAK,QAAQ,KAAK,MAAM;AACxD,QAAM,aAAa,aAAAA,QAAK,QAAQ,aAAa,kBAAkB;AAC/D,QAAM,iBAAiB,aAAAA,QAAK,QAAQ,WAAW;AAE/C,MAAI,eAAe,kBAAkB,CAAC,WAAW,WAAW,GAAG,cAAc,GAAG,aAAAA,QAAK,GAAG,EAAE,GAAG;AACzF,UAAM,IAAI,MAAM,gDAAgD,KAAK,MAAM,EAAE;AAAA,EACjF;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,eAAe,0BAA0B,WAAmB,KAAa,aAAqB;AAC1F,QAAM,iBAAAC,QAAG,UAAU,SAAS;AAC5B,QAAM,UAAU,MAAM,iBAAAA,QAAG,QAAQ,SAAS;AAE1C,MAAI,QAAQ,WAAW,GAAG;AACtB,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,cAAc;AACtC,QAAM,WAAW,UAAM,eAAAC,SAAQ;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,kBACH,mBAAmB,WAAW,qCAC9B,kBAAkB,WAAW;AAAA,IACnC,SAAS;AAAA,EACb,CAAC;AAED,SAAO,SAAS,YAAY;AAChC;AAEA,eAAe,cAAc,WAAmB;AAC5C,QAAM,qBAAqB,aAAAF,QAAK,KAAK,WAAW,aAAa;AAC7D,QAAM,qBAAqB,aAAAA,QAAK,KAAK,WAAW,iBAAiB;AAEjE,MAAI,CAAC,MAAM,iBAAAC,QAAG,WAAW,kBAAkB,GAAG;AAC1C,UAAM,iBAAiB;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,IACd;AACA,UAAM,iBAAAA,QAAG,UAAU,oBAAoB,gBAAgB,EAAE,QAAQ,EAAE,CAAC;AAAA,EACxE;AAEA,MAAI,CAAC,MAAM,iBAAAA,QAAG,WAAW,kBAAkB,GAAG;AAC1C,UAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUtB,UAAM,iBAAAA,QAAG,UAAU,oBAAoB,aAAa;AAAA,EACxD;AACJ;AAEA,eAAsB,OAAO;AACzB,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,oBAAoB,MAAM,iBAAAA,QAAG,WAAW,aAAAD,QAAK,KAAK,KAAK,cAAc,CAAC;AAC5E,QAAM,qBAAqB,MAAM,eAAe,GAAG;AAEnD,MAAI,qBAAqB,CAAC,oBAAoB;AAC1C,8BAA0B;AAC1B;AAAA,EACJ;AAEA,MAAI,YAAY;AAChB,MAAI,KAAK;AACT,MAAI,SAAS;AACb,MAAI,cAAc,aAAAA,QAAK,SAAS,GAAG;AACnC,MAAI,iBAAiB;AAErB,MAAI,mBAAmB;AACnB,YAAQ,IAAI,cAAAG,QAAM,KAAK,mCAA8B,CAAC;AAEtD,kBAAc,aAAAH,QAAK,SAAS,GAAG;AAE/B,QAAI,MAAM,iBAAAC,QAAG,WAAW,aAAAD,QAAK,KAAK,KAAK,gBAAgB,CAAC,GAAG;AACvD,WAAK;AAAA,IACT,WAAW,MAAM,iBAAAC,QAAG,WAAW,aAAAD,QAAK,KAAK,KAAK,WAAW,CAAC,GAAG;AACzD,WAAK;AAAA,IACT,WAAW,MAAM,iBAAAC,QAAG,WAAW,aAAAD,QAAK,KAAK,KAAK,WAAW,CAAC,GAAG;AACzD,WAAK;AAAA,IACT;AAEA,UAAM,WAAW,UAAM,eAAAE,SAAQ;AAAA,MAC3B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AAED,aAAS,SAAS,UAAU;AAAA,EAChC,OAAO;AACH,YAAQ,IAAI,cAAAC,QAAM,IAAI,6CAA6C,aAAAH,QAAK,SAAS,GAAG,CAAC;AAAA,CAAK,CAAC;AAE3F,UAAM,WAAW,UAAM,eAAAE,SAAQ;AAAA,MAC3B;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACb;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,UACL,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,UAC7B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,UAC/B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,QACjC;AAAA,QACA,SAAS;AAAA,MACb;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACb;AAAA,IACJ,CAAC;AAED,QAAI,SAAS,OAAO,QAAW;AAC3B,cAAQ,IAAI,cAAAC,QAAM,IAAI,sBAAsB,CAAC;AAC7C;AAAA,IACJ;AAEA,SAAK,SAAS;AACd,qBAAiB,SAAS,aAAa;AACvC,aAAS;AAET,QAAI,CAAC,SAAS,QAAQ,SAAS,KAAK,KAAK,MAAM,IAAI;AAC/C,oBAAc,aAAAH,QAAK,SAAS,GAAG;AAC/B,kBAAY;AACZ,cAAQ,IAAI,cAAAG,QAAM,KAAK,gCAA2B,WAAW,EAAE,CAAC;AAAA,IACpE,OAAO;AACH,oBAAc,SAAS,KAAK,KAAK;AACjC,kBAAY,aAAAH,QAAK,QAAQ,KAAK,WAAW;AAAA,IAC7C;AAEA,UAAM,eAAe,MAAM,0BAA0B,WAAW,KAAK,WAAW;AAChF,QAAI,CAAC,cAAc;AACf,cAAQ,IAAI,cAAAG,QAAM,IAAI,sBAAsB,CAAC;AAC7C;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,iBAAiB,cAAc,MAAM,qBAAqB,MAAM,eAAe,SAAS;AAE9F,QAAM,aAAyB;AAAA,IAC3B,MAAM;AAAA,IACN;AAAA,IACA,QAAQ,UAAU,gBAAgB,UAAU;AAAA,EAChD;AAEA,QAAM,cAAU,WAAAC,SAAI,gCAAgC,EAAE,MAAM;AAC5D,MAAI,cAAc;AAElB,MAAI;AACA,YAAQ,OAAO,YAAY,EAAE;AAC7B,UAAM,8BAA8B,EAAE;AAEtC,kBAAc;AACd,YAAQ,OAAO;AACf,UAAM,kBAAkB,MAAM,cAAc;AAE5C,UAAM,aAAa,gBAAgB,SAAS,QAAQ;AAEpD,QAAI,CAAC,YAAY;AACb,cAAQ,KAAK,oCAAoC;AACjD;AAAA,IACJ;AAEA,kBAAc;AACd,YAAQ,OAAO;AAEf,UAAM,iBAAiB,MAAM,iBAAAH,QAAG,WAAW,aAAAD,QAAK,KAAK,WAAW,cAAc,CAAC;AAC/E,QAAI,CAAC,gBAAgB;AACjB,YAAM,gBAAgB,WAAW,MAAM,aAAa,QAAQ,EAAE,eAAe,CAAC;AAAA,IAClF;AAEA,kBAAc;AACd,YAAQ,OAAO,iCAAiC,EAAE;AAElD,QAAI,cAAwB,CAAC;AAC7B,QAAI,UAAoB,CAAC;AAEzB,QAAI,mBAAmB;AACnB,YAAM,WAAW,CAAC,OAAO,QAAQ;AACjC,YAAM,WAAW,WAAW,gBAAgB,CAAC;AAC7C,oBAAc,SAAS,OAAO,CAAC,eAAe,SAAS,SAAS,UAAU,CAAC;AAC3E,gBAAU,WAAW,mBAAmB,CAAC;AAAA,IAC7C,OAAO;AACH,oBAAc,WAAW,gBAAgB,CAAC;AAC1C,gBAAU,WAAW,mBAAmB,CAAC;AAAA,IAC7C;AAEA,UAAM,oBAAoB,IAAI,aAAa,SAAS;AACpD,UAAM,oBAAoB,IAAI,SAAS,WAAW,EAAE,KAAK,KAAK,CAAC;AAE/D,QAAI,gBAAgB;AAChB,YAAM,oBAAoB,IAAI,CAAC,UAAU,GAAG,WAAW,EAAE,KAAK,KAAK,CAAC;AAAA,IACxE;AAEA,kBAAc;AACd,YAAQ,OAAO;AAEf,eAAW,QAAQ,WAAW,OAAO;AACjC,YAAM,EAAE,oBAAoB,WAAW,IAAI,sBAAsB,WAAW,QAAQ,IAAI;AACxF,YAAM,WAAW,aAAAA,QAAK,SAAS,UAAU;AAEzC,UAAI,mBAAmB;AACnB,YAAI,aAAa,YAAY,aAAa,aAAa;AACnD;AAAA,QACJ;AAEA,cAAM,gBAAgB,mBAAmB,MAAM,aAAAA,QAAK,GAAG;AACvD,cAAM,SAAS,aAAa,YAAY,cAAc,SAAS,KAAK;AACpE,YAAI,CAAC,QAAQ;AACT;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,UAAU,MAAM,UAAU,KAAK,MAAM;AAAA,QACvC,SAAS,gBAAgB;AAAA,QACzB,gBAAgB,KAAK;AAAA,QACrB,cAAc,KAAK;AAAA,MACvB,CAAC;AAED,YAAM,iBAAAC,QAAG,UAAU,aAAAD,QAAK,QAAQ,UAAU,CAAC;AAC3C,YAAM,iBAAAC,QAAG,UAAU,YAAY,OAAO;AAAA,IAC1C;AAEA,kBAAc;AACd,UAAM,iBAAiB,SAAS;AAEhC,QAAI,gBAAgB;AAChB,oBAAc;AACd,YAAM,cAAc,SAAS;AAAA,IACjC;AAEA,kBAAc;AACd,UAAM,gBAAgB,WAAW,UAAU;AAE3C,YAAQ,QAAQ,cAAAE,QAAM,MAAM,mCAAmC,CAAC;AAEhE,YAAQ,IAAI;AAAA,EAAK,cAAAA,QAAM,KAAK,aAAa,CAAC,EAAE;AAC5C,QAAI,cAAc,KAAK;AACnB,cAAQ,IAAI,cAAAA,QAAM,KAAK,QAAQ,WAAW,EAAE,CAAC;AAAA,IACjD;AACA,YAAQ,IAAI,cAAAA,QAAM,KAAK,KAAK,EAAE,UAAU,CAAC;AACzC,YAAQ,IAAI;AAAA,EAAK,cAAAA,QAAM,IAAI,uDAAuD,CAAC,EAAE;AAAA,EACzF,SAAS,OAAO;AACZ,YAAQ,KAAK,cAAAA,QAAM,IAAI,iBAAiB,WAAW,GAAG,CAAC;AACvD,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,YAAQ,MAAM,cAAAA,QAAM,IAAI,YAAY,CAAC;AACrC,YAAQ,IAAI;AAAA,EAAK,cAAAA,QAAM,KAAK,QAAQ,CAAC,EAAE;AACvC,QAAI,cAAc,KAAK;AACnB,cAAQ,IAAI,cAAAA,QAAM,KAAK,QAAQ,WAAW,EAAE,CAAC;AAAA,IACjD;AACA,YAAQ,IAAI,cAAAA,QAAM,KAAK,qBAAqB,CAAC;AAAA,EACjD;AACJ;;;AM5RA,IAAAE,kBAAoB;AACpB,IAAAC,cAAgB;AAChB,IAAAC,eAAiB;AACjB,IAAAC,mBAAe;AACf,IAAAC,sBAA4B;;;ACF5B,IAAAC,mBAAe;AACf,IAAAC,eAAiB;AACjB,IAAAC,gBAAkB;AAGlB,IAAM,mBAA2C;AAAA,EAC7C,MAAM;AAAA,EACN,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACV;AAMO,IAAM,sBAAsB,OAC/B,oBACA,QACC;AACD,MAAI,CAAC,sBAAsB,mBAAmB,WAAW,GAAG;AACxD;AAAA,EACJ;AAEA,QAAM,SAAS,MAAM,eAAe,GAAG;AACvC,QAAM,SAAS,QAAQ,UAAU;AAEjC,aAAW,OAAO,oBAAoB;AAClC,QAAI,QAAQ,YAAY;AACpB,YAAM,WAAW,iBAAAC,QAAG,WAAW,aAAAC,QAAK,KAAK,KAAK,QAAQ,iBAAiB,aAAa,CAAC,CAAC;AACtF,YAAM,cAAc,iBAAAD,QAAG,WAAW,aAAAC,QAAK,KAAK,KAAK,QAAQ,iBAAiB,gBAAgB,CAAC,CAAC;AAE5F,UAAI,YAAY,aAAa;AACzB;AAAA,MACJ;AAEA,cAAQ,IAAI,cAAAC,QAAM,KAAK,sBAAiB,GAAG,qCAAqC,CAAC;AACjF,YAAM,IAAI,UAAU;AACpB;AAAA,IACJ;AAEA,UAAM,YAAY,iBAAiB,GAAG;AACtC,QAAI,CAAC,WAAW;AACZ;AAAA,IACJ;AAEA,QAAI,iBAAAF,QAAG,WAAW,aAAAC,QAAK,KAAK,KAAK,QAAQ,SAAS,CAAC,GAAG;AAClD;AAAA,IACJ;AAEA,YAAQ,IAAI,cAAAC,QAAM,KAAK,yCAAoC,GAAG,KAAK,CAAC;AACpE,UAAM,IAAI,GAAG;AAAA,EACjB;AACJ;;;ADnDA,IAAAC,gBAAkB;AAYlB,IAAM,wBAA4D;AAAA,EAC9D,eAAe;AAAA,EACf,kBAAkB;AACtB;AAEA,SAASC,uBAAsB,aAAqB,QAAgB,MAAoB;AACpF,QAAM,aAAa,aAAAC,QAAK,QAAQ,aAAa,QAAQ,KAAK,MAAM;AAChE,QAAM,iBAAiB,aAAAA,QAAK,QAAQ,WAAW;AAE/C,MAAI,eAAe,kBAAkB,CAAC,WAAW,WAAW,GAAG,cAAc,GAAG,aAAAA,QAAK,GAAG,EAAE,GAAG;AACzF,UAAM,IAAI,MAAM,gDAAgD,KAAK,MAAM,EAAE;AAAA,EACjF;AAEA,SAAO;AACX;AAEA,SAAS,sBAAsB,aAAqB;AAChD,MAAI,iBAAAC,QAAG,WAAW,aAAAD,QAAK,KAAK,aAAa,gBAAgB,CAAC,GAAG;AACzD,WAAO;AAAA,EACX;AAEA,MAAI,iBAAAC,QAAG,WAAW,aAAAD,QAAK,KAAK,aAAa,WAAW,CAAC,KAAK,iBAAAC,QAAG,WAAW,aAAAD,QAAK,KAAK,aAAa,UAAU,CAAC,GAAG;AACzG,WAAO;AAAA,EACX;AAEA,MAAI,iBAAAC,QAAG,WAAW,aAAAD,QAAK,KAAK,aAAa,WAAW,CAAC,GAAG;AACpD,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAEA,SAAS,qBAAqB,OAA2C;AACrE,QAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,MAAI,CAAC,YAAY;AACb,WAAO;AAAA,EACX;AAEA,MAAI,eAAe,QAAQ,eAAe,cAAc,eAAe,gBAAgB,eAAe,eAAe;AACjH,WAAO;AAAA,EACX;AAEA,MAAI,eAAe,WAAW,eAAe,kBAAkB;AAC3D,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAEA,SAAS,iBAAiB,YAAsD;AAC5E,SAAO,eAAe,iBAAiB,eAAe;AAC1D;AAEA,SAAS,oBAAoB,QAAgB,YAAgC;AACzE,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,CAAC,OAAO;AACR,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,MAAI;AACJ,MAAI;AACA,aAAS,IAAI,IAAI,KAAK;AAAA,EAC1B,QAAQ;AACJ,UAAM,IAAI,MAAM,0BAA0B,KAAK,IAAI;AAAA,EACvD;AAEA,QAAM,WAAW,OAAO,SAAS,YAAY;AAC7C,MAAI,eAAe,iBAAiB,aAAa,iBAAiB,aAAa,aAAa;AACxF,UAAM,IAAI,MAAM,6DAA6D;AAAA,EACjF;AAEA,MAAI,eAAe,oBAAoB,aAAa,UAAU;AAC1D,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACxD;AAEA,SAAO;AACX;AAEA,eAAe,+BAA+B,aAAqB,QAAoD;AACnH,QAAM,cAAc,aAAAA,QAAK,KAAK,aAAa,QAAQ,MAAM,UAAU;AACnE,MAAI,CAAC,iBAAAC,QAAG,WAAW,WAAW,GAAG;AAC7B,WAAO;AAAA,EACX;AAEA,QAAM,UAAU,MAAM,iBAAAA,QAAG,SAAS,aAAa,OAAO;AACtD,MAAI,QAAQ,SAAS,2BAA2B,KAAK,QAAQ,SAAS,WAAW,GAAG;AAChF,WAAO;AAAA,EACX;AAEA,MAAI,QAAQ,SAAS,oBAAoB,KAAK,QAAQ,SAAS,cAAc,GAAG;AAC5E,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAEA,eAAe,oBAAoB,aAAqB,QAAwC;AAC5F,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,aAAa,aAAAD,QAAK,KAAK,aAAa,SAAS,WAAW,YAAY,SAAS,EAAE;AACrF,QAAM,aAAa;AAAA,IACf,aAAAA,QAAK,KAAK,aAAa,QAAQ,MAAM,UAAU;AAAA,IAC/C,aAAAA,QAAK,KAAK,aAAa,mBAAmB;AAAA,EAC9C;AAEA,MAAI,SAAS;AACb,aAAW,YAAY,YAAY;AAC/B,QAAI,CAAC,iBAAAC,QAAG,WAAW,QAAQ,GAAG;AAC1B;AAAA,IACJ;AAEA,UAAM,eAAe,aAAAD,QAAK,SAAS,aAAa,QAAQ;AACxD,UAAM,aAAa,aAAAA,QAAK,KAAK,YAAY,YAAY;AACrD,UAAM,iBAAAC,QAAG,UAAU,aAAAD,QAAK,QAAQ,UAAU,CAAC;AAC3C,UAAM,iBAAAC,QAAG,SAAS,UAAU,UAAU;AACtC,aAAS;AAAA,EACb;AAEA,SAAO,SAAS,aAAa;AACjC;AAEA,SAAS,cAAc,YAAgC;AACnD,SAAO,eAAe,gBAAgB,eAAe;AACzD;AAEA,SAAS,qBAAqB,YAAgC,OAAe;AACzE,MAAI;AACA,UAAM,SAAS,IAAI,IAAI,KAAK;AAC5B,UAAM,SAAS,OAAO,SAAS,QAAQ,QAAQ,EAAE,KAAK;AAEtD,QAAI,eAAe,eAAe;AAC9B,aAAO,YAAY,MAAM;AAAA,IAC7B;AAEA,WAAO,2CAA2C,MAAM;AAAA,EAC5D,QAAQ;AACJ,WAAO,eAAe,gBAChB,6BACA;AAAA,EACV;AACJ;AAEA,SAAS,kBAAkB,YAAoB;AAC3C,MAAI,iBAAiB,UAAU,GAAG;AAC9B,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAEA,SAAS,YAAY,OAAe;AAChC,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACtD;AAEA,SAAS,aAAa,QAAgB,MAAc;AAChD,MAAI,OAAO,SAAS,IAAI,GAAG;AACvB,WAAO,EAAE,QAAQ,UAAU,KAAK;AAAA,EACpC;AAEA,QAAM,cAAc;AACpB,MAAI,kBAAkB;AACtB,MAAI;AAEJ,UAAQ,QAAQ,YAAY,KAAK,MAAM,OAAO,MAAM;AAChD,sBAAkB,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,EAC7C;AAEA,MAAI,mBAAmB,GAAG;AACtB,WAAO,EAAE,QAAQ,UAAU,MAAM;AAAA,EACrC;AAEA,SAAO;AAAA,IACH,QAAQ,OAAO,MAAM,GAAG,eAAe,IAAI;AAAA,EAAK,IAAI,KAAK,OAAO,MAAM,eAAe;AAAA,IACrF,UAAU;AAAA,EACd;AACJ;AAEA,eAAe,eAAe,aAAqB,KAA+B;AAC9E,QAAM,UAAU,aAAAD,QAAK,KAAK,aAAa,MAAM;AAC7C,MAAI,CAAC,MAAM,iBAAAC,QAAG,WAAW,OAAO,GAAG;AAC/B,WAAO;AAAA,EACX;AAEA,QAAM,UAAU,MAAM,iBAAAA,QAAG,SAAS,SAAS,OAAO;AAClD,QAAM,UAAU,IAAI,OAAO,IAAI,YAAY,GAAG,CAAC,KAAK,GAAG;AACvD,SAAO,QAAQ,KAAK,OAAO;AAC/B;AAEA,eAAe,uBAAuB,KAA+B;AACjE,QAAM,UAAU,MAAM,iBAAAA,QAAG,QAAQ,GAAG;AACpC,QAAM,UAAU,oBAAI,IAAI,CAAC,aAAa,WAAW,CAAC;AAElD,SAAO,QAAQ,OAAO,CAAC,UAAU,CAAC,QAAQ,IAAI,MAAM,YAAY,CAAC,CAAC,EAAE,WAAW;AACnF;AAEA,eAAe,mBAAmB,aAAqB,QAAgB,gBAAwB;AAC3F,QAAM,kBAAkB,aAAAD,QAAK,KAAK,aAAa,QAAQ,MAAM,UAAU,UAAU;AACjF,MAAI,CAAC,MAAM,iBAAAC,QAAG,WAAW,eAAe,GAAG;AACvC;AAAA,EACJ;AAEA,QAAM,aAAa,oBAAoB,cAAc;AACrD,QAAM,UAAU,MAAM,iBAAAA,QAAG,SAAS,iBAAiB,OAAO;AAC1D,QAAM,aAAa,QAAQ,QAAQ,SAAS,IAAI;AAChD,QAAM,gBAAgB,IAAI;AAAA,IACtB,yCAAyC,YAAY,cAAc,CAAC;AAAA,IACpE;AAAA,EACJ;AAEA,MAAI,cAAc,KAAK,UAAU,GAAG;AAChC;AAAA,EACJ;AAEA,MAAI,OAAO,WACN,QAAQ,+BAA+B,EAAE,EACzC,QAAQ;AAEb,MAAI,KAAK,SAAS,GAAG;AACjB,YAAQ;AAAA,EACZ;AAEA,UAAQ,GAAG,UAAU;AAAA;AACrB,QAAM,iBAAAA,QAAG,UAAU,iBAAiB,IAAI;AAC5C;AAEA,eAAe,sBAAsB,aAAqB,QAAkC;AACxF,SAAO,MAAM,iBAAAA,QAAG,WAAW,aAAAD,QAAK,KAAK,aAAa,QAAQ,OAAO,YAAY,CAAC;AAClF;AAEA,eAAe,sBAAsB,aAAqB,QAAkC;AACxF,SAAO,MAAM,iBAAAC,QAAG,WAAW,aAAAD,QAAK,KAAK,aAAa,QAAQ,OAAO,SAAS,CAAC;AAC/E;AAKA,eAAe,mBAAmB,aAAqB,QAAkC;AACrF,QAAM,UAAU,aAAAA,QAAK,KAAK,aAAa,QAAQ,QAAQ;AAEvD,MAAI,CAAC,iBAAAC,QAAG,WAAW,OAAO,GAAG;AACzB,WAAO;AAAA,EACX;AAEA,MAAI,UAAU,MAAM,iBAAAA,QAAG,SAAS,SAAS,OAAO;AAEhD,QAAM,cAAc;AACpB,QAAM,iBAAiB,QAAQ,SAAS,WAAW;AACnD,QAAM,iBAAiB,oCAAoC,KAAK,OAAO;AACvE,QAAM,cAAc,iCAAiC,KAAK,OAAO;AACjE,MAAI,WAAW;AACf,MAAI,iBAAiB;AAErB,MAAI,CAAC,gBAAgB;AACjB,UAAM,cAAc;AACpB,QAAI,kBAAkB;AACtB,QAAI;AAEJ,YAAQ,QAAQ,YAAY,KAAK,OAAO,OAAO,MAAM;AACjD,wBAAkB,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,IAC7C;AAEA,QAAI,kBAAkB,GAAG;AACrB,gBAAU,QAAQ,MAAM,GAAG,eAAe,IAAI;AAAA,EAAK,WAAW,KAAK,QAAQ,MAAM,eAAe;AAChG,iBAAW;AACX,uBAAiB;AAAA,IACrB;AAAA,EACJ;AAEA,MAAI,gBAAgB,kBAAkB;AACtC,MAAI,CAAC,eAAe;AAChB,UAAM,aAAuB,CAAC;AAC9B,QAAI,CAAC,gBAAgB;AACjB,iBAAW,KAAK,2BAA2B;AAAA,IAC/C;AAEA,QAAI,CAAC,aAAa;AACd,iBAAW,KAAK,wBAAwB;AAAA,IAC5C;AAEA,UAAM,aAAa;AAAA;AAAA,EAAuC,WAAW,KAAK,IAAI,CAAC;AAAA;AAC/E,UAAM,cAAc,QAAQ,MAAM,2BAA2B;AAC7D,QAAI,eAAe,YAAY,UAAU,QAAW;AAChD,gBAAU,QAAQ,MAAM,GAAG,YAAY,KAAK,IAAI,aAAa,OAAO,QAAQ,MAAM,YAAY,KAAK;AACnG,iBAAW;AACX,sBAAgB;AAAA,IACpB;AAAA,EACJ;AAEA,MAAI,UAAU;AACV,UAAM,iBAAAA,QAAG,UAAU,SAAS,OAAO;AAAA,EACvC;AAEA,SAAO,kBAAkB;AAC7B;AAKA,eAAe,iBAAiB,aAAqB,QAAkC;AACnF,QAAM,UAAU,aAAAD,QAAK,KAAK,aAAa,QAAQ,QAAQ;AACvD,MAAI,CAAC,MAAM,iBAAAC,QAAG,WAAW,OAAO,GAAG;AAC/B,WAAO;AAAA,EACX;AAEA,MAAI,aAAa,MAAM,iBAAAA,QAAG,SAAS,SAAS,OAAO;AACnD,QAAM,oBAAoB;AAC1B,QAAM,aAAa;AACnB,QAAM,uBAAuB;AAC7B,QAAM,gBAAgB;AAEtB,MAAI,cAAc;AAElB,aAAW,cAAc,CAAC,mBAAmB,UAAU,GAAG;AACtD,UAAM,OAAO,aAAa,YAAY,UAAU;AAChD,QAAI,CAAC,KAAK,UAAU;AAChB,aAAO;AAAA,IACX;AAEA,QAAI,KAAK,WAAW,YAAY;AAC5B,mBAAa,KAAK;AAClB,oBAAc;AAAA,IAClB;AAAA,EACJ;AAEA,QAAM,eAAe,8BAA8B,KAAK,UAAU,KAC3D,cAAc,KAAK,UAAU;AACpC,MAAI,CAAC,cAAc;AACf,UAAM,gBAAgB;AACtB,UAAM,YAAY,WAAW,OAAO,+CAA+C;AAEnF,QAAI,iBAAiB;AACrB,QAAI,iBAAiB,GAAG;AACpB,YAAM,cAAc,WAAW,OAAO,wCAAwC;AAC9E,uBAAiB;AAAA,IACrB;AAEA,QAAI,iBAAiB,GAAG;AACpB,YAAM,cAAc,WAAW,MAAM,2BAA2B;AAChE,uBAAiB,aAAa,SAAS;AAAA,IAC3C;AAEA,QAAI,iBAAiB,GAAG;AACpB,aAAO;AAAA,IACX;AAEA,iBAAa,WAAW,MAAM,GAAG,cAAc,IAAI,gBAAgB,WAAW,MAAM,cAAc;AAClG,kBAAc;AAAA,EAClB;AAEA,QAAM,iBAAiB,aAAAD,QAAK,KAAK,aAAa,QAAQ,UAAU,UAAU;AAC1E,MAAI,MAAM,iBAAAC,QAAG,WAAW,cAAc,GAAG;AACrC,QAAI,eAAe,MAAM,iBAAAA,QAAG,SAAS,gBAAgB,OAAO;AAC5D,QAAI,gBAAgB;AAEpB,UAAM,mBAAmB,aAAa,cAAc,oBAAoB;AACxE,QAAI,CAAC,iBAAiB,UAAU;AAC5B,aAAO;AAAA,IACX;AAEA,QAAI,iBAAiB,WAAW,cAAc;AAC1C,qBAAe,iBAAiB;AAChC,sBAAgB;AAAA,IACpB;AAEA,UAAM,eAAe,4DAA4D,KAAK,YAAY;AAClG,QAAI,CAAC,cAAc;AACf,YAAM,aAAa;AAAA;AAAA;AAAA;AACnB,YAAM,cAAc,aAAa,MAAM,kCAAkC;AAEzE,UAAI,CAAC,eAAe,YAAY,UAAU,QAAW;AACjD,eAAO;AAAA,MACX;AAEA,qBAAe,aAAa,MAAM,GAAG,YAAY,KAAK,IAAI,aAAa,OAAO,aAAa,MAAM,YAAY,KAAK;AAClH,sBAAgB;AAAA,IACpB;AAEA,QAAI,eAAe;AACf,YAAM,iBAAAA,QAAG,UAAU,gBAAgB,YAAY;AAAA,IACnD;AAAA,EACJ,OAAO;AACH,UAAM,eAAe,0DAA0D,KAAK,UAAU;AAC9F,QAAI,CAAC,cAAc;AACf,YAAM,cAAc,WAAW,MAAM,2BAA2B;AAChE,UAAI,CAAC,eAAe,YAAY,UAAU,QAAW;AACjD,eAAO;AAAA,MACX;AAEA,YAAM,aAAa;AAAA;AAAA;AAAA;AACnB,mBAAa,WAAW,MAAM,GAAG,YAAY,KAAK,IAAI,aAAa,OAAO,WAAW,MAAM,YAAY,KAAK;AAC5G,oBAAc;AAAA,IAClB;AAEA,UAAM,mBAAmB,aAAa,YAAY,aAAa;AAC/D,QAAI,CAAC,iBAAiB,UAAU;AAC5B,aAAO;AAAA,IACX;AAEA,QAAI,iBAAiB,WAAW,YAAY;AACxC,mBAAa,iBAAiB;AAC9B,oBAAc;AAAA,IAClB;AAAA,EACJ;AAEA,MAAI,aAAa;AACb,UAAM,iBAAAA,QAAG,UAAU,SAAS,UAAU;AAAA,EAC1C;AAEA,SAAO;AACX;AAEA,eAAe,iBAAiB,aAAqB,QAAkC;AACnF,QAAM,iBAAiB,aAAAD,QAAK,KAAK,aAAa,QAAQ,UAAU,UAAU;AAC1E,QAAM,cAAc;AACpB,QAAM,oBAAoB;AAE1B,MAAI,MAAM,iBAAAC,QAAG,WAAW,cAAc,GAAG;AACrC,QAAI,eAAe,MAAM,iBAAAA,QAAG,SAAS,gBAAgB,OAAO;AAC5D,QAAI,gBAAgB;AAEpB,UAAM,eAAe,aAAa,cAAc,WAAW;AAC3D,QAAI,CAAC,aAAa,UAAU;AACxB,aAAO;AAAA,IACX;AAEA,QAAI,aAAa,WAAW,cAAc;AACtC,qBAAe,aAAa;AAC5B,sBAAgB;AAAA,IACpB;AAEA,QAAI,CAAC,kBAAkB,KAAK,YAAY,GAAG;AACvC,YAAM,aAAa;AAAA;AAAA;AAAA;AACnB,YAAM,cAAc,aAAa,MAAM,kCAAkC;AACzE,UAAI,CAAC,eAAe,YAAY,UAAU,QAAW;AACjD,eAAO;AAAA,MACX;AAEA,qBAAe,aAAa,MAAM,GAAG,YAAY,KAAK,IAAI,aAAa,OAAO,aAAa,MAAM,YAAY,KAAK;AAClH,sBAAgB;AAAA,IACpB;AAEA,QAAI,eAAe;AACf,YAAM,iBAAAA,QAAG,UAAU,gBAAgB,YAAY;AAAA,IACnD;AAEA,WAAO;AAAA,EACX;AAEA,QAAM,UAAU,aAAAD,QAAK,KAAK,aAAa,QAAQ,QAAQ;AACvD,MAAI,CAAC,MAAM,iBAAAC,QAAG,WAAW,OAAO,GAAG;AAC/B,WAAO;AAAA,EACX;AAEA,MAAI,aAAa,MAAM,iBAAAA,QAAG,SAAS,SAAS,OAAO;AACnD,MAAI,cAAc;AAElB,QAAM,kBAAkB,aAAa,YAAY,gDAAgD;AACjG,MAAI,CAAC,gBAAgB,UAAU;AAC3B,WAAO;AAAA,EACX;AAEA,MAAI,gBAAgB,WAAW,YAAY;AACvC,iBAAa,gBAAgB;AAC7B,kBAAc;AAAA,EAClB;AAEA,QAAM,WAAW,yDAAyD,KAAK,UAAU;AACzF,MAAI,CAAC,UAAU;AACX,UAAM,QAAQ;AAAA;AAAA;AAAA;AACd,UAAM,cAAc,WAAW,MAAM,2BAA2B;AAChE,QAAI,CAAC,eAAe,YAAY,UAAU,QAAW;AACjD,aAAO;AAAA,IACX;AAEA,iBAAa,WAAW,MAAM,GAAG,YAAY,KAAK,IAAI,QAAQ,OAAO,WAAW,MAAM,YAAY,KAAK;AACvG,kBAAc;AAAA,EAClB;AAEA,MAAI,aAAa;AACb,UAAM,iBAAAA,QAAG,UAAU,SAAS,UAAU;AAAA,EAC1C;AAEA,SAAO;AACX;AAEA,eAAe,eAAe,aAAqB,QAAkC;AACjF,QAAM,cAAc,aAAAD,QAAK,KAAK,aAAa,QAAQ,OAAO,YAAY;AACtE,MAAI,CAAC,MAAM,iBAAAC,QAAG,WAAW,WAAW,GAAG;AACnC,WAAO;AAAA,EACX;AAEA,QAAM,aAAa;AACnB,MAAI,UAAU,MAAM,iBAAAA,QAAG,SAAS,aAAa,OAAO;AACpD,MAAI,QAAQ,SAAS,UAAU,GAAG;AAC9B,WAAO;AAAA,EACX;AAEA,QAAM,sBAAsB;AAC5B,MAAI,CAAC,QAAQ,SAAS,mBAAmB,GAAG;AACxC,WAAO;AAAA,EACX;AAEA,QAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBpB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsER,YAAU,QAAQ,QAAQ,qBAAqB,GAAG,SAAS;AAAA,EAAK,mBAAmB,EAAE;AACrF,QAAM,iBAAAA,QAAG,UAAU,aAAa,OAAO;AAEvC,SAAO;AACX;AAEO,IAAM,MAAM,OAAO,YAAoB,UAA6B,CAAC,MAAM;AAC9E,QAAM,cAAc,QAAQ,IAAI;AAChC,QAAM,gBAAgB,MAAM,eAAe,WAAW;AACtD,MAAI,CAAC,eAAe;AAChB,QAAI,MAAM,uBAAuB,WAAW,GAAG;AAC3C,2BAAqB;AACrB;AAAA,IACJ;AAEA,8BAA0B;AAC1B;AAAA,EACJ;AACA,QAAM,SAAS,cAAc,UAAU;AACvC,MAAI,qBAAqB;AACzB,QAAM,gBAAgB,qBAAqB,UAAU;AACrD,MAAI,eAAe;AACf,yBAAqB;AAAA,EACzB;AAEA,MAAI;AACJ,MAAI,mBAAmB;AACvB,MAAI,qBAAoC;AACxC,MAAI,sBAAsB;AAC1B,MAAI,sBAAiD;AACrD,MAAI;AACJ,MAAI,kBAAkB;AACtB,MAAI,iBAAoC;AACxC,MAAI,2BAA2B;AAE/B,MAAI,uBAAuB,YAAY;AACnC,UAAM,kBAAkB,UAAM,gBAAAC,SAAQ;AAAA,MAClC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACL,EAAE,OAAO,cAAc,OAAO,cAAc;AAAA,QAC5C,EAAE,OAAO,SAAS,OAAO,iBAAiB;AAAA,MAC9C;AAAA,IACJ,CAAC;AAED,QAAI,CAAC,gBAAgB,SAAS;AAC1B,cAAQ,IAAI,cAAAC,QAAM,OAAO,sBAAsB,CAAC;AAChD;AAAA,IACJ;AAEA,yBAAqB,gBAAgB;AAAA,EACzC;AAEA,MAAI,iBAAiB,kBAAkB,GAAG;AACtC,UAAM,mBAAmB,MAAM,+BAA+B,aAAa,MAAM;AAEjF,QAAI,oBAAoB,qBAAqB,oBAAoB;AAC7D,cAAQ;AAAA,QACJ,cAAAA,QAAM;AAAA,UACF;AAAA,2CAAyC,cAAc,gBAAgB,CAAC;AAAA,QAC5E;AAAA,MACJ;AACA,cAAQ;AAAA,QACJ,cAAAA,QAAM;AAAA,UACF,kBAAkB,cAAc,kBAAkB,CAAC;AAAA;AAAA,QACvD;AAAA,MACJ;AAEA,YAAM,iBAAiB,UAAM,gBAAAD,SAAQ;AAAA,QACjC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACb,CAAC;AAED,UAAI,CAAC,eAAe,SAAS;AACzB,gBAAQ,IAAI,cAAAC,QAAM,OAAO,sBAAsB,CAAC;AAChD;AAAA,MACJ;AAEA,2BAAqB,MAAM,oBAAoB,aAAa,MAAM;AAAA,IACtE;AAEA,UAAM,aAAa,sBAAsB,kBAAkB;AAC3D,YAAQ,IAAI,cAAAA,QAAM,IAAI,6BAA6B,UAAU;AAAA,CAAI,CAAC;AAElE,UAAM,WAAW,UAAM,gBAAAD,SAAQ;AAAA,MAC3B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AAED,QAAI,SAAS,UAAU,QAAW;AAC9B,cAAQ,IAAI,cAAAC,QAAM,OAAO,sBAAsB,CAAC;AAChD;AAAA,IACJ;AAEA,UAAM,aAAa,SAAS,OAAO,KAAK,KAAK;AAC7C,uBAAmB,WAAW,WAAW;AACzC,kBAAc,oBAAoB,cAAc,YAAY,kBAAkB;AAAA,EAClF;AAEA,MAAI,uBAAuB,UAAU;AACjC,UAAM,mBAAmB,UAAM,gBAAAD,SAAQ;AAAA,MACnC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,QACL,EAAE,OAAO,qBAAqB,aAAa,oCAAoC,OAAO,OAAO;AAAA,QAC7F,EAAE,OAAO,UAAU,aAAa,4BAA4B,OAAO,SAAS;AAAA,MAChF;AAAA,IACJ,CAAC;AAED,QAAI,iBAAiB,aAAa,QAAW;AACzC,cAAQ,IAAI,cAAAC,QAAM,OAAO,sBAAsB,CAAC;AAChD;AAAA,IACJ;AAEA,qBAAiB,iBAAiB;AAElC,YAAQ,IAAI,cAAAA,QAAM,IAAI,2EAA2E,CAAC;AAElG,QAAI,mBAAmB,QAAQ;AAC3B,YAAM,eAAe,UAAM,gBAAAD,SAAQ;AAAA,QAC/B;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACb;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACb;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACb;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QACb;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACb;AAAA,MACJ,CAAC;AAED,UAAI,aAAa,SAAS,QAAW;AACjC,gBAAQ,IAAI,cAAAC,QAAM,OAAO,sBAAsB,CAAC;AAChD;AAAA,MACJ;AAEA,YAAM,OAAO,aAAa,MAAM,KAAK,KAAK;AAC1C,YAAM,OAAO,aAAa,MAAM,KAAK,KAAK;AAC1C,YAAM,OAAO,aAAa,MAAM,KAAK,KAAK;AAC1C,YAAM,OAAO,aAAa,MAAM,KAAK,KAAK;AAC1C,YAAM,OAAO,aAAa,MAAM,KAAK,KAAK;AAE1C,wBAAkB,CAAC,QAAQ,CAAC;AAE5B,UAAI,CAAC,iBAAiB;AAClB,yBAAiB;AAAA,UACb,WAAW,QAAQ;AAAA,UACnB,WAAW;AAAA,UACX,WAAW,QAAQ;AAAA,UACnB,WAAW,QAAQ;AAAA,UACnB,WAAW,QAAQ;AAAA,QACvB;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,YAAM,iBAAiB,UAAM,gBAAAD,SAAQ;AAAA,QACjC;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACb;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACb;AAAA,MACJ,CAAC;AAED,UAAI,eAAe,WAAW,QAAW;AACrC,gBAAQ,IAAI,cAAAC,QAAM,OAAO,sBAAsB,CAAC;AAChD;AAAA,MACJ;AAEA,YAAM,SAAS,eAAe,QAAQ,KAAK,KAAK;AAChD,YAAM,OAAO,eAAe,MAAM,KAAK,KAAK;AAE5C,wBAAkB,CAAC;AAEnB,UAAI,CAAC,iBAAiB;AAClB,yBAAiB;AAAA,UACb,gBAAgB,UAAU;AAAA,UAC1B,WAAW,QAAQ;AAAA,QACvB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,uBAAuB,QAAQ;AAC/B,UAAM,gBAAgB,MAAM,sBAAsB,aAAa,MAAM;AACrE,QAAI,CAAC,eAAe;AAChB,UAAI,QAAQ,KAAK;AACb,mCAA2B;AAAA,MAC/B,OAAO;AACH,cAAM,eAAe,UAAM,gBAAAD,SAAQ;AAAA,UAC/B,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACb,CAAC;AAED,YAAI,aAAa,gBAAgB,QAAW;AACxC,kBAAQ,IAAI,cAAAC,QAAM,OAAO,sBAAsB,CAAC;AAChD;AAAA,QACJ;AAEA,mCAA2B,aAAa;AAAA,MAC5C;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,KAAK,sBAAsB,WAAW;AAC5C,QAAM,cAAU,YAAAC,SAAI,yBAAyB,kBAAkB,KAAK,EAAE,MAAM;AAC5E,MAAI,cAAc;AAElB,MAAI;AACA,YAAQ,OAAO,YAAY,EAAE;AAC7B,UAAM,8BAA8B,EAAE;AAEtC,kBAAc;AACd,YAAQ,OAAO,yBAAyB,kBAAkB;AAC1D,UAAM,kBAAkB,MAAM,cAAc;AAC5C,UAAMC,UAAS,gBAAgB,SAAS,QAAQ,kBAAkB;AAElE,QAAI,CAACA,SAAQ;AACT,cAAQ,KAAK,WAAW,kBAAkB,cAAc;AACxD;AAAA,IACJ;AAEA,YAAQ,QAAQ,iBAAiB,cAAAF,QAAM,KAAK,kBAAkB,CAAC,EAAE;AAEjE,UAAM,aAAaE,QAAO,sBAAsB,CAAC;AACjD,kBAAc;AACd,UAAM,oBAAoB,YAAY,WAAW;AAEjD,kBAAc;AACd,YAAQ,MAAM,4BAA4B;AAE1C,QAAI,cAAcA,QAAO,gBAAgB,CAAC;AAC1C,QAAI,UAAUA,QAAO,mBAAmB,CAAC;AAEzC,QAAI,uBAAuB,UAAU;AACjC,UAAI,mBAAmB,UAAU;AAC7B,sBAAc,CAAC,QAAQ;AACvB,kBAAU,CAAC;AAAA,MACf,OAAO;AACH,sBAAc,CAAC,YAAY;AAC3B,kBAAU,CAAC,mBAAmB;AAAA,MAClC;AAAA,IACJ;AAEA,UAAM,oBAAoB,IAAI,aAAa,WAAW;AACtD,UAAM,oBAAoB,IAAI,SAAS,aAAa,EAAE,KAAK,KAAK,CAAC;AAEjE,YAAQ,QAAQ,wBAAwB;AAExC,kBAAc;AACd,YAAQ,MAAM,sBAAsB;AAEpC,QAAI,uBAAuB,QAAQ;AAC/B,4BAAsB,MAAM,+BAA+B,aAAa,MAAM;AAAA,IAClF;AAEA,eAAW,QAAQA,QAAO,OAAO;AAC7B,UAAI,YAAY,KAAK;AACrB,UAAI,iBAAiB,KAAK;AAC1B,UAAI,eAAe,KAAK;AAExB,UACI,uBAAuB,UACpB,KAAK,WAAW,uBAChB,wBAAwB,kBAC7B;AACE,oBAAY;AACZ,yBAAiB;AACjB,uBAAe;AAAA,MACnB;AAEA,UACI,uBAAuB,YACpB,KAAK,WAAW,mBAChB,mBAAmB,UACxB;AACE,oBAAY;AACZ,yBAAiB;AACjB,uBAAe;AAAA,MACnB;AAEA,UAAI,UAAU,MAAM,UAAU,WAAW;AAAA,QACrC,SAAS,gBAAgB;AAAA,QACzB;AAAA,QACA;AAAA,MACJ,CAAC;AAED,UAAI,iBAAiB,kBAAkB,KAAK,KAAK,WAAW,wBAAwB;AAChF,cAAM,mBAAmB,OAAO,QAAQ,OAAO,GAAG;AAClD,kBAAU,QAAQ;AAAA,UACd;AAAA,UACA,cAAc,gBAAgB;AAAA,QAClC;AAAA,MACJ;AAEA,YAAM,aAAaN,uBAAsB,aAAa,QAAQ,IAAI;AAElE,YAAM,iBAAAE,QAAG,UAAU,aAAAD,QAAK,QAAQ,UAAU,CAAC;AAC3C,YAAM,iBAAAC,QAAG,UAAU,YAAY,OAAO;AAAA,IAC1C;AAEA,UAAM,gBAAgBI,QAAO,MACxB,IAAI,CAAC,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG,CAAC,EAC7C,OAAO,CAAC,WAAW,0BAA0B,KAAK,MAAM,CAAC,EACzD,IAAI,CAAC,WAAW,aAAAL,QAAK,MAAM,SAAS,QAAQ,KAAK,CAAC,EAClD,OAAO,CAAC,SAAS,SAAS,OAAO;AAEtC,eAAW,kBAAkB,eAAe;AACxC,YAAM,mBAAmB,aAAa,QAAQ,cAAc;AAAA,IAChE;AAEA,YAAQ,QAAQ,iBAAiB;AAEjC,QAAI,uBAAuB,QAAQ;AAC/B,cAAQ,MAAM,uBAAuB;AACrC,YAAM,WAAW,MAAM,iBAAiB,aAAa,MAAM;AAC3D,UAAI,UAAU;AACV,gBAAQ,QAAQ,mBAAmB;AAAA,MACvC,OAAO;AACH,gBAAQ,KAAK,0CAA0C;AAAA,MAC3D;AAEA,YAAM,gBAAgB,MAAM,sBAAsB,aAAa,MAAM;AACrE,UAAI,eAAe;AACf,gBAAQ,MAAM,sCAAsC;AACpD,cAAM,mBAAmB,MAAM,eAAe,aAAa,MAAM;AACjE,YAAI,kBAAkB;AAClB,kBAAQ,QAAQ,kCAAkC;AAAA,QACtD,OAAO;AACH,kBAAQ,KAAK,yCAAyC;AAAA,QAC1D;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,uBAAuB,iBAAiB;AACxC,cAAQ,MAAM,wCAAwC;AACtD,YAAM,WAAW,MAAM,mBAAmB,aAAa,MAAM;AAC7D,UAAI,UAAU;AACV,gBAAQ,QAAQ,oCAAoC;AAAA,MACxD,OAAO;AACH,gBAAQ,KAAK,0DAA0D;AAAA,MAC3E;AAAA,IACJ;AAEA,QAAI,uBAAuB,QAAQ;AAC/B,cAAQ,MAAM,4BAA4B;AAC1C,YAAM,WAAW,MAAM,iBAAiB,aAAa,MAAM;AAC3D,UAAI,UAAU;AACV,gBAAQ,QAAQ,wBAAwB;AAAA,MAC5C,OAAO;AACH,gBAAQ,KAAK,+CAA+C;AAAA,MAChE;AAEA,YAAM,gBAAgB,MAAM,sBAAsB,aAAa,MAAM;AACrE,UAAI,eAAe;AACf,gBAAQ,MAAM,sCAAsC;AACpD,cAAM,mBAAmB,MAAM,eAAe,aAAa,MAAM;AACjE,YAAI,kBAAkB;AAClB,kBAAQ,QAAQ,kCAAkC;AAAA,QACtD,OAAO;AACH,kBAAQ,KAAK,yCAAyC;AAAA,QAC1D;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,eAAe;AACnB,QAAI,uBAAuB,YAAY,mBAAmB,UAAU;AAChE,qBAAe;AAAA,IACnB;AAEA,UAAM,YAAY,YAAY,YAAwC;AACtE,QAAI,WAAW;AACX,oBAAc;AACd,cAAQ,MAAM,uCAAuC;AAErD,YAAM,UAAkC,EAAE,GAAG,UAAU,QAAQ;AAC/D,UAAI,eAAe,iBAAiB,kBAAkB,GAAG;AACrD,gBAAQ,eAAe;AAAA,MAC3B;AAEA,UAAI,uBAAuB,YAAY,gBAAgB;AACnD,eAAO,OAAO,SAAS,cAAc;AAAA,MACzC;AAEA,UAAI,uBAAuB,QAAQ;AAC/B,cAAM,oBAAoB,MAAM,eAAe,aAAa,oBAAoB;AAChF,YAAI,CAAC,mBAAmB;AACpB,kBAAQ,yBAAqB,iCAAY,EAAE,EAAE,SAAS,KAAK;AAC3D,gCAAsB;AAAA,QAC1B;AAAA,MACJ;AAEA,YAAM,cAAc,aAAa,SAAS,MAAM;AAAA,QAC5C,mBAAmB,iBAAiB,kBAAkB;AAAA,MAC1D,CAAC;AACD,YAAM,gBAAgB,aAAa,QAAQ,UAAU,YAAY;AAEjE,cAAQ,QAAQ,wBAAwB;AAAA,IAC5C;AAEA,YAAQ,IAAI,cAAAG,QAAM,MAAM;AAAA,SAAO,kBAAkB;AAAA,CAAwB,CAAC;AAE1E,QAAI,oBAAoB;AACpB,cAAQ,IAAI,cAAAA,QAAM,KAAK,6BAAwB,kBAAkB;AAAA,CAAI,CAAC;AAAA,IAC1E;AAEA,UAAM,WAAW,kBAAkB,kBAAkB;AACrD,UAAM,UAAU,yCAAyC,QAAQ;AACjE,YAAQ,IAAI,cAAAA,QAAM,KAAK,gBAAW,OAAO,EAAE,CAAC;AAE5C,QAAI,iBAAiB,kBAAkB,GAAG;AACtC,UAAI,kBAAkB;AAClB,gBAAQ,IAAI,cAAAA,QAAM,OAAO,qEAAgE,CAAC;AAAA,MAC9F;AAEA,YAAM,YAAY;AAAA,QACd;AAAA,QACA,eAAe,sBAAsB,kBAAkB;AAAA,MAC3D;AACA,cAAQ,IAAI,cAAAA,QAAM,OAAO,4BAAuB,SAAS,EAAE,CAAC;AAC5D,cAAQ,IAAI,cAAAA,QAAM,OAAO,4EAAuE,CAAC;AAAA,IACrG;AAEA,QAAI,uBAAuB,QAAQ;AAC/B,UAAI,qBAAqB;AACrB,gBAAQ,IAAI,cAAAA,QAAM,OAAO,wDAAmD,CAAC;AAAA,MACjF,OAAO;AACH,gBAAQ,IAAI,cAAAA,QAAM,OAAO,+DAA0D,CAAC;AAAA,MACxF;AAEA,cAAQ,IAAI,cAAAA,QAAM,OAAO,4EAAuE,CAAC;AAAA,IACrG;AAEA,QAAI,uBAAuB,UAAU;AACjC,UAAI,iBAAiB;AACjB,gBAAQ,IAAI,cAAAA,QAAM,OAAO,wFAA8E,CAAC;AAAA,MAC5G,OAAO;AACH,gBAAQ,IAAI,cAAAA,QAAM,OAAO,wEAAmE,CAAC;AAAA,MACjG;AAAA,IACJ;AAEA,QAAI,uBAAuB,QAAQ;AAC/B,cAAQ,IAAI,cAAAA,QAAM,OAAO,yCAAoC,CAAC;AAC9D,cAAQ,IAAI,cAAAA,QAAM,OAAO,0DAAqD,CAAC;AAAA,IACnF;AAEA,QAAI,uBAAuB,UAAU,0BAA0B;AAC3D,cAAQ,IAAI,cAAAA,QAAM,KAAK,wCAAmC,CAAC;AAC3D,YAAM,IAAI,QAAQ,EAAE,KAAK,KAAK,CAAC;AAAA,IACnC;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,KAAK,cAAAA,QAAM,IAAI,iBAAiB,WAAW,GAAG,CAAC;AACvD,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,YAAQ,MAAM,cAAAA,QAAM,IAAI,YAAY,CAAC;AACrC,YAAQ,IAAI;AAAA,EAAK,cAAAA,QAAM,KAAK,QAAQ,CAAC,EAAE;AACvC,YAAQ,IAAI,cAAAA,QAAM,KAAK,sBAAsB,kBAAkB,EAAE,CAAC;AAAA,EACtE;AACJ;;;APtkCA,IAAM,UAAU,IAAI,yBAAQ;AAE5B,QACK,KAAK,UAAU,EACf,YAAY,eAAe,EAC3B,QAAQ,OAAO;AAEpB,QACK,QAAQ,MAAM,EACd,YAAY,+BAA+B,EAC3C,OAAO,IAAI;AAEhB,QACK,QAAQ,cAAc,EACtB,YAAY,8BAA8B,EAC1C,OAAO,CAACG,SAAQ,YAAY,IAAIA,SAAQ,OAAO,CAAC;AAErD,QAAQ,MAAM,QAAQ,IAAI;","names":["import_chalk","import_fs_extra","import_path","path","fs","import_fs_extra","import_path","path","fs","os","import_fs_extra","import_path","path","fs","chalk","path","fs","prompts","chalk","ora","import_prompts","import_ora","import_path","import_fs_extra","import_node_crypto","import_fs_extra","import_path","import_chalk","fs","path","chalk","import_chalk","resolveSafeTargetPath","path","fs","prompts","chalk","ora","module","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/code-inject.ts","../src/handlers/database.handler.ts","../src/handlers/docs.handler.ts","../src/index.ts","../src/commands/init.ts","../src/utils/registry.ts","../src/utils/pm.ts","../src/utils/env-manager.ts","../src/utils/config.ts","../src/utils/project-guard.ts","../src/commands/add.ts","../src/utils/dependency.ts","../src/utils/paths.ts","../src/handlers/auth.handler.ts","../src/handlers/mailer.handler.ts","../src/handlers/error-handler.handler.ts","../src/handlers/rate-limiter.handler.ts","../src/handlers/uploads.handler.ts"],"sourcesContent":["/**\n * Escapes special regex characters in a string so it can be used\n * as a literal pattern inside a RegExp.\n */\nexport function escapeRegex(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Inserts an import statement after the last existing import in the source.\n * Returns `{ source, inserted }` — `inserted` is false only when no\n * existing imports could be found (malformed file).\n *\n * If the import already exists, returns the original source with `inserted: true`.\n */\nexport function appendImport(source: string, line: string) {\n if (source.includes(line)) {\n return { source, inserted: true };\n }\n\n const importRegex = /^import .+ from .+;?\\s*$/gm;\n let lastImportIndex = 0;\n let match;\n\n while ((match = importRegex.exec(source)) !== null) {\n lastImportIndex = match.index + match[0].length;\n }\n\n if (lastImportIndex <= 0) {\n return { source, inserted: false };\n }\n\n return {\n source: source.slice(0, lastImportIndex) + `\\n${line}` + source.slice(lastImportIndex),\n inserted: true,\n };\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport chalk from \"chalk\";\nimport { escapeRegex } from \"../utils/code-inject\";\n\nexport type DatabaseOrm = \"drizzle\" | \"prisma\";\nexport type DatabaseDialect = \"postgresql\" | \"mysql\";\nexport type DatabaseModuleName =\n | \"database-pg\"\n | \"database-mysql\"\n | \"database-prisma-pg\"\n | \"database-prisma-mysql\";\n\nconst DATABASE_MODULE_MAP: Record<DatabaseOrm, Record<DatabaseDialect, DatabaseModuleName>> = {\n drizzle: {\n postgresql: \"database-pg\",\n mysql: \"database-mysql\",\n },\n prisma: {\n postgresql: \"database-prisma-pg\",\n mysql: \"database-prisma-mysql\",\n },\n};\n\nexport const DEFAULT_DATABASE_URLS: Record<DatabaseModuleName, string> = {\n \"database-pg\": \"postgresql://postgres@localhost:5432/mydb\",\n \"database-mysql\": \"mysql://root@localhost:3306/mydb\",\n \"database-prisma-pg\": \"postgresql://postgres@localhost:5432/mydb\",\n \"database-prisma-mysql\": \"mysql://root@localhost:3306/mydb\",\n};\n\nexport function parseDatabaseDialect(value?: string): DatabaseModuleName | null {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) {\n return null;\n }\n\n if (\n normalized === \"pg\"\n || normalized === \"postgres\"\n || normalized === \"postgresql\"\n || normalized === \"database-pg\"\n || normalized === \"drizzle-pg\"\n || normalized === \"drizzle-postgres\"\n || normalized === \"database-drizzle-pg\"\n ) {\n return \"database-pg\";\n }\n\n if (\n normalized === \"mysql\"\n || normalized === \"database-mysql\"\n || normalized === \"drizzle-mysql\"\n || normalized === \"database-drizzle-mysql\"\n ) {\n return \"database-mysql\";\n }\n\n if (\n normalized === \"database-prisma-pg\"\n || normalized === \"prisma-pg\"\n || normalized === \"prisma-postgres\"\n || normalized === \"prisma-postgresql\"\n || normalized === \"database-prisma\"\n ) {\n return \"database-prisma-pg\";\n }\n\n if (normalized === \"database-prisma-mysql\" || normalized === \"prisma-mysql\") {\n return \"database-prisma-mysql\";\n }\n\n return null;\n}\n\nexport function isDatabaseModule(moduleName: string): moduleName is DatabaseModuleName {\n return (\n moduleName === \"database-pg\"\n || moduleName === \"database-mysql\"\n || moduleName === \"database-prisma-pg\"\n || moduleName === \"database-prisma-mysql\"\n );\n}\n\nexport function isDrizzleDatabaseModule(moduleName: string): moduleName is \"database-pg\" | \"database-mysql\" {\n return moduleName === \"database-pg\" || moduleName === \"database-mysql\";\n}\n\nexport function getDatabaseSelection(moduleName: DatabaseModuleName): { orm: DatabaseOrm; dialect: DatabaseDialect } {\n if (moduleName === \"database-pg\") {\n return { orm: \"drizzle\", dialect: \"postgresql\" };\n }\n\n if (moduleName === \"database-mysql\") {\n return { orm: \"drizzle\", dialect: \"mysql\" };\n }\n\n if (moduleName === \"database-prisma-pg\") {\n return { orm: \"prisma\", dialect: \"postgresql\" };\n }\n\n return { orm: \"prisma\", dialect: \"mysql\" };\n}\n\nfunction getDatabaseModule(orm: DatabaseOrm, dialect: DatabaseDialect): DatabaseModuleName {\n return DATABASE_MODULE_MAP[orm][dialect];\n}\n\nfunction parsePrismaProvider(schemaContent: string): DatabaseDialect | null {\n const match = schemaContent.match(/provider\\s*=\\s*\"([^\"]+)\"/);\n if (!match) {\n return null;\n }\n\n const provider = match[1]?.trim().toLowerCase();\n if (provider === \"mysql\") {\n return \"mysql\";\n }\n\n if (provider === \"postgresql\" || provider === \"postgres\") {\n return \"postgresql\";\n }\n\n return null;\n}\n\nexport function validateDatabaseUrl(rawUrl: string, moduleName: DatabaseModuleName) {\n const { dialect } = getDatabaseSelection(moduleName);\n const dbUrl = rawUrl.trim();\n if (!dbUrl) {\n throw new Error(\"Database URL cannot be empty.\");\n }\n\n let parsed: URL;\n try {\n parsed = new URL(dbUrl);\n } catch {\n throw new Error(`Invalid database URL: '${dbUrl}'.`);\n }\n\n const protocol = parsed.protocol.toLowerCase();\n if (dialect === \"postgresql\" && protocol !== \"postgresql:\" && protocol !== \"postgres:\") {\n throw new Error(\"PostgreSQL URL must start with postgres:// or postgresql://\");\n }\n\n if (dialect === \"mysql\" && protocol !== \"mysql:\") {\n throw new Error(\"MySQL URL must start with mysql://\");\n }\n\n return dbUrl;\n}\n\nexport async function detectInstalledDatabaseDialect(projectRoot: string, srcDir: string): Promise<DatabaseModuleName | null> {\n const dbIndexPath = path.join(projectRoot, srcDir, \"db\", \"index.ts\");\n const prismaSchemaPath = path.join(projectRoot, \"prisma\", \"schema.prisma\");\n\n if (fs.existsSync(dbIndexPath)) {\n const content = await fs.readFile(dbIndexPath, \"utf-8\");\n if (content.includes(\"drizzle-orm/node-postgres\") || content.includes(`from \"pg\"`)) {\n return \"database-pg\";\n }\n\n if (content.includes(\"drizzle-orm/mysql2\") || content.includes(`from \"mysql2`)) {\n return \"database-mysql\";\n }\n\n if (content.includes(`from \"@prisma/client\"`)) {\n if (fs.existsSync(prismaSchemaPath)) {\n const schemaContent = await fs.readFile(prismaSchemaPath, \"utf-8\");\n const dialect = parsePrismaProvider(schemaContent);\n if (dialect === \"mysql\") {\n return \"database-prisma-mysql\";\n }\n }\n\n return \"database-prisma-pg\";\n }\n }\n\n if (fs.existsSync(prismaSchemaPath)) {\n const schemaContent = await fs.readFile(prismaSchemaPath, \"utf-8\");\n const dialect = parsePrismaProvider(schemaContent);\n if (dialect === \"mysql\") {\n return \"database-prisma-mysql\";\n }\n\n return \"database-prisma-pg\";\n }\n\n return null;\n}\n\nexport async function backupDatabaseFiles(projectRoot: string, srcDir: string): Promise<string | null> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupRoot = path.join(projectRoot, \".zuro\", \"backups\", `database-${timestamp}`);\n const candidates = [\n path.join(projectRoot, srcDir, \"db\", \"index.ts\"),\n path.join(projectRoot, \"drizzle.config.ts\"),\n path.join(projectRoot, \"prisma\", \"schema.prisma\"),\n ];\n\n let copied = false;\n for (const filePath of candidates) {\n if (!fs.existsSync(filePath)) {\n continue;\n }\n\n const relativePath = path.relative(projectRoot, filePath);\n const backupPath = path.join(backupRoot, relativePath);\n await fs.ensureDir(path.dirname(backupPath));\n await fs.copyFile(filePath, backupPath);\n copied = true;\n }\n\n return copied ? backupRoot : null;\n}\n\nexport function databaseLabel(moduleName: DatabaseModuleName) {\n const selection = getDatabaseSelection(moduleName);\n const ormLabel = selection.orm === \"drizzle\" ? \"Drizzle\" : \"Prisma\";\n const dialectLabel = selection.dialect === \"postgresql\" ? \"PostgreSQL\" : \"MySQL\";\n return `${ormLabel} (${dialectLabel})`;\n}\n\nexport function getDatabaseSetupHint(moduleName: DatabaseModuleName, dbUrl: string) {\n try {\n const parsed = new URL(dbUrl);\n const dbName = parsed.pathname.replace(/^\\/+/, \"\") || \"mydb\";\n\n if (moduleName === \"database-pg\") {\n return `createdb ${dbName}`;\n }\n\n return `mysql -e \"CREATE DATABASE IF NOT EXISTS ${dbName};\"`;\n } catch {\n return moduleName === \"database-pg\"\n ? \"createdb <database_name>\"\n : `mysql -e \"CREATE DATABASE IF NOT EXISTS <database_name>;\"`;\n }\n}\n\nexport async function ensureSchemaExport(projectRoot: string, srcDir: string, schemaFileName: string) {\n const schemaIndexPath = path.join(projectRoot, srcDir, \"db\", \"schema\", \"index.ts\");\n if (!await fs.pathExists(schemaIndexPath)) {\n return;\n }\n\n const exportLine = `export * from \"./${schemaFileName}\";`;\n const content = await fs.readFile(schemaIndexPath, \"utf-8\");\n const normalized = content.replace(/\\r\\n/g, \"\\n\");\n const exportPattern = new RegExp(\n `^\\\\s*export\\\\s*\\\\*\\\\s*from\\\\s*[\"']\\\\./${escapeRegex(schemaFileName)}[\"'];?\\\\s*$`,\n \"m\"\n );\n\n if (exportPattern.test(normalized)) {\n return;\n }\n\n let next = normalized\n .replace(/^\\s*export\\s*\\{\\s*\\};?\\s*$/m, \"\")\n .trimEnd();\n\n if (next.length > 0) {\n next += \"\\n\\n\";\n }\n\n next += `${exportLine}\\n`;\n await fs.writeFile(schemaIndexPath, next);\n}\n\nexport interface DatabasePromptResult {\n resolvedModuleName: DatabaseModuleName;\n selectedOrm: DatabaseOrm;\n selectedDialect: DatabaseDialect;\n customDbUrl: string | undefined;\n usedDefaultDbUrl: boolean;\n databaseBackupPath: string | null;\n}\n\n/**\n * Runs all database-specific interactive prompts and validation.\n * Returns null if the user cancels.\n */\nexport async function promptDatabaseConfig(\n initialModuleName: string,\n projectRoot: string,\n srcDir: string,\n): Promise<DatabasePromptResult | null> {\n let resolvedModuleName: DatabaseModuleName;\n\n if (initialModuleName === \"database\") {\n const ormResponse = await prompts({\n type: \"select\",\n name: \"orm\",\n message: \"Which ORM?\",\n choices: [\n { title: \"Drizzle\", value: \"drizzle\" },\n { title: \"Prisma\", value: \"prisma\" },\n ],\n initial: 0,\n });\n\n if (!ormResponse.orm) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n const variantResponse = await prompts({\n type: \"select\",\n name: \"dialect\",\n message: \"Which database dialect?\",\n choices: [\n { title: \"PostgreSQL\", value: \"postgresql\" },\n { title: \"MySQL\", value: \"mysql\" },\n ],\n });\n\n if (!variantResponse.dialect) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n resolvedModuleName = getDatabaseModule(ormResponse.orm as DatabaseOrm, variantResponse.dialect as DatabaseDialect);\n } else {\n const parsed = parseDatabaseDialect(initialModuleName);\n if (!parsed) {\n throw new Error(`Unsupported database module '${initialModuleName}'.`);\n }\n\n resolvedModuleName = parsed;\n }\n\n const { orm: selectedOrm, dialect: selectedDialect } = getDatabaseSelection(resolvedModuleName);\n\n // Check for dialect switch\n let databaseBackupPath: string | null = null;\n const installedDialect = await detectInstalledDatabaseDialect(projectRoot, srcDir);\n\n if (installedDialect && installedDialect !== resolvedModuleName) {\n console.log(\n chalk.yellow(\n `\\n⚠ Existing database setup detected: ${databaseLabel(installedDialect)}.`\n )\n );\n console.log(\n chalk.yellow(\n ` Switching to ${databaseLabel(resolvedModuleName)} will overwrite db files and drizzle config.\\n`\n )\n );\n\n const switchResponse = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: \"Continue and switch database dialect?\",\n initial: false,\n });\n\n if (!switchResponse.proceed) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n databaseBackupPath = await backupDatabaseFiles(projectRoot, srcDir);\n }\n\n // Prompt for database URL\n const defaultUrl = DEFAULT_DATABASE_URLS[resolvedModuleName];\n console.log(chalk.dim(` Tip: Leave blank to use ${defaultUrl}\\n`));\n\n const response = await prompts({\n type: \"text\",\n name: \"dbUrl\",\n message: \"Database URL\",\n initial: \"\",\n });\n\n if (response.dbUrl === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n const enteredUrl = response.dbUrl?.trim() || \"\";\n const usedDefaultDbUrl = enteredUrl.length === 0;\n const customDbUrl = validateDatabaseUrl(enteredUrl || defaultUrl, resolvedModuleName);\n\n return {\n resolvedModuleName,\n selectedOrm,\n selectedDialect,\n customDbUrl,\n usedDefaultDbUrl,\n databaseBackupPath,\n };\n}\n\n/**\n * Prints post-install hints for database modules.\n */\nexport function printDatabaseHints(\n moduleName: DatabaseModuleName,\n customDbUrl: string | undefined,\n usedDefaultDbUrl: boolean,\n databaseBackupPath: string | null,\n) {\n if (databaseBackupPath) {\n console.log(chalk.blue(`ℹ Backup created at: ${databaseBackupPath}\\n`));\n }\n\n if (usedDefaultDbUrl) {\n console.log(chalk.yellow(\"ℹ Review DATABASE_URL in .env if your local DB config differs.\"));\n }\n\n const setupHint = getDatabaseSetupHint(\n moduleName,\n customDbUrl || DEFAULT_DATABASE_URLS[moduleName]\n );\n console.log(chalk.yellow(`ℹ Ensure DB exists: ${setupHint}`));\n if (isDrizzleDatabaseModule(moduleName)) {\n console.log(chalk.yellow(\"ℹ Run migrations: npx drizzle-kit generate && npx drizzle-kit migrate\"));\n return;\n }\n\n console.log(chalk.yellow(\"ℹ Run migrations: npx prisma migrate dev --name init\"));\n console.log(chalk.yellow(\"ℹ Generate client: npx prisma generate\"));\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport { appendImport } from \"../utils/code-inject\";\n\n/**\n * Checks if the docs module is installed by looking for lib/openapi.ts.\n */\nexport async function isDocsModuleInstalled(projectRoot: string, srcDir: string): Promise<boolean> {\n return await fs.pathExists(path.join(projectRoot, srcDir, \"lib\", \"openapi.ts\"));\n}\n\n/**\n * Injects docs routes into routes/index.ts or app.ts.\n */\nexport async function injectDocsRoutes(projectRoot: string, srcDir: string): Promise<boolean> {\n const routeIndexPath = path.join(projectRoot, srcDir, \"routes\", \"index.ts\");\n const routeImport = `import docsRoutes from \"./docs.routes\";`;\n const routeMountPattern = /rootRouter\\.use\\(\\s*[\"']\\/docs[\"']\\s*,\\s*docsRoutes\\s*\\)/;\n\n if (await fs.pathExists(routeIndexPath)) {\n let routeContent = await fs.readFile(routeIndexPath, \"utf-8\");\n let routeModified = false;\n\n const importResult = appendImport(routeContent, routeImport);\n if (!importResult.inserted) {\n return false;\n }\n\n if (importResult.source !== routeContent) {\n routeContent = importResult.source;\n routeModified = true;\n }\n\n if (!routeMountPattern.test(routeContent)) {\n const routeSetup = `\\n// API docs\\nrootRouter.use(\"/docs\", docsRoutes);\\n`;\n const exportMatch = routeContent.match(/export default rootRouter;?\\s*$/m);\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n routeContent = routeContent.slice(0, exportMatch.index) + routeSetup + \"\\n\" + routeContent.slice(exportMatch.index);\n routeModified = true;\n }\n\n if (routeModified) {\n await fs.writeFile(routeIndexPath, routeContent);\n }\n\n return true;\n }\n\n const appPath = path.join(projectRoot, srcDir, \"app.ts\");\n if (!await fs.pathExists(appPath)) {\n return false;\n }\n\n let appContent = await fs.readFile(appPath, \"utf-8\");\n let appModified = false;\n\n const appImportResult = appendImport(appContent, `import docsRoutes from \"./routes/docs.routes\";`);\n if (!appImportResult.inserted) {\n return false;\n }\n\n if (appImportResult.source !== appContent) {\n appContent = appImportResult.source;\n appModified = true;\n }\n\n const hasMount = /app\\.use\\(\\s*[\"']\\/api\\/docs[\"']\\s*,\\s*docsRoutes\\s*\\)/.test(appContent);\n if (!hasMount) {\n const setup = `\\n// API docs\\napp.use(\"/api/docs\", docsRoutes);\\n`;\n const exportMatch = appContent.match(/export default app;?\\s*$/m);\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n appContent = appContent.slice(0, exportMatch.index) + setup + \"\\n\" + appContent.slice(exportMatch.index);\n appModified = true;\n }\n\n if (appModified) {\n await fs.writeFile(appPath, appContent);\n }\n\n return true;\n}\n\n/**\n * Prints post-install hints for the docs module.\n */\nexport function printDocsHints() {\n const chalk = require(\"chalk\");\n console.log(chalk.yellow(\"ℹ API docs available at: /api/docs\"));\n console.log(chalk.yellow(\"ℹ OpenAPI spec available at: /api/docs/openapi.json\"));\n}\n","#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { init } from \"./commands/init\";\nimport { add } from \"./commands/add\";\n\nconst program = new Command();\n\nprogram\n .name(\"zuro-cli\")\n .description(\"Zuro CLI tool\")\n .version(\"0.0.1\");\n\nprogram\n .command(\"init\")\n .description(\"Initialize a new Zuro project\")\n .action(init);\n\nprogram\n .command(\"add <module>\")\n .description(\"Add a module to your project\")\n .action((module, options) => add(module, options));\n\nprogram.parse(process.argv);\n","import ora from \"ora\";\nimport chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport prompts from \"prompts\";\nimport { execSync } from \"child_process\";\nimport { fetchRegistry, fetchFile, RegistryFile } from \"../utils/registry\";\nimport { initPackageJson, installDependencies, ensurePackageManagerAvailable } from \"../utils/pm\";\nimport { createInitialEnv } from \"../utils/env-manager\";\nimport { readZuroConfig, writeZuroConfig } from \"../utils/config\";\nimport { showNonZuroProjectMessage } from \"../utils/project-guard\";\nimport type { ZuroConfig } from \"../utils/config\";\n\nfunction resolveSafeTargetPath(projectRoot: string, srcDir: string, file: RegistryFile) {\n const relativeTargetPath = path.join(srcDir, file.target);\n const targetPath = path.resolve(projectRoot, relativeTargetPath);\n const normalizedRoot = path.resolve(projectRoot);\n\n if (targetPath !== normalizedRoot && !targetPath.startsWith(`${normalizedRoot}${path.sep}`)) {\n throw new Error(`Refusing to write outside project directory: ${file.target}`);\n }\n\n return {\n relativeTargetPath,\n targetPath,\n };\n}\n\nasync function ensureSafeTargetDirectory(targetDir: string, cwd: string, projectName: string) {\n await fs.ensureDir(targetDir);\n const entries = await fs.readdir(targetDir);\n\n if (entries.length === 0) {\n return true;\n }\n\n const isCurrentFolder = targetDir === cwd;\n const response = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: isCurrentFolder\n ? `Current folder '${projectName}' is not empty. Continue anyway?`\n : `Target folder '${projectName}' already exists and is not empty. Continue anyway?`,\n initial: false,\n });\n\n return response.proceed === true;\n}\n\nasync function setupPrettier(targetDir: string) {\n const prettierConfigPath = path.join(targetDir, \".prettierrc\");\n const prettierIgnorePath = path.join(targetDir, \".prettierignore\");\n\n if (!await fs.pathExists(prettierConfigPath)) {\n const prettierConfig = {\n semi: true,\n singleQuote: false,\n trailingComma: \"es5\",\n printWidth: 100,\n tabWidth: 2,\n };\n await fs.writeJson(prettierConfigPath, prettierConfig, { spaces: 2 });\n }\n\n if (!await fs.pathExists(prettierIgnorePath)) {\n const ignoreContent = `node_modules\ndist\nbuild\ncoverage\n.next\npnpm-lock.yaml\npackage-lock.json\nbun.lock\nbun.lockb\n`;\n await fs.writeFile(prettierIgnorePath, ignoreContent);\n }\n}\n\nasync function setupGitignore(targetDir: string) {\n const gitignorePath = path.join(targetDir, \".gitignore\");\n\n if (await fs.pathExists(gitignorePath)) {\n return;\n }\n\n const gitignoreContent = `# dependencies\nnode_modules\n\n# build output\ndist\nbuild\n\n# environment variables\n.env\n.env.*\n!.env.example\n\n# logs\n*.log\nnpm-debug.log*\npnpm-debug.log*\n\n# coverage\ncoverage\n\n# OS files\n.DS_Store\nThumbs.db\n\n# IDE\n.vscode\n.idea\n*.swp\n*.swo\n`;\n await fs.writeFile(gitignorePath, gitignoreContent);\n}\n\nfunction tryGitInit(targetDir: string) {\n try {\n // Skip if already inside a git repo\n execSync(\"git rev-parse --is-inside-work-tree\", {\n cwd: targetDir,\n stdio: \"ignore\",\n });\n return; // already in a git repo\n } catch {\n // not in a git repo — proceed to init\n }\n\n try {\n execSync(\"git init\", { cwd: targetDir, stdio: \"ignore\" });\n execSync(\"git add -A\", { cwd: targetDir, stdio: \"ignore\" });\n execSync('git commit -m \"Initial commit from zuro-cli\"', {\n cwd: targetDir,\n stdio: \"ignore\",\n });\n } catch {\n // git not installed or commit failed — silently skip\n }\n}\n\nexport async function init() {\n const cwd = process.cwd();\n const isExistingProject = await fs.pathExists(path.join(cwd, \"package.json\"));\n const existingZuroConfig = await readZuroConfig(cwd);\n\n if (isExistingProject && !existingZuroConfig) {\n showNonZuroProjectMessage();\n return;\n }\n\n let targetDir = cwd;\n let pm = \"npm\";\n let srcDir = \"src\";\n let projectName = path.basename(cwd);\n let enablePrettier = false;\n\n if (isExistingProject) {\n console.log(chalk.blue(\"ℹ Existing project detected.\"));\n\n projectName = path.basename(cwd);\n\n if (await fs.pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) {\n pm = \"pnpm\";\n } else if (await fs.pathExists(path.join(cwd, \"bun.lockb\"))) {\n pm = \"bun\";\n } else if (await fs.pathExists(path.join(cwd, \"yarn.lock\"))) {\n pm = \"yarn\";\n }\n\n const response = await prompts({\n type: \"text\",\n name: \"srcDir\",\n message: \"Where is your source code located?\",\n initial: \"src\",\n });\n\n srcDir = response.srcDir || \"src\";\n } else {\n console.log(chalk.dim(` Tip: Leave blank to use current folder (${path.basename(cwd)})\\n`));\n\n const response = await prompts([\n {\n type: \"text\",\n name: \"path\",\n message: \"Project name (blank for current folder)\",\n initial: \"\",\n },\n {\n type: \"select\",\n name: \"pm\",\n message: \"Package Manager?\",\n choices: [\n { title: \"npm\", value: \"npm\" },\n { title: \"pnpm\", value: \"pnpm\" },\n { title: \"bun\", value: \"bun\" },\n ],\n initial: 0,\n },\n {\n type: \"confirm\",\n name: \"prettier\",\n message: \"Setup Prettier?\",\n initial: true,\n },\n ]);\n\n if (response.pm === undefined) {\n console.log(chalk.red(\"Operation cancelled.\"));\n return;\n }\n\n pm = response.pm;\n enablePrettier = response.prettier === true;\n srcDir = \"src\";\n\n if (!response.path || response.path.trim() === \"\") {\n projectName = path.basename(cwd);\n targetDir = cwd;\n console.log(chalk.blue(`ℹ Using current folder: ${projectName}`));\n } else {\n projectName = response.path.trim();\n targetDir = path.resolve(cwd, projectName);\n }\n\n const isSafeTarget = await ensureSafeTargetDirectory(targetDir, cwd, projectName);\n if (!isSafeTarget) {\n console.log(chalk.red(\"Operation cancelled.\"));\n return;\n }\n }\n\n const existingConfig = targetDir === cwd ? existingZuroConfig : await readZuroConfig(targetDir);\n\n const zuroConfig: ZuroConfig = {\n name: projectName,\n pm,\n srcDir: srcDir || existingConfig?.srcDir || \"src\",\n };\n\n const spinner = ora(\"Connecting to Zuro Registry...\").start();\n let currentStep = \"package manager preflight\";\n\n try {\n spinner.text = `Checking ${pm} availability...`;\n await ensurePackageManagerAvailable(pm);\n\n currentStep = \"registry fetch\";\n spinner.text = \"Connecting to Zuro Registry...\";\n const registryContext = await fetchRegistry();\n\n const coreModule = registryContext.manifest.modules.core;\n\n if (!coreModule) {\n spinner.fail(\"Core module not found in registry.\");\n return;\n }\n\n currentStep = \"project initialization\";\n spinner.text = \"Initializing project...\";\n\n const hasPackageJson = await fs.pathExists(path.join(targetDir, \"package.json\"));\n if (!hasPackageJson) {\n await initPackageJson(targetDir, true, projectName, srcDir, { enablePrettier });\n }\n\n currentStep = \"dependency installation\";\n spinner.text = `Installing dependencies using ${pm}...`;\n\n let runtimeDeps: string[] = [];\n let devDeps: string[] = [];\n\n if (isExistingProject) {\n const safeDeps = [\"zod\", \"dotenv\"];\n const coreDeps = coreModule.dependencies || [];\n runtimeDeps = coreDeps.filter((dependency) => safeDeps.includes(dependency));\n devDeps = coreModule.devDependencies || [];\n } else {\n runtimeDeps = coreModule.dependencies || [];\n devDeps = coreModule.devDependencies || [];\n }\n\n await installDependencies(pm, runtimeDeps, targetDir);\n await installDependencies(pm, devDeps, targetDir, { dev: true });\n\n if (enablePrettier) {\n await installDependencies(pm, [\"prettier\"], targetDir, { dev: true });\n }\n\n currentStep = \"module file generation\";\n spinner.text = \"Fetching core module files...\";\n\n for (const file of coreModule.files) {\n const { relativeTargetPath, targetPath } = resolveSafeTargetPath(targetDir, srcDir, file);\n const fileName = path.basename(targetPath);\n\n if (isExistingProject) {\n if (fileName === \"app.ts\" || fileName === \"server.ts\") {\n continue;\n }\n\n const relativeParts = relativeTargetPath.split(path.sep);\n const isSafe = fileName === \"env.ts\" || relativeParts.includes(\"lib\");\n if (!isSafe) {\n continue;\n }\n }\n\n const content = await fetchFile(file.path, {\n baseUrl: registryContext.fileBaseUrl,\n expectedSha256: file.sha256,\n expectedSize: file.size,\n });\n\n await fs.ensureDir(path.dirname(targetPath));\n await fs.writeFile(targetPath, content);\n }\n\n currentStep = \"environment file setup\";\n await createInitialEnv(targetDir);\n\n if (enablePrettier) {\n currentStep = \"prettier setup\";\n await setupPrettier(targetDir);\n }\n\n currentStep = \"gitignore setup\";\n spinner.text = \"Setting up .gitignore...\";\n await setupGitignore(targetDir);\n\n currentStep = \"config write\";\n await writeZuroConfig(targetDir, zuroConfig);\n\n if (!isExistingProject) {\n currentStep = \"git init\";\n spinner.text = \"Initializing git repository...\";\n tryGitInit(targetDir);\n }\n\n spinner.succeed(chalk.green(\"Project initialized successfully!\"));\n\n console.log(`\\n${chalk.bold(\"Next steps:\")}`);\n if (targetDir !== cwd) {\n console.log(chalk.cyan(` cd ${projectName}`));\n }\n console.log(chalk.cyan(` ${pm} run dev`));\n console.log(`\\n${chalk.dim(\"Add modules: zuro-cli add database, zuro-cli add auth\")}`);\n } catch (error) {\n spinner.fail(chalk.red(`Failed during ${currentStep}.`));\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(chalk.red(errorMessage));\n console.log(`\\n${chalk.bold(\"Retry:\")}`);\n if (targetDir !== cwd) {\n console.log(chalk.cyan(` cd ${projectName}`));\n }\n console.log(chalk.cyan(\" npx zuro-cli init\"));\n }\n}\n","import { createHash } from \"node:crypto\";\n\nconst DEFAULT_REGISTRY_BASE_URL = \"https://registry.devbybriyan.com\";\nconst DEFAULT_REGISTRY_ENTRY_URL = `${DEFAULT_REGISTRY_BASE_URL}/channels/stable.json`;\nconst REGISTRY_ENV_VAR = \"ZURO_REGISTRY_URL\";\nconst REQUEST_TIMEOUT_MS = 8000;\nconst MAX_RETRIES = 2;\n\nexport interface RegistryFile {\n path: string;\n target: string;\n type: string;\n sha256?: string;\n size?: number;\n}\n\nexport interface RegistryModule {\n type: string;\n files: RegistryFile[];\n moduleDependencies?: string[];\n dependencies?: string[];\n devDependencies?: string[];\n}\n\nexport interface RegistryManifest {\n schemaVersion?: number;\n status?: string;\n templateVersion?: string;\n generatedAt?: string;\n modules: Record<string, RegistryModule>;\n}\n\ninterface RegistryChannelPointer {\n schemaVersion?: number;\n channel?: string;\n templateVersion?: string;\n generatedAt?: string;\n indexPath?: string;\n indexUrl?: string;\n}\n\nexport interface RegistryContext {\n manifest: RegistryManifest;\n manifestUrl: string;\n fileBaseUrl: string;\n}\n\ninterface FetchFileOptions {\n baseUrl: string;\n expectedSha256?: string;\n expectedSize?: number;\n}\n\nexport function getRegistryUrl() {\n return resolveRegistryEntryUrl();\n}\n\nfunction withTrailingSlash(url: string) {\n return url.endsWith(\"/\") ? url : `${url}/`;\n}\n\nfunction resolveRegistryEntryUrl() {\n const override = process.env[REGISTRY_ENV_VAR]?.trim();\n\n if (!override) {\n return DEFAULT_REGISTRY_ENTRY_URL;\n }\n\n let parsed: URL;\n\n try {\n parsed = new URL(override);\n } catch {\n throw new Error(\n `Invalid ${REGISTRY_ENV_VAR} value '${override}'. Expected a valid http(s) URL.`\n );\n }\n\n if (parsed.pathname.endsWith(\".json\")) {\n return parsed.toString();\n }\n\n return new URL(\"channels/stable.json\", withTrailingSlash(parsed.toString())).toString();\n}\n\nfunction isRegistryManifest(data: unknown): data is RegistryManifest {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n const candidate = data as Partial<RegistryManifest>;\n return !!candidate.modules && typeof candidate.modules === \"object\";\n}\n\nfunction isChannelPointer(data: unknown): data is RegistryChannelPointer {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n const candidate = data as Partial<RegistryChannelPointer>;\n return typeof candidate.indexPath === \"string\" || typeof candidate.indexUrl === \"string\";\n}\n\nfunction delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function fetchWithRetry(url: string): Promise<Response> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n headers: { Accept: \"application/json, text/plain, */*\" },\n signal: controller.signal,\n });\n\n if (response.ok) {\n return response;\n }\n\n const shouldRetry = response.status >= 500 && attempt < MAX_RETRIES;\n if (shouldRetry) {\n await delay(250 * (attempt + 1));\n continue;\n }\n\n throw new Error(`Request failed (${response.status} ${response.statusText}) for ${url}`);\n } catch (error) {\n lastError = error;\n\n if (attempt === MAX_RETRIES) {\n break;\n }\n\n await delay(250 * (attempt + 1));\n } finally {\n clearTimeout(timeout);\n }\n }\n\n if (lastError instanceof Error) {\n throw lastError;\n }\n\n throw new Error(`Failed to fetch ${url}`);\n}\n\nasync function fetchJson<T>(url: string): Promise<{ data: T; resolvedUrl: string }> {\n const response = await fetchWithRetry(url);\n const data = (await response.json()) as T;\n\n return {\n data,\n resolvedUrl: response.url || url,\n };\n}\n\nfunction resolveManifestUrl(pointer: RegistryChannelPointer, pointerUrl: string): string {\n const explicit = pointer.indexUrl || pointer.indexPath;\n\n if (!explicit) {\n throw new Error(\"Registry channel pointer is missing indexUrl/indexPath\");\n }\n\n return new URL(explicit, pointerUrl).toString();\n}\n\nexport async function fetchRegistry(): Promise<RegistryContext> {\n const registryEntryUrl = resolveRegistryEntryUrl();\n let entry: { data: unknown; resolvedUrl: string };\n\n try {\n entry = await fetchJson<unknown>(registryEntryUrl);\n } catch (error) {\n throw new Error(\n `Unable to fetch registry from ${registryEntryUrl}. For local testing set ${REGISTRY_ENV_VAR}=http://127.0.0.1:8787.`,\n { cause: error as Error }\n );\n }\n\n if (isRegistryManifest(entry.data)) {\n return {\n manifest: entry.data,\n manifestUrl: entry.resolvedUrl,\n fileBaseUrl: withTrailingSlash(new URL(\".\", entry.resolvedUrl).toString()),\n };\n }\n\n if (!isChannelPointer(entry.data)) {\n throw new Error(\n `Invalid registry payload at ${registryEntryUrl}. Expected manifest or channel pointer.`\n );\n }\n\n const manifestUrl = resolveManifestUrl(entry.data, entry.resolvedUrl);\n const manifestResult = await fetchJson<unknown>(manifestUrl);\n\n if (!isRegistryManifest(manifestResult.data)) {\n throw new Error(`Invalid manifest payload at ${manifestUrl}.`);\n }\n\n return {\n manifest: manifestResult.data,\n manifestUrl: manifestResult.resolvedUrl,\n fileBaseUrl: withTrailingSlash(new URL(\".\", manifestResult.resolvedUrl).toString()),\n };\n}\n\nexport async function fetchFile(filePath: string, options: FetchFileOptions) {\n const normalizedPath = filePath.replace(/^\\//, \"\");\n const fileUrl = new URL(normalizedPath, withTrailingSlash(options.baseUrl)).toString();\n const response = await fetchWithRetry(fileUrl);\n const content = await response.text();\n\n if (typeof options.expectedSize === \"number\") {\n const actualSize = Buffer.byteLength(content, \"utf8\");\n if (actualSize !== options.expectedSize) {\n throw new Error(\n `Size mismatch for ${filePath}. Expected ${options.expectedSize}, got ${actualSize}.`\n );\n }\n }\n\n if (options.expectedSha256) {\n const actualSha256 = createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\n if (actualSha256 !== options.expectedSha256) {\n throw new Error(\n `Checksum mismatch for ${filePath}. Expected ${options.expectedSha256}, got ${actualSha256}.`\n );\n }\n }\n\n return content;\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { execa } from \"execa\";\n\nfunction normalizePackageName(name: string) {\n const normalized = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[._-]+|[._-]+$/g, \"\");\n\n return normalized || \"zuro-app\";\n}\n\nexport async function ensurePackageManagerAvailable(pm: string) {\n try {\n await execa(pm, [\"--version\"], { stdio: \"ignore\" });\n } catch {\n throw new Error(\n `Package manager '${pm}' is not installed or not available in PATH. Install it or choose npm.`\n );\n }\n}\n\nexport async function initPackageJson(\n cwd: string,\n force: boolean = false,\n packageName = \"zuro-app\",\n srcDir = \"src\",\n options: { enablePrettier?: boolean } = {}\n) {\n const pkgPath = path.join(cwd, \"package.json\");\n if (force || !await fs.pathExists(pkgPath)) {\n const scripts: Record<string, string> = {\n \"dev\": `tsx watch ${srcDir}/server.ts`,\n \"build\": \"tsc\",\n \"start\": \"node dist/server.js\"\n };\n\n if (options.enablePrettier) {\n scripts[\"format\"] = \"prettier --write .\";\n scripts[\"format:check\"] = \"prettier --check .\";\n }\n\n await fs.writeJson(pkgPath, {\n name: normalizePackageName(packageName),\n version: \"0.0.1\",\n private: true,\n scripts\n }, { spaces: 2 });\n }\n}\n\ninterface InstallOptions {\n dev?: boolean;\n}\n\nexport async function installDependencies(\n pm: string,\n deps: string[],\n cwd: string,\n options: InstallOptions = {}\n) {\n const uniqueDeps = [...new Set(deps)].filter(Boolean);\n\n if (uniqueDeps.length === 0) {\n return;\n }\n\n const isDev = options.dev ?? false;\n\n if (pm === \"npm\") {\n const args = [\"install\", ...(isDev ? [\"--save-dev\"] : []), ...uniqueDeps];\n await execa(\"npm\", args, { cwd });\n return;\n }\n\n if (pm === \"pnpm\") {\n const args = [\"add\", ...(isDev ? [\"-D\"] : []), ...uniqueDeps];\n await execa(\"pnpm\", args, { cwd });\n return;\n }\n\n if (pm === \"yarn\") {\n const args = [\"add\", ...(isDev ? [\"-D\"] : []), ...uniqueDeps];\n await execa(\"yarn\", args, { cwd });\n return;\n }\n\n if (pm === \"bun\") {\n const args = [\"add\", ...(isDev ? [\"-d\"] : []), ...uniqueDeps];\n await execa(\"bun\", args, { cwd });\n return;\n }\n\n throw new Error(`Unsupported package manager: ${pm}`);\n}\n","import fs from \"fs-extra\";\r\nimport path from \"path\";\r\nimport os from \"os\";\r\n\r\n/**\r\n * Creates or updates .env file with new variables\r\n */\r\nexport const updateEnvFile = async (\r\n cwd: string,\r\n variables: Record<string, string>,\r\n createIfMissing = true,\r\n options: { overwriteExisting?: boolean } = {}\r\n) => {\r\n const envPath = path.join(cwd, \".env\");\r\n const overwriteExisting = options.overwriteExisting ?? false;\r\n\r\n let content = \"\";\r\n if (fs.existsSync(envPath)) {\r\n content = await fs.readFile(envPath, \"utf-8\");\r\n } else if (!createIfMissing) {\r\n return;\r\n }\r\n\r\n let modified = false;\r\n\r\n for (const [key, value] of Object.entries(variables)) {\r\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n const regex = new RegExp(`^${escapedKey}=.*$`, \"m\");\r\n\r\n if (regex.test(content)) {\r\n if (!overwriteExisting) {\r\n continue;\r\n }\r\n\r\n const nextLine = `${key}=${value}`;\r\n const updated = content.replace(regex, nextLine);\r\n if (updated !== content) {\r\n content = updated;\r\n modified = true;\r\n }\r\n continue;\r\n }\r\n\r\n // Add newline if content doesn't end with one\r\n if (content && !content.endsWith(\"\\n\")) {\r\n content += os.EOL;\r\n }\r\n content += `${key}=${value}${os.EOL}`;\r\n modified = true;\r\n }\r\n\r\n if (modified || !fs.existsSync(envPath)) {\r\n await fs.writeFile(envPath, content);\r\n }\r\n};\r\n\r\n/**\r\n * Updates env.ts to add new schema fields\r\n */\r\nexport const updateEnvSchema = async (\r\n cwd: string,\r\n srcDir: string,\r\n fields: Array<{ name: string; schema: string }>\r\n) => {\r\n const envPath = path.join(cwd, srcDir, \"env.ts\");\r\n\r\n if (!fs.existsSync(envPath)) {\r\n return false;\r\n }\r\n\r\n let content = await fs.readFile(envPath, \"utf-8\");\r\n let modified = false;\r\n\r\n for (const field of fields) {\r\n // Check if field already exists in schema\r\n if (content.includes(`${field.name}:`)) {\r\n continue;\r\n }\r\n\r\n // Find the closing of envSchema z.object({ ... })\r\n // Insert before the closing });\r\n const schemaEndRegex = /(\\n\\s*)(}\\);?\\s*\\n\\s*export const env)/;\r\n const match = content.match(schemaEndRegex);\r\n\r\n if (match) {\r\n const indent = \" \"; // 4 spaces\r\n const newField = `${indent}${field.name}: ${field.schema},\\n`;\r\n content = content.replace(\r\n schemaEndRegex,\r\n `\\n${newField}$1$2`\r\n );\r\n modified = true;\r\n }\r\n }\r\n\r\n if (modified) {\r\n await fs.writeFile(envPath, content);\r\n }\r\n\r\n return modified;\r\n};\r\n\r\n/**\r\n * Creates initial .env file for new projects\r\n */\r\nexport const createInitialEnv = async (cwd: string) => {\r\n const envPath = path.join(cwd, \".env\");\r\n\r\n if (fs.existsSync(envPath)) {\r\n return; // Don't overwrite existing\r\n }\r\n\r\n const content = `# Environment Variables\r\nPORT=3000\r\nNODE_ENV=development\r\n`;\r\n\r\n await fs.writeFile(envPath, content);\r\n};\r\n\r\n/**\r\n * Module-specific env configurations\r\n */\r\nexport const ENV_CONFIGS = {\r\n \"database-pg\": {\r\n envVars: {\r\n DATABASE_URL: \"postgresql://postgres@localhost:5432/mydb\",\r\n },\r\n schemaFields: [\r\n { name: \"DATABASE_URL\", schema: \"z.string().url()\" },\r\n ],\r\n },\r\n \"database-mysql\": {\n envVars: {\n DATABASE_URL: \"mysql://root@localhost:3306/mydb\",\n },\n schemaFields: [\n { name: \"DATABASE_URL\", schema: \"z.string().url()\" },\n ],\n },\n \"database-prisma-pg\": {\n envVars: {\n DATABASE_URL: \"postgresql://postgres@localhost:5432/mydb\",\n },\n schemaFields: [\n { name: \"DATABASE_URL\", schema: \"z.string().url()\" },\n ],\n },\n \"database-prisma-mysql\": {\n envVars: {\n DATABASE_URL: \"mysql://root@localhost:3306/mydb\",\n },\n schemaFields: [\n { name: \"DATABASE_URL\", schema: \"z.string().url()\" },\n ],\n },\n auth: {\r\n envVars: {\r\n BETTER_AUTH_SECRET: \"your-secret-key-at-least-32-characters-long\",\r\n BETTER_AUTH_URL: \"http://localhost:3000\",\r\n },\r\n schemaFields: [\r\n { name: \"BETTER_AUTH_SECRET\", schema: \"z.string().min(32)\" },\r\n { name: \"BETTER_AUTH_URL\", schema: \"z.string().url()\" },\r\n ],\r\n },\r\n mailer: {\r\n envVars: {\r\n SMTP_HOST: \"smtp.example.com\",\r\n SMTP_PORT: \"587\",\r\n SMTP_USER: \"your-email@example.com\",\r\n SMTP_PASS: \"your-password\",\r\n MAIL_FROM: \"noreply@example.com\",\r\n },\r\n schemaFields: [\r\n { name: \"SMTP_HOST\", schema: \"z.string().min(1)\" },\r\n { name: \"SMTP_PORT\", schema: \"z.coerce.number().default(587)\" },\r\n { name: \"SMTP_USER\", schema: \"z.string().min(1)\" },\r\n { name: \"SMTP_PASS\", schema: \"z.string().min(1)\" },\r\n { name: \"MAIL_FROM\", schema: \"z.string().email()\" },\r\n ],\r\n },\r\n \"mailer-resend\": {\r\n envVars: {\r\n RESEND_API_KEY: \"re_your_api_key\",\r\n MAIL_FROM: \"onboarding@resend.dev\",\r\n },\r\n schemaFields: [\r\n { name: \"RESEND_API_KEY\", schema: \"z.string().min(1)\" },\r\n { name: \"MAIL_FROM\", schema: \"z.string().min(1)\" },\r\n ],\r\n },\r\n \"rate-limiter\": {\r\n envVars: {\r\n RATE_LIMIT_WINDOW_MS: \"900000\",\r\n RATE_LIMIT_MAX: \"100\",\r\n },\r\n schemaFields: [\r\n { name: \"RATE_LIMIT_WINDOW_MS\", schema: \"z.coerce.number().default(900000)\" },\r\n { name: \"RATE_LIMIT_MAX\", schema: \"z.coerce.number().default(100)\" },\r\n ],\r\n },\r\n};\r\n","import fs from \"fs-extra\";\nimport path from \"path\";\n\nexport interface ZuroConfig {\n name?: string;\n pm?: string;\n srcDir?: string;\n database?: {\n orm?: \"drizzle\" | \"prisma\";\n dialect?: \"postgresql\" | \"mysql\";\n };\n}\n\nfunction sanitizeConfig(input: unknown): ZuroConfig {\n if (!input || typeof input !== \"object\") {\n return {};\n }\n\n const raw = input as Record<string, unknown>;\n const config: ZuroConfig = {};\n\n if (typeof raw.name === \"string\") {\n config.name = raw.name;\n }\n\n if (typeof raw.pm === \"string\") {\n config.pm = raw.pm;\n }\n\n if (typeof raw.srcDir === \"string\") {\n config.srcDir = raw.srcDir;\n }\n\n if (raw.database && typeof raw.database === \"object\") {\n const dbRaw = raw.database as Record<string, unknown>;\n const database: NonNullable<ZuroConfig[\"database\"]> = {};\n\n if (dbRaw.orm === \"drizzle\" || dbRaw.orm === \"prisma\") {\n database.orm = dbRaw.orm;\n }\n\n if (dbRaw.dialect === \"postgresql\" || dbRaw.dialect === \"mysql\") {\n database.dialect = dbRaw.dialect;\n }\n\n if (database.orm || database.dialect) {\n config.database = database;\n }\n }\n\n return config;\n}\n\nexport function getConfigPath(cwd: string) {\n return path.join(cwd, \"zuro.json\");\n}\n\nexport async function readZuroConfig(cwd: string): Promise<ZuroConfig | null> {\n const configPath = getConfigPath(cwd);\n\n if (!(await fs.pathExists(configPath))) {\n return null;\n }\n\n const raw = await fs.readJson(configPath);\n return sanitizeConfig(raw);\n}\n\nexport async function writeZuroConfig(cwd: string, config: ZuroConfig) {\n const configPath = getConfigPath(cwd);\n await fs.writeJson(configPath, sanitizeConfig(config), { spaces: 2 });\n}\n","import chalk from \"chalk\";\n\nexport function showNonZuroProjectMessage() {\n console.log(chalk.yellow(\"This directory looks like an existing project that wasn't created with Zuro CLI.\"));\n console.log(\"\");\n console.log(chalk.yellow(\"We stopped here because we don't want to make unnecessary changes to your project.\"));\n console.log(\"\");\n console.log(\"Zuro CLI works in:\");\n console.log(\"- a fresh/empty directory, or\");\n console.log(\"- an existing project already managed by Zuro CLI.\");\n}\n\nexport function showInitFirstMessage() {\n console.log(chalk.yellow(\"No Zuro project found in this directory.\"));\n console.log(\"\");\n console.log(chalk.yellow(\"Run init first, then add modules.\"));\n console.log(\"\");\n console.log(chalk.cyan(\"npx zuro-cli init\"));\n}\n","import ora from \"ora\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport { randomBytes } from \"node:crypto\";\nimport { fetchRegistry, fetchFile } from \"../utils/registry\";\nimport { installDependencies, ensurePackageManagerAvailable } from \"../utils/pm\";\nimport { resolveDependencies } from \"../utils/dependency\";\nimport { updateEnvFile, updateEnvSchema, ENV_CONFIGS } from \"../utils/env-manager\";\nimport { resolveSafeTargetPath } from \"../utils/paths\";\nimport { escapeRegex } from \"../utils/code-inject\";\nimport chalk from \"chalk\";\nimport { readZuroConfig, writeZuroConfig } from \"../utils/config\";\nimport { showNonZuroProjectMessage, showInitFirstMessage } from \"../utils/project-guard\";\n\nimport {\n parseDatabaseDialect,\n isDatabaseModule,\n isDrizzleDatabaseModule,\n ensureSchemaExport,\n printDatabaseHints,\n promptDatabaseConfig,\n detectInstalledDatabaseDialect,\n type DatabaseModuleName,\n type DatabaseOrm,\n type DatabaseDialect,\n getDatabaseSelection,\n} from \"../handlers/database.handler\";\nimport {\n injectAuthRoutes,\n injectAuthDocs,\n promptAuthConfig,\n printAuthHints,\n} from \"../handlers/auth.handler\";\nimport {\n promptMailerConfig,\n printMailerHints,\n} from \"../handlers/mailer.handler\";\nimport {\n isDocsModuleInstalled,\n injectDocsRoutes,\n printDocsHints,\n} from \"../handlers/docs.handler\";\nimport {\n injectErrorHandler,\n} from \"../handlers/error-handler.handler\";\nimport {\n injectRateLimiter,\n} from \"../handlers/rate-limiter.handler\";\nimport {\n isAuthModuleInstalled,\n} from \"../handlers/auth.handler\";\nimport {\n detectInstalledUploadsMode,\n getUploadEnvSchemaFields,\n injectUploadsDocs,\n injectUploadsRoutes,\n isUploadsModuleInstalled,\n printUploadHints,\n promptUploadsConfig,\n type UploadPromptResult,\n} from \"../handlers/uploads.handler\";\n\nexport interface AddCommandOptions {\n dialect?: string;\n dbUrl?: string;\n yes?: boolean;\n}\n\nfunction resolvePackageManager(projectRoot: string) {\n if (fs.existsSync(path.join(projectRoot, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n\n if (fs.existsSync(path.join(projectRoot, \"bun.lockb\")) || fs.existsSync(path.join(projectRoot, \"bun.lock\"))) {\n return \"bun\";\n }\n\n if (fs.existsSync(path.join(projectRoot, \"yarn.lock\"))) {\n return \"yarn\";\n }\n\n return \"npm\";\n}\n\nfunction getModuleDocsPath(moduleName: string) {\n if (isDatabaseModule(moduleName)) {\n return \"database\";\n }\n\n return moduleName;\n}\n\nasync function hasEnvVariable(projectRoot: string, key: string): Promise<boolean> {\n const envPath = path.join(projectRoot, \".env\");\n if (!await fs.pathExists(envPath)) {\n return false;\n }\n\n const content = await fs.readFile(envPath, \"utf-8\");\n const pattern = new RegExp(`^${escapeRegex(key)}=`, \"m\");\n return pattern.test(content);\n}\n\nasync function isLikelyEmptyDirectory(cwd: string): Promise<boolean> {\n const entries = await fs.readdir(cwd);\n const ignored = new Set([\".ds_store\", \"thumbs.db\"]);\n\n return entries.filter((entry) => !ignored.has(entry.toLowerCase())).length === 0;\n}\n\n// ─── Main Orchestrator ─────────────────────────────────────────────\n\nexport const add = async (moduleName: string, options: AddCommandOptions = {}) => {\n const projectRoot = process.cwd();\n const projectConfig = await readZuroConfig(projectRoot);\n if (!projectConfig) {\n if (await isLikelyEmptyDirectory(projectRoot)) {\n showInitFirstMessage();\n return;\n }\n\n showNonZuroProjectMessage();\n return;\n }\n const srcDir = projectConfig.srcDir || \"src\";\n let resolvedModuleName = moduleName;\n const parsedDialect = parseDatabaseDialect(moduleName);\n if (parsedDialect) {\n resolvedModuleName = parsedDialect;\n }\n\n // ── Module-specific prompts ─────────────────────────────────────\n\n let customDbUrl: string | undefined;\n let usedDefaultDbUrl = false;\n let databaseBackupPath: string | null = null;\n let selectedDatabaseOrm: DatabaseOrm | null = null;\n let selectedDatabaseDialect: DatabaseDialect | null = null;\n let generatedAuthSecret = false;\n let authDatabaseDialect: DatabaseModuleName | null = null;\n let customSmtpVars: Record<string, string> | undefined;\n let usedDefaultSmtp = false;\n let mailerProvider: \"smtp\" | \"resend\" = \"smtp\";\n let shouldInstallDocsForAuth = false;\n let uploadConfig: UploadPromptResult | null = null;\n let uploadDatabaseDialect: DatabaseModuleName | null = null;\n\n if (resolvedModuleName === \"database\" || isDatabaseModule(resolvedModuleName)) {\n const result = await promptDatabaseConfig(resolvedModuleName, projectRoot, srcDir);\n if (!result) return;\n\n resolvedModuleName = result.resolvedModuleName;\n selectedDatabaseOrm = result.selectedOrm;\n selectedDatabaseDialect = result.selectedDialect;\n customDbUrl = result.customDbUrl;\n usedDefaultDbUrl = result.usedDefaultDbUrl;\n databaseBackupPath = result.databaseBackupPath;\n }\n\n if (resolvedModuleName === \"mailer\") {\n const result = await promptMailerConfig();\n if (!result) return;\n\n mailerProvider = result.mailerProvider;\n customSmtpVars = result.customSmtpVars;\n usedDefaultSmtp = result.usedDefaultSmtp;\n }\n\n if (resolvedModuleName === \"auth\") {\n const result = await promptAuthConfig(projectRoot, srcDir, options);\n if (!result) return;\n\n shouldInstallDocsForAuth = result.shouldInstallDocsForAuth;\n authDatabaseDialect = result.authDatabaseDialect;\n }\n\n if (resolvedModuleName === \"uploads\") {\n uploadConfig = await promptUploadsConfig(projectRoot, srcDir);\n if (!uploadConfig) return;\n }\n\n // ── Registry fetch & install ────────────────────────────────────\n\n const pm = resolvePackageManager(projectRoot);\n const spinner = ora(`Checking registry for ${resolvedModuleName}...`).start();\n let currentStep = \"package manager preflight\";\n\n try {\n spinner.text = `Checking ${pm} availability...`;\n await ensurePackageManagerAvailable(pm);\n\n currentStep = \"registry fetch\";\n spinner.text = `Checking registry for ${resolvedModuleName}...`;\n const registryContext = await fetchRegistry();\n const module = registryContext.manifest.modules[resolvedModuleName];\n\n if (!module) {\n spinner.fail(`Module '${resolvedModuleName}' not found.`);\n return;\n }\n\n spinner.succeed(`Found module: ${chalk.cyan(resolvedModuleName)}`);\n\n const moduleDeps = module.moduleDependencies || [];\n currentStep = \"module dependency resolution\";\n await resolveDependencies(moduleDeps, projectRoot);\n\n if (resolvedModuleName === \"uploads\" && uploadConfig) {\n if (uploadConfig.shouldInstallDatabase) {\n console.log(chalk.blue(\"\\nℹ Upload metadata needs a Drizzle database. Installing database module...\"));\n await add(\"database\");\n }\n\n if (uploadConfig.shouldInstallAuth) {\n console.log(chalk.blue(\"\\nℹ Upload auth needs the auth module. Installing auth module...\"));\n await add(\"auth\", { yes: true });\n }\n\n uploadDatabaseDialect = await detectInstalledDatabaseDialect(projectRoot, srcDir);\n if (uploadConfig.useDatabaseMetadata) {\n if (uploadDatabaseDialect === \"database-prisma-pg\" || uploadDatabaseDialect === \"database-prisma-mysql\") {\n spinner.fail(\"Uploads metadata currently supports Drizzle-based database setup only.\");\n console.log(chalk.yellow(\"ℹ Install a Drizzle database, or rerun uploads without metadata.\"));\n return;\n }\n\n if (!uploadDatabaseDialect) {\n spinner.fail(\"Could not detect a database setup for uploads metadata.\");\n console.log(chalk.yellow(\"ℹ Install the database module first, then rerun uploads.\"));\n return;\n }\n }\n }\n\n if (resolvedModuleName === \"auth\") {\n authDatabaseDialect = await detectInstalledDatabaseDialect(projectRoot, srcDir);\n if (authDatabaseDialect === \"database-prisma-pg\" || authDatabaseDialect === \"database-prisma-mysql\") {\n spinner.fail(\"Auth module currently supports Drizzle-based database setup only.\");\n console.log(chalk.yellow(\"ℹ Install auth after switching database ORM to Drizzle.\"));\n return;\n }\n }\n\n currentStep = \"dependency installation\";\n spinner.start(\"Installing dependencies...\");\n\n let runtimeDeps = module.dependencies || [];\n let devDeps = module.devDependencies || [];\n\n if (resolvedModuleName === \"mailer\") {\n if (mailerProvider === \"resend\") {\n runtimeDeps = [\"resend\"];\n devDeps = [];\n } else {\n runtimeDeps = [\"nodemailer\"];\n devDeps = [\"@types/nodemailer\"];\n }\n }\n\n if (resolvedModuleName === \"uploads\" && uploadConfig) {\n runtimeDeps = [\"multer\"];\n devDeps = [\"@types/multer\"];\n\n if (uploadConfig.provider === \"cloudinary\") {\n runtimeDeps.push(\"cloudinary\");\n } else {\n runtimeDeps.push(\"@aws-sdk/client-s3\", \"@aws-sdk/s3-request-presigner\");\n }\n }\n\n await installDependencies(pm, runtimeDeps, projectRoot);\n await installDependencies(pm, devDeps, projectRoot, { dev: true });\n\n spinner.succeed(\"Dependencies installed\");\n\n // ── Scaffold files ──────────────────────────────────────────\n\n currentStep = \"module scaffolding\";\n spinner.start(\"Scaffolding files...\");\n\n for (const file of module.files) {\n let fetchPath = file.path;\n let expectedSha256 = file.sha256;\n let expectedSize = file.size;\n\n if (\n resolvedModuleName === \"auth\"\n && file.target === \"db/schema/auth.ts\"\n && authDatabaseDialect === \"database-mysql\"\n ) {\n fetchPath = \"express/db/schema/auth.mysql.ts\";\n expectedSha256 = undefined;\n expectedSize = undefined;\n }\n\n if (\n resolvedModuleName === \"mailer\"\n && file.target === \"lib/mailer.ts\"\n && mailerProvider === \"resend\"\n ) {\n fetchPath = \"express/lib/mailer.resend.ts\";\n expectedSha256 = undefined;\n expectedSize = undefined;\n }\n\n if (resolvedModuleName === \"uploads\" && uploadConfig) {\n if (file.target === \"lib/uploads/provider.ts\") {\n fetchPath = uploadConfig.provider === \"cloudinary\"\n ? \"express/lib/uploads/provider.cloudinary.ts\"\n : \"express/lib/uploads/provider.s3.ts\";\n expectedSha256 = undefined;\n expectedSize = undefined;\n }\n\n if (file.target === \"lib/uploads/metadata.ts\") {\n fetchPath = uploadConfig.useDatabaseMetadata\n ? \"express/lib/uploads/metadata.db.ts\"\n : \"express/lib/uploads/metadata.noop.ts\";\n expectedSha256 = undefined;\n expectedSize = undefined;\n }\n\n if (file.target === \"middleware/upload-auth.ts\") {\n fetchPath = `express/middleware/upload-auth.${uploadConfig.authMode}.ts`;\n expectedSha256 = undefined;\n expectedSize = undefined;\n }\n\n if (file.target === \"db/schema/uploads.ts\") {\n if (!uploadConfig.useDatabaseMetadata) {\n continue;\n }\n\n fetchPath = uploadDatabaseDialect === \"database-mysql\"\n ? \"express/db/schema/uploads.mysql.ts\"\n : \"express/db/schema/uploads.ts\";\n expectedSha256 = undefined;\n expectedSize = undefined;\n }\n }\n\n let content = await fetchFile(fetchPath, {\n baseUrl: registryContext.fileBaseUrl,\n expectedSha256,\n expectedSize,\n });\n\n if (isDrizzleDatabaseModule(resolvedModuleName) && file.target === \"../drizzle.config.ts\") {\n const normalizedSrcDir = srcDir.replace(/\\\\/g, \"/\");\n content = content.replace(\n /schema:\\s*[\"'][^\"']+[\"']/,\n `schema: \"./${normalizedSrcDir}/db/schema/*\"`\n );\n }\n\n const targetPath = resolveSafeTargetPath(projectRoot, srcDir, file);\n\n await fs.ensureDir(path.dirname(targetPath));\n await fs.writeFile(targetPath, content);\n }\n\n const schemaExports = module.files\n .map((file) => file.target.replace(/\\\\/g, \"/\"))\n .filter((target) => /^db\\/schema\\/[^/]+\\.ts$/.test(target))\n .map((target) => path.posix.basename(target, \".ts\"))\n .filter((name) => name !== \"index\");\n\n for (const schemaFileName of schemaExports) {\n await ensureSchemaExport(projectRoot, srcDir, schemaFileName);\n }\n\n spinner.succeed(\"Files generated\");\n\n // ── Post-install hooks ──────────────────────────────────────\n\n if (resolvedModuleName === \"auth\") {\n spinner.start(\"Configuring routes...\");\n const injected = await injectAuthRoutes(projectRoot, srcDir);\n if (injected) {\n spinner.succeed(\"Routes configured\");\n } else {\n spinner.warn(\"Could not configure routes automatically\");\n }\n\n const docsInstalled = await isDocsModuleInstalled(projectRoot, srcDir);\n if (docsInstalled) {\n spinner.start(\"Adding auth endpoints to API docs...\");\n const authDocsInjected = await injectAuthDocs(projectRoot, srcDir);\n if (authDocsInjected) {\n spinner.succeed(\"Auth endpoints added to API docs\");\n } else {\n spinner.warn(\"Could not update API docs automatically\");\n }\n }\n }\n\n if (resolvedModuleName === \"error-handler\") {\n spinner.start(\"Configuring error handler in app.ts...\");\n const injected = await injectErrorHandler(projectRoot, srcDir);\n if (injected) {\n spinner.succeed(\"Error handler configured in app.ts\");\n } else {\n spinner.warn(\"Could not find app.ts - error handler needs manual setup\");\n }\n }\n\n if (resolvedModuleName === \"rate-limiter\") {\n spinner.start(\"Configuring rate limiter in app.ts...\");\n const injected = await injectRateLimiter(projectRoot, srcDir);\n if (injected) {\n spinner.succeed(\"Rate limiter configured in app.ts\");\n } else {\n spinner.warn(\"Could not find app.ts - rate limiter needs manual setup\");\n }\n }\n\n if (resolvedModuleName === \"docs\") {\n spinner.start(\"Configuring docs routes...\");\n const injected = await injectDocsRoutes(projectRoot, srcDir);\n if (injected) {\n spinner.succeed(\"Docs routes configured\");\n } else {\n spinner.warn(\"Could not configure docs routes automatically\");\n }\n\n const authInstalled = await isAuthModuleInstalled(projectRoot, srcDir);\n if (authInstalled) {\n spinner.start(\"Adding auth endpoints to API docs...\");\n const authDocsInjected = await injectAuthDocs(projectRoot, srcDir);\n if (authDocsInjected) {\n spinner.succeed(\"Auth endpoints added to API docs\");\n } else {\n spinner.warn(\"Could not update API docs automatically\");\n }\n }\n\n const uploadsInstalled = await isUploadsModuleInstalled(projectRoot, srcDir);\n if (uploadsInstalled) {\n const uploadMode = await detectInstalledUploadsMode(projectRoot);\n if (uploadMode) {\n spinner.start(\"Adding uploads endpoints to API docs...\");\n const uploadsDocsInjected = await injectUploadsDocs(projectRoot, srcDir, uploadMode);\n if (uploadsDocsInjected) {\n spinner.succeed(\"Uploads endpoints added to API docs\");\n } else {\n spinner.warn(\"Could not update API docs automatically\");\n }\n }\n }\n }\n\n if (resolvedModuleName === \"uploads\" && uploadConfig) {\n spinner.start(\"Configuring upload routes...\");\n const injected = await injectUploadsRoutes(projectRoot, srcDir);\n if (injected) {\n spinner.succeed(\"Upload routes configured\");\n } else {\n spinner.warn(\"Could not configure upload routes automatically\");\n }\n\n const docsInstalled = await isDocsModuleInstalled(projectRoot, srcDir);\n if (docsInstalled) {\n spinner.start(\"Adding uploads endpoints to API docs...\");\n const docsInjected = await injectUploadsDocs(projectRoot, srcDir, uploadConfig.mode);\n if (docsInjected) {\n spinner.succeed(\"Uploads endpoints added to API docs\");\n } else {\n spinner.warn(\"Could not update API docs automatically\");\n }\n }\n }\n\n // ── Environment configuration ───────────────────────────────\n\n let envConfigKey = resolvedModuleName;\n if (resolvedModuleName === \"mailer\" && mailerProvider === \"resend\") {\n envConfigKey = \"mailer-resend\";\n }\n\n const envConfig = ENV_CONFIGS[envConfigKey as keyof typeof ENV_CONFIGS];\n if (envConfig) {\n currentStep = \"environment configuration\";\n spinner.start(\"Updating environment configuration...\");\n\n const envVars: Record<string, string> = { ...envConfig.envVars };\n if (customDbUrl && isDatabaseModule(resolvedModuleName)) {\n envVars.DATABASE_URL = customDbUrl;\n }\n\n if (resolvedModuleName === \"mailer\" && customSmtpVars) {\n Object.assign(envVars, customSmtpVars);\n }\n\n if (resolvedModuleName === \"auth\") {\n const hasExistingSecret = await hasEnvVariable(projectRoot, \"BETTER_AUTH_SECRET\");\n if (!hasExistingSecret) {\n envVars.BETTER_AUTH_SECRET = randomBytes(32).toString(\"hex\");\n generatedAuthSecret = true;\n }\n }\n\n await updateEnvFile(projectRoot, envVars, true, {\n overwriteExisting: isDatabaseModule(resolvedModuleName),\n });\n await updateEnvSchema(projectRoot, srcDir, envConfig.schemaFields);\n\n spinner.succeed(\"Environment configured\");\n }\n\n if (resolvedModuleName === \"uploads\" && uploadConfig) {\n currentStep = \"environment configuration\";\n spinner.start(\"Updating environment configuration...\");\n await updateEnvFile(projectRoot, uploadConfig.envVars, true);\n await updateEnvSchema(projectRoot, srcDir, getUploadEnvSchemaFields(uploadConfig.provider));\n spinner.succeed(\"Environment configured\");\n }\n\n if (isDatabaseModule(resolvedModuleName)) {\n const selected = getDatabaseSelection(resolvedModuleName);\n const orm = selectedDatabaseOrm ?? selected.orm;\n const dialect = selectedDatabaseDialect ?? selected.dialect;\n\n const latestConfig = await readZuroConfig(projectRoot);\n if (latestConfig) {\n await writeZuroConfig(projectRoot, {\n ...latestConfig,\n database: {\n orm,\n dialect,\n },\n });\n }\n }\n\n // ── Success output & hints ──────────────────────────────────\n\n console.log(chalk.green(`\\n✔ ${resolvedModuleName} added successfully!\\n`));\n\n const docsPath = getModuleDocsPath(resolvedModuleName);\n const docsUrl = `https://zuro-cli.devbybriyan.com/docs/${docsPath}`;\n console.log(chalk.blue(`ℹ Docs: ${docsUrl}`));\n\n if (isDatabaseModule(resolvedModuleName)) {\n printDatabaseHints(resolvedModuleName, customDbUrl, usedDefaultDbUrl, databaseBackupPath);\n }\n\n if (resolvedModuleName === \"auth\") {\n printAuthHints(generatedAuthSecret);\n }\n\n if (resolvedModuleName === \"mailer\") {\n printMailerHints(usedDefaultSmtp);\n }\n\n if (resolvedModuleName === \"docs\") {\n printDocsHints();\n }\n\n if (resolvedModuleName === \"uploads\" && uploadConfig) {\n printUploadHints(uploadConfig);\n }\n\n if (resolvedModuleName === \"auth\" && shouldInstallDocsForAuth) {\n console.log(chalk.blue(\"\\nℹ Installing API docs module...\"));\n await add(\"docs\", { yes: true });\n }\n } catch (error) {\n spinner.fail(chalk.red(`Failed during ${currentStep}.`));\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(chalk.red(errorMessage));\n console.log(`\\n${chalk.bold(\"Retry:\")}`);\n console.log(chalk.cyan(` npx zuro-cli add ${resolvedModuleName}`));\n }\n};\n","import { add } from \"../commands/add\";\nimport { readZuroConfig } from \"./config\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport chalk from \"chalk\";\n\n// Signature files to check if a Zuro module is installed\nconst BLOCK_SIGNATURES: Record<string, string> = {\n core: \"env.ts\",\n \"database-pg\": \"db/index.ts\",\n \"database-mysql\": \"db/index.ts\",\n validator: \"middleware/validate.ts\",\n \"error-handler\": \"lib/errors.ts\",\n logger: \"lib/logger.ts\",\n auth: \"lib/auth.ts\",\n mailer: \"lib/mailer.ts\",\n docs: \"lib/openapi.ts\",\n \"rate-limiter\": \"middleware/rate-limiter.ts\",\n};\n\n/**\n * Resolves Zuro module dependencies (NOT npm packages).\n * Only handles module dependencies like \"core\", \"database\", \"validator\", \"auth\".\n */\nexport const resolveDependencies = async (\n moduleDependencies: string[] | undefined,\n cwd: string\n) => {\n if (!moduleDependencies || moduleDependencies.length === 0) {\n return;\n }\n\n const config = await readZuroConfig(cwd);\n const srcDir = config?.srcDir || \"src\";\n\n for (const dep of moduleDependencies) {\n if (dep === \"database\") {\n const configuredOrm = config?.database?.orm;\n const configuredDialect = config?.database?.dialect;\n const pgExists = fs.existsSync(path.join(cwd, srcDir, BLOCK_SIGNATURES[\"database-pg\"]));\n const mysqlExists = fs.existsSync(path.join(cwd, srcDir, BLOCK_SIGNATURES[\"database-mysql\"]));\n const prismaSchemaExists = fs.existsSync(path.join(cwd, \"prisma\", \"schema.prisma\"));\n const hasDbFiles = pgExists || mysqlExists || prismaSchemaExists;\n const hasDbConfig = Boolean(configuredOrm && configuredDialect);\n\n if (hasDbConfig && hasDbFiles) {\n continue;\n }\n\n if (!hasDbConfig && hasDbFiles) {\n continue;\n }\n\n console.log(chalk.blue(`ℹ Dependency '${dep}' is missing. Triggering install...`));\n await add(\"database\");\n continue;\n }\n\n const signature = BLOCK_SIGNATURES[dep];\n if (!signature) {\n continue;\n }\n\n if (fs.existsSync(path.join(cwd, srcDir, signature))) {\n continue;\n }\n\n console.log(chalk.blue(`ℹ Installing missing dependency: ${dep}...`));\n await add(dep);\n }\n};\n","import path from \"path\";\nimport type { RegistryFile } from \"./registry\";\n\n/**\n * Resolves the absolute target path for a registry file and ensures\n * it does not escape the project root (path-traversal guard).\n */\nexport function resolveSafeTargetPath(projectRoot: string, srcDir: string, file: RegistryFile) {\n const targetPath = path.resolve(projectRoot, srcDir, file.target);\n const normalizedRoot = path.resolve(projectRoot);\n\n if (targetPath !== normalizedRoot && !targetPath.startsWith(`${normalizedRoot}${path.sep}`)) {\n throw new Error(`Refusing to write outside project directory: ${file.target}`);\n }\n\n return targetPath;\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport chalk from \"chalk\";\nimport { appendImport } from \"../utils/code-inject\";\nimport type { DatabaseModuleName } from \"./database.handler\";\n\n/**\n * Checks if the auth module is installed by looking for lib/auth.ts.\n */\nexport async function isAuthModuleInstalled(projectRoot: string, srcDir: string): Promise<boolean> {\n return await fs.pathExists(path.join(projectRoot, srcDir, \"lib\", \"auth.ts\"));\n}\n\n/**\n * Modifies app.ts to include auth routes (better-auth handler + user routes).\n */\nexport async function injectAuthRoutes(projectRoot: string, srcDir: string): Promise<boolean> {\n const appPath = path.join(projectRoot, srcDir, \"app.ts\");\n if (!await fs.pathExists(appPath)) {\n return false;\n }\n\n let appContent = await fs.readFile(appPath, \"utf-8\");\n const authHandlerImport = `import { toNodeHandler } from \"better-auth/node\";`;\n const authImport = `import { auth } from \"./lib/auth\";`;\n const routeIndexUserImport = `import userRoutes from \"./user.routes\";`;\n const appUserImport = `import userRoutes from \"./routes/user.routes\";`;\n\n let appModified = false;\n\n for (const importLine of [authHandlerImport, authImport]) {\n const next = appendImport(appContent, importLine);\n if (!next.inserted) {\n return false;\n }\n\n if (next.source !== appContent) {\n appContent = next.source;\n appModified = true;\n }\n }\n\n const hasAuthMount = /toNodeHandler\\(\\s*auth\\s*\\)/.test(appContent)\n && /\\/api\\/auth/.test(appContent);\n if (!hasAuthMount) {\n const authMountLine = \"app.all(/^\\\\/api\\\\/auth(?:\\\\/.*)?$/, toNodeHandler(auth));\\n\";\n const jsonIndex = appContent.search(/^\\s*app\\.use\\(\\s*express\\.json\\(\\)\\s*\\);\\s*$/m);\n\n let insertionIndex = jsonIndex;\n if (insertionIndex < 0) {\n const healthIndex = appContent.search(/^\\s*app\\.get\\(\\s*[\"']\\/health[\"']\\s*,/m);\n insertionIndex = healthIndex;\n }\n\n if (insertionIndex < 0) {\n const exportMatch = appContent.match(/export default app;?\\s*$/m);\n insertionIndex = exportMatch?.index ?? -1;\n }\n\n if (insertionIndex < 0) {\n return false;\n }\n\n appContent = appContent.slice(0, insertionIndex) + authMountLine + appContent.slice(insertionIndex);\n appModified = true;\n }\n\n const routeIndexPath = path.join(projectRoot, srcDir, \"routes\", \"index.ts\");\n if (await fs.pathExists(routeIndexPath)) {\n let routeContent = await fs.readFile(routeIndexPath, \"utf-8\");\n let routeModified = false;\n\n const userImportResult = appendImport(routeContent, routeIndexUserImport);\n if (!userImportResult.inserted) {\n return false;\n }\n\n if (userImportResult.source !== routeContent) {\n routeContent = userImportResult.source;\n routeModified = true;\n }\n\n const hasUserRoute = /rootRouter\\.use\\(\\s*[\"']\\/users[\"']\\s*,\\s*userRoutes\\s*\\)/.test(routeContent);\n if (!hasUserRoute) {\n const routeSetup = `\\n// User routes\\nrootRouter.use(\"/users\", userRoutes);\\n`;\n const exportMatch = routeContent.match(/export default rootRouter;?\\s*$/m);\n\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n routeContent = routeContent.slice(0, exportMatch.index) + routeSetup + \"\\n\" + routeContent.slice(exportMatch.index);\n routeModified = true;\n }\n\n if (routeModified) {\n await fs.writeFile(routeIndexPath, routeContent);\n }\n } else {\n const hasUserRoute = /app\\.use\\(\\s*[\"']\\/api\\/users[\"']\\s*,\\s*userRoutes\\s*\\)/.test(appContent);\n if (!hasUserRoute) {\n const exportMatch = appContent.match(/export default app;?\\s*$/m);\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n const routeSetup = `\\n// User routes\\napp.use(\"/api/users\", userRoutes);\\n`;\n appContent = appContent.slice(0, exportMatch.index) + routeSetup + \"\\n\" + appContent.slice(exportMatch.index);\n appModified = true;\n }\n\n const userImportResult = appendImport(appContent, appUserImport);\n if (!userImportResult.inserted) {\n return false;\n }\n\n if (userImportResult.source !== appContent) {\n appContent = userImportResult.source;\n appModified = true;\n }\n }\n\n if (appModified) {\n await fs.writeFile(appPath, appContent);\n }\n\n return true;\n}\n\n/**\n * Injects auth endpoint documentation into the OpenAPI spec file.\n */\nexport async function injectAuthDocs(projectRoot: string, srcDir: string): Promise<boolean> {\n const openApiPath = path.join(projectRoot, srcDir, \"lib\", \"openapi.ts\");\n if (!await fs.pathExists(openApiPath)) {\n return false;\n }\n\n const authMarker = \"// ZURO_AUTH_DOCS\";\n let content = await fs.readFile(openApiPath, \"utf-8\");\n if (content.includes(authMarker)) {\n return true;\n }\n\n const moduleDocsEndMarker = \"// ZURO_DOCS_MODULES_END\";\n if (!content.includes(moduleDocsEndMarker)) {\n return false;\n }\n\n const authBlock = `\\nconst authSignUpSchema = z.object({\n email: z.string().email().openapi({ example: \"dev@company.com\" }),\n password: z.string().min(8).openapi({ example: \"strong-password\" }),\n name: z.string().min(1).optional().openapi({ example: \"Dev User\" }),\n});\n\nconst authSignInSchema = z.object({\n email: z.string().email().openapi({ example: \"dev@company.com\" }),\n password: z.string().min(8).openapi({ example: \"strong-password\" }),\n});\n\nconst authUserSchema = z.object({\n id: z.string().openapi({ example: \"user_123\" }),\n email: z.string().email().openapi({ example: \"dev@company.com\" }),\n name: z.string().nullable().openapi({ example: \"Dev User\" }),\n});\n\n${authMarker}\nregistry.registerPath({\n method: \"post\",\n path: \"/api/auth/sign-up/email\",\n tags: [\"Auth\"],\n summary: \"Register using email and password\",\n request: {\n body: {\n content: {\n \"application/json\": {\n schema: authSignUpSchema,\n },\n },\n },\n },\n responses: {\n 200: { description: \"Registration successful\" },\n },\n});\n\nregistry.registerPath({\n method: \"post\",\n path: \"/api/auth/sign-in/email\",\n tags: [\"Auth\"],\n summary: \"Sign in using email and password\",\n request: {\n body: {\n content: {\n \"application/json\": {\n schema: authSignInSchema,\n },\n },\n },\n },\n responses: {\n 200: { description: \"Sign in successful\" },\n 401: { description: \"Invalid credentials\" },\n },\n});\n\nregistry.registerPath({\n method: \"post\",\n path: \"/api/auth/sign-out\",\n tags: [\"Auth\"],\n summary: \"Sign out current user\",\n responses: {\n 200: { description: \"Sign out successful\" },\n },\n});\n\nregistry.registerPath({\n method: \"get\",\n path: \"/api/users/me\",\n tags: [\"Auth\"],\n summary: \"Get current authenticated user\",\n security: [{ bearerAuth: [] }],\n responses: {\n 200: {\n description: \"Current user\",\n content: {\n \"application/json\": {\n schema: z.object({ user: authUserSchema }),\n },\n },\n },\n 401: { description: \"Not authenticated\" },\n },\n});\n`;\n\n content = content.replace(moduleDocsEndMarker, `${authBlock}\\n${moduleDocsEndMarker}`);\n await fs.writeFile(openApiPath, content);\n\n return true;\n}\n\nexport interface AuthPromptResult {\n shouldInstallDocsForAuth: boolean;\n authDatabaseDialect: DatabaseModuleName | null;\n}\n\n/**\n * Runs auth-specific prompts (docs co-install).\n * Returns null if the user cancels.\n */\nexport async function promptAuthConfig(\n projectRoot: string,\n srcDir: string,\n options: { yes?: boolean },\n): Promise<AuthPromptResult | null> {\n const { isDocsModuleInstalled } = await import(\"./docs.handler\");\n const docsInstalled = await isDocsModuleInstalled(projectRoot, srcDir);\n let shouldInstallDocsForAuth = false;\n\n if (!docsInstalled) {\n if (options.yes) {\n shouldInstallDocsForAuth = true;\n } else {\n const docsResponse = await prompts({\n type: \"confirm\",\n name: \"installDocs\",\n message: \"Install API docs module (Scalar + OpenAPI) too?\",\n initial: true,\n });\n\n if (docsResponse.installDocs === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n shouldInstallDocsForAuth = docsResponse.installDocs;\n }\n }\n\n const { detectInstalledDatabaseDialect } = await import(\"./database.handler\");\n const authDatabaseDialect = await detectInstalledDatabaseDialect(projectRoot, srcDir);\n\n return { shouldInstallDocsForAuth, authDatabaseDialect };\n}\n\n/**\n * Prints post-install hints for the auth module.\n */\nexport function printAuthHints(generatedAuthSecret: boolean) {\n if (generatedAuthSecret) {\n console.log(chalk.yellow(\"ℹ BETTER_AUTH_SECRET was generated automatically.\"));\n } else {\n console.log(chalk.yellow(\"ℹ Review BETTER_AUTH_SECRET and BETTER_AUTH_URL in .env.\"));\n }\n\n console.log(chalk.yellow(\"ℹ Run migrations: npx drizzle-kit generate && npx drizzle-kit migrate\"));\n}\n","import prompts from \"prompts\";\nimport chalk from \"chalk\";\n\nexport interface MailerPromptResult {\n mailerProvider: \"smtp\" | \"resend\";\n customSmtpVars: Record<string, string> | undefined;\n usedDefaultSmtp: boolean;\n}\n\n/**\n * Runs all mailer-specific interactive prompts (provider selection + credentials).\n * Returns null if the user cancels.\n */\nexport async function promptMailerConfig(): Promise<MailerPromptResult | null> {\n const providerResponse = await prompts({\n type: \"select\",\n name: \"provider\",\n message: \"Which email provider?\",\n choices: [\n { title: \"SMTP (Nodemailer)\", description: \"Gmail, Mailtrap, any SMTP server\", value: \"smtp\" },\n { title: \"Resend\", description: \"API-based, easiest setup\", value: \"resend\" },\n ],\n });\n\n if (providerResponse.provider === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n const mailerProvider: \"smtp\" | \"resend\" = providerResponse.provider;\n let customSmtpVars: Record<string, string> | undefined;\n let usedDefaultSmtp = false;\n\n console.log(chalk.dim(\" Tip: Leave fields blank to use placeholder values and configure later\\n\"));\n\n if (mailerProvider === \"smtp\") {\n const smtpResponse = await prompts([\n {\n type: \"text\",\n name: \"host\",\n message: \"SMTP Host\",\n initial: \"\",\n },\n {\n type: \"text\",\n name: \"port\",\n message: \"SMTP Port\",\n initial: \"587\",\n },\n {\n type: \"text\",\n name: \"user\",\n message: \"SMTP User\",\n initial: \"\",\n },\n {\n type: \"password\",\n name: \"pass\",\n message: \"SMTP Password\",\n },\n {\n type: \"text\",\n name: \"from\",\n message: \"Mail From address\",\n initial: \"\",\n },\n ]);\n\n if (smtpResponse.host === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n const host = smtpResponse.host?.trim() || \"\";\n const user = smtpResponse.user?.trim() || \"\";\n const pass = smtpResponse.pass?.trim() || \"\";\n const from = smtpResponse.from?.trim() || \"\";\n const port = smtpResponse.port?.trim() || \"587\";\n\n usedDefaultSmtp = !host && !user;\n\n if (!usedDefaultSmtp) {\n customSmtpVars = {\n SMTP_HOST: host || \"smtp.example.com\",\n SMTP_PORT: port,\n SMTP_USER: user || \"your-email@example.com\",\n SMTP_PASS: pass || \"your-password\",\n MAIL_FROM: from || \"noreply@example.com\",\n };\n }\n } else {\n const resendResponse = await prompts([\n {\n type: \"text\",\n name: \"apiKey\",\n message: \"Resend API Key\",\n initial: \"\",\n },\n {\n type: \"text\",\n name: \"from\",\n message: \"Mail From address\",\n initial: \"\",\n },\n ]);\n\n if (resendResponse.apiKey === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n const apiKey = resendResponse.apiKey?.trim() || \"\";\n const from = resendResponse.from?.trim() || \"\";\n\n usedDefaultSmtp = !apiKey;\n\n if (!usedDefaultSmtp) {\n customSmtpVars = {\n RESEND_API_KEY: apiKey || \"re_your_api_key\",\n MAIL_FROM: from || \"onboarding@resend.dev\",\n };\n }\n }\n\n return { mailerProvider, customSmtpVars, usedDefaultSmtp };\n}\n\n/**\n * Prints post-install hints for the mailer module.\n */\nexport function printMailerHints(usedDefaultSmtp: boolean) {\n if (usedDefaultSmtp) {\n console.log(chalk.yellow(\"ℹ Placeholder SMTP values added to .env — update them before sending emails.\"));\n } else {\n console.log(chalk.yellow(\"ℹ Review SMTP configuration in .env to ensure values are correct.\"));\n }\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\n\n/**\n * Modifies app.ts to include error handler middleware\n * (notFoundHandler + errorHandler, must be registered last).\n */\nexport async function injectErrorHandler(projectRoot: string, srcDir: string): Promise<boolean> {\n const appPath = path.join(projectRoot, srcDir, \"app.ts\");\n\n if (!fs.existsSync(appPath)) {\n return false;\n }\n\n let content = await fs.readFile(appPath, \"utf-8\");\n\n const errorImport = `import { errorHandler, notFoundHandler } from \"./middleware/error-handler\";`;\n const hasErrorImport = content.includes(errorImport);\n const hasNotFoundUse = /app\\.use\\(\\s*notFoundHandler\\s*\\)/.test(content);\n const hasErrorUse = /app\\.use\\(\\s*errorHandler\\s*\\)/.test(content);\n let modified = false;\n let importInserted = hasErrorImport;\n\n if (!hasErrorImport) {\n const importRegex = /^import .+ from .+;?\\s*$/gm;\n let lastImportIndex = 0;\n let match;\n\n while ((match = importRegex.exec(content)) !== null) {\n lastImportIndex = match.index + match[0].length;\n }\n\n if (lastImportIndex > 0) {\n content = content.slice(0, lastImportIndex) + `\\n${errorImport}` + content.slice(lastImportIndex);\n modified = true;\n importInserted = true;\n }\n }\n\n let setupInserted = hasNotFoundUse && hasErrorUse;\n if (!setupInserted) {\n const setupLines: string[] = [];\n if (!hasNotFoundUse) {\n setupLines.push(\"app.use(notFoundHandler);\");\n }\n\n if (!hasErrorUse) {\n setupLines.push(\"app.use(errorHandler);\");\n }\n\n const errorSetup = `\\n// Error handling (must be last)\\n${setupLines.join(\"\\n\")}\\n`;\n const exportMatch = content.match(/export default app;?\\s*$/m);\n\n if (exportMatch && exportMatch.index !== undefined) {\n content = content.slice(0, exportMatch.index) + errorSetup + \"\\n\" + content.slice(exportMatch.index);\n modified = true;\n setupInserted = true;\n }\n }\n\n if (modified) {\n await fs.writeFile(appPath, content);\n }\n\n return importInserted && setupInserted;\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\n\n/**\n * Modifies app.ts to include rate limiter middleware.\n * Inserts `app.use(rateLimiter)` after `express.json()` and before route mounting.\n */\nexport async function injectRateLimiter(projectRoot: string, srcDir: string): Promise<boolean> {\n const appPath = path.join(projectRoot, srcDir, \"app.ts\");\n\n if (!fs.existsSync(appPath)) {\n return false;\n }\n\n let content = await fs.readFile(appPath, \"utf-8\");\n\n const rateLimiterImport = `import { rateLimiter } from \"./middleware/rate-limiter\";`;\n const hasImport = content.includes(rateLimiterImport);\n const hasUse = /app\\.use\\(\\s*rateLimiter\\s*\\)/.test(content);\n\n if (hasImport && hasUse) {\n return true; // already configured\n }\n\n let modified = false;\n\n // Insert import\n if (!hasImport) {\n const importRegex = /^import .+ from .+;?\\s*$/gm;\n let lastImportIndex = 0;\n let match;\n\n while ((match = importRegex.exec(content)) !== null) {\n lastImportIndex = match.index + match[0].length;\n }\n\n if (lastImportIndex > 0) {\n content = content.slice(0, lastImportIndex) + `\\n${rateLimiterImport}` + content.slice(lastImportIndex);\n modified = true;\n }\n }\n\n // Insert app.use(rateLimiter) after express.json()\n if (!hasUse) {\n const jsonMiddleware = /^(\\s*app\\.use\\(\\s*express\\.json\\(\\)\\s*\\);?\\s*)$/m;\n const jsonMatch = content.match(jsonMiddleware);\n\n if (jsonMatch && jsonMatch.index !== undefined) {\n const insertAt = jsonMatch.index + jsonMatch[0].length;\n content = content.slice(0, insertAt) + `\\napp.use(rateLimiter);` + content.slice(insertAt);\n modified = true;\n } else {\n // Fallback: insert before route mounting\n const routeMount = /^\\s*app\\.use\\(\\s*[\"']\\/api[\"']/m;\n const routeMatch = content.match(routeMount);\n\n if (routeMatch && routeMatch.index !== undefined) {\n content = content.slice(0, routeMatch.index) + `app.use(rateLimiter);\\n` + content.slice(routeMatch.index);\n modified = true;\n }\n }\n }\n\n if (modified) {\n await fs.writeFile(appPath, content);\n }\n\n return true;\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport chalk from \"chalk\";\nimport { appendImport } from \"../utils/code-inject\";\nimport { readZuroConfig } from \"../utils/config\";\n\nexport type UploadProvider = \"s3\" | \"r2\" | \"cloudinary\";\nexport type UploadMode = \"proxy\" | \"direct\" | \"large\";\nexport type UploadAuthMode = \"required\" | \"optional\" | \"none\";\nexport type UploadAccess = \"private\" | \"public\";\nexport type UploadPreset = \"image\" | \"document\" | \"video\" | \"mixed\";\n\ninterface UploadPresetConfig {\n mimeTypes: string[];\n maxFileSize: number;\n maxFiles: number;\n}\n\nconst UPLOAD_PRESETS: Record<UploadPreset, UploadPresetConfig> = {\n image: {\n mimeTypes: [\"image/jpeg\", \"image/png\", \"image/webp\", \"image/gif\"],\n maxFileSize: 5 * 1024 * 1024,\n maxFiles: 1,\n },\n document: {\n mimeTypes: [\n \"application/pdf\",\n \"text/plain\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n ],\n maxFileSize: 10 * 1024 * 1024,\n maxFiles: 3,\n },\n video: {\n mimeTypes: [\"video/mp4\", \"video/quicktime\", \"video/webm\"],\n maxFileSize: 100 * 1024 * 1024,\n maxFiles: 1,\n },\n mixed: {\n mimeTypes: [\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"application/pdf\",\n \"text/plain\",\n \"video/mp4\",\n ],\n maxFileSize: 25 * 1024 * 1024,\n maxFiles: 5,\n },\n};\n\nexport interface UploadPromptResult {\n provider: UploadProvider;\n mode: UploadMode;\n authMode: UploadAuthMode;\n access: UploadAccess;\n preset: UploadPreset;\n useDatabaseMetadata: boolean;\n shouldInstallAuth: boolean;\n shouldInstallDatabase: boolean;\n envVars: Record<string, string>;\n}\n\nexport function getUploadEnvSchemaFields(provider: UploadProvider) {\n const shared = [\n { name: \"UPLOAD_PROVIDER\", schema: `z.enum([\"s3\", \"r2\", \"cloudinary\"])` },\n { name: \"UPLOAD_MODE\", schema: `z.enum([\"proxy\", \"direct\", \"large\"])` },\n { name: \"UPLOAD_AUTH_MODE\", schema: `z.enum([\"required\", \"optional\", \"none\"])` },\n { name: \"UPLOAD_FILE_ACCESS\", schema: `z.enum([\"private\", \"public\"])` },\n { name: \"UPLOAD_FILE_PRESET\", schema: `z.enum([\"image\", \"document\", \"video\", \"mixed\"])` },\n { name: \"UPLOAD_KEY_PREFIX\", schema: \"z.string().min(1)\" },\n { name: \"UPLOAD_ALLOWED_MIME\", schema: \"z.string().min(1)\" },\n { name: \"UPLOAD_MAX_FILE_SIZE\", schema: \"z.coerce.number().positive()\" },\n { name: \"UPLOAD_MAX_FILES\", schema: \"z.coerce.number().int().positive()\" },\n { name: \"UPLOAD_DIRECT_URL_TTL_SECONDS\", schema: \"z.coerce.number().int().positive().default(900)\" },\n { name: \"UPLOAD_ACCESS_URL_TTL_SECONDS\", schema: \"z.coerce.number().int().positive().default(300)\" },\n { name: \"UPLOAD_MULTIPART_PART_SIZE\", schema: \"z.coerce.number().int().positive().default(5242880)\" },\n ];\n\n if (provider === \"cloudinary\") {\n return [\n ...shared,\n { name: \"CLOUDINARY_CLOUD_NAME\", schema: \"z.string().min(1)\" },\n { name: \"CLOUDINARY_API_KEY\", schema: \"z.string().min(1)\" },\n { name: \"CLOUDINARY_API_SECRET\", schema: \"z.string().min(1)\" },\n { name: \"CLOUDINARY_FOLDER\", schema: \"z.string().min(1).default(\\\"uploads\\\")\" },\n { name: \"CLOUDINARY_UPLOAD_PRESET\", schema: \"z.string().default(\\\"\\\")\" },\n ];\n }\n\n return [\n ...shared,\n { name: \"UPLOAD_BUCKET\", schema: \"z.string().min(1)\" },\n { name: \"UPLOAD_REGION\", schema: \"z.string().min(1)\" },\n { name: \"UPLOAD_ENDPOINT\", schema: \"z.string().default(\\\"\\\")\" },\n { name: \"UPLOAD_ACCESS_KEY_ID\", schema: \"z.string().min(1)\" },\n { name: \"UPLOAD_SECRET_ACCESS_KEY\", schema: \"z.string().min(1)\" },\n { name: \"UPLOAD_PUBLIC_BASE_URL\", schema: \"z.string().default(\\\"\\\")\" },\n ];\n}\n\nasync function isAuthInstalled(projectRoot: string, srcDir: string) {\n return fs.pathExists(path.join(projectRoot, srcDir, \"lib\", \"auth.ts\"));\n}\n\nfunction hasDrizzleDatabase(config: Awaited<ReturnType<typeof readZuroConfig>> | null) {\n return config?.database?.orm === \"drizzle\";\n}\n\nasync function promptCredentials(provider: UploadProvider): Promise<Record<string, string> | null> {\n console.log(chalk.dim(\" Tip: Leave fields blank to use placeholders and configure later.\\n\"));\n\n if (provider === \"cloudinary\") {\n const response = await prompts([\n {\n type: \"text\",\n name: \"cloudName\",\n message: \"Cloudinary cloud name\",\n initial: \"\",\n },\n {\n type: \"text\",\n name: \"apiKey\",\n message: \"Cloudinary API key\",\n initial: \"\",\n },\n {\n type: \"password\",\n name: \"apiSecret\",\n message: \"Cloudinary API secret\",\n },\n {\n type: \"text\",\n name: \"folder\",\n message: \"Cloudinary folder\",\n initial: \"uploads\",\n },\n {\n type: \"text\",\n name: \"uploadPreset\",\n message: \"Cloudinary upload preset (optional)\",\n initial: \"\",\n },\n ]);\n\n if (response.cloudName === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n const values: Record<string, string> = {\n CLOUDINARY_CLOUD_NAME: response.cloudName?.trim() || \"your-cloud-name\",\n CLOUDINARY_API_KEY: response.apiKey?.trim() || \"your-api-key\",\n CLOUDINARY_API_SECRET: response.apiSecret?.trim() || \"your-api-secret\",\n CLOUDINARY_FOLDER: response.folder?.trim() || \"uploads\",\n CLOUDINARY_UPLOAD_PRESET: response.uploadPreset?.trim() || \"\",\n };\n\n return values;\n }\n\n const response = await prompts([\n {\n type: \"text\",\n name: \"bucket\",\n message: `${provider.toUpperCase()} bucket name`,\n initial: \"\",\n },\n {\n type: \"text\",\n name: \"region\",\n message: `${provider.toUpperCase()} region`,\n initial: provider === \"r2\" ? \"auto\" : \"us-east-1\",\n },\n {\n type: \"text\",\n name: \"endpoint\",\n message: provider === \"r2\" ? \"R2 S3 endpoint\" : \"Custom S3 endpoint (optional)\",\n initial: provider === \"r2\" ? \"https://<account-id>.r2.cloudflarestorage.com\" : \"\",\n },\n {\n type: \"text\",\n name: \"accessKeyId\",\n message: \"Access key ID\",\n initial: \"\",\n },\n {\n type: \"password\",\n name: \"secretAccessKey\",\n message: \"Secret access key\",\n },\n {\n type: \"text\",\n name: \"publicBaseUrl\",\n message: \"Public base URL (optional)\",\n initial: \"\",\n },\n ]);\n\n if (response.bucket === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n const values: Record<string, string> = {\n UPLOAD_BUCKET: response.bucket?.trim() || `your-${provider}-bucket`,\n UPLOAD_REGION: response.region?.trim() || (provider === \"r2\" ? \"auto\" : \"us-east-1\"),\n UPLOAD_ENDPOINT: response.endpoint?.trim() || (provider === \"r2\" ? \"https://<account-id>.r2.cloudflarestorage.com\" : \"\"),\n UPLOAD_ACCESS_KEY_ID: response.accessKeyId?.trim() || \"your-access-key-id\",\n UPLOAD_SECRET_ACCESS_KEY: response.secretAccessKey?.trim() || \"your-secret-access-key\",\n UPLOAD_PUBLIC_BASE_URL: response.publicBaseUrl?.trim() || \"\",\n };\n\n return values;\n}\n\nfunction buildSharedEnvVars(\n provider: UploadProvider,\n mode: UploadMode,\n authMode: UploadAuthMode,\n access: UploadAccess,\n preset: UploadPreset,\n maxFileSize: number,\n maxFiles: number\n) {\n return {\n UPLOAD_PROVIDER: provider,\n UPLOAD_MODE: mode,\n UPLOAD_AUTH_MODE: authMode,\n UPLOAD_FILE_ACCESS: access,\n UPLOAD_FILE_PRESET: preset,\n UPLOAD_KEY_PREFIX: \"uploads\",\n UPLOAD_ALLOWED_MIME: UPLOAD_PRESETS[preset].mimeTypes.join(\",\"),\n UPLOAD_MAX_FILE_SIZE: String(maxFileSize),\n UPLOAD_MAX_FILES: String(maxFiles),\n UPLOAD_DIRECT_URL_TTL_SECONDS: \"900\",\n UPLOAD_ACCESS_URL_TTL_SECONDS: \"300\",\n UPLOAD_MULTIPART_PART_SIZE: \"5242880\",\n };\n}\n\nexport async function promptUploadsConfig(\n projectRoot: string,\n srcDir: string\n): Promise<UploadPromptResult | null> {\n const projectConfig = await readZuroConfig(projectRoot);\n const authInstalled = await isAuthInstalled(projectRoot, srcDir);\n const drizzleInstalled = hasDrizzleDatabase(projectConfig);\n\n const initial = await prompts([\n {\n type: \"select\",\n name: \"provider\",\n message: \"Which upload provider?\",\n choices: [\n { title: \"S3\", value: \"s3\" },\n { title: \"R2\", value: \"r2\" },\n { title: \"Cloudinary\", value: \"cloudinary\" },\n ],\n initial: 0,\n },\n {\n type: \"select\",\n name: \"mode\",\n message: \"Which upload mode?\",\n choices: [\n { title: \"Proxy\", description: \"API server receives the file and uploads it\", value: \"proxy\" },\n { title: \"Direct\", description: \"Client uploads directly with signed params/URLs\", value: \"direct\" },\n { title: \"Large\", description: \"Multipart upload flow for large files\", value: \"large\" },\n ],\n initial: 1,\n },\n {\n type: \"select\",\n name: \"authMode\",\n message: \"Who can upload?\",\n choices: [\n { title: \"Authenticated only\", value: \"required\" },\n { title: \"Optional auth\", value: \"optional\" },\n { title: \"Public\", value: \"none\" },\n ],\n initial: authInstalled ? 0 : 2,\n },\n {\n type: \"select\",\n name: \"access\",\n message: \"How should uploaded files be accessed?\",\n choices: [\n { title: \"Private\", value: \"private\" },\n { title: \"Public\", value: \"public\" },\n ],\n initial: 0,\n },\n {\n type: \"select\",\n name: \"preset\",\n message: \"Which file preset?\",\n choices: [\n { title: \"Image\", value: \"image\" },\n { title: \"Document\", value: \"document\" },\n { title: \"Video\", value: \"video\" },\n { title: \"Mixed\", value: \"mixed\" },\n ],\n initial: 0,\n },\n {\n type: \"confirm\",\n name: \"useDefaults\",\n message: \"Use recommended upload limits for this preset?\",\n initial: true,\n },\n ]);\n\n if (initial.provider === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n const provider = initial.provider as UploadProvider;\n const mode = initial.mode as UploadMode;\n const authMode = initial.authMode as UploadAuthMode;\n const access = initial.access as UploadAccess;\n const preset = initial.preset as UploadPreset;\n\n if (provider === \"cloudinary\" && mode === \"large\") {\n console.log(chalk.yellow(\"\\nCloudinary large multipart scaffolding is not available in this module yet.\"));\n console.log(chalk.yellow(\"Use S3 or R2 for large uploads, or pick Proxy/Direct for Cloudinary.\\n\"));\n return null;\n }\n\n if (provider === \"cloudinary\" && (preset === \"document\" || preset === \"mixed\")) {\n const warning = await prompts({\n type: \"confirm\",\n name: \"continue\",\n message: \"Cloudinary is media-first. Continue with Cloudinary for non-media/general files?\",\n initial: false,\n });\n\n if (!warning.continue) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n }\n\n const presetDefaults = UPLOAD_PRESETS[preset];\n let maxFileSize = presetDefaults.maxFileSize;\n let maxFiles = presetDefaults.maxFiles;\n\n if (!initial.useDefaults) {\n const custom = await prompts([\n {\n type: \"number\",\n name: \"maxFileSizeMb\",\n message: \"Max file size (MB)\",\n initial: Math.max(1, Math.round(presetDefaults.maxFileSize / (1024 * 1024))),\n min: 1,\n },\n {\n type: \"number\",\n name: \"maxFiles\",\n message: \"Max files per request\",\n initial: presetDefaults.maxFiles,\n min: 1,\n max: 20,\n },\n ]);\n\n if (custom.maxFileSizeMb === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n maxFileSize = Number(custom.maxFileSizeMb) * 1024 * 1024;\n maxFiles = Number(custom.maxFiles);\n }\n\n let useDatabaseMetadata = false;\n let shouldInstallDatabase = false;\n\n const metadataPrompt = await prompts({\n type: \"select\",\n name: \"metadata\",\n message: \"Upload metadata storage?\",\n choices: [\n { title: drizzleInstalled ? \"Database\" : \"Install database + track uploads\", value: \"db\" },\n { title: \"No metadata\", value: \"none\" },\n ],\n initial: 0,\n });\n\n if (metadataPrompt.metadata === undefined) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n if (metadataPrompt.metadata === \"db\") {\n useDatabaseMetadata = true;\n\n if (!projectConfig?.database) {\n shouldInstallDatabase = true;\n } else if (!drizzleInstalled) {\n console.log(chalk.yellow(\"\\nUploads metadata currently supports Drizzle-based database setups only.\"));\n console.log(chalk.yellow(\"Install or switch to a Drizzle database, or continue without metadata.\\n\"));\n return null;\n }\n }\n\n if (access === \"private\" && !useDatabaseMetadata) {\n const warning = await prompts({\n type: \"confirm\",\n name: \"continue\",\n message: \"Private uploads work best with metadata. Continue without database tracking?\",\n initial: false,\n });\n\n if (!warning.continue) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n }\n\n let shouldInstallAuth = false;\n if (authMode !== \"none\" && !authInstalled) {\n const authPrompt = await prompts({\n type: \"confirm\",\n name: \"installAuth\",\n message: \"Uploads auth requires the auth module. Install auth now?\",\n initial: true,\n });\n\n if (!authPrompt.installAuth) {\n console.log(chalk.yellow(\"Operation cancelled.\"));\n return null;\n }\n\n shouldInstallAuth = true;\n }\n\n const providerEnv = await promptCredentials(provider);\n if (!providerEnv) {\n return null;\n }\n\n return {\n provider,\n mode,\n authMode,\n access,\n preset,\n useDatabaseMetadata,\n shouldInstallAuth,\n shouldInstallDatabase,\n envVars: {\n ...buildSharedEnvVars(provider, mode, authMode, access, preset, maxFileSize, maxFiles),\n ...providerEnv,\n },\n };\n}\n\nexport async function injectUploadsRoutes(projectRoot: string, srcDir: string): Promise<boolean> {\n const routeIndexPath = path.join(projectRoot, srcDir, \"routes\", \"index.ts\");\n const routeImport = `import uploadsRoutes from \"./uploads.routes\";`;\n const routeMountPattern = /rootRouter\\.use\\(\\s*[\"']\\/uploads[\"']\\s*,\\s*uploadsRoutes\\s*\\)/;\n\n if (await fs.pathExists(routeIndexPath)) {\n let routeContent = await fs.readFile(routeIndexPath, \"utf-8\");\n let routeModified = false;\n\n const importResult = appendImport(routeContent, routeImport);\n if (!importResult.inserted) {\n return false;\n }\n\n if (importResult.source !== routeContent) {\n routeContent = importResult.source;\n routeModified = true;\n }\n\n if (!routeMountPattern.test(routeContent)) {\n const routeSetup = `\\n// Upload routes\\nrootRouter.use(\"/uploads\", uploadsRoutes);\\n`;\n const exportMatch = routeContent.match(/export default rootRouter;?\\s*$/m);\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n routeContent = routeContent.slice(0, exportMatch.index) + routeSetup + \"\\n\" + routeContent.slice(exportMatch.index);\n routeModified = true;\n }\n\n if (routeModified) {\n await fs.writeFile(routeIndexPath, routeContent);\n }\n\n return true;\n }\n\n const appPath = path.join(projectRoot, srcDir, \"app.ts\");\n if (!await fs.pathExists(appPath)) {\n return false;\n }\n\n let appContent = await fs.readFile(appPath, \"utf-8\");\n let appModified = false;\n\n const appImportResult = appendImport(appContent, `import uploadsRoutes from \"./routes/uploads.routes\";`);\n if (!appImportResult.inserted) {\n return false;\n }\n\n if (appImportResult.source !== appContent) {\n appContent = appImportResult.source;\n appModified = true;\n }\n\n const hasMount = /app\\.use\\(\\s*[\"']\\/api\\/uploads[\"']\\s*,\\s*uploadsRoutes\\s*\\)/.test(appContent);\n if (!hasMount) {\n const setup = `\\n// Upload routes\\napp.use(\"/api/uploads\", uploadsRoutes);\\n`;\n const exportMatch = appContent.match(/export default app;?\\s*$/m);\n if (!exportMatch || exportMatch.index === undefined) {\n return false;\n }\n\n appContent = appContent.slice(0, exportMatch.index) + setup + \"\\n\" + appContent.slice(exportMatch.index);\n appModified = true;\n }\n\n if (appModified) {\n await fs.writeFile(appPath, appContent);\n }\n\n return true;\n}\n\nexport async function isUploadsModuleInstalled(projectRoot: string, srcDir: string): Promise<boolean> {\n return fs.pathExists(path.join(projectRoot, srcDir, \"routes\", \"uploads.routes.ts\"));\n}\n\nexport async function detectInstalledUploadsMode(projectRoot: string): Promise<UploadMode | null> {\n const envPath = path.join(projectRoot, \".env\");\n if (!await fs.pathExists(envPath)) {\n return null;\n }\n\n const content = await fs.readFile(envPath, \"utf-8\");\n const match = content.match(/^UPLOAD_MODE=(proxy|direct|large)$/m);\n\n if (!match) {\n return null;\n }\n\n return match[1] as UploadMode;\n}\n\nexport async function injectUploadsDocs(\n projectRoot: string,\n srcDir: string,\n mode: UploadMode\n): Promise<boolean> {\n const openApiPath = path.join(projectRoot, srcDir, \"lib\", \"openapi.ts\");\n if (!await fs.pathExists(openApiPath)) {\n return false;\n }\n\n const marker = \"// ZURO_UPLOADS_DOCS\";\n let content = await fs.readFile(openApiPath, \"utf-8\");\n if (content.includes(marker)) {\n return true;\n }\n\n const moduleDocsEndMarker = \"// ZURO_DOCS_MODULES_END\";\n if (!content.includes(moduleDocsEndMarker)) {\n return false;\n }\n\n const commonBlock = `\\nconst uploadAccessSchema = z.object({\n key: z.string().openapi({ example: \"uploads/users/user_123/2026/03/06/example.png\" }),\n resourceType: z.string().optional().openapi({ example: \"image\" }),\n providerAssetId: z.string().optional().openapi({ example: \"uploads/users/user_123/example\" }),\n});\n\\n`;\n\n const directBlock = mode === \"direct\"\n ? `registry.registerPath({\n method: \"post\",\n path: \"/api/uploads/presign\",\n tags: [\"Uploads\"],\n summary: \"Create a signed direct upload request\",\n request: {\n body: {\n content: {\n \"application/json\": {\n schema: z.object({\n originalName: z.string().min(1),\n mimeType: z.string().min(1),\n bytes: z.number().positive(),\n }),\n },\n },\n },\n },\n responses: {\n 200: { description: \"Signed upload created\" },\n },\n});\n\\nregistry.registerPath({\n method: \"post\",\n path: \"/api/uploads/complete\",\n tags: [\"Uploads\"],\n summary: \"Finalize a direct upload and persist metadata\",\n responses: {\n 201: { description: \"Upload finalized\" },\n },\n});\n`\n : \"\";\n\n const proxyBlock = mode === \"proxy\"\n ? `registry.registerPath({\n method: \"post\",\n path: \"/api/uploads\",\n tags: [\"Uploads\"],\n summary: \"Upload a file through the API server\",\n responses: {\n 201: { description: \"File uploaded\" },\n },\n});\n`\n : \"\";\n\n const largeBlock = mode === \"large\"\n ? `registry.registerPath({\n method: \"post\",\n path: \"/api/uploads/multipart/init\",\n tags: [\"Uploads\"],\n summary: \"Start a multipart upload session\",\n responses: {\n 200: { description: \"Multipart upload initialized\" },\n },\n});\n\\nregistry.registerPath({\n method: \"post\",\n path: \"/api/uploads/multipart/complete\",\n tags: [\"Uploads\"],\n summary: \"Complete a multipart upload\",\n responses: {\n 201: { description: \"Multipart upload completed\" },\n },\n});\n\\nregistry.registerPath({\n method: \"post\",\n path: \"/api/uploads/multipart/abort\",\n tags: [\"Uploads\"],\n summary: \"Abort a multipart upload\",\n responses: {\n 204: { description: \"Multipart upload aborted\" },\n },\n});\n`\n : \"\";\n\n const sharedOps = `registry.registerPath({\n method: \"post\",\n path: \"/api/uploads/access-url\",\n tags: [\"Uploads\"],\n summary: \"Create an access URL for an uploaded file\",\n request: {\n body: {\n content: {\n \"application/json\": {\n schema: uploadAccessSchema,\n },\n },\n },\n },\n responses: {\n 200: { description: \"Access URL generated\" },\n },\n});\n\\nregistry.registerPath({\n method: \"delete\",\n path: \"/api/uploads\",\n tags: [\"Uploads\"],\n summary: \"Delete an uploaded file\",\n request: {\n body: {\n content: {\n \"application/json\": {\n schema: uploadAccessSchema,\n },\n },\n },\n },\n responses: {\n 204: { description: \"Upload deleted\" },\n },\n});\n`;\n\n const block = `\\n${commonBlock}${marker}\\n${proxyBlock}${directBlock}${largeBlock}${sharedOps}`;\n content = content.replace(moduleDocsEndMarker, `${block}\\n${moduleDocsEndMarker}`);\n\n const tagInsert = /(\\{\\s*name:\\s*\"Auth\".+\\},\\s*\\n\\s*\\],)/;\n if (tagInsert.test(content) && !content.includes(`{ name: \"Uploads\", description: \"File uploads and asset access\" }`)) {\n content = content.replace(\n tagInsert,\n `{ name: \"Auth\", description: \"Authentication and session endpoints\" },\\n { name: \"Uploads\", description: \"File uploads and asset access\" },\\n ],`\n );\n }\n\n await fs.writeFile(openApiPath, content);\n return true;\n}\n\nexport function printUploadHints(result: UploadPromptResult) {\n console.log(chalk.yellow(\"ℹ Upload routes are mounted at: /api/uploads\"));\n console.log(chalk.yellow(`ℹ Provider: ${result.provider} · Mode: ${result.mode} · Access: ${result.access}`));\n\n if (result.mode === \"proxy\") {\n console.log(chalk.yellow(\"ℹ Reuse uploadSingle()/uploadArray() from src/lib/uploads/proxy.ts in your own form + file routes.\"));\n }\n\n if (result.provider === \"r2\") {\n console.log(chalk.yellow(\"ℹ R2 presigned URLs use the R2 S3 API endpoint, not your custom domain.\"));\n }\n\n if (result.useDatabaseMetadata) {\n console.log(chalk.yellow(\"ℹ Upload metadata is stored in db/schema/uploads.ts.\"));\n } else {\n console.log(chalk.yellow(\"ℹ No upload metadata table was added. Private file ownership checks fall back to key prefixes.\"));\n }\n}\n"],"mappings":"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","names":["path","fs","prompts","chalk","import_path","import_fs_extra","import_prompts","import_chalk","fs","path","chalk","import_path","import_fs_extra","import_chalk","import_fs_extra","import_path","path","fs","import_fs_extra","import_path","path","fs","os","import_fs_extra","import_path","path","fs","chalk","path","fs","prompts","chalk","ora","import_ora","import_path","import_fs_extra","import_node_crypto","import_fs_extra","import_path","import_chalk","fs","path","chalk","import_path","resolveSafeTargetPath","path","import_chalk","import_path","import_fs_extra","import_prompts","import_chalk","fs","path","isDocsModuleInstalled","prompts","chalk","detectInstalledDatabaseDialect","import_prompts","import_chalk","prompts","chalk","import_path","import_fs_extra","path","fs","import_path","import_fs_extra","path","fs","import_path","import_fs_extra","import_prompts","import_chalk","fs","path","chalk","response","prompts","values","fs","path","ora","module","chalk","resolveSafeTargetPath","module"]}
|