@farm.js/cli 0.1.0-beta.19 → 0.1.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +71 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +71 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["existsSync","path","formatCommand","readFileSync","sanitizePreviewName","randomPreviewName","normalizePreviewDomain","delay","delay","escapeRegExp","ROUTE_EXTENSIONS","formatError","formatCount","formatError"],"sources":["../src/deploy.ts","../src/preview-gateway.ts","../src/preview.ts","../src/generate.ts","../src/doctor.ts","../src/explain.ts","../src/cron.ts","../src/migrate.ts","../src/auth.ts","../src/upgrade.ts"],"sourcesContent":["import { execFileSync } from \"child_process\";\nimport { existsSync, readFileSync } from \"fs\";\nimport path from \"path\";\nimport {\n getPresetForDeployTarget,\n getFarmPresetRuntime,\n loadConfig,\n logger,\n normalizeDeployTarget,\n resolveConfig,\n resolveDeployConfig,\n resolveDeployOutputPath,\n} from \"@farm.js/core\";\nimport { buildFarm } from \"./build\";\n\nexport interface DeployFarmOptions {\n root?: string;\n vercel?: boolean;\n cloudflare?: boolean;\n netlify?: boolean;\n prod?: boolean;\n /** Print the resolved build and deployment operations without executing them. */\n plan?: boolean;\n}\n\nexport type FarmDeployErrorCode =\n | \"CLI_NOT_INSTALLED\"\n | \"CLI_NOT_AUTHENTICATED\"\n | \"INVALID_BUILD_OUTPUT\"\n | \"DEPLOY_FAILED\";\n\nexport class FarmDeployError extends Error {\n readonly code: FarmDeployErrorCode;\n readonly platform: FarmDeployPlan[\"target\"];\n readonly cause?: unknown;\n\n constructor(\n code: FarmDeployErrorCode,\n platform: FarmDeployPlan[\"target\"],\n message: string,\n options?: { cause?: unknown },\n ) {\n super(message);\n this.name = \"FarmDeployError\";\n this.code = code;\n this.platform = platform;\n this.cause = options?.cause;\n }\n}\n\nexport interface FarmDeployPlan {\n root: string;\n target: \"vercel\" | \"cloudflare\" | \"netlify\";\n preset: string;\n runtime: \"node\" | \"edge\" | \"unknown\";\n outputDir: string;\n production: boolean;\n build: { command: string; cwd: string };\n deploy: FarmDeployCommand;\n cloudflareAgent?: CloudflareAgentDeployPlan;\n}\n\nexport interface FarmDeployCommand {\n command: string;\n cwd: string;\n executable: string;\n args: string[];\n}\n\nexport interface CloudflareAgentDeployPlan {\n configPath: string;\n environment?: string;\n /** The integration will create this config as part of the production build. */\n generated?: boolean;\n}\n\n/**\n * Deploy Farm.js application\n */\nexport async function deployFarm(options: DeployFarmOptions = {}) {\n const { plan, deployConfig } = await resolveFarmDeployContext(options);\n\n if (options.plan) {\n logger.info(formatFarmDeployPlan(plan));\n return plan;\n }\n\n logger.info(`🚀 Building with ${plan.preset} preset...`);\n await buildFarm({ root: plan.root, preset: plan.preset });\n\n if (!existsSync(plan.outputDir)) {\n throw new FarmDeployError(\n \"INVALID_BUILD_OUTPUT\",\n plan.target,\n `Build output not found at ${plan.outputDir}. Please run 'farm build' first.`,\n );\n }\n\n await deployPlatform(plan.target, plan.root, plan.outputDir, deployConfig, options.prod);\n return plan;\n}\n\nexport async function createFarmDeployPlan(\n options: DeployFarmOptions = {},\n): Promise<FarmDeployPlan> {\n return (await resolveFarmDeployContext(options)).plan;\n}\n\nexport function formatFarmDeployPlan(plan: FarmDeployPlan): string {\n return [\n \"FARM / DEPLOY PLAN\",\n \"\",\n `Target: ${plan.target}`,\n `Preset: ${plan.preset}`,\n `Runtime: ${plan.runtime}`,\n `Output: ${plan.outputDir}`,\n `Production: ${plan.production ? \"yes\" : \"no\"}`,\n \"\",\n `1. ${plan.build.command}`,\n ` cwd: ${plan.build.cwd}`,\n `2. ${plan.deploy.command}`,\n ` cwd: ${plan.deploy.cwd}`,\n ...(plan.cloudflareAgent\n ? [\n \"\",\n `Cloudflare Agent config: ${plan.cloudflareAgent.configPath}${plan.cloudflareAgent.generated ? \" (generated during build)\" : \"\"}`,\n ]\n : []),\n ].join(\"\\n\");\n}\n\nasync function resolveFarmDeployContext(options: DeployFarmOptions) {\n const root = path.resolve(options.root || process.cwd());\n const mode = \"production\";\n const userConfig = await loadConfig(root, undefined, mode);\n const config = await resolveConfig({ root, ...userConfig }, mode);\n\n // Determine platform and preset\n const cliTarget = options.vercel\n ? \"vercel\"\n : options.cloudflare\n ? \"cloudflare\"\n : options.netlify\n ? \"netlify\"\n : undefined;\n const platform = normalizeDeployTarget(cliTarget || config.deploy.target);\n\n if (platform !== \"vercel\" && platform !== \"cloudflare\" && platform !== \"netlify\") {\n throw new Error(\n \"Please specify a deployment target with --vercel, --cloudflare, --netlify, or farm.config deploy.target.\",\n );\n }\n\n const deployConfig = resolveDeployConfig(userConfig || {}, {\n target: platform,\n preset: cliTarget\n ? userConfig?.deploy?.preset || userConfig?.preset || getPresetForDeployTarget(platform)\n : undefined,\n });\n const preset = deployConfig.preset || getPresetForDeployTarget(platform) || \"node-server\";\n const nitroOutput = resolveDeployOutputPath(root, deployConfig.outputDir);\n const cloudflareAgent =\n platform === \"cloudflare\"\n ? resolveCloudflareAgentDeployPlan(root) ||\n resolveConfiguredCloudflareAgentDeployPlan(root, config.integrations)\n : undefined;\n const deploy = createDeployCommand(\n platform,\n root,\n nitroOutput,\n deployConfig,\n options.prod,\n cloudflareAgent,\n );\n const plan: FarmDeployPlan = {\n root: path.resolve(root),\n target: platform,\n preset,\n runtime: getFarmPresetRuntime(preset),\n outputDir: nitroOutput,\n production: platform === \"netlify\" || Boolean(options.prod),\n build: {\n command: `farm build --preset ${preset}`,\n cwd: path.resolve(root),\n },\n deploy,\n ...(cloudflareAgent ? { cloudflareAgent } : {}),\n };\n\n return { plan, deployConfig };\n}\n\nfunction createDeployCommand(\n platform: FarmDeployPlan[\"target\"],\n root: string,\n outputDir: string,\n deployConfig: ReturnType<typeof resolveDeployConfig>,\n prod: boolean | undefined,\n cloudflareAgent: CloudflareAgentDeployPlan | undefined,\n): FarmDeployPlan[\"deploy\"] {\n if (platform === \"vercel\") {\n const args = [\"deploy\", \"--prebuilt\", \"--yes\", ...(prod ? [\"--prod\"] : [])];\n return {\n command: formatCommand(\"vercel\", args),\n cwd: path.resolve(root),\n executable: \"vercel\",\n args,\n };\n }\n if (platform === \"netlify\") {\n const args = createNetlifyDeployArgs(deployConfig.netlify?.site);\n return {\n command: formatCommand(\"netlify\", args),\n cwd: outputDir,\n executable: \"netlify\",\n args,\n };\n }\n if (cloudflareAgent) {\n const args = [\n \"deploy\",\n \"--config\",\n cloudflareAgent.configPath,\n ...(cloudflareAgent.environment ? [\"--env\", cloudflareAgent.environment] : []),\n ];\n return {\n command: formatCommand(\"wrangler\", args),\n cwd: path.resolve(root),\n executable: \"wrangler\",\n args,\n };\n }\n const projectName =\n deployConfig.cloudflare?.projectName || deployConfig.projectName || \"farm-app\";\n const args = [\"pages\", \"deploy\", \".\", `--project-name=${projectName}`];\n return {\n command: formatCommand(\"wrangler\", args),\n cwd: outputDir,\n executable: \"wrangler\",\n args,\n };\n}\n\nfunction createNetlifyDeployArgs(site?: string): string[] {\n return [\"deploy\", \"--prod\", \"--dir=.\", ...(site ? [`--site=${site}`] : [])];\n}\n\n/**\n * Deploy using platform's native CLI (user credentials)\n */\nasync function deployPlatform(\n platform: \"vercel\" | \"cloudflare\" | \"netlify\",\n root: string,\n outputDir: string,\n deployConfig: ReturnType<typeof resolveDeployConfig>,\n prod?: boolean,\n) {\n switch (platform) {\n case \"vercel\":\n await deployVercel(root, outputDir, prod);\n break;\n case \"cloudflare\":\n await deployCloudflare(\n root,\n outputDir,\n deployConfig.cloudflare?.projectName || deployConfig.projectName,\n );\n break;\n case \"netlify\":\n await deployNetlify(root, outputDir, deployConfig.netlify?.site);\n break;\n }\n}\n\n/**\n * Deploy to Vercel using Vercel CLI\n */\nasync function deployVercel(root: string, outputDir: string, prod?: boolean) {\n logger.info(\"🚀 Deploying to Vercel...\");\n\n try {\n execFileSync(\"vercel\", [\"--version\"], { stdio: \"ignore\", cwd: root });\n } catch (error) {\n throw new FarmDeployError(\n \"CLI_NOT_INSTALLED\",\n \"vercel\",\n \"Vercel CLI is not installed. Install it with: npm i -g vercel\",\n { cause: error },\n );\n }\n\n try {\n execFileSync(\"vercel\", [\"whoami\"], { stdio: \"ignore\", cwd: root });\n } catch (error) {\n throw new FarmDeployError(\n \"CLI_NOT_AUTHENTICATED\",\n \"vercel\",\n \"Vercel CLI is not authenticated. Run 'vercel login', then retry the deployment.\",\n { cause: error },\n );\n }\n\n try {\n // For Nitro Vercel preset, deploy from the output directory\n // Vercel will detect the serverless functions automatically\n // According to https://nitro.build/deploy/providers/vercel\n\n // Verify output structure before deploying\n const fs = await import(\"fs\");\n const { existsSync, statSync, readdirSync } = fs;\n\n // Vercel Build Output API v3 expects:\n // - functions/__nitro.func/ for serverless functions\n // - static/ for static files\n const functionsDir = path.join(outputDir, \"functions\", \"__nitro.func\");\n const staticDir = path.join(outputDir, \"static\");\n const configFile = path.join(outputDir, \"config.json\");\n const serverIndex = path.join(functionsDir, \"index.mjs\");\n\n logger.info(\"🔍 Verifying deployment structure...\");\n\n // Check functions directory\n if (!existsSync(functionsDir)) {\n throw new FarmDeployError(\n \"INVALID_BUILD_OUTPUT\",\n \"vercel\",\n `Functions directory not found at ${functionsDir}.`,\n );\n }\n if (!existsSync(serverIndex)) {\n throw new FarmDeployError(\n \"INVALID_BUILD_OUTPUT\",\n \"vercel\",\n `Server entry point not found at ${serverIndex}.`,\n );\n }\n logger.info(`✅ Functions directory: ${functionsDir}`);\n\n // Check static directory\n if (!existsSync(staticDir)) {\n logger.warn(`⚠️ Static directory not found at ${staticDir}`);\n } else {\n // Count files recursively\n const countFiles = (dir: string): number => {\n let count = 0;\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n count += countFiles(fullPath);\n } else {\n count++;\n }\n }\n } catch {\n // Ignore errors\n }\n return count;\n };\n\n const fileCount = countFiles(staticDir);\n logger.info(`✅ Static directory: ${staticDir} (${fileCount} files)`);\n\n // List important files (farm-client.js = main client bundle; assets/ optional)\n const importantFiles = [\"farm-client-manifest.json\", \"farm-client.js\", \"assets\"];\n for (const file of importantFiles) {\n const filePath = path.join(staticDir, file);\n if (existsSync(filePath)) {\n logger.info(` ✓ ${file}`);\n } else {\n logger.warn(` ✗ ${file} (missing)`);\n }\n }\n\n if (fileCount === 0) {\n logger.warn(\"⚠️ Static directory is empty - static assets may not be served\");\n }\n }\n\n // Check config\n if (!existsSync(configFile)) {\n logger.warn(`⚠️ Config file not found at ${configFile}`);\n } else {\n logger.info(`✅ Config file: ${configFile}`);\n // Verify config has routing rules\n try {\n const config = JSON.parse(require(\"fs\").readFileSync(configFile, \"utf-8\"));\n if (config.routes && config.routes.length > 0) {\n logger.info(` ✓ Routing rules: ${config.routes.length} rules configured`);\n }\n } catch {\n logger.warn(\" ⚠️ Could not parse config.json\");\n }\n }\n\n // Calculate directory sizes\n const calculateDirSize = (dirPath: string): number => {\n if (!existsSync(dirPath)) return 0;\n let totalSize = 0;\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n if (entry.isFile()) {\n totalSize += statSync(fullPath).size;\n } else if (entry.isDirectory()) {\n totalSize += calculateDirSize(fullPath);\n }\n }\n } catch {\n // Ignore errors\n }\n return totalSize;\n };\n\n const functionsSize = calculateDirSize(functionsDir);\n const staticSize = calculateDirSize(staticDir);\n logger.info(\n `📦 Deployment size: Functions ${(functionsSize / 1024 / 1024).toFixed(2)}MB, Static ${(staticSize / 1024).toFixed(1)}KB`,\n );\n\n // Verify critical files (farm-client.js or assets/ both valid for client bundle)\n logger.info(\"🔍 Verifying critical files:\");\n const criticalFiles = [\n { path: serverIndex, name: \"Server entry point\" },\n { path: path.join(functionsDir, \"package.json\"), name: \"Function package.json\" },\n { path: path.join(functionsDir, \".vc-config.json\"), name: \"Vercel config\" },\n { path: path.join(staticDir, \"farm-client-manifest.json\"), name: \"Client manifest\" },\n ];\n\n for (const file of criticalFiles) {\n if (existsSync(file.path)) {\n logger.info(` ✅ ${file.name}`);\n } else {\n logger.warn(` ⚠️ ${file.name} (missing)`);\n }\n }\n\n const hasClientAssets =\n existsSync(path.join(staticDir, \"farm-client.js\")) ||\n existsSync(path.join(staticDir, \"assets\"));\n if (hasClientAssets) {\n logger.info(\" ✅ Client assets (farm-client.js or assets/)\");\n } else {\n logger.warn(\" ⚠️ Client assets directory (missing)\");\n }\n\n logger.info(\"🚀 Deploying to Vercel...\");\n logger.info(` Deploying from: ${root}`);\n logger.info(` Functions: ${functionsDir}`);\n logger.info(` Static: ${staticDir}`);\n logger.info(` Config: ${configFile}`);\n\n // For Vercel Build Output API v3, we need to deploy from the project root\n // with the --prebuilt flag to tell Vercel to use the .vercel/output directory\n // See: https://vercel.com/docs/build-output-api/v3\n\n logger.info(\"📤 Uploading to Vercel...\");\n\n // Deploy using --prebuilt flag so Vercel uses our build (required for monorepos;\n // building on Vercel would run pnpm install in the example folder and fail on workspace deps)\n execFileSync(\"vercel\", [\"deploy\", \"--prebuilt\", \"--yes\", ...(prod ? [\"--prod\"] : [])], {\n stdio: \"inherit\",\n cwd: root,\n });\n\n logger.success(\"✅ Deployed to Vercel successfully!\");\n } catch (error: unknown) {\n if (error instanceof FarmDeployError) throw error;\n throw new FarmDeployError(\n \"DEPLOY_FAILED\",\n \"vercel\",\n `Failed to deploy to Vercel: ${getErrorMessage(error)}`,\n { cause: error },\n );\n }\n}\n\n/** Deploy to a composed Worker or fall back to Cloudflare Pages. */\nasync function deployCloudflare(root: string, outputDir: string, projectName?: string) {\n const agentPlan = resolveCloudflareAgentDeployPlan(root);\n if (agentPlan) {\n logger.info(\"🚀 Deploying Farm and Cloudflare Agents as one Worker...\");\n assertWranglerInstalled(root);\n\n try {\n execFileSync(\n \"wrangler\",\n [\n \"deploy\",\n \"--config\",\n agentPlan.configPath,\n ...(agentPlan.environment ? [\"--env\", agentPlan.environment] : []),\n ],\n {\n stdio: \"inherit\",\n cwd: root,\n },\n );\n logger.success(\"✅ Deployed Farm and Cloudflare Agents successfully!\");\n } catch (error: unknown) {\n throw new FarmDeployError(\n \"DEPLOY_FAILED\",\n \"cloudflare\",\n `Failed to deploy to Cloudflare: ${getErrorMessage(error)}`,\n { cause: error },\n );\n }\n return;\n }\n\n logger.info(\"🚀 Deploying to Cloudflare Pages...\");\n\n assertWranglerInstalled(root);\n\n try {\n execFileSync(\n \"wrangler\",\n [\"pages\", \"deploy\", \".\", `--project-name=${projectName || \"farm-app\"}`],\n {\n stdio: \"inherit\",\n cwd: outputDir,\n },\n );\n logger.success(\"✅ Deployed to Cloudflare Pages successfully!\");\n } catch (error: unknown) {\n throw new FarmDeployError(\n \"DEPLOY_FAILED\",\n \"cloudflare\",\n `Failed to deploy to Cloudflare: ${getErrorMessage(error)}`,\n { cause: error },\n );\n }\n}\n\n/** Read the trusted Workers deployment handoff emitted by @farm.js/cf-agent. */\nexport function resolveCloudflareAgentDeployPlan(\n root: string,\n): CloudflareAgentDeployPlan | undefined {\n const projectRoot = path.resolve(root);\n const metadataPath = path.join(projectRoot, \".farm\", \"cf-agent\", \"deploy.json\");\n if (!existsSync(metadataPath)) return undefined;\n\n let metadata: unknown;\n try {\n metadata = JSON.parse(readFileSync(metadataPath, \"utf8\"));\n } catch {\n throw new Error(`Invalid Cloudflare Agents deployment metadata at ${metadataPath}.`);\n }\n\n if (\n !isRecord(metadata) ||\n metadata.version !== 1 ||\n metadata.provider !== \"cloudflare-agents\" ||\n typeof metadata.config !== \"string\" ||\n !metadata.config.trim()\n ) {\n throw new Error(`Invalid Cloudflare Agents deployment metadata at ${metadataPath}.`);\n }\n\n const configPath = path.resolve(projectRoot, metadata.config);\n const relativeConfigPath = path.relative(projectRoot, configPath);\n if (\n relativeConfigPath === \"..\" ||\n relativeConfigPath.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relativeConfigPath)\n ) {\n throw new Error(\"Cloudflare Agents deployment config must stay inside the Farm project root.\");\n }\n if (!existsSync(configPath)) {\n throw new Error(`Cloudflare Agents deployment config was not found at ${configPath}.`);\n }\n\n const environment = metadata.environment;\n if (environment !== undefined && (typeof environment !== \"string\" || !environment.trim())) {\n throw new Error(\"Cloudflare Agents deployment environment must be a non-empty string.\");\n }\n\n return {\n configPath,\n ...(typeof environment === \"string\" ? { environment: environment.trim() } : {}),\n };\n}\n\nfunction resolveConfiguredCloudflareAgentDeployPlan(\n root: string,\n integrations: Record<string, unknown> | undefined,\n): CloudflareAgentDeployPlan | undefined {\n const integration = Object.values(integrations || {}).find(\n (value) =>\n isRecord(value) &&\n value.category === \"agent\" &&\n value.type === \"cloudflare\" &&\n value.serverRuntime === false,\n );\n if (!isRecord(integration) || !isRecord(integration.instance)) return undefined;\n\n const configuredPath = integration.instance.config;\n if (typeof configuredPath !== \"string\" || !configuredPath.trim()) return undefined;\n\n const projectRoot = path.resolve(root);\n const sourceConfigPath = path.resolve(projectRoot, configuredPath);\n assertPathInsideProject(projectRoot, sourceConfigPath, \"Cloudflare Agents source config\");\n const configPath = path.join(path.dirname(sourceConfigPath), \".farm-cf-agent.wrangler.jsonc\");\n const environment = integration.instance.environment;\n\n return {\n configPath,\n ...(typeof environment === \"string\" && environment.trim()\n ? { environment: environment.trim() }\n : {}),\n generated: true,\n };\n}\n\nfunction assertPathInsideProject(projectRoot: string, candidate: string, label: string): void {\n const relativePath = path.relative(projectRoot, candidate);\n if (\n relativePath === \"..\" ||\n relativePath.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relativePath)\n ) {\n throw new Error(`${label} must stay inside the Farm project root.`);\n }\n}\n\nfunction assertWranglerInstalled(root: string): void {\n try {\n execFileSync(\"wrangler\", [\"--version\"], { stdio: \"ignore\", cwd: root });\n } catch (error) {\n throw new FarmDeployError(\n \"CLI_NOT_INSTALLED\",\n \"cloudflare\",\n \"Wrangler CLI is not installed. Install it in this project with: npm i -D wrangler\",\n { cause: error },\n );\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/**\n * Deploy to Netlify using Netlify CLI\n */\nasync function deployNetlify(root: string, outputDir: string, site?: string) {\n logger.info(\"🚀 Deploying to Netlify...\");\n\n // Check if Netlify CLI is installed\n try {\n execFileSync(\"netlify\", [\"--version\"], { stdio: \"ignore\", cwd: root });\n } catch (error) {\n throw new FarmDeployError(\n \"CLI_NOT_INSTALLED\",\n \"netlify\",\n \"Netlify CLI is not installed. Install it with: npm i -g netlify-cli\",\n { cause: error },\n );\n }\n\n try {\n execFileSync(\"netlify\", createNetlifyDeployArgs(site), {\n stdio: \"inherit\",\n cwd: outputDir,\n });\n logger.success(\"✅ Deployed to Netlify successfully!\");\n } catch (error: unknown) {\n throw new FarmDeployError(\n \"DEPLOY_FAILED\",\n \"netlify\",\n `Failed to deploy to Netlify: ${getErrorMessage(error)}`,\n { cause: error },\n );\n }\n}\n\nfunction formatCommand(executable: string, args: string[]): string {\n return [executable, ...args].map(formatCommandArgument).join(\" \");\n}\n\nfunction formatCommandArgument(argument: string): string {\n if (/^[A-Za-z0-9_./:=@+-]+$/.test(argument)) return argument;\n return `'${argument.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { setTimeout as delay } from \"node:timers/promises\";\nimport { logger } from \"@farm.js/core\";\nimport type { PreviewFarmOptions, PreviewTarget } from \"./preview\";\n\nexport interface PreviewGatewayPlan {\n provider: \"farm-gateway\";\n gatewayUrl: string;\n target: PreviewTarget;\n requestedName: string;\n requestedHostname: string;\n requestedPublicUrl: string;\n}\n\nexport interface PreviewGatewaySession {\n id: string;\n name: string;\n token: string;\n publicUrl: string;\n expiresAt?: number;\n}\n\nexport interface PreviewGatewayRequest {\n id: string;\n method: string;\n path: string;\n headers?: Record<string, string>;\n body?: string | null;\n encoding?: \"base64\";\n}\n\nexport interface PreviewGatewayResponse {\n status: number;\n headers?: Record<string, string>;\n body?: string | null;\n encoding?: \"base64\";\n}\n\nexport interface RunPreviewGatewayOptions {\n timeoutMs?: number;\n pollTimeoutMs?: number;\n localProbeIntervalMs?: number;\n localProbeTimeoutMs?: number;\n maxRequests?: number;\n maxConcurrentRequests?: number;\n}\n\nconst DEFAULT_GATEWAY_URL = \"https://preview.farming-labs.dev\";\nconst DEFAULT_PREVIEW_DOMAIN = \"preview.farming-labs.dev\";\nconst DEFAULT_POLL_TIMEOUT_MS = 15000;\nconst DEFAULT_LOCAL_PROBE_INTERVAL_MS = 2000;\nconst DEFAULT_LOCAL_PROBE_TIMEOUT_MS = 1000;\nconst DEFAULT_MAX_CONCURRENT_REQUESTS = 25;\nconst HOP_BY_HOP_HEADERS = new Set([\n \"connection\",\n \"content-length\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n]);\n\nexport function createPreviewGatewayPlan(\n target: PreviewTarget,\n options: Pick<PreviewFarmOptions, \"gatewayUrl\" | \"name\"> = {},\n): PreviewGatewayPlan {\n const requestedName =\n sanitizePreviewName(options.name || process.env.FARM_PREVIEW_NAME) || randomPreviewName();\n const gatewayUrl = normalizeGatewayUrl(\n options.gatewayUrl || process.env.FARM_PREVIEW_GATEWAY_URL || DEFAULT_GATEWAY_URL,\n );\n const domain = normalizePreviewDomain(process.env.FARM_PREVIEW_DOMAIN || DEFAULT_PREVIEW_DOMAIN);\n const requestedHostname = `${requestedName}.${domain}`;\n\n return {\n provider: \"farm-gateway\",\n gatewayUrl,\n target,\n requestedName,\n requestedHostname,\n requestedPublicUrl: `https://${requestedHostname}`,\n };\n}\n\nexport async function runPreviewGateway(\n plan: PreviewGatewayPlan,\n options: RunPreviewGatewayOptions = {},\n): Promise<PreviewGatewaySession> {\n const session = await createGatewaySession(plan, options.timeoutMs ?? 30000);\n const controller = new AbortController();\n let handledRequests = 0;\n const inFlightRequests = new Set<Promise<void>>();\n const maxConcurrentRequests = Math.max(\n 1,\n options.maxConcurrentRequests ?? DEFAULT_MAX_CONCURRENT_REQUESTS,\n );\n const localTargetWatch = watchLocalPreviewTarget(plan.target, controller, {\n intervalMs: options.localProbeIntervalMs ?? DEFAULT_LOCAL_PROBE_INTERVAL_MS,\n timeoutMs: options.localProbeTimeoutMs ?? DEFAULT_LOCAL_PROBE_TIMEOUT_MS,\n });\n\n const cleanup = () => controller.abort();\n process.once(\"SIGINT\", cleanup);\n process.once(\"SIGTERM\", cleanup);\n\n logger.success(\"Preview URL ready.\");\n logger.info(`Public: ${session.publicUrl}`);\n logger.info(\"Forwarding requests until Ctrl+C. Remote traffic will be logged below.\");\n\n const waitForAvailableRequestSlot = async () => {\n while (!controller.signal.aborted && inFlightRequests.size >= maxConcurrentRequests) {\n await Promise.race(inFlightRequests);\n }\n };\n\n const handleRequest = async (request: PreviewGatewayRequest) => {\n const startedAt = Date.now();\n\n try {\n const response = await forwardGatewayRequest(plan.target, request);\n await sendGatewayResponse(plan, session, request.id, response, controller.signal);\n handledRequests += 1;\n logger.info(\n `${request.method.toUpperCase()} ${formatRequestPath(request.path)} -> ${response.status} ${Date.now() - startedAt}ms`,\n );\n } catch (error) {\n if (controller.signal.aborted) return;\n logger.warn(\n `Local preview target ${plan.target.localUrl} is no longer reachable. Closing preview session.`,\n );\n controller.abort(error);\n }\n };\n\n try {\n while (!controller.signal.aborted) {\n await waitForAvailableRequestSlot();\n if (controller.signal.aborted) break;\n\n const requests = await pollGatewayRequests(plan, session, {\n signal: controller.signal,\n pollTimeoutMs: options.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS,\n });\n\n for (const request of requests) {\n await waitForAvailableRequestSlot();\n if (controller.signal.aborted) break;\n\n const promise = handleRequest(request);\n inFlightRequests.add(promise);\n promise.finally(() => inFlightRequests.delete(promise));\n }\n\n if (options.maxRequests && handledRequests >= options.maxRequests) {\n break;\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", cleanup);\n process.removeListener(\"SIGTERM\", cleanup);\n controller.abort();\n await Promise.allSettled(inFlightRequests);\n await localTargetWatch.catch(() => undefined);\n await closeGatewaySession(plan, session).catch(() => undefined);\n }\n\n return session;\n}\n\nasync function watchLocalPreviewTarget(\n target: PreviewTarget,\n controller: AbortController,\n options: { intervalMs: number; timeoutMs: number },\n) {\n while (!controller.signal.aborted) {\n try {\n await delay(options.intervalMs, undefined, { signal: controller.signal });\n } catch {\n return;\n }\n\n if (controller.signal.aborted) return;\n\n const reachable = await isLocalPreviewTargetReachable(target.localUrl, options.timeoutMs);\n if (!reachable && !controller.signal.aborted) {\n logger.warn(\n `Local preview target ${target.localUrl} is no longer reachable. Closing preview session.`,\n );\n controller.abort(new Error(\"Local preview target is no longer reachable.\"));\n return;\n }\n }\n}\n\nasync function isLocalPreviewTargetReachable(url: string, timeoutMs: number) {\n const signal = AbortSignal.timeout(timeoutMs);\n\n try {\n await fetch(url, {\n method: \"GET\",\n signal,\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function createGatewaySession(\n plan: PreviewGatewayPlan,\n timeoutMs: number,\n): Promise<PreviewGatewaySession> {\n const response = await fetch(`${plan.gatewayUrl}/api/sessions`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n name: plan.requestedName,\n hostname: plan.requestedHostname,\n localUrl: plan.target.localUrl,\n }),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\n throw new Error(\n `Preview gateway rejected the session (${response.status}): ${await response.text()}`,\n );\n }\n\n const session = (await response.json()) as PreviewGatewaySession;\n if (!session.id || !session.token || !session.publicUrl) {\n throw new Error(\"Preview gateway returned an invalid session.\");\n }\n\n return session;\n}\n\nexport async function forwardGatewayRequest(\n target: PreviewTarget,\n request: PreviewGatewayRequest,\n): Promise<PreviewGatewayResponse> {\n const headers = new Headers();\n for (const [key, value] of Object.entries(request.headers || {})) {\n const normalized = key.toLowerCase();\n if (HOP_BY_HOP_HEADERS.has(normalized) || normalized.startsWith(\"sec-websocket-\")) {\n continue;\n }\n headers.set(key, value);\n }\n\n headers.set(\"x-farm-preview\", \"1\");\n\n const method = request.method.toUpperCase();\n const hasBody = method !== \"GET\" && method !== \"HEAD\" && Boolean(request.body);\n const response = await fetch(`${target.localUrl}${request.path}`, {\n method,\n headers,\n body: hasBody\n ? Buffer.from(request.body || \"\", request.encoding === \"base64\" ? \"base64\" : \"utf8\")\n : undefined,\n });\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n const normalized = key.toLowerCase();\n if (!HOP_BY_HOP_HEADERS.has(normalized)) {\n responseHeaders[key] = value;\n }\n });\n\n return {\n status: response.status,\n headers: responseHeaders,\n body: Buffer.from(await response.arrayBuffer()).toString(\"base64\"),\n encoding: \"base64\",\n };\n}\n\nasync function pollGatewayRequests(\n plan: PreviewGatewayPlan,\n session: PreviewGatewaySession,\n options: { signal: AbortSignal; pollTimeoutMs: number },\n) {\n try {\n const response = await fetch(\n `${plan.gatewayUrl}/api/sessions/${session.id}/requests?token=${encodeURIComponent(\n session.token,\n )}&wait=${options.pollTimeoutMs}`,\n {\n headers: {\n accept: \"application/json\",\n },\n signal: options.signal,\n },\n );\n\n if (response.status === 204) {\n return [];\n }\n if (!response.ok) {\n throw new Error(`Preview gateway poll failed (${response.status}): ${await response.text()}`);\n }\n\n const data = (await response.json()) as { requests?: PreviewGatewayRequest[] };\n return data.requests || [];\n } catch (error) {\n if (options.signal.aborted) return [];\n throw error;\n }\n}\n\nasync function sendGatewayResponse(\n plan: PreviewGatewayPlan,\n session: PreviewGatewaySession,\n requestId: string,\n responseBody: PreviewGatewayResponse,\n signal: AbortSignal,\n) {\n const response = await fetch(\n `${plan.gatewayUrl}/api/sessions/${session.id}/responses/${requestId}?token=${encodeURIComponent(\n session.token,\n )}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(responseBody),\n signal,\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `Preview gateway response upload failed (${response.status}): ${await response.text()}`,\n );\n }\n}\n\nasync function closeGatewaySession(plan: PreviewGatewayPlan, session: PreviewGatewaySession) {\n await fetch(\n `${plan.gatewayUrl}/api/sessions/${session.id}?token=${encodeURIComponent(session.token)}`,\n {\n method: \"DELETE\",\n },\n );\n}\n\nexport function formatGatewayPlan(plan: PreviewGatewayPlan) {\n return [\n `Gateway: ${plan.gatewayUrl}`,\n `Local: ${plan.target.localUrl}`,\n `Public: ${plan.requestedPublicUrl}`,\n ].join(\"\\n\");\n}\n\nfunction formatRequestPath(path: string) {\n if (path.length <= 96) {\n return path;\n }\n\n return `${path.slice(0, 93)}...`;\n}\n\nfunction normalizeGatewayUrl(value: string) {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction normalizePreviewDomain(value: string) {\n return value\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^\\.*/, \"\")\n .replace(/\\/*$/, \"\");\n}\n\nfunction sanitizePreviewName(value: string | undefined) {\n if (!value) return undefined;\n return value\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 48);\n}\n\nfunction randomPreviewName() {\n return `farm-${Math.random().toString(36).slice(2, 8)}`;\n}\n","import { spawn, spawnSync, type ChildProcess } from \"node:child_process\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { loadConfig, logger } from \"@farm.js/core\";\nimport {\n createPreviewGatewayPlan,\n formatGatewayPlan,\n runPreviewGateway,\n type PreviewGatewayPlan,\n type PreviewGatewaySession,\n} from \"./preview-gateway\";\n\nexport interface PreviewFarmOptions {\n root?: string;\n configPath?: string;\n port?: number | string;\n host?: string;\n url?: string;\n gatewayUrl?: string;\n name?: string;\n dryRun?: boolean;\n noProbe?: boolean;\n timeoutMs?: number;\n provider?: \"farm\" | \"local\";\n}\n\nexport interface PreviewTarget {\n localUrl: string;\n host: string;\n port: number;\n source: \"url\" | \"port\" | \"config\" | \"detected\";\n}\n\nexport interface PreviewTunnelPlan {\n command: string;\n args: string[];\n shell?: boolean;\n target: PreviewTarget;\n requestedName: string;\n requestedHostname: string;\n}\n\nexport interface PreviewFarmResult {\n target: PreviewTarget;\n plan: PreviewTunnelPlan | PreviewGatewayPlan;\n publicUrl?: string;\n session?: PreviewGatewaySession;\n}\n\nconst DEFAULT_PREVIEW_PORTS = [3000, 4319, 5173, 4173, 8080];\nconst PREVIEW_URL_PATTERN = /https:\\/\\/[^\\s\"')\\]}]+/g;\n\nexport async function previewFarm(options: PreviewFarmOptions = {}): Promise<PreviewFarmResult> {\n const target = await resolvePreviewTarget(options);\n\n logger.info(\"Creating public preview for the running app...\");\n logger.info(`Local: ${target.localUrl}`);\n\n if (shouldUseManagedGateway(options)) {\n const plan = createPreviewGatewayPlan(target, options);\n\n if (options.dryRun) {\n logger.info(formatGatewayPlan(plan));\n logger.success(\"Preview gateway dry run completed.\");\n return { target, plan };\n }\n\n logger.info(`Gateway: ${plan.gatewayUrl}`);\n logger.info(\"Opening Farm preview gateway session...\");\n const session = await runPreviewGateway(plan, {\n timeoutMs: options.timeoutMs,\n });\n return { target, plan, publicUrl: session.publicUrl, session };\n }\n\n const plan = createPreviewTunnelPlan(target, options);\n\n if (options.dryRun) {\n logger.info(`Command: ${formatCommand(plan)}`);\n logger.success(\"Preview tunnel dry run completed.\");\n return { target, plan };\n }\n\n logger.info(\"Opening public tunnel...\");\n const publicUrl = await runPreviewTunnel(plan, options.timeoutMs ?? 30000);\n return { target, plan, publicUrl };\n}\n\nfunction shouldUseManagedGateway(options: PreviewFarmOptions) {\n if (options.provider === \"farm\" || process.env.FARM_PREVIEW_PROVIDER === \"farm\") {\n return true;\n }\n if (options.provider === \"local\" || process.env.FARM_PREVIEW_PROVIDER === \"local\") {\n return false;\n }\n return !process.env.FARM_PREVIEW_TUNNEL_COMMAND;\n}\n\nexport async function resolvePreviewTarget(\n options: PreviewFarmOptions = {},\n): Promise<PreviewTarget> {\n if (options.url) {\n const parsed = new URL(options.url);\n const port = Number(parsed.port || (parsed.protocol === \"https:\" ? 443 : 80));\n if (!Number.isFinite(port)) {\n throw new Error(`Could not resolve a port from ${options.url}.`);\n }\n return {\n localUrl: normalizeLocalUrl(options.url),\n host: parsed.hostname,\n port,\n source: \"url\",\n };\n }\n\n const root = options.root || process.cwd();\n const host = options.host || process.env.FARM_PREVIEW_HOST || \"localhost\";\n const explicitPort = normalizePort(options.port || process.env.FARM_PREVIEW_PORT);\n const configPort = explicitPort ? undefined : await readConfigPort(root, options.configPath);\n const candidates = uniqueNumbers([\n explicitPort,\n normalizePort(process.env.FARM_PORT),\n normalizePort(process.env.PORT),\n configPort,\n ...DEFAULT_PREVIEW_PORTS,\n ]);\n\n if (!candidates.length) {\n throw new Error(\"No preview port candidates were available.\");\n }\n\n if (options.noProbe && explicitPort) {\n return {\n localUrl: createLocalUrl(host, explicitPort),\n host,\n port: explicitPort,\n source: \"port\",\n };\n }\n\n const timeoutMs = options.timeoutMs ?? 1500;\n for (const port of candidates) {\n const localUrl = createLocalUrl(host, port);\n if (await isReachable(localUrl, timeoutMs)) {\n return {\n localUrl,\n host,\n port,\n source: explicitPort ? \"port\" : configPort === port ? \"config\" : \"detected\",\n };\n }\n }\n\n const hint = explicitPort\n ? createLocalUrl(host, explicitPort)\n : candidates.map((port) => port).join(\", \");\n throw new Error(\n `No running Farm app was found (${hint}). Start \"farm dev\" first, or pass --port/--url to the running app.`,\n );\n}\n\nexport function createPreviewTunnelPlan(\n target: PreviewTarget,\n options: Pick<PreviewFarmOptions, \"name\"> = {},\n): PreviewTunnelPlan {\n const requestedName =\n sanitizePreviewName(options.name || process.env.FARM_PREVIEW_NAME) || randomPreviewName();\n const domain = normalizePreviewDomain(\n process.env.FARM_PREVIEW_DOMAIN || \"preview.farming-labs.dev\",\n );\n const requestedHostname = `${requestedName}.${domain}`;\n const template = process.env.FARM_PREVIEW_TUNNEL_COMMAND;\n\n if (template) {\n return {\n command: expandTunnelTemplate(template, target, requestedName, requestedHostname),\n args: [],\n shell: true,\n target,\n requestedName,\n requestedHostname,\n };\n }\n\n if (commandExists(\"cloudflared\")) {\n return {\n command: \"cloudflared\",\n args: [\"tunnel\", \"--url\", target.localUrl],\n target,\n requestedName,\n requestedHostname,\n };\n }\n\n if (commandExists(\"npx\")) {\n return {\n command: \"npx\",\n args: [\n \"--yes\",\n \"localtunnel\",\n \"--port\",\n String(target.port),\n \"--local-host\",\n target.host,\n \"--subdomain\",\n requestedName,\n ],\n target,\n requestedName,\n requestedHostname,\n };\n }\n\n throw new Error(\n \"No preview tunnel command is available. Install cloudflared, ensure npx is available, or set FARM_PREVIEW_TUNNEL_COMMAND.\",\n );\n}\n\nexport function parsePreviewPublicUrl(\n output: string,\n preferredHostname?: string,\n): string | undefined {\n const matches = output.match(PREVIEW_URL_PATTERN) || [];\n const urls = matches.filter((value) => {\n try {\n const url = new URL(value);\n return Boolean(url.hostname);\n } catch {\n return false;\n }\n });\n\n if (preferredHostname) {\n const preferred = urls.find((value) => new URL(value).hostname === preferredHostname);\n if (preferred) return preferred;\n }\n\n return (\n urls.find((value) => {\n const host = new URL(value).hostname;\n return (\n host.endsWith(\".trycloudflare.com\") ||\n host.endsWith(\".loca.lt\") ||\n host.endsWith(\".localtunnel.me\") ||\n host.endsWith(\".ngrok.app\") ||\n host.endsWith(\".ngrok-free.app\") ||\n host.endsWith(\".ngrok.dev\") ||\n host.endsWith(\".ngrok.io\") ||\n host.endsWith(\".preview.farming-labs.dev\")\n );\n }) || urls[0]\n );\n}\n\nasync function runPreviewTunnel(plan: PreviewTunnelPlan, timeoutMs: number): Promise<string> {\n const child = spawn(plan.command, plan.args, {\n env: {\n ...process.env,\n FARM_PREVIEW_LOCAL_URL: plan.target.localUrl,\n FARM_PREVIEW_NAME: plan.requestedName,\n FARM_PREVIEW_HOSTNAME: plan.requestedHostname,\n },\n shell: plan.shell,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let output = \"\";\n let publicUrl: string | undefined;\n let settled = false;\n\n const cleanup = () => {\n if (!child.killed) child.kill(\"SIGTERM\");\n };\n process.once(\"SIGINT\", cleanup);\n process.once(\"SIGTERM\", cleanup);\n\n try {\n publicUrl = await new Promise<string>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"Timed out waiting for the preview URL.\"));\n }, timeoutMs);\n\n const handleChunk = (chunk: Buffer) => {\n const text = chunk.toString();\n output += text;\n process.stdout.write(text);\n const nextUrl = parsePreviewPublicUrl(output, plan.requestedHostname);\n if (nextUrl && !settled) {\n settled = true;\n clearTimeout(timer);\n logger.success(\"Preview URL ready.\");\n logger.info(`Public: ${nextUrl}`);\n logger.info(\"Forwarding requests until Ctrl+C.\");\n resolve(nextUrl);\n }\n };\n\n child.stdout?.on(\"data\", handleChunk);\n child.stderr?.on(\"data\", handleChunk);\n child.on(\"error\", (error) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n reject(error);\n }\n });\n child.on(\"exit\", (code, signal) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n reject(\n new Error(\n `Preview tunnel exited before returning a URL (${signal || `exit code ${code ?? 0}`}).`,\n ),\n );\n }\n });\n });\n\n await waitForTunnelExit(child);\n return publicUrl;\n } finally {\n process.removeListener(\"SIGINT\", cleanup);\n process.removeListener(\"SIGTERM\", cleanup);\n }\n}\n\nfunction waitForTunnelExit(child: ChildProcess) {\n return new Promise<void>((resolve) => {\n if (child.exitCode !== null || child.signalCode !== null) {\n resolve();\n return;\n }\n child.once(\"exit\", () => resolve());\n });\n}\n\nasync function isReachable(url: string, timeoutMs: number) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n });\n return true;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n await delay(0);\n }\n}\n\nasync function readConfigPort(root: string, configPath?: string) {\n try {\n const config = await loadConfig(root, configPath, \"development\");\n const vite = config?.vite;\n if (!vite || typeof vite === \"function\") return undefined;\n return normalizePort(vite.server?.port);\n } catch {\n return undefined;\n }\n}\n\nfunction commandExists(command: string) {\n const result = spawnSync(command, [\"--version\"], {\n shell: process.platform === \"win32\",\n stdio: \"ignore\",\n });\n return !result.error && result.status === 0;\n}\n\nfunction expandTunnelTemplate(\n template: string,\n target: PreviewTarget,\n requestedName: string,\n requestedHostname: string,\n) {\n return template\n .split(\"{url}\")\n .join(shellQuote(target.localUrl))\n .split(\"{port}\")\n .join(shellQuote(String(target.port)))\n .split(\"{host}\")\n .join(shellQuote(target.host))\n .split(\"{name}\")\n .join(shellQuote(requestedName))\n .split(\"{hostname}\")\n .join(shellQuote(requestedHostname));\n}\n\nfunction shellQuote(value: string) {\n return `\"${value.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`;\n}\n\nfunction formatCommand(plan: PreviewTunnelPlan) {\n if (plan.shell) return plan.command;\n return [plan.command, ...plan.args].join(\" \");\n}\n\nfunction normalizeLocalUrl(value: string) {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction createLocalUrl(host: string, port: number) {\n return `http://${host}:${port}`;\n}\n\nfunction normalizePort(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n const port = Number(value);\n return Number.isInteger(port) && port > 0 && port <= 65535 ? port : undefined;\n}\n\nfunction uniqueNumbers(values: Array<number | undefined>) {\n return [...new Set(values.filter((value): value is number => value !== undefined))];\n}\n\nfunction sanitizePreviewName(value: string | undefined) {\n if (!value) return undefined;\n return value\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 48);\n}\n\nfunction randomPreviewName() {\n return `farm-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizePreviewDomain(value: string) {\n return value\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^\\.*/, \"\")\n .replace(/\\/*$/, \"\");\n}\n","import {\n generateFarmTypeArtifacts,\n getFarmDocsRouteTypeEntries,\n getIntegrationSchemas,\n loadConfig,\n logger,\n resolveConfig,\n type FarmIntegrationSchema,\n type FarmIntegrationSchemaField,\n type FarmIntegrationSchemaModel,\n} from \"@farm.js/core\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type GenerateFarmSchemaTarget =\n | \"prisma\"\n | \"drizzle\"\n | \"postgres\"\n | \"mysql\"\n | \"sqlite\"\n | \"mongodb\";\n\nexport type GenerateFarmSqlDialect = \"postgres\" | \"mysql\" | \"sqlite\";\n\nexport interface GenerateFarmOptions {\n root?: string;\n configPath?: string;\n orm?: GenerateFarmSchemaTarget;\n output?: string;\n dialect?: GenerateFarmSqlDialect;\n /** Verify committed type artifacts without writing files. */\n check?: boolean;\n}\n\nexport class FarmGeneratedArtifactsStaleError extends Error {\n readonly stalePaths: string[];\n\n constructor(root: string, stalePaths: readonly string[]) {\n const normalizedPaths = [...new Set(stalePaths)].sort();\n const relativePaths = normalizedPaths.map((filePath) => path.relative(root, filePath));\n super(\n `Generated types are stale:\\n${relativePaths.map((filePath) => ` - ${filePath}`).join(\"\\n\")}\\nRun farm generate and commit the updated files.`,\n );\n this.name = \"FarmGeneratedArtifactsStaleError\";\n this.stalePaths = normalizedPaths;\n }\n}\n\ntype PackageManifest = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n};\n\ntype ResolvedSchemaField = FarmIntegrationSchemaField & {\n name: string;\n};\n\ntype ResolvedSchemaModel = Omit<FarmIntegrationSchemaModel, \"fields\"> & {\n name: string;\n fields: Record<string, ResolvedSchemaField>;\n};\n\ntype CollectedSchemaModel = {\n integrationKey: string;\n modelKey: string;\n modelName: string;\n exportName: string;\n prismaModelName: string;\n model: ResolvedSchemaModel;\n};\n\nconst PRISMA_GENERATED_START = \"// Farm.js integrations generated schema: start\";\nconst PRISMA_GENERATED_END = \"// Farm.js integrations generated schema: end\";\n\nexport async function generateFarmArtifacts(options: GenerateFarmOptions = {}) {\n const root = path.resolve(options.root || process.cwd());\n if (options.check && hasSchemaOptions(options)) {\n throw new Error(\n \"--check verifies generated framework types and cannot be combined with schema output options.\",\n );\n }\n const userConfig = await loadConfig(root, options.configPath, \"development\");\n\n if (!userConfig && hasSchemaOptions(options)) {\n throw new Error(\"No Farm config found. Please create farm.config.ts or config.ts.\");\n }\n\n const resolvedConfig = await resolveConfig({ root, ...userConfig }, \"development\");\n const extraRoutes = [\n ...(resolvedConfig.openapi?.enabled && resolvedConfig.openapi.route\n ? [resolvedConfig.openapi.route]\n : []),\n ...getFarmDocsRouteTypeEntries(resolvedConfig.docs),\n ];\n const typeArtifacts = await generateFarmTypeArtifacts({\n root: resolvedConfig.root,\n srcDir: resolvedConfig.srcDir,\n configPath: options.configPath,\n layers: resolvedConfig.layers,\n extraRoutes,\n suppressLintOnLink: resolvedConfig.suppressLintOnLink,\n i18nConfig: resolvedConfig.i18n,\n check: options.check,\n });\n\n if (options.check) {\n if (typeArtifacts.stalePaths.length) {\n throw new FarmGeneratedArtifactsStaleError(root, typeArtifacts.stalePaths);\n }\n logger.success(\n `Generated route, API, env${resolvedConfig.i18n.enabled ? \", and i18n\" : \"\"} types are up to date.`,\n );\n return typeArtifacts;\n }\n\n logger.success(\n `Generated route, API, env${resolvedConfig.i18n.enabled ? \", and i18n\" : \"\"} types (${typeArtifacts.apiRoutes.length} API route${typeArtifacts.apiRoutes.length === 1 ? \"\" : \"s\"}).`,\n );\n\n const schemas = getIntegrationSchemas(resolvedConfig.integrations);\n const schemaEntries = Object.entries(schemas);\n\n if (!schemaEntries.length) {\n if (hasSchemaOptions(options)) {\n logger.warn(\"No integration schemas were found in the current Farm config.\");\n }\n return typeArtifacts;\n }\n\n const packageManifest = await readPackageManifest(root);\n const schemaOptionsExplicit = hasSchemaOptions(options);\n let orm: GenerateFarmSchemaTarget | null = null;\n try {\n orm = options.orm ?? (await detectSchemaTarget(root, packageManifest));\n } catch (error) {\n if (schemaOptionsExplicit) {\n throw error;\n }\n logger.warn(\n `Integration schemas were found, but Farm could not choose a schema target automatically: ${(error as Error).message}`,\n );\n return typeArtifacts;\n }\n\n if (!orm) {\n if (!schemaOptionsExplicit) {\n logger.warn(\n \"Integration schemas were found, but no data layer was detected. Pass --orm prisma|drizzle|postgres|mysql|sqlite|mongodb to generate schema artifacts.\",\n );\n return typeArtifacts;\n }\n throw new Error(\n \"Could not auto-detect a schema target. Pass one explicitly with --orm prisma|drizzle|postgres|mysql|sqlite|mongodb.\",\n );\n }\n\n const collectedModels = collectSchemaModels(schemaEntries);\n\n switch (orm) {\n case \"prisma\": {\n const schemaPath = options.output\n ? path.resolve(root, options.output)\n : path.join(root, \"prisma\", \"schema.prisma\");\n\n if (!existsSync(schemaPath)) {\n throw new Error(\n `Prisma target was selected but no schema file was found at ${schemaPath}. Create prisma/schema.prisma or pass --output.`,\n );\n }\n\n await writePrismaSchema(schemaPath, collectedModels);\n logger.success(`Generated Prisma integration schema in ${path.relative(root, schemaPath)}.`);\n return typeArtifacts;\n }\n\n case \"drizzle\": {\n const dialect =\n options.dialect ?? (await detectDrizzleDialect(root, packageManifest)) ?? undefined;\n\n if (!dialect) {\n throw new Error(\n \"Detected Drizzle but could not determine its dialect. Pass --dialect postgres|mysql|sqlite.\",\n );\n }\n\n const outputPath = options.output\n ? path.resolve(root, options.output)\n : path.join(root, \"farm-integrations.generated.ts\");\n await writeGeneratedFile(outputPath, generateDrizzleSchema(collectedModels, dialect));\n logger.success(`Generated Drizzle integration schema in ${path.relative(root, outputPath)}.`);\n return typeArtifacts;\n }\n\n case \"postgres\":\n case \"mysql\":\n case \"sqlite\": {\n const outputPath = options.output\n ? path.resolve(root, options.output)\n : path.join(root, `farm-integrations.generated.${orm}.sql`);\n await writeGeneratedFile(outputPath, generateSqlSchema(collectedModels, orm));\n logger.success(`Generated ${orm} integration schema in ${path.relative(root, outputPath)}.`);\n return typeArtifacts;\n }\n\n case \"mongodb\": {\n const outputPath = options.output\n ? path.resolve(root, options.output)\n : path.join(root, \"farm-integrations.generated.mongodb.ts\");\n await writeGeneratedFile(outputPath, generateMongoBootstrap(collectedModels));\n logger.success(\n `Generated MongoDB integration bootstrap in ${path.relative(root, outputPath)}.`,\n );\n return typeArtifacts;\n }\n }\n}\n\nfunction hasSchemaOptions(options: GenerateFarmOptions) {\n return Boolean(options.orm || options.output || options.dialect);\n}\n\nasync function readPackageManifest(root: string): Promise<PackageManifest | null> {\n const packagePath = path.join(root, \"package.json\");\n if (!existsSync(packagePath)) {\n return null;\n }\n\n const source = await readFile(packagePath, \"utf8\");\n return JSON.parse(source) as PackageManifest;\n}\n\nasync function detectSchemaTarget(\n root: string,\n packageManifest: PackageManifest | null,\n): Promise<GenerateFarmSchemaTarget | null> {\n const hasPrismaSchema = existsSync(path.join(root, \"prisma\", \"schema.prisma\"));\n const drizzleConfigPath = findExistingPath(root, [\n \"drizzle.config.ts\",\n \"drizzle.config.mts\",\n \"drizzle.config.js\",\n \"drizzle.config.mjs\",\n \"drizzle.config.cjs\",\n ]);\n\n if (hasPrismaSchema && drizzleConfigPath) {\n throw new Error(\n \"Detected both Prisma and Drizzle in this project. Pass --orm prisma or --orm drizzle to choose one.\",\n );\n }\n\n if (hasPrismaSchema) {\n return \"prisma\";\n }\n\n if (drizzleConfigPath) {\n return \"drizzle\";\n }\n\n const dependencies = getPackageDependencyNames(packageManifest);\n const candidates = new Set<GenerateFarmSchemaTarget>();\n\n if (dependencies.has(\"@prisma/client\") || dependencies.has(\"prisma\")) {\n candidates.add(\"prisma\");\n }\n\n if (dependencies.has(\"drizzle-orm\") || dependencies.has(\"drizzle-kit\")) {\n candidates.add(\"drizzle\");\n }\n\n if (hasAnyDependency(dependencies, [\"pg\", \"postgres\", \"@neondatabase/serverless\"])) {\n candidates.add(\"postgres\");\n }\n\n if (hasAnyDependency(dependencies, [\"mysql2\", \"@planetscale/database\"])) {\n candidates.add(\"mysql\");\n }\n\n if (hasAnyDependency(dependencies, [\"better-sqlite3\", \"sqlite3\"])) {\n candidates.add(\"sqlite\");\n }\n\n if (hasAnyDependency(dependencies, [\"mongodb\", \"mongoose\"])) {\n candidates.add(\"mongodb\");\n }\n\n if (candidates.size === 1) {\n return Array.from(candidates)[0]!;\n }\n\n if (candidates.size > 1) {\n throw new Error(\n `Detected multiple possible schema targets (${Array.from(candidates).join(\", \")}). Pass --orm to choose one.`,\n );\n }\n\n return null;\n}\n\nasync function detectDrizzleDialect(\n root: string,\n packageManifest: PackageManifest | null,\n): Promise<GenerateFarmSqlDialect | null> {\n const configPath = findExistingPath(root, [\n \"drizzle.config.ts\",\n \"drizzle.config.mts\",\n \"drizzle.config.js\",\n \"drizzle.config.mjs\",\n \"drizzle.config.cjs\",\n ]);\n\n if (configPath) {\n const source = await readFile(configPath, \"utf8\");\n const dialectMatch = source.match(\n /dialect\\s*:\\s*[\"'](postgresql|postgres|mysql|sqlite|turso)[\"']/,\n );\n if (dialectMatch) {\n const dialect = dialectMatch[1];\n if (dialect === \"postgresql\" || dialect === \"postgres\") {\n return \"postgres\";\n }\n if (dialect === \"mysql\") {\n return \"mysql\";\n }\n if (dialect === \"sqlite\" || dialect === \"turso\") {\n return \"sqlite\";\n }\n }\n }\n\n const dependencies = getPackageDependencyNames(packageManifest);\n const candidates = new Set<GenerateFarmSqlDialect>();\n\n if (hasAnyDependency(dependencies, [\"pg\", \"postgres\", \"@neondatabase/serverless\"])) {\n candidates.add(\"postgres\");\n }\n\n if (hasAnyDependency(dependencies, [\"mysql2\", \"@planetscale/database\"])) {\n candidates.add(\"mysql\");\n }\n\n if (hasAnyDependency(dependencies, [\"better-sqlite3\", \"sqlite3\"])) {\n candidates.add(\"sqlite\");\n }\n\n return candidates.size === 1 ? Array.from(candidates)[0]! : null;\n}\n\nfunction findExistingPath(root: string, relativePaths: readonly string[]) {\n for (const relativePath of relativePaths) {\n const absolutePath = path.join(root, relativePath);\n if (existsSync(absolutePath)) {\n return absolutePath;\n }\n }\n\n return null;\n}\n\nfunction getPackageDependencyNames(packageManifest: PackageManifest | null) {\n return new Set([\n ...Object.keys(packageManifest?.dependencies || {}),\n ...Object.keys(packageManifest?.devDependencies || {}),\n ...Object.keys(packageManifest?.peerDependencies || {}),\n ...Object.keys(packageManifest?.optionalDependencies || {}),\n ]);\n}\n\nfunction hasAnyDependency(dependencies: Set<string>, candidates: readonly string[]) {\n return candidates.some((candidate) => dependencies.has(candidate));\n}\n\nfunction collectSchemaModels(\n schemaEntries: ReadonlyArray<readonly [string, FarmIntegrationSchema]>,\n) {\n const collectedModels: CollectedSchemaModel[] = [];\n const seenModelNames = new Map<string, string>();\n\n for (const [integrationKey, schema] of schemaEntries) {\n const resolvedModels = resolveSchemaModels(integrationKey, schema);\n\n for (const [modelKey, model] of Object.entries(resolvedModels)) {\n const collisionKey = model.name.toLowerCase();\n const previousOwner = seenModelNames.get(collisionKey);\n\n if (previousOwner && previousOwner !== `${integrationKey}.${modelKey}`) {\n throw new Error(\n `Integration schema model \"${integrationKey}.${modelKey}\" resolves to \"${model.name}\", which conflicts with \"${previousOwner}\". Rename one of the models with schema.models.<model>.name.`,\n );\n }\n\n seenModelNames.set(collisionKey, `${integrationKey}.${modelKey}`);\n\n collectedModels.push({\n integrationKey,\n modelKey,\n modelName: model.name,\n exportName: toCamelCase(`${integrationKey}_${modelKey}`),\n prismaModelName: toPascalCase(`${integrationKey}_${modelKey}`),\n model,\n });\n }\n }\n\n return collectedModels;\n}\n\nfunction resolveSchemaModels(integrationKey: string, schema: FarmIntegrationSchema) {\n const models: Record<string, FarmIntegrationSchemaModel> = Object.fromEntries(\n Object.entries(schema.models).map(([modelKey, model]) => [modelKey, cloneSchemaModel(model)]),\n );\n\n for (const [modelKey, extension] of Object.entries(schema.extend || {})) {\n const existing = models[modelKey];\n models[modelKey] = {\n ...(existing || { fields: {} }),\n ...(extension.name ? { name: extension.name } : {}),\n ...(extension.description ? { description: extension.description } : {}),\n fields: {\n ...existing?.fields,\n ...extension.fields,\n },\n constraints: [...(existing?.constraints || []), ...(extension.constraints || [])],\n meta: {\n ...existing?.meta,\n ...extension.meta,\n },\n };\n }\n\n for (const [modelKey, override] of Object.entries(schema.override || {})) {\n const existing = models[modelKey];\n\n if (!existing) {\n throw new Error(\n `Integration schema override for \"${integrationKey}.${modelKey}\" is invalid because that model does not exist.`,\n );\n }\n\n const fields = {\n ...existing.fields,\n };\n\n for (const [fieldKey, fieldOverride] of Object.entries(override.fields || {})) {\n const existingField = fields[fieldKey];\n\n if (!existingField && !fieldOverride.type) {\n throw new Error(\n `Integration schema override for \"${integrationKey}.${modelKey}.${fieldKey}\" is missing a field type.`,\n );\n }\n\n fields[fieldKey] = {\n ...existingField,\n ...fieldOverride,\n } as FarmIntegrationSchemaField;\n }\n\n models[modelKey] = {\n ...existing,\n ...(override.name ? { name: override.name } : {}),\n ...(override.description ? { description: override.description } : {}),\n fields,\n constraints: override.constraints || existing.constraints,\n meta: {\n ...existing.meta,\n ...override.meta,\n },\n };\n }\n\n const resolvedModels: Record<string, ResolvedSchemaModel> = {};\n\n for (const [modelKey, model] of Object.entries(models)) {\n const modelName = model.name || toSnakeCase(`${integrationKey}_${modelKey}`);\n const fieldNames = new Set<string>();\n const resolvedFields: Record<string, ResolvedSchemaField> = {};\n\n for (const [fieldKey, field] of Object.entries(model.fields)) {\n const fieldName = field.name || toSnakeCase(fieldKey);\n\n if (fieldNames.has(fieldName)) {\n throw new Error(\n `Integration schema model \"${integrationKey}.${modelKey}\" contains duplicate field name \"${fieldName}\".`,\n );\n }\n\n fieldNames.add(fieldName);\n resolvedFields[fieldKey] = {\n ...field,\n name: fieldName,\n };\n }\n\n resolvedModels[modelKey] = {\n ...model,\n name: modelName,\n fields: resolvedFields,\n };\n }\n\n return resolvedModels;\n}\n\nfunction cloneSchemaModel(model: FarmIntegrationSchemaModel): FarmIntegrationSchemaModel {\n return {\n ...model,\n fields: Object.fromEntries(\n Object.entries(model.fields).map(([fieldKey, field]) => [fieldKey, { ...field }]),\n ),\n constraints: model.constraints ? [...model.constraints] : undefined,\n meta: model.meta ? { ...model.meta } : undefined,\n };\n}\n\nasync function writePrismaSchema(schemaPath: string, models: readonly CollectedSchemaModel[]) {\n const source = await readFile(schemaPath, \"utf8\");\n const generated = createPrismaGeneratedBlock(generatePrismaSchema(models));\n const pattern = new RegExp(\n `${escapeRegExp(PRISMA_GENERATED_START)}[\\\\s\\\\S]*?${escapeRegExp(PRISMA_GENERATED_END)}`,\n \"m\",\n );\n\n const nextSource = pattern.test(source)\n ? source.replace(pattern, generated)\n : `${source.trimEnd()}\\n\\n${generated}\\n`;\n\n await writeFile(schemaPath, nextSource, \"utf8\");\n}\n\nfunction generatePrismaSchema(models: readonly CollectedSchemaModel[]) {\n const sections = models.map((model) => renderPrismaModel(model));\n return sections.join(\"\\n\\n\");\n}\n\nfunction renderPrismaModel(model: CollectedSchemaModel) {\n const lines: string[] = [\n `/// Farm.js generated from integration \"${model.integrationKey}\" model \"${model.modelKey}\"`,\n `model ${model.prismaModelName} {`,\n ];\n\n const modelLevelConstraints: string[] = [];\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (field.reference) {\n lines.push(\n ` /// References ${field.reference.model}.${field.reference.field}${field.reference.onDelete ? ` (onDelete: ${field.reference.onDelete})` : \"\"}`,\n );\n }\n\n const parts = [\n fieldKey,\n `${getPrismaFieldType(field)}${field.list ? \"[]\" : isNullableField(field) ? \"?\" : \"\"}`,\n ];\n const attributes: string[] = [];\n\n if (field.primaryKey) {\n attributes.push(\"@id\");\n if (field.type === \"id\" && field.default === undefined) {\n attributes.push(\"@default(cuid())\");\n }\n if (field.type === \"uuid\" && field.default === undefined) {\n attributes.push(\"@default(uuid())\");\n }\n } else if (field.unique) {\n attributes.push(\"@unique\");\n }\n\n const defaultAttribute = getPrismaDefaultAttribute(field);\n if (defaultAttribute) {\n attributes.push(defaultAttribute);\n }\n\n if (field.meta?.autoUpdate && field.type === \"datetime\") {\n attributes.push(\"@updatedAt\");\n }\n\n if (field.name !== fieldKey) {\n attributes.push(`@map(\"${escapeString(field.name)}\")`);\n }\n\n if (attributes.length) {\n parts.push(attributes.join(\" \"));\n }\n\n lines.push(` ${parts.join(\" \")}`);\n\n if (field.index) {\n modelLevelConstraints.push(\n `@@index([${fieldKey}], map: \"${escapeString(`${model.modelName}_${field.name}_idx`)}\")`,\n );\n }\n }\n\n for (const constraint of model.model.constraints || []) {\n const fields = constraint.fields.join(\", \");\n const attribute = constraint.type === \"unique\" ? \"@@unique\" : \"@@index\";\n const suffix = constraint.name ? `, map: \"${escapeString(constraint.name)}\"` : \"\";\n modelLevelConstraints.push(`${attribute}([${fields}]${suffix})`);\n }\n\n lines.push(` @@map(\"${escapeString(model.modelName)}\")`);\n\n for (const constraint of modelLevelConstraints) {\n lines.push(` ${constraint}`);\n }\n\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n\nfunction getPrismaFieldType(field: ResolvedSchemaField) {\n switch (field.type) {\n case \"boolean\":\n return \"Boolean\";\n case \"integer\":\n return \"Int\";\n case \"number\":\n return \"Float\";\n case \"datetime\":\n return \"DateTime\";\n case \"json\":\n return \"Json\";\n default:\n return \"String\";\n }\n}\n\nfunction getPrismaDefaultAttribute(field: ResolvedSchemaField) {\n if (field.default === undefined) {\n return null;\n }\n\n if (field.type === \"datetime\" && field.default === \"now\") {\n return \"@default(now())\";\n }\n\n if (typeof field.default === \"string\") {\n return `@default(\"${escapeString(field.default)}\")`;\n }\n\n if (typeof field.default === \"number\" || typeof field.default === \"boolean\") {\n return `@default(${String(field.default)})`;\n }\n\n return null;\n}\n\nfunction createPrismaGeneratedBlock(body: string) {\n return [PRISMA_GENERATED_START, body, PRISMA_GENERATED_END].join(\"\\n\");\n}\n\nfunction generateDrizzleSchema(\n models: readonly CollectedSchemaModel[],\n dialect: GenerateFarmSqlDialect,\n) {\n const tableFactoryName =\n dialect === \"postgres\" ? \"pgTable\" : dialect === \"mysql\" ? \"mysqlTable\" : \"sqliteTable\";\n const importSource =\n dialect === \"postgres\"\n ? \"drizzle-orm/pg-core\"\n : dialect === \"mysql\"\n ? \"drizzle-orm/mysql-core\"\n : \"drizzle-orm/sqlite-core\";\n const imports = new Set<string>([tableFactoryName, \"index\", \"uniqueIndex\"]);\n\n for (const model of models) {\n for (const field of Object.values(model.model.fields)) {\n for (const helper of getDrizzleImportNames(dialect, field)) {\n imports.add(helper);\n }\n }\n }\n\n const lines = [\n \"// Generated by Farm.js CLI. Review before committing.\",\n `import { ${Array.from(imports).sort().join(\", \")} } from \"${importSource}\";`,\n \"\",\n ];\n\n for (const model of models) {\n lines.push(renderDrizzleModel(model, dialect, tableFactoryName));\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nfunction renderDrizzleModel(\n model: CollectedSchemaModel,\n dialect: GenerateFarmSqlDialect,\n tableFactoryName: string,\n) {\n const lines = [\n `// Farm.js generated from integration \"${model.integrationKey}\" model \"${model.modelKey}\"`,\n `export const ${model.exportName} = ${tableFactoryName}(\"${model.modelName}\", {`,\n ];\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (field.reference) {\n lines.push(\n ` // ${fieldKey} references ${field.reference.model}.${field.reference.field}${field.reference.onDelete ? ` (onDelete: ${field.reference.onDelete})` : \"\"}`,\n );\n }\n\n lines.push(` ${fieldKey}: ${renderDrizzleColumn(field, dialect)},`);\n }\n\n lines.push(\"}, (table) => ({\");\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (field.index) {\n lines.push(\n ` ${fieldKey}Idx: index(\"${escapeString(`${model.modelName}_${field.name}_idx`)}\").on(table.${fieldKey}),`,\n );\n }\n }\n\n for (const constraint of model.model.constraints || []) {\n const builder = constraint.type === \"unique\" ? \"uniqueIndex\" : \"index\";\n const accessor = constraint.fields.map((fieldKey) => `table.${fieldKey}`).join(\", \");\n const name =\n constraint.name ||\n `${model.modelName}_${constraint.fields.map((fieldKey) => model.model.fields[fieldKey]?.name || fieldKey).join(\"_\")}_${constraint.type}`;\n lines.push(` ${toCamelCase(name)}: ${builder}(\"${escapeString(name)}\").on(${accessor}),`);\n }\n\n lines.push(\"}));\");\n return lines.join(\"\\n\");\n}\n\nfunction getDrizzleImportNames(dialect: GenerateFarmSqlDialect, field: ResolvedSchemaField) {\n switch (dialect) {\n case \"postgres\":\n switch (field.type) {\n case \"boolean\":\n return [\"boolean\"];\n case \"integer\":\n return [\"integer\"];\n case \"number\":\n return [\"real\"];\n case \"datetime\":\n return [\"timestamp\"];\n case \"json\":\n return [\"jsonb\"];\n default:\n return [\"text\"];\n }\n\n case \"mysql\":\n switch (field.type) {\n case \"boolean\":\n return [\"boolean\"];\n case \"integer\":\n return [\"int\"];\n case \"number\":\n return [\"double\"];\n case \"datetime\":\n return [\"datetime\"];\n case \"json\":\n return [\"json\"];\n case \"text\":\n return [\"text\"];\n default:\n return [\"varchar\"];\n }\n\n case \"sqlite\":\n switch (field.type) {\n case \"number\":\n return [\"real\"];\n case \"integer\":\n case \"boolean\":\n case \"datetime\":\n return [\"integer\"];\n default:\n return [\"text\"];\n }\n }\n}\n\nfunction renderDrizzleColumn(field: ResolvedSchemaField, dialect: GenerateFarmSqlDialect) {\n let expression: string;\n\n if (dialect === \"postgres\") {\n expression = renderPostgresDrizzleColumn(field);\n } else if (dialect === \"mysql\") {\n expression = renderMysqlDrizzleColumn(field);\n } else {\n expression = renderSqliteDrizzleColumn(field);\n }\n\n if (field.primaryKey) {\n expression += \".primaryKey()\";\n }\n\n if (!field.primaryKey && !isNullableField(field)) {\n expression += \".notNull()\";\n }\n\n if (!field.primaryKey && field.unique) {\n expression += \".unique()\";\n }\n\n const defaultValue = getDrizzleDefaultExpression(field, dialect);\n if (defaultValue) {\n expression += defaultValue;\n }\n\n return expression;\n}\n\nfunction renderPostgresDrizzleColumn(field: ResolvedSchemaField) {\n switch (field.type) {\n case \"boolean\":\n return `boolean(\"${field.name}\")`;\n case \"integer\":\n return `integer(\"${field.name}\")`;\n case \"number\":\n return `real(\"${field.name}\")`;\n case \"datetime\":\n return `timestamp(\"${field.name}\", { mode: \"date\" })`;\n case \"json\":\n return `jsonb(\"${field.name}\")`;\n default:\n return `text(\"${field.name}\")`;\n }\n}\n\nfunction renderMysqlDrizzleColumn(field: ResolvedSchemaField) {\n switch (field.type) {\n case \"boolean\":\n return `boolean(\"${field.name}\")`;\n case \"integer\":\n return `int(\"${field.name}\")`;\n case \"number\":\n return `double(\"${field.name}\")`;\n case \"datetime\":\n return `datetime(\"${field.name}\", { mode: \"date\" })`;\n case \"json\":\n return `json(\"${field.name}\")`;\n case \"text\":\n return `text(\"${field.name}\")`;\n default:\n return `varchar(\"${field.name}\", { length: 255 })`;\n }\n}\n\nfunction renderSqliteDrizzleColumn(field: ResolvedSchemaField) {\n switch (field.type) {\n case \"boolean\":\n return `integer(\"${field.name}\", { mode: \"boolean\" })`;\n case \"integer\":\n return `integer(\"${field.name}\")`;\n case \"number\":\n return `real(\"${field.name}\")`;\n case \"datetime\":\n return `integer(\"${field.name}\", { mode: \"timestamp_ms\" })`;\n default:\n return `text(\"${field.name}\")`;\n }\n}\n\nfunction getDrizzleDefaultExpression(field: ResolvedSchemaField, dialect: GenerateFarmSqlDialect) {\n if (field.default === undefined) {\n return \"\";\n }\n\n if (field.type === \"datetime\" && field.default === \"now\") {\n return dialect === \"sqlite\" ? \"\" : \".defaultNow()\";\n }\n\n if (typeof field.default === \"string\") {\n return `.default(\"${escapeString(field.default)}\")`;\n }\n\n if (typeof field.default === \"number\" || typeof field.default === \"boolean\") {\n return `.default(${String(field.default)})`;\n }\n\n return \"\";\n}\n\nfunction generateSqlSchema(\n models: readonly CollectedSchemaModel[],\n dialect: GenerateFarmSqlDialect,\n) {\n const lines = [\"-- Generated by Farm.js CLI. Review before applying.\", \"\"];\n const modelLookup = createModelLookup(models);\n\n for (const model of models) {\n lines.push(\n `-- Integration \"${model.integrationKey}\" model \"${model.modelKey}\"`,\n renderSqlTable(model, dialect, modelLookup),\n \"\",\n );\n\n for (const statement of renderSqlIndexes(model, dialect)) {\n lines.push(statement, \"\");\n }\n }\n\n return lines.join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nfunction renderSqlTable(\n model: CollectedSchemaModel,\n dialect: GenerateFarmSqlDialect,\n modelLookup: Map<string, CollectedSchemaModel>,\n) {\n const tableName = quoteIdentifier(dialect, model.modelName);\n const lines = [`CREATE TABLE IF NOT EXISTS ${tableName} (`];\n const columns: string[] = [];\n const internalReferences = createInternalReferenceLookup(model, dialect, modelLookup);\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n const parts = [` ${quoteIdentifier(dialect, field.name)}`, getSqlColumnType(field, dialect)];\n\n if (field.primaryKey) {\n parts.push(\"PRIMARY KEY\");\n } else if (!isNullableField(field)) {\n parts.push(\"NOT NULL\");\n }\n\n if (!field.primaryKey && field.unique) {\n parts.push(\"UNIQUE\");\n }\n\n const defaultValue = getSqlDefaultExpression(field, dialect);\n if (defaultValue) {\n parts.push(`DEFAULT ${defaultValue}`);\n }\n\n const reference = internalReferences.get(fieldKey);\n if (reference) {\n parts.push(reference);\n } else if (field.reference) {\n parts.push(\n `/* references ${field.reference.model}.${field.reference.field}${field.reference.onDelete ? ` on delete ${field.reference.onDelete}` : \"\"} */`,\n );\n }\n\n columns.push(parts.join(\" \"));\n }\n\n lines.push(columns.join(\",\\n\"));\n lines.push(\");\");\n return lines.join(\"\\n\");\n}\n\nfunction renderSqlIndexes(model: CollectedSchemaModel, dialect: GenerateFarmSqlDialect) {\n const statements: string[] = [];\n const tableName = quoteIdentifier(dialect, model.modelName);\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (!field.index) {\n continue;\n }\n\n const indexName = `${model.modelName}_${field.name}_idx`;\n statements.push(\n `CREATE INDEX IF NOT EXISTS ${quoteIdentifier(dialect, indexName)} ON ${tableName} (${quoteIdentifier(dialect, field.name)});`,\n );\n }\n\n for (const constraint of model.model.constraints || []) {\n const indexName =\n constraint.name ||\n `${model.modelName}_${constraint.fields.map((fieldKey) => model.model.fields[fieldKey]?.name || fieldKey).join(\"_\")}_${constraint.type}`;\n const fields = constraint.fields\n .map((fieldKey) => quoteIdentifier(dialect, model.model.fields[fieldKey]?.name || fieldKey))\n .join(\", \");\n\n if (constraint.type === \"unique\") {\n statements.push(\n `CREATE UNIQUE INDEX IF NOT EXISTS ${quoteIdentifier(dialect, indexName)} ON ${tableName} (${fields});`,\n );\n } else {\n statements.push(\n `CREATE INDEX IF NOT EXISTS ${quoteIdentifier(dialect, indexName)} ON ${tableName} (${fields});`,\n );\n }\n }\n\n return statements;\n}\n\nfunction createInternalReferenceLookup(\n model: CollectedSchemaModel,\n dialect: GenerateFarmSqlDialect,\n modelLookup: Map<string, CollectedSchemaModel>,\n) {\n const lookup = new Map<string, string>();\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (!field.reference) {\n continue;\n }\n\n const referencedModel = modelLookup.get(`${model.integrationKey}.${field.reference.model}`);\n\n if (referencedModel) {\n const referencedField = field.reference.field;\n const pieces = [\n `REFERENCES ${quoteIdentifier(dialect, referencedModel.modelName)} (${quoteIdentifier(dialect, referencedModel.model.fields[referencedField]?.name || toSnakeCase(referencedField))})`,\n ];\n\n if (field.reference.onDelete) {\n pieces.push(`ON DELETE ${field.reference.onDelete.toUpperCase()}`);\n }\n\n lookup.set(fieldKey, pieces.join(\" \"));\n }\n }\n\n return lookup;\n}\n\nfunction getSqlColumnType(field: ResolvedSchemaField, dialect: GenerateFarmSqlDialect) {\n if (dialect === \"postgres\") {\n switch (field.type) {\n case \"boolean\":\n return \"BOOLEAN\";\n case \"integer\":\n return \"INTEGER\";\n case \"number\":\n return \"DOUBLE PRECISION\";\n case \"datetime\":\n return \"TIMESTAMPTZ\";\n case \"json\":\n return \"JSONB\";\n default:\n return \"TEXT\";\n }\n }\n\n if (dialect === \"mysql\") {\n switch (field.type) {\n case \"boolean\":\n return \"BOOLEAN\";\n case \"integer\":\n return \"INT\";\n case \"number\":\n return \"DOUBLE\";\n case \"datetime\":\n return \"DATETIME\";\n case \"json\":\n return \"JSON\";\n case \"text\":\n return \"TEXT\";\n default:\n return \"VARCHAR(255)\";\n }\n }\n\n switch (field.type) {\n case \"boolean\":\n case \"integer\":\n return \"INTEGER\";\n case \"number\":\n return \"REAL\";\n default:\n return \"TEXT\";\n }\n}\n\nfunction getSqlDefaultExpression(field: ResolvedSchemaField, dialect: GenerateFarmSqlDialect) {\n if (field.default === undefined) {\n return null;\n }\n\n if (field.type === \"datetime\" && field.default === \"now\") {\n return \"CURRENT_TIMESTAMP\";\n }\n\n if (typeof field.default === \"string\") {\n return `'${escapeString(field.default)}'`;\n }\n\n if (typeof field.default === \"number\") {\n return String(field.default);\n }\n\n if (typeof field.default === \"boolean\") {\n if (dialect === \"sqlite\") {\n return field.default ? \"1\" : \"0\";\n }\n return field.default ? \"TRUE\" : \"FALSE\";\n }\n\n return null;\n}\n\nfunction generateMongoBootstrap(models: readonly CollectedSchemaModel[]) {\n const lines = [\n \"// Generated by Farm.js CLI. Review before committing.\",\n 'import type { Db } from \"mongodb\";',\n \"\",\n \"export async function ensureFarmIntegrationCollections(db: Db) {\",\n ];\n\n for (const model of models) {\n lines.push(` // Integration \"${model.integrationKey}\" model \"${model.modelKey}\"`);\n lines.push(` const ${model.exportName} = db.collection(\"${escapeString(model.modelName)}\");`);\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (field.unique) {\n const options: string[] = [\"unique: true\"];\n if (isNullableField(field)) {\n options.push(\"sparse: true\");\n }\n options.push(`name: \"${escapeString(`${model.modelName}_${field.name}_unique`)}\"`);\n lines.push(\n ` await ${model.exportName}.createIndex({ ${JSON.stringify(field.name)}: 1 }, { ${options.join(\", \")} });`,\n );\n } else if (field.index) {\n lines.push(\n ` await ${model.exportName}.createIndex({ ${JSON.stringify(field.name)}: 1 }, { name: \"${escapeString(`${model.modelName}_${field.name}_idx`)}\" });`,\n );\n }\n\n if (field.reference) {\n lines.push(\n ` // ${fieldKey} references ${field.reference.model}.${field.reference.field}${field.reference.onDelete ? ` (onDelete: ${field.reference.onDelete})` : \"\"}`,\n );\n }\n }\n\n for (const constraint of model.model.constraints || []) {\n const indexSpec = constraint.fields\n .map((fieldKey) => `${JSON.stringify(model.model.fields[fieldKey]?.name || fieldKey)}: 1`)\n .join(\", \");\n const indexName =\n constraint.name ||\n `${model.modelName}_${constraint.fields.map((fieldKey) => model.model.fields[fieldKey]?.name || fieldKey).join(\"_\")}_${constraint.type}`;\n const options =\n constraint.type === \"unique\"\n ? `{ unique: true, name: \"${escapeString(indexName)}\" }`\n : `{ name: \"${escapeString(indexName)}\" }`;\n lines.push(` await ${model.exportName}.createIndex({ ${indexSpec} }, ${options});`);\n }\n\n lines.push(\"\");\n }\n\n lines.push(\"}\");\n return lines.join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nasync function writeGeneratedFile(filePath: string, contents: string) {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, contents, \"utf8\");\n}\n\nfunction isNullableField(field: ResolvedSchemaField) {\n return field.nullable === true || field.required === false;\n}\n\nfunction quoteIdentifier(dialect: GenerateFarmSqlDialect, value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createModelLookup(models: readonly CollectedSchemaModel[]) {\n return new Map(models.map((model) => [`${model.integrationKey}.${model.modelKey}`, model]));\n}\n\nfunction toSnakeCase(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s.-]+/g, \"_\")\n .replace(/__+/g, \"_\")\n .toLowerCase();\n}\n\nfunction toPascalCase(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[\\s._-]+/g, \" \")\n .split(\" \")\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction toCamelCase(value: string) {\n const pascal = toPascalCase(value);\n return pascal ? pascal.charAt(0).toLowerCase() + pascal.slice(1) : pascal;\n}\n\nfunction escapeString(value: string) {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/'/g, \"''\");\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import {\n getFarmSourceRoots,\n loadConfig,\n resolveConfig,\n type FarmCronJob,\n type ResolvedFarmConfig,\n} from \"@farm.js/core\";\nimport { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pc from \"picocolors\";\n\nexport type FarmDoctorCheckStatus = \"pass\" | \"warn\" | \"fail\" | \"info\";\n\nexport interface FarmDoctorCheck {\n status: FarmDoctorCheckStatus;\n code: string;\n title: string;\n message: string;\n action?: string;\n}\n\nexport interface FarmDoctorReport {\n generatedAt: string;\n source: \"live\" | \"project\";\n health: \"ready\" | \"attention\" | \"error\";\n project: {\n name: string;\n root: string;\n };\n target?: {\n url?: string;\n devtoolsUrl?: string;\n deployment?: string;\n preset?: string;\n };\n runtime?: {\n pages: number;\n layouts: number;\n apiRoutes: number;\n middleware: number;\n integrations: number;\n storageMounts: number;\n cronJobs: number;\n workflows: number;\n };\n summary: Record<FarmDoctorCheckStatus, number>;\n checks: FarmDoctorCheck[];\n fixes?: FarmDoctorFix[];\n}\n\nexport interface FarmDoctorFix {\n code: string;\n title: string;\n filePath: string;\n}\n\nexport interface FarmDoctorOptions {\n root?: string;\n configPath?: string;\n url?: string;\n host?: string;\n port?: number | string;\n offline?: boolean;\n timeoutMs?: number;\n fetch?: typeof globalThis.fetch;\n env?: Record<string, string | undefined>;\n now?: () => Date;\n /** Apply only additive corrections that never overwrite application files. */\n fix?: boolean;\n}\n\ntype LiveSnapshot = {\n generatedAt?: string;\n health?: \"ready\" | \"attention\" | \"error\";\n project: {\n name: string;\n root: string;\n };\n deployment: {\n target: string;\n preset: string;\n };\n counts: {\n pages: number;\n layouts: number;\n apiRoutes: number;\n middleware: number;\n integrations: number;\n storageMounts: number;\n cronJobs: number;\n workflows: number;\n };\n diagnostics: Array<{\n severity: \"error\" | \"warning\" | \"info\";\n code: string;\n title: string;\n message: string;\n action?: string;\n }>;\n};\n\nconst ROUTE_EXTENSIONS = [\"ts\", \"tsx\", \"js\", \"jsx\", \"md\", \"mdx\"];\nconst CONFIG_FILES = [\n \"farm.config.ts\",\n \"farm.config.mts\",\n \"farm.config.js\",\n \"farm.config.mjs\",\n \"config.ts\",\n \"config.mts\",\n \"config.js\",\n \"config.mjs\",\n];\n\nexport async function runFarmDoctor(options: FarmDoctorOptions = {}): Promise<FarmDoctorReport> {\n const root = path.resolve(options.root || process.cwd());\n const liveTarget = resolveLiveTarget(options);\n let liveError: string | undefined;\n\n if (!options.offline && !options.fix) {\n try {\n const snapshot = await fetchLiveSnapshot(liveTarget, options);\n return createLiveReport(snapshot, liveTarget, options.now);\n } catch (error) {\n liveError = formatError(error);\n }\n }\n\n const report = await createProjectReport(root, options);\n if (!options.offline && hasExplicitLiveTarget(options) && liveError) {\n report.checks.unshift({\n status: \"warn\",\n code: \"LIVE_RUNTIME_UNREACHABLE\",\n title: \"Running app was not reachable\",\n message: liveError,\n action: `Start farm dev or verify ${liveTarget}.`,\n });\n report.target = { ...report.target, url: liveTarget };\n finalizeReport(report);\n }\n return report;\n}\n\nexport function formatFarmDoctorReport(\n report: FarmDoctorReport,\n options: { color?: boolean } = {},\n): string {\n const color = options.color === undefined ? pc : pc.createColors(options.color);\n const statusStyle: Record<FarmDoctorCheckStatus, (value: string) => string> = {\n pass: color.inverse,\n warn: color.yellow,\n fail: color.red,\n info: color.cyan,\n };\n const lines = [\n `${color.bold(\"FARM\")} ${color.dim(\"/\")} ${color.bold(\"DOCTOR\")}`,\n `${color.white(report.project.name)} ${color.dim(\"/\")} ${color.dim(report.source === \"live\" ? \"LIVE RUNTIME\" : \"PROJECT\")}`,\n \"\",\n ];\n\n for (const check of report.checks) {\n const label = check.status.toUpperCase().padEnd(4);\n lines.push(`${statusStyle[check.status](label)} ${color.bold(check.title)}`);\n lines.push(` ${color.dim(check.message)}`);\n if (check.action) lines.push(` ${color.dim(`Next: ${check.action}`)}`);\n }\n\n const summary = [\n `${report.summary.pass} passed`,\n `${report.summary.warn} warning${report.summary.warn === 1 ? \"\" : \"s\"}`,\n `${report.summary.fail} failed`,\n `${report.summary.info} info`,\n ].join(\" / \");\n if (report.fixes?.length) {\n lines.push(\"\", color.bold(\"FIXED\"));\n for (const fix of report.fixes) {\n lines.push(` ${color.green(\"✓\")} ${fix.title}`);\n lines.push(` ${color.dim(fix.filePath)}`);\n }\n }\n lines.push(\"\", `${color.bold(\"SUMMARY\")} ${summary}`);\n if (report.target?.devtoolsUrl) {\n lines.push(`${color.bold(\"DEVTOOLS\")} ${report.target.devtoolsUrl}`);\n }\n return lines.join(\"\\n\");\n}\n\nasync function fetchLiveSnapshot(\n baseUrl: string,\n options: FarmDoctorOptions,\n): Promise<LiveSnapshot> {\n const controller = new AbortController();\n const timeoutMs = options.timeoutMs ?? 1_200;\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n timeout.unref?.();\n\n try {\n const response = await (options.fetch || globalThis.fetch)(`${baseUrl}/__farm/devtools.json`, {\n headers: { accept: \"application/json\" },\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(`Devtools returned ${response.status} from ${baseUrl}.`);\n }\n const value = (await response.json()) as unknown;\n if (!isLiveSnapshot(value)) {\n throw new Error(`Devtools at ${baseUrl} returned an unsupported snapshot.`);\n }\n return value;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(`Timed out after ${timeoutMs}ms while probing ${baseUrl}.`);\n }\n if (error instanceof TypeError) {\n throw new Error(`Could not connect to ${baseUrl}.`);\n }\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction createLiveReport(\n snapshot: LiveSnapshot,\n baseUrl: string,\n now: FarmDoctorOptions[\"now\"],\n): FarmDoctorReport {\n const checks: FarmDoctorCheck[] = [\n {\n status: \"pass\",\n code: \"LIVE_RUNTIME_READY\",\n title: \"Connected to the Farm runtime\",\n message: `${formatCount(snapshot.counts.pages, \"page\")}, ${formatCount(snapshot.counts.apiRoutes, \"API route\")}, and ${formatCount(snapshot.counts.middleware, \"middleware layer\")} are registered.`,\n },\n {\n status: \"pass\",\n code: \"DEPLOYMENT_RESOLVED\",\n title: \"Deployment target is resolved\",\n message: `${snapshot.deployment.target} uses the ${snapshot.deployment.preset} preset.`,\n },\n {\n status: \"info\",\n code: \"PRODUCT_SYSTEMS_DISCOVERED\",\n title: \"Product systems are visible\",\n message: `${formatCount(snapshot.counts.integrations, \"integration\")}, ${formatCount(snapshot.counts.storageMounts, \"storage mount\")}, ${formatCount(snapshot.counts.cronJobs, \"cron route\")}, and ${formatCount(snapshot.counts.workflows, \"workflow\")}.`,\n },\n ...snapshot.diagnostics.map((diagnostic) => ({\n status:\n diagnostic.severity === \"error\"\n ? (\"fail\" as const)\n : diagnostic.severity === \"warning\"\n ? (\"warn\" as const)\n : (\"info\" as const),\n code: diagnostic.code,\n title: diagnostic.title,\n message: diagnostic.message,\n ...(diagnostic.action ? { action: diagnostic.action } : {}),\n })),\n ];\n const report: FarmDoctorReport = {\n generatedAt: snapshot.generatedAt || (now?.() || new Date()).toISOString(),\n source: \"live\",\n health: \"ready\",\n project: snapshot.project,\n target: {\n url: baseUrl,\n devtoolsUrl: `${baseUrl}/__farm/devtools`,\n deployment: snapshot.deployment.target,\n preset: snapshot.deployment.preset,\n },\n runtime: { ...snapshot.counts },\n summary: emptySummary(),\n checks,\n };\n finalizeReport(report);\n return report;\n}\n\nasync function createProjectReport(\n root: string,\n options: FarmDoctorOptions,\n): Promise<FarmDoctorReport> {\n const checks: FarmDoctorCheck[] = [];\n const report: FarmDoctorReport = {\n generatedAt: (options.now?.() || new Date()).toISOString(),\n source: \"project\",\n health: \"ready\",\n project: { name: path.basename(root), root },\n summary: emptySummary(),\n checks,\n };\n\n collectNodeCheck(checks);\n collectPackageCheck(root, checks);\n\n let config: ResolvedFarmConfig | undefined;\n let userConfig: Awaited<ReturnType<typeof loadConfig>>;\n try {\n userConfig = await loadConfig(root, options.configPath, \"development\");\n if (!userConfig) {\n checks.push({\n status: \"fail\",\n code: \"CONFIG_MISSING\",\n title: \"Farm config was not found\",\n message: `No Farm config exists under ${root}.`,\n action: \"Add farm.config.ts and export defineConfig({...}).\",\n });\n } else {\n const configRoot = path.resolve(root, userConfig.root || \".\");\n config = await resolveConfig({ ...userConfig, root: configRoot }, \"development\");\n const configFile = findConfigFile(root, options.configPath);\n checks.push({\n status: \"pass\",\n code: \"CONFIG_VALID\",\n title: \"Farm config loads successfully\",\n message: configFile\n ? path.relative(root, configFile) || path.basename(configFile)\n : \"Resolved config\",\n });\n }\n } catch (error) {\n checks.push({\n status: \"fail\",\n code: \"CONFIG_INVALID\",\n title: \"Farm config could not be resolved\",\n message: formatError(error),\n action: \"Fix the config or environment validation error, then run farm doctor again.\",\n });\n }\n\n if (config && userConfig) {\n collectRouterChecks(config, checks);\n report.target = collectDeploymentChecks(config, userConfig, checks);\n collectCronChecks(config, options.env || process.env, checks);\n }\n\n if (config && options.fix) {\n const fixes = applySafeProjectFixes(root, config, checks);\n if (fixes.length) {\n const refreshed = await createProjectReport(root, { ...options, fix: false });\n refreshed.fixes = fixes;\n return refreshed;\n }\n report.fixes = [];\n }\n\n finalizeReport(report);\n return report;\n}\n\nfunction applySafeProjectFixes(\n root: string,\n config: ResolvedFarmConfig,\n checks: readonly FarmDoctorCheck[],\n): FarmDoctorFix[] {\n const fixes: FarmDoctorFix[] = [];\n if (checks.some((check) => check.code === \"ROOT_LAYOUT_MISSING\")) {\n const layoutPath = path.join(config.root, config.srcDir, \"app\", \"layout.tsx\");\n if (!existsSync(layoutPath)) {\n mkdirSync(path.dirname(layoutPath), { recursive: true });\n writeFileSync(\n layoutPath,\n `import type { ReactNode } from \"react\";\\n\\nexport default function RootLayout({ children }: { children: ReactNode }) {\\n return (\\n <html lang=\"en\">\\n <body>{children}</body>\\n </html>\\n );\\n}\\n`,\n { encoding: \"utf8\", flag: \"wx\" },\n );\n fixes.push({\n code: \"ROOT_LAYOUT_CREATED\",\n title: \"Created the missing root layout\",\n filePath: path.relative(root, layoutPath),\n });\n }\n }\n return fixes;\n}\n\nfunction collectNodeCheck(checks: FarmDoctorCheck[]): void {\n const major = Number(process.versions.node.split(\".\")[0]);\n checks.push(\n major >= 18\n ? {\n status: \"pass\",\n code: \"NODE_SUPPORTED\",\n title: \"Node.js is supported\",\n message: `Node ${process.versions.node} satisfies Farm's Node 18+ baseline.`,\n }\n : {\n status: \"fail\",\n code: \"NODE_UNSUPPORTED\",\n title: \"Node.js is too old\",\n message: `Node ${process.versions.node} does not satisfy Farm's Node 18+ baseline.`,\n action: \"Upgrade Node.js to version 18 or newer.\",\n },\n );\n}\n\nfunction collectPackageCheck(root: string, checks: FarmDoctorCheck[]): void {\n const packagePath = path.join(root, \"package.json\");\n if (!existsSync(packagePath)) {\n checks.push({\n status: \"fail\",\n code: \"PACKAGE_MISSING\",\n title: \"package.json was not found\",\n message: `No package manifest exists under ${root}.`,\n action: \"Run the command from a Farm application root.\",\n });\n return;\n }\n\n try {\n const manifest = JSON.parse(readFileSync(packagePath, \"utf8\")) as Record<string, unknown>;\n const dependencies = {\n ...asRecord(manifest.dependencies),\n ...asRecord(manifest.devDependencies),\n ...asRecord(manifest.peerDependencies),\n };\n const version = dependencies[\"@farm.js/core\"];\n checks.push(\n typeof version === \"string\"\n ? {\n status: \"pass\",\n code: \"CORE_INSTALLED\",\n title: \"Farm core is installed\",\n message: `@farm.js/core ${version}`,\n }\n : {\n status: \"fail\",\n code: \"CORE_MISSING\",\n title: \"Farm core is not declared\",\n message: \"@farm.js/core is missing from package.json.\",\n action: \"Install @farm.js/core and add it to the application dependencies.\",\n },\n );\n } catch (error) {\n checks.push({\n status: \"fail\",\n code: \"PACKAGE_INVALID\",\n title: \"package.json is invalid\",\n message: formatError(error),\n action: \"Fix the package manifest JSON.\",\n });\n }\n}\n\nfunction collectRouterChecks(config: ResolvedFarmConfig, checks: FarmDoctorCheck[]): void {\n const sources = getFarmSourceRoots(config);\n const appDirectories = sources.map((source) => path.join(source.root, source.srcDir, \"app\"));\n const hasPages = appDirectories.some((directory) =>\n containsFile(directory, /^page\\.(?:ts|tsx|js|jsx|md|mdx)$/),\n );\n const hasProgrammaticRoutes = sources.some((source) =>\n ROUTE_EXTENSIONS.some((extension) =>\n existsSync(path.join(source.root, source.srcDir, `farm.routes.${extension}`)),\n ),\n );\n checks.push(\n hasPages || hasProgrammaticRoutes\n ? {\n status: \"pass\",\n code: \"APP_ROUTER_READY\",\n title: \"App router has route modules\",\n message: `${config.srcDir}/app and extended layers are discoverable.`,\n }\n : {\n status: \"fail\",\n code: \"NO_PAGE_ROUTES\",\n title: \"No page routes were found\",\n message: `Farm found no page modules under ${config.srcDir}/app.`,\n action: `Add ${config.srcDir}/app/page.tsx or ${config.srcDir}/farm.routes.tsx.`,\n },\n );\n\n const hasRootLayout = appDirectories.some((directory) =>\n ROUTE_EXTENSIONS.some((extension) => existsSync(path.join(directory, `layout.${extension}`))),\n );\n checks.push(\n hasRootLayout\n ? {\n status: \"pass\",\n code: \"ROOT_LAYOUT_READY\",\n title: \"Root layout is present\",\n message: \"Shared metadata and application chrome have a root boundary.\",\n }\n : {\n status: \"warn\",\n code: \"ROOT_LAYOUT_MISSING\",\n title: \"Root layout is missing\",\n message: \"The application has no shared root layout.\",\n action: `Add ${config.srcDir}/app/layout.tsx.`,\n },\n );\n}\n\nfunction collectDeploymentChecks(\n config: ResolvedFarmConfig,\n userConfig: NonNullable<Awaited<ReturnType<typeof loadConfig>>>,\n checks: FarmDoctorCheck[],\n): NonNullable<FarmDoctorReport[\"target\"]> {\n const target = String(config.deploy.target || \"node\");\n const preset = String(config.deploy.preset || config.preset || \"node-server\");\n checks.push({\n status: \"pass\",\n code: \"DEPLOYMENT_RESOLVED\",\n title: \"Deployment target is resolved\",\n message: `${target} uses the ${preset} preset and writes to ${config.deploy.outputDir}.`,\n });\n\n const integrations = Object.values(config.integrations || {}).filter(Boolean).length;\n const storageMounts = getStorageMountCount(config.storage);\n checks.push({\n status: \"info\",\n code: \"PRODUCT_SYSTEMS_DISCOVERED\",\n title: \"Product systems are configured\",\n message: `${formatCount(integrations, \"integration\")} and ${formatCount(storageMounts, \"storage mount\")}.`,\n });\n\n if (\n userConfig.storage &&\n describeRootStorageDriver(userConfig.storage) === \"memory\" &&\n [\"vercel\", \"cloudflare\", \"netlify\"].includes(target)\n ) {\n checks.push({\n status: \"warn\",\n code: \"EPHEMERAL_PRODUCTION_STORAGE\",\n title: \"Production storage is in memory\",\n message: `${target} instances do not preserve in-memory data across executions.`,\n action: \"Configure a durable root storage driver for production state.\",\n });\n }\n\n return { deployment: target, preset };\n}\n\nfunction collectCronChecks(\n config: ResolvedFarmConfig,\n env: Record<string, string | undefined>,\n checks: FarmDoctorCheck[],\n): void {\n const cron = config.cron;\n if (!cron.jobs.length) return;\n\n const missingRoutes = cron.jobs.filter((job) => !hasCronRoute(config, job));\n for (const job of missingRoutes) {\n checks.push({\n status: \"warn\",\n code: \"CRON_ROUTE_MISSING\",\n title: `Cron route ${job.path} was not found`,\n message: `${job.name} is scheduled, but its GET API route is not present in the app directory.`,\n action: \"Add the target API route or update the cron path in farm.config.ts.\",\n });\n }\n if (!env[cron.secretEnv]) {\n checks.push({\n status: \"info\",\n code: \"CRON_SECRET_NOT_SET\",\n title: `${cron.secretEnv} is not set`,\n message: \"Local manual runs remain available, but production cron routes fail closed.\",\n action: `Set ${cron.secretEnv} in the deployment environment before production.`,\n });\n }\n}\n\nfunction hasCronRoute(config: ResolvedFarmConfig, job: FarmCronJob): boolean {\n const relative = job.path.replace(/^\\/+/, \"\").replace(/^api\\//, \"\");\n return getFarmSourceRoots(config).some((source) => {\n const directory = path.join(source.root, source.srcDir, \"app\", \"api\", relative);\n return ROUTE_EXTENSIONS.some((extension) =>\n existsSync(path.join(directory, `route.${extension}`)),\n );\n });\n}\n\nfunction containsFile(directory: string, pattern: RegExp): boolean {\n if (!existsSync(directory)) return false;\n const pending = [directory];\n while (pending.length) {\n const current = pending.pop();\n if (!current) continue;\n for (const entry of readdirSync(current, { withFileTypes: true })) {\n if (entry.isFile() && pattern.test(entry.name)) return true;\n if (entry.isDirectory() && !entry.name.startsWith(\".\")) {\n pending.push(path.join(current, entry.name));\n }\n }\n }\n return false;\n}\n\nfunction getStorageMountCount(storage: unknown): number {\n if (!storage || typeof storage !== \"object\") return 1;\n const mounts = asRecord((storage as Record<string, unknown>).mounts);\n return 1 + Object.keys(mounts).length;\n}\n\nfunction describeRootStorageDriver(storage: unknown): string {\n if (!storage || typeof storage !== \"object\") return \"memory\";\n const value = storage as Record<string, unknown>;\n if (value.kind === \"farm-storage-client\") return \"storage client\";\n if (value.client) return \"storage client\";\n if (typeof value.driver === \"string\") return value.driver;\n if (typeof value.driver === \"function\") return \"custom\";\n return \"memory\";\n}\n\nfunction findConfigFile(root: string, configPath?: string): string | undefined {\n const candidates = configPath ? [configPath, ...CONFIG_FILES] : CONFIG_FILES;\n return candidates\n .map((candidate) => (path.isAbsolute(candidate) ? candidate : path.join(root, candidate)))\n .find(existsSync);\n}\n\nfunction resolveLiveTarget(options: FarmDoctorOptions): string {\n const raw = options.url || `http://${options.host || \"localhost\"}:${options.port || 3000}`;\n return raw.replace(/\\/+$/, \"\");\n}\n\nfunction hasExplicitLiveTarget(options: FarmDoctorOptions): boolean {\n return Boolean(options.url || options.host || options.port);\n}\n\nfunction isLiveSnapshot(value: unknown): value is LiveSnapshot {\n if (!value || typeof value !== \"object\") return false;\n const snapshot = value as Partial<LiveSnapshot>;\n return Boolean(\n snapshot.project &&\n typeof snapshot.project.name === \"string\" &&\n snapshot.deployment &&\n typeof snapshot.deployment.target === \"string\" &&\n snapshot.counts &&\n typeof snapshot.counts.pages === \"number\" &&\n Array.isArray(snapshot.diagnostics),\n );\n}\n\nfunction emptySummary(): Record<FarmDoctorCheckStatus, number> {\n return { pass: 0, warn: 0, fail: 0, info: 0 };\n}\n\nfunction finalizeReport(report: FarmDoctorReport): void {\n const summary = emptySummary();\n for (const check of report.checks) summary[check.status] += 1;\n report.summary = summary;\n report.health = summary.fail > 0 ? \"error\" : summary.warn > 0 ? \"attention\" : \"ready\";\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction formatCount(value: number, noun: string): string {\n return `${value} ${noun}${value === 1 ? \"\" : \"s\"}`;\n}\n","import {\n farmRouteRuleMatches,\n getFarmSourceRoots,\n getFarmPresetRuntime,\n loadConfig,\n mergeFarmRouteRuntimeConfigs,\n resolveConfig,\n resolveFarmRouteRuleRuntimeConfig,\n resolveFarmRouteRuntimeConfig,\n resolveRouteRenderingConfig,\n scanProgrammaticPagePaths,\n type FarmRouteRule,\n type FarmRouteRuntimeConfig,\n} from \"@farm.js/core\";\nimport { existsSync, readFileSync, readdirSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pc from \"picocolors\";\n\nconst ROUTE_EXTENSIONS = [\"tsx\", \"ts\", \"jsx\", \"js\", \"mdx\", \"md\"] as const;\nconst MIDDLEWARE_EXTENSIONS = [\"ts\", \"tsx\", \"js\", \"jsx\", \"mjs\", \"cjs\"] as const;\nconst SOCIAL_IMAGE_EXTENSIONS = [\n \"tsx\",\n \"ts\",\n \"jsx\",\n \"js\",\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"webp\",\n] as const;\n\nexport interface ExplainFarmRouteOptions {\n root?: string;\n configPath?: string;\n}\n\nexport interface FarmRouteExplanation {\n pathname: string;\n pattern: string;\n params: Record<string, string | string[]>;\n filePath: string;\n source: string;\n layouts: string[];\n middleware: Array<{ source: \"file\" | \"config\"; filePath: string }>;\n runtime: {\n runtime: \"auto\" | \"node\" | \"edge\";\n regions?: string[];\n maxDuration?: number;\n };\n rendering: {\n mode: \"static\" | \"partial\" | \"dynamic\" | \"client\";\n reason: string;\n ppr: boolean;\n };\n cache: {\n revalidate?: number | false;\n swr?: number | boolean;\n isr?: number | boolean;\n rules: string[];\n };\n metadata: {\n static: string[];\n dynamic: string[];\n openGraphImage?: string;\n twitterImage?: string;\n };\n deployment: {\n target: string;\n preset: string;\n runtime: \"node\" | \"edge\" | \"unknown\";\n compatible: boolean;\n warnings: string[];\n };\n}\n\ntype PageCandidate = {\n filePath: string;\n pattern: string;\n params: Record<string, string | string[]>;\n source: string;\n priority: number;\n score: number;\n};\n\ntype LayeredRouteFile = {\n filePath: string;\n pattern: string;\n};\n\nexport async function explainFarmRoute(\n pathname: string,\n options: ExplainFarmRouteOptions = {},\n): Promise<FarmRouteExplanation> {\n const root = path.resolve(options.root || process.cwd());\n const userConfig = await loadConfig(root, options.configPath, \"production\");\n const config = await resolveConfig({ root, ...userConfig }, \"production\");\n const normalizedPathname = normalizePathname(pathname, config.basePath || \"/\");\n const candidates = discoverMatchingPages(config, normalizedPathname);\n const page = candidates.sort(\n (left, right) => right.score - left.score || right.priority - left.priority,\n )[0];\n\n if (!page) {\n throw new Error(`No Farm page route matches ${normalizedPathname}.`);\n }\n\n const layouts = collectInheritedRouteFiles(\n config,\n normalizedPathname,\n \"layout\",\n ROUTE_EXTENSIONS,\n );\n const middleware = collectMiddleware(\n root,\n Boolean(userConfig?.middleware && Object.keys(userConfig.middleware).length),\n config,\n normalizedPathname,\n );\n const pageSource = readFileSync(page.filePath, \"utf8\");\n const layoutSources = layouts.map((filePath) => ({\n filePath,\n source: readFileSync(filePath, \"utf8\"),\n }));\n const runtime = resolveFarmRouteRuntimeConfig(\n mergeFarmRouteRuntimeConfigs(\n resolveFarmRouteRuleRuntimeConfig(normalizedPathname, config.routeRules),\n ...layoutSources.map(({ source }) => readRuntimeExports(source)),\n readRuntimeExports(pageSource),\n ),\n `Route ${page.pattern}`,\n );\n const matchingRules = Object.entries(config.routeRules)\n .filter(([pattern]) => farmRouteRuleMatches(pattern, normalizedPathname))\n .sort(([left], [right]) => routeSpecificity(left) - routeSpecificity(right));\n const rendering = resolveRendering(pageSource, matchingRules);\n const cache = resolveCaching(pageSource, matchingRules);\n const metadataSources = [...layoutSources, { filePath: page.filePath, source: pageSource }];\n const openGraphImage = findNearestSocialImage(config, normalizedPathname, \"opengraph-image\");\n const twitterImage = findNearestSocialImage(config, normalizedPathname, \"twitter-image\");\n const preset = String(config.deploy.preset || config.preset || \"node-server\");\n const presetRuntime = getFarmPresetRuntime(preset);\n const compatible =\n rendering.mode === \"static\" ||\n rendering.mode === \"client\" ||\n runtime.runtime === \"auto\" ||\n (presetRuntime !== \"unknown\" && runtime.runtime === presetRuntime);\n const warnings: string[] = [];\n if (presetRuntime === \"unknown\" && runtime.runtime !== \"auto\") {\n warnings.push(\n `Farm cannot verify the ${runtime.runtime} route requirement because the ${preset} preset runtime is unknown.`,\n );\n } else if (!compatible) {\n warnings.push(\n `The route requires ${runtime.runtime}, but the ${preset} preset emits ${presetRuntime} functions.`,\n );\n }\n if (runtime.regions?.length && preset !== \"vercel\" && preset !== \"vercel-edge\") {\n warnings.push(`${preset} does not map Farm per-route region hints.`);\n }\n if (runtime.maxDuration && preset !== \"vercel\") {\n warnings.push(`${preset} does not map Farm per-route maxDuration.`);\n }\n\n return {\n pathname: normalizedPathname,\n pattern: page.pattern,\n params: page.params,\n filePath: toProjectPath(root, page.filePath),\n source: page.source,\n layouts: layouts.map((filePath) => toProjectPath(root, filePath)),\n middleware,\n runtime,\n rendering,\n cache,\n metadata: {\n static: metadataSources\n .filter(({ source }) => /export\\s+const\\s+metadata\\b/.test(source))\n .map(({ filePath }) => toProjectPath(root, filePath)),\n dynamic: metadataSources\n .filter(({ source }) =>\n /export\\s+(?:async\\s+)?function\\s+generateMetadata\\b|export\\s+const\\s+generateMetadata\\b/.test(\n source,\n ),\n )\n .map(({ filePath }) => toProjectPath(root, filePath)),\n ...(openGraphImage ? { openGraphImage: toProjectPath(root, openGraphImage) } : {}),\n ...(twitterImage ? { twitterImage: toProjectPath(root, twitterImage) } : {}),\n },\n deployment: {\n target: String(config.deploy.target || \"node\"),\n preset,\n runtime: presetRuntime,\n compatible,\n warnings,\n },\n };\n}\n\nexport function formatFarmRouteExplanation(\n explanation: FarmRouteExplanation,\n options: { color?: boolean } = {},\n): string {\n const color = options.color === undefined ? pc : pc.createColors(options.color);\n const lines = [\n color.bold(\"FARM / EXPLAIN\"),\n \"\",\n `${color.bold(\"Path\")} ${explanation.pathname}`,\n `${color.bold(\"Pattern\")} ${explanation.pattern}`,\n `${color.bold(\"File\")} ${explanation.filePath}`,\n `${color.bold(\"Source\")} ${explanation.source}`,\n `${color.bold(\"Params\")} ${formatParams(explanation.params)}`,\n `${color.bold(\"Layouts\")} ${explanation.layouts.length ? explanation.layouts.join(\" -> \") : \"none\"}`,\n `${color.bold(\"Middleware\")} ${explanation.middleware.length ? explanation.middleware.map((entry) => entry.filePath).join(\", \") : \"none\"}`,\n `${color.bold(\"Runtime\")} ${formatRuntime(explanation.runtime)}`,\n `${color.bold(\"Rendering\")} ${explanation.rendering.mode} (${explanation.rendering.reason})${explanation.rendering.ppr ? \", PPR\" : \"\"}`,\n `${color.bold(\"Caching\")} ${formatCaching(explanation.cache)}`,\n `${color.bold(\"Metadata\")} ${formatMetadata(explanation.metadata)}`,\n `${color.bold(\"Deployment\")} ${explanation.deployment.target} / ${explanation.deployment.preset} — ${explanation.deployment.compatible ? color.green(\"compatible\") : color.red(\"incompatible\")}`,\n ];\n for (const warning of explanation.deployment.warnings)\n lines.push(` ${color.yellow(\"!\")} ${warning}`);\n return lines.join(\"\\n\");\n}\n\nfunction discoverMatchingPages(\n config: Awaited<ReturnType<typeof resolveConfig>>,\n pathname: string,\n) {\n const candidates: PageCandidate[] = [];\n for (const [priority, source] of getFarmSourceRoots(config).entries()) {\n const appDirectory = path.join(source.root, source.srcDir, \"app\");\n if (existsSync(appDirectory)) {\n for (const filePath of walkFiles(appDirectory)) {\n if (!/^page\\.(?:tsx?|jsx?|mdx?)$/.test(path.basename(filePath))) continue;\n const relativeDirectory = path.relative(appDirectory, path.dirname(filePath));\n if (\n relativeDirectory.split(path.sep).includes(\"api\") ||\n isRouteSlotDirectory(relativeDirectory)\n ) {\n continue;\n }\n const pattern = directoryToRoutePattern(relativeDirectory);\n const match = matchRoutePattern(pattern, pathname);\n if (!match) continue;\n candidates.push({\n filePath,\n pattern,\n params: match.params,\n score: match.score,\n source: source.name,\n priority,\n });\n }\n }\n\n const sourceDirectory = path.join(source.root, source.srcDir);\n if (!existsSync(sourceDirectory)) continue;\n for (const filePath of walkFiles(sourceDirectory)) {\n if (!/\\.(?:tsx?|jsx?)$/.test(filePath) || filePath.endsWith(\".d.ts\")) continue;\n const moduleSource = readFileSync(filePath, \"utf8\");\n for (const pattern of scanProgrammaticPagePaths(moduleSource)) {\n const match = matchRoutePattern(pattern, pathname);\n if (!match) continue;\n candidates.push({\n filePath,\n pattern,\n params: match.params,\n score: match.score,\n source: source.name,\n priority,\n });\n }\n }\n }\n return candidates;\n}\n\nfunction isRouteSlotDirectory(relativeDirectory: string): boolean {\n return relativeDirectory.split(path.sep).some((segment) => /^@[A-Za-z][\\w-]*$/.test(segment));\n}\n\nfunction walkFiles(directory: string): string[] {\n const files: string[] = [];\n const pending = [directory];\n while (pending.length) {\n const current = pending.pop()!;\n for (const entry of readdirSync(current, { withFileTypes: true })) {\n const entryPath = path.join(current, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n pending.push(entryPath);\n continue;\n }\n files.push(entryPath);\n }\n }\n return files;\n}\n\nfunction directoryToRoutePattern(relativeDirectory: string): string {\n const segments = relativeDirectory\n .split(path.sep)\n .filter(Boolean)\n .filter((segment) => !/^\\(.+\\)$/.test(segment) && !segment.startsWith(\"@\"))\n .map((segment) => segment.replace(/^\\(\\.{1,3}\\)/, \"\"));\n return segments.length ? `/${segments.join(\"/\")}` : \"/\";\n}\n\nfunction matchRoutePattern(pattern: string, pathname: string) {\n const patternSegments = splitPath(pattern);\n const pathSegments = splitPath(pathname);\n const params: Record<string, string | string[]> = {};\n let score = 0;\n let pathIndex = 0;\n\n for (const segment of patternSegments) {\n const optionalCatchAll = segment.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/);\n if (optionalCatchAll) {\n params[optionalCatchAll[1]] = pathSegments.slice(pathIndex);\n pathIndex = pathSegments.length;\n score += 1;\n continue;\n }\n const catchAll = segment.match(/^\\[\\.\\.\\.(.+)\\]$/);\n if (catchAll) {\n if (pathIndex >= pathSegments.length) return null;\n params[catchAll[1]] = pathSegments.slice(pathIndex);\n pathIndex = pathSegments.length;\n score += 10;\n continue;\n }\n const dynamic = segment.match(/^\\[(.+)\\]$/);\n if (dynamic) {\n if (pathIndex >= pathSegments.length) return null;\n params[dynamic[1]] = pathSegments[pathIndex++];\n score += 50;\n continue;\n }\n if (segment !== pathSegments[pathIndex++]) return null;\n score += 100;\n }\n\n return pathIndex === pathSegments.length ? { params, score } : null;\n}\n\nfunction collectInheritedRouteFiles(\n config: Awaited<ReturnType<typeof resolveConfig>>,\n pathname: string,\n baseName: string,\n extensions: readonly string[],\n): string[] {\n return collectLayeredRouteFiles(config, baseName, extensions)\n .filter((entry) => matchesRoutePrefix(entry.pattern, pathname))\n .sort(compareInheritedRouteFiles)\n .map((entry) => entry.filePath);\n}\n\nfunction collectMiddleware(\n root: string,\n hasConfigMiddleware: boolean,\n config: Awaited<ReturnType<typeof resolveConfig>>,\n pathname: string,\n): FarmRouteExplanation[\"middleware\"] {\n const rootMiddleware = new Map<string, LayeredRouteFile>();\n for (const source of getFarmSourceRoots(config)) {\n const filePath = findFile(\n path.join(source.root, source.srcDir),\n \"middleware\",\n MIDDLEWARE_EXTENSIONS,\n );\n if (filePath) {\n rootMiddleware.set(\"root\", {\n filePath,\n pattern: \"/\",\n });\n }\n }\n const files = [\n ...rootMiddleware.values(),\n ...collectLayeredRouteFiles(config, \"middleware\", MIDDLEWARE_EXTENSIONS).filter((entry) =>\n matchesRoutePrefix(entry.pattern, pathname),\n ),\n ]\n .sort(compareInheritedRouteFiles)\n .map((entry) => entry.filePath);\n return [\n ...(hasConfigMiddleware\n ? [{ source: \"config\" as const, filePath: \"farm.config (middleware)\" }]\n : []),\n ...files.map((filePath) => ({\n source: \"file\" as const,\n filePath: toProjectPath(root, filePath),\n })),\n ];\n}\n\nfunction collectLayeredRouteFiles(\n config: Awaited<ReturnType<typeof resolveConfig>>,\n baseName: string,\n extensions: readonly string[],\n): LayeredRouteFile[] {\n const files = new Map<string, LayeredRouteFile>();\n const filePattern = new RegExp(\n `^${escapeRegExp(baseName)}\\\\.(?:${extensions.map(escapeRegExp).join(\"|\")})$`,\n );\n\n for (const source of getFarmSourceRoots(config)) {\n const appDirectory = path.join(source.root, source.srcDir, \"app\");\n if (!existsSync(appDirectory)) continue;\n for (const filePath of walkFiles(appDirectory)) {\n if (!filePattern.test(path.basename(filePath))) continue;\n const relativeDirectory = path.relative(appDirectory, path.dirname(filePath));\n const pattern = directoryToRoutePattern(relativeDirectory);\n files.set(pattern, {\n filePath,\n pattern,\n });\n }\n }\n\n return [...files.values()];\n}\n\nfunction findNearestSocialImage(\n config: Awaited<ReturnType<typeof resolveConfig>>,\n pathname: string,\n baseName: string,\n) {\n return collectLayeredRouteFiles(config, baseName, SOCIAL_IMAGE_EXTENSIONS)\n .filter((entry) => matchesRoutePrefix(entry.pattern, pathname))\n .sort((left, right) => compareInheritedRouteFiles(right, left))[0]?.filePath;\n}\n\nfunction compareInheritedRouteFiles(left: LayeredRouteFile, right: LayeredRouteFile): number {\n return splitPath(left.pattern).length - splitPath(right.pattern).length;\n}\n\nfunction matchesRoutePrefix(pattern: string, pathname: string): boolean {\n const patternSegments = splitPath(pattern);\n const pathSegments = splitPath(pathname);\n if (patternSegments.length > pathSegments.length) return false;\n\n return patternSegments.every((segment, index) => {\n if (/^\\[{1,2}(?:\\.\\.\\.)?.+\\]{1,2}$/.test(segment)) return true;\n return segment === pathSegments[index];\n });\n}\n\nfunction findFile(directory: string, baseName: string, extensions: readonly string[]) {\n return extensions\n .map((extension) => path.join(directory, `${baseName}.${extension}`))\n .find(existsSync);\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction readRuntimeExports(source: string): FarmRouteRuntimeConfig {\n const runtime = readStringExport(source, \"runtime\");\n const maxDuration = readNumberOrAutoExport(source, \"maxDuration\");\n const regions = readStringArrayOrAutoExport(source, \"regions\");\n return {\n ...(runtime === \"auto\" || runtime === \"node\" || runtime === \"edge\" ? { runtime } : {}),\n ...(regions ? { regions } : {}),\n ...(maxDuration !== undefined ? { maxDuration } : {}),\n };\n}\n\nfunction resolveRendering(\n pageSource: string,\n matchingRules: Array<[string, FarmRouteRule]>,\n): FarmRouteExplanation[\"rendering\"] {\n const pageRendering = resolveRouteRenderingConfig(\n {\n ...(readBooleanExport(pageSource, \"ssg\") !== undefined\n ? { ssg: readBooleanExport(pageSource, \"ssg\") }\n : {}),\n ...(readBooleanExport(pageSource, \"ppr\") !== undefined\n ? { ppr: readBooleanExport(pageSource, \"ppr\") }\n : {}),\n ...(readBooleanExport(pageSource, \"experimental_ppr\") !== undefined\n ? { experimental_ppr: readBooleanExport(pageSource, \"experimental_ppr\") }\n : {}),\n ...(readNumberOrFalseExport(pageSource, \"revalidate\") !== undefined\n ? { revalidate: readNumberOrFalseExport(pageSource, \"revalidate\") }\n : {}),\n ...(readDynamicExport(pageSource) ? { dynamic: readDynamicExport(pageSource) } : {}),\n },\n pageSource,\n );\n let mode: FarmRouteExplanation[\"rendering\"][\"mode\"] = pageRendering.ssg\n ? \"static\"\n : pageRendering.ppr\n ? \"partial\"\n : \"dynamic\";\n let reason = pageRendering.directive\n ? `page directive ${JSON.stringify(pageRendering.directive)}`\n : pageRendering.ssg\n ? \"page static rendering declaration\"\n : pageRendering.ppr\n ? \"page PPR declaration\"\n : \"default server rendering\";\n let ppr = pageRendering.ppr;\n\n for (const [pattern, rule] of matchingRules) {\n if (rule.prerender === true || rule.render === \"static\") {\n mode = \"static\";\n reason = `routeRules ${pattern}`;\n ppr = false;\n } else if (rule.prerender === false || rule.render === \"dynamic\" || rule.ssr === true) {\n mode = \"dynamic\";\n reason = `routeRules ${pattern}`;\n ppr = false;\n } else if (rule.ssr === false) {\n mode = \"client\";\n reason = `routeRules ${pattern}`;\n ppr = false;\n }\n }\n return { mode, reason, ppr };\n}\n\nfunction resolveCaching(\n pageSource: string,\n matchingRules: Array<[string, FarmRouteRule]>,\n): FarmRouteExplanation[\"cache\"] {\n let swr: number | boolean | undefined;\n let isr: number | boolean | undefined;\n for (const [, rule] of matchingRules) {\n if (typeof rule.swr === \"number\" || typeof rule.swr === \"boolean\") swr = rule.swr;\n if (typeof rule.isr === \"number\" || typeof rule.isr === \"boolean\") isr = rule.isr;\n }\n return {\n ...(readNumberOrFalseExport(pageSource, \"revalidate\") !== undefined\n ? { revalidate: readNumberOrFalseExport(pageSource, \"revalidate\") }\n : {}),\n ...(swr !== undefined ? { swr } : {}),\n ...(isr !== undefined ? { isr } : {}),\n rules: matchingRules.map(([pattern]) => pattern),\n };\n}\n\nfunction readStringExport(source: string, name: string): string | undefined {\n return source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*[\"']([^\"']+)[\"']`))?.[1];\n}\n\nfunction readDynamicExport(\n source: string,\n): \"auto\" | \"force-dynamic\" | \"error\" | \"force-static\" | undefined {\n const dynamic = readStringExport(source, \"dynamic\");\n return dynamic === \"auto\" ||\n dynamic === \"force-dynamic\" ||\n dynamic === \"error\" ||\n dynamic === \"force-static\"\n ? dynamic\n : undefined;\n}\n\nfunction readBooleanExport(source: string, name: string): boolean | undefined {\n const value = source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*(true|false)`))?.[1];\n return value === undefined ? undefined : value === \"true\";\n}\n\nfunction readNumberOrAutoExport(source: string, name: string): number | \"auto\" | undefined {\n const value = source.match(\n new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*(?:[\"'](auto)[\"']|(\\\\d+))`),\n );\n return value?.[1] === \"auto\" ? \"auto\" : value?.[2] ? Number(value[2]) : undefined;\n}\n\nfunction readNumberOrFalseExport(source: string, name: string): number | false | undefined {\n const value = source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*(false|\\\\d+)`))?.[1];\n return value === \"false\" ? false : value ? Number(value) : undefined;\n}\n\nfunction readStringArrayOrAutoExport(source: string, name: string): \"auto\" | string[] | undefined {\n const auto = source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*[\"']auto[\"']`));\n if (auto) return \"auto\";\n const array = source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*\\\\[([^\\\\]]*)\\\\]`))?.[1];\n if (array === undefined) return undefined;\n return [...array.matchAll(/[\"']([^\"']+)[\"']/g)].map((match) => match[1]);\n}\n\nfunction routeSpecificity(pattern: string): number {\n return splitPath(pattern).reduce((score, segment) => {\n if (segment === \"**\" || segment.startsWith(\"[[...\")) return score + 1;\n if (segment === \"*\" || segment.startsWith(\"[...\")) return score + 10;\n if (segment.startsWith(\"[\") || segment.startsWith(\":\")) return score + 50;\n return score + 100;\n }, 0);\n}\n\nfunction normalizePathname(value: string, basePath: string): string {\n let pathname: string;\n try {\n pathname = new URL(value, \"http://farm.local\").pathname;\n } catch {\n pathname = value;\n }\n pathname = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n const normalizedBase =\n basePath && basePath !== \"/\" ? `/${basePath.replace(/^\\/+|\\/+$/g, \"\")}` : \"\";\n if (\n normalizedBase &&\n (pathname === normalizedBase || pathname.startsWith(`${normalizedBase}/`))\n ) {\n pathname = pathname.slice(normalizedBase.length) || \"/\";\n }\n return pathname.length > 1 ? pathname.replace(/\\/+$/, \"\") : pathname;\n}\n\nfunction splitPath(value: string) {\n return value.split(\"/\").filter(Boolean).map(decodeURIComponent);\n}\n\nfunction toProjectPath(root: string, filePath: string) {\n let relativePath = path.relative(root, filePath);\n if (\n (relativePath === \"..\" || relativePath.startsWith(`..${path.sep}`)) &&\n existsSync(root) &&\n existsSync(filePath)\n ) {\n relativePath = path.relative(realpathSync(root), realpathSync(filePath));\n }\n return relativePath.split(path.sep).join(\"/\");\n}\n\nfunction formatParams(params: FarmRouteExplanation[\"params\"]) {\n const entries = Object.entries(params);\n return entries.length\n ? entries\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(\"/\") : value}`)\n .join(\", \")\n : \"none\";\n}\n\nfunction formatRuntime(runtime: FarmRouteExplanation[\"runtime\"]) {\n return [\n runtime.runtime,\n runtime.regions?.length ? `regions=${runtime.regions.join(\",\")}` : \"\",\n runtime.maxDuration ? `maxDuration=${runtime.maxDuration}s` : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n}\n\nfunction formatCaching(cache: FarmRouteExplanation[\"cache\"]) {\n const values = [\n cache.revalidate !== undefined ? `revalidate=${cache.revalidate}` : \"\",\n cache.swr !== undefined ? `swr=${cache.swr}` : \"\",\n cache.isr !== undefined ? `isr=${cache.isr}` : \"\",\n cache.rules.length ? `rules=${cache.rules.join(\",\")}` : \"\",\n ].filter(Boolean);\n return values.length ? values.join(\"; \") : \"request-time / no declared cache\";\n}\n\nfunction formatMetadata(metadata: FarmRouteExplanation[\"metadata\"]) {\n const values = [\n metadata.static.length ? `static=${metadata.static.join(\",\")}` : \"\",\n metadata.dynamic.length ? `dynamic=${metadata.dynamic.join(\",\")}` : \"\",\n metadata.openGraphImage ? `og=${metadata.openGraphImage}` : \"\",\n metadata.twitterImage ? `twitter=${metadata.twitterImage}` : \"\",\n ].filter(Boolean);\n return values.length ? values.join(\"; \") : \"none\";\n}\n","import {\n loadConfig,\n logger,\n resolveConfig,\n type FarmCronJob,\n type FarmCronResolvedConfig,\n} from \"@farm.js/core\";\nimport { Cron } from \"croner\";\nimport path from \"node:path\";\n\nexport interface FarmCronCLIOptions {\n root?: string;\n configPath?: string;\n}\n\nexport interface RunFarmCronOptions extends FarmCronCLIOptions {\n url?: string;\n host?: string;\n port?: number | string;\n secret?: string;\n timeoutMs?: number;\n fetch?: typeof globalThis.fetch;\n trigger?: \"manual\" | \"development\";\n}\n\nexport interface FarmCronRunResult {\n job: FarmCronJob;\n url: string;\n status: number;\n body: unknown;\n durationMs: number;\n}\n\nexport interface FarmCronSchedulerEntry {\n job: FarmCronJob;\n schedule: string;\n timer: Cron;\n}\n\nexport interface FarmCronScheduler {\n entries: FarmCronSchedulerEntry[];\n stop: () => void;\n}\n\nexport async function loadFarmCronConfig(\n options: FarmCronCLIOptions = {},\n): Promise<FarmCronResolvedConfig> {\n const root = path.resolve(options.root || process.cwd());\n const userConfig = await loadConfig(root, options.configPath, \"development\");\n if (!userConfig) {\n throw new Error(\"No Farm config found. Create farm.config.ts before configuring cron routes.\");\n }\n\n const resolvedConfig = await resolveConfig({ root, ...userConfig }, \"development\");\n return resolvedConfig.cron;\n}\n\nexport async function listFarmCronJobs(options: FarmCronCLIOptions = {}): Promise<FarmCronJob[]> {\n const cron = await loadFarmCronConfig(options);\n return cron.jobs;\n}\n\nexport function formatFarmCronJobs(jobs: FarmCronJob[]): string {\n if (jobs.length === 0) return \"No cron routes configured in farm.config.ts.\";\n\n const rows = jobs.map((job) => [\n job.name,\n job.schedule.join(\", \"),\n job.path,\n job.description || \"\",\n ]);\n const headings = [\"NAME\", \"SCHEDULE (UTC)\", \"ROUTE\", \"DESCRIPTION\"];\n const widths = headings.map((heading, column) =>\n Math.max(heading.length, ...rows.map((row) => row[column].length)),\n );\n\n return [headings, ...rows]\n .map((row) =>\n row\n .map((value, column) => value.padEnd(widths[column]))\n .join(\" \")\n .trimEnd(),\n )\n .join(\"\\n\");\n}\n\nexport async function runFarmCronJob(\n name: string,\n options: RunFarmCronOptions = {},\n): Promise<FarmCronRunResult> {\n const cron = await loadFarmCronConfig(options);\n const job = cron.jobs.find((entry) => entry.name === name);\n if (!job) {\n const available = cron.jobs.map((entry) => entry.name).join(\", \");\n throw new Error(\n available\n ? `Cron route ${JSON.stringify(name)} was not found. Available routes: ${available}.`\n : `Cron route ${JSON.stringify(name)} was not found. No cron routes are configured.`,\n );\n }\n\n return invokeFarmCronJob(job, cron, options);\n}\n\nexport async function startFarmCronScheduler(\n options: RunFarmCronOptions = {},\n): Promise<FarmCronScheduler> {\n const cron = await loadFarmCronConfig(options);\n const entries: FarmCronSchedulerEntry[] = [];\n\n for (const job of cron.jobs) {\n for (const schedule of job.schedule) {\n const timer = new Cron(\n schedule,\n {\n name: `farm:cron:${job.name}:${schedule}`,\n timezone: \"UTC\",\n protect: () => {\n logger.warn(`Cron ${job.name} skipped an overlapping run.`);\n },\n catch: (error) => {\n logger.error(`Cron ${job.name} failed: ${formatError(error)}`);\n },\n },\n async () => {\n logger.info(`Cron ${job.name} -> ${job.path}`);\n const result = await invokeFarmCronJob(job, cron, {\n ...options,\n trigger: \"development\",\n });\n logger.success(`Cron ${job.name} completed in ${result.durationMs}ms.`);\n },\n );\n entries.push({ job, schedule, timer });\n }\n }\n\n if (entries.length === 0) {\n logger.info(\"No cron routes are configured; the development scheduler is idle.\");\n } else {\n logger.info(\n `Development cron scheduler started with ${entries.length} UTC schedule${entries.length === 1 ? \"\" : \"s\"}.`,\n );\n for (const entry of entries) {\n const nextRun = entry.timer.nextRun();\n logger.info(\n `Cron ${entry.job.name} (${entry.schedule}) next runs ${nextRun?.toISOString() || \"never\"}.`,\n );\n }\n }\n\n return {\n entries,\n stop() {\n for (const entry of entries) entry.timer.stop();\n },\n };\n}\n\nasync function invokeFarmCronJob(\n job: FarmCronJob,\n cron: FarmCronResolvedConfig,\n options: RunFarmCronOptions,\n): Promise<FarmCronRunResult> {\n const target = resolveCronTarget(job, options);\n const headers = new Headers({\n accept: \"application/json\",\n \"x-farm-cron-name\": job.name,\n \"x-farm-cron-trigger\": options.trigger || \"manual\",\n });\n const secret = options.secret ?? process.env[cron.secretEnv];\n if (secret) headers.set(\"authorization\", `Bearer ${secret}`);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 10_000);\n timeout.unref?.();\n const startedAt = Date.now();\n\n try {\n const response = await (options.fetch || globalThis.fetch)(target, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n const body = await readResponseBody(response);\n const durationMs = Date.now() - startedAt;\n if (!response.ok) {\n throw new Error(\n `Cron ${job.name} received ${response.status} from ${job.path}${formatResponseDetail(body)}.`,\n );\n }\n\n return {\n job,\n url: target,\n status: response.status,\n body,\n durationMs,\n };\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(`Cron ${job.name} timed out after ${options.timeoutMs ?? 10_000}ms.`);\n }\n if (error instanceof TypeError) {\n throw new Error(\n `Could not reach ${target}. Start the Farm dev server or pass --url to a running app.`,\n );\n }\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction resolveCronTarget(job: FarmCronJob, options: RunFarmCronOptions): string {\n const baseURL = options.url || `http://${options.host || \"localhost\"}:${options.port || 3000}`;\n const normalizedBase = baseURL.endsWith(\"/\") ? baseURL : `${baseURL}/`;\n return new URL(job.path.replace(/^\\/+/, \"\"), normalizedBase).toString();\n}\n\nasync function readResponseBody(response: Response): Promise<unknown> {\n if (response.status === 204) return null;\n const text = await response.text();\n if (!text) return null;\n if ((response.headers.get(\"content-type\") || \"\").includes(\"application/json\")) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n\nfunction formatResponseDetail(body: unknown): string {\n if (body === null || body === undefined || body === \"\") return \"\";\n const detail = typeof body === \"string\" ? body : JSON.stringify(body);\n return detail ? `: ${detail}` : \"\";\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { loadConfig, logger } from \"@farm.js/core\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\ntype FarmMigrationCommand =\n | string\n | {\n command: string;\n name?: string;\n cwd?: string;\n env?: Record<string, string | undefined>;\n skip?: boolean;\n };\n\ntype FarmMigrationsUserConfig = { commands?: FarmMigrationCommand[] } | FarmMigrationCommand[];\n\nexport interface MigrateFarmOptions {\n root?: string;\n configPath?: string;\n commands?: string[];\n dryRun?: boolean;\n source?: FarmFrameworkMigrationSource | \"inspect\";\n write?: boolean;\n force?: boolean;\n}\n\ninterface ResolvedMigrationCommand {\n command: string;\n name: string;\n cwd: string;\n env?: Record<string, string | undefined>;\n}\n\nexport type FarmFrameworkMigrationSource = \"next\" | \"tanstack\";\n\ntype MigrationOperationKind = \"write-file\" | \"update-package\";\n\nexport interface FrameworkDetection {\n source: FarmFrameworkMigrationSource;\n confidence: number;\n evidence: string[];\n}\n\nexport interface FrameworkMigrationOperation {\n kind: MigrationOperationKind;\n path: string;\n description: string;\n content?: string;\n skipped?: boolean;\n reason?: string;\n changes?: string[];\n}\n\nexport interface FrameworkMigrationPlan {\n source: FarmFrameworkMigrationSource;\n root: string;\n confidence: number;\n evidence: string[];\n operations: FrameworkMigrationOperation[];\n warnings: string[];\n manual: string[];\n}\n\nexport async function migrateFarm(options: MigrateFarmOptions = {}) {\n const root = path.resolve(options.root || process.cwd());\n\n if (options.source) {\n if (options.source === \"inspect\") {\n const detections = await inspectFrameworkMigrations(root);\n printFrameworkInspection(root, detections);\n return detections;\n }\n\n if (!isFrameworkMigrationSource(options.source)) {\n throw new Error(\n `Unsupported migration source \"${options.source}\". Use \"inspect\", \"next\", or \"tanstack\".`,\n );\n }\n\n const plan = await createFrameworkMigrationPlan(root, options.source, {\n force: options.force,\n });\n printFrameworkMigrationPlan(plan, Boolean(options.write && !options.dryRun));\n\n if (!options.write || options.dryRun) {\n logger.info(`Dry run only. Re-run with \"farm migrate ${options.source} --write\" to apply.`);\n return plan;\n }\n\n await applyFrameworkMigrationPlan(plan);\n logger.success(\n `Applied ${formatOperationCount(plan.operations.filter((operation) => !operation.skipped).length)}.`,\n );\n return plan;\n }\n\n const cliCommands = options.commands?.filter(Boolean) || [];\n const userConfig = await loadConfig(root, options.configPath, \"development\");\n const configuredCommands = getConfiguredCommands(userConfig?.migrations);\n const commandEntries = cliCommands.length ? cliCommands : configuredCommands;\n const commands = commandEntries\n .map((entry, index) => resolveMigrationCommand(root, entry, index))\n .filter((entry): entry is ResolvedMigrationCommand => !!entry);\n\n if (!commands.length) {\n throw new Error(\n \"No migrations configured. Add migrations.commands to farm.config.ts or pass --command.\",\n );\n }\n\n if (options.dryRun) {\n logger.info(`Found ${formatCount(commands.length)} to run:`);\n for (const command of commands) {\n logger.info(` ${command.name}: ${command.command}`);\n }\n return;\n }\n\n for (const command of commands) {\n logger.info(`Running ${command.name}: ${command.command}`);\n await runMigrationCommand(command);\n }\n\n logger.success(`Ran ${formatCount(commands.length)} successfully.`);\n}\n\nfunction getConfiguredCommands(migrations: FarmMigrationsUserConfig | undefined) {\n if (!migrations) return [];\n if (Array.isArray(migrations)) return migrations;\n return migrations.commands || [];\n}\n\nfunction resolveMigrationCommand(\n root: string,\n entry: FarmMigrationCommand,\n index: number,\n): ResolvedMigrationCommand | null {\n if (typeof entry === \"string\") {\n const command = entry.trim();\n if (!command) {\n throw new Error(`Migration command ${index + 1} is empty.`);\n }\n\n return {\n command,\n name: `migration ${index + 1}`,\n cwd: root,\n };\n }\n\n if (entry.skip) return null;\n const command = entry.command.trim();\n if (!command) {\n throw new Error(`Migration command ${index + 1} is empty.`);\n }\n\n return {\n command,\n name: entry.name || `migration ${index + 1}`,\n cwd: entry.cwd ? path.resolve(root, entry.cwd) : root,\n env: entry.env,\n };\n}\n\nfunction runMigrationCommand(command: ResolvedMigrationCommand) {\n return new Promise<void>((resolve, reject) => {\n const child = spawn(command.command, {\n cwd: command.cwd,\n env: {\n ...process.env,\n ...command.env,\n },\n shell: true,\n stdio: \"inherit\",\n });\n\n child.on(\"error\", reject);\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n const reason = signal ? `signal ${signal}` : `exit code ${code}`;\n reject(new Error(`${command.name} failed with ${reason}.`));\n });\n });\n}\n\nfunction formatCount(count: number) {\n return `${count} migration command${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction formatOperationCount(count: number) {\n return `${count} migration operation${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction isFrameworkMigrationSource(value: string): value is FarmFrameworkMigrationSource {\n return value === \"next\" || value === \"tanstack\";\n}\n\nexport async function inspectFrameworkMigrations(root: string): Promise<FrameworkDetection[]> {\n const packageJson = await readPackageJson(root);\n const detections = [detectNext(root, packageJson), detectTanStack(root, packageJson)]\n .filter((entry): entry is FrameworkDetection => entry.confidence > 0)\n .sort((a, b) => b.confidence - a.confidence);\n\n return detections;\n}\n\nexport async function createFrameworkMigrationPlan(\n root: string,\n source: FarmFrameworkMigrationSource,\n options: { force?: boolean } = {},\n): Promise<FrameworkMigrationPlan> {\n const detections = await inspectFrameworkMigrations(root);\n const detection =\n detections.find((entry) => entry.source === source) ||\n ({\n source,\n confidence: 0,\n evidence: [`No ${source} markers detected.`],\n } satisfies FrameworkDetection);\n\n const packageJson = await readPackageJson(root);\n const plan: FrameworkMigrationPlan = {\n source,\n root,\n confidence: detection.confidence,\n evidence: detection.evidence,\n operations: [],\n warnings: [],\n manual: [],\n };\n\n if (source === \"next\") {\n await planNextMigration(root, packageJson, plan, options);\n } else {\n await planTanStackMigration(root, packageJson, plan, options);\n }\n\n addSharedFarmFiles(root, packageJson, plan, options);\n return plan;\n}\n\nasync function planNextMigration(\n root: string,\n packageJson: any,\n plan: FrameworkMigrationPlan,\n options: { force?: boolean },\n) {\n const rootAppDir = path.join(root, \"app\");\n const srcAppDir = path.join(root, \"src\", \"app\");\n const sourceAppDir = existsSync(rootAppDir)\n ? rootAppDir\n : existsSync(srcAppDir)\n ? srcAppDir\n : null;\n\n if (!sourceAppDir) {\n plan.warnings.push(\"No Next App Router directory found at app/ or src/app/.\");\n if (existsSync(path.join(root, \"pages\"))) {\n plan.manual.push(\n \"Pages Router files in pages/ need manual conversion to src/app/**/page.tsx.\",\n );\n }\n return;\n }\n\n const allFiles = await collectFiles(sourceAppDir);\n const files = allFiles.filter(isMigratableTextFile);\n for (const file of allFiles) {\n if (!isMigratableTextFile(file)) {\n plan.manual.push(`Move or review non-code app asset ${toPosix(path.relative(root, file))}.`);\n }\n }\n\n for (const file of files) {\n const relative = path.relative(sourceAppDir, file);\n const target = path.join(srcAppDir, relative);\n const content = await readFile(file, \"utf8\");\n const transformed = transformNextContent(content);\n\n collectNextManualNotes(relative, transformed, plan);\n await addWriteFileOperation(plan, {\n root,\n source: file,\n target,\n content: transformed,\n description:\n sourceAppDir === srcAppDir\n ? `Update Next-compatible app file ${toPosix(path.join(\"src/app\", relative))}`\n : `Copy Next App Router file to ${toPosix(path.join(\"src/app\", relative))}`,\n force: options.force,\n allowExisting: sourceAppDir === srcAppDir,\n });\n }\n\n const rootMiddleware = [\"middleware.ts\", \"middleware.tsx\", \"middleware.js\", \"middleware.jsx\"]\n .map((file) => path.join(root, file))\n .find((file) => existsSync(file));\n\n if (rootMiddleware) {\n const extension = path.extname(rootMiddleware);\n const target = path.join(srcAppDir, `middleware${extension}`);\n await addWriteFileOperation(plan, {\n root,\n source: rootMiddleware,\n target,\n content: await readFile(rootMiddleware, \"utf8\"),\n description: `Copy root middleware to ${toPosix(path.join(\"src/app\", `middleware${extension}`))}`,\n force: options.force,\n });\n plan.manual.push(\n \"Review migrated middleware for next/server APIs; Farm middleware uses @farm.js/core/middleware.\",\n );\n }\n\n if (\n existsSync(path.join(root, \"next.config.js\")) ||\n existsSync(path.join(root, \"next.config.mjs\"))\n ) {\n plan.manual.push(\n \"Review next.config.* and move equivalent settings into farm.config.ts or Vite config.\",\n );\n }\n\n if (packageJson) {\n const migratedPackage = createMigratedPackageJson(packageJson, \"next\");\n addPackageOperation(root, plan, migratedPackage);\n }\n}\n\nasync function planTanStackMigration(\n root: string,\n packageJson: any,\n plan: FrameworkMigrationPlan,\n options: { force?: boolean },\n) {\n const routesDir = [path.join(root, \"src\", \"routes\"), path.join(root, \"routes\")].find((dir) =>\n existsSync(dir),\n );\n\n if (!routesDir) {\n plan.warnings.push(\"No TanStack Router file-route directory found at src/routes/ or routes/.\");\n return;\n }\n\n const appDir = path.join(root, \"src\", \"app\");\n const files = (await collectFiles(routesDir)).filter((file) => {\n const basename = path.basename(file);\n return (\n /\\.(tsx|ts|jsx|js)$/.test(file) &&\n basename !== \"routeTree.gen.ts\" &&\n basename !== \"routeTree.gen.tsx\"\n );\n });\n\n for (const file of files) {\n const target = getTanStackTargetPath(routesDir, file, appDir);\n if (!target) {\n plan.manual.push(\n `Review ${toPosix(path.relative(root, file))}; root routes and route trees are not copied automatically.`,\n );\n continue;\n }\n\n const original = await readFile(file, \"utf8\");\n const transformed = transformTanStackContent(original, path.relative(root, file), plan);\n await addWriteFileOperation(plan, {\n root,\n source: file,\n target,\n content: transformed,\n description: `Convert TanStack route to ${toPosix(path.relative(root, target))}`,\n force: options.force,\n });\n }\n\n plan.manual.push(\n \"Review loaders, beforeLoad hooks, search params, and Route.use* calls; Farm page modules should move that logic into props, API routes, or server helpers.\",\n );\n\n if (packageJson) {\n const migratedPackage = createMigratedPackageJson(packageJson, \"tanstack\");\n addPackageOperation(root, plan, migratedPackage);\n }\n}\n\nfunction addSharedFarmFiles(\n root: string,\n packageJson: any,\n plan: FrameworkMigrationPlan,\n options: { force?: boolean },\n) {\n const farmConfigPath = [\"farm.config.ts\", \"farm.config.mts\", \"farm.config.js\", \"farm.config.mjs\"]\n .map((file) => path.join(root, file))\n .find((file) => existsSync(file));\n\n if (!farmConfigPath) {\n const output = `import { defineConfig } from \"@farm.js/core\";\n\nexport default defineConfig({});\n`;\n\n plan.operations.push({\n kind: \"write-file\",\n path: path.join(root, \"farm.config.ts\"),\n description: \"Create farm.config.ts\",\n content: output,\n skipped: false,\n });\n }\n\n const layoutPath = path.join(root, \"src\", \"app\", \"layout.tsx\");\n if (!existsSync(layoutPath)) {\n plan.operations.push({\n kind: \"write-file\",\n path: layoutPath,\n description: \"Create a minimal root layout\",\n content: `import type { LayoutProps } from \"@farm.js/core\";\n\nexport default function Layout({ children }: LayoutProps) {\n return <>{children}</>;\n}\n`,\n skipped: false,\n });\n }\n\n if (!packageJson) {\n plan.warnings.push(\"No package.json found; add @farm.js/core and @farm.js/cli manually.\");\n }\n}\n\nasync function addWriteFileOperation(\n plan: FrameworkMigrationPlan,\n options: {\n root: string;\n source?: string;\n target: string;\n content: string;\n description: string;\n force?: boolean;\n allowExisting?: boolean;\n },\n) {\n const exists = existsSync(options.target);\n const sameFile = options.source && path.resolve(options.source) === path.resolve(options.target);\n const skipped = exists && !sameFile && !options.allowExisting && !options.force;\n\n plan.operations.push({\n kind: \"write-file\",\n path: options.target,\n description: options.description,\n content: options.content,\n skipped,\n reason: skipped\n ? `${toPosix(path.relative(options.root, options.target))} already exists; pass --force to overwrite.`\n : undefined,\n });\n}\n\nfunction addPackageOperation(\n root: string,\n plan: FrameworkMigrationPlan,\n migrated: { packageJson: any; changes: string[] },\n) {\n if (!migrated.changes.length) return;\n\n plan.operations.push({\n kind: \"update-package\",\n path: path.join(root, \"package.json\"),\n description: \"Update package.json scripts and Farm dependencies\",\n content: `${JSON.stringify(migrated.packageJson, null, 2)}\\n`,\n changes: migrated.changes,\n });\n}\n\nasync function applyFrameworkMigrationPlan(plan: FrameworkMigrationPlan) {\n for (const operation of plan.operations) {\n if (operation.skipped) {\n logger.warn(\n `Skipped ${toPosix(path.relative(plan.root, operation.path))}: ${operation.reason}`,\n );\n continue;\n }\n\n if (operation.kind === \"write-file\" || operation.kind === \"update-package\") {\n await mkdir(path.dirname(operation.path), { recursive: true });\n await writeFile(operation.path, operation.content || \"\", \"utf8\");\n }\n }\n}\n\nfunction printFrameworkInspection(root: string, detections: FrameworkDetection[]) {\n logger.info(`Migration inspection for ${root}`);\n\n if (!detections.length) {\n logger.warn(\"No supported framework detected yet. Supported sources: next, tanstack.\");\n return;\n }\n\n for (const detection of detections) {\n logger.info(`${detection.source}: ${detection.confidence}% confidence`);\n for (const evidence of detection.evidence) {\n logger.info(` - ${evidence}`);\n }\n }\n}\n\nfunction printFrameworkMigrationPlan(plan: FrameworkMigrationPlan, willWrite: boolean) {\n logger.info(\n `${willWrite ? \"Applying\" : \"Prepared\"} ${plan.source} migration plan (${plan.confidence}% confidence):`,\n );\n\n for (const evidence of plan.evidence) {\n logger.info(` evidence: ${evidence}`);\n }\n\n if (!plan.operations.length) {\n logger.warn(\"No file operations were planned.\");\n } else {\n logger.info(\"Operations:\");\n for (const operation of plan.operations) {\n const marker = operation.skipped ? \"skip\" : willWrite ? \"write\" : \"plan\";\n logger.info(` [${marker}] ${operation.description}`);\n if (operation.changes?.length) {\n for (const change of operation.changes) {\n logger.info(` - ${change}`);\n }\n }\n if (operation.reason) {\n logger.info(` ${operation.reason}`);\n }\n }\n }\n\n if (plan.warnings.length) {\n logger.warn(\"Warnings:\");\n for (const warning of unique(plan.warnings)) {\n logger.warn(` - ${warning}`);\n }\n }\n\n if (plan.manual.length) {\n logger.info(\"Manual review:\");\n for (const note of unique(plan.manual)) {\n logger.info(` - ${note}`);\n }\n }\n}\n\nfunction detectNext(root: string, packageJson: any): FrameworkDetection {\n const evidence: string[] = [];\n let confidence = 0;\n\n if (hasPackage(packageJson, \"next\")) {\n confidence += 55;\n evidence.push(\"package.json depends on next\");\n }\n if (existsSync(path.join(root, \"app\"))) {\n confidence += 30;\n evidence.push(\"app/ directory exists\");\n }\n if (existsSync(path.join(root, \"src\", \"app\"))) {\n confidence += 25;\n evidence.push(\"src/app/ directory exists\");\n }\n if (\n existsSync(path.join(root, \"next.config.js\")) ||\n existsSync(path.join(root, \"next.config.mjs\"))\n ) {\n confidence += 15;\n evidence.push(\"next.config.* exists\");\n }\n if (existsSync(path.join(root, \"pages\"))) {\n confidence += 10;\n evidence.push(\"pages/ directory exists\");\n }\n\n return { source: \"next\", confidence: Math.min(confidence, 100), evidence };\n}\n\nfunction detectTanStack(root: string, packageJson: any): FrameworkDetection {\n const evidence: string[] = [];\n let confidence = 0;\n\n if (hasPackage(packageJson, \"@tanstack/react-router\")) {\n confidence += 60;\n evidence.push(\"package.json depends on @tanstack/react-router\");\n }\n if (existsSync(path.join(root, \"src\", \"routes\"))) {\n confidence += 35;\n evidence.push(\"src/routes/ directory exists\");\n }\n if (existsSync(path.join(root, \"routes\"))) {\n confidence += 25;\n evidence.push(\"routes/ directory exists\");\n }\n if (existsSync(path.join(root, \"src\", \"routeTree.gen.ts\"))) {\n confidence += 15;\n evidence.push(\"src/routeTree.gen.ts exists\");\n }\n\n return { source: \"tanstack\", confidence: Math.min(confidence, 100), evidence };\n}\n\nasync function collectFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir);\n const files: string[] = [];\n\n for (const entry of entries) {\n if (entry === \"node_modules\" || entry === \".next\" || entry === \".output\") continue;\n const fullPath = path.join(dir, entry);\n const info = await stat(fullPath);\n\n if (info.isDirectory()) {\n files.push(...(await collectFiles(fullPath)));\n } else if (info.isFile()) {\n files.push(fullPath);\n }\n }\n\n return files.sort();\n}\n\nfunction transformNextContent(content: string) {\n return content\n .replace(/import\\s+([A-Za-z_$][\\w$]*)\\s+from\\s+[\"']next\\/link[\"'];?/g, (_match, localName) =>\n localName === \"Link\"\n ? `import { Link } from \"@farm.js/core/client\";`\n : `import { Link as ${localName} } from \"@farm.js/core/client\";`,\n )\n .replace(/from\\s+[\"']next\\/navigation[\"']/g, `from \"@farm.js/core/navigation\"`)\n .replace(/from\\s+[\"']next\\/headers[\"']/g, `from \"@farm.js/core/headers\"`);\n}\n\nfunction collectNextManualNotes(relative: string, content: string, plan: FrameworkMigrationPlan) {\n const imports = Array.from(content.matchAll(/from\\s+[\"'](next\\/[^\"']+)[\"']/g)).map(\n (match) => match[1],\n );\n for (const importId of imports) {\n plan.manual.push(`Review ${toPosix(relative)}; it still imports ${importId}.`);\n }\n\n if (/getServerSideProps|getStaticProps|getInitialProps/.test(content)) {\n plan.manual.push(\n `Review ${toPosix(relative)}; Pages Router data functions need manual App Router/Farm conversion.`,\n );\n }\n}\n\nfunction isMigratableTextFile(file: string) {\n return /\\.(ts|tsx|js|jsx|mjs|cjs|md|mdx|css|json|txt)$/.test(file);\n}\n\nfunction getTanStackTargetPath(routesDir: string, file: string, appDir: string) {\n const relative = toPosix(path.relative(routesDir, file));\n const withoutExt = relative.replace(/\\.(tsx|ts|jsx|js)$/, \"\");\n if (withoutExt === \"__root\" || withoutExt === \"routeTree.gen\") return null;\n\n const rawParts = withoutExt\n .split(\"/\")\n .flatMap((segment) => segment.split(\".\"))\n .filter((segment) => segment && !segment.startsWith(\"_\"));\n\n if (!rawParts.length) return null;\n const isIndex = rawParts[rawParts.length - 1] === \"index\";\n const routeParts = (isIndex ? rawParts.slice(0, -1) : rawParts).map(convertTanStackSegment);\n return path.join(appDir, ...routeParts, \"page.tsx\");\n}\n\nfunction convertTanStackSegment(segment: string) {\n if (segment === \"$\") return \"[...splat]\";\n if (segment.startsWith(\"$\")) return `[${segment.slice(1)}]`;\n return segment;\n}\n\nfunction transformTanStackContent(\n content: string,\n relativeFile: string,\n plan: FrameworkMigrationPlan,\n) {\n if (/Route\\.use[A-Z]/.test(content) || /useLoaderData|beforeLoad|loader:/.test(content)) {\n plan.manual.push(`Review ${toPosix(relativeFile)}; it uses TanStack route runtime APIs.`);\n }\n\n if (/export\\s+default\\s+/.test(content)) return content;\n\n const componentName = content.match(/component\\s*:\\s*([A-Za-z_$][\\w$]*)/)?.[1];\n if (!componentName) {\n plan.manual.push(\n `Add a default export to ${toPosix(relativeFile)}; no component: Identifier was found.`,\n );\n return content;\n }\n\n return `${content.trimEnd()}\n\nexport default ${componentName};\n`;\n}\n\nfunction createMigratedPackageJson(packageJson: any, source: FarmFrameworkMigrationSource) {\n const nextPackageJson = cloneJson(packageJson);\n const changes: string[] = [];\n nextPackageJson.scripts = nextPackageJson.scripts || {};\n\n const scriptReplacements =\n source === \"next\"\n ? [\n [\"dev\", \"farm dev\", /(^|\\s)next\\s+dev(\\s|$)/],\n [\"build\", \"farm build\", /(^|\\s)next\\s+build(\\s|$)/],\n [\"start\", \"node .output/server/index.mjs\", /(^|\\s)next\\s+start(\\s|$)/],\n ]\n : [\n [\"dev\", \"farm dev\", /(^|\\s)vite(\\s|$)|(^|\\s)vinxi\\s+dev(\\s|$)/],\n [\"build\", \"farm build\", /(^|\\s)vite\\s+build(\\s|$)|(^|\\s)vinxi\\s+build(\\s|$)/],\n ];\n\n for (const [name, value, matcher] of scriptReplacements as [string, string, RegExp][]) {\n const existing = nextPackageJson.scripts[name];\n if (!existing || matcher.test(existing)) {\n if (existing !== value) {\n nextPackageJson.scripts[name] = value;\n changes.push(`scripts.${name} -> ${value}`);\n }\n }\n }\n\n nextPackageJson.dependencies = nextPackageJson.dependencies || {};\n if (!nextPackageJson.dependencies[\"@farm.js/core\"]) {\n nextPackageJson.dependencies[\"@farm.js/core\"] = \"latest\";\n changes.push(\"dependencies.@farm.js/core -> latest\");\n }\n\n nextPackageJson.devDependencies = nextPackageJson.devDependencies || {};\n if (!nextPackageJson.devDependencies[\"@farm.js/cli\"]) {\n nextPackageJson.devDependencies[\"@farm.js/cli\"] = \"latest\";\n changes.push(\"devDependencies.@farm.js/cli -> latest\");\n }\n\n return { packageJson: nextPackageJson, changes };\n}\n\nasync function readPackageJson(root: string) {\n const packagePath = path.join(root, \"package.json\");\n if (!existsSync(packagePath)) return null;\n return JSON.parse(await readFile(packagePath, \"utf8\"));\n}\n\nfunction hasPackage(packageJson: any, packageName: string) {\n return Boolean(\n packageJson?.dependencies?.[packageName] ||\n packageJson?.devDependencies?.[packageName] ||\n packageJson?.peerDependencies?.[packageName],\n );\n}\n\nfunction cloneJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction unique(values: string[]) {\n return [...new Set(values)];\n}\n\nfunction toPosix(value: string) {\n return value.split(path.sep).join(\"/\");\n}\n","import { loadConfig, logger, resolveConfig } from \"@farm.js/core\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\ninterface FarmAuthInternalModule {\n migrateFarmAuth(): Promise<void>;\n}\n\nexport interface MigrateFarmAuthOptions {\n root?: string;\n configPath?: string;\n}\n\nexport async function migrateFarmAuth(options: MigrateFarmAuthOptions = {}): Promise<void> {\n const root = path.resolve(options.root || process.cwd());\n const userConfig = await loadConfig(root, options.configPath, \"production\");\n if (!userConfig) {\n throw new Error(`No farm.config file was found in ${root}.`);\n }\n\n const config = await resolveConfig({ ...userConfig, root }, \"production\");\n if (!config.auth.enabled) {\n throw new Error(\"Farm Auth is disabled. Add `auth: true` to farm.config.ts first.\");\n }\n\n const resolveFromApp = createRequire(path.join(root, \"package.json\"));\n let modulePath: string;\n try {\n modulePath = resolveFromApp.resolve(\"@farm.js/auth/internal\");\n } catch {\n throw new Error(\"Install @farm.js/auth before running `farm auth migrate`.\");\n }\n\n const runtime = (await import(\n /* @vite-ignore */ pathToFileURL(modulePath).href\n )) as FarmAuthInternalModule;\n\n logger.info(\"Applying the Farm Auth database schema...\");\n await runtime.migrateFarmAuth();\n logger.success(\"Farm Auth database is ready.\");\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type FarmUpgradeChannel = \"latest\" | \"beta\";\nexport type FarmPackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\nexport type FarmDependencySection =\n | \"dependencies\"\n | \"devDependencies\"\n | \"optionalDependencies\"\n | \"peerDependencies\";\n\nexport interface FarmUpgradePackage {\n name: string;\n current: string;\n target: string;\n section: FarmDependencySection;\n}\n\nexport interface FarmSkippedUpgradePackage {\n name: string;\n current: string;\n reason: string;\n section: FarmDependencySection;\n}\n\nexport interface FarmUpgradeCommand {\n command: FarmPackageManager;\n args: string[];\n cwd: string;\n}\n\nexport interface FarmUpgradePlan {\n root: string;\n packageJsonPath: string;\n packageManager: FarmPackageManager;\n channel: FarmUpgradeChannel;\n packages: FarmUpgradePackage[];\n skipped: FarmSkippedUpgradePackage[];\n commands: FarmUpgradeCommand[];\n}\n\nexport interface FarmUpgradeOptions {\n root?: string;\n channel: FarmUpgradeChannel;\n dryRun?: boolean;\n packageManager?: FarmPackageManager;\n runCommand?: FarmUpgradeCommandRunner;\n}\n\nexport interface FarmUpgradeResult {\n plan: FarmUpgradePlan;\n executed: boolean;\n}\n\nexport type FarmUpgradeCommandRunner = (command: FarmUpgradeCommand) => Promise<void>;\n\ntype ProjectPackageJson = {\n packageManager?: unknown;\n dependencies?: Record<string, unknown>;\n devDependencies?: Record<string, unknown>;\n optionalDependencies?: Record<string, unknown>;\n peerDependencies?: Record<string, unknown>;\n};\n\nconst DEPENDENCY_SECTIONS: readonly FarmDependencySection[] = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n];\nconst LOCAL_SPECIFIER_PREFIXES = [\"workspace:\", \"file:\", \"link:\", \"portal:\", \"catalog:\"] as const;\n\nexport async function createFarmUpgradePlan(options: FarmUpgradeOptions): Promise<FarmUpgradePlan> {\n assertUpgradeChannel(options.channel);\n\n const root = path.resolve(options.root || process.cwd());\n const packageJsonPath = path.join(root, \"package.json\");\n let packageJson: ProjectPackageJson;\n\n try {\n packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as ProjectPackageJson;\n } catch (error) {\n if (!existsSync(packageJsonPath)) {\n throw new Error(`No package.json found at ${packageJsonPath}.`);\n }\n throw new Error(`Could not read ${packageJsonPath}: ${formatError(error)}`);\n }\n\n const packageManager =\n options.packageManager || detectFarmPackageManager(root, packageJson.packageManager);\n const packages: FarmUpgradePackage[] = [];\n const skipped: FarmSkippedUpgradePackage[] = [];\n const seen = new Set<string>();\n\n for (const section of DEPENDENCY_SECTIONS) {\n const dependencies = packageJson[section];\n if (!dependencies || typeof dependencies !== \"object\") continue;\n\n for (const [name, rawSpecifier] of Object.entries(dependencies)) {\n if (!name.startsWith(\"@farm.js/\") || seen.has(name)) continue;\n seen.add(name);\n\n const current = typeof rawSpecifier === \"string\" ? rawSpecifier : String(rawSpecifier);\n if (isLocalSpecifier(current)) {\n skipped.push({\n name,\n current,\n section,\n reason: \"local workspace and file dependencies are not published-package upgrades\",\n });\n continue;\n }\n\n packages.push({\n name,\n current,\n section,\n target: `${name}@${options.channel}`,\n });\n }\n }\n\n if (packages.length === 0) {\n const suffix =\n skipped.length > 0\n ? \" The Farm packages in this project use local workspace or file references.\"\n : \"\";\n throw new Error(\n `No published @farm.js/* dependencies were found in ${packageJsonPath}.${suffix}`,\n );\n }\n\n packages.sort((left, right) => left.name.localeCompare(right.name));\n skipped.sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n root,\n packageJsonPath,\n packageManager,\n channel: options.channel,\n packages,\n skipped,\n commands: createUpgradeCommands(root, packageManager, packages),\n };\n}\n\nexport async function upgradeFarm(options: FarmUpgradeOptions): Promise<FarmUpgradeResult> {\n const plan = await createFarmUpgradePlan(options);\n if (options.dryRun) {\n return { plan, executed: false };\n }\n\n const runCommand = options.runCommand || runFarmUpgradeCommand;\n for (const command of plan.commands) {\n await runCommand(command);\n }\n\n return { plan, executed: true };\n}\n\nexport function formatFarmUpgradePlan(plan: FarmUpgradePlan): string {\n const release = plan.channel === \"latest\" ? \"latest stable\" : \"latest beta\";\n const lines = [\n `Farm upgrade: ${release}`,\n `Project: ${plan.root}`,\n `Package manager: ${plan.packageManager}`,\n \"Packages:\",\n ];\n\n for (const entry of plan.packages) {\n lines.push(` ${entry.name} (${entry.section}): ${entry.current} -> ${plan.channel}`);\n }\n\n if (plan.skipped.length > 0) {\n lines.push(\"Skipped local packages:\");\n for (const entry of plan.skipped) {\n lines.push(` ${entry.name} (${entry.current})`);\n }\n }\n\n lines.push(\"Commands:\");\n for (const command of plan.commands) {\n lines.push(` ${command.command} ${command.args.join(\" \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function detectFarmPackageManager(\n root: string,\n packageManagerField?: unknown,\n): FarmPackageManager {\n if (typeof packageManagerField === \"string\") {\n const name = packageManagerField.split(\"@\", 1)[0];\n if (isFarmPackageManager(name)) return name;\n }\n\n const lockfileCandidates: Array<[FarmPackageManager, string[]]> = [\n [\"pnpm\", [\"pnpm-lock.yaml\"]],\n [\"yarn\", [\"yarn.lock\"]],\n [\"bun\", [\"bun.lock\", \"bun.lockb\"]],\n [\"npm\", [\"package-lock.json\", \"npm-shrinkwrap.json\"]],\n ];\n\n for (const [packageManager, lockfiles] of lockfileCandidates) {\n if (lockfiles.some((lockfile) => existsSync(path.join(root, lockfile)))) {\n return packageManager;\n }\n }\n\n return \"npm\";\n}\n\nfunction createUpgradeCommands(\n root: string,\n packageManager: FarmPackageManager,\n packages: FarmUpgradePackage[],\n): FarmUpgradeCommand[] {\n const command = packageManager === \"npm\" ? \"install\" : \"add\";\n\n return DEPENDENCY_SECTIONS.flatMap((section) => {\n const targets = packages\n .filter((entry) => entry.section === section)\n .map((entry) => entry.target);\n if (targets.length === 0) return [];\n\n return [\n {\n command: packageManager,\n args: [command, ...getDependencySectionFlags(packageManager, section), ...targets],\n cwd: root,\n },\n ];\n });\n}\n\nfunction getDependencySectionFlags(\n packageManager: FarmPackageManager,\n section: FarmDependencySection,\n): string[] {\n if (section === \"dependencies\") return [];\n\n if (packageManager === \"yarn\" || packageManager === \"bun\") {\n if (section === \"devDependencies\") return [\"--dev\"];\n if (section === \"optionalDependencies\") return [\"--optional\"];\n return [\"--peer\"];\n }\n\n if (section === \"devDependencies\") return [\"--save-dev\"];\n if (section === \"optionalDependencies\") return [\"--save-optional\"];\n return [\"--save-peer\"];\n}\n\nfunction runFarmUpgradeCommand(command: FarmUpgradeCommand): Promise<void> {\n return new Promise((resolve, reject) => {\n const executable = process.platform === \"win32\" ? `${command.command}.cmd` : command.command;\n const child = spawn(executable, command.args, {\n cwd: command.cwd,\n env: process.env,\n stdio: \"inherit\",\n });\n\n child.on(\"error\", reject);\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n const termination = signal ? `signal ${signal}` : `exit code ${code ?? \"unknown\"}`;\n reject(new Error(`${command.command} ${command.args.join(\" \")} failed with ${termination}.`));\n });\n });\n}\n\nfunction isLocalSpecifier(specifier: string): boolean {\n return LOCAL_SPECIFIER_PREFIXES.some((prefix) => specifier.startsWith(prefix));\n}\n\nfunction isFarmPackageManager(value: string): value is FarmPackageManager {\n return value === \"npm\" || value === \"pnpm\" || value === \"yarn\" || value === \"bun\";\n}\n\nfunction assertUpgradeChannel(channel: FarmUpgradeChannel): void {\n if (channel !== \"latest\" && channel !== \"beta\") {\n throw new Error('Farm upgrade channel must be \"latest\" or \"beta\".');\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["existsSync","path","formatCommand","readFileSync","sanitizePreviewName","randomPreviewName","normalizePreviewDomain","delay","delay","escapeRegExp","ROUTE_EXTENSIONS","formatError","formatCount","formatError"],"sources":["../src/deploy.ts","../src/preview-gateway.ts","../src/preview-native.ts","../src/preview.ts","../src/generate.ts","../src/doctor.ts","../src/explain.ts","../src/cron.ts","../src/migrate.ts","../src/auth.ts","../src/upgrade.ts"],"sourcesContent":["import { execFileSync } from \"child_process\";\nimport { existsSync, readFileSync } from \"fs\";\nimport path from \"path\";\nimport {\n getPresetForDeployTarget,\n getFarmPresetRuntime,\n loadConfig,\n logger,\n normalizeDeployTarget,\n resolveConfig,\n resolveDeployConfig,\n resolveDeployOutputPath,\n} from \"@farm.js/core\";\nimport { buildFarm } from \"./build\";\n\nexport interface DeployFarmOptions {\n root?: string;\n vercel?: boolean;\n cloudflare?: boolean;\n netlify?: boolean;\n prod?: boolean;\n /** Print the resolved build and deployment operations without executing them. */\n plan?: boolean;\n}\n\nexport type FarmDeployErrorCode =\n | \"CLI_NOT_INSTALLED\"\n | \"CLI_NOT_AUTHENTICATED\"\n | \"INVALID_BUILD_OUTPUT\"\n | \"DEPLOY_FAILED\";\n\nexport class FarmDeployError extends Error {\n readonly code: FarmDeployErrorCode;\n readonly platform: FarmDeployPlan[\"target\"];\n readonly cause?: unknown;\n\n constructor(\n code: FarmDeployErrorCode,\n platform: FarmDeployPlan[\"target\"],\n message: string,\n options?: { cause?: unknown },\n ) {\n super(message);\n this.name = \"FarmDeployError\";\n this.code = code;\n this.platform = platform;\n this.cause = options?.cause;\n }\n}\n\nexport interface FarmDeployPlan {\n root: string;\n target: \"vercel\" | \"cloudflare\" | \"netlify\";\n preset: string;\n runtime: \"node\" | \"edge\" | \"unknown\";\n outputDir: string;\n production: boolean;\n build: { command: string; cwd: string };\n deploy: FarmDeployCommand;\n cloudflareAgent?: CloudflareAgentDeployPlan;\n}\n\nexport interface FarmDeployCommand {\n command: string;\n cwd: string;\n executable: string;\n args: string[];\n}\n\nexport interface CloudflareAgentDeployPlan {\n configPath: string;\n environment?: string;\n /** The integration will create this config as part of the production build. */\n generated?: boolean;\n}\n\n/**\n * Deploy Farm.js application\n */\nexport async function deployFarm(options: DeployFarmOptions = {}) {\n const { plan, deployConfig } = await resolveFarmDeployContext(options);\n\n if (options.plan) {\n logger.info(formatFarmDeployPlan(plan));\n return plan;\n }\n\n logger.info(`🚀 Building with ${plan.preset} preset...`);\n await buildFarm({ root: plan.root, preset: plan.preset });\n\n if (!existsSync(plan.outputDir)) {\n throw new FarmDeployError(\n \"INVALID_BUILD_OUTPUT\",\n plan.target,\n `Build output not found at ${plan.outputDir}. Please run 'farm build' first.`,\n );\n }\n\n await deployPlatform(plan.target, plan.root, plan.outputDir, deployConfig, options.prod);\n return plan;\n}\n\nexport async function createFarmDeployPlan(\n options: DeployFarmOptions = {},\n): Promise<FarmDeployPlan> {\n return (await resolveFarmDeployContext(options)).plan;\n}\n\nexport function formatFarmDeployPlan(plan: FarmDeployPlan): string {\n return [\n \"FARM / DEPLOY PLAN\",\n \"\",\n `Target: ${plan.target}`,\n `Preset: ${plan.preset}`,\n `Runtime: ${plan.runtime}`,\n `Output: ${plan.outputDir}`,\n `Production: ${plan.production ? \"yes\" : \"no\"}`,\n \"\",\n `1. ${plan.build.command}`,\n ` cwd: ${plan.build.cwd}`,\n `2. ${plan.deploy.command}`,\n ` cwd: ${plan.deploy.cwd}`,\n ...(plan.cloudflareAgent\n ? [\n \"\",\n `Cloudflare Agent config: ${plan.cloudflareAgent.configPath}${plan.cloudflareAgent.generated ? \" (generated during build)\" : \"\"}`,\n ]\n : []),\n ].join(\"\\n\");\n}\n\nasync function resolveFarmDeployContext(options: DeployFarmOptions) {\n const root = path.resolve(options.root || process.cwd());\n const mode = \"production\";\n const userConfig = await loadConfig(root, undefined, mode);\n const config = await resolveConfig({ root, ...userConfig }, mode);\n\n // Determine platform and preset\n const cliTarget = options.vercel\n ? \"vercel\"\n : options.cloudflare\n ? \"cloudflare\"\n : options.netlify\n ? \"netlify\"\n : undefined;\n const platform = normalizeDeployTarget(cliTarget || config.deploy.target);\n\n if (platform !== \"vercel\" && platform !== \"cloudflare\" && platform !== \"netlify\") {\n throw new Error(\n \"Please specify a deployment target with --vercel, --cloudflare, --netlify, or farm.config deploy.target.\",\n );\n }\n\n const deployConfig = resolveDeployConfig(userConfig || {}, {\n target: platform,\n preset: cliTarget\n ? userConfig?.deploy?.preset || userConfig?.preset || getPresetForDeployTarget(platform)\n : undefined,\n });\n const preset = deployConfig.preset || getPresetForDeployTarget(platform) || \"node-server\";\n const nitroOutput = resolveDeployOutputPath(root, deployConfig.outputDir);\n const cloudflareAgent =\n platform === \"cloudflare\"\n ? resolveCloudflareAgentDeployPlan(root) ||\n resolveConfiguredCloudflareAgentDeployPlan(root, config.integrations)\n : undefined;\n const deploy = createDeployCommand(\n platform,\n root,\n nitroOutput,\n deployConfig,\n options.prod,\n cloudflareAgent,\n );\n const plan: FarmDeployPlan = {\n root: path.resolve(root),\n target: platform,\n preset,\n runtime: getFarmPresetRuntime(preset),\n outputDir: nitroOutput,\n production: platform === \"netlify\" || Boolean(options.prod),\n build: {\n command: `farm build --preset ${preset}`,\n cwd: path.resolve(root),\n },\n deploy,\n ...(cloudflareAgent ? { cloudflareAgent } : {}),\n };\n\n return { plan, deployConfig };\n}\n\nfunction createDeployCommand(\n platform: FarmDeployPlan[\"target\"],\n root: string,\n outputDir: string,\n deployConfig: ReturnType<typeof resolveDeployConfig>,\n prod: boolean | undefined,\n cloudflareAgent: CloudflareAgentDeployPlan | undefined,\n): FarmDeployPlan[\"deploy\"] {\n if (platform === \"vercel\") {\n const args = [\"deploy\", \"--prebuilt\", \"--yes\", ...(prod ? [\"--prod\"] : [])];\n return {\n command: formatCommand(\"vercel\", args),\n cwd: path.resolve(root),\n executable: \"vercel\",\n args,\n };\n }\n if (platform === \"netlify\") {\n const args = createNetlifyDeployArgs(deployConfig.netlify?.site);\n return {\n command: formatCommand(\"netlify\", args),\n cwd: outputDir,\n executable: \"netlify\",\n args,\n };\n }\n if (cloudflareAgent) {\n const args = [\n \"deploy\",\n \"--config\",\n cloudflareAgent.configPath,\n ...(cloudflareAgent.environment ? [\"--env\", cloudflareAgent.environment] : []),\n ];\n return {\n command: formatCommand(\"wrangler\", args),\n cwd: path.resolve(root),\n executable: \"wrangler\",\n args,\n };\n }\n const projectName =\n deployConfig.cloudflare?.projectName || deployConfig.projectName || \"farm-app\";\n const args = [\"pages\", \"deploy\", \".\", `--project-name=${projectName}`];\n return {\n command: formatCommand(\"wrangler\", args),\n cwd: outputDir,\n executable: \"wrangler\",\n args,\n };\n}\n\nfunction createNetlifyDeployArgs(site?: string): string[] {\n return [\"deploy\", \"--prod\", \"--dir=.\", ...(site ? [`--site=${site}`] : [])];\n}\n\n/**\n * Deploy using platform's native CLI (user credentials)\n */\nasync function deployPlatform(\n platform: \"vercel\" | \"cloudflare\" | \"netlify\",\n root: string,\n outputDir: string,\n deployConfig: ReturnType<typeof resolveDeployConfig>,\n prod?: boolean,\n) {\n switch (platform) {\n case \"vercel\":\n await deployVercel(root, outputDir, prod);\n break;\n case \"cloudflare\":\n await deployCloudflare(\n root,\n outputDir,\n deployConfig.cloudflare?.projectName || deployConfig.projectName,\n );\n break;\n case \"netlify\":\n await deployNetlify(root, outputDir, deployConfig.netlify?.site);\n break;\n }\n}\n\n/**\n * Deploy to Vercel using Vercel CLI\n */\nasync function deployVercel(root: string, outputDir: string, prod?: boolean) {\n logger.info(\"🚀 Deploying to Vercel...\");\n\n try {\n execFileSync(\"vercel\", [\"--version\"], { stdio: \"ignore\", cwd: root });\n } catch (error) {\n throw new FarmDeployError(\n \"CLI_NOT_INSTALLED\",\n \"vercel\",\n \"Vercel CLI is not installed. Install it with: npm i -g vercel\",\n { cause: error },\n );\n }\n\n try {\n execFileSync(\"vercel\", [\"whoami\"], { stdio: \"ignore\", cwd: root });\n } catch (error) {\n throw new FarmDeployError(\n \"CLI_NOT_AUTHENTICATED\",\n \"vercel\",\n \"Vercel CLI is not authenticated. Run 'vercel login', then retry the deployment.\",\n { cause: error },\n );\n }\n\n try {\n // For Nitro Vercel preset, deploy from the output directory\n // Vercel will detect the serverless functions automatically\n // According to https://nitro.build/deploy/providers/vercel\n\n // Verify output structure before deploying\n const fs = await import(\"fs\");\n const { existsSync, statSync, readdirSync } = fs;\n\n // Vercel Build Output API v3 expects:\n // - functions/__nitro.func/ for serverless functions\n // - static/ for static files\n const functionsDir = path.join(outputDir, \"functions\", \"__nitro.func\");\n const staticDir = path.join(outputDir, \"static\");\n const configFile = path.join(outputDir, \"config.json\");\n const serverIndex = path.join(functionsDir, \"index.mjs\");\n\n logger.info(\"🔍 Verifying deployment structure...\");\n\n // Check functions directory\n if (!existsSync(functionsDir)) {\n throw new FarmDeployError(\n \"INVALID_BUILD_OUTPUT\",\n \"vercel\",\n `Functions directory not found at ${functionsDir}.`,\n );\n }\n if (!existsSync(serverIndex)) {\n throw new FarmDeployError(\n \"INVALID_BUILD_OUTPUT\",\n \"vercel\",\n `Server entry point not found at ${serverIndex}.`,\n );\n }\n logger.info(`✅ Functions directory: ${functionsDir}`);\n\n // Check static directory\n if (!existsSync(staticDir)) {\n logger.warn(`⚠️ Static directory not found at ${staticDir}`);\n } else {\n // Count files recursively\n const countFiles = (dir: string): number => {\n let count = 0;\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n count += countFiles(fullPath);\n } else {\n count++;\n }\n }\n } catch {\n // Ignore errors\n }\n return count;\n };\n\n const fileCount = countFiles(staticDir);\n logger.info(`✅ Static directory: ${staticDir} (${fileCount} files)`);\n\n // List important files (farm-client.js = main client bundle; assets/ optional)\n const importantFiles = [\"farm-client-manifest.json\", \"farm-client.js\", \"assets\"];\n for (const file of importantFiles) {\n const filePath = path.join(staticDir, file);\n if (existsSync(filePath)) {\n logger.info(` ✓ ${file}`);\n } else {\n logger.warn(` ✗ ${file} (missing)`);\n }\n }\n\n if (fileCount === 0) {\n logger.warn(\"⚠️ Static directory is empty - static assets may not be served\");\n }\n }\n\n // Check config\n if (!existsSync(configFile)) {\n logger.warn(`⚠️ Config file not found at ${configFile}`);\n } else {\n logger.info(`✅ Config file: ${configFile}`);\n // Verify config has routing rules\n try {\n const config = JSON.parse(require(\"fs\").readFileSync(configFile, \"utf-8\"));\n if (config.routes && config.routes.length > 0) {\n logger.info(` ✓ Routing rules: ${config.routes.length} rules configured`);\n }\n } catch {\n logger.warn(\" ⚠️ Could not parse config.json\");\n }\n }\n\n // Calculate directory sizes\n const calculateDirSize = (dirPath: string): number => {\n if (!existsSync(dirPath)) return 0;\n let totalSize = 0;\n try {\n const entries = readdirSync(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n if (entry.isFile()) {\n totalSize += statSync(fullPath).size;\n } else if (entry.isDirectory()) {\n totalSize += calculateDirSize(fullPath);\n }\n }\n } catch {\n // Ignore errors\n }\n return totalSize;\n };\n\n const functionsSize = calculateDirSize(functionsDir);\n const staticSize = calculateDirSize(staticDir);\n logger.info(\n `📦 Deployment size: Functions ${(functionsSize / 1024 / 1024).toFixed(2)}MB, Static ${(staticSize / 1024).toFixed(1)}KB`,\n );\n\n // Verify critical files (farm-client.js or assets/ both valid for client bundle)\n logger.info(\"🔍 Verifying critical files:\");\n const criticalFiles = [\n { path: serverIndex, name: \"Server entry point\" },\n { path: path.join(functionsDir, \"package.json\"), name: \"Function package.json\" },\n { path: path.join(functionsDir, \".vc-config.json\"), name: \"Vercel config\" },\n { path: path.join(staticDir, \"farm-client-manifest.json\"), name: \"Client manifest\" },\n ];\n\n for (const file of criticalFiles) {\n if (existsSync(file.path)) {\n logger.info(` ✅ ${file.name}`);\n } else {\n logger.warn(` ⚠️ ${file.name} (missing)`);\n }\n }\n\n const hasClientAssets =\n existsSync(path.join(staticDir, \"farm-client.js\")) ||\n existsSync(path.join(staticDir, \"assets\"));\n if (hasClientAssets) {\n logger.info(\" ✅ Client assets (farm-client.js or assets/)\");\n } else {\n logger.warn(\" ⚠️ Client assets directory (missing)\");\n }\n\n logger.info(\"🚀 Deploying to Vercel...\");\n logger.info(` Deploying from: ${root}`);\n logger.info(` Functions: ${functionsDir}`);\n logger.info(` Static: ${staticDir}`);\n logger.info(` Config: ${configFile}`);\n\n // For Vercel Build Output API v3, we need to deploy from the project root\n // with the --prebuilt flag to tell Vercel to use the .vercel/output directory\n // See: https://vercel.com/docs/build-output-api/v3\n\n logger.info(\"📤 Uploading to Vercel...\");\n\n // Deploy using --prebuilt flag so Vercel uses our build (required for monorepos;\n // building on Vercel would run pnpm install in the example folder and fail on workspace deps)\n execFileSync(\"vercel\", [\"deploy\", \"--prebuilt\", \"--yes\", ...(prod ? [\"--prod\"] : [])], {\n stdio: \"inherit\",\n cwd: root,\n });\n\n logger.success(\"✅ Deployed to Vercel successfully!\");\n } catch (error: unknown) {\n if (error instanceof FarmDeployError) throw error;\n throw new FarmDeployError(\n \"DEPLOY_FAILED\",\n \"vercel\",\n `Failed to deploy to Vercel: ${getErrorMessage(error)}`,\n { cause: error },\n );\n }\n}\n\n/** Deploy to a composed Worker or fall back to Cloudflare Pages. */\nasync function deployCloudflare(root: string, outputDir: string, projectName?: string) {\n const agentPlan = resolveCloudflareAgentDeployPlan(root);\n if (agentPlan) {\n logger.info(\"🚀 Deploying Farm and Cloudflare Agents as one Worker...\");\n assertWranglerInstalled(root);\n\n try {\n execFileSync(\n \"wrangler\",\n [\n \"deploy\",\n \"--config\",\n agentPlan.configPath,\n ...(agentPlan.environment ? [\"--env\", agentPlan.environment] : []),\n ],\n {\n stdio: \"inherit\",\n cwd: root,\n },\n );\n logger.success(\"✅ Deployed Farm and Cloudflare Agents successfully!\");\n } catch (error: unknown) {\n throw new FarmDeployError(\n \"DEPLOY_FAILED\",\n \"cloudflare\",\n `Failed to deploy to Cloudflare: ${getErrorMessage(error)}`,\n { cause: error },\n );\n }\n return;\n }\n\n logger.info(\"🚀 Deploying to Cloudflare Pages...\");\n\n assertWranglerInstalled(root);\n\n try {\n execFileSync(\n \"wrangler\",\n [\"pages\", \"deploy\", \".\", `--project-name=${projectName || \"farm-app\"}`],\n {\n stdio: \"inherit\",\n cwd: outputDir,\n },\n );\n logger.success(\"✅ Deployed to Cloudflare Pages successfully!\");\n } catch (error: unknown) {\n throw new FarmDeployError(\n \"DEPLOY_FAILED\",\n \"cloudflare\",\n `Failed to deploy to Cloudflare: ${getErrorMessage(error)}`,\n { cause: error },\n );\n }\n}\n\n/** Read the trusted Workers deployment handoff emitted by @farm.js/cf-agent. */\nexport function resolveCloudflareAgentDeployPlan(\n root: string,\n): CloudflareAgentDeployPlan | undefined {\n const projectRoot = path.resolve(root);\n const metadataPath = path.join(projectRoot, \".farm\", \"cf-agent\", \"deploy.json\");\n if (!existsSync(metadataPath)) return undefined;\n\n let metadata: unknown;\n try {\n metadata = JSON.parse(readFileSync(metadataPath, \"utf8\"));\n } catch {\n throw new Error(`Invalid Cloudflare Agents deployment metadata at ${metadataPath}.`);\n }\n\n if (\n !isRecord(metadata) ||\n metadata.version !== 1 ||\n metadata.provider !== \"cloudflare-agents\" ||\n typeof metadata.config !== \"string\" ||\n !metadata.config.trim()\n ) {\n throw new Error(`Invalid Cloudflare Agents deployment metadata at ${metadataPath}.`);\n }\n\n const configPath = path.resolve(projectRoot, metadata.config);\n const relativeConfigPath = path.relative(projectRoot, configPath);\n if (\n relativeConfigPath === \"..\" ||\n relativeConfigPath.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relativeConfigPath)\n ) {\n throw new Error(\"Cloudflare Agents deployment config must stay inside the Farm project root.\");\n }\n if (!existsSync(configPath)) {\n throw new Error(`Cloudflare Agents deployment config was not found at ${configPath}.`);\n }\n\n const environment = metadata.environment;\n if (environment !== undefined && (typeof environment !== \"string\" || !environment.trim())) {\n throw new Error(\"Cloudflare Agents deployment environment must be a non-empty string.\");\n }\n\n return {\n configPath,\n ...(typeof environment === \"string\" ? { environment: environment.trim() } : {}),\n };\n}\n\nfunction resolveConfiguredCloudflareAgentDeployPlan(\n root: string,\n integrations: Record<string, unknown> | undefined,\n): CloudflareAgentDeployPlan | undefined {\n const integration = Object.values(integrations || {}).find(\n (value) =>\n isRecord(value) &&\n value.category === \"agent\" &&\n value.type === \"cloudflare\" &&\n value.serverRuntime === false,\n );\n if (!isRecord(integration) || !isRecord(integration.instance)) return undefined;\n\n const configuredPath = integration.instance.config;\n if (typeof configuredPath !== \"string\" || !configuredPath.trim()) return undefined;\n\n const projectRoot = path.resolve(root);\n const sourceConfigPath = path.resolve(projectRoot, configuredPath);\n assertPathInsideProject(projectRoot, sourceConfigPath, \"Cloudflare Agents source config\");\n const configPath = path.join(path.dirname(sourceConfigPath), \".farm-cf-agent.wrangler.jsonc\");\n const environment = integration.instance.environment;\n\n return {\n configPath,\n ...(typeof environment === \"string\" && environment.trim()\n ? { environment: environment.trim() }\n : {}),\n generated: true,\n };\n}\n\nfunction assertPathInsideProject(projectRoot: string, candidate: string, label: string): void {\n const relativePath = path.relative(projectRoot, candidate);\n if (\n relativePath === \"..\" ||\n relativePath.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relativePath)\n ) {\n throw new Error(`${label} must stay inside the Farm project root.`);\n }\n}\n\nfunction assertWranglerInstalled(root: string): void {\n try {\n execFileSync(\"wrangler\", [\"--version\"], { stdio: \"ignore\", cwd: root });\n } catch (error) {\n throw new FarmDeployError(\n \"CLI_NOT_INSTALLED\",\n \"cloudflare\",\n \"Wrangler CLI is not installed. Install it in this project with: npm i -D wrangler\",\n { cause: error },\n );\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/**\n * Deploy to Netlify using Netlify CLI\n */\nasync function deployNetlify(root: string, outputDir: string, site?: string) {\n logger.info(\"🚀 Deploying to Netlify...\");\n\n // Check if Netlify CLI is installed\n try {\n execFileSync(\"netlify\", [\"--version\"], { stdio: \"ignore\", cwd: root });\n } catch (error) {\n throw new FarmDeployError(\n \"CLI_NOT_INSTALLED\",\n \"netlify\",\n \"Netlify CLI is not installed. Install it with: npm i -g netlify-cli\",\n { cause: error },\n );\n }\n\n try {\n execFileSync(\"netlify\", createNetlifyDeployArgs(site), {\n stdio: \"inherit\",\n cwd: outputDir,\n });\n logger.success(\"✅ Deployed to Netlify successfully!\");\n } catch (error: unknown) {\n throw new FarmDeployError(\n \"DEPLOY_FAILED\",\n \"netlify\",\n `Failed to deploy to Netlify: ${getErrorMessage(error)}`,\n { cause: error },\n );\n }\n}\n\nfunction formatCommand(executable: string, args: string[]): string {\n return [executable, ...args].map(formatCommandArgument).join(\" \");\n}\n\nfunction formatCommandArgument(argument: string): string {\n if (/^[A-Za-z0-9_./:=@+-]+$/.test(argument)) return argument;\n return `'${argument.replace(/'/g, `'\"'\"'`)}'`;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { setTimeout as delay } from \"node:timers/promises\";\nimport { logger } from \"@farm.js/core\";\nimport type { PreviewFarmOptions, PreviewTarget } from \"./preview\";\n\nexport interface PreviewGatewayPlan {\n provider: \"farm-gateway\";\n gatewayUrl: string;\n relayUrl: string;\n target: PreviewTarget;\n requestedName: string;\n requestedHostname: string;\n requestedPublicUrl: string;\n}\n\nexport interface PreviewGatewaySession {\n id: string;\n name: string;\n token: string;\n publicUrl: string;\n expiresAt?: number;\n}\n\nexport interface PreviewGatewayRequest {\n id: string;\n method: string;\n path: string;\n headers?: Record<string, string>;\n body?: string | null;\n encoding?: \"base64\";\n}\n\nexport interface PreviewGatewayResponse {\n status: number;\n headers?: Record<string, string>;\n body?: string | null;\n encoding?: \"base64\";\n}\n\nexport interface RunPreviewGatewayOptions {\n timeoutMs?: number;\n pollTimeoutMs?: number;\n localProbeIntervalMs?: number;\n localProbeTimeoutMs?: number;\n maxRequests?: number;\n maxConcurrentRequests?: number;\n}\n\nconst DEFAULT_GATEWAY_URL = \"https://preview.farming-labs.dev\";\nconst DEFAULT_PREVIEW_DOMAIN = \"preview.farming-labs.dev\";\nconst DEFAULT_POLL_TIMEOUT_MS = 15000;\nconst DEFAULT_LOCAL_PROBE_INTERVAL_MS = 2000;\nconst DEFAULT_LOCAL_PROBE_TIMEOUT_MS = 1000;\nconst DEFAULT_MAX_CONCURRENT_REQUESTS = 25;\nconst HOP_BY_HOP_HEADERS = new Set([\n \"connection\",\n \"content-length\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n]);\n\nexport function createPreviewGatewayPlan(\n target: PreviewTarget,\n options: Pick<PreviewFarmOptions, \"gatewayUrl\" | \"name\"> = {},\n): PreviewGatewayPlan {\n const requestedName =\n sanitizePreviewName(options.name || process.env.FARM_PREVIEW_NAME) || randomPreviewName();\n const gatewayUrl = normalizeGatewayUrl(\n options.gatewayUrl || process.env.FARM_PREVIEW_GATEWAY_URL || DEFAULT_GATEWAY_URL,\n );\n const relayUrl = normalizeRelayUrl(process.env.FARM_PREVIEW_RELAY_URL || gatewayUrl);\n const domain = normalizePreviewDomain(process.env.FARM_PREVIEW_DOMAIN || DEFAULT_PREVIEW_DOMAIN);\n const requestedHostname = `${requestedName}.${domain}`;\n\n return {\n provider: \"farm-gateway\",\n gatewayUrl,\n relayUrl,\n target,\n requestedName,\n requestedHostname,\n requestedPublicUrl: `https://${requestedHostname}`,\n };\n}\n\nexport async function runPreviewGateway(\n plan: PreviewGatewayPlan,\n options: RunPreviewGatewayOptions = {},\n): Promise<PreviewGatewaySession> {\n const session = await createGatewaySession(plan, options.timeoutMs ?? 30000);\n const controller = new AbortController();\n let handledRequests = 0;\n const inFlightRequests = new Set<Promise<void>>();\n const maxConcurrentRequests = Math.max(\n 1,\n options.maxConcurrentRequests ?? DEFAULT_MAX_CONCURRENT_REQUESTS,\n );\n const localTargetWatch = watchLocalPreviewTarget(plan.target, controller, {\n intervalMs: options.localProbeIntervalMs ?? DEFAULT_LOCAL_PROBE_INTERVAL_MS,\n timeoutMs: options.localProbeTimeoutMs ?? DEFAULT_LOCAL_PROBE_TIMEOUT_MS,\n });\n\n const cleanup = () => controller.abort();\n process.once(\"SIGINT\", cleanup);\n process.once(\"SIGTERM\", cleanup);\n\n logger.success(\"Preview URL ready.\");\n logger.info(`Public: ${session.publicUrl}`);\n logger.info(\"Forwarding requests until Ctrl+C. Remote traffic will be logged below.\");\n\n const waitForAvailableRequestSlot = async () => {\n while (!controller.signal.aborted && inFlightRequests.size >= maxConcurrentRequests) {\n await Promise.race(inFlightRequests);\n }\n };\n\n const handleRequest = async (request: PreviewGatewayRequest) => {\n const startedAt = Date.now();\n\n try {\n const response = await forwardGatewayRequest(plan.target, request);\n await sendGatewayResponse(plan, session, request.id, response, controller.signal);\n handledRequests += 1;\n logger.info(\n `${request.method.toUpperCase()} ${formatRequestPath(request.path)} -> ${response.status} ${Date.now() - startedAt}ms`,\n );\n } catch (error) {\n if (controller.signal.aborted) return;\n logger.warn(\n `Local preview target ${plan.target.localUrl} is no longer reachable. Closing preview session.`,\n );\n controller.abort(error);\n }\n };\n\n try {\n while (!controller.signal.aborted) {\n await waitForAvailableRequestSlot();\n if (controller.signal.aborted) break;\n\n const requests = await pollGatewayRequests(plan, session, {\n signal: controller.signal,\n pollTimeoutMs: options.pollTimeoutMs ?? DEFAULT_POLL_TIMEOUT_MS,\n });\n\n for (const request of requests) {\n await waitForAvailableRequestSlot();\n if (controller.signal.aborted) break;\n\n const promise = handleRequest(request);\n inFlightRequests.add(promise);\n promise.finally(() => inFlightRequests.delete(promise));\n }\n\n if (options.maxRequests && handledRequests >= options.maxRequests) {\n break;\n }\n }\n } finally {\n process.removeListener(\"SIGINT\", cleanup);\n process.removeListener(\"SIGTERM\", cleanup);\n controller.abort();\n await Promise.allSettled(inFlightRequests);\n await localTargetWatch.catch(() => undefined);\n await closeGatewaySession(plan, session).catch(() => undefined);\n }\n\n return session;\n}\n\nasync function watchLocalPreviewTarget(\n target: PreviewTarget,\n controller: AbortController,\n options: { intervalMs: number; timeoutMs: number },\n) {\n while (!controller.signal.aborted) {\n try {\n await delay(options.intervalMs, undefined, { signal: controller.signal });\n } catch {\n return;\n }\n\n if (controller.signal.aborted) return;\n\n const reachable = await isLocalPreviewTargetReachable(target.localUrl, options.timeoutMs);\n if (!reachable && !controller.signal.aborted) {\n logger.warn(\n `Local preview target ${target.localUrl} is no longer reachable. Closing preview session.`,\n );\n controller.abort(new Error(\"Local preview target is no longer reachable.\"));\n return;\n }\n }\n}\n\nasync function isLocalPreviewTargetReachable(url: string, timeoutMs: number) {\n const signal = AbortSignal.timeout(timeoutMs);\n\n try {\n await fetch(url, {\n method: \"GET\",\n signal,\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function createGatewaySession(\n plan: PreviewGatewayPlan,\n timeoutMs: number,\n): Promise<PreviewGatewaySession> {\n const response = await fetch(`${plan.gatewayUrl}/api/sessions`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n name: plan.requestedName,\n hostname: plan.requestedHostname,\n localUrl: plan.target.localUrl,\n }),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!response.ok) {\n throw new Error(\n `Preview gateway rejected the session (${response.status}): ${await response.text()}`,\n );\n }\n\n const session = (await response.json()) as PreviewGatewaySession;\n if (!session.id || !session.token || !session.publicUrl) {\n throw new Error(\"Preview gateway returned an invalid session.\");\n }\n\n return session;\n}\n\nexport async function forwardGatewayRequest(\n target: PreviewTarget,\n request: PreviewGatewayRequest,\n): Promise<PreviewGatewayResponse> {\n const headers = new Headers();\n for (const [key, value] of Object.entries(request.headers || {})) {\n const normalized = key.toLowerCase();\n if (HOP_BY_HOP_HEADERS.has(normalized) || normalized.startsWith(\"sec-websocket-\")) {\n continue;\n }\n headers.set(key, value);\n }\n\n headers.set(\"x-farm-preview\", \"1\");\n\n const method = request.method.toUpperCase();\n const hasBody = method !== \"GET\" && method !== \"HEAD\" && Boolean(request.body);\n const response = await fetch(`${target.localUrl}${request.path}`, {\n method,\n headers,\n body: hasBody\n ? Buffer.from(request.body || \"\", request.encoding === \"base64\" ? \"base64\" : \"utf8\")\n : undefined,\n });\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n const normalized = key.toLowerCase();\n if (!HOP_BY_HOP_HEADERS.has(normalized)) {\n responseHeaders[key] = value;\n }\n });\n\n return {\n status: response.status,\n headers: responseHeaders,\n body: Buffer.from(await response.arrayBuffer()).toString(\"base64\"),\n encoding: \"base64\",\n };\n}\n\nasync function pollGatewayRequests(\n plan: PreviewGatewayPlan,\n session: PreviewGatewaySession,\n options: { signal: AbortSignal; pollTimeoutMs: number },\n) {\n try {\n const response = await fetch(\n `${plan.gatewayUrl}/api/sessions/${session.id}/requests?token=${encodeURIComponent(\n session.token,\n )}&wait=${options.pollTimeoutMs}`,\n {\n headers: {\n accept: \"application/json\",\n },\n signal: options.signal,\n },\n );\n\n if (response.status === 204) {\n return [];\n }\n if (!response.ok) {\n throw new Error(`Preview gateway poll failed (${response.status}): ${await response.text()}`);\n }\n\n const data = (await response.json()) as { requests?: PreviewGatewayRequest[] };\n return data.requests || [];\n } catch (error) {\n if (options.signal.aborted) return [];\n throw error;\n }\n}\n\nasync function sendGatewayResponse(\n plan: PreviewGatewayPlan,\n session: PreviewGatewaySession,\n requestId: string,\n responseBody: PreviewGatewayResponse,\n signal: AbortSignal,\n) {\n const response = await fetch(\n `${plan.gatewayUrl}/api/sessions/${session.id}/responses/${requestId}?token=${encodeURIComponent(\n session.token,\n )}`,\n {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(responseBody),\n signal,\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `Preview gateway response upload failed (${response.status}): ${await response.text()}`,\n );\n }\n}\n\nasync function closeGatewaySession(plan: PreviewGatewayPlan, session: PreviewGatewaySession) {\n await fetch(\n `${plan.gatewayUrl}/api/sessions/${session.id}?token=${encodeURIComponent(session.token)}`,\n {\n method: \"DELETE\",\n },\n );\n}\n\nexport function formatGatewayPlan(plan: PreviewGatewayPlan) {\n return [\n `Gateway: ${plan.gatewayUrl}`,\n `Relay: ${plan.relayUrl}`,\n `Local: ${plan.target.localUrl}`,\n `Public: ${plan.requestedPublicUrl}`,\n ].join(\"\\n\");\n}\n\nfunction formatRequestPath(path: string) {\n if (path.length <= 96) {\n return path;\n }\n\n return `${path.slice(0, 93)}...`;\n}\n\nfunction normalizeGatewayUrl(value: string) {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction normalizeRelayUrl(value: string) {\n const url = new URL(value);\n if (url.protocol === \"http:\") url.protocol = \"ws:\";\n if (url.protocol === \"https:\") url.protocol = \"wss:\";\n if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") {\n throw new Error(`Preview relay must use ws or wss, received ${url.protocol}`);\n }\n const pathname = url.pathname.replace(/\\/+$/, \"\");\n url.pathname = pathname.endsWith(\"/agent\") ? pathname : `${pathname}/agent`;\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nfunction normalizePreviewDomain(value: string) {\n return value\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^\\.*/, \"\")\n .replace(/\\/*$/, \"\");\n}\n\nfunction sanitizePreviewName(value: string | undefined) {\n if (!value) return undefined;\n return value\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 48);\n}\n\nfunction randomPreviewName() {\n return `farm-${Math.random().toString(36).slice(2, 8)}`;\n}\n","import { logger } from \"@farm.js/core\";\nimport type { PreviewAgentSession } from \"@farm.js/tunnel\";\nimport type { PreviewGatewayPlan } from \"./preview-gateway\";\n\nexport interface NativeTunnelRuntime {\n startPreviewAgent(\n relayUrl: string,\n name: string,\n targetUrl: string,\n ): Promise<PreviewAgentSession>;\n stopPreviewAgent(sessionId: string): Promise<boolean>;\n waitPreviewAgent(sessionId: string): Promise<boolean>;\n}\n\nexport interface RunNativePreviewTunnelOptions {\n runtime?: NativeTunnelRuntime;\n}\n\nexport async function runNativePreviewTunnel(\n plan: PreviewGatewayPlan,\n options: RunNativePreviewTunnelOptions = {},\n): Promise<PreviewAgentSession> {\n const runtime = options.runtime || (await loadNativeTunnel());\n const session = await runtime.startPreviewAgent(\n plan.relayUrl,\n plan.requestedName,\n plan.target.localUrl,\n );\n let stopping = false;\n\n const stop = () => {\n if (stopping) return;\n stopping = true;\n void runtime.stopPreviewAgent(session.sessionId);\n };\n\n process.once(\"SIGINT\", stop);\n process.once(\"SIGTERM\", stop);\n\n logger.success(\"Preview URL ready.\");\n logger.info(`Public: ${session.publicUrl}`);\n logger.info(\"Forwarding requests through the native tunnel until Ctrl+C.\");\n\n try {\n const waited = await runtime.waitPreviewAgent(session.sessionId);\n if (!waited) {\n throw new Error(\"The native preview tunnel stopped before its lifecycle could be observed.\");\n }\n return session;\n } finally {\n process.removeListener(\"SIGINT\", stop);\n process.removeListener(\"SIGTERM\", stop);\n await runtime.stopPreviewAgent(session.sessionId).catch(() => false);\n }\n}\n\nasync function loadNativeTunnel(): Promise<NativeTunnelRuntime> {\n try {\n return await import(\"@farm.js/tunnel\");\n } catch (error) {\n const reason = error instanceof Error ? ` ${error.message}` : \"\";\n throw new Error(\n `Could not load @farm.js/tunnel for this platform. Reinstall @farm.js/cli so its native platform package is restored.${reason}`,\n );\n }\n}\n","import { spawn, spawnSync, type ChildProcess } from \"node:child_process\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { loadConfig, logger } from \"@farm.js/core\";\nimport type { PreviewAgentSession } from \"@farm.js/tunnel\";\nimport {\n createPreviewGatewayPlan,\n formatGatewayPlan,\n runPreviewGateway,\n type PreviewGatewayPlan,\n type PreviewGatewaySession,\n} from \"./preview-gateway\";\nimport { runNativePreviewTunnel } from \"./preview-native\";\n\nexport interface PreviewFarmOptions {\n root?: string;\n configPath?: string;\n port?: number | string;\n host?: string;\n url?: string;\n gatewayUrl?: string;\n name?: string;\n dryRun?: boolean;\n noProbe?: boolean;\n timeoutMs?: number;\n provider?: \"farm\" | \"local\";\n}\n\nexport interface PreviewTarget {\n localUrl: string;\n host: string;\n port: number;\n source: \"url\" | \"port\" | \"config\" | \"detected\";\n}\n\nexport interface PreviewTunnelPlan {\n command: string;\n args: string[];\n shell?: boolean;\n target: PreviewTarget;\n requestedName: string;\n requestedHostname: string;\n}\n\nexport interface PreviewFarmResult {\n target: PreviewTarget;\n plan: PreviewTunnelPlan | PreviewGatewayPlan;\n publicUrl?: string;\n session?: PreviewAgentSession | PreviewGatewaySession;\n}\n\nconst DEFAULT_PREVIEW_PORTS = [3000, 4319, 5173, 4173, 8080];\nconst PREVIEW_URL_PATTERN = /https:\\/\\/[^\\s\"')\\]}]+/g;\n\nexport async function previewFarm(options: PreviewFarmOptions = {}): Promise<PreviewFarmResult> {\n const target = await resolvePreviewTarget(options);\n\n logger.info(\"Creating public preview for the running app...\");\n logger.info(`Local: ${target.localUrl}`);\n\n if (shouldUseManagedGateway(options)) {\n const plan = createPreviewGatewayPlan(target, options);\n\n if (options.dryRun) {\n logger.info(formatGatewayPlan(plan));\n logger.success(\"Preview gateway dry run completed.\");\n return { target, plan };\n }\n\n logger.info(`Relay: ${plan.relayUrl}`);\n logger.info(\"Opening native Farm preview tunnel...\");\n try {\n const session = await runNativePreviewTunnel(plan);\n return { target, plan, publicUrl: session.publicUrl, session };\n } catch (error) {\n logger.warn(\n `Native preview relay unavailable; using compatibility gateway polling.${formatPreviewError(error)}`,\n );\n const session = await runPreviewGateway(plan, {\n timeoutMs: options.timeoutMs,\n });\n return { target, plan, publicUrl: session.publicUrl, session };\n }\n }\n\n const plan = createPreviewTunnelPlan(target, options);\n\n if (options.dryRun) {\n logger.info(`Command: ${formatCommand(plan)}`);\n logger.success(\"Preview tunnel dry run completed.\");\n return { target, plan };\n }\n\n logger.info(\"Opening public tunnel...\");\n const publicUrl = await runPreviewTunnel(plan, options.timeoutMs ?? 30000);\n return { target, plan, publicUrl };\n}\n\nfunction formatPreviewError(error: unknown) {\n return error instanceof Error && error.message ? ` ${error.message}` : \"\";\n}\n\nfunction shouldUseManagedGateway(options: PreviewFarmOptions) {\n if (options.provider === \"farm\" || process.env.FARM_PREVIEW_PROVIDER === \"farm\") {\n return true;\n }\n if (options.provider === \"local\" || process.env.FARM_PREVIEW_PROVIDER === \"local\") {\n return false;\n }\n return !process.env.FARM_PREVIEW_TUNNEL_COMMAND;\n}\n\nexport async function resolvePreviewTarget(\n options: PreviewFarmOptions = {},\n): Promise<PreviewTarget> {\n if (options.url) {\n const parsed = new URL(options.url);\n const port = Number(parsed.port || (parsed.protocol === \"https:\" ? 443 : 80));\n if (!Number.isFinite(port)) {\n throw new Error(`Could not resolve a port from ${options.url}.`);\n }\n return {\n localUrl: normalizeLocalUrl(options.url),\n host: parsed.hostname,\n port,\n source: \"url\",\n };\n }\n\n const root = options.root || process.cwd();\n const host = options.host || process.env.FARM_PREVIEW_HOST || \"localhost\";\n const explicitPort = normalizePort(options.port || process.env.FARM_PREVIEW_PORT);\n const configPort = explicitPort ? undefined : await readConfigPort(root, options.configPath);\n const candidates = uniqueNumbers([\n explicitPort,\n normalizePort(process.env.FARM_PORT),\n normalizePort(process.env.PORT),\n configPort,\n ...DEFAULT_PREVIEW_PORTS,\n ]);\n\n if (!candidates.length) {\n throw new Error(\"No preview port candidates were available.\");\n }\n\n if (options.noProbe && explicitPort) {\n return {\n localUrl: createLocalUrl(host, explicitPort),\n host,\n port: explicitPort,\n source: \"port\",\n };\n }\n\n const timeoutMs = options.timeoutMs ?? 1500;\n for (const port of candidates) {\n const localUrl = createLocalUrl(host, port);\n if (await isReachable(localUrl, timeoutMs)) {\n return {\n localUrl,\n host,\n port,\n source: explicitPort ? \"port\" : configPort === port ? \"config\" : \"detected\",\n };\n }\n }\n\n const hint = explicitPort\n ? createLocalUrl(host, explicitPort)\n : candidates.map((port) => port).join(\", \");\n throw new Error(\n `No running Farm app was found (${hint}). Start \"farm dev\" first, or pass --port/--url to the running app.`,\n );\n}\n\nexport function createPreviewTunnelPlan(\n target: PreviewTarget,\n options: Pick<PreviewFarmOptions, \"name\"> = {},\n): PreviewTunnelPlan {\n const requestedName =\n sanitizePreviewName(options.name || process.env.FARM_PREVIEW_NAME) || randomPreviewName();\n const domain = normalizePreviewDomain(\n process.env.FARM_PREVIEW_DOMAIN || \"preview.farming-labs.dev\",\n );\n const requestedHostname = `${requestedName}.${domain}`;\n const template = process.env.FARM_PREVIEW_TUNNEL_COMMAND;\n\n if (template) {\n return {\n command: expandTunnelTemplate(template, target, requestedName, requestedHostname),\n args: [],\n shell: true,\n target,\n requestedName,\n requestedHostname,\n };\n }\n\n if (commandExists(\"cloudflared\")) {\n return {\n command: \"cloudflared\",\n args: [\"tunnel\", \"--url\", target.localUrl],\n target,\n requestedName,\n requestedHostname,\n };\n }\n\n if (commandExists(\"npx\")) {\n return {\n command: \"npx\",\n args: [\n \"--yes\",\n \"localtunnel\",\n \"--port\",\n String(target.port),\n \"--local-host\",\n target.host,\n \"--subdomain\",\n requestedName,\n ],\n target,\n requestedName,\n requestedHostname,\n };\n }\n\n throw new Error(\n \"No preview tunnel command is available. Install cloudflared, ensure npx is available, or set FARM_PREVIEW_TUNNEL_COMMAND.\",\n );\n}\n\nexport function parsePreviewPublicUrl(\n output: string,\n preferredHostname?: string,\n): string | undefined {\n const matches = output.match(PREVIEW_URL_PATTERN) || [];\n const urls = matches.filter((value) => {\n try {\n const url = new URL(value);\n return Boolean(url.hostname);\n } catch {\n return false;\n }\n });\n\n if (preferredHostname) {\n const preferred = urls.find((value) => new URL(value).hostname === preferredHostname);\n if (preferred) return preferred;\n }\n\n return (\n urls.find((value) => {\n const host = new URL(value).hostname;\n return (\n host.endsWith(\".trycloudflare.com\") ||\n host.endsWith(\".loca.lt\") ||\n host.endsWith(\".localtunnel.me\") ||\n host.endsWith(\".ngrok.app\") ||\n host.endsWith(\".ngrok-free.app\") ||\n host.endsWith(\".ngrok.dev\") ||\n host.endsWith(\".ngrok.io\") ||\n host.endsWith(\".preview.farming-labs.dev\")\n );\n }) || urls[0]\n );\n}\n\nasync function runPreviewTunnel(plan: PreviewTunnelPlan, timeoutMs: number): Promise<string> {\n const child = spawn(plan.command, plan.args, {\n env: {\n ...process.env,\n FARM_PREVIEW_LOCAL_URL: plan.target.localUrl,\n FARM_PREVIEW_NAME: plan.requestedName,\n FARM_PREVIEW_HOSTNAME: plan.requestedHostname,\n },\n shell: plan.shell,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let output = \"\";\n let publicUrl: string | undefined;\n let settled = false;\n\n const cleanup = () => {\n if (!child.killed) child.kill(\"SIGTERM\");\n };\n process.once(\"SIGINT\", cleanup);\n process.once(\"SIGTERM\", cleanup);\n\n try {\n publicUrl = await new Promise<string>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(\"Timed out waiting for the preview URL.\"));\n }, timeoutMs);\n\n const handleChunk = (chunk: Buffer) => {\n const text = chunk.toString();\n output += text;\n process.stdout.write(text);\n const nextUrl = parsePreviewPublicUrl(output, plan.requestedHostname);\n if (nextUrl && !settled) {\n settled = true;\n clearTimeout(timer);\n logger.success(\"Preview URL ready.\");\n logger.info(`Public: ${nextUrl}`);\n logger.info(\"Forwarding requests until Ctrl+C.\");\n resolve(nextUrl);\n }\n };\n\n child.stdout?.on(\"data\", handleChunk);\n child.stderr?.on(\"data\", handleChunk);\n child.on(\"error\", (error) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n reject(error);\n }\n });\n child.on(\"exit\", (code, signal) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n reject(\n new Error(\n `Preview tunnel exited before returning a URL (${signal || `exit code ${code ?? 0}`}).`,\n ),\n );\n }\n });\n });\n\n await waitForTunnelExit(child);\n return publicUrl;\n } finally {\n process.removeListener(\"SIGINT\", cleanup);\n process.removeListener(\"SIGTERM\", cleanup);\n }\n}\n\nfunction waitForTunnelExit(child: ChildProcess) {\n return new Promise<void>((resolve) => {\n if (child.exitCode !== null || child.signalCode !== null) {\n resolve();\n return;\n }\n child.once(\"exit\", () => resolve());\n });\n}\n\nasync function isReachable(url: string, timeoutMs: number) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n });\n return true;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n await delay(0);\n }\n}\n\nasync function readConfigPort(root: string, configPath?: string) {\n try {\n const config = await loadConfig(root, configPath, \"development\");\n const vite = config?.vite;\n if (!vite || typeof vite === \"function\") return undefined;\n return normalizePort(vite.server?.port);\n } catch {\n return undefined;\n }\n}\n\nfunction commandExists(command: string) {\n const result = spawnSync(command, [\"--version\"], {\n shell: process.platform === \"win32\",\n stdio: \"ignore\",\n });\n return !result.error && result.status === 0;\n}\n\nfunction expandTunnelTemplate(\n template: string,\n target: PreviewTarget,\n requestedName: string,\n requestedHostname: string,\n) {\n return template\n .split(\"{url}\")\n .join(shellQuote(target.localUrl))\n .split(\"{port}\")\n .join(shellQuote(String(target.port)))\n .split(\"{host}\")\n .join(shellQuote(target.host))\n .split(\"{name}\")\n .join(shellQuote(requestedName))\n .split(\"{hostname}\")\n .join(shellQuote(requestedHostname));\n}\n\nfunction shellQuote(value: string) {\n return `\"${value.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`;\n}\n\nfunction formatCommand(plan: PreviewTunnelPlan) {\n if (plan.shell) return plan.command;\n return [plan.command, ...plan.args].join(\" \");\n}\n\nfunction normalizeLocalUrl(value: string) {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction createLocalUrl(host: string, port: number) {\n return `http://${host}:${port}`;\n}\n\nfunction normalizePort(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n const port = Number(value);\n return Number.isInteger(port) && port > 0 && port <= 65535 ? port : undefined;\n}\n\nfunction uniqueNumbers(values: Array<number | undefined>) {\n return [...new Set(values.filter((value): value is number => value !== undefined))];\n}\n\nfunction sanitizePreviewName(value: string | undefined) {\n if (!value) return undefined;\n return value\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 48);\n}\n\nfunction randomPreviewName() {\n return `farm-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction normalizePreviewDomain(value: string) {\n return value\n .replace(/^https?:\\/\\//, \"\")\n .replace(/^\\.*/, \"\")\n .replace(/\\/*$/, \"\");\n}\n","import {\n generateFarmTypeArtifacts,\n getFarmDocsRouteTypeEntries,\n getIntegrationSchemas,\n loadConfig,\n logger,\n resolveConfig,\n type FarmIntegrationSchema,\n type FarmIntegrationSchemaField,\n type FarmIntegrationSchemaModel,\n} from \"@farm.js/core\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type GenerateFarmSchemaTarget =\n | \"prisma\"\n | \"drizzle\"\n | \"postgres\"\n | \"mysql\"\n | \"sqlite\"\n | \"mongodb\";\n\nexport type GenerateFarmSqlDialect = \"postgres\" | \"mysql\" | \"sqlite\";\n\nexport interface GenerateFarmOptions {\n root?: string;\n configPath?: string;\n orm?: GenerateFarmSchemaTarget;\n output?: string;\n dialect?: GenerateFarmSqlDialect;\n /** Verify committed type artifacts without writing files. */\n check?: boolean;\n}\n\nexport class FarmGeneratedArtifactsStaleError extends Error {\n readonly stalePaths: string[];\n\n constructor(root: string, stalePaths: readonly string[]) {\n const normalizedPaths = [...new Set(stalePaths)].sort();\n const relativePaths = normalizedPaths.map((filePath) => path.relative(root, filePath));\n super(\n `Generated types are stale:\\n${relativePaths.map((filePath) => ` - ${filePath}`).join(\"\\n\")}\\nRun farm generate and commit the updated files.`,\n );\n this.name = \"FarmGeneratedArtifactsStaleError\";\n this.stalePaths = normalizedPaths;\n }\n}\n\ntype PackageManifest = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n};\n\ntype ResolvedSchemaField = FarmIntegrationSchemaField & {\n name: string;\n};\n\ntype ResolvedSchemaModel = Omit<FarmIntegrationSchemaModel, \"fields\"> & {\n name: string;\n fields: Record<string, ResolvedSchemaField>;\n};\n\ntype CollectedSchemaModel = {\n integrationKey: string;\n modelKey: string;\n modelName: string;\n exportName: string;\n prismaModelName: string;\n model: ResolvedSchemaModel;\n};\n\nconst PRISMA_GENERATED_START = \"// Farm.js integrations generated schema: start\";\nconst PRISMA_GENERATED_END = \"// Farm.js integrations generated schema: end\";\n\nexport async function generateFarmArtifacts(options: GenerateFarmOptions = {}) {\n const root = path.resolve(options.root || process.cwd());\n if (options.check && hasSchemaOptions(options)) {\n throw new Error(\n \"--check verifies generated framework types and cannot be combined with schema output options.\",\n );\n }\n const userConfig = await loadConfig(root, options.configPath, \"development\");\n\n if (!userConfig && hasSchemaOptions(options)) {\n throw new Error(\"No Farm config found. Please create farm.config.ts or config.ts.\");\n }\n\n const resolvedConfig = await resolveConfig({ root, ...userConfig }, \"development\");\n const extraRoutes = [\n ...(resolvedConfig.openapi?.enabled && resolvedConfig.openapi.route\n ? [resolvedConfig.openapi.route]\n : []),\n ...getFarmDocsRouteTypeEntries(resolvedConfig.docs),\n ];\n const typeArtifacts = await generateFarmTypeArtifacts({\n root: resolvedConfig.root,\n srcDir: resolvedConfig.srcDir,\n configPath: options.configPath,\n layers: resolvedConfig.layers,\n extraRoutes,\n suppressLintOnLink: resolvedConfig.suppressLintOnLink,\n i18nConfig: resolvedConfig.i18n,\n check: options.check,\n });\n\n if (options.check) {\n if (typeArtifacts.stalePaths.length) {\n throw new FarmGeneratedArtifactsStaleError(root, typeArtifacts.stalePaths);\n }\n logger.success(\n `Generated route, API, env${resolvedConfig.i18n.enabled ? \", and i18n\" : \"\"} types are up to date.`,\n );\n return typeArtifacts;\n }\n\n logger.success(\n `Generated route, API, env${resolvedConfig.i18n.enabled ? \", and i18n\" : \"\"} types (${typeArtifacts.apiRoutes.length} API route${typeArtifacts.apiRoutes.length === 1 ? \"\" : \"s\"}).`,\n );\n\n const schemas = getIntegrationSchemas(resolvedConfig.integrations);\n const schemaEntries = Object.entries(schemas);\n\n if (!schemaEntries.length) {\n if (hasSchemaOptions(options)) {\n logger.warn(\"No integration schemas were found in the current Farm config.\");\n }\n return typeArtifacts;\n }\n\n const packageManifest = await readPackageManifest(root);\n const schemaOptionsExplicit = hasSchemaOptions(options);\n let orm: GenerateFarmSchemaTarget | null = null;\n try {\n orm = options.orm ?? (await detectSchemaTarget(root, packageManifest));\n } catch (error) {\n if (schemaOptionsExplicit) {\n throw error;\n }\n logger.warn(\n `Integration schemas were found, but Farm could not choose a schema target automatically: ${(error as Error).message}`,\n );\n return typeArtifacts;\n }\n\n if (!orm) {\n if (!schemaOptionsExplicit) {\n logger.warn(\n \"Integration schemas were found, but no data layer was detected. Pass --orm prisma|drizzle|postgres|mysql|sqlite|mongodb to generate schema artifacts.\",\n );\n return typeArtifacts;\n }\n throw new Error(\n \"Could not auto-detect a schema target. Pass one explicitly with --orm prisma|drizzle|postgres|mysql|sqlite|mongodb.\",\n );\n }\n\n const collectedModels = collectSchemaModels(schemaEntries);\n\n switch (orm) {\n case \"prisma\": {\n const schemaPath = options.output\n ? path.resolve(root, options.output)\n : path.join(root, \"prisma\", \"schema.prisma\");\n\n if (!existsSync(schemaPath)) {\n throw new Error(\n `Prisma target was selected but no schema file was found at ${schemaPath}. Create prisma/schema.prisma or pass --output.`,\n );\n }\n\n await writePrismaSchema(schemaPath, collectedModels);\n logger.success(`Generated Prisma integration schema in ${path.relative(root, schemaPath)}.`);\n return typeArtifacts;\n }\n\n case \"drizzle\": {\n const dialect =\n options.dialect ?? (await detectDrizzleDialect(root, packageManifest)) ?? undefined;\n\n if (!dialect) {\n throw new Error(\n \"Detected Drizzle but could not determine its dialect. Pass --dialect postgres|mysql|sqlite.\",\n );\n }\n\n const outputPath = options.output\n ? path.resolve(root, options.output)\n : path.join(root, \"farm-integrations.generated.ts\");\n await writeGeneratedFile(outputPath, generateDrizzleSchema(collectedModels, dialect));\n logger.success(`Generated Drizzle integration schema in ${path.relative(root, outputPath)}.`);\n return typeArtifacts;\n }\n\n case \"postgres\":\n case \"mysql\":\n case \"sqlite\": {\n const outputPath = options.output\n ? path.resolve(root, options.output)\n : path.join(root, `farm-integrations.generated.${orm}.sql`);\n await writeGeneratedFile(outputPath, generateSqlSchema(collectedModels, orm));\n logger.success(`Generated ${orm} integration schema in ${path.relative(root, outputPath)}.`);\n return typeArtifacts;\n }\n\n case \"mongodb\": {\n const outputPath = options.output\n ? path.resolve(root, options.output)\n : path.join(root, \"farm-integrations.generated.mongodb.ts\");\n await writeGeneratedFile(outputPath, generateMongoBootstrap(collectedModels));\n logger.success(\n `Generated MongoDB integration bootstrap in ${path.relative(root, outputPath)}.`,\n );\n return typeArtifacts;\n }\n }\n}\n\nfunction hasSchemaOptions(options: GenerateFarmOptions) {\n return Boolean(options.orm || options.output || options.dialect);\n}\n\nasync function readPackageManifest(root: string): Promise<PackageManifest | null> {\n const packagePath = path.join(root, \"package.json\");\n if (!existsSync(packagePath)) {\n return null;\n }\n\n const source = await readFile(packagePath, \"utf8\");\n return JSON.parse(source) as PackageManifest;\n}\n\nasync function detectSchemaTarget(\n root: string,\n packageManifest: PackageManifest | null,\n): Promise<GenerateFarmSchemaTarget | null> {\n const hasPrismaSchema = existsSync(path.join(root, \"prisma\", \"schema.prisma\"));\n const drizzleConfigPath = findExistingPath(root, [\n \"drizzle.config.ts\",\n \"drizzle.config.mts\",\n \"drizzle.config.js\",\n \"drizzle.config.mjs\",\n \"drizzle.config.cjs\",\n ]);\n\n if (hasPrismaSchema && drizzleConfigPath) {\n throw new Error(\n \"Detected both Prisma and Drizzle in this project. Pass --orm prisma or --orm drizzle to choose one.\",\n );\n }\n\n if (hasPrismaSchema) {\n return \"prisma\";\n }\n\n if (drizzleConfigPath) {\n return \"drizzle\";\n }\n\n const dependencies = getPackageDependencyNames(packageManifest);\n const candidates = new Set<GenerateFarmSchemaTarget>();\n\n if (dependencies.has(\"@prisma/client\") || dependencies.has(\"prisma\")) {\n candidates.add(\"prisma\");\n }\n\n if (dependencies.has(\"drizzle-orm\") || dependencies.has(\"drizzle-kit\")) {\n candidates.add(\"drizzle\");\n }\n\n if (hasAnyDependency(dependencies, [\"pg\", \"postgres\", \"@neondatabase/serverless\"])) {\n candidates.add(\"postgres\");\n }\n\n if (hasAnyDependency(dependencies, [\"mysql2\", \"@planetscale/database\"])) {\n candidates.add(\"mysql\");\n }\n\n if (hasAnyDependency(dependencies, [\"better-sqlite3\", \"sqlite3\"])) {\n candidates.add(\"sqlite\");\n }\n\n if (hasAnyDependency(dependencies, [\"mongodb\", \"mongoose\"])) {\n candidates.add(\"mongodb\");\n }\n\n if (candidates.size === 1) {\n return Array.from(candidates)[0]!;\n }\n\n if (candidates.size > 1) {\n throw new Error(\n `Detected multiple possible schema targets (${Array.from(candidates).join(\", \")}). Pass --orm to choose one.`,\n );\n }\n\n return null;\n}\n\nasync function detectDrizzleDialect(\n root: string,\n packageManifest: PackageManifest | null,\n): Promise<GenerateFarmSqlDialect | null> {\n const configPath = findExistingPath(root, [\n \"drizzle.config.ts\",\n \"drizzle.config.mts\",\n \"drizzle.config.js\",\n \"drizzle.config.mjs\",\n \"drizzle.config.cjs\",\n ]);\n\n if (configPath) {\n const source = await readFile(configPath, \"utf8\");\n const dialectMatch = source.match(\n /dialect\\s*:\\s*[\"'](postgresql|postgres|mysql|sqlite|turso)[\"']/,\n );\n if (dialectMatch) {\n const dialect = dialectMatch[1];\n if (dialect === \"postgresql\" || dialect === \"postgres\") {\n return \"postgres\";\n }\n if (dialect === \"mysql\") {\n return \"mysql\";\n }\n if (dialect === \"sqlite\" || dialect === \"turso\") {\n return \"sqlite\";\n }\n }\n }\n\n const dependencies = getPackageDependencyNames(packageManifest);\n const candidates = new Set<GenerateFarmSqlDialect>();\n\n if (hasAnyDependency(dependencies, [\"pg\", \"postgres\", \"@neondatabase/serverless\"])) {\n candidates.add(\"postgres\");\n }\n\n if (hasAnyDependency(dependencies, [\"mysql2\", \"@planetscale/database\"])) {\n candidates.add(\"mysql\");\n }\n\n if (hasAnyDependency(dependencies, [\"better-sqlite3\", \"sqlite3\"])) {\n candidates.add(\"sqlite\");\n }\n\n return candidates.size === 1 ? Array.from(candidates)[0]! : null;\n}\n\nfunction findExistingPath(root: string, relativePaths: readonly string[]) {\n for (const relativePath of relativePaths) {\n const absolutePath = path.join(root, relativePath);\n if (existsSync(absolutePath)) {\n return absolutePath;\n }\n }\n\n return null;\n}\n\nfunction getPackageDependencyNames(packageManifest: PackageManifest | null) {\n return new Set([\n ...Object.keys(packageManifest?.dependencies || {}),\n ...Object.keys(packageManifest?.devDependencies || {}),\n ...Object.keys(packageManifest?.peerDependencies || {}),\n ...Object.keys(packageManifest?.optionalDependencies || {}),\n ]);\n}\n\nfunction hasAnyDependency(dependencies: Set<string>, candidates: readonly string[]) {\n return candidates.some((candidate) => dependencies.has(candidate));\n}\n\nfunction collectSchemaModels(\n schemaEntries: ReadonlyArray<readonly [string, FarmIntegrationSchema]>,\n) {\n const collectedModels: CollectedSchemaModel[] = [];\n const seenModelNames = new Map<string, string>();\n\n for (const [integrationKey, schema] of schemaEntries) {\n const resolvedModels = resolveSchemaModels(integrationKey, schema);\n\n for (const [modelKey, model] of Object.entries(resolvedModels)) {\n const collisionKey = model.name.toLowerCase();\n const previousOwner = seenModelNames.get(collisionKey);\n\n if (previousOwner && previousOwner !== `${integrationKey}.${modelKey}`) {\n throw new Error(\n `Integration schema model \"${integrationKey}.${modelKey}\" resolves to \"${model.name}\", which conflicts with \"${previousOwner}\". Rename one of the models with schema.models.<model>.name.`,\n );\n }\n\n seenModelNames.set(collisionKey, `${integrationKey}.${modelKey}`);\n\n collectedModels.push({\n integrationKey,\n modelKey,\n modelName: model.name,\n exportName: toCamelCase(`${integrationKey}_${modelKey}`),\n prismaModelName: toPascalCase(`${integrationKey}_${modelKey}`),\n model,\n });\n }\n }\n\n return collectedModels;\n}\n\nfunction resolveSchemaModels(integrationKey: string, schema: FarmIntegrationSchema) {\n const models: Record<string, FarmIntegrationSchemaModel> = Object.fromEntries(\n Object.entries(schema.models).map(([modelKey, model]) => [modelKey, cloneSchemaModel(model)]),\n );\n\n for (const [modelKey, extension] of Object.entries(schema.extend || {})) {\n const existing = models[modelKey];\n models[modelKey] = {\n ...(existing || { fields: {} }),\n ...(extension.name ? { name: extension.name } : {}),\n ...(extension.description ? { description: extension.description } : {}),\n fields: {\n ...existing?.fields,\n ...extension.fields,\n },\n constraints: [...(existing?.constraints || []), ...(extension.constraints || [])],\n meta: {\n ...existing?.meta,\n ...extension.meta,\n },\n };\n }\n\n for (const [modelKey, override] of Object.entries(schema.override || {})) {\n const existing = models[modelKey];\n\n if (!existing) {\n throw new Error(\n `Integration schema override for \"${integrationKey}.${modelKey}\" is invalid because that model does not exist.`,\n );\n }\n\n const fields = {\n ...existing.fields,\n };\n\n for (const [fieldKey, fieldOverride] of Object.entries(override.fields || {})) {\n const existingField = fields[fieldKey];\n\n if (!existingField && !fieldOverride.type) {\n throw new Error(\n `Integration schema override for \"${integrationKey}.${modelKey}.${fieldKey}\" is missing a field type.`,\n );\n }\n\n fields[fieldKey] = {\n ...existingField,\n ...fieldOverride,\n } as FarmIntegrationSchemaField;\n }\n\n models[modelKey] = {\n ...existing,\n ...(override.name ? { name: override.name } : {}),\n ...(override.description ? { description: override.description } : {}),\n fields,\n constraints: override.constraints || existing.constraints,\n meta: {\n ...existing.meta,\n ...override.meta,\n },\n };\n }\n\n const resolvedModels: Record<string, ResolvedSchemaModel> = {};\n\n for (const [modelKey, model] of Object.entries(models)) {\n const modelName = model.name || toSnakeCase(`${integrationKey}_${modelKey}`);\n const fieldNames = new Set<string>();\n const resolvedFields: Record<string, ResolvedSchemaField> = {};\n\n for (const [fieldKey, field] of Object.entries(model.fields)) {\n const fieldName = field.name || toSnakeCase(fieldKey);\n\n if (fieldNames.has(fieldName)) {\n throw new Error(\n `Integration schema model \"${integrationKey}.${modelKey}\" contains duplicate field name \"${fieldName}\".`,\n );\n }\n\n fieldNames.add(fieldName);\n resolvedFields[fieldKey] = {\n ...field,\n name: fieldName,\n };\n }\n\n resolvedModels[modelKey] = {\n ...model,\n name: modelName,\n fields: resolvedFields,\n };\n }\n\n return resolvedModels;\n}\n\nfunction cloneSchemaModel(model: FarmIntegrationSchemaModel): FarmIntegrationSchemaModel {\n return {\n ...model,\n fields: Object.fromEntries(\n Object.entries(model.fields).map(([fieldKey, field]) => [fieldKey, { ...field }]),\n ),\n constraints: model.constraints ? [...model.constraints] : undefined,\n meta: model.meta ? { ...model.meta } : undefined,\n };\n}\n\nasync function writePrismaSchema(schemaPath: string, models: readonly CollectedSchemaModel[]) {\n const source = await readFile(schemaPath, \"utf8\");\n const generated = createPrismaGeneratedBlock(generatePrismaSchema(models));\n const pattern = new RegExp(\n `${escapeRegExp(PRISMA_GENERATED_START)}[\\\\s\\\\S]*?${escapeRegExp(PRISMA_GENERATED_END)}`,\n \"m\",\n );\n\n const nextSource = pattern.test(source)\n ? source.replace(pattern, generated)\n : `${source.trimEnd()}\\n\\n${generated}\\n`;\n\n await writeFile(schemaPath, nextSource, \"utf8\");\n}\n\nfunction generatePrismaSchema(models: readonly CollectedSchemaModel[]) {\n const sections = models.map((model) => renderPrismaModel(model));\n return sections.join(\"\\n\\n\");\n}\n\nfunction renderPrismaModel(model: CollectedSchemaModel) {\n const lines: string[] = [\n `/// Farm.js generated from integration \"${model.integrationKey}\" model \"${model.modelKey}\"`,\n `model ${model.prismaModelName} {`,\n ];\n\n const modelLevelConstraints: string[] = [];\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (field.reference) {\n lines.push(\n ` /// References ${field.reference.model}.${field.reference.field}${field.reference.onDelete ? ` (onDelete: ${field.reference.onDelete})` : \"\"}`,\n );\n }\n\n const parts = [\n fieldKey,\n `${getPrismaFieldType(field)}${field.list ? \"[]\" : isNullableField(field) ? \"?\" : \"\"}`,\n ];\n const attributes: string[] = [];\n\n if (field.primaryKey) {\n attributes.push(\"@id\");\n if (field.type === \"id\" && field.default === undefined) {\n attributes.push(\"@default(cuid())\");\n }\n if (field.type === \"uuid\" && field.default === undefined) {\n attributes.push(\"@default(uuid())\");\n }\n } else if (field.unique) {\n attributes.push(\"@unique\");\n }\n\n const defaultAttribute = getPrismaDefaultAttribute(field);\n if (defaultAttribute) {\n attributes.push(defaultAttribute);\n }\n\n if (field.meta?.autoUpdate && field.type === \"datetime\") {\n attributes.push(\"@updatedAt\");\n }\n\n if (field.name !== fieldKey) {\n attributes.push(`@map(\"${escapeString(field.name)}\")`);\n }\n\n if (attributes.length) {\n parts.push(attributes.join(\" \"));\n }\n\n lines.push(` ${parts.join(\" \")}`);\n\n if (field.index) {\n modelLevelConstraints.push(\n `@@index([${fieldKey}], map: \"${escapeString(`${model.modelName}_${field.name}_idx`)}\")`,\n );\n }\n }\n\n for (const constraint of model.model.constraints || []) {\n const fields = constraint.fields.join(\", \");\n const attribute = constraint.type === \"unique\" ? \"@@unique\" : \"@@index\";\n const suffix = constraint.name ? `, map: \"${escapeString(constraint.name)}\"` : \"\";\n modelLevelConstraints.push(`${attribute}([${fields}]${suffix})`);\n }\n\n lines.push(` @@map(\"${escapeString(model.modelName)}\")`);\n\n for (const constraint of modelLevelConstraints) {\n lines.push(` ${constraint}`);\n }\n\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n\nfunction getPrismaFieldType(field: ResolvedSchemaField) {\n switch (field.type) {\n case \"boolean\":\n return \"Boolean\";\n case \"integer\":\n return \"Int\";\n case \"number\":\n return \"Float\";\n case \"datetime\":\n return \"DateTime\";\n case \"json\":\n return \"Json\";\n default:\n return \"String\";\n }\n}\n\nfunction getPrismaDefaultAttribute(field: ResolvedSchemaField) {\n if (field.default === undefined) {\n return null;\n }\n\n if (field.type === \"datetime\" && field.default === \"now\") {\n return \"@default(now())\";\n }\n\n if (typeof field.default === \"string\") {\n return `@default(\"${escapeString(field.default)}\")`;\n }\n\n if (typeof field.default === \"number\" || typeof field.default === \"boolean\") {\n return `@default(${String(field.default)})`;\n }\n\n return null;\n}\n\nfunction createPrismaGeneratedBlock(body: string) {\n return [PRISMA_GENERATED_START, body, PRISMA_GENERATED_END].join(\"\\n\");\n}\n\nfunction generateDrizzleSchema(\n models: readonly CollectedSchemaModel[],\n dialect: GenerateFarmSqlDialect,\n) {\n const tableFactoryName =\n dialect === \"postgres\" ? \"pgTable\" : dialect === \"mysql\" ? \"mysqlTable\" : \"sqliteTable\";\n const importSource =\n dialect === \"postgres\"\n ? \"drizzle-orm/pg-core\"\n : dialect === \"mysql\"\n ? \"drizzle-orm/mysql-core\"\n : \"drizzle-orm/sqlite-core\";\n const imports = new Set<string>([tableFactoryName, \"index\", \"uniqueIndex\"]);\n\n for (const model of models) {\n for (const field of Object.values(model.model.fields)) {\n for (const helper of getDrizzleImportNames(dialect, field)) {\n imports.add(helper);\n }\n }\n }\n\n const lines = [\n \"// Generated by Farm.js CLI. Review before committing.\",\n `import { ${Array.from(imports).sort().join(\", \")} } from \"${importSource}\";`,\n \"\",\n ];\n\n for (const model of models) {\n lines.push(renderDrizzleModel(model, dialect, tableFactoryName));\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nfunction renderDrizzleModel(\n model: CollectedSchemaModel,\n dialect: GenerateFarmSqlDialect,\n tableFactoryName: string,\n) {\n const lines = [\n `// Farm.js generated from integration \"${model.integrationKey}\" model \"${model.modelKey}\"`,\n `export const ${model.exportName} = ${tableFactoryName}(\"${model.modelName}\", {`,\n ];\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (field.reference) {\n lines.push(\n ` // ${fieldKey} references ${field.reference.model}.${field.reference.field}${field.reference.onDelete ? ` (onDelete: ${field.reference.onDelete})` : \"\"}`,\n );\n }\n\n lines.push(` ${fieldKey}: ${renderDrizzleColumn(field, dialect)},`);\n }\n\n lines.push(\"}, (table) => ({\");\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (field.index) {\n lines.push(\n ` ${fieldKey}Idx: index(\"${escapeString(`${model.modelName}_${field.name}_idx`)}\").on(table.${fieldKey}),`,\n );\n }\n }\n\n for (const constraint of model.model.constraints || []) {\n const builder = constraint.type === \"unique\" ? \"uniqueIndex\" : \"index\";\n const accessor = constraint.fields.map((fieldKey) => `table.${fieldKey}`).join(\", \");\n const name =\n constraint.name ||\n `${model.modelName}_${constraint.fields.map((fieldKey) => model.model.fields[fieldKey]?.name || fieldKey).join(\"_\")}_${constraint.type}`;\n lines.push(` ${toCamelCase(name)}: ${builder}(\"${escapeString(name)}\").on(${accessor}),`);\n }\n\n lines.push(\"}));\");\n return lines.join(\"\\n\");\n}\n\nfunction getDrizzleImportNames(dialect: GenerateFarmSqlDialect, field: ResolvedSchemaField) {\n switch (dialect) {\n case \"postgres\":\n switch (field.type) {\n case \"boolean\":\n return [\"boolean\"];\n case \"integer\":\n return [\"integer\"];\n case \"number\":\n return [\"real\"];\n case \"datetime\":\n return [\"timestamp\"];\n case \"json\":\n return [\"jsonb\"];\n default:\n return [\"text\"];\n }\n\n case \"mysql\":\n switch (field.type) {\n case \"boolean\":\n return [\"boolean\"];\n case \"integer\":\n return [\"int\"];\n case \"number\":\n return [\"double\"];\n case \"datetime\":\n return [\"datetime\"];\n case \"json\":\n return [\"json\"];\n case \"text\":\n return [\"text\"];\n default:\n return [\"varchar\"];\n }\n\n case \"sqlite\":\n switch (field.type) {\n case \"number\":\n return [\"real\"];\n case \"integer\":\n case \"boolean\":\n case \"datetime\":\n return [\"integer\"];\n default:\n return [\"text\"];\n }\n }\n}\n\nfunction renderDrizzleColumn(field: ResolvedSchemaField, dialect: GenerateFarmSqlDialect) {\n let expression: string;\n\n if (dialect === \"postgres\") {\n expression = renderPostgresDrizzleColumn(field);\n } else if (dialect === \"mysql\") {\n expression = renderMysqlDrizzleColumn(field);\n } else {\n expression = renderSqliteDrizzleColumn(field);\n }\n\n if (field.primaryKey) {\n expression += \".primaryKey()\";\n }\n\n if (!field.primaryKey && !isNullableField(field)) {\n expression += \".notNull()\";\n }\n\n if (!field.primaryKey && field.unique) {\n expression += \".unique()\";\n }\n\n const defaultValue = getDrizzleDefaultExpression(field, dialect);\n if (defaultValue) {\n expression += defaultValue;\n }\n\n return expression;\n}\n\nfunction renderPostgresDrizzleColumn(field: ResolvedSchemaField) {\n switch (field.type) {\n case \"boolean\":\n return `boolean(\"${field.name}\")`;\n case \"integer\":\n return `integer(\"${field.name}\")`;\n case \"number\":\n return `real(\"${field.name}\")`;\n case \"datetime\":\n return `timestamp(\"${field.name}\", { mode: \"date\" })`;\n case \"json\":\n return `jsonb(\"${field.name}\")`;\n default:\n return `text(\"${field.name}\")`;\n }\n}\n\nfunction renderMysqlDrizzleColumn(field: ResolvedSchemaField) {\n switch (field.type) {\n case \"boolean\":\n return `boolean(\"${field.name}\")`;\n case \"integer\":\n return `int(\"${field.name}\")`;\n case \"number\":\n return `double(\"${field.name}\")`;\n case \"datetime\":\n return `datetime(\"${field.name}\", { mode: \"date\" })`;\n case \"json\":\n return `json(\"${field.name}\")`;\n case \"text\":\n return `text(\"${field.name}\")`;\n default:\n return `varchar(\"${field.name}\", { length: 255 })`;\n }\n}\n\nfunction renderSqliteDrizzleColumn(field: ResolvedSchemaField) {\n switch (field.type) {\n case \"boolean\":\n return `integer(\"${field.name}\", { mode: \"boolean\" })`;\n case \"integer\":\n return `integer(\"${field.name}\")`;\n case \"number\":\n return `real(\"${field.name}\")`;\n case \"datetime\":\n return `integer(\"${field.name}\", { mode: \"timestamp_ms\" })`;\n default:\n return `text(\"${field.name}\")`;\n }\n}\n\nfunction getDrizzleDefaultExpression(field: ResolvedSchemaField, dialect: GenerateFarmSqlDialect) {\n if (field.default === undefined) {\n return \"\";\n }\n\n if (field.type === \"datetime\" && field.default === \"now\") {\n return dialect === \"sqlite\" ? \"\" : \".defaultNow()\";\n }\n\n if (typeof field.default === \"string\") {\n return `.default(\"${escapeString(field.default)}\")`;\n }\n\n if (typeof field.default === \"number\" || typeof field.default === \"boolean\") {\n return `.default(${String(field.default)})`;\n }\n\n return \"\";\n}\n\nfunction generateSqlSchema(\n models: readonly CollectedSchemaModel[],\n dialect: GenerateFarmSqlDialect,\n) {\n const lines = [\"-- Generated by Farm.js CLI. Review before applying.\", \"\"];\n const modelLookup = createModelLookup(models);\n\n for (const model of models) {\n lines.push(\n `-- Integration \"${model.integrationKey}\" model \"${model.modelKey}\"`,\n renderSqlTable(model, dialect, modelLookup),\n \"\",\n );\n\n for (const statement of renderSqlIndexes(model, dialect)) {\n lines.push(statement, \"\");\n }\n }\n\n return lines.join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nfunction renderSqlTable(\n model: CollectedSchemaModel,\n dialect: GenerateFarmSqlDialect,\n modelLookup: Map<string, CollectedSchemaModel>,\n) {\n const tableName = quoteIdentifier(dialect, model.modelName);\n const lines = [`CREATE TABLE IF NOT EXISTS ${tableName} (`];\n const columns: string[] = [];\n const internalReferences = createInternalReferenceLookup(model, dialect, modelLookup);\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n const parts = [` ${quoteIdentifier(dialect, field.name)}`, getSqlColumnType(field, dialect)];\n\n if (field.primaryKey) {\n parts.push(\"PRIMARY KEY\");\n } else if (!isNullableField(field)) {\n parts.push(\"NOT NULL\");\n }\n\n if (!field.primaryKey && field.unique) {\n parts.push(\"UNIQUE\");\n }\n\n const defaultValue = getSqlDefaultExpression(field, dialect);\n if (defaultValue) {\n parts.push(`DEFAULT ${defaultValue}`);\n }\n\n const reference = internalReferences.get(fieldKey);\n if (reference) {\n parts.push(reference);\n } else if (field.reference) {\n parts.push(\n `/* references ${field.reference.model}.${field.reference.field}${field.reference.onDelete ? ` on delete ${field.reference.onDelete}` : \"\"} */`,\n );\n }\n\n columns.push(parts.join(\" \"));\n }\n\n lines.push(columns.join(\",\\n\"));\n lines.push(\");\");\n return lines.join(\"\\n\");\n}\n\nfunction renderSqlIndexes(model: CollectedSchemaModel, dialect: GenerateFarmSqlDialect) {\n const statements: string[] = [];\n const tableName = quoteIdentifier(dialect, model.modelName);\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (!field.index) {\n continue;\n }\n\n const indexName = `${model.modelName}_${field.name}_idx`;\n statements.push(\n `CREATE INDEX IF NOT EXISTS ${quoteIdentifier(dialect, indexName)} ON ${tableName} (${quoteIdentifier(dialect, field.name)});`,\n );\n }\n\n for (const constraint of model.model.constraints || []) {\n const indexName =\n constraint.name ||\n `${model.modelName}_${constraint.fields.map((fieldKey) => model.model.fields[fieldKey]?.name || fieldKey).join(\"_\")}_${constraint.type}`;\n const fields = constraint.fields\n .map((fieldKey) => quoteIdentifier(dialect, model.model.fields[fieldKey]?.name || fieldKey))\n .join(\", \");\n\n if (constraint.type === \"unique\") {\n statements.push(\n `CREATE UNIQUE INDEX IF NOT EXISTS ${quoteIdentifier(dialect, indexName)} ON ${tableName} (${fields});`,\n );\n } else {\n statements.push(\n `CREATE INDEX IF NOT EXISTS ${quoteIdentifier(dialect, indexName)} ON ${tableName} (${fields});`,\n );\n }\n }\n\n return statements;\n}\n\nfunction createInternalReferenceLookup(\n model: CollectedSchemaModel,\n dialect: GenerateFarmSqlDialect,\n modelLookup: Map<string, CollectedSchemaModel>,\n) {\n const lookup = new Map<string, string>();\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (!field.reference) {\n continue;\n }\n\n const referencedModel = modelLookup.get(`${model.integrationKey}.${field.reference.model}`);\n\n if (referencedModel) {\n const referencedField = field.reference.field;\n const pieces = [\n `REFERENCES ${quoteIdentifier(dialect, referencedModel.modelName)} (${quoteIdentifier(dialect, referencedModel.model.fields[referencedField]?.name || toSnakeCase(referencedField))})`,\n ];\n\n if (field.reference.onDelete) {\n pieces.push(`ON DELETE ${field.reference.onDelete.toUpperCase()}`);\n }\n\n lookup.set(fieldKey, pieces.join(\" \"));\n }\n }\n\n return lookup;\n}\n\nfunction getSqlColumnType(field: ResolvedSchemaField, dialect: GenerateFarmSqlDialect) {\n if (dialect === \"postgres\") {\n switch (field.type) {\n case \"boolean\":\n return \"BOOLEAN\";\n case \"integer\":\n return \"INTEGER\";\n case \"number\":\n return \"DOUBLE PRECISION\";\n case \"datetime\":\n return \"TIMESTAMPTZ\";\n case \"json\":\n return \"JSONB\";\n default:\n return \"TEXT\";\n }\n }\n\n if (dialect === \"mysql\") {\n switch (field.type) {\n case \"boolean\":\n return \"BOOLEAN\";\n case \"integer\":\n return \"INT\";\n case \"number\":\n return \"DOUBLE\";\n case \"datetime\":\n return \"DATETIME\";\n case \"json\":\n return \"JSON\";\n case \"text\":\n return \"TEXT\";\n default:\n return \"VARCHAR(255)\";\n }\n }\n\n switch (field.type) {\n case \"boolean\":\n case \"integer\":\n return \"INTEGER\";\n case \"number\":\n return \"REAL\";\n default:\n return \"TEXT\";\n }\n}\n\nfunction getSqlDefaultExpression(field: ResolvedSchemaField, dialect: GenerateFarmSqlDialect) {\n if (field.default === undefined) {\n return null;\n }\n\n if (field.type === \"datetime\" && field.default === \"now\") {\n return \"CURRENT_TIMESTAMP\";\n }\n\n if (typeof field.default === \"string\") {\n return `'${escapeString(field.default)}'`;\n }\n\n if (typeof field.default === \"number\") {\n return String(field.default);\n }\n\n if (typeof field.default === \"boolean\") {\n if (dialect === \"sqlite\") {\n return field.default ? \"1\" : \"0\";\n }\n return field.default ? \"TRUE\" : \"FALSE\";\n }\n\n return null;\n}\n\nfunction generateMongoBootstrap(models: readonly CollectedSchemaModel[]) {\n const lines = [\n \"// Generated by Farm.js CLI. Review before committing.\",\n 'import type { Db } from \"mongodb\";',\n \"\",\n \"export async function ensureFarmIntegrationCollections(db: Db) {\",\n ];\n\n for (const model of models) {\n lines.push(` // Integration \"${model.integrationKey}\" model \"${model.modelKey}\"`);\n lines.push(` const ${model.exportName} = db.collection(\"${escapeString(model.modelName)}\");`);\n\n for (const [fieldKey, field] of Object.entries(model.model.fields)) {\n if (field.unique) {\n const options: string[] = [\"unique: true\"];\n if (isNullableField(field)) {\n options.push(\"sparse: true\");\n }\n options.push(`name: \"${escapeString(`${model.modelName}_${field.name}_unique`)}\"`);\n lines.push(\n ` await ${model.exportName}.createIndex({ ${JSON.stringify(field.name)}: 1 }, { ${options.join(\", \")} });`,\n );\n } else if (field.index) {\n lines.push(\n ` await ${model.exportName}.createIndex({ ${JSON.stringify(field.name)}: 1 }, { name: \"${escapeString(`${model.modelName}_${field.name}_idx`)}\" });`,\n );\n }\n\n if (field.reference) {\n lines.push(\n ` // ${fieldKey} references ${field.reference.model}.${field.reference.field}${field.reference.onDelete ? ` (onDelete: ${field.reference.onDelete})` : \"\"}`,\n );\n }\n }\n\n for (const constraint of model.model.constraints || []) {\n const indexSpec = constraint.fields\n .map((fieldKey) => `${JSON.stringify(model.model.fields[fieldKey]?.name || fieldKey)}: 1`)\n .join(\", \");\n const indexName =\n constraint.name ||\n `${model.modelName}_${constraint.fields.map((fieldKey) => model.model.fields[fieldKey]?.name || fieldKey).join(\"_\")}_${constraint.type}`;\n const options =\n constraint.type === \"unique\"\n ? `{ unique: true, name: \"${escapeString(indexName)}\" }`\n : `{ name: \"${escapeString(indexName)}\" }`;\n lines.push(` await ${model.exportName}.createIndex({ ${indexSpec} }, ${options});`);\n }\n\n lines.push(\"\");\n }\n\n lines.push(\"}\");\n return lines.join(\"\\n\").trimEnd() + \"\\n\";\n}\n\nasync function writeGeneratedFile(filePath: string, contents: string) {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, contents, \"utf8\");\n}\n\nfunction isNullableField(field: ResolvedSchemaField) {\n return field.nullable === true || field.required === false;\n}\n\nfunction quoteIdentifier(dialect: GenerateFarmSqlDialect, value: string) {\n if (dialect === \"mysql\") {\n return `\\`${value.replace(/`/g, \"``\")}\\``;\n }\n\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction createModelLookup(models: readonly CollectedSchemaModel[]) {\n return new Map(models.map((model) => [`${model.integrationKey}.${model.modelKey}`, model]));\n}\n\nfunction toSnakeCase(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s.-]+/g, \"_\")\n .replace(/__+/g, \"_\")\n .toLowerCase();\n}\n\nfunction toPascalCase(value: string) {\n return value\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[\\s._-]+/g, \" \")\n .split(\" \")\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction toCamelCase(value: string) {\n const pascal = toPascalCase(value);\n return pascal ? pascal.charAt(0).toLowerCase() + pascal.slice(1) : pascal;\n}\n\nfunction escapeString(value: string) {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/'/g, \"''\");\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import {\n getFarmSourceRoots,\n loadConfig,\n resolveConfig,\n type FarmCronJob,\n type ResolvedFarmConfig,\n} from \"@farm.js/core\";\nimport { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pc from \"picocolors\";\n\nexport type FarmDoctorCheckStatus = \"pass\" | \"warn\" | \"fail\" | \"info\";\n\nexport interface FarmDoctorCheck {\n status: FarmDoctorCheckStatus;\n code: string;\n title: string;\n message: string;\n action?: string;\n}\n\nexport interface FarmDoctorReport {\n generatedAt: string;\n source: \"live\" | \"project\";\n health: \"ready\" | \"attention\" | \"error\";\n project: {\n name: string;\n root: string;\n };\n target?: {\n url?: string;\n devtoolsUrl?: string;\n deployment?: string;\n preset?: string;\n };\n runtime?: {\n pages: number;\n layouts: number;\n apiRoutes: number;\n middleware: number;\n integrations: number;\n storageMounts: number;\n cronJobs: number;\n workflows: number;\n };\n summary: Record<FarmDoctorCheckStatus, number>;\n checks: FarmDoctorCheck[];\n fixes?: FarmDoctorFix[];\n}\n\nexport interface FarmDoctorFix {\n code: string;\n title: string;\n filePath: string;\n}\n\nexport interface FarmDoctorOptions {\n root?: string;\n configPath?: string;\n url?: string;\n host?: string;\n port?: number | string;\n offline?: boolean;\n timeoutMs?: number;\n fetch?: typeof globalThis.fetch;\n env?: Record<string, string | undefined>;\n now?: () => Date;\n /** Apply only additive corrections that never overwrite application files. */\n fix?: boolean;\n}\n\ntype LiveSnapshot = {\n generatedAt?: string;\n health?: \"ready\" | \"attention\" | \"error\";\n project: {\n name: string;\n root: string;\n };\n deployment: {\n target: string;\n preset: string;\n };\n counts: {\n pages: number;\n layouts: number;\n apiRoutes: number;\n middleware: number;\n integrations: number;\n storageMounts: number;\n cronJobs: number;\n workflows: number;\n };\n diagnostics: Array<{\n severity: \"error\" | \"warning\" | \"info\";\n code: string;\n title: string;\n message: string;\n action?: string;\n }>;\n};\n\nconst ROUTE_EXTENSIONS = [\"ts\", \"tsx\", \"js\", \"jsx\", \"md\", \"mdx\"];\nconst CONFIG_FILES = [\n \"farm.config.ts\",\n \"farm.config.mts\",\n \"farm.config.js\",\n \"farm.config.mjs\",\n \"config.ts\",\n \"config.mts\",\n \"config.js\",\n \"config.mjs\",\n];\n\nexport async function runFarmDoctor(options: FarmDoctorOptions = {}): Promise<FarmDoctorReport> {\n const root = path.resolve(options.root || process.cwd());\n const liveTarget = resolveLiveTarget(options);\n let liveError: string | undefined;\n\n if (!options.offline && !options.fix) {\n try {\n const snapshot = await fetchLiveSnapshot(liveTarget, options);\n return createLiveReport(snapshot, liveTarget, options.now);\n } catch (error) {\n liveError = formatError(error);\n }\n }\n\n const report = await createProjectReport(root, options);\n if (!options.offline && hasExplicitLiveTarget(options) && liveError) {\n report.checks.unshift({\n status: \"warn\",\n code: \"LIVE_RUNTIME_UNREACHABLE\",\n title: \"Running app was not reachable\",\n message: liveError,\n action: `Start farm dev or verify ${liveTarget}.`,\n });\n report.target = { ...report.target, url: liveTarget };\n finalizeReport(report);\n }\n return report;\n}\n\nexport function formatFarmDoctorReport(\n report: FarmDoctorReport,\n options: { color?: boolean } = {},\n): string {\n const color = options.color === undefined ? pc : pc.createColors(options.color);\n const statusStyle: Record<FarmDoctorCheckStatus, (value: string) => string> = {\n pass: color.inverse,\n warn: color.yellow,\n fail: color.red,\n info: color.cyan,\n };\n const lines = [\n `${color.bold(\"FARM\")} ${color.dim(\"/\")} ${color.bold(\"DOCTOR\")}`,\n `${color.white(report.project.name)} ${color.dim(\"/\")} ${color.dim(report.source === \"live\" ? \"LIVE RUNTIME\" : \"PROJECT\")}`,\n \"\",\n ];\n\n for (const check of report.checks) {\n const label = check.status.toUpperCase().padEnd(4);\n lines.push(`${statusStyle[check.status](label)} ${color.bold(check.title)}`);\n lines.push(` ${color.dim(check.message)}`);\n if (check.action) lines.push(` ${color.dim(`Next: ${check.action}`)}`);\n }\n\n const summary = [\n `${report.summary.pass} passed`,\n `${report.summary.warn} warning${report.summary.warn === 1 ? \"\" : \"s\"}`,\n `${report.summary.fail} failed`,\n `${report.summary.info} info`,\n ].join(\" / \");\n if (report.fixes?.length) {\n lines.push(\"\", color.bold(\"FIXED\"));\n for (const fix of report.fixes) {\n lines.push(` ${color.green(\"✓\")} ${fix.title}`);\n lines.push(` ${color.dim(fix.filePath)}`);\n }\n }\n lines.push(\"\", `${color.bold(\"SUMMARY\")} ${summary}`);\n if (report.target?.devtoolsUrl) {\n lines.push(`${color.bold(\"DEVTOOLS\")} ${report.target.devtoolsUrl}`);\n }\n return lines.join(\"\\n\");\n}\n\nasync function fetchLiveSnapshot(\n baseUrl: string,\n options: FarmDoctorOptions,\n): Promise<LiveSnapshot> {\n const controller = new AbortController();\n const timeoutMs = options.timeoutMs ?? 1_200;\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n timeout.unref?.();\n\n try {\n const response = await (options.fetch || globalThis.fetch)(`${baseUrl}/__farm/devtools.json`, {\n headers: { accept: \"application/json\" },\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(`Devtools returned ${response.status} from ${baseUrl}.`);\n }\n const value = (await response.json()) as unknown;\n if (!isLiveSnapshot(value)) {\n throw new Error(`Devtools at ${baseUrl} returned an unsupported snapshot.`);\n }\n return value;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(`Timed out after ${timeoutMs}ms while probing ${baseUrl}.`);\n }\n if (error instanceof TypeError) {\n throw new Error(`Could not connect to ${baseUrl}.`);\n }\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction createLiveReport(\n snapshot: LiveSnapshot,\n baseUrl: string,\n now: FarmDoctorOptions[\"now\"],\n): FarmDoctorReport {\n const checks: FarmDoctorCheck[] = [\n {\n status: \"pass\",\n code: \"LIVE_RUNTIME_READY\",\n title: \"Connected to the Farm runtime\",\n message: `${formatCount(snapshot.counts.pages, \"page\")}, ${formatCount(snapshot.counts.apiRoutes, \"API route\")}, and ${formatCount(snapshot.counts.middleware, \"middleware layer\")} are registered.`,\n },\n {\n status: \"pass\",\n code: \"DEPLOYMENT_RESOLVED\",\n title: \"Deployment target is resolved\",\n message: `${snapshot.deployment.target} uses the ${snapshot.deployment.preset} preset.`,\n },\n {\n status: \"info\",\n code: \"PRODUCT_SYSTEMS_DISCOVERED\",\n title: \"Product systems are visible\",\n message: `${formatCount(snapshot.counts.integrations, \"integration\")}, ${formatCount(snapshot.counts.storageMounts, \"storage mount\")}, ${formatCount(snapshot.counts.cronJobs, \"cron route\")}, and ${formatCount(snapshot.counts.workflows, \"workflow\")}.`,\n },\n ...snapshot.diagnostics.map((diagnostic) => ({\n status:\n diagnostic.severity === \"error\"\n ? (\"fail\" as const)\n : diagnostic.severity === \"warning\"\n ? (\"warn\" as const)\n : (\"info\" as const),\n code: diagnostic.code,\n title: diagnostic.title,\n message: diagnostic.message,\n ...(diagnostic.action ? { action: diagnostic.action } : {}),\n })),\n ];\n const report: FarmDoctorReport = {\n generatedAt: snapshot.generatedAt || (now?.() || new Date()).toISOString(),\n source: \"live\",\n health: \"ready\",\n project: snapshot.project,\n target: {\n url: baseUrl,\n devtoolsUrl: `${baseUrl}/__farm/devtools`,\n deployment: snapshot.deployment.target,\n preset: snapshot.deployment.preset,\n },\n runtime: { ...snapshot.counts },\n summary: emptySummary(),\n checks,\n };\n finalizeReport(report);\n return report;\n}\n\nasync function createProjectReport(\n root: string,\n options: FarmDoctorOptions,\n): Promise<FarmDoctorReport> {\n const checks: FarmDoctorCheck[] = [];\n const report: FarmDoctorReport = {\n generatedAt: (options.now?.() || new Date()).toISOString(),\n source: \"project\",\n health: \"ready\",\n project: { name: path.basename(root), root },\n summary: emptySummary(),\n checks,\n };\n\n collectNodeCheck(checks);\n collectPackageCheck(root, checks);\n\n let config: ResolvedFarmConfig | undefined;\n let userConfig: Awaited<ReturnType<typeof loadConfig>>;\n try {\n userConfig = await loadConfig(root, options.configPath, \"development\");\n if (!userConfig) {\n checks.push({\n status: \"fail\",\n code: \"CONFIG_MISSING\",\n title: \"Farm config was not found\",\n message: `No Farm config exists under ${root}.`,\n action: \"Add farm.config.ts and export defineConfig({...}).\",\n });\n } else {\n const configRoot = path.resolve(root, userConfig.root || \".\");\n config = await resolveConfig({ ...userConfig, root: configRoot }, \"development\");\n const configFile = findConfigFile(root, options.configPath);\n checks.push({\n status: \"pass\",\n code: \"CONFIG_VALID\",\n title: \"Farm config loads successfully\",\n message: configFile\n ? path.relative(root, configFile) || path.basename(configFile)\n : \"Resolved config\",\n });\n }\n } catch (error) {\n checks.push({\n status: \"fail\",\n code: \"CONFIG_INVALID\",\n title: \"Farm config could not be resolved\",\n message: formatError(error),\n action: \"Fix the config or environment validation error, then run farm doctor again.\",\n });\n }\n\n if (config && userConfig) {\n collectRouterChecks(config, checks);\n report.target = collectDeploymentChecks(config, userConfig, checks);\n collectCronChecks(config, options.env || process.env, checks);\n }\n\n if (config && options.fix) {\n const fixes = applySafeProjectFixes(root, config, checks);\n if (fixes.length) {\n const refreshed = await createProjectReport(root, { ...options, fix: false });\n refreshed.fixes = fixes;\n return refreshed;\n }\n report.fixes = [];\n }\n\n finalizeReport(report);\n return report;\n}\n\nfunction applySafeProjectFixes(\n root: string,\n config: ResolvedFarmConfig,\n checks: readonly FarmDoctorCheck[],\n): FarmDoctorFix[] {\n const fixes: FarmDoctorFix[] = [];\n if (checks.some((check) => check.code === \"ROOT_LAYOUT_MISSING\")) {\n const layoutPath = path.join(config.root, config.srcDir, \"app\", \"layout.tsx\");\n if (!existsSync(layoutPath)) {\n mkdirSync(path.dirname(layoutPath), { recursive: true });\n writeFileSync(\n layoutPath,\n `import type { ReactNode } from \"react\";\\n\\nexport default function RootLayout({ children }: { children: ReactNode }) {\\n return (\\n <html lang=\"en\">\\n <body>{children}</body>\\n </html>\\n );\\n}\\n`,\n { encoding: \"utf8\", flag: \"wx\" },\n );\n fixes.push({\n code: \"ROOT_LAYOUT_CREATED\",\n title: \"Created the missing root layout\",\n filePath: path.relative(root, layoutPath),\n });\n }\n }\n return fixes;\n}\n\nfunction collectNodeCheck(checks: FarmDoctorCheck[]): void {\n const major = Number(process.versions.node.split(\".\")[0]);\n checks.push(\n major >= 18\n ? {\n status: \"pass\",\n code: \"NODE_SUPPORTED\",\n title: \"Node.js is supported\",\n message: `Node ${process.versions.node} satisfies Farm's Node 18+ baseline.`,\n }\n : {\n status: \"fail\",\n code: \"NODE_UNSUPPORTED\",\n title: \"Node.js is too old\",\n message: `Node ${process.versions.node} does not satisfy Farm's Node 18+ baseline.`,\n action: \"Upgrade Node.js to version 18 or newer.\",\n },\n );\n}\n\nfunction collectPackageCheck(root: string, checks: FarmDoctorCheck[]): void {\n const packagePath = path.join(root, \"package.json\");\n if (!existsSync(packagePath)) {\n checks.push({\n status: \"fail\",\n code: \"PACKAGE_MISSING\",\n title: \"package.json was not found\",\n message: `No package manifest exists under ${root}.`,\n action: \"Run the command from a Farm application root.\",\n });\n return;\n }\n\n try {\n const manifest = JSON.parse(readFileSync(packagePath, \"utf8\")) as Record<string, unknown>;\n const dependencies = {\n ...asRecord(manifest.dependencies),\n ...asRecord(manifest.devDependencies),\n ...asRecord(manifest.peerDependencies),\n };\n const version = dependencies[\"@farm.js/core\"];\n checks.push(\n typeof version === \"string\"\n ? {\n status: \"pass\",\n code: \"CORE_INSTALLED\",\n title: \"Farm core is installed\",\n message: `@farm.js/core ${version}`,\n }\n : {\n status: \"fail\",\n code: \"CORE_MISSING\",\n title: \"Farm core is not declared\",\n message: \"@farm.js/core is missing from package.json.\",\n action: \"Install @farm.js/core and add it to the application dependencies.\",\n },\n );\n } catch (error) {\n checks.push({\n status: \"fail\",\n code: \"PACKAGE_INVALID\",\n title: \"package.json is invalid\",\n message: formatError(error),\n action: \"Fix the package manifest JSON.\",\n });\n }\n}\n\nfunction collectRouterChecks(config: ResolvedFarmConfig, checks: FarmDoctorCheck[]): void {\n const sources = getFarmSourceRoots(config);\n const appDirectories = sources.map((source) => path.join(source.root, source.srcDir, \"app\"));\n const hasPages = appDirectories.some((directory) =>\n containsFile(directory, /^page\\.(?:ts|tsx|js|jsx|md|mdx)$/),\n );\n const hasProgrammaticRoutes = sources.some((source) =>\n ROUTE_EXTENSIONS.some((extension) =>\n existsSync(path.join(source.root, source.srcDir, `farm.routes.${extension}`)),\n ),\n );\n checks.push(\n hasPages || hasProgrammaticRoutes\n ? {\n status: \"pass\",\n code: \"APP_ROUTER_READY\",\n title: \"App router has route modules\",\n message: `${config.srcDir}/app and extended layers are discoverable.`,\n }\n : {\n status: \"fail\",\n code: \"NO_PAGE_ROUTES\",\n title: \"No page routes were found\",\n message: `Farm found no page modules under ${config.srcDir}/app.`,\n action: `Add ${config.srcDir}/app/page.tsx or ${config.srcDir}/farm.routes.tsx.`,\n },\n );\n\n const hasRootLayout = appDirectories.some((directory) =>\n ROUTE_EXTENSIONS.some((extension) => existsSync(path.join(directory, `layout.${extension}`))),\n );\n checks.push(\n hasRootLayout\n ? {\n status: \"pass\",\n code: \"ROOT_LAYOUT_READY\",\n title: \"Root layout is present\",\n message: \"Shared metadata and application chrome have a root boundary.\",\n }\n : {\n status: \"warn\",\n code: \"ROOT_LAYOUT_MISSING\",\n title: \"Root layout is missing\",\n message: \"The application has no shared root layout.\",\n action: `Add ${config.srcDir}/app/layout.tsx.`,\n },\n );\n}\n\nfunction collectDeploymentChecks(\n config: ResolvedFarmConfig,\n userConfig: NonNullable<Awaited<ReturnType<typeof loadConfig>>>,\n checks: FarmDoctorCheck[],\n): NonNullable<FarmDoctorReport[\"target\"]> {\n const target = String(config.deploy.target || \"node\");\n const preset = String(config.deploy.preset || config.preset || \"node-server\");\n checks.push({\n status: \"pass\",\n code: \"DEPLOYMENT_RESOLVED\",\n title: \"Deployment target is resolved\",\n message: `${target} uses the ${preset} preset and writes to ${config.deploy.outputDir}.`,\n });\n\n const integrations = Object.values(config.integrations || {}).filter(Boolean).length;\n const storageMounts = getStorageMountCount(config.storage);\n checks.push({\n status: \"info\",\n code: \"PRODUCT_SYSTEMS_DISCOVERED\",\n title: \"Product systems are configured\",\n message: `${formatCount(integrations, \"integration\")} and ${formatCount(storageMounts, \"storage mount\")}.`,\n });\n\n if (\n userConfig.storage &&\n describeRootStorageDriver(userConfig.storage) === \"memory\" &&\n [\"vercel\", \"cloudflare\", \"netlify\"].includes(target)\n ) {\n checks.push({\n status: \"warn\",\n code: \"EPHEMERAL_PRODUCTION_STORAGE\",\n title: \"Production storage is in memory\",\n message: `${target} instances do not preserve in-memory data across executions.`,\n action: \"Configure a durable root storage driver for production state.\",\n });\n }\n\n return { deployment: target, preset };\n}\n\nfunction collectCronChecks(\n config: ResolvedFarmConfig,\n env: Record<string, string | undefined>,\n checks: FarmDoctorCheck[],\n): void {\n const cron = config.cron;\n if (!cron.jobs.length) return;\n\n const missingRoutes = cron.jobs.filter((job) => !hasCronRoute(config, job));\n for (const job of missingRoutes) {\n checks.push({\n status: \"warn\",\n code: \"CRON_ROUTE_MISSING\",\n title: `Cron route ${job.path} was not found`,\n message: `${job.name} is scheduled, but its GET API route is not present in the app directory.`,\n action: \"Add the target API route or update the cron path in farm.config.ts.\",\n });\n }\n if (!env[cron.secretEnv]) {\n checks.push({\n status: \"info\",\n code: \"CRON_SECRET_NOT_SET\",\n title: `${cron.secretEnv} is not set`,\n message: \"Local manual runs remain available, but production cron routes fail closed.\",\n action: `Set ${cron.secretEnv} in the deployment environment before production.`,\n });\n }\n}\n\nfunction hasCronRoute(config: ResolvedFarmConfig, job: FarmCronJob): boolean {\n const relative = job.path.replace(/^\\/+/, \"\").replace(/^api\\//, \"\");\n return getFarmSourceRoots(config).some((source) => {\n const directory = path.join(source.root, source.srcDir, \"app\", \"api\", relative);\n return ROUTE_EXTENSIONS.some((extension) =>\n existsSync(path.join(directory, `route.${extension}`)),\n );\n });\n}\n\nfunction containsFile(directory: string, pattern: RegExp): boolean {\n if (!existsSync(directory)) return false;\n const pending = [directory];\n while (pending.length) {\n const current = pending.pop();\n if (!current) continue;\n for (const entry of readdirSync(current, { withFileTypes: true })) {\n if (entry.isFile() && pattern.test(entry.name)) return true;\n if (entry.isDirectory() && !entry.name.startsWith(\".\")) {\n pending.push(path.join(current, entry.name));\n }\n }\n }\n return false;\n}\n\nfunction getStorageMountCount(storage: unknown): number {\n if (!storage || typeof storage !== \"object\") return 1;\n const mounts = asRecord((storage as Record<string, unknown>).mounts);\n return 1 + Object.keys(mounts).length;\n}\n\nfunction describeRootStorageDriver(storage: unknown): string {\n if (!storage || typeof storage !== \"object\") return \"memory\";\n const value = storage as Record<string, unknown>;\n if (value.kind === \"farm-storage-client\") return \"storage client\";\n if (value.client) return \"storage client\";\n if (typeof value.driver === \"string\") return value.driver;\n if (typeof value.driver === \"function\") return \"custom\";\n return \"memory\";\n}\n\nfunction findConfigFile(root: string, configPath?: string): string | undefined {\n const candidates = configPath ? [configPath, ...CONFIG_FILES] : CONFIG_FILES;\n return candidates\n .map((candidate) => (path.isAbsolute(candidate) ? candidate : path.join(root, candidate)))\n .find(existsSync);\n}\n\nfunction resolveLiveTarget(options: FarmDoctorOptions): string {\n const raw = options.url || `http://${options.host || \"localhost\"}:${options.port || 3000}`;\n return raw.replace(/\\/+$/, \"\");\n}\n\nfunction hasExplicitLiveTarget(options: FarmDoctorOptions): boolean {\n return Boolean(options.url || options.host || options.port);\n}\n\nfunction isLiveSnapshot(value: unknown): value is LiveSnapshot {\n if (!value || typeof value !== \"object\") return false;\n const snapshot = value as Partial<LiveSnapshot>;\n return Boolean(\n snapshot.project &&\n typeof snapshot.project.name === \"string\" &&\n snapshot.deployment &&\n typeof snapshot.deployment.target === \"string\" &&\n snapshot.counts &&\n typeof snapshot.counts.pages === \"number\" &&\n Array.isArray(snapshot.diagnostics),\n );\n}\n\nfunction emptySummary(): Record<FarmDoctorCheckStatus, number> {\n return { pass: 0, warn: 0, fail: 0, info: 0 };\n}\n\nfunction finalizeReport(report: FarmDoctorReport): void {\n const summary = emptySummary();\n for (const check of report.checks) summary[check.status] += 1;\n report.summary = summary;\n report.health = summary.fail > 0 ? \"error\" : summary.warn > 0 ? \"attention\" : \"ready\";\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction formatCount(value: number, noun: string): string {\n return `${value} ${noun}${value === 1 ? \"\" : \"s\"}`;\n}\n","import {\n farmRouteRuleMatches,\n getFarmSourceRoots,\n getFarmPresetRuntime,\n loadConfig,\n mergeFarmRouteRuntimeConfigs,\n resolveConfig,\n resolveFarmRouteRuleRuntimeConfig,\n resolveFarmRouteRuntimeConfig,\n resolveRouteRenderingConfig,\n scanProgrammaticPagePaths,\n type FarmRouteRule,\n type FarmRouteRuntimeConfig,\n} from \"@farm.js/core\";\nimport { existsSync, readFileSync, readdirSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pc from \"picocolors\";\n\nconst ROUTE_EXTENSIONS = [\"tsx\", \"ts\", \"jsx\", \"js\", \"mdx\", \"md\"] as const;\nconst MIDDLEWARE_EXTENSIONS = [\"ts\", \"tsx\", \"js\", \"jsx\", \"mjs\", \"cjs\"] as const;\nconst SOCIAL_IMAGE_EXTENSIONS = [\n \"tsx\",\n \"ts\",\n \"jsx\",\n \"js\",\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"webp\",\n] as const;\n\nexport interface ExplainFarmRouteOptions {\n root?: string;\n configPath?: string;\n}\n\nexport interface FarmRouteExplanation {\n pathname: string;\n pattern: string;\n params: Record<string, string | string[]>;\n filePath: string;\n source: string;\n layouts: string[];\n middleware: Array<{ source: \"file\" | \"config\"; filePath: string }>;\n runtime: {\n runtime: \"auto\" | \"node\" | \"edge\";\n regions?: string[];\n maxDuration?: number;\n };\n rendering: {\n mode: \"static\" | \"partial\" | \"dynamic\" | \"client\";\n reason: string;\n ppr: boolean;\n };\n cache: {\n revalidate?: number | false;\n swr?: number | boolean;\n isr?: number | boolean;\n rules: string[];\n };\n metadata: {\n static: string[];\n dynamic: string[];\n openGraphImage?: string;\n twitterImage?: string;\n };\n deployment: {\n target: string;\n preset: string;\n runtime: \"node\" | \"edge\" | \"unknown\";\n compatible: boolean;\n warnings: string[];\n };\n}\n\ntype PageCandidate = {\n filePath: string;\n pattern: string;\n params: Record<string, string | string[]>;\n source: string;\n priority: number;\n score: number;\n};\n\ntype LayeredRouteFile = {\n filePath: string;\n pattern: string;\n};\n\nexport async function explainFarmRoute(\n pathname: string,\n options: ExplainFarmRouteOptions = {},\n): Promise<FarmRouteExplanation> {\n const root = path.resolve(options.root || process.cwd());\n const userConfig = await loadConfig(root, options.configPath, \"production\");\n const config = await resolveConfig({ root, ...userConfig }, \"production\");\n const normalizedPathname = normalizePathname(pathname, config.basePath || \"/\");\n const candidates = discoverMatchingPages(config, normalizedPathname);\n const page = candidates.sort(\n (left, right) => right.score - left.score || right.priority - left.priority,\n )[0];\n\n if (!page) {\n throw new Error(`No Farm page route matches ${normalizedPathname}.`);\n }\n\n const layouts = collectInheritedRouteFiles(\n config,\n normalizedPathname,\n \"layout\",\n ROUTE_EXTENSIONS,\n );\n const middleware = collectMiddleware(\n root,\n Boolean(userConfig?.middleware && Object.keys(userConfig.middleware).length),\n config,\n normalizedPathname,\n );\n const pageSource = readFileSync(page.filePath, \"utf8\");\n const layoutSources = layouts.map((filePath) => ({\n filePath,\n source: readFileSync(filePath, \"utf8\"),\n }));\n const runtime = resolveFarmRouteRuntimeConfig(\n mergeFarmRouteRuntimeConfigs(\n resolveFarmRouteRuleRuntimeConfig(normalizedPathname, config.routeRules),\n ...layoutSources.map(({ source }) => readRuntimeExports(source)),\n readRuntimeExports(pageSource),\n ),\n `Route ${page.pattern}`,\n );\n const matchingRules = Object.entries(config.routeRules)\n .filter(([pattern]) => farmRouteRuleMatches(pattern, normalizedPathname))\n .sort(([left], [right]) => routeSpecificity(left) - routeSpecificity(right));\n const rendering = resolveRendering(pageSource, matchingRules);\n const cache = resolveCaching(pageSource, matchingRules);\n const metadataSources = [...layoutSources, { filePath: page.filePath, source: pageSource }];\n const openGraphImage = findNearestSocialImage(config, normalizedPathname, \"opengraph-image\");\n const twitterImage = findNearestSocialImage(config, normalizedPathname, \"twitter-image\");\n const preset = String(config.deploy.preset || config.preset || \"node-server\");\n const presetRuntime = getFarmPresetRuntime(preset);\n const compatible =\n rendering.mode === \"static\" ||\n rendering.mode === \"client\" ||\n runtime.runtime === \"auto\" ||\n (presetRuntime !== \"unknown\" && runtime.runtime === presetRuntime);\n const warnings: string[] = [];\n if (presetRuntime === \"unknown\" && runtime.runtime !== \"auto\") {\n warnings.push(\n `Farm cannot verify the ${runtime.runtime} route requirement because the ${preset} preset runtime is unknown.`,\n );\n } else if (!compatible) {\n warnings.push(\n `The route requires ${runtime.runtime}, but the ${preset} preset emits ${presetRuntime} functions.`,\n );\n }\n if (runtime.regions?.length && preset !== \"vercel\" && preset !== \"vercel-edge\") {\n warnings.push(`${preset} does not map Farm per-route region hints.`);\n }\n if (runtime.maxDuration && preset !== \"vercel\") {\n warnings.push(`${preset} does not map Farm per-route maxDuration.`);\n }\n\n return {\n pathname: normalizedPathname,\n pattern: page.pattern,\n params: page.params,\n filePath: toProjectPath(root, page.filePath),\n source: page.source,\n layouts: layouts.map((filePath) => toProjectPath(root, filePath)),\n middleware,\n runtime,\n rendering,\n cache,\n metadata: {\n static: metadataSources\n .filter(({ source }) => /export\\s+const\\s+metadata\\b/.test(source))\n .map(({ filePath }) => toProjectPath(root, filePath)),\n dynamic: metadataSources\n .filter(({ source }) =>\n /export\\s+(?:async\\s+)?function\\s+generateMetadata\\b|export\\s+const\\s+generateMetadata\\b/.test(\n source,\n ),\n )\n .map(({ filePath }) => toProjectPath(root, filePath)),\n ...(openGraphImage ? { openGraphImage: toProjectPath(root, openGraphImage) } : {}),\n ...(twitterImage ? { twitterImage: toProjectPath(root, twitterImage) } : {}),\n },\n deployment: {\n target: String(config.deploy.target || \"node\"),\n preset,\n runtime: presetRuntime,\n compatible,\n warnings,\n },\n };\n}\n\nexport function formatFarmRouteExplanation(\n explanation: FarmRouteExplanation,\n options: { color?: boolean } = {},\n): string {\n const color = options.color === undefined ? pc : pc.createColors(options.color);\n const lines = [\n color.bold(\"FARM / EXPLAIN\"),\n \"\",\n `${color.bold(\"Path\")} ${explanation.pathname}`,\n `${color.bold(\"Pattern\")} ${explanation.pattern}`,\n `${color.bold(\"File\")} ${explanation.filePath}`,\n `${color.bold(\"Source\")} ${explanation.source}`,\n `${color.bold(\"Params\")} ${formatParams(explanation.params)}`,\n `${color.bold(\"Layouts\")} ${explanation.layouts.length ? explanation.layouts.join(\" -> \") : \"none\"}`,\n `${color.bold(\"Middleware\")} ${explanation.middleware.length ? explanation.middleware.map((entry) => entry.filePath).join(\", \") : \"none\"}`,\n `${color.bold(\"Runtime\")} ${formatRuntime(explanation.runtime)}`,\n `${color.bold(\"Rendering\")} ${explanation.rendering.mode} (${explanation.rendering.reason})${explanation.rendering.ppr ? \", PPR\" : \"\"}`,\n `${color.bold(\"Caching\")} ${formatCaching(explanation.cache)}`,\n `${color.bold(\"Metadata\")} ${formatMetadata(explanation.metadata)}`,\n `${color.bold(\"Deployment\")} ${explanation.deployment.target} / ${explanation.deployment.preset} — ${explanation.deployment.compatible ? color.green(\"compatible\") : color.red(\"incompatible\")}`,\n ];\n for (const warning of explanation.deployment.warnings)\n lines.push(` ${color.yellow(\"!\")} ${warning}`);\n return lines.join(\"\\n\");\n}\n\nfunction discoverMatchingPages(\n config: Awaited<ReturnType<typeof resolveConfig>>,\n pathname: string,\n) {\n const candidates: PageCandidate[] = [];\n for (const [priority, source] of getFarmSourceRoots(config).entries()) {\n const appDirectory = path.join(source.root, source.srcDir, \"app\");\n if (existsSync(appDirectory)) {\n for (const filePath of walkFiles(appDirectory)) {\n if (!/^page\\.(?:tsx?|jsx?|mdx?)$/.test(path.basename(filePath))) continue;\n const relativeDirectory = path.relative(appDirectory, path.dirname(filePath));\n if (\n relativeDirectory.split(path.sep).includes(\"api\") ||\n isRouteSlotDirectory(relativeDirectory)\n ) {\n continue;\n }\n const pattern = directoryToRoutePattern(relativeDirectory);\n const match = matchRoutePattern(pattern, pathname);\n if (!match) continue;\n candidates.push({\n filePath,\n pattern,\n params: match.params,\n score: match.score,\n source: source.name,\n priority,\n });\n }\n }\n\n const sourceDirectory = path.join(source.root, source.srcDir);\n if (!existsSync(sourceDirectory)) continue;\n for (const filePath of walkFiles(sourceDirectory)) {\n if (!/\\.(?:tsx?|jsx?)$/.test(filePath) || filePath.endsWith(\".d.ts\")) continue;\n const moduleSource = readFileSync(filePath, \"utf8\");\n for (const pattern of scanProgrammaticPagePaths(moduleSource)) {\n const match = matchRoutePattern(pattern, pathname);\n if (!match) continue;\n candidates.push({\n filePath,\n pattern,\n params: match.params,\n score: match.score,\n source: source.name,\n priority,\n });\n }\n }\n }\n return candidates;\n}\n\nfunction isRouteSlotDirectory(relativeDirectory: string): boolean {\n return relativeDirectory.split(path.sep).some((segment) => /^@[A-Za-z][\\w-]*$/.test(segment));\n}\n\nfunction walkFiles(directory: string): string[] {\n const files: string[] = [];\n const pending = [directory];\n while (pending.length) {\n const current = pending.pop()!;\n for (const entry of readdirSync(current, { withFileTypes: true })) {\n const entryPath = path.join(current, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n pending.push(entryPath);\n continue;\n }\n files.push(entryPath);\n }\n }\n return files;\n}\n\nfunction directoryToRoutePattern(relativeDirectory: string): string {\n const segments = relativeDirectory\n .split(path.sep)\n .filter(Boolean)\n .filter((segment) => !/^\\(.+\\)$/.test(segment) && !segment.startsWith(\"@\"))\n .map((segment) => segment.replace(/^\\(\\.{1,3}\\)/, \"\"));\n return segments.length ? `/${segments.join(\"/\")}` : \"/\";\n}\n\nfunction matchRoutePattern(pattern: string, pathname: string) {\n const patternSegments = splitPath(pattern);\n const pathSegments = splitPath(pathname);\n const params: Record<string, string | string[]> = {};\n let score = 0;\n let pathIndex = 0;\n\n for (const segment of patternSegments) {\n const optionalCatchAll = segment.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/);\n if (optionalCatchAll) {\n params[optionalCatchAll[1]] = pathSegments.slice(pathIndex);\n pathIndex = pathSegments.length;\n score += 1;\n continue;\n }\n const catchAll = segment.match(/^\\[\\.\\.\\.(.+)\\]$/);\n if (catchAll) {\n if (pathIndex >= pathSegments.length) return null;\n params[catchAll[1]] = pathSegments.slice(pathIndex);\n pathIndex = pathSegments.length;\n score += 10;\n continue;\n }\n const dynamic = segment.match(/^\\[(.+)\\]$/);\n if (dynamic) {\n if (pathIndex >= pathSegments.length) return null;\n params[dynamic[1]] = pathSegments[pathIndex++];\n score += 50;\n continue;\n }\n if (segment !== pathSegments[pathIndex++]) return null;\n score += 100;\n }\n\n return pathIndex === pathSegments.length ? { params, score } : null;\n}\n\nfunction collectInheritedRouteFiles(\n config: Awaited<ReturnType<typeof resolveConfig>>,\n pathname: string,\n baseName: string,\n extensions: readonly string[],\n): string[] {\n return collectLayeredRouteFiles(config, baseName, extensions)\n .filter((entry) => matchesRoutePrefix(entry.pattern, pathname))\n .sort(compareInheritedRouteFiles)\n .map((entry) => entry.filePath);\n}\n\nfunction collectMiddleware(\n root: string,\n hasConfigMiddleware: boolean,\n config: Awaited<ReturnType<typeof resolveConfig>>,\n pathname: string,\n): FarmRouteExplanation[\"middleware\"] {\n const rootMiddleware = new Map<string, LayeredRouteFile>();\n for (const source of getFarmSourceRoots(config)) {\n const filePath = findFile(\n path.join(source.root, source.srcDir),\n \"middleware\",\n MIDDLEWARE_EXTENSIONS,\n );\n if (filePath) {\n rootMiddleware.set(\"root\", {\n filePath,\n pattern: \"/\",\n });\n }\n }\n const files = [\n ...rootMiddleware.values(),\n ...collectLayeredRouteFiles(config, \"middleware\", MIDDLEWARE_EXTENSIONS).filter((entry) =>\n matchesRoutePrefix(entry.pattern, pathname),\n ),\n ]\n .sort(compareInheritedRouteFiles)\n .map((entry) => entry.filePath);\n return [\n ...(hasConfigMiddleware\n ? [{ source: \"config\" as const, filePath: \"farm.config (middleware)\" }]\n : []),\n ...files.map((filePath) => ({\n source: \"file\" as const,\n filePath: toProjectPath(root, filePath),\n })),\n ];\n}\n\nfunction collectLayeredRouteFiles(\n config: Awaited<ReturnType<typeof resolveConfig>>,\n baseName: string,\n extensions: readonly string[],\n): LayeredRouteFile[] {\n const files = new Map<string, LayeredRouteFile>();\n const filePattern = new RegExp(\n `^${escapeRegExp(baseName)}\\\\.(?:${extensions.map(escapeRegExp).join(\"|\")})$`,\n );\n\n for (const source of getFarmSourceRoots(config)) {\n const appDirectory = path.join(source.root, source.srcDir, \"app\");\n if (!existsSync(appDirectory)) continue;\n for (const filePath of walkFiles(appDirectory)) {\n if (!filePattern.test(path.basename(filePath))) continue;\n const relativeDirectory = path.relative(appDirectory, path.dirname(filePath));\n const pattern = directoryToRoutePattern(relativeDirectory);\n files.set(pattern, {\n filePath,\n pattern,\n });\n }\n }\n\n return [...files.values()];\n}\n\nfunction findNearestSocialImage(\n config: Awaited<ReturnType<typeof resolveConfig>>,\n pathname: string,\n baseName: string,\n) {\n return collectLayeredRouteFiles(config, baseName, SOCIAL_IMAGE_EXTENSIONS)\n .filter((entry) => matchesRoutePrefix(entry.pattern, pathname))\n .sort((left, right) => compareInheritedRouteFiles(right, left))[0]?.filePath;\n}\n\nfunction compareInheritedRouteFiles(left: LayeredRouteFile, right: LayeredRouteFile): number {\n return splitPath(left.pattern).length - splitPath(right.pattern).length;\n}\n\nfunction matchesRoutePrefix(pattern: string, pathname: string): boolean {\n const patternSegments = splitPath(pattern);\n const pathSegments = splitPath(pathname);\n if (patternSegments.length > pathSegments.length) return false;\n\n return patternSegments.every((segment, index) => {\n if (/^\\[{1,2}(?:\\.\\.\\.)?.+\\]{1,2}$/.test(segment)) return true;\n return segment === pathSegments[index];\n });\n}\n\nfunction findFile(directory: string, baseName: string, extensions: readonly string[]) {\n return extensions\n .map((extension) => path.join(directory, `${baseName}.${extension}`))\n .find(existsSync);\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction readRuntimeExports(source: string): FarmRouteRuntimeConfig {\n const runtime = readStringExport(source, \"runtime\");\n const maxDuration = readNumberOrAutoExport(source, \"maxDuration\");\n const regions = readStringArrayOrAutoExport(source, \"regions\");\n return {\n ...(runtime === \"auto\" || runtime === \"node\" || runtime === \"edge\" ? { runtime } : {}),\n ...(regions ? { regions } : {}),\n ...(maxDuration !== undefined ? { maxDuration } : {}),\n };\n}\n\nfunction resolveRendering(\n pageSource: string,\n matchingRules: Array<[string, FarmRouteRule]>,\n): FarmRouteExplanation[\"rendering\"] {\n const pageRendering = resolveRouteRenderingConfig(\n {\n ...(readBooleanExport(pageSource, \"ssg\") !== undefined\n ? { ssg: readBooleanExport(pageSource, \"ssg\") }\n : {}),\n ...(readBooleanExport(pageSource, \"ppr\") !== undefined\n ? { ppr: readBooleanExport(pageSource, \"ppr\") }\n : {}),\n ...(readBooleanExport(pageSource, \"experimental_ppr\") !== undefined\n ? { experimental_ppr: readBooleanExport(pageSource, \"experimental_ppr\") }\n : {}),\n ...(readNumberOrFalseExport(pageSource, \"revalidate\") !== undefined\n ? { revalidate: readNumberOrFalseExport(pageSource, \"revalidate\") }\n : {}),\n ...(readDynamicExport(pageSource) ? { dynamic: readDynamicExport(pageSource) } : {}),\n },\n pageSource,\n );\n let mode: FarmRouteExplanation[\"rendering\"][\"mode\"] = pageRendering.ssg\n ? \"static\"\n : pageRendering.ppr\n ? \"partial\"\n : \"dynamic\";\n let reason = pageRendering.directive\n ? `page directive ${JSON.stringify(pageRendering.directive)}`\n : pageRendering.ssg\n ? \"page static rendering declaration\"\n : pageRendering.ppr\n ? \"page PPR declaration\"\n : \"default server rendering\";\n let ppr = pageRendering.ppr;\n\n for (const [pattern, rule] of matchingRules) {\n if (rule.prerender === true || rule.render === \"static\") {\n mode = \"static\";\n reason = `routeRules ${pattern}`;\n ppr = false;\n } else if (rule.prerender === false || rule.render === \"dynamic\" || rule.ssr === true) {\n mode = \"dynamic\";\n reason = `routeRules ${pattern}`;\n ppr = false;\n } else if (rule.ssr === false) {\n mode = \"client\";\n reason = `routeRules ${pattern}`;\n ppr = false;\n }\n }\n return { mode, reason, ppr };\n}\n\nfunction resolveCaching(\n pageSource: string,\n matchingRules: Array<[string, FarmRouteRule]>,\n): FarmRouteExplanation[\"cache\"] {\n let swr: number | boolean | undefined;\n let isr: number | boolean | undefined;\n for (const [, rule] of matchingRules) {\n if (typeof rule.swr === \"number\" || typeof rule.swr === \"boolean\") swr = rule.swr;\n if (typeof rule.isr === \"number\" || typeof rule.isr === \"boolean\") isr = rule.isr;\n }\n return {\n ...(readNumberOrFalseExport(pageSource, \"revalidate\") !== undefined\n ? { revalidate: readNumberOrFalseExport(pageSource, \"revalidate\") }\n : {}),\n ...(swr !== undefined ? { swr } : {}),\n ...(isr !== undefined ? { isr } : {}),\n rules: matchingRules.map(([pattern]) => pattern),\n };\n}\n\nfunction readStringExport(source: string, name: string): string | undefined {\n return source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*[\"']([^\"']+)[\"']`))?.[1];\n}\n\nfunction readDynamicExport(\n source: string,\n): \"auto\" | \"force-dynamic\" | \"error\" | \"force-static\" | undefined {\n const dynamic = readStringExport(source, \"dynamic\");\n return dynamic === \"auto\" ||\n dynamic === \"force-dynamic\" ||\n dynamic === \"error\" ||\n dynamic === \"force-static\"\n ? dynamic\n : undefined;\n}\n\nfunction readBooleanExport(source: string, name: string): boolean | undefined {\n const value = source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*(true|false)`))?.[1];\n return value === undefined ? undefined : value === \"true\";\n}\n\nfunction readNumberOrAutoExport(source: string, name: string): number | \"auto\" | undefined {\n const value = source.match(\n new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*(?:[\"'](auto)[\"']|(\\\\d+))`),\n );\n return value?.[1] === \"auto\" ? \"auto\" : value?.[2] ? Number(value[2]) : undefined;\n}\n\nfunction readNumberOrFalseExport(source: string, name: string): number | false | undefined {\n const value = source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*(false|\\\\d+)`))?.[1];\n return value === \"false\" ? false : value ? Number(value) : undefined;\n}\n\nfunction readStringArrayOrAutoExport(source: string, name: string): \"auto\" | string[] | undefined {\n const auto = source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*[\"']auto[\"']`));\n if (auto) return \"auto\";\n const array = source.match(new RegExp(`export\\\\s+const\\\\s+${name}\\\\s*=\\\\s*\\\\[([^\\\\]]*)\\\\]`))?.[1];\n if (array === undefined) return undefined;\n return [...array.matchAll(/[\"']([^\"']+)[\"']/g)].map((match) => match[1]);\n}\n\nfunction routeSpecificity(pattern: string): number {\n return splitPath(pattern).reduce((score, segment) => {\n if (segment === \"**\" || segment.startsWith(\"[[...\")) return score + 1;\n if (segment === \"*\" || segment.startsWith(\"[...\")) return score + 10;\n if (segment.startsWith(\"[\") || segment.startsWith(\":\")) return score + 50;\n return score + 100;\n }, 0);\n}\n\nfunction normalizePathname(value: string, basePath: string): string {\n let pathname: string;\n try {\n pathname = new URL(value, \"http://farm.local\").pathname;\n } catch {\n pathname = value;\n }\n pathname = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n const normalizedBase =\n basePath && basePath !== \"/\" ? `/${basePath.replace(/^\\/+|\\/+$/g, \"\")}` : \"\";\n if (\n normalizedBase &&\n (pathname === normalizedBase || pathname.startsWith(`${normalizedBase}/`))\n ) {\n pathname = pathname.slice(normalizedBase.length) || \"/\";\n }\n return pathname.length > 1 ? pathname.replace(/\\/+$/, \"\") : pathname;\n}\n\nfunction splitPath(value: string) {\n return value.split(\"/\").filter(Boolean).map(decodeURIComponent);\n}\n\nfunction toProjectPath(root: string, filePath: string) {\n let relativePath = path.relative(root, filePath);\n if (\n (relativePath === \"..\" || relativePath.startsWith(`..${path.sep}`)) &&\n existsSync(root) &&\n existsSync(filePath)\n ) {\n relativePath = path.relative(realpathSync(root), realpathSync(filePath));\n }\n return relativePath.split(path.sep).join(\"/\");\n}\n\nfunction formatParams(params: FarmRouteExplanation[\"params\"]) {\n const entries = Object.entries(params);\n return entries.length\n ? entries\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(\"/\") : value}`)\n .join(\", \")\n : \"none\";\n}\n\nfunction formatRuntime(runtime: FarmRouteExplanation[\"runtime\"]) {\n return [\n runtime.runtime,\n runtime.regions?.length ? `regions=${runtime.regions.join(\",\")}` : \"\",\n runtime.maxDuration ? `maxDuration=${runtime.maxDuration}s` : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n}\n\nfunction formatCaching(cache: FarmRouteExplanation[\"cache\"]) {\n const values = [\n cache.revalidate !== undefined ? `revalidate=${cache.revalidate}` : \"\",\n cache.swr !== undefined ? `swr=${cache.swr}` : \"\",\n cache.isr !== undefined ? `isr=${cache.isr}` : \"\",\n cache.rules.length ? `rules=${cache.rules.join(\",\")}` : \"\",\n ].filter(Boolean);\n return values.length ? values.join(\"; \") : \"request-time / no declared cache\";\n}\n\nfunction formatMetadata(metadata: FarmRouteExplanation[\"metadata\"]) {\n const values = [\n metadata.static.length ? `static=${metadata.static.join(\",\")}` : \"\",\n metadata.dynamic.length ? `dynamic=${metadata.dynamic.join(\",\")}` : \"\",\n metadata.openGraphImage ? `og=${metadata.openGraphImage}` : \"\",\n metadata.twitterImage ? `twitter=${metadata.twitterImage}` : \"\",\n ].filter(Boolean);\n return values.length ? values.join(\"; \") : \"none\";\n}\n","import {\n loadConfig,\n logger,\n resolveConfig,\n type FarmCronJob,\n type FarmCronResolvedConfig,\n} from \"@farm.js/core\";\nimport { Cron } from \"croner\";\nimport path from \"node:path\";\n\nexport interface FarmCronCLIOptions {\n root?: string;\n configPath?: string;\n}\n\nexport interface RunFarmCronOptions extends FarmCronCLIOptions {\n url?: string;\n host?: string;\n port?: number | string;\n secret?: string;\n timeoutMs?: number;\n fetch?: typeof globalThis.fetch;\n trigger?: \"manual\" | \"development\";\n}\n\nexport interface FarmCronRunResult {\n job: FarmCronJob;\n url: string;\n status: number;\n body: unknown;\n durationMs: number;\n}\n\nexport interface FarmCronSchedulerEntry {\n job: FarmCronJob;\n schedule: string;\n timer: Cron;\n}\n\nexport interface FarmCronScheduler {\n entries: FarmCronSchedulerEntry[];\n stop: () => void;\n}\n\nexport async function loadFarmCronConfig(\n options: FarmCronCLIOptions = {},\n): Promise<FarmCronResolvedConfig> {\n const root = path.resolve(options.root || process.cwd());\n const userConfig = await loadConfig(root, options.configPath, \"development\");\n if (!userConfig) {\n throw new Error(\"No Farm config found. Create farm.config.ts before configuring cron routes.\");\n }\n\n const resolvedConfig = await resolveConfig({ root, ...userConfig }, \"development\");\n return resolvedConfig.cron;\n}\n\nexport async function listFarmCronJobs(options: FarmCronCLIOptions = {}): Promise<FarmCronJob[]> {\n const cron = await loadFarmCronConfig(options);\n return cron.jobs;\n}\n\nexport function formatFarmCronJobs(jobs: FarmCronJob[]): string {\n if (jobs.length === 0) return \"No cron routes configured in farm.config.ts.\";\n\n const rows = jobs.map((job) => [\n job.name,\n job.schedule.join(\", \"),\n job.path,\n job.description || \"\",\n ]);\n const headings = [\"NAME\", \"SCHEDULE (UTC)\", \"ROUTE\", \"DESCRIPTION\"];\n const widths = headings.map((heading, column) =>\n Math.max(heading.length, ...rows.map((row) => row[column].length)),\n );\n\n return [headings, ...rows]\n .map((row) =>\n row\n .map((value, column) => value.padEnd(widths[column]))\n .join(\" \")\n .trimEnd(),\n )\n .join(\"\\n\");\n}\n\nexport async function runFarmCronJob(\n name: string,\n options: RunFarmCronOptions = {},\n): Promise<FarmCronRunResult> {\n const cron = await loadFarmCronConfig(options);\n const job = cron.jobs.find((entry) => entry.name === name);\n if (!job) {\n const available = cron.jobs.map((entry) => entry.name).join(\", \");\n throw new Error(\n available\n ? `Cron route ${JSON.stringify(name)} was not found. Available routes: ${available}.`\n : `Cron route ${JSON.stringify(name)} was not found. No cron routes are configured.`,\n );\n }\n\n return invokeFarmCronJob(job, cron, options);\n}\n\nexport async function startFarmCronScheduler(\n options: RunFarmCronOptions = {},\n): Promise<FarmCronScheduler> {\n const cron = await loadFarmCronConfig(options);\n const entries: FarmCronSchedulerEntry[] = [];\n\n for (const job of cron.jobs) {\n for (const schedule of job.schedule) {\n const timer = new Cron(\n schedule,\n {\n name: `farm:cron:${job.name}:${schedule}`,\n timezone: \"UTC\",\n protect: () => {\n logger.warn(`Cron ${job.name} skipped an overlapping run.`);\n },\n catch: (error) => {\n logger.error(`Cron ${job.name} failed: ${formatError(error)}`);\n },\n },\n async () => {\n logger.info(`Cron ${job.name} -> ${job.path}`);\n const result = await invokeFarmCronJob(job, cron, {\n ...options,\n trigger: \"development\",\n });\n logger.success(`Cron ${job.name} completed in ${result.durationMs}ms.`);\n },\n );\n entries.push({ job, schedule, timer });\n }\n }\n\n if (entries.length === 0) {\n logger.info(\"No cron routes are configured; the development scheduler is idle.\");\n } else {\n logger.info(\n `Development cron scheduler started with ${entries.length} UTC schedule${entries.length === 1 ? \"\" : \"s\"}.`,\n );\n for (const entry of entries) {\n const nextRun = entry.timer.nextRun();\n logger.info(\n `Cron ${entry.job.name} (${entry.schedule}) next runs ${nextRun?.toISOString() || \"never\"}.`,\n );\n }\n }\n\n return {\n entries,\n stop() {\n for (const entry of entries) entry.timer.stop();\n },\n };\n}\n\nasync function invokeFarmCronJob(\n job: FarmCronJob,\n cron: FarmCronResolvedConfig,\n options: RunFarmCronOptions,\n): Promise<FarmCronRunResult> {\n const target = resolveCronTarget(job, options);\n const headers = new Headers({\n accept: \"application/json\",\n \"x-farm-cron-name\": job.name,\n \"x-farm-cron-trigger\": options.trigger || \"manual\",\n });\n const secret = options.secret ?? process.env[cron.secretEnv];\n if (secret) headers.set(\"authorization\", `Bearer ${secret}`);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 10_000);\n timeout.unref?.();\n const startedAt = Date.now();\n\n try {\n const response = await (options.fetch || globalThis.fetch)(target, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n const body = await readResponseBody(response);\n const durationMs = Date.now() - startedAt;\n if (!response.ok) {\n throw new Error(\n `Cron ${job.name} received ${response.status} from ${job.path}${formatResponseDetail(body)}.`,\n );\n }\n\n return {\n job,\n url: target,\n status: response.status,\n body,\n durationMs,\n };\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(`Cron ${job.name} timed out after ${options.timeoutMs ?? 10_000}ms.`);\n }\n if (error instanceof TypeError) {\n throw new Error(\n `Could not reach ${target}. Start the Farm dev server or pass --url to a running app.`,\n );\n }\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction resolveCronTarget(job: FarmCronJob, options: RunFarmCronOptions): string {\n const baseURL = options.url || `http://${options.host || \"localhost\"}:${options.port || 3000}`;\n const normalizedBase = baseURL.endsWith(\"/\") ? baseURL : `${baseURL}/`;\n return new URL(job.path.replace(/^\\/+/, \"\"), normalizedBase).toString();\n}\n\nasync function readResponseBody(response: Response): Promise<unknown> {\n if (response.status === 204) return null;\n const text = await response.text();\n if (!text) return null;\n if ((response.headers.get(\"content-type\") || \"\").includes(\"application/json\")) {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n }\n return text;\n}\n\nfunction formatResponseDetail(body: unknown): string {\n if (body === null || body === undefined || body === \"\") return \"\";\n const detail = typeof body === \"string\" ? body : JSON.stringify(body);\n return detail ? `: ${detail}` : \"\";\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { loadConfig, logger } from \"@farm.js/core\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, readdir, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\ntype FarmMigrationCommand =\n | string\n | {\n command: string;\n name?: string;\n cwd?: string;\n env?: Record<string, string | undefined>;\n skip?: boolean;\n };\n\ntype FarmMigrationsUserConfig = { commands?: FarmMigrationCommand[] } | FarmMigrationCommand[];\n\nexport interface MigrateFarmOptions {\n root?: string;\n configPath?: string;\n commands?: string[];\n dryRun?: boolean;\n source?: FarmFrameworkMigrationSource | \"inspect\";\n write?: boolean;\n force?: boolean;\n}\n\ninterface ResolvedMigrationCommand {\n command: string;\n name: string;\n cwd: string;\n env?: Record<string, string | undefined>;\n}\n\nexport type FarmFrameworkMigrationSource = \"next\" | \"tanstack\";\n\ntype MigrationOperationKind = \"write-file\" | \"update-package\";\n\nexport interface FrameworkDetection {\n source: FarmFrameworkMigrationSource;\n confidence: number;\n evidence: string[];\n}\n\nexport interface FrameworkMigrationOperation {\n kind: MigrationOperationKind;\n path: string;\n description: string;\n content?: string;\n skipped?: boolean;\n reason?: string;\n changes?: string[];\n}\n\nexport interface FrameworkMigrationPlan {\n source: FarmFrameworkMigrationSource;\n root: string;\n confidence: number;\n evidence: string[];\n operations: FrameworkMigrationOperation[];\n warnings: string[];\n manual: string[];\n}\n\nexport async function migrateFarm(options: MigrateFarmOptions = {}) {\n const root = path.resolve(options.root || process.cwd());\n\n if (options.source) {\n if (options.source === \"inspect\") {\n const detections = await inspectFrameworkMigrations(root);\n printFrameworkInspection(root, detections);\n return detections;\n }\n\n if (!isFrameworkMigrationSource(options.source)) {\n throw new Error(\n `Unsupported migration source \"${options.source}\". Use \"inspect\", \"next\", or \"tanstack\".`,\n );\n }\n\n const plan = await createFrameworkMigrationPlan(root, options.source, {\n force: options.force,\n });\n printFrameworkMigrationPlan(plan, Boolean(options.write && !options.dryRun));\n\n if (!options.write || options.dryRun) {\n logger.info(`Dry run only. Re-run with \"farm migrate ${options.source} --write\" to apply.`);\n return plan;\n }\n\n await applyFrameworkMigrationPlan(plan);\n logger.success(\n `Applied ${formatOperationCount(plan.operations.filter((operation) => !operation.skipped).length)}.`,\n );\n return plan;\n }\n\n const cliCommands = options.commands?.filter(Boolean) || [];\n const userConfig = await loadConfig(root, options.configPath, \"development\");\n const configuredCommands = getConfiguredCommands(userConfig?.migrations);\n const commandEntries = cliCommands.length ? cliCommands : configuredCommands;\n const commands = commandEntries\n .map((entry, index) => resolveMigrationCommand(root, entry, index))\n .filter((entry): entry is ResolvedMigrationCommand => !!entry);\n\n if (!commands.length) {\n throw new Error(\n \"No migrations configured. Add migrations.commands to farm.config.ts or pass --command.\",\n );\n }\n\n if (options.dryRun) {\n logger.info(`Found ${formatCount(commands.length)} to run:`);\n for (const command of commands) {\n logger.info(` ${command.name}: ${command.command}`);\n }\n return;\n }\n\n for (const command of commands) {\n logger.info(`Running ${command.name}: ${command.command}`);\n await runMigrationCommand(command);\n }\n\n logger.success(`Ran ${formatCount(commands.length)} successfully.`);\n}\n\nfunction getConfiguredCommands(migrations: FarmMigrationsUserConfig | undefined) {\n if (!migrations) return [];\n if (Array.isArray(migrations)) return migrations;\n return migrations.commands || [];\n}\n\nfunction resolveMigrationCommand(\n root: string,\n entry: FarmMigrationCommand,\n index: number,\n): ResolvedMigrationCommand | null {\n if (typeof entry === \"string\") {\n const command = entry.trim();\n if (!command) {\n throw new Error(`Migration command ${index + 1} is empty.`);\n }\n\n return {\n command,\n name: `migration ${index + 1}`,\n cwd: root,\n };\n }\n\n if (entry.skip) return null;\n const command = entry.command.trim();\n if (!command) {\n throw new Error(`Migration command ${index + 1} is empty.`);\n }\n\n return {\n command,\n name: entry.name || `migration ${index + 1}`,\n cwd: entry.cwd ? path.resolve(root, entry.cwd) : root,\n env: entry.env,\n };\n}\n\nfunction runMigrationCommand(command: ResolvedMigrationCommand) {\n return new Promise<void>((resolve, reject) => {\n const child = spawn(command.command, {\n cwd: command.cwd,\n env: {\n ...process.env,\n ...command.env,\n },\n shell: true,\n stdio: \"inherit\",\n });\n\n child.on(\"error\", reject);\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n const reason = signal ? `signal ${signal}` : `exit code ${code}`;\n reject(new Error(`${command.name} failed with ${reason}.`));\n });\n });\n}\n\nfunction formatCount(count: number) {\n return `${count} migration command${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction formatOperationCount(count: number) {\n return `${count} migration operation${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction isFrameworkMigrationSource(value: string): value is FarmFrameworkMigrationSource {\n return value === \"next\" || value === \"tanstack\";\n}\n\nexport async function inspectFrameworkMigrations(root: string): Promise<FrameworkDetection[]> {\n const packageJson = await readPackageJson(root);\n const detections = [detectNext(root, packageJson), detectTanStack(root, packageJson)]\n .filter((entry): entry is FrameworkDetection => entry.confidence > 0)\n .sort((a, b) => b.confidence - a.confidence);\n\n return detections;\n}\n\nexport async function createFrameworkMigrationPlan(\n root: string,\n source: FarmFrameworkMigrationSource,\n options: { force?: boolean } = {},\n): Promise<FrameworkMigrationPlan> {\n const detections = await inspectFrameworkMigrations(root);\n const detection =\n detections.find((entry) => entry.source === source) ||\n ({\n source,\n confidence: 0,\n evidence: [`No ${source} markers detected.`],\n } satisfies FrameworkDetection);\n\n const packageJson = await readPackageJson(root);\n const plan: FrameworkMigrationPlan = {\n source,\n root,\n confidence: detection.confidence,\n evidence: detection.evidence,\n operations: [],\n warnings: [],\n manual: [],\n };\n\n if (source === \"next\") {\n await planNextMigration(root, packageJson, plan, options);\n } else {\n await planTanStackMigration(root, packageJson, plan, options);\n }\n\n addSharedFarmFiles(root, packageJson, plan, options);\n return plan;\n}\n\nasync function planNextMigration(\n root: string,\n packageJson: any,\n plan: FrameworkMigrationPlan,\n options: { force?: boolean },\n) {\n const rootAppDir = path.join(root, \"app\");\n const srcAppDir = path.join(root, \"src\", \"app\");\n const sourceAppDir = existsSync(rootAppDir)\n ? rootAppDir\n : existsSync(srcAppDir)\n ? srcAppDir\n : null;\n\n if (!sourceAppDir) {\n plan.warnings.push(\"No Next App Router directory found at app/ or src/app/.\");\n if (existsSync(path.join(root, \"pages\"))) {\n plan.manual.push(\n \"Pages Router files in pages/ need manual conversion to src/app/**/page.tsx.\",\n );\n }\n return;\n }\n\n const allFiles = await collectFiles(sourceAppDir);\n const files = allFiles.filter(isMigratableTextFile);\n for (const file of allFiles) {\n if (!isMigratableTextFile(file)) {\n plan.manual.push(`Move or review non-code app asset ${toPosix(path.relative(root, file))}.`);\n }\n }\n\n for (const file of files) {\n const relative = path.relative(sourceAppDir, file);\n const target = path.join(srcAppDir, relative);\n const content = await readFile(file, \"utf8\");\n const transformed = transformNextContent(content);\n\n collectNextManualNotes(relative, transformed, plan);\n await addWriteFileOperation(plan, {\n root,\n source: file,\n target,\n content: transformed,\n description:\n sourceAppDir === srcAppDir\n ? `Update Next-compatible app file ${toPosix(path.join(\"src/app\", relative))}`\n : `Copy Next App Router file to ${toPosix(path.join(\"src/app\", relative))}`,\n force: options.force,\n allowExisting: sourceAppDir === srcAppDir,\n });\n }\n\n const rootMiddleware = [\"middleware.ts\", \"middleware.tsx\", \"middleware.js\", \"middleware.jsx\"]\n .map((file) => path.join(root, file))\n .find((file) => existsSync(file));\n\n if (rootMiddleware) {\n const extension = path.extname(rootMiddleware);\n const target = path.join(srcAppDir, `middleware${extension}`);\n await addWriteFileOperation(plan, {\n root,\n source: rootMiddleware,\n target,\n content: await readFile(rootMiddleware, \"utf8\"),\n description: `Copy root middleware to ${toPosix(path.join(\"src/app\", `middleware${extension}`))}`,\n force: options.force,\n });\n plan.manual.push(\n \"Review migrated middleware for next/server APIs; Farm middleware uses @farm.js/core/middleware.\",\n );\n }\n\n if (\n existsSync(path.join(root, \"next.config.js\")) ||\n existsSync(path.join(root, \"next.config.mjs\"))\n ) {\n plan.manual.push(\n \"Review next.config.* and move equivalent settings into farm.config.ts or Vite config.\",\n );\n }\n\n if (packageJson) {\n const migratedPackage = createMigratedPackageJson(packageJson, \"next\");\n addPackageOperation(root, plan, migratedPackage);\n }\n}\n\nasync function planTanStackMigration(\n root: string,\n packageJson: any,\n plan: FrameworkMigrationPlan,\n options: { force?: boolean },\n) {\n const routesDir = [path.join(root, \"src\", \"routes\"), path.join(root, \"routes\")].find((dir) =>\n existsSync(dir),\n );\n\n if (!routesDir) {\n plan.warnings.push(\"No TanStack Router file-route directory found at src/routes/ or routes/.\");\n return;\n }\n\n const appDir = path.join(root, \"src\", \"app\");\n const files = (await collectFiles(routesDir)).filter((file) => {\n const basename = path.basename(file);\n return (\n /\\.(tsx|ts|jsx|js)$/.test(file) &&\n basename !== \"routeTree.gen.ts\" &&\n basename !== \"routeTree.gen.tsx\"\n );\n });\n\n for (const file of files) {\n const target = getTanStackTargetPath(routesDir, file, appDir);\n if (!target) {\n plan.manual.push(\n `Review ${toPosix(path.relative(root, file))}; root routes and route trees are not copied automatically.`,\n );\n continue;\n }\n\n const original = await readFile(file, \"utf8\");\n const transformed = transformTanStackContent(original, path.relative(root, file), plan);\n await addWriteFileOperation(plan, {\n root,\n source: file,\n target,\n content: transformed,\n description: `Convert TanStack route to ${toPosix(path.relative(root, target))}`,\n force: options.force,\n });\n }\n\n plan.manual.push(\n \"Review loaders, beforeLoad hooks, search params, and Route.use* calls; Farm page modules should move that logic into props, API routes, or server helpers.\",\n );\n\n if (packageJson) {\n const migratedPackage = createMigratedPackageJson(packageJson, \"tanstack\");\n addPackageOperation(root, plan, migratedPackage);\n }\n}\n\nfunction addSharedFarmFiles(\n root: string,\n packageJson: any,\n plan: FrameworkMigrationPlan,\n options: { force?: boolean },\n) {\n const farmConfigPath = [\"farm.config.ts\", \"farm.config.mts\", \"farm.config.js\", \"farm.config.mjs\"]\n .map((file) => path.join(root, file))\n .find((file) => existsSync(file));\n\n if (!farmConfigPath) {\n const output = `import { defineConfig } from \"@farm.js/core\";\n\nexport default defineConfig({});\n`;\n\n plan.operations.push({\n kind: \"write-file\",\n path: path.join(root, \"farm.config.ts\"),\n description: \"Create farm.config.ts\",\n content: output,\n skipped: false,\n });\n }\n\n const layoutPath = path.join(root, \"src\", \"app\", \"layout.tsx\");\n if (!existsSync(layoutPath)) {\n plan.operations.push({\n kind: \"write-file\",\n path: layoutPath,\n description: \"Create a minimal root layout\",\n content: `import type { LayoutProps } from \"@farm.js/core\";\n\nexport default function Layout({ children }: LayoutProps) {\n return <>{children}</>;\n}\n`,\n skipped: false,\n });\n }\n\n if (!packageJson) {\n plan.warnings.push(\"No package.json found; add @farm.js/core and @farm.js/cli manually.\");\n }\n}\n\nasync function addWriteFileOperation(\n plan: FrameworkMigrationPlan,\n options: {\n root: string;\n source?: string;\n target: string;\n content: string;\n description: string;\n force?: boolean;\n allowExisting?: boolean;\n },\n) {\n const exists = existsSync(options.target);\n const sameFile = options.source && path.resolve(options.source) === path.resolve(options.target);\n const skipped = exists && !sameFile && !options.allowExisting && !options.force;\n\n plan.operations.push({\n kind: \"write-file\",\n path: options.target,\n description: options.description,\n content: options.content,\n skipped,\n reason: skipped\n ? `${toPosix(path.relative(options.root, options.target))} already exists; pass --force to overwrite.`\n : undefined,\n });\n}\n\nfunction addPackageOperation(\n root: string,\n plan: FrameworkMigrationPlan,\n migrated: { packageJson: any; changes: string[] },\n) {\n if (!migrated.changes.length) return;\n\n plan.operations.push({\n kind: \"update-package\",\n path: path.join(root, \"package.json\"),\n description: \"Update package.json scripts and Farm dependencies\",\n content: `${JSON.stringify(migrated.packageJson, null, 2)}\\n`,\n changes: migrated.changes,\n });\n}\n\nasync function applyFrameworkMigrationPlan(plan: FrameworkMigrationPlan) {\n for (const operation of plan.operations) {\n if (operation.skipped) {\n logger.warn(\n `Skipped ${toPosix(path.relative(plan.root, operation.path))}: ${operation.reason}`,\n );\n continue;\n }\n\n if (operation.kind === \"write-file\" || operation.kind === \"update-package\") {\n await mkdir(path.dirname(operation.path), { recursive: true });\n await writeFile(operation.path, operation.content || \"\", \"utf8\");\n }\n }\n}\n\nfunction printFrameworkInspection(root: string, detections: FrameworkDetection[]) {\n logger.info(`Migration inspection for ${root}`);\n\n if (!detections.length) {\n logger.warn(\"No supported framework detected yet. Supported sources: next, tanstack.\");\n return;\n }\n\n for (const detection of detections) {\n logger.info(`${detection.source}: ${detection.confidence}% confidence`);\n for (const evidence of detection.evidence) {\n logger.info(` - ${evidence}`);\n }\n }\n}\n\nfunction printFrameworkMigrationPlan(plan: FrameworkMigrationPlan, willWrite: boolean) {\n logger.info(\n `${willWrite ? \"Applying\" : \"Prepared\"} ${plan.source} migration plan (${plan.confidence}% confidence):`,\n );\n\n for (const evidence of plan.evidence) {\n logger.info(` evidence: ${evidence}`);\n }\n\n if (!plan.operations.length) {\n logger.warn(\"No file operations were planned.\");\n } else {\n logger.info(\"Operations:\");\n for (const operation of plan.operations) {\n const marker = operation.skipped ? \"skip\" : willWrite ? \"write\" : \"plan\";\n logger.info(` [${marker}] ${operation.description}`);\n if (operation.changes?.length) {\n for (const change of operation.changes) {\n logger.info(` - ${change}`);\n }\n }\n if (operation.reason) {\n logger.info(` ${operation.reason}`);\n }\n }\n }\n\n if (plan.warnings.length) {\n logger.warn(\"Warnings:\");\n for (const warning of unique(plan.warnings)) {\n logger.warn(` - ${warning}`);\n }\n }\n\n if (plan.manual.length) {\n logger.info(\"Manual review:\");\n for (const note of unique(plan.manual)) {\n logger.info(` - ${note}`);\n }\n }\n}\n\nfunction detectNext(root: string, packageJson: any): FrameworkDetection {\n const evidence: string[] = [];\n let confidence = 0;\n\n if (hasPackage(packageJson, \"next\")) {\n confidence += 55;\n evidence.push(\"package.json depends on next\");\n }\n if (existsSync(path.join(root, \"app\"))) {\n confidence += 30;\n evidence.push(\"app/ directory exists\");\n }\n if (existsSync(path.join(root, \"src\", \"app\"))) {\n confidence += 25;\n evidence.push(\"src/app/ directory exists\");\n }\n if (\n existsSync(path.join(root, \"next.config.js\")) ||\n existsSync(path.join(root, \"next.config.mjs\"))\n ) {\n confidence += 15;\n evidence.push(\"next.config.* exists\");\n }\n if (existsSync(path.join(root, \"pages\"))) {\n confidence += 10;\n evidence.push(\"pages/ directory exists\");\n }\n\n return { source: \"next\", confidence: Math.min(confidence, 100), evidence };\n}\n\nfunction detectTanStack(root: string, packageJson: any): FrameworkDetection {\n const evidence: string[] = [];\n let confidence = 0;\n\n if (hasPackage(packageJson, \"@tanstack/react-router\")) {\n confidence += 60;\n evidence.push(\"package.json depends on @tanstack/react-router\");\n }\n if (existsSync(path.join(root, \"src\", \"routes\"))) {\n confidence += 35;\n evidence.push(\"src/routes/ directory exists\");\n }\n if (existsSync(path.join(root, \"routes\"))) {\n confidence += 25;\n evidence.push(\"routes/ directory exists\");\n }\n if (existsSync(path.join(root, \"src\", \"routeTree.gen.ts\"))) {\n confidence += 15;\n evidence.push(\"src/routeTree.gen.ts exists\");\n }\n\n return { source: \"tanstack\", confidence: Math.min(confidence, 100), evidence };\n}\n\nasync function collectFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir);\n const files: string[] = [];\n\n for (const entry of entries) {\n if (entry === \"node_modules\" || entry === \".next\" || entry === \".output\") continue;\n const fullPath = path.join(dir, entry);\n const info = await stat(fullPath);\n\n if (info.isDirectory()) {\n files.push(...(await collectFiles(fullPath)));\n } else if (info.isFile()) {\n files.push(fullPath);\n }\n }\n\n return files.sort();\n}\n\nfunction transformNextContent(content: string) {\n return content\n .replace(/import\\s+([A-Za-z_$][\\w$]*)\\s+from\\s+[\"']next\\/link[\"'];?/g, (_match, localName) =>\n localName === \"Link\"\n ? `import { Link } from \"@farm.js/core/client\";`\n : `import { Link as ${localName} } from \"@farm.js/core/client\";`,\n )\n .replace(/from\\s+[\"']next\\/navigation[\"']/g, `from \"@farm.js/core/navigation\"`)\n .replace(/from\\s+[\"']next\\/headers[\"']/g, `from \"@farm.js/core/headers\"`);\n}\n\nfunction collectNextManualNotes(relative: string, content: string, plan: FrameworkMigrationPlan) {\n const imports = Array.from(content.matchAll(/from\\s+[\"'](next\\/[^\"']+)[\"']/g)).map(\n (match) => match[1],\n );\n for (const importId of imports) {\n plan.manual.push(`Review ${toPosix(relative)}; it still imports ${importId}.`);\n }\n\n if (/getServerSideProps|getStaticProps|getInitialProps/.test(content)) {\n plan.manual.push(\n `Review ${toPosix(relative)}; Pages Router data functions need manual App Router/Farm conversion.`,\n );\n }\n}\n\nfunction isMigratableTextFile(file: string) {\n return /\\.(ts|tsx|js|jsx|mjs|cjs|md|mdx|css|json|txt)$/.test(file);\n}\n\nfunction getTanStackTargetPath(routesDir: string, file: string, appDir: string) {\n const relative = toPosix(path.relative(routesDir, file));\n const withoutExt = relative.replace(/\\.(tsx|ts|jsx|js)$/, \"\");\n if (withoutExt === \"__root\" || withoutExt === \"routeTree.gen\") return null;\n\n const rawParts = withoutExt\n .split(\"/\")\n .flatMap((segment) => segment.split(\".\"))\n .filter((segment) => segment && !segment.startsWith(\"_\"));\n\n if (!rawParts.length) return null;\n const isIndex = rawParts[rawParts.length - 1] === \"index\";\n const routeParts = (isIndex ? rawParts.slice(0, -1) : rawParts).map(convertTanStackSegment);\n return path.join(appDir, ...routeParts, \"page.tsx\");\n}\n\nfunction convertTanStackSegment(segment: string) {\n if (segment === \"$\") return \"[...splat]\";\n if (segment.startsWith(\"$\")) return `[${segment.slice(1)}]`;\n return segment;\n}\n\nfunction transformTanStackContent(\n content: string,\n relativeFile: string,\n plan: FrameworkMigrationPlan,\n) {\n if (/Route\\.use[A-Z]/.test(content) || /useLoaderData|beforeLoad|loader:/.test(content)) {\n plan.manual.push(`Review ${toPosix(relativeFile)}; it uses TanStack route runtime APIs.`);\n }\n\n if (/export\\s+default\\s+/.test(content)) return content;\n\n const componentName = content.match(/component\\s*:\\s*([A-Za-z_$][\\w$]*)/)?.[1];\n if (!componentName) {\n plan.manual.push(\n `Add a default export to ${toPosix(relativeFile)}; no component: Identifier was found.`,\n );\n return content;\n }\n\n return `${content.trimEnd()}\n\nexport default ${componentName};\n`;\n}\n\nfunction createMigratedPackageJson(packageJson: any, source: FarmFrameworkMigrationSource) {\n const nextPackageJson = cloneJson(packageJson);\n const changes: string[] = [];\n nextPackageJson.scripts = nextPackageJson.scripts || {};\n\n const scriptReplacements =\n source === \"next\"\n ? [\n [\"dev\", \"farm dev\", /(^|\\s)next\\s+dev(\\s|$)/],\n [\"build\", \"farm build\", /(^|\\s)next\\s+build(\\s|$)/],\n [\"start\", \"node .output/server/index.mjs\", /(^|\\s)next\\s+start(\\s|$)/],\n ]\n : [\n [\"dev\", \"farm dev\", /(^|\\s)vite(\\s|$)|(^|\\s)vinxi\\s+dev(\\s|$)/],\n [\"build\", \"farm build\", /(^|\\s)vite\\s+build(\\s|$)|(^|\\s)vinxi\\s+build(\\s|$)/],\n ];\n\n for (const [name, value, matcher] of scriptReplacements as [string, string, RegExp][]) {\n const existing = nextPackageJson.scripts[name];\n if (!existing || matcher.test(existing)) {\n if (existing !== value) {\n nextPackageJson.scripts[name] = value;\n changes.push(`scripts.${name} -> ${value}`);\n }\n }\n }\n\n nextPackageJson.dependencies = nextPackageJson.dependencies || {};\n if (!nextPackageJson.dependencies[\"@farm.js/core\"]) {\n nextPackageJson.dependencies[\"@farm.js/core\"] = \"latest\";\n changes.push(\"dependencies.@farm.js/core -> latest\");\n }\n\n nextPackageJson.devDependencies = nextPackageJson.devDependencies || {};\n if (!nextPackageJson.devDependencies[\"@farm.js/cli\"]) {\n nextPackageJson.devDependencies[\"@farm.js/cli\"] = \"latest\";\n changes.push(\"devDependencies.@farm.js/cli -> latest\");\n }\n\n return { packageJson: nextPackageJson, changes };\n}\n\nasync function readPackageJson(root: string) {\n const packagePath = path.join(root, \"package.json\");\n if (!existsSync(packagePath)) return null;\n return JSON.parse(await readFile(packagePath, \"utf8\"));\n}\n\nfunction hasPackage(packageJson: any, packageName: string) {\n return Boolean(\n packageJson?.dependencies?.[packageName] ||\n packageJson?.devDependencies?.[packageName] ||\n packageJson?.peerDependencies?.[packageName],\n );\n}\n\nfunction cloneJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction unique(values: string[]) {\n return [...new Set(values)];\n}\n\nfunction toPosix(value: string) {\n return value.split(path.sep).join(\"/\");\n}\n","import { loadConfig, logger, resolveConfig } from \"@farm.js/core\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\ninterface FarmAuthInternalModule {\n migrateFarmAuth(): Promise<void>;\n}\n\nexport interface MigrateFarmAuthOptions {\n root?: string;\n configPath?: string;\n}\n\nexport async function migrateFarmAuth(options: MigrateFarmAuthOptions = {}): Promise<void> {\n const root = path.resolve(options.root || process.cwd());\n const userConfig = await loadConfig(root, options.configPath, \"production\");\n if (!userConfig) {\n throw new Error(`No farm.config file was found in ${root}.`);\n }\n\n const config = await resolveConfig({ ...userConfig, root }, \"production\");\n if (!config.auth.enabled) {\n throw new Error(\"Farm Auth is disabled. Add `auth: true` to farm.config.ts first.\");\n }\n\n const resolveFromApp = createRequire(path.join(root, \"package.json\"));\n let modulePath: string;\n try {\n modulePath = resolveFromApp.resolve(\"@farm.js/auth/internal\");\n } catch {\n throw new Error(\"Install @farm.js/auth before running `farm auth migrate`.\");\n }\n\n const runtime = (await import(\n /* @vite-ignore */ pathToFileURL(modulePath).href\n )) as FarmAuthInternalModule;\n\n logger.info(\"Applying the Farm Auth database schema...\");\n await runtime.migrateFarmAuth();\n logger.success(\"Farm Auth database is ready.\");\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type FarmUpgradeChannel = \"latest\" | \"beta\";\nexport type FarmPackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\nexport type FarmDependencySection =\n | \"dependencies\"\n | \"devDependencies\"\n | \"optionalDependencies\"\n | \"peerDependencies\";\n\nexport interface FarmUpgradePackage {\n name: string;\n current: string;\n target: string;\n section: FarmDependencySection;\n}\n\nexport interface FarmSkippedUpgradePackage {\n name: string;\n current: string;\n reason: string;\n section: FarmDependencySection;\n}\n\nexport interface FarmUpgradeCommand {\n command: FarmPackageManager;\n args: string[];\n cwd: string;\n}\n\nexport interface FarmUpgradePlan {\n root: string;\n packageJsonPath: string;\n packageManager: FarmPackageManager;\n channel: FarmUpgradeChannel;\n packages: FarmUpgradePackage[];\n skipped: FarmSkippedUpgradePackage[];\n commands: FarmUpgradeCommand[];\n}\n\nexport interface FarmUpgradeOptions {\n root?: string;\n channel: FarmUpgradeChannel;\n dryRun?: boolean;\n packageManager?: FarmPackageManager;\n runCommand?: FarmUpgradeCommandRunner;\n}\n\nexport interface FarmUpgradeResult {\n plan: FarmUpgradePlan;\n executed: boolean;\n}\n\nexport type FarmUpgradeCommandRunner = (command: FarmUpgradeCommand) => Promise<void>;\n\ntype ProjectPackageJson = {\n packageManager?: unknown;\n dependencies?: Record<string, unknown>;\n devDependencies?: Record<string, unknown>;\n optionalDependencies?: Record<string, unknown>;\n peerDependencies?: Record<string, unknown>;\n};\n\nconst DEPENDENCY_SECTIONS: readonly FarmDependencySection[] = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n];\nconst LOCAL_SPECIFIER_PREFIXES = [\"workspace:\", \"file:\", \"link:\", \"portal:\", \"catalog:\"] as const;\n\nexport async function createFarmUpgradePlan(options: FarmUpgradeOptions): Promise<FarmUpgradePlan> {\n assertUpgradeChannel(options.channel);\n\n const root = path.resolve(options.root || process.cwd());\n const packageJsonPath = path.join(root, \"package.json\");\n let packageJson: ProjectPackageJson;\n\n try {\n packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as ProjectPackageJson;\n } catch (error) {\n if (!existsSync(packageJsonPath)) {\n throw new Error(`No package.json found at ${packageJsonPath}.`);\n }\n throw new Error(`Could not read ${packageJsonPath}: ${formatError(error)}`);\n }\n\n const packageManager =\n options.packageManager || detectFarmPackageManager(root, packageJson.packageManager);\n const packages: FarmUpgradePackage[] = [];\n const skipped: FarmSkippedUpgradePackage[] = [];\n const seen = new Set<string>();\n\n for (const section of DEPENDENCY_SECTIONS) {\n const dependencies = packageJson[section];\n if (!dependencies || typeof dependencies !== \"object\") continue;\n\n for (const [name, rawSpecifier] of Object.entries(dependencies)) {\n if (!name.startsWith(\"@farm.js/\") || seen.has(name)) continue;\n seen.add(name);\n\n const current = typeof rawSpecifier === \"string\" ? rawSpecifier : String(rawSpecifier);\n if (isLocalSpecifier(current)) {\n skipped.push({\n name,\n current,\n section,\n reason: \"local workspace and file dependencies are not published-package upgrades\",\n });\n continue;\n }\n\n packages.push({\n name,\n current,\n section,\n target: `${name}@${options.channel}`,\n });\n }\n }\n\n if (packages.length === 0) {\n const suffix =\n skipped.length > 0\n ? \" The Farm packages in this project use local workspace or file references.\"\n : \"\";\n throw new Error(\n `No published @farm.js/* dependencies were found in ${packageJsonPath}.${suffix}`,\n );\n }\n\n packages.sort((left, right) => left.name.localeCompare(right.name));\n skipped.sort((left, right) => left.name.localeCompare(right.name));\n\n return {\n root,\n packageJsonPath,\n packageManager,\n channel: options.channel,\n packages,\n skipped,\n commands: createUpgradeCommands(root, packageManager, packages),\n };\n}\n\nexport async function upgradeFarm(options: FarmUpgradeOptions): Promise<FarmUpgradeResult> {\n const plan = await createFarmUpgradePlan(options);\n if (options.dryRun) {\n return { plan, executed: false };\n }\n\n const runCommand = options.runCommand || runFarmUpgradeCommand;\n for (const command of plan.commands) {\n await runCommand(command);\n }\n\n return { plan, executed: true };\n}\n\nexport function formatFarmUpgradePlan(plan: FarmUpgradePlan): string {\n const release = plan.channel === \"latest\" ? \"latest stable\" : \"latest beta\";\n const lines = [\n `Farm upgrade: ${release}`,\n `Project: ${plan.root}`,\n `Package manager: ${plan.packageManager}`,\n \"Packages:\",\n ];\n\n for (const entry of plan.packages) {\n lines.push(` ${entry.name} (${entry.section}): ${entry.current} -> ${plan.channel}`);\n }\n\n if (plan.skipped.length > 0) {\n lines.push(\"Skipped local packages:\");\n for (const entry of plan.skipped) {\n lines.push(` ${entry.name} (${entry.current})`);\n }\n }\n\n lines.push(\"Commands:\");\n for (const command of plan.commands) {\n lines.push(` ${command.command} ${command.args.join(\" \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function detectFarmPackageManager(\n root: string,\n packageManagerField?: unknown,\n): FarmPackageManager {\n if (typeof packageManagerField === \"string\") {\n const name = packageManagerField.split(\"@\", 1)[0];\n if (isFarmPackageManager(name)) return name;\n }\n\n const lockfileCandidates: Array<[FarmPackageManager, string[]]> = [\n [\"pnpm\", [\"pnpm-lock.yaml\"]],\n [\"yarn\", [\"yarn.lock\"]],\n [\"bun\", [\"bun.lock\", \"bun.lockb\"]],\n [\"npm\", [\"package-lock.json\", \"npm-shrinkwrap.json\"]],\n ];\n\n for (const [packageManager, lockfiles] of lockfileCandidates) {\n if (lockfiles.some((lockfile) => existsSync(path.join(root, lockfile)))) {\n return packageManager;\n }\n }\n\n return \"npm\";\n}\n\nfunction createUpgradeCommands(\n root: string,\n packageManager: FarmPackageManager,\n packages: FarmUpgradePackage[],\n): FarmUpgradeCommand[] {\n const command = packageManager === \"npm\" ? \"install\" : \"add\";\n\n return DEPENDENCY_SECTIONS.flatMap((section) => {\n const targets = packages\n .filter((entry) => entry.section === section)\n .map((entry) => entry.target);\n if (targets.length === 0) return [];\n\n return [\n {\n command: packageManager,\n args: [command, ...getDependencySectionFlags(packageManager, section), ...targets],\n cwd: root,\n },\n ];\n });\n}\n\nfunction getDependencySectionFlags(\n packageManager: FarmPackageManager,\n section: FarmDependencySection,\n): string[] {\n if (section === \"dependencies\") return [];\n\n if (packageManager === \"yarn\" || packageManager === \"bun\") {\n if (section === \"devDependencies\") return [\"--dev\"];\n if (section === \"optionalDependencies\") return [\"--optional\"];\n return [\"--peer\"];\n }\n\n if (section === \"devDependencies\") return [\"--save-dev\"];\n if (section === \"optionalDependencies\") return [\"--save-optional\"];\n return [\"--save-peer\"];\n}\n\nfunction runFarmUpgradeCommand(command: FarmUpgradeCommand): Promise<void> {\n return new Promise((resolve, reject) => {\n const executable = process.platform === \"win32\" ? `${command.command}.cmd` : command.command;\n const child = spawn(executable, command.args, {\n cwd: command.cwd,\n env: process.env,\n stdio: \"inherit\",\n });\n\n child.on(\"error\", reject);\n child.on(\"close\", (code, signal) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n const termination = signal ? `signal ${signal}` : `exit code ${code ?? \"unknown\"}`;\n reject(new Error(`${command.command} ${command.args.join(\" \")} failed with ${termination}.`));\n });\n });\n}\n\nfunction isLocalSpecifier(specifier: string): boolean {\n return LOCAL_SPECIFIER_PREFIXES.some((prefix) => specifier.startsWith(prefix));\n}\n\nfunction isFarmPackageManager(value: string): value is FarmPackageManager {\n return value === \"npm\" || value === \"pnpm\" || value === \"yarn\" || value === \"bun\";\n}\n\nfunction assertUpgradeChannel(channel: FarmUpgradeChannel): void {\n if (channel !== \"latest\" && channel !== \"beta\") {\n throw new Error('Farm upgrade channel must be \"latest\" or \"beta\".');\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"}
|