{"version":3,"sources":["../src/devtools.ts"],"sourcesContent":["import path from \"node:path\";\nimport { getDeployTargetForPreset } from \"./config\";\nimport { resolveCronConfig, type FarmCronJob } from \"./cron\";\nimport {\n  mergeFarmRouteRuntimeConfigs,\n  resolveFarmRouteRuleRuntimeConfig,\n  resolveFarmRouteRuntimeConfig,\n  type ResolvedFarmRouteRuntimeConfig,\n} from \"./route-runtime\";\nimport type { FarmConfig } from \"./types\";\nimport type { FarmDiscoveredWorkflow } from \"./workflows\";\n\ntype RouteMapEntry = {\n  pattern: string;\n  modulePath: string;\n};\n\ntype RouteManagerLike = {\n  getRoutes(): Map<string, RouteMapEntry>;\n  getLayouts(): Map<string, RouteMapEntry>;\n  getLoadings(): Map<string, RouteMapEntry>;\n  getErrors(): Map<string, RouteMapEntry>;\n  resolveRouteRuntimeConfig?(\n    pattern: string,\n  ): Promise<ResolvedFarmRouteRuntimeConfig> | ResolvedFarmRouteRuntimeConfig;\n};\n\ntype APIRouteManagerLike = {\n  getRoutes(): Map<\n    string,\n    {\n      path: string;\n      filePath: string;\n      methods: string[];\n      runtime?: \"auto\" | \"node\" | \"edge\";\n      regions?: \"auto\" | readonly string[];\n      maxDuration?: \"auto\" | number;\n    }\n  >;\n};\n\ntype MiddlewareManagerLike = {\n  getMiddlewares(): Array<{\n    path: string;\n    filePath: string;\n    handlers: unknown[];\n    source?: \"config\" | \"file\";\n  }>;\n};\n\ntype IntegrationLike = {\n  kind?: string;\n  type?: string;\n  category?: string;\n  serverRuntime?: boolean;\n  routes?: ReadonlyArray<{\n    path: string;\n    method?: string;\n    methods?: readonly string[];\n  }>;\n  middleware?: readonly unknown[];\n  providers?: readonly unknown[];\n  schema?: {\n    models?: Record<string, unknown>;\n  };\n};\n\nexport type FarmDevtoolsRuntime = {\n  runtime: \"auto\" | \"node\" | \"edge\";\n  regions?: string[];\n  maxDuration?: number;\n};\n\nexport type FarmDevtoolsDiagnostic = {\n  severity: \"error\" | \"warning\" | \"info\";\n  code: string;\n  title: string;\n  message: string;\n  action?: string;\n};\n\nexport type FarmDevtoolsSnapshot = {\n  generatedAt: string;\n  health: \"ready\" | \"attention\" | \"error\";\n  project: {\n    name: string;\n    root: string;\n    srcDir: string;\n    basePath: string;\n    deploymentId: string;\n  };\n  deployment: {\n    target: string;\n    preset: string;\n    outputDir?: string;\n  };\n  counts: {\n    pages: number;\n    layouts: number;\n    loadingBoundaries: number;\n    errorBoundaries: number;\n    apiRoutes: number;\n    middleware: number;\n    integrations: number;\n    storageMounts: number;\n    cronJobs: number;\n    workflows: number;\n    layers: number;\n    diagnostics: number;\n  };\n  routes: Array<{\n    kind: \"page\" | \"layout\" | \"loading\" | \"error\";\n    pattern: string;\n    filePath: string;\n    runtime?: FarmDevtoolsRuntime;\n  }>;\n  apiRoutes: Array<{\n    path: string;\n    methods: string[];\n    filePath: string;\n    runtime: FarmDevtoolsRuntime;\n  }>;\n  middleware: Array<{\n    path: string;\n    source: \"config\" | \"file\";\n    filePath: string;\n    handlerCount: number;\n  }>;\n  integrations: Array<{\n    key: string;\n    type: string;\n    category: string;\n    serverRuntime: boolean;\n    routes: Array<{ path: string; methods: string[] }>;\n    middlewareCount: number;\n    providerCount: number;\n    schemaModelCount: number;\n  }>;\n  storage: Array<{\n    mount: string;\n    driver: string;\n    default: boolean;\n  }>;\n  cron: FarmCronJob[];\n  workflows: Array<{\n    id: string;\n    filePath: string;\n    routePath: string;\n    schedule: string[];\n    timezone?: string;\n  }>;\n  layers: Array<{\n    name: string;\n    source: string;\n    srcDir: string;\n  }>;\n  environment: {\n    server: string[];\n    public: string[];\n  };\n  docs: {\n    enabled: boolean;\n    entry?: string;\n  };\n  features: {\n    openapi: boolean;\n    markdown: boolean;\n    serverComponents: boolean;\n    serverActions: boolean;\n    optimizedBoundary: boolean;\n    observability: boolean;\n  };\n  diagnostics: FarmDevtoolsDiagnostic[];\n};\n\nexport interface CreateFarmDevtoolsSnapshotInput {\n  root: string;\n  srcDir: string;\n  routeManager: RouteManagerLike;\n  apiRouteManager: APIRouteManagerLike;\n  middlewareManager: MiddlewareManagerLike;\n  config?: FarmConfig & { openapi?: { enabled?: boolean } };\n  workflows?: readonly FarmDiscoveredWorkflow[];\n  now?: () => Date;\n  env?: Record<string, string | undefined>;\n}\n\nfunction normalizePath(value: string): string {\n  return value.replace(/\\\\/g, \"/\");\n}\n\nfunction toProjectPath(root: string, filePath: string): string {\n  const normalizedRoot = normalizePath(root).replace(/\\/$/, \"\");\n  const normalizedFile = normalizePath(filePath);\n  if (normalizedFile.startsWith(normalizedRoot + \"/\")) {\n    return normalizedFile.slice(normalizedRoot.length + 1);\n  }\n  return normalizedFile;\n}\n\nfunction sortByPath<T extends { path?: string; pattern?: string }>(items: T[]): T[] {\n  return [...items].sort((a, b) =>\n    (a.path || a.pattern || \"\").localeCompare(b.path || b.pattern || \"\"),\n  );\n}\n\nfunction toRuntime(value: ResolvedFarmRouteRuntimeConfig): FarmDevtoolsRuntime {\n  return {\n    runtime: value.runtime,\n    ...(value.regions ? { regions: [...value.regions] } : {}),\n    ...(value.maxDuration ? { maxDuration: value.maxDuration } : {}),\n  };\n}\n\nasync function collectRoutes(\n  root: string,\n  kind: FarmDevtoolsSnapshot[\"routes\"][number][\"kind\"],\n  routes: Map<string, RouteMapEntry>,\n  routeManager: RouteManagerLike,\n  diagnostics: FarmDevtoolsDiagnostic[],\n): Promise<FarmDevtoolsSnapshot[\"routes\"]> {\n  return Promise.all(\n    Array.from(routes.values()).map(async (route) => {\n      let runtime: FarmDevtoolsRuntime | undefined;\n      if (kind === \"page\" && routeManager.resolveRouteRuntimeConfig) {\n        try {\n          runtime = toRuntime(await routeManager.resolveRouteRuntimeConfig(route.pattern));\n        } catch (error) {\n          diagnostics.push({\n            severity: \"warning\",\n            code: \"ROUTE_RUNTIME_UNRESOLVED\",\n            title: `Could not inspect ${route.pattern}`,\n            message: error instanceof Error ? error.message : String(error),\n            action: \"Check the route and inherited layout runtime exports.\",\n          });\n        }\n      }\n\n      return {\n        kind,\n        pattern: route.pattern,\n        filePath: toProjectPath(root, route.modulePath),\n        ...(runtime ? { runtime } : {}),\n      };\n    }),\n  );\n}\n\nfunction collectIntegrations(integrations: FarmConfig[\"integrations\"] | undefined) {\n  if (!integrations || typeof integrations !== \"object\") return [];\n\n  return Object.entries(integrations)\n    .filter((entry): entry is [string, NonNullable<(typeof entry)[1]>] => Boolean(entry[1]))\n    .map(([key, value]) => {\n      const integration = value as IntegrationLike;\n      const routes = (integration.routes || []).map((route) => ({\n        path: route.path,\n        methods: [...(route.methods || (route.method ? [route.method] : [\"ALL\"]))]\n          .map((method) => method.toUpperCase())\n          .sort(),\n      }));\n\n      return {\n        key,\n        type: integration.type || key,\n        category: integration.category || \"custom\",\n        serverRuntime: integration.serverRuntime !== false,\n        routes: sortByPath(routes),\n        middlewareCount: integration.middleware?.length || 0,\n        providerCount: integration.providers?.length || 0,\n        schemaModelCount: Object.keys(integration.schema?.models || {}).length,\n      };\n    })\n    .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nfunction collectStorage(storage: FarmConfig[\"storage\"] | undefined): {\n  entries: FarmDevtoolsSnapshot[\"storage\"];\n  configured: boolean;\n} {\n  if (!storage || typeof storage !== \"object\") {\n    return {\n      entries: [{ mount: \"root\", driver: \"memory\", default: true }],\n      configured: false,\n    };\n  }\n\n  const value = storage as Record<string, any>;\n  if (value.kind === \"farm-storage-client\") {\n    return {\n      entries: [{ mount: \"root\", driver: \"storage client\", default: false }],\n      configured: true,\n    };\n  }\n\n  const configured = Object.keys(value).length > 0;\n  const rootDriver = value.client\n    ? describeStorageDriver(value.client)\n    : describeStorageDriver(value.driver);\n  const entries: FarmDevtoolsSnapshot[\"storage\"] = [\n    {\n      mount: \"root\",\n      driver: rootDriver,\n      default: !configured,\n    },\n  ];\n\n  if (value.mounts && typeof value.mounts === \"object\") {\n    for (const [mount, mountConfig] of Object.entries(value.mounts)) {\n      entries.push({\n        mount,\n        driver: describeStorageDriver(mountConfig),\n        default: false,\n      });\n    }\n  }\n\n  return {\n    entries: entries.sort((a, b) => {\n      if (a.mount === \"root\") return -1;\n      if (b.mount === \"root\") return 1;\n      return a.mount.localeCompare(b.mount);\n    }),\n    configured,\n  };\n}\n\nfunction describeStorageDriver(value: unknown): string {\n  if (!value) return \"memory\";\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"function\") return \"custom\";\n  if (typeof value !== \"object\") return \"custom\";\n\n  const record = value as Record<string, unknown>;\n  if (record.kind === \"farm-storage-client\") return \"storage client\";\n  if (typeof record.driver === \"string\") return record.driver;\n  if (typeof record.driver === \"function\") return \"custom\";\n  return \"custom\";\n}\n\nfunction featureEnabled(value: unknown): boolean {\n  if (!value) return false;\n  if (typeof value === \"object\" && \"enabled\" in value) {\n    return (value as { enabled?: boolean }).enabled !== false;\n  }\n  return value !== false;\n}\n\nfunction collectEnvironmentKeys(config: FarmConfig | undefined) {\n  const env = config?.env as\n    | { server?: Record<string, unknown>; public?: Record<string, unknown> }\n    | undefined;\n  return {\n    server: Object.keys(env?.server || {}).sort(),\n    public: Object.keys(env?.public || {}).sort(),\n  };\n}\n\nfunction resolveHealth(diagnostics: FarmDevtoolsDiagnostic[]): FarmDevtoolsSnapshot[\"health\"] {\n  if (diagnostics.some((diagnostic) => diagnostic.severity === \"error\")) return \"error\";\n  if (diagnostics.some((diagnostic) => diagnostic.severity === \"warning\")) return \"attention\";\n  return \"ready\";\n}\n\nexport async function createFarmDevtoolsSnapshot(\n  input: CreateFarmDevtoolsSnapshotInput,\n): Promise<FarmDevtoolsSnapshot> {\n  const config = input.config || {};\n  const diagnostics: FarmDevtoolsDiagnostic[] = [];\n  const pageRoutes = await collectRoutes(\n    input.root,\n    \"page\",\n    input.routeManager.getRoutes(),\n    input.routeManager,\n    diagnostics,\n  );\n  const layoutRoutes = await collectRoutes(\n    input.root,\n    \"layout\",\n    input.routeManager.getLayouts(),\n    input.routeManager,\n    diagnostics,\n  );\n  const loadingRoutes = await collectRoutes(\n    input.root,\n    \"loading\",\n    input.routeManager.getLoadings(),\n    input.routeManager,\n    diagnostics,\n  );\n  const errorRoutes = await collectRoutes(\n    input.root,\n    \"error\",\n    input.routeManager.getErrors(),\n    input.routeManager,\n    diagnostics,\n  );\n  const apiRoutes = sortByPath(\n    Array.from(input.apiRouteManager.getRoutes().values()).map((route) => {\n      const runtime = resolveFarmRouteRuntimeConfig(\n        mergeFarmRouteRuntimeConfigs(\n          resolveFarmRouteRuleRuntimeConfig(route.path, config.routeRules),\n          route,\n        ),\n        `API route \"${route.path}\"`,\n      );\n      return {\n        path: route.path,\n        methods: [...route.methods].sort(),\n        filePath: toProjectPath(input.root, route.filePath),\n        runtime: toRuntime(runtime),\n      };\n    }),\n  );\n  const middleware = sortByPath(\n    input.middlewareManager.getMiddlewares().map((entry) => ({\n      path: entry.path,\n      source: entry.source || \"file\",\n      filePath: toProjectPath(input.root, entry.filePath),\n      handlerCount: entry.handlers.length,\n    })),\n  );\n  const integrations = collectIntegrations(config.integrations);\n  const storage = collectStorage(config.storage);\n  const cron = resolveCronConfig(config.cron);\n  const workflows = (input.workflows || [])\n    .map((workflow) => ({\n      id: workflow.id,\n      filePath: toProjectPath(input.root, workflow.filePath),\n      routePath: workflow.routePath,\n      schedule: [...workflow.schedule],\n      ...(workflow.timezone ? { timezone: workflow.timezone } : {}),\n    }))\n    .sort((a, b) => a.id.localeCompare(b.id));\n  const layers = (config.layers || []).map((layer) => ({\n    name: layer.name,\n    source: layer.source,\n    srcDir: layer.srcDir,\n  }));\n  const deploymentPreset = String(config.deploy?.preset || config.preset || \"node-server\");\n  const deploymentTarget = String(\n    config.deploy?.target || getDeployTargetForPreset(deploymentPreset) || \"node\",\n  );\n  const env = input.env || process.env;\n\n  if (pageRoutes.length === 0) {\n    diagnostics.push({\n      severity: \"warning\",\n      code: \"NO_PAGE_ROUTES\",\n      title: \"No page routes found\",\n      message: `Farm did not discover a page under ${input.srcDir}/app.`,\n      action: `Add ${input.srcDir}/app/page.tsx or a programmatic page route.`,\n    });\n  }\n  if (layoutRoutes.length === 0) {\n    diagnostics.push({\n      severity: \"warning\",\n      code: \"ROOT_LAYOUT_MISSING\",\n      title: \"Root layout is missing\",\n      message: \"The application has no shared root layout.\",\n      action: `Add ${input.srcDir}/app/layout.tsx for shared metadata and application chrome.`,\n    });\n  }\n\n  const apiPaths = new Set(apiRoutes.map((route) => route.path));\n  for (const job of cron.jobs) {\n    if (!apiPaths.has(job.path)) {\n      diagnostics.push({\n        severity: \"warning\",\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 registered.`,\n        action: \"Add the target API route or update the cron path in farm.config.ts.\",\n      });\n    }\n  }\n  if (cron.jobs.length > 0 && !env[cron.secretEnv]) {\n    diagnostics.push({\n      severity: \"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  if (\n    storage.configured &&\n    storage.entries[0]?.driver === \"memory\" &&\n    [\"vercel\", \"cloudflare\", \"netlify\"].includes(deploymentTarget)\n  ) {\n    diagnostics.push({\n      severity: \"warning\",\n      code: \"EPHEMERAL_PRODUCTION_STORAGE\",\n      title: \"Production storage is in memory\",\n      message: `${deploymentTarget} instances do not preserve in-memory data across executions.`,\n      action: \"Configure a durable storage driver or mount for production state.\",\n    });\n  }\n\n  const environment = collectEnvironmentKeys(config);\n  const docs = config.docs;\n  const docsEnabled = featureEnabled(docs);\n  const allRoutes = sortByPath([...pageRoutes, ...layoutRoutes, ...loadingRoutes, ...errorRoutes]);\n\n  return {\n    generatedAt: (input.now?.() || new Date()).toISOString(),\n    health: resolveHealth(diagnostics),\n    project: {\n      name: path.basename(path.resolve(input.root)),\n      root: input.root,\n      srcDir: input.srcDir,\n      basePath: config.basePath || \"/\",\n      deploymentId: config.deploymentId || \"development\",\n    },\n    deployment: {\n      target: deploymentTarget,\n      preset: deploymentPreset,\n      ...(config.deploy?.outputDir ? { outputDir: config.deploy.outputDir } : {}),\n    },\n    counts: {\n      pages: pageRoutes.length,\n      layouts: layoutRoutes.length,\n      loadingBoundaries: loadingRoutes.length,\n      errorBoundaries: errorRoutes.length,\n      apiRoutes: apiRoutes.length,\n      middleware: middleware.length,\n      integrations: integrations.length,\n      storageMounts: storage.entries.length,\n      cronJobs: cron.jobs.length,\n      workflows: workflows.length,\n      layers: layers.length,\n      diagnostics: diagnostics.length,\n    },\n    routes: allRoutes,\n    apiRoutes,\n    middleware,\n    integrations,\n    storage: storage.entries,\n    cron: cron.jobs,\n    workflows,\n    layers,\n    environment,\n    docs: {\n      enabled: docsEnabled,\n      entry:\n        docsEnabled && docs && typeof docs === \"object\" && \"entry\" in docs\n          ? String(docs.entry)\n          : undefined,\n    },\n    features: {\n      openapi: Boolean(config.openapi?.enabled),\n      markdown: featureEnabled(config.md),\n      serverComponents: Boolean(config.experimental?.serverComponents),\n      serverActions: Boolean(config.experimental?.serverActions),\n      optimizedBoundary: Boolean(config.experimental?.optimizedBoundary),\n      observability: featureEnabled(config.observability),\n    },\n    diagnostics,\n  };\n}\n"],"mappings":"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","names":[]}