{"version":3,"file":"workerdDevPlugin.js","names":[],"sources":["esm/vite/plugins/workerdDevPlugin.js"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolvePath } from \"@vxrn/resolve\";\nimport { cloudflare } from \"@cloudflare/vite-plugin\";\nimport { getPlatformEnvDefine } from \"@vxrn/vite-plugin-metro\";\nimport { exactRegex } from \"rolldown/filter\";\nimport { CACHE_KEY } from \"../../constants\";\nimport { virtalEntryIdClient, virtualEntryId } from \"./virtualEntryConstants\";\nimport { getManifest } from \"../getManifest\";\nimport { getRouterRootFromOneOptions } from \"../../utils/getRouterRootFromOneOptions\";\nimport { absorbedPackageAliases } from \"../../utils/absorbedPackages\";\nimport {\n  createCloudflareWranglerConfig,\n  getCloudflareProjectNameSync,\n  loadUserWranglerConfigSync,\n  shouldEnableWorkerdDev\n} from \"../cloudflareWranglerConfig\";\nconst workerdDevEntryId = \"virtual:one-workerd-dev-entry\";\nconst resolvedWorkerdDevEntryId = `\\0${workerdDevEntryId}`;\nconst WORKERD_DEV_DIR = \"node_modules/.one-workerd-dev\";\nfunction serveOnly(plugin) {\n  const existing = plugin.apply;\n  return {\n    ...plugin,\n    apply(config, env) {\n      if (env.command !== \"serve\") return false;\n      if (typeof existing === \"function\") return existing(config, env);\n      if (existing === \"build\") return false;\n      return true;\n    }\n  };\n}\nfunction toImportHref(root, routerRoot, routeFile) {\n  const rel = routeFile.replace(/^\\.\\//, \"\");\n  return pathToFileURL(resolve(root, routerRoot, rel)).href;\n}\nfunction serializeImportMap(entries) {\n  return entries.map(\n    ([key, href]) => `  ${JSON.stringify(key)}: () => import(${JSON.stringify(href)})`\n  ).join(\",\\n\");\n}\nfunction stripRouteForWorker(route) {\n  const { layouts, middlewares, ...rest } = route;\n  return {\n    ...rest,\n    // live-render SSG in dev the same way the node middleware does\n    type: route.type === \"ssg\" ? \"ssr\" : route.type,\n    layouts: layouts?.map((layout) => ({\n      contextKey: layout.contextKey\n    })),\n    middlewares: middlewares?.map((middleware) => ({\n      contextKey: middleware.contextKey\n    }))\n  };\n}\nfunction stubRouteBuildInfo(route, preloads) {\n  const pageType = route.type === \"ssg\" ? \"ssr\" : route.type;\n  return {\n    type: pageType,\n    path: route.page,\n    routeFile: route.file,\n    middlewares: route.middlewares?.map((middleware) => middleware.contextKey) ?? [],\n    preloadPath: \"\",\n    cssPreloadPath: \"\",\n    loaderPath: \"\",\n    cleanPath: route.urlCleanPath || route.page,\n    htmlPath: \"\",\n    clientJsPath: \"\",\n    serverJsPath: \"\",\n    params: {},\n    preloads,\n    css: [],\n    layoutCSS: []\n  };\n}\nfunction generateWorkerdDevEntryModule(args) {\n  const { root, options, routerRoot, routePaths, preloads } = args;\n  const manifest = getManifest({\n    routerRoot: resolve(root, routerRoot),\n    ignoredRouteFiles: options.router?.ignoredRouteFiles,\n    routePaths\n  });\n  if (!manifest) {\n    throw new Error(\"[one] workerd dev: no routes manifest\");\n  }\n  const apiImports = /* @__PURE__ */ new Map();\n  const middlewareImports = /* @__PURE__ */ new Map();\n  const routeToBuildInfo = {};\n  for (const route of manifest.pageRoutes) {\n    for (const middleware of route.middlewares || []) {\n      if (!middleware.contextKey || middlewareImports.has(middleware.contextKey)) continue;\n      middlewareImports.set(\n        middleware.contextKey,\n        toImportHref(root, routerRoot, middleware.contextKey)\n      );\n    }\n    if (route.file) {\n      routeToBuildInfo[route.file] = stubRouteBuildInfo(route, preloads);\n    }\n  }\n  for (const route of manifest.apiRoutes) {\n    if (route.file) {\n      apiImports.set(route.page, toImportHref(root, routerRoot, route.file));\n    }\n    for (const middleware of route.middlewares || []) {\n      if (!middleware.contextKey || middlewareImports.has(middleware.contextKey)) continue;\n      middlewareImports.set(\n        middleware.contextKey,\n        toImportHref(root, routerRoot, middleware.contextKey)\n      );\n    }\n  }\n  const pageRoutes = manifest.pageRoutes.map(stripRouteForWorker);\n  const apiRoutes = manifest.apiRoutes.map(stripRouteForWorker);\n  const buildInfo = {\n    constants: { CACHE_KEY },\n    oneOptions: options,\n    routeToBuildInfo,\n    pathToRoute: {},\n    routeMap: {},\n    manifest: {\n      pageRoutes,\n      apiRoutes,\n      allRoutes: [...pageRoutes, ...apiRoutes]\n    },\n    preloads: Object.fromEntries(preloads.map((preload) => [preload, true])),\n    cssPreloads: {},\n    loaders: {}\n  };\n  const spaPreloadScripts = preloads.map((preload) => `<script type=\"module\" src=\"${preload}\"></script>`).join(\"\");\n  return `if (typeof MessageChannel === 'undefined') {\n  globalThis.MessageChannel = class MessageChannel {\n    constructor() {\n      this.port1 = { postMessage: () => {}, onmessage: null, close: () => {} }\n      this.port2 = { postMessage: () => {}, onmessage: null, close: () => {} }\n    }\n  }\n}\n\nimport { serve, setFetchStaticHtml } from 'one/serve-worker'\n\nconst lazyRoutes = {\n  serverEntry: () => import(${JSON.stringify(virtualEntryId)}),\n  api: {\n${serializeImportMap([...apiImports])}\n  },\n  middlewares: {\n${serializeImportMap([...middlewareImports])}\n  }\n}\n\nconst buildInfo = ${JSON.stringify(buildInfo)}\n\nlet server\n\nexport default {\n  async fetch(request, env, ctx) {\n    const url = new URL(request.url)\n    const pathname = url.pathname\n\n    if (pathname === '/status' || pathname.startsWith('/status?')) {\n      return new Response('packager-status:running', {\n        headers: { 'content-type': 'text/plain' },\n      })\n    }\n\n    if (!server) {\n      server = await serve(buildInfo, lazyRoutes, { disableModuleCache: true })\n    }\n\n    if (env && env.ASSETS) {\n      setFetchStaticHtml(async (path) => {\n        try {\n          const assetUrl = new URL(request.url)\n          assetUrl.pathname = path\n          const assetResponse = await env.ASSETS.fetch(new Request(assetUrl))\n          if (assetResponse && assetResponse.ok) {\n            return await assetResponse.text()\n          }\n        } catch {}\n        return null\n      })\n    }\n\n    try {\n      const response = await server.fetch(request, env, ctx)\n\n      if (!response || response.status === 404) {\n        if (env && env.ASSETS) {\n          try {\n            const assetResponse = await env.ASSETS.fetch(request)\n            if (assetResponse && assetResponse.status !== 404) {\n              return assetResponse\n            }\n          } catch {}\n        }\n      }\n\n      if (!response) {\n        if (request.method === 'GET' || request.method === 'HEAD') {\n          return new Response(\n            '<!DOCTYPE html><html><head>' +\n              ${JSON.stringify(spaPreloadScripts)} +\n              '</head></html>',\n            { headers: { 'content-type': 'text/html' } }\n          )\n        }\n        return new Response('Not Found', { status: 404 })\n      }\n\n      return response\n    } finally {\n      setFetchStaticHtml(null)\n    }\n  }\n}\n`;\n}\nfunction createWorkerdDevPlugins(options, root, routeIndex) {\n  if (!shouldEnableWorkerdDev(options.web?.deploy, root)) {\n    return [];\n  }\n  const cacheDir = join(root, WORKERD_DEV_DIR);\n  const wranglerInputPath = join(cacheDir, \"_wrangler.input.jsonc\");\n  const workerEntryPath = join(cacheDir, \"worker-entry.js\");\n  mkdirSync(cacheDir, { recursive: true });\n  writeFileSync(\n    workerEntryPath,\n    `export { default } from ${JSON.stringify(workerdDevEntryId)}\n`\n  );\n  const userWranglerConfig = loadUserWranglerConfigSync(root);\n  const projectName = getCloudflareProjectNameSync(root);\n  const wranglerInputConfig = createCloudflareWranglerConfig(\n    projectName,\n    userWranglerConfig?.config\n  );\n  wranglerInputConfig.main = \"worker-entry.js\";\n  writeFileSync(wranglerInputPath, `${JSON.stringify(wranglerInputConfig, null, 2)}\n`);\n  const preloads = options.web?.experimentalBundledDev ? [\"/bundledDevClient.mjs\", \"/assets/_virtual_one-entry.js\"] : [\"/@vite/client\", virtalEntryIdClient];\n  const empty = resolvePath(\"@vxrn/vite-plugin-metro/empty\", root);\n  const absorbed = absorbedPackageAliases(root, \"web\");\n  const preparePlugin = {\n    name: \"one:workerd-dev-prepare\",\n    apply: \"serve\",\n    enforce: \"pre\",\n    config() {\n      return {\n        environments: {\n          worker: {\n            define: {\n              ...getPlatformEnvDefine(\"ssr\"),\n              \"process.env.TAMAGUI_IS_SERVER\": JSON.stringify(\"1\"),\n              \"process.env.TAMAGUI_KEEP_THEMES\": JSON.stringify(\"1\"),\n              \"process.env.ONE_CACHE_KEY\": JSON.stringify(CACHE_KEY)\n            },\n            optimizeDeps: {\n              include: [\n                \"react\",\n                \"react-dom\",\n                \"react-dom/client\",\n                \"react-dom/server.browser\",\n                \"react/jsx-runtime\",\n                \"react/jsx-dev-runtime\"\n              ]\n            },\n            build: {\n              rolldownOptions: {\n                shimMissingExports: true\n              }\n            }\n          }\n        }\n      };\n    },\n    // environment resolve options have no alias field; match the production\n    // worker aliases with a worker-only resolveId (rolldown cannot parse RN Flow)\n    resolveId: {\n      filter: {\n        id: /^(react-native(\\/|$|-safe-area-context$)|@react-native\\/assets-registry\\/registry$)/\n      },\n      handler(source) {\n        if (this.environment.name !== \"worker\") return;\n        if (/^react-native\\/Libraries\\//.test(source)) return empty;\n        if (source === \"react-native/asset-registry\" || source === \"@react-native/assets-registry/registry\")\n          return resolvePath(\"react-native-web/dist/modules/AssetRegistry\", root);\n        if (source === \"react-native/package.json\")\n          return resolvePath(\"react-native-web/package.json\", root);\n        if (source === \"react-native\") return resolvePath(\"react-native-web\", root);\n        if (source in absorbed) return absorbed[source];\n      }\n    },\n    configureServer(server) {\n      if (!server.environments.worker) {\n        throw new Error(\n          `[one] ONE_EXPERIMENTAL_WORKER_DEV=1 is set but @cloudflare/vite-plugin did not register a \"worker\" environment. Expected wrangler config at ${wranglerInputPath}.`\n        );\n      }\n      console.info(\n        \"[one] experimental workerd dev enabled (ONE_EXPERIMENTAL_WORKER_DEV=1)\"\n      );\n    }\n  };\n  const virtualPlugin = {\n    name: \"one:workerd-dev-entry\",\n    apply: \"serve\",\n    resolveId: {\n      filter: { id: exactRegex(workerdDevEntryId) },\n      handler(id) {\n        if (this.environment.name !== \"worker\") return;\n        if (id === workerdDevEntryId) return resolvedWorkerdDevEntryId;\n      }\n    },\n    load: {\n      filter: { id: exactRegex(resolvedWorkerdDevEntryId) },\n      handler() {\n        if (this.environment.name !== \"worker\") return;\n        return generateWorkerdDevEntryModule({\n          root,\n          options,\n          routerRoot: getRouterRootFromOneOptions(options),\n          routePaths: routeIndex.getPaths(),\n          preloads\n        });\n      }\n    },\n    hotUpdate({ file }) {\n      if (this.environment.name !== \"worker\") return;\n      const graph = this.environment.moduleGraph;\n      const entry = graph.getModuleById(resolvedWorkerdDevEntryId);\n      if (!entry) return;\n      const modules = graph.getModulesByFile(file);\n      if (!modules?.size) return;\n      graph.invalidateModule(entry);\n    }\n  };\n  const cloudflarePlugins = cloudflare({\n    configPath: wranglerInputPath,\n    viteEnvironment: { name: \"worker\" }\n  }).map(serveOnly);\n  return [preparePlugin, virtualPlugin, ...cloudflarePlugins];\n}\nexport {\n  createWorkerdDevPlugins,\n  generateWorkerdDevEntryModule,\n  shouldEnableWorkerdDev,\n  workerdDevEntryId\n};\n//# sourceMappingURL=workerdDevPlugin.js.map\n"],"mappings":"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"}