{"version":3,"file":"nextjs.mjs","names":[],"sources":["../src/nextjs/manifest.ts","../src/nextjs/staging.ts","../src/nextjs/adapter.ts","../src/nextjs/fetch-handler.ts","../src/nextjs/index.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport type { NextjsBuildManifest } from \"./types\";\n\nexport const TAKO_NEXTJS_ENTRYPOINT = \"tako-entry.mjs\";\n\nexport function createNextjsBuildManifest(\n  projectDir: string,\n  distDir: string,\n): NextjsBuildManifest {\n  const distRoot = path.resolve(projectDir, distDir);\n  const standaloneDir = path.join(distRoot, \"standalone\");\n\n  return {\n    distRoot,\n    takoEntrypoint: path.join(distRoot, TAKO_NEXTJS_ENTRYPOINT),\n    standaloneDir,\n    standaloneServer: path.join(standaloneDir, \"server.js\"),\n    staticDir: path.join(distRoot, \"static\"),\n    publicDir: path.join(projectDir, \"public\"),\n    standaloneStaticDir: path.join(standaloneDir, \".next\", \"static\"),\n    standalonePublicDir: path.join(standaloneDir, \"public\"),\n  };\n}\n\nexport function nextjsEntrypointContents(): string {\n  return [\n    'import { createNextjsFetchHandler } from \"tako.sh/nextjs\";',\n    \"\",\n    'import { access } from \"node:fs/promises\";',\n    \"\",\n    'const standaloneServer = new URL(\"./standalone/server.js\", import.meta.url);',\n    'const nextBin = new URL(\"../node_modules/next/dist/bin/next\", import.meta.url);',\n    \"\",\n    \"async function resolveHandler() {\",\n    \"  try {\",\n    \"    await access(standaloneServer);\",\n    \"    return createNextjsFetchHandler(standaloneServer);\",\n    \"  } catch {\",\n    \"    return createNextjsFetchHandler(nextBin, {\",\n    '      argv: [\"start\"],',\n    '      cwd: new URL(\"..\", import.meta.url),',\n    \"    });\",\n    \"  }\",\n    \"}\",\n    \"\",\n    \"const handlerPromise = resolveHandler();\",\n    \"\",\n    \"async function ready() {\",\n    \"  const handler = await handlerPromise;\",\n    '  if (typeof handler.ready === \"function\") {',\n    \"    await handler.ready();\",\n    \"  }\",\n    \"}\",\n    \"\",\n    \"async function fetch(request, env) {\",\n    \"  const handler = await handlerPromise;\",\n    \"  return await handler(request, env);\",\n    \"}\",\n    \"\",\n    \"fetch.ready = ready;\",\n    \"\",\n    \"export default fetch;\",\n    \"\",\n  ].join(\"\\n\");\n}\n","import { access, cp, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { createNextjsBuildManifest, nextjsEntrypointContents } from \"./manifest\";\n\nexport async function stageNextjsBuildOutput(projectDir: string, distDir: string): Promise<void> {\n  const manifest = createNextjsBuildManifest(projectDir, distDir);\n\n  if (await pathExists(manifest.standaloneServer)) {\n    if (await pathExists(manifest.staticDir)) {\n      await mkdir(path.dirname(manifest.standaloneStaticDir), { recursive: true });\n      await copyDirectory(manifest.staticDir, manifest.standaloneStaticDir);\n    }\n    if (await pathExists(manifest.publicDir)) {\n      await copyDirectory(manifest.publicDir, manifest.standalonePublicDir);\n    }\n  }\n\n  await writeFile(manifest.takoEntrypoint, nextjsEntrypointContents(), \"utf8\");\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n  try {\n    await access(targetPath);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nasync function copyDirectory(source: string, destination: string): Promise<void> {\n  await cp(source, destination, {\n    recursive: true,\n    force: true,\n  });\n}\n","import { stageNextjsBuildOutput } from \"./staging\";\nimport type { NextAdapterShape } from \"./types\";\n\nexport function createNextjsAdapter(): NextAdapterShape {\n  return {\n    name: \"tako-nextjs\",\n    modifyConfig(config) {\n      return {\n        ...config,\n        output: \"standalone\",\n      };\n    },\n    async onBuildComplete({ projectDir, distDir }) {\n      await stageNextjsBuildOutput(projectDir, distDir);\n    },\n  };\n}\n","import { spawn } from \"node:child_process\";\nimport { access } from \"node:fs/promises\";\nimport { createConnection, createServer } from \"node:net\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { FetchHandler, ReadyableFetchHandler } from \"../types\";\nimport type { ManagedNextjsServer, NextjsFetchHandlerOptions } from \"./types\";\n\nconst DEFAULT_HOSTNAME = \"127.0.0.1\";\nconst DEFAULT_STARTUP_TIMEOUT_MS = 30_000;\n\nconst managedServers = new Map<string, ManagedNextjsServer>();\nlet cleanupHandlersRegistered = false;\n\nexport function createNextjsFetchHandler(\n  serverEntrypoint: string | URL,\n  options: NextjsFetchHandlerOptions = {},\n): FetchHandler {\n  const serverPath = normalizeFileReference(serverEntrypoint);\n  const server = getManagedNextjsServer(serverPath, options);\n  const fetchImplementation = options.unstable_testing?.fetchImplementation ?? fetch;\n\n  const handler: ReadyableFetchHandler = async (request) => {\n    const port = options.unstable_testing?.ensureServer\n      ? await options.unstable_testing.ensureServer()\n      : await ensureManagedNextjsServer(serverPath, server);\n    const upstreamUrl = new URL(request.url);\n    const originalHost = request.headers.get(\"host\") ?? upstreamUrl.host;\n    const originalPort = originalRequestPort(request, originalHost);\n\n    upstreamUrl.protocol = \"http:\";\n    upstreamUrl.hostname = server.hostname;\n    upstreamUrl.port = String(port);\n\n    const headers = new Headers(request.headers);\n    headers.set(\"host\", originalHost);\n    headers.set(\"x-forwarded-host\", originalHost);\n    headers.set(\"x-forwarded-proto\", new URL(request.url).protocol.replace(/:$/, \"\"));\n    if (!headers.has(\"x-forwarded-port\") && originalPort) {\n      headers.set(\"x-forwarded-port\", originalPort);\n    }\n\n    const init: RequestInit & { duplex?: \"half\" } = {\n      method: request.method,\n      headers,\n      redirect: \"manual\",\n    };\n    if (request.body && request.method !== \"GET\" && request.method !== \"HEAD\") {\n      init.body = request.body;\n      init.duplex = \"half\";\n    }\n\n    return await fetchImplementation(upstreamUrl, init);\n  };\n\n  handler.ready = async () => {\n    if (options.unstable_testing?.ensureServer) {\n      await options.unstable_testing.ensureServer();\n      return;\n    }\n    await ensureManagedNextjsServer(serverPath, server);\n  };\n\n  return handler;\n}\n\nexport async function shutdownManagedNextjsServers(): Promise<void> {\n  const shutdowns = [...managedServers.entries()].map(async ([serverPath, managed]) => {\n    managed.ready = null;\n    const child = managed.child;\n    managed.child = null;\n    if (!child || child.exitCode !== null) {\n      return;\n    }\n    await stopChildProcess(serverPath, child);\n  });\n  await Promise.all(shutdowns);\n  managedServers.clear();\n}\n\nfunction getManagedNextjsServer(\n  serverPath: string,\n  options: NextjsFetchHandlerOptions,\n): ManagedNextjsServer {\n  const serverKey = managedNextjsServerKey(serverPath, options);\n  let managed = managedServers.get(serverKey);\n  if (!managed) {\n    managed = {\n      child: null,\n      ready: null,\n      argv: options.argv ?? [],\n      cwd: normalizeExecutionCwd(serverPath, options.cwd),\n      hostname: options.hostname ?? DEFAULT_HOSTNAME,\n      startupTimeoutMs: options.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS,\n    };\n    managedServers.set(serverKey, managed);\n  }\n  return managed;\n}\n\nasync function ensureManagedNextjsServer(\n  serverPath: string,\n  managed: ManagedNextjsServer,\n): Promise<number> {\n  if (managed.ready) {\n    return await managed.ready;\n  }\n\n  managed.ready = (async () => {\n    await ensureFileExists(\n      serverPath,\n      `Next.js server entry '${serverPath}' was not found. Run next build before deploy.`,\n    );\n    const port = await reservePort(managed.hostname);\n    const child = spawn(process.execPath, [serverPath, ...managed.argv], {\n      cwd: managed.cwd,\n      env: {\n        ...process.env,\n        HOST: managed.hostname,\n        PORT: String(port),\n      },\n      stdio: \"inherit\",\n    });\n    managed.child = child;\n    registerCleanupHandlers();\n    child.once(\"exit\", () => {\n      managed.child = null;\n      managed.ready = null;\n    });\n    child.once(\"error\", () => {\n      managed.child = null;\n      managed.ready = null;\n    });\n    await waitForServerReady(serverPath, child, managed.hostname, port, managed.startupTimeoutMs);\n    return port;\n  })();\n\n  try {\n    return await managed.ready;\n  } catch (error) {\n    managed.ready = null;\n    managed.child = null;\n    throw error;\n  }\n}\n\nfunction registerCleanupHandlers(): void {\n  if (cleanupHandlersRegistered) {\n    return;\n  }\n  cleanupHandlersRegistered = true;\n\n  const shutdown = () => {\n    void shutdownManagedNextjsServers();\n  };\n  process.once(\"exit\", shutdown);\n  process.once(\"SIGINT\", () => {\n    shutdown();\n    process.exit(130);\n  });\n  process.once(\"SIGTERM\", () => {\n    shutdown();\n    process.exit(143);\n  });\n}\n\nasync function waitForServerReady(\n  serverPath: string,\n  child: NonNullable<ManagedNextjsServer[\"child\"]>,\n  hostname: string,\n  port: number,\n  timeoutMs: number,\n): Promise<void> {\n  const deadline = Date.now() + timeoutMs;\n  while (Date.now() < deadline) {\n    if (child.exitCode !== null) {\n      throw new Error(`Next.js server '${serverPath}' exited before it became ready.`);\n    }\n    if (await canConnect(hostname, port)) {\n      return;\n    }\n    await sleep(50);\n  }\n\n  try {\n    child.kill(\"SIGTERM\");\n  } catch {\n    // Ignore cleanup failures on timeout.\n  }\n  throw new Error(`Timed out waiting for Next.js server '${serverPath}' to start.`);\n}\n\nasync function stopChildProcess(\n  serverPath: string,\n  child: NonNullable<ManagedNextjsServer[\"child\"]>,\n): Promise<void> {\n  try {\n    child.kill(\"SIGTERM\");\n  } catch {\n    return;\n  }\n  const deadline = Date.now() + 5_000;\n  while (child.exitCode === null && Date.now() < deadline) {\n    await sleep(25);\n  }\n  if (child.exitCode === null) {\n    try {\n      child.kill(\"SIGKILL\");\n    } catch {\n      // Ignore cleanup failures after timeout.\n    }\n  }\n  if (child.exitCode === null) {\n    throw new Error(`Timed out shutting down managed Next.js server '${serverPath}'.`);\n  }\n}\n\nasync function reservePort(hostname: string): Promise<number> {\n  const server = createServer();\n  return await new Promise<number>((resolve, reject) => {\n    server.once(\"error\", reject);\n    server.listen(0, hostname, () => {\n      const address = server.address();\n      if (!address || typeof address === \"string\") {\n        server.close();\n        reject(new Error(\"Failed to reserve an ephemeral port.\"));\n        return;\n      }\n      const port = address.port;\n      server.close((error) => {\n        if (error) {\n          reject(error);\n          return;\n        }\n        resolve(port);\n      });\n    });\n  });\n}\n\nasync function canConnect(hostname: string, port: number): Promise<boolean> {\n  return await new Promise<boolean>((resolve) => {\n    const connection = createConnection({ host: hostname, port });\n    connection.once(\"connect\", () => {\n      connection.end();\n      resolve(true);\n    });\n    connection.once(\"error\", () => {\n      connection.destroy();\n      resolve(false);\n    });\n  });\n}\n\nasync function ensureFileExists(targetPath: string, message: string): Promise<void> {\n  try {\n    await access(targetPath);\n  } catch {\n    throw new Error(message);\n  }\n}\n\nfunction managedNextjsServerKey(serverPath: string, options: NextjsFetchHandlerOptions): string {\n  return JSON.stringify({\n    serverPath,\n    argv: options.argv ?? [],\n    cwd: options.cwd ? normalizeFileReference(options.cwd) : path.dirname(serverPath),\n  });\n}\n\nfunction originalRequestPort(request: Request, originalHost: string): string | null {\n  const hostPort = portFromHostHeader(originalHost);\n  if (hostPort) {\n    return hostPort;\n  }\n\n  const requestPort = new URL(request.url).port;\n  return requestPort || null;\n}\n\nfunction portFromHostHeader(host: string): string | null {\n  const trimmed = host.trim();\n  if (!trimmed) {\n    return null;\n  }\n  if (trimmed.startsWith(\"[\")) {\n    const closingIndex = trimmed.indexOf(\"]\");\n    if (closingIndex === -1) {\n      return null;\n    }\n    const suffix = trimmed.slice(closingIndex + 1);\n    if (!suffix.startsWith(\":\")) {\n      return null;\n    }\n    return suffix.slice(1) || null;\n  }\n\n  const lastColonIndex = trimmed.lastIndexOf(\":\");\n  if (lastColonIndex === -1 || trimmed.indexOf(\":\") !== lastColonIndex) {\n    return null;\n  }\n  return trimmed.slice(lastColonIndex + 1) || null;\n}\n\nfunction normalizeExecutionCwd(serverPath: string, cwd: string | URL | undefined): string {\n  if (!cwd) {\n    return path.dirname(serverPath);\n  }\n  return normalizeFileReference(cwd);\n}\n\nfunction normalizeFileReference(value: string | URL): string {\n  if (value instanceof URL) {\n    return fileURLToPath(value);\n  }\n  return path.resolve(value);\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { createNextjsAdapter } from \"./adapter\";\nimport type { NextConfigShape } from \"./types\";\n\nconst TAKO_IMAGE_WIDTHS = [320, 640, 960, 1200, 1920];\nconst IMAGE_LOADER_FILE = import.meta.url.endsWith(\".ts\")\n  ? fileURLToPath(new URL(\"./image-loader.ts\", import.meta.url))\n  : fileURLToPath(new URL(\"./nextjs/image-loader.mjs\", import.meta.url));\n\nfunction imageLoaderFileForNext(): string {\n  return path.relative(process.cwd(), IMAGE_LOADER_FILE);\n}\n\nexport { createNextjsAdapter } from \"./adapter\";\nexport { createNextjsFetchHandler, shutdownManagedNextjsServers } from \"./fetch-handler\";\nexport type {\n  NextAdapterContext,\n  NextAdapterShape,\n  NextBuildCompleteContext,\n  NextConfigShape,\n  NextjsBuildManifest,\n  NextjsFetchHandlerOptions,\n} from \"./types\";\n\n/**\n * Wrap a Next.js config so it plays well with Tako.\n *\n * Forces `output: \"standalone\"` (required for Tako's deploy/runtime), sets\n * `adapterPath` to this module so Next uses the Tako adapter, and appends\n * `*.test` / `*.tako.test` to `allowedDevOrigins` so the dev proxy can hit\n * the Next dev server. It also configures `next/image` to use Tako's public\n * image optimizer globally.\n *\n * @typeParam T - The user's Next config type; preserved in the return type.\n * @param config - The Next.js config to augment.\n * @returns The augmented config with Tako-required fields applied.\n *\n * @example\n * ```typescript\n * // next.config.ts\n * import { withTako } from \"tako.sh/nextjs\";\n *\n * export default withTako({\n *   reactStrictMode: true,\n * });\n * ```\n */\nexport function withTako<T extends NextConfigShape>(config: T): T & NextConfigShape {\n  return {\n    ...config,\n    output: \"standalone\",\n    adapterPath: fileURLToPath(import.meta.url),\n    allowedDevOrigins: [...(config.allowedDevOrigins ?? []), \"*.test\", \"*.tako.test\"],\n    images: {\n      ...config.images,\n      loader: \"custom\",\n      loaderFile: imageLoaderFileForNext(),\n      deviceSizes: TAKO_IMAGE_WIDTHS,\n      imageSizes: [],\n    },\n  };\n}\n\nexport default createNextjsAdapter();\n"],"mappings":"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"}