{"version":3,"file":"buildVercelOutputDirectory.js","names":[],"sources":["esm/vercel/build/buildVercelOutputDirectory.js"],"sourcesContent":["import { join, resolve } from \"node:path\";\nimport FSExtra from \"fs-extra\";\nimport { isMatching, P } from \"ts-pattern\";\nimport { vercelBuildOutputConfigBase } from \"./config/vc-build-output-config-base\";\nimport { serverlessVercelPackageJson } from \"./config/vc-package-base\";\nimport { createApiServerlessFunction } from \"./generate/createApiServerlessFunction\";\nimport { createSsrServerlessFunction } from \"./generate/createSsrServerlessFunction\";\nimport { getPathFromRoute } from \"./getPathFromRoute\";\nconst { copy, ensureDir, existsSync, remove, writeJSON } = FSExtra;\nasync function moveAllFiles(src, dest) {\n  try {\n    await copy(src, dest, { overwrite: true, errorOnExist: false });\n  } catch (err) {\n    console.error(\"Error moving files:\", err);\n  }\n}\nfunction getMiddlewaresByNamedRegex(buildInfoForWriting) {\n  const outDir = buildInfoForWriting.outDir || \"dist\";\n  const prefix = `${outDir}/middlewares/`;\n  return buildInfoForWriting.manifest.allRoutes.filter((r) => r.middlewares && r.middlewares.length > 0).map((r) => [\n    r.namedRegex,\n    r.middlewares.map(\n      (m) => m.contextKey.startsWith(prefix) ? m.contextKey.substring(prefix.length) : m.contextKey\n    )\n  ]).sort((a, b) => b[0].length - a[0].length);\n}\nconst buildVercelOutputDirectory = async ({\n  apiOutput,\n  buildInfoForWriting,\n  clientDir,\n  oneOptionsRoot,\n  postBuildLogs\n}) => {\n  const outDir = buildInfoForWriting.outDir || \"dist\";\n  const vercelOutputDir = resolve(join(oneOptionsRoot, \".vercel/output\"));\n  if (existsSync(vercelOutputDir)) {\n    await remove(vercelOutputDir);\n  }\n  const { routeToBuildInfo } = buildInfoForWriting;\n  if (apiOutput) {\n    const compiltedApiRoutes = (apiOutput?.output ?? []).filter(\n      (o) => isMatching({ code: P.string, facadeModuleId: P.string }, o)\n    );\n    for (const route of buildInfoForWriting.manifest.apiRoutes) {\n      const compiledRoute = compiltedApiRoutes.find((compiled) => {\n        const flag = compiled.facadeModuleId.includes(route.file.replace(\"./\", \"\"));\n        return flag;\n      });\n      if (compiledRoute) {\n        postBuildLogs.push(\n          `[one.build][vercel] generating serverless function for apiRoute ${route.page}`\n        );\n        await createApiServerlessFunction(\n          route,\n          compiledRoute.code,\n          oneOptionsRoot,\n          postBuildLogs,\n          outDir\n        );\n      } else {\n        console.warn(\n          \"\\n \\u{1F528}[one.build][vercel] apiRoute missing code compilation for\",\n          route.file\n        );\n      }\n    }\n  }\n  const vercelOutputFunctionsDir = join(oneOptionsRoot, \".vercel/output/functions\");\n  await ensureDir(vercelOutputFunctionsDir);\n  for (const route of buildInfoForWriting.manifest.pageRoutes) {\n    switch (route.type) {\n      case \"ssr\": {\n        const builtPageRoute = routeToBuildInfo[route.file];\n        if (builtPageRoute) {\n          postBuildLogs.push(\n            `[one.build][vercel] generate serverless function for ${route.page} with ${route.type}`\n          );\n          await createSsrServerlessFunction(\n            route,\n            buildInfoForWriting,\n            oneOptionsRoot,\n            postBuildLogs\n          );\n        }\n        break;\n      }\n      default:\n        break;\n    }\n  }\n  const distMiddlewareDir = resolve(join(oneOptionsRoot, outDir, \"middlewares\"));\n  if (existsSync(distMiddlewareDir)) {\n    const vercelMiddlewareDir = resolve(\n      join(oneOptionsRoot, \".vercel/output/functions/_middleware.func\")\n    );\n    await ensureDir(vercelMiddlewareDir);\n    postBuildLogs.push(\n      `[one.build][vercel] copying middlewares from ${distMiddlewareDir} to ${vercelMiddlewareDir}`\n    );\n    await moveAllFiles(\n      resolve(join(oneOptionsRoot, outDir, \"middlewares\")),\n      vercelMiddlewareDir\n    );\n    const vercelMiddlewarePackageJsonFilePath = resolve(\n      join(vercelMiddlewareDir, \"package.json\")\n    );\n    postBuildLogs.push(\n      `[one.build][vercel] writing package.json to ${vercelMiddlewarePackageJsonFilePath}`\n    );\n    await writeJSON(vercelMiddlewarePackageJsonFilePath, serverlessVercelPackageJson);\n    const wrappedMiddlewareEntryPointFilename = \"_wrapped_middleware.js\";\n    const wrappedMiddlewareEntryPointPath = resolve(\n      join(vercelMiddlewareDir, wrappedMiddlewareEntryPointFilename)\n    );\n    const middlewaresByNamedRegex = getMiddlewaresByNamedRegex(buildInfoForWriting);\n    const middlewaresToVariableNameMap = middlewaresByNamedRegex.reduce(\n      (acc, [namedRegex, middlewares]) => {\n        ;\n        (Array.isArray(middlewares) ? middlewares : [middlewares]).forEach(\n          (middleware) => {\n            const middlewareVariableName = middleware.replace(/\\.[a-z]+$/, \"\").replaceAll(\"/\", \"_\");\n            acc[middleware] = middlewareVariableName;\n          }\n        );\n        return acc;\n      },\n      {}\n    );\n    await FSExtra.writeFile(\n      wrappedMiddlewareEntryPointPath,\n      `\nconst middlewaresByNamedRegex = ${JSON.stringify(middlewaresByNamedRegex)}\n${Object.entries(middlewaresToVariableNameMap).map(([path, variableName]) => `import ${variableName} from './${path}'`).join(\"\\n\")}\n\nfunction getMiddleware(path) {\n  switch (path){\n      ${Object.entries(middlewaresToVariableNameMap).map(([path, variableName]) => `case '${path}': return ${variableName}`).join(\"\\n\")}\n      default: return null\n  }\n}\n\nconst next = (e) => {\n  const t = new Headers(null == e ? void 0 : e.headers)\n  t.set('x-middleware-next', '1')\n  return new Response(null, { ...e, headers: t })\n}\n\nconst wrappedMiddlewareFunction = (request, event) => {\n  const url = new URL(request.url)\n  const pathname = url.pathname\n  \n  // Find matching middlewares for this request\n  const matchingMiddlewares = [...middlewaresByNamedRegex\n    .filter(([namedRegex]) => new RegExp(namedRegex).test(pathname))\n    .reduce((prev, current) => prev.length > current[1]?.length ? prev : current[1], [])];\n  \n  // Import and execute the middleware function\n  const boundNext = () => {\n    if (matchingMiddlewares.length === 0) {\n      return next(request)\n    }\n      \n    const middleware = getMiddleware(matchingMiddlewares.shift())\n    return middleware ? middleware({request, event, next: boundNext}) : next(request)\n  };\n  return boundNext()\n}\n\nexport { wrappedMiddlewareFunction as default }\n  `\n    );\n    const middlewareVercelConfigFilePath = resolve(\n      join(vercelMiddlewareDir, \".vc-config.json\")\n    );\n    postBuildLogs.push(\n      `[one.build][vercel] writing .vc-config.json to ${middlewareVercelConfigFilePath}`\n    );\n    await writeJSON(middlewareVercelConfigFilePath, {\n      runtime: \"edge\",\n      // Seems that middlewares only work with edge runtime\n      entrypoint: wrappedMiddlewareEntryPointFilename\n    });\n  }\n  const vercelOutputStaticDir = resolve(join(oneOptionsRoot, \".vercel/output/static\"));\n  await ensureDir(vercelOutputStaticDir);\n  postBuildLogs.push(\n    `[one.build][vercel] copying static files from ${clientDir} to ${vercelOutputStaticDir}`\n  );\n  await moveAllFiles(clientDir, vercelOutputStaticDir);\n  const ssrLoaderRoutes = buildInfoForWriting.manifest.pageRoutes.filter((r) => r.type === \"ssr\").map((r) => {\n    const pagePath = getPathFromRoute(r) || \"/\";\n    const cleanPath = pagePath.slice(1).replace(/\\//g, \"_\");\n    const paramPattern = /\\[(?:\\.\\.\\.)?(\\w+)\\]/g;\n    const loaderPattern = cleanPath.replace(paramPattern, \"(?<$1>[^_]+)\");\n    const src = `^/assets/${loaderPattern}(?:_refetch_\\\\d+)?_\\\\d+_vxrn_loader\\\\.js$`;\n    let dest = `${pagePath}?__loader=1`;\n    for (const [, paramName] of cleanPath.matchAll(paramPattern)) {\n      dest += `&${paramName}=$${paramName}`;\n    }\n    return { src, dest };\n  });\n  const spaRoutes = buildInfoForWriting.manifest.pageRoutes.filter((route) => route.type === \"spa\" && !route.isNotFound).flatMap((route) => {\n    const htmlPath = routeToBuildInfo[route.file]?.htmlPath;\n    return htmlPath ? [{ src: route.namedRegex, dest: htmlPath }] : [];\n  });\n  const vercelConfigFilePath = resolve(\n    join(oneOptionsRoot, \".vercel/output\", \"config.json\")\n  );\n  await writeJSON(vercelConfigFilePath, {\n    ...vercelBuildOutputConfigBase,\n    routes: [\n      ...vercelBuildOutputConfigBase.routes,\n      ...existsSync(distMiddlewareDir) ? [\n        {\n          src: \"/(.*)\",\n          middlewarePath: \"_middleware\",\n          continue: true\n        }\n      ] : [],\n      {\n        handle: \"rewrite\"\n      },\n      // SSR loader routes must come before dynamic page routes\n      ...ssrLoaderRoutes,\n      ...spaRoutes,\n      ...buildInfoForWriting.manifest.allRoutes.filter((r) => r.routeKeys && Object.keys(r.routeKeys).length > 0).map((r) => ({\n        src: r.namedRegex,\n        dest: `${getPathFromRoute(r) || \"/\"}?${Object.entries(r.routeKeys).map(([k, v]) => `${k}=$${v}`).join(\"&\")}`\n      }))\n    ]\n  });\n  postBuildLogs.push(`[one.build] wrote vercel config to: ${vercelConfigFilePath}`);\n};\nexport {\n  buildVercelOutputDirectory\n};\n//# sourceMappingURL=buildVercelOutputDirectory.js.map\n"],"mappings":"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"}