one
Version:
One is a React framework for web, iOS, and Android apps.
1 lines • 17 kB
Source Map (JSON)
{"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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"}