@cloudflare/worker-bundler 0.0.0 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +494 -0
- package/dist/esbuild.wasm +0 -0
- package/dist/index.d.ts +383 -0
- package/dist/index.js +1681 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["getDirectory","parseToml"],"sources":["../src/resolver.ts","../src/bundler.ts","../src/config.ts","../src/installer.ts","../src/transformer.ts","../src/utils.ts","../src/experimental.ts","../src/mime.ts","../src/asset-handler.ts","../src/_asset-runtime-code.ts","../src/app.ts","../src/index.ts"],"sourcesContent":["// Use the asm.js version to avoid WASM (works in workerd)\nimport { parse } from \"es-module-lexer/js\";\nimport * as resolveExports from \"resolve.exports\";\nimport type { Files } from \"./types\";\n\nexport interface ResolveOptions {\n /**\n * All files in the virtual file system\n */\n files: Files;\n\n /**\n * Directory of the importing file (relative to root)\n */\n importer?: string;\n\n /**\n * Conditions for exports resolution (e.g., 'import', 'require', 'browser')\n */\n conditions?: string[];\n\n /**\n * Extensions to try when resolving\n */\n extensions?: string[];\n}\n\nexport interface ResolveResult {\n /**\n * Resolved path (relative to root)\n */\n path: string;\n\n /**\n * Whether this is an external module (npm package not in files)\n */\n external: boolean;\n}\n\nconst DEFAULT_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".json\"\n];\n\n/**\n * Resolve a module specifier to a file path in the virtual file system.\n *\n * Handles:\n * - Relative imports (./foo, ../bar)\n * - Package imports (lodash, @scope/pkg)\n * - Package.json exports field\n * - Extension resolution (.ts, .tsx, .js, etc.)\n * - Index file resolution (foo/index.ts)\n *\n * @param specifier - The import specifier (e.g., './utils', 'lodash')\n * @param options - Resolution options\n * @returns Resolved path or external marker\n */\nexport function resolveModule(\n specifier: string,\n options: ResolveOptions\n): ResolveResult {\n const {\n files,\n importer = \"\",\n conditions = [\"import\", \"browser\"],\n extensions = DEFAULT_EXTENSIONS\n } = options;\n\n // Handle relative imports\n if (specifier.startsWith(\".\") || specifier.startsWith(\"/\")) {\n const resolved = resolveRelative(specifier, importer, files, extensions);\n if (resolved) {\n return { path: resolved, external: false };\n }\n // Relative import not found\n throw new Error(\n `Cannot resolve relative import '${specifier}' from '${importer}'`\n );\n }\n\n // Handle bare specifiers (npm packages)\n return resolvePackage(specifier, files, conditions, extensions);\n}\n\n/**\n * Resolve a relative import\n */\nfunction resolveRelative(\n specifier: string,\n importer: string,\n files: Files,\n extensions: string[]\n): string | undefined {\n // Get the directory of the importer\n const importerDir = getDirectory(importer);\n\n // Resolve the path\n const resolved = joinPaths(importerDir, specifier);\n\n return resolveWithExtensions(resolved, files, extensions);\n}\n\n/**\n * Resolve a package specifier\n */\nfunction resolvePackage(\n specifier: string,\n files: Files,\n conditions: string[],\n extensions: string[]\n): ResolveResult {\n // Parse the specifier\n const { packageName, subpath } = parsePackageSpecifier(specifier);\n\n // Look for the package in node_modules\n const packageJsonPath = `node_modules/${packageName}/package.json`;\n const packageJson = files[packageJsonPath];\n\n if (!packageJson) {\n // Package not found in files, mark as external\n return { path: specifier, external: true };\n }\n\n // Parse package.json\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(packageJson) as Record<string, unknown>;\n } catch {\n throw new Error(`Invalid package.json for ${packageName}`);\n }\n\n // Use resolve.exports to handle the exports field\n const entrySubpath = subpath ? `./${subpath}` : \".\";\n\n try {\n const resolved = resolveExports.resolve(pkg, entrySubpath, { conditions });\n if (resolved && resolved.length > 0) {\n // resolve.exports returns relative paths like './dist/index.js'\n const resolvedPath = resolved[0];\n if (resolvedPath) {\n const fullPath = `node_modules/${packageName}/${normalizeRelativePath(resolvedPath)}`;\n if (fullPath in files) {\n return { path: fullPath, external: false };\n }\n }\n }\n } catch {\n // resolve.exports failed, try legacy resolution\n }\n\n // Fall back to legacy resolution (main, module fields)\n const legacyEntry = resolveExports.legacy(pkg, {\n fields: [\"module\", \"main\"]\n });\n if (legacyEntry && typeof legacyEntry === \"string\") {\n const fullPath = `node_modules/${packageName}/${normalizeRelativePath(legacyEntry)}`;\n if (fullPath in files) {\n return { path: fullPath, external: false };\n }\n }\n\n // Try index files directly\n const indexPath = resolveWithExtensions(\n `node_modules/${packageName}${subpath ? `/${subpath}` : \"\"}`,\n files,\n extensions\n );\n if (indexPath) {\n return { path: indexPath, external: false };\n }\n\n // Package found but entry point not resolved, mark as external\n return { path: specifier, external: true };\n}\n\n/**\n * Try to resolve a path with various extensions and index files\n */\nfunction resolveWithExtensions(\n path: string,\n files: Files,\n extensions: string[]\n): string | undefined {\n // Normalize the path\n const normalized = normalizePath(path);\n\n // Try exact match first\n if (normalized in files) {\n return normalized;\n }\n\n // Try adding extensions\n for (const ext of extensions) {\n const withExt = normalized + ext;\n if (withExt in files) {\n return withExt;\n }\n }\n\n // Try index files\n for (const ext of extensions) {\n const indexPath = `${normalized}/index${ext}`;\n if (indexPath in files) {\n return indexPath;\n }\n }\n\n return undefined;\n}\n\n/**\n * Parse a package specifier into package name and subpath\n */\nfunction parsePackageSpecifier(specifier: string): {\n packageName: string;\n subpath: string | undefined;\n} {\n // Handle scoped packages (@scope/pkg)\n if (specifier.startsWith(\"@\")) {\n const parts = specifier.split(\"/\");\n if (parts.length >= 2) {\n const packageName = `${parts[0]}/${parts[1]}`;\n const subpath = parts.slice(2).join(\"/\") || undefined;\n return { packageName, subpath };\n }\n }\n\n // Handle regular packages\n const slashIndex = specifier.indexOf(\"/\");\n if (slashIndex === -1) {\n return { packageName: specifier, subpath: undefined };\n }\n\n return {\n packageName: specifier.slice(0, slashIndex),\n subpath: specifier.slice(slashIndex + 1)\n };\n}\n\n/**\n * Get the directory of a file path\n */\nfunction getDirectory(filePath: string): string {\n const lastSlash = filePath.lastIndexOf(\"/\");\n if (lastSlash === -1) {\n return \"\";\n }\n return filePath.slice(0, lastSlash);\n}\n\n/**\n * Join two paths\n */\nfunction joinPaths(base: string, relative: string): string {\n if (relative.startsWith(\"/\")) {\n return relative.slice(1);\n }\n\n const baseParts = base ? base.split(\"/\") : [];\n const relativeParts = relative.split(\"/\");\n\n for (const part of relativeParts) {\n if (part === \"..\") {\n baseParts.pop();\n } else if (part !== \".\") {\n baseParts.push(part);\n }\n }\n\n return baseParts.join(\"/\");\n}\n\n/**\n * Normalize a path (remove ./ prefix, handle multiple slashes)\n */\nfunction normalizePath(path: string): string {\n return path.replace(/^\\.\\//, \"\").replace(/\\/+/g, \"/\").replace(/\\/$/, \"\");\n}\n\n/**\n * Normalize a relative path from package.json\n */\nfunction normalizeRelativePath(path: string): string {\n if (path.startsWith(\"./\")) {\n return path.slice(2);\n }\n if (path.startsWith(\"/\")) {\n return path.slice(1);\n }\n return path;\n}\n\n/**\n * Parse imports from a JavaScript/TypeScript source file.\n *\n * Uses es-module-lexer for accurate parsing of ES module syntax.\n * Falls back to regex for JSX files since es-module-lexer doesn't\n * handle JSX syntax (e.g., `<div>` is not valid JavaScript).\n */\nexport function parseImports(code: string): string[] {\n try {\n const [imports] = parse(code);\n const specifiers: string[] = [];\n\n for (const imp of imports) {\n // imp.n is the resolved module specifier (handles escape sequences)\n // imp.n is undefined for dynamic imports with non-string arguments\n if (imp.n !== undefined) {\n specifiers.push(imp.n);\n }\n }\n\n return [...new Set(specifiers)]; // Deduplicate\n } catch {\n // es-module-lexer fails on JSX syntax (<Component />) and malformed code\n // Fall back to regex-based parsing\n return parseImportsRegex(code);\n }\n}\n\n/**\n * Regex-based fallback for parsing imports.\n * Used when es-module-lexer fails (e.g., on JSX/TSX files).\n */\nfunction parseImportsRegex(code: string): string[] {\n const imports: string[] = [];\n\n // Match ES module imports\n // import foo from 'bar'\n // import { foo } from 'bar'\n // import * as foo from 'bar'\n // import 'bar'\n const importRegex =\n /import\\s+(?:(?:[\\w*{}\\s,]+)\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n for (const match of code.matchAll(importRegex)) {\n const specifier = match[1];\n if (specifier) {\n imports.push(specifier);\n }\n }\n\n // Match dynamic imports\n // import('bar')\n // await import('bar')\n const dynamicImportRegex = /import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n for (const match of code.matchAll(dynamicImportRegex)) {\n const specifier = match[1];\n if (specifier) {\n imports.push(specifier);\n }\n }\n\n // Match export from\n // export { foo } from 'bar'\n // export * from 'bar'\n const exportFromRegex =\n /export\\s+(?:[\\w*{}\\s,]+\\s+)?from\\s+['\"]([^'\"]+)['\"]/g;\n for (const match of code.matchAll(exportFromRegex)) {\n const specifier = match[1];\n if (specifier) {\n imports.push(specifier);\n }\n }\n\n return [...new Set(imports)]; // Deduplicate\n}\n","/**\n * esbuild-wasm bundling functionality.\n */\n\n// Use the browser entry directly — the default \"main\" entry rejects\n// wasmModule in Workers with nodejs_compat (it thinks it's Node.js).\nimport * as esbuild from \"esbuild-wasm/lib/browser.js\";\n\n// @ts-expect-error - WASM module import\nimport esbuildWasm from \"./esbuild.wasm\";\nimport { resolveModule } from \"./resolver\";\nimport type { CreateWorkerResult, Files, Modules } from \"./types\";\n\n/**\n * Bundle files using esbuild-wasm\n */\nexport async function bundleWithEsbuild(\n files: Files,\n entryPoint: string,\n externals: string[],\n target: string,\n minify: boolean,\n sourcemap: boolean,\n nodejsCompat: boolean\n): Promise<CreateWorkerResult> {\n // Ensure esbuild is initialized (happens lazily on first use)\n await initializeEsbuild();\n\n // Create a virtual file system plugin for esbuild\n const virtualFsPlugin: esbuild.Plugin = {\n name: \"virtual-fs\",\n setup(build) {\n // Resolve all paths to our virtual file system\n build.onResolve({ filter: /.*/ }, (args) => {\n // Handle entry point - it's passed directly without ./ prefix\n if (args.kind === \"entry-point\") {\n return { path: args.path, namespace: \"virtual\" };\n }\n\n // Handle relative imports\n if (args.path.startsWith(\".\")) {\n const resolved = resolveRelativePath(\n args.resolveDir,\n args.path,\n files\n );\n if (resolved) {\n return { path: resolved, namespace: \"virtual\" };\n }\n }\n\n // Handle bare imports (npm packages)\n if (!args.path.startsWith(\"/\") && !args.path.startsWith(\".\")) {\n // Check if it's in externals\n if (\n externals.includes(args.path) ||\n externals.some(\n (e) => args.path.startsWith(`${e}/`) || args.path.startsWith(e)\n )\n ) {\n return { path: args.path, external: true };\n }\n\n // Try to resolve from node_modules in virtual fs\n try {\n const result = resolveModule(args.path, { files });\n if (!result.external) {\n return { path: result.path, namespace: \"virtual\" };\n }\n } catch {\n // Resolution failed\n }\n\n // Mark as external (package not found in node_modules)\n return { path: args.path, external: true };\n }\n\n // Absolute paths in virtual fs\n const normalizedPath = args.path.startsWith(\"/\")\n ? args.path.slice(1)\n : args.path;\n if (normalizedPath in files) {\n return { path: normalizedPath, namespace: \"virtual\" };\n }\n\n return { path: args.path, external: true };\n });\n\n // Load files from virtual file system\n build.onLoad({ filter: /.*/, namespace: \"virtual\" }, (args) => {\n const content = files[args.path];\n if (content === undefined) {\n return { errors: [{ text: `File not found: ${args.path}` }] };\n }\n\n const loader = getLoader(args.path);\n // Set resolveDir so relative imports within this file resolve correctly\n const lastSlash = args.path.lastIndexOf(\"/\");\n const resolveDir = lastSlash >= 0 ? args.path.slice(0, lastSlash) : \"\";\n return { contents: content, loader, resolveDir };\n });\n }\n };\n\n const result = await esbuild.build({\n entryPoints: [entryPoint],\n bundle: true,\n write: false,\n format: \"esm\",\n platform: nodejsCompat ? \"node\" : \"browser\",\n target,\n minify,\n sourcemap: sourcemap ? \"inline\" : false,\n plugins: [virtualFsPlugin],\n outfile: \"bundle.js\"\n });\n\n const output = result.outputFiles?.[0];\n if (!output) {\n throw new Error(\"No output generated from esbuild\");\n }\n\n const modules: Modules = {\n \"bundle.js\": output.text\n };\n\n const warnings = result.warnings.map((w) => w.text);\n if (warnings.length > 0) {\n return { mainModule: \"bundle.js\", modules, warnings };\n }\n return { mainModule: \"bundle.js\", modules };\n}\n\n/**\n * Resolve a relative path against a directory within the virtual filesystem.\n */\nfunction resolveRelativePath(\n resolveDir: string,\n relativePath: string,\n files: Files\n): string | undefined {\n // Normalize the resolve directory\n const dir = resolveDir.replace(/^\\//, \"\");\n\n // Resolve the relative path\n const parts = dir ? dir.split(\"/\") : [];\n const relParts = relativePath.split(\"/\");\n\n for (const part of relParts) {\n if (part === \"..\") {\n parts.pop();\n } else if (part !== \".\") {\n parts.push(part);\n }\n }\n\n const resolved = parts.join(\"/\");\n\n // Try exact match\n if (resolved in files) {\n return resolved;\n }\n\n // Try adding extensions\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mts\", \".mjs\"];\n for (const ext of extensions) {\n if (resolved + ext in files) {\n return resolved + ext;\n }\n }\n\n // Try index files\n for (const ext of extensions) {\n const indexPath = `${resolved}/index${ext}`;\n if (indexPath in files) {\n return indexPath;\n }\n }\n\n return undefined;\n}\n\nfunction getLoader(path: string): esbuild.Loader {\n if (path.endsWith(\".ts\") || path.endsWith(\".mts\")) return \"ts\";\n if (path.endsWith(\".tsx\")) return \"tsx\";\n if (path.endsWith(\".jsx\")) return \"jsx\";\n if (path.endsWith(\".json\")) return \"json\";\n if (path.endsWith(\".css\")) return \"css\";\n return \"js\";\n}\n\n// Track esbuild initialization state\nlet esbuildInitialized = false;\nlet esbuildInitializePromise: Promise<void> | null = null;\n\n/**\n * Initialize the esbuild bundler.\n * This is called automatically when needed.\n */\nasync function initializeEsbuild(): Promise<void> {\n // If already initialized, return immediately\n if (esbuildInitialized) return;\n\n // If initialization is in progress, wait for it\n if (esbuildInitializePromise) {\n return esbuildInitializePromise;\n }\n\n // Start initialization\n esbuildInitializePromise = (async () => {\n try {\n await esbuild.initialize({\n wasmModule: esbuildWasm,\n worker: false\n });\n\n esbuildInitialized = true;\n } catch (error) {\n // If initialization fails, esbuild may already be initialized\n if (\n error instanceof Error &&\n error.message.includes('Cannot call \"initialize\" more than once')\n ) {\n esbuildInitialized = true;\n return;\n }\n throw error;\n }\n })();\n\n try {\n await esbuildInitializePromise;\n } catch (error) {\n // Reset promise so caller can try again\n esbuildInitializePromise = null;\n throw error;\n }\n}\n","/**\n * Wrangler configuration parsing.\n *\n * Parses wrangler.toml, wrangler.json, and wrangler.jsonc files\n * to extract compatibility settings.\n */\n\nimport { parse as parseToml } from \"smol-toml\";\nimport type { Files, WranglerConfig } from \"./types\";\n\n/**\n * Parse wrangler configuration from files.\n *\n * Looks for wrangler.toml, wrangler.json, or wrangler.jsonc in the files\n * and extracts compatibility_date and compatibility_flags.\n *\n * @param files - Virtual file system\n * @returns Parsed wrangler config, or undefined if no config file found\n */\nexport function parseWranglerConfig(files: Files): WranglerConfig | undefined {\n // Try each config file format in order of preference\n const tomlContent = files[\"wrangler.toml\"];\n if (tomlContent) {\n return parseWranglerToml(tomlContent);\n }\n\n const jsonContent = files[\"wrangler.json\"];\n if (jsonContent) {\n return parseWranglerJson(jsonContent);\n }\n\n const jsoncContent = files[\"wrangler.jsonc\"];\n if (jsoncContent) {\n return parseWranglerJsonc(jsoncContent);\n }\n\n return undefined;\n}\n\n/**\n * Parse wrangler.toml content\n */\nfunction parseWranglerToml(content: string): WranglerConfig {\n try {\n const config = parseToml(content) as Record<string, unknown>;\n return extractWranglerConfig(config);\n } catch {\n return {};\n }\n}\n\n/**\n * Parse wrangler.json content\n */\nfunction parseWranglerJson(content: string): WranglerConfig {\n try {\n const config = JSON.parse(content) as Record<string, unknown>;\n return extractWranglerConfig(config);\n } catch {\n return {};\n }\n}\n\n/**\n * Parse wrangler.jsonc content (JSON with comments)\n */\nfunction parseWranglerJsonc(content: string): WranglerConfig {\n try {\n // Strip comments from JSONC\n const jsonContent = stripJsonComments(content);\n const config = JSON.parse(jsonContent) as Record<string, unknown>;\n return extractWranglerConfig(config);\n } catch {\n return {};\n }\n}\n\n/**\n * Extract wrangler config fields from parsed config object.\n * Handles both snake_case (toml) and camelCase (json) formats.\n */\nfunction extractWranglerConfig(\n config: Record<string, unknown>\n): WranglerConfig {\n const result: WranglerConfig = {};\n\n // main entry point\n const main = config[\"main\"];\n if (typeof main === \"string\") {\n result.main = main;\n }\n\n // compatibility_date (toml) or compatibilityDate (json)\n const date = config[\"compatibility_date\"] ?? config[\"compatibilityDate\"];\n if (typeof date === \"string\") {\n result.compatibilityDate = date;\n }\n\n // compatibility_flags (toml) or compatibilityFlags (json)\n const flags = config[\"compatibility_flags\"] ?? config[\"compatibilityFlags\"];\n if (Array.isArray(flags) && flags.every((f) => typeof f === \"string\")) {\n result.compatibilityFlags = flags;\n }\n\n return result;\n}\n\n/**\n * Strip comments from JSONC content.\n * Handles both single-line (//) and multi-line comments.\n */\nfunction stripJsonComments(content: string): string {\n let result = \"\";\n let i = 0;\n let inString = false;\n let stringChar = \"\";\n\n while (i < content.length) {\n const char = content[i];\n const nextChar = content[i + 1];\n\n // Handle string literals (don't strip comments inside strings)\n if (\n (char === '\"' || char === \"'\") &&\n (i === 0 || content[i - 1] !== \"\\\\\")\n ) {\n if (!inString) {\n inString = true;\n stringChar = char;\n } else if (char === stringChar) {\n inString = false;\n }\n result += char;\n i++;\n continue;\n }\n\n if (inString) {\n result += char;\n i++;\n continue;\n }\n\n // Handle single-line comments\n if (char === \"/\" && nextChar === \"/\") {\n // Skip until end of line\n while (i < content.length && content[i] !== \"\\n\") {\n i++;\n }\n continue;\n }\n\n // Handle multi-line comments\n if (char === \"/\" && nextChar === \"*\") {\n i += 2;\n // Skip until */\n while (\n i < content.length - 1 &&\n !(content[i] === \"*\" && content[i + 1] === \"/\")\n ) {\n i++;\n }\n i += 2; // Skip */\n continue;\n }\n\n result += char;\n i++;\n }\n\n return result;\n}\n\n/**\n * Check if nodejs_compat flag is enabled in the config.\n */\nexport function hasNodejsCompat(config: WranglerConfig | undefined): boolean {\n return config?.compatibilityFlags?.includes(\"nodejs_compat\") ?? false;\n}\n","/**\n * NPM package installer for virtual file systems.\n *\n * This module fetches packages from the npm registry and populates\n * a virtual node_modules directory structure.\n */\n\nimport * as semver from \"semver\";\nimport type { Files } from \"./types\";\n\nconst NPM_REGISTRY = \"https://registry.npmjs.org\";\nconst DEFAULT_TIMEOUT_MS = 30000; // 30 seconds\n\n/**\n * Fetch with a timeout.\n * Throws an error if the request takes longer than the specified timeout.\n */\nasync function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeoutMs = DEFAULT_TIMEOUT_MS\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n return await fetch(url, { ...options, signal: controller.signal });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(`Request timed out after ${timeoutMs}ms: ${url}`);\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\ninterface PackageJson {\n name: string;\n version: string;\n main?: string;\n module?: string;\n exports?: unknown;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n dist?: {\n tarball: string;\n integrity?: string;\n };\n}\n\ninterface NpmPackageMetadata {\n name: string;\n \"dist-tags\": Record<string, string>;\n versions: Record<string, PackageJson>;\n}\n\ninterface InstallOptions {\n /**\n * Include devDependencies (default: false)\n */\n dev?: boolean;\n\n /**\n * Registry URL (default: https://registry.npmjs.org)\n */\n registry?: string;\n}\n\ninterface InstallResult {\n /**\n * Files with node_modules populated\n */\n files: Files;\n\n /**\n * Packages that were installed\n */\n installed: string[];\n\n /**\n * Warnings encountered during installation\n */\n warnings: string[];\n}\n\n/**\n * Install npm dependencies into a virtual file system.\n *\n * Reads the package.json from the files, resolves all dependencies,\n * and populates node_modules with the package contents.\n *\n * @param files - Virtual file system containing package.json\n * @param options - Installation options\n * @returns Files with node_modules populated\n */\nexport async function installDependencies(\n files: Files,\n options: InstallOptions = {}\n): Promise<InstallResult> {\n const { dev = false, registry = NPM_REGISTRY } = options;\n\n const result: InstallResult = {\n files: { ...files },\n installed: [],\n warnings: []\n };\n\n // Read package.json\n const packageJsonContent = files[\"package.json\"];\n if (!packageJsonContent) {\n return result; // No package.json, nothing to install\n }\n\n let packageJson: PackageJson;\n try {\n packageJson = JSON.parse(packageJsonContent) as PackageJson;\n } catch {\n result.warnings.push(\"Failed to parse package.json\");\n return result;\n }\n\n // Collect dependencies to install\n const depsToInstall: Record<string, string> = {\n ...packageJson.dependencies,\n ...(dev ? packageJson.devDependencies : {})\n };\n\n if (Object.keys(depsToInstall).length === 0) {\n return result; // No dependencies to install\n }\n\n // Track installed packages to avoid duplicates\n const installedPackages = new Map<string, string>(); // name -> version\n // Track in-progress installations to avoid duplicate work\n const inProgress = new Map<string, Promise<void>>();\n\n // Install all dependencies in parallel\n await Promise.all(\n Object.entries(depsToInstall).map(([name, versionRange]) =>\n installPackage(\n name,\n versionRange,\n result,\n installedPackages,\n inProgress,\n registry\n )\n )\n );\n\n return result;\n}\n\n/**\n * Install a single package and its dependencies recursively.\n */\nasync function installPackage(\n name: string,\n versionRange: string,\n result: InstallResult,\n installedPackages: Map<string, string>,\n inProgress: Map<string, Promise<void>>,\n registry: string\n): Promise<void> {\n // Skip if already installed\n if (installedPackages.has(name)) {\n return;\n }\n\n // If installation is already in progress, wait for it\n const existing = inProgress.get(name);\n if (existing) {\n return existing;\n }\n\n // Create the installation promise\n const installPromise = (async () => {\n try {\n // Fetch package metadata from registry\n const metadata = await fetchPackageMetadata(name, registry);\n\n // Resolve version from range\n const version = resolveVersion(versionRange, metadata);\n if (!version) {\n result.warnings.push(\n `Could not resolve version for ${name}@${versionRange}`\n );\n return;\n }\n\n // Get the specific version metadata\n const versionMetadata = metadata.versions[version];\n if (!versionMetadata) {\n result.warnings.push(`Version ${version} not found for ${name}`);\n return;\n }\n\n // Mark as installed (before fetching to prevent cycles)\n installedPackages.set(name, version);\n result.installed.push(`${name}@${version}`);\n\n // Fetch and extract the package tarball\n const packageFiles = await fetchPackageFiles(name, versionMetadata);\n\n // Add files to node_modules\n for (const [filePath, content] of Object.entries(packageFiles)) {\n result.files[`node_modules/${name}/${filePath}`] = content;\n }\n\n // Install dependencies in parallel\n const deps = versionMetadata.dependencies ?? {};\n await Promise.all(\n Object.entries(deps).map(([depName, depVersion]) =>\n installPackage(\n depName,\n depVersion,\n result,\n installedPackages,\n inProgress,\n registry\n )\n )\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n result.warnings.push(`Failed to install ${name}: ${message}`);\n }\n })();\n\n // Track in progress\n inProgress.set(name, installPromise);\n\n try {\n await installPromise;\n } finally {\n inProgress.delete(name);\n }\n}\n\n/**\n * Fetch package metadata from npm registry.\n */\nasync function fetchPackageMetadata(\n name: string,\n registry: string\n): Promise<NpmPackageMetadata> {\n // Handle scoped packages\n const encodedName = name.startsWith(\"@\")\n ? `@${encodeURIComponent(name.slice(1))}`\n : name;\n const url = `${registry}/${encodedName}`;\n\n const response = await fetchWithTimeout(url, {\n headers: {\n // Use abbreviated metadata to avoid fetching megabytes of version data\n Accept:\n \"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8\"\n }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch package metadata: ${response.status}`);\n }\n\n return (await response.json()) as NpmPackageMetadata;\n}\n\n/**\n * Resolve a semver range to a specific version.\n */\nfunction resolveVersion(\n range: string,\n metadata: NpmPackageMetadata\n): string | undefined {\n // Handle special cases\n if (range === \"latest\" || range === \"*\") {\n return metadata[\"dist-tags\"][\"latest\"];\n }\n\n // Handle exact versions\n if (metadata.versions[range]) {\n return range;\n }\n\n // Handle dist-tags (e.g., \"next\", \"beta\")\n if (metadata[\"dist-tags\"][range]) {\n return metadata[\"dist-tags\"][range];\n }\n\n // Use semver.maxSatisfying to find the best matching version\n const versions = Object.keys(metadata.versions);\n const match = semver.maxSatisfying(versions, range);\n\n return match ?? undefined;\n}\n\n/**\n * Fetch and extract package files from npm tarball.\n */\nasync function fetchPackageFiles(\n name: string,\n metadata: PackageJson\n): Promise<Record<string, string>> {\n const tarballUrl = metadata.dist?.tarball;\n if (!tarballUrl) {\n throw new Error(`No tarball URL for ${name}`);\n }\n\n // Fetch the tarball (use longer timeout for potentially large packages)\n const response = await fetchWithTimeout(\n tarballUrl,\n {},\n DEFAULT_TIMEOUT_MS * 2\n );\n if (!response.ok) {\n throw new Error(`Failed to fetch tarball: ${response.status}`);\n }\n\n // Get the tarball as array buffer\n const buffer = await response.arrayBuffer();\n\n // Extract the tarball (npm tarballs are gzipped tar files)\n return extractTarball(new Uint8Array(buffer));\n}\n\n/**\n * Extract files from a gzipped tarball.\n *\n * npm packages are distributed as .tgz files (gzipped tar).\n * The contents are in a \"package/\" directory.\n */\nasync function extractTarball(\n data: Uint8Array\n): Promise<Record<string, string>> {\n // Decompress gzip\n const decompressed = await decompress(data);\n\n // Parse tar\n return parseTar(decompressed);\n}\n\n/**\n * Decompress gzip data using DecompressionStream.\n */\nasync function decompress(data: Uint8Array): Promise<Uint8Array> {\n // Use DecompressionStream (available in Workers and modern browsers)\n const ds = new DecompressionStream(\"gzip\");\n const writer = ds.writable.getWriter();\n const reader = ds.readable.getReader();\n\n // Write compressed data\n writer.write(data as Uint8Array<ArrayBuffer>).catch(() => {});\n writer.close().catch(() => {});\n\n // Read decompressed data\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.length;\n }\n\n // Concatenate chunks\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n}\n\n/**\n * Parse a tar archive and extract text files.\n *\n * TAR format:\n * - 512-byte header blocks\n * - File content (padded to 512 bytes)\n * - Two empty blocks at the end\n */\nfunction parseTar(data: Uint8Array): Record<string, string> {\n const files: Record<string, string> = {};\n const textDecoder = new TextDecoder();\n let offset = 0;\n\n while (offset < data.length - 512) {\n // Read header\n const header = data.slice(offset, offset + 512);\n\n // Check for empty block (end of archive)\n if (header.every((b) => b === 0)) {\n break;\n }\n\n // Parse header fields\n const name = readString(header, 0, 100);\n const sizeStr = readString(header, 124, 12);\n const typeFlag = header[156];\n\n // Parse size (octal)\n const size = parseInt(sizeStr.trim(), 8) || 0;\n\n // Move past header\n offset += 512;\n\n // Only process regular files (type '0' or '\\0')\n if ((typeFlag === 48 || typeFlag === 0) && size > 0) {\n // Read file content\n const content = data.slice(offset, offset + size);\n\n // Remove \"package/\" prefix from npm tarballs\n let filePath = name;\n if (filePath.startsWith(\"package/\")) {\n filePath = filePath.slice(8);\n }\n\n // Only include text files (skip binary files)\n if (isTextFile(filePath)) {\n try {\n files[filePath] = textDecoder.decode(content);\n } catch {\n // Skip files that can't be decoded as text\n }\n }\n }\n\n // Move to next block (content is padded to 512 bytes)\n offset += Math.ceil(size / 512) * 512;\n }\n\n return files;\n}\n\n/**\n * Read a null-terminated string from a buffer.\n */\nfunction readString(\n buffer: Uint8Array,\n offset: number,\n length: number\n): string {\n const bytes = buffer.slice(offset, offset + length);\n const nullIndex = bytes.indexOf(0);\n const relevantBytes = nullIndex >= 0 ? bytes.slice(0, nullIndex) : bytes;\n return new TextDecoder().decode(relevantBytes);\n}\n\n/**\n * Check if a file path is likely a text file.\n */\nfunction isTextFile(path: string): boolean {\n const textExtensions = [\n \".js\",\n \".mjs\",\n \".cjs\",\n \".ts\",\n \".mts\",\n \".cts\",\n \".tsx\",\n \".jsx\",\n \".json\",\n \".md\",\n \".txt\",\n \".css\",\n \".html\",\n \".yml\",\n \".yaml\",\n \".toml\",\n \".xml\",\n \".svg\",\n \".map\",\n \".d.ts\",\n \".d.mts\",\n \".d.cts\"\n ];\n\n // Check common config files without extensions\n const configFiles = [\n \"LICENSE\",\n \"README\",\n \"CHANGELOG\",\n \"package.json\",\n \"tsconfig.json\",\n \".npmignore\",\n \".gitignore\"\n ];\n\n const fileName = path.split(\"/\").pop() ?? \"\";\n\n if (\n configFiles.some((f) => fileName.toUpperCase().startsWith(f.toUpperCase()))\n ) {\n return true;\n }\n\n return textExtensions.some((ext) => path.toLowerCase().endsWith(ext));\n}\n\n/**\n * Check if files contain a package.json with dependencies that need installing.\n */\nexport function hasDependencies(files: Files): boolean {\n const packageJson = files[\"package.json\"];\n if (!packageJson) return false;\n\n try {\n const pkg = JSON.parse(packageJson);\n const deps = pkg.dependencies ?? {};\n return Object.keys(deps).length > 0;\n } catch {\n return false;\n }\n}\n","import { transform } from \"sucrase\";\nimport { parseImports, resolveModule } from \"./resolver\";\nimport type { CreateWorkerResult, Files, Modules } from \"./types\";\n\nexport interface TransformResult {\n code: string;\n sourceMap?: string;\n}\n\nexport interface TransformOptions {\n /**\n * Source file path (for source maps and error messages)\n */\n filePath: string;\n\n /**\n * Whether to generate source maps\n */\n sourceMap?: boolean;\n\n /**\n * Whether to preserve JSX (don't transform to createElement calls)\n */\n preserveJsx?: boolean;\n\n /**\n * JSX runtime ('automatic' for new JSX transform, 'classic' for React.createElement)\n */\n jsxRuntime?: \"automatic\" | \"classic\" | \"preserve\";\n\n /**\n * JSX import source for automatic runtime (default: 'react')\n */\n jsxImportSource?: string;\n\n /**\n * Whether this is a production build\n */\n production?: boolean;\n}\n\n/**\n * Transform TypeScript/JSX code to JavaScript using Sucrase.\n *\n * Sucrase is a super-fast TypeScript transformer that:\n * - Strips type annotations\n * - Transforms JSX\n * - Is ~20x faster than Babel\n * - Works in any JS environment (no WASM needed)\n *\n * @param code - Source code to transform\n * @param options - Transform options\n * @returns Transformed code\n */\nexport function transformCode(\n code: string,\n options: TransformOptions\n): TransformResult {\n const {\n filePath,\n sourceMap = false,\n jsxRuntime = \"automatic\",\n jsxImportSource = \"react\",\n production = false\n } = options;\n\n const transforms: Array<\"typescript\" | \"jsx\" | \"flow\"> = [];\n\n // Determine transforms based on file extension\n if (isTypeScriptFile(filePath)) {\n transforms.push(\"typescript\");\n }\n\n if (isJsxFile(filePath)) {\n if (jsxRuntime !== \"preserve\") {\n transforms.push(\"jsx\");\n }\n }\n\n if (transforms.length === 0) {\n // No transforms needed, return as-is\n return { code };\n }\n\n const transformOptions: Parameters<typeof transform>[1] = {\n transforms,\n filePath,\n jsxRuntime,\n jsxImportSource,\n production,\n // Keep ESM imports/exports as-is\n preserveDynamicImport: true,\n // Disable ES transforms since Workers support modern JS\n disableESTransforms: true\n };\n\n if (sourceMap) {\n transformOptions.sourceMapOptions = {\n compiledFilename: filePath.replace(/\\.(tsx?|mts)$/, \".js\")\n };\n }\n\n const result = transform(code, transformOptions);\n\n if (result.sourceMap) {\n return {\n code: result.code,\n sourceMap: JSON.stringify(result.sourceMap)\n };\n }\n return { code: result.code };\n}\n\n/**\n * Check if a file path is a TypeScript file\n */\nexport function isTypeScriptFile(filePath: string): boolean {\n return /\\.(ts|tsx|mts)$/.test(filePath);\n}\n\n/**\n * Check if a file path is a JSX file\n */\nexport function isJsxFile(filePath: string): boolean {\n return /\\.(jsx|tsx)$/.test(filePath);\n}\n\n/**\n * Check if a file path is any JavaScript/TypeScript file\n */\nexport function isJavaScriptFile(filePath: string): boolean {\n return /\\.(js|jsx|ts|tsx|mjs|mts)$/.test(filePath);\n}\n\n/**\n * Get the output path for a transformed file\n */\nexport function getOutputPath(filePath: string): string {\n // .ts -> .js, .tsx -> .js, .mts -> .mjs\n return filePath.replace(/\\.tsx?$/, \".js\").replace(/\\.mts$/, \".mjs\");\n}\n\n/**\n * Transform all files and resolve their dependencies.\n * This produces multiple modules instead of a single bundle.\n */\nexport async function transformAndResolve(\n files: Files,\n entryPoint: string,\n externals: string[]\n): Promise<CreateWorkerResult> {\n const modules: Modules = {};\n const warnings: string[] = [];\n const processed = new Set<string>();\n const toProcess = [entryPoint];\n\n // Map from source path to output path\n const pathMap = new Map<string, string>();\n\n // First pass: collect all files and their output paths\n while (toProcess.length > 0) {\n const filePath = toProcess.pop();\n if (!filePath || processed.has(filePath)) continue;\n processed.add(filePath);\n\n const content = files[filePath];\n if (content === undefined) {\n warnings.push(`File not found: ${filePath}`);\n continue;\n }\n\n // Calculate output path\n const outputPath = isTypeScriptFile(filePath)\n ? getOutputPath(filePath)\n : filePath;\n pathMap.set(filePath, outputPath);\n\n // Handle non-JS files\n if (!isJavaScriptFile(filePath)) {\n if (filePath.endsWith(\".json\")) {\n try {\n modules[filePath] = { json: JSON.parse(content) };\n } catch {\n warnings.push(`Failed to parse JSON file: ${filePath}`);\n }\n } else {\n // Include as text\n modules[filePath] = { text: content };\n }\n continue;\n }\n\n // Parse imports and queue them for processing\n const imports = parseImports(content);\n for (const specifier of imports) {\n // Skip external modules\n if (\n externals.includes(specifier) ||\n externals.some(\n (e) => specifier.startsWith(`${e}/`) || specifier.startsWith(e)\n )\n ) {\n continue;\n }\n\n try {\n const resolved = resolveModule(specifier, {\n files,\n importer: filePath\n });\n\n if (!resolved.external && !processed.has(resolved.path)) {\n toProcess.push(resolved.path);\n }\n } catch (error) {\n warnings.push(\n `Failed to resolve '${specifier}' from ${filePath}: ${error instanceof Error ? error.message : error}`\n );\n }\n }\n }\n\n // Second pass: transform files and rewrite imports\n for (const [sourcePath, outputPath] of pathMap) {\n const content = files[sourcePath];\n if (content === undefined || !isJavaScriptFile(sourcePath)) continue;\n\n let transformedCode: string;\n\n if (isTypeScriptFile(sourcePath)) {\n try {\n const result = transformCode(content, {\n filePath: sourcePath\n });\n transformedCode = result.code;\n } catch (error) {\n warnings.push(\n `Failed to transform ${sourcePath}: ${error instanceof Error ? error.message : error}`\n );\n continue;\n }\n } else {\n transformedCode = content;\n }\n\n // Rewrite imports to use the full output paths\n transformedCode = rewriteImports(\n transformedCode,\n sourcePath,\n files,\n pathMap,\n externals\n );\n\n // Add to output modules\n modules[outputPath] = transformedCode;\n }\n\n // Calculate the main module path (transformed entry point)\n const mainModule = isTypeScriptFile(entryPoint)\n ? getOutputPath(entryPoint)\n : entryPoint;\n\n if (warnings.length > 0) {\n return { mainModule, modules, warnings };\n }\n return { mainModule, modules };\n}\n\n/**\n * Rewrite import specifiers to use full output paths.\n * This is necessary because the Worker Loader expects imports to match registered module names.\n */\nfunction rewriteImports(\n code: string,\n importer: string,\n files: Files,\n pathMap: Map<string, string>,\n externals: string[]\n): string {\n // Match import/export statements with string specifiers\n // Handles: import x from 'y', import { x } from 'y', import 'y', export { x } from 'y', export * from 'y'\n const importExportRegex =\n /(import\\s+(?:[\\w*{}\\s,]+\\s+from\\s+)?|export\\s+(?:[\\w*{}\\s,]+\\s+)?from\\s+)(['\"])([^'\"]+)\\2/g;\n\n // Get importer's output path to use as the base for resolving\n const importerOutputPath = pathMap.get(importer) ?? importer;\n\n return code.replace(\n importExportRegex,\n (match, prefix: string, quote: string, specifier: string) => {\n // Skip external modules\n if (\n externals.includes(specifier) ||\n externals.some(\n (e) => specifier.startsWith(`${e}/`) || specifier.startsWith(e)\n )\n ) {\n return match;\n }\n\n // Skip non-relative imports that aren't in our files (bare imports to npm packages)\n if (!specifier.startsWith(\".\") && !specifier.startsWith(\"/\")) {\n // Try to resolve it - if it resolves to node_modules, rewrite the path\n try {\n const resolved = resolveModule(specifier, {\n files,\n importer\n });\n\n if (resolved.external) {\n return match;\n }\n\n // Get the output path for the resolved module\n const resolvedOutputPath =\n pathMap.get(resolved.path) ?? resolved.path;\n\n // For node_modules imports, use the full path\n if (resolved.path.startsWith(\"node_modules/\")) {\n return `${prefix}${quote}/${resolvedOutputPath}${quote}`;\n }\n\n // Calculate relative path for non-node_modules\n const relativePath = calculateRelativePath(\n importerOutputPath,\n resolvedOutputPath\n );\n return `${prefix}${quote}${relativePath}${quote}`;\n } catch {\n // Resolution failed, keep original\n return match;\n }\n }\n\n try {\n const resolved = resolveModule(specifier, {\n files,\n importer\n });\n\n if (resolved.external) {\n return match;\n }\n\n // Get the output path for the resolved module\n const resolvedOutputPath = pathMap.get(resolved.path) ?? resolved.path;\n\n // Calculate the relative path from the importer's output location to the resolved output\n const relativePath = calculateRelativePath(\n importerOutputPath,\n resolvedOutputPath\n );\n\n // Return the rewritten import with the relative output path\n return `${prefix}${quote}${relativePath}${quote}`;\n } catch {\n // If resolution fails, keep the original\n return match;\n }\n }\n );\n}\n\n/**\n * Calculate relative path from one file to another.\n */\nfunction calculateRelativePath(from: string, to: string): string {\n const fromDir = getDirectory(from);\n const toDir = getDirectory(to);\n const toFile = to.split(\"/\").pop() ?? to;\n\n if (fromDir === toDir) {\n // Same directory\n return `./${toFile}`;\n }\n\n const fromParts = fromDir ? fromDir.split(\"/\") : [];\n const toParts = toDir ? toDir.split(\"/\") : [];\n\n // Find common prefix\n let commonLength = 0;\n while (\n commonLength < fromParts.length &&\n commonLength < toParts.length &&\n fromParts[commonLength] === toParts[commonLength]\n ) {\n commonLength++;\n }\n\n // Calculate relative path\n const upCount = fromParts.length - commonLength;\n const downParts = toParts.slice(commonLength);\n\n let relativePath = \"\";\n if (upCount === 0) {\n relativePath = \"./\";\n } else {\n relativePath = \"../\".repeat(upCount);\n }\n\n if (downParts.length > 0) {\n relativePath += `${downParts.join(\"/\")}/`;\n }\n\n return relativePath + toFile;\n}\n\nfunction getDirectory(filePath: string): string {\n const lastSlash = filePath.lastIndexOf(\"/\");\n if (lastSlash === -1) {\n return \"\";\n }\n return filePath.slice(0, lastSlash);\n}\n","/**\n * Utility functions.\n */\n\nimport type { Files, WranglerConfig } from \"./types\";\n\n/**\n * Detect entry point from wrangler config, package.json, or use defaults.\n * Priority: wrangler main > package.json exports/module/main > default paths\n */\nexport function detectEntryPoint(\n files: Files,\n wranglerConfig: WranglerConfig | undefined\n): string | undefined {\n // First, check wrangler config main field\n if (wranglerConfig?.main) {\n return normalizeEntryPath(wranglerConfig.main);\n }\n\n // Try to read package.json\n const packageJsonContent = files[\"package.json\"];\n if (packageJsonContent) {\n try {\n const pkg = JSON.parse(packageJsonContent) as {\n main?: string;\n module?: string;\n exports?: Record<string, unknown> | string;\n };\n\n // Check exports field first\n if (pkg.exports) {\n if (typeof pkg.exports === \"string\") {\n return normalizeEntryPath(pkg.exports);\n }\n // Handle exports object - look for \".\" entry\n const dotExport = pkg.exports[\".\"];\n if (dotExport) {\n if (typeof dotExport === \"string\") {\n return normalizeEntryPath(dotExport);\n }\n // Handle conditional exports\n if (typeof dotExport === \"object\" && dotExport !== null) {\n const exp = dotExport as Record<string, unknown>;\n const entry = exp[\"import\"] ?? exp[\"default\"] ?? exp[\"module\"];\n if (typeof entry === \"string\") {\n return normalizeEntryPath(entry);\n }\n }\n }\n }\n\n // Check module field\n if (pkg.module) {\n return normalizeEntryPath(pkg.module);\n }\n\n // Check main field\n if (pkg.main) {\n return normalizeEntryPath(pkg.main);\n }\n } catch {\n // Invalid JSON, continue to defaults\n }\n }\n\n // Default entry points\n const defaultEntries = [\n \"src/index.ts\",\n \"src/index.js\",\n \"src/index.mts\",\n \"src/index.mjs\",\n \"index.ts\",\n \"index.js\",\n \"src/worker.ts\",\n \"src/worker.js\"\n ];\n\n for (const entry of defaultEntries) {\n if (entry in files) {\n return entry;\n }\n }\n\n return undefined;\n}\n\nfunction normalizeEntryPath(path: string): string {\n // Remove leading ./\n if (path.startsWith(\"./\")) {\n return path.slice(2);\n }\n return path;\n}\n","let warningShown = false;\n\nexport function showExperimentalWarning(fn: string) {\n if (!warningShown) {\n warningShown = true;\n console.warn(\n `[worker-bundler] ${fn}(): This package is experimental and its API may change without notice.`\n );\n }\n}\n","/**\n * MIME type inference from file extensions.\n */\n\nconst MIME_TYPES: Record<string, string> = {\n // HTML\n \".html\": \"text/html; charset=utf-8\",\n \".htm\": \"text/html; charset=utf-8\",\n\n // JavaScript\n \".js\": \"application/javascript; charset=utf-8\",\n \".mjs\": \"application/javascript; charset=utf-8\",\n\n // CSS\n \".css\": \"text/css; charset=utf-8\",\n\n // JSON\n \".json\": \"application/json; charset=utf-8\",\n\n // Images\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".webp\": \"image/webp\",\n \".avif\": \"image/avif\",\n\n // Fonts\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".otf\": \"font/otf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n\n // Media\n \".mp3\": \"audio/mpeg\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".ogg\": \"audio/ogg\",\n \".wav\": \"audio/wav\",\n\n // Documents\n \".pdf\": \"application/pdf\",\n \".xml\": \"application/xml\",\n \".txt\": \"text/plain; charset=utf-8\",\n \".csv\": \"text/csv; charset=utf-8\",\n\n // Archives\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".tar\": \"application/x-tar\",\n\n // WebAssembly\n \".wasm\": \"application/wasm\",\n\n // Manifest\n \".webmanifest\": \"application/manifest+json\",\n\n // Source maps\n \".map\": \"application/json\"\n};\n\n/**\n * Get the file extension from a path (including the dot).\n */\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) return \"\";\n const lastSlash = path.lastIndexOf(\"/\");\n if (lastDot < lastSlash) return \"\";\n return path.slice(lastDot).toLowerCase();\n}\n\n/**\n * Infer MIME type from a file path.\n * Returns undefined if the type is unknown.\n */\nexport function inferContentType(path: string): string | undefined {\n const ext = getExtension(path);\n return MIME_TYPES[ext];\n}\n\n/**\n * Whether a content type represents a text-based format\n * (used to decide text vs binary module storage).\n */\nexport function isTextContentType(contentType: string): boolean {\n return (\n contentType.startsWith(\"text/\") ||\n contentType.includes(\"json\") ||\n contentType.includes(\"xml\") ||\n contentType.includes(\"javascript\") ||\n contentType.includes(\"svg\")\n );\n}\n","/**\n * Asset request handler for serving static assets.\n *\n * Key design: the manifest (routing metadata) is separated from the\n * storage (content retrieval). This lets you plug in any backend —\n * in-memory, KV, R2, Workspace, etc.\n *\n * Inspired by Cloudflare's Workers Static Assets behavior and\n * cloudflare-asset-worker by Timo Wilhelm.\n */\n\nimport { inferContentType } from \"./mime\";\n\n// ── Storage interface ───────────────────────────────────────────────\n\n/**\n * Pluggable storage backend for asset content.\n * Implement this to serve assets from KV, R2, Workspace, or any other source.\n */\nexport interface AssetStorage {\n get(pathname: string): Promise<ReadableStream | ArrayBuffer | string | null>;\n}\n\n/**\n * Metadata for a single asset (no content — that comes from storage).\n */\nexport interface AssetMetadata {\n contentType: string | undefined;\n etag: string;\n}\n\n/**\n * The manifest maps pathnames to metadata. Used for routing decisions,\n * ETag checks, and content-type headers — all without touching storage.\n */\nexport type AssetManifest = Map<string, AssetMetadata>;\n\n/**\n * Create an in-memory storage backend from a pathname->content map.\n * This is the zero-config default for small asset sets.\n */\nexport function createMemoryStorage(\n assets: Record<string, string | ArrayBuffer>\n): AssetStorage {\n const map = new Map(Object.entries(assets));\n return {\n get(pathname) {\n return Promise.resolve(map.get(pathname) ?? null);\n }\n };\n}\n\n// ── Configuration ───────────────────────────────────────────────────\n\n/**\n * Configuration for asset serving behavior.\n */\nexport interface AssetConfig {\n /**\n * How to handle HTML file resolution and trailing slashes.\n * @default 'auto-trailing-slash'\n */\n html_handling?:\n | \"auto-trailing-slash\"\n | \"force-trailing-slash\"\n | \"drop-trailing-slash\"\n | \"none\";\n\n /**\n * How to handle requests that don't match any asset.\n * - 'single-page-application': Serve /index.html for 404s\n * - '404-page': Serve nearest 404.html walking up the directory tree\n * - 'none': Return null (fall through)\n * @default 'none'\n */\n not_found_handling?: \"single-page-application\" | \"404-page\" | \"none\";\n\n /**\n * Static redirect rules. Keys are URL pathnames (or https://host/path for cross-host).\n * Supports * glob and :placeholder tokens.\n */\n redirects?: {\n static?: Record<string, { status: number; to: string }>;\n dynamic?: Record<string, { status: number; to: string }>;\n };\n\n /**\n * Custom response headers per pathname pattern (glob syntax).\n */\n headers?: Record<string, { set?: Record<string, string>; unset?: string[] }>;\n}\n\n/**\n * Normalized configuration with all fields required.\n */\ninterface NormalizedConfig {\n html_handling:\n | \"auto-trailing-slash\"\n | \"force-trailing-slash\"\n | \"drop-trailing-slash\"\n | \"none\";\n not_found_handling: \"single-page-application\" | \"404-page\" | \"none\";\n redirects: {\n static: Record<string, { status: number; to: string; lineNumber: number }>;\n dynamic: Record<string, { status: number; to: string }>;\n };\n headers: Record<string, { set?: Record<string, string>; unset?: string[] }>;\n}\n\n/**\n * Normalize user config with defaults.\n */\nexport function normalizeConfig(config?: AssetConfig): NormalizedConfig {\n const staticRedirects: Record<\n string,\n { status: number; to: string; lineNumber: number }\n > = {};\n if (config?.redirects?.static) {\n let lineNumber = 1;\n for (const [path, rule] of Object.entries(config.redirects.static)) {\n staticRedirects[path] = { ...rule, lineNumber: lineNumber++ };\n }\n }\n\n return {\n html_handling: config?.html_handling ?? \"auto-trailing-slash\",\n not_found_handling: config?.not_found_handling ?? \"none\",\n redirects: {\n static: staticRedirects,\n dynamic: config?.redirects?.dynamic ?? {}\n },\n headers: config?.headers ?? {}\n };\n}\n\n// ── ETag / manifest building ────────────────────────────────────────\n\n/**\n * Compute a simple hash for ETag generation.\n * Uses a fast string hash (FNV-1a) for text, or SHA-256 for binary.\n */\nexport async function computeETag(\n content: string | ArrayBuffer\n): Promise<string> {\n if (typeof content === \"string\") {\n // FNV-1a hash for fast text hashing\n let hash = 2166136261;\n for (let i = 0; i < content.length; i++) {\n hash ^= content.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n return hash.toString(16).padStart(8, \"0\");\n }\n // SHA-256 for binary\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", content);\n const hashArray = new Uint8Array(hashBuffer);\n return [...hashArray.slice(0, 8)]\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Build an AssetManifest from a pathname->content mapping.\n * Only computes metadata (content types, ETags) — doesn't store content.\n */\nexport async function buildAssetManifest(\n assets: Record<string, string | ArrayBuffer>\n): Promise<AssetManifest> {\n const manifest: AssetManifest = new Map();\n const entries = Object.entries(assets);\n await Promise.all(\n entries.map(async ([pathname, content]) => {\n const contentType = inferContentType(pathname);\n const etag = await computeETag(content);\n manifest.set(pathname, { contentType, etag });\n })\n );\n return manifest;\n}\n\n/**\n * Convenience: build both a manifest and an in-memory storage from assets.\n */\nexport async function buildAssets(\n assets: Record<string, string | ArrayBuffer>\n): Promise<{ manifest: AssetManifest; storage: AssetStorage }> {\n const manifest = await buildAssetManifest(assets);\n const storage = createMemoryStorage(assets);\n return { manifest, storage };\n}\n\n/**\n * Check if a pathname exists in the manifest.\n */\nfunction exists(\n manifest: AssetManifest,\n pathname: string\n): AssetMetadata | undefined {\n return manifest.get(pathname);\n}\n\n// ── Redirect handling ───────────────────────────────────────────────\n\nconst ESCAPE_REGEX_CHARACTERS = /[-/\\\\^$*+?.()|[\\]{}]/g;\nconst escapeRegex = (s: string) =>\n s.replaceAll(ESCAPE_REGEX_CHARACTERS, String.raw`\\$&`);\n\nconst PLACEHOLDER_REGEX = /:([A-Za-z]\\w*)/g;\n\ntype Replacements = Record<string, string>;\n\nfunction replacer(str: string, replacements: Replacements): string {\n for (const [key, value] of Object.entries(replacements)) {\n str = str.replaceAll(`:${key}`, value);\n }\n return str;\n}\n\nfunction generateRuleRegExp(rule: string): RegExp {\n rule = rule\n .split(\"*\")\n .map((s) => escapeRegex(s))\n .join(\"(?<splat>.*)\");\n\n const matches = rule.matchAll(PLACEHOLDER_REGEX);\n for (const match of matches) {\n rule = rule.split(match[0]).join(`(?<${match[1]}>[^/]+)`);\n }\n\n return new RegExp(\"^\" + rule + \"$\");\n}\n\nfunction matchStaticRedirects(\n config: NormalizedConfig,\n host: string,\n pathname: string\n): { status: number; to: string; lineNumber: number } | undefined {\n const withHost = config.redirects.static[`https://${host}${pathname}`];\n const withoutHost = config.redirects.static[pathname];\n if (withHost && withoutHost) {\n return withHost.lineNumber < withoutHost.lineNumber\n ? withHost\n : withoutHost;\n }\n return withHost || withoutHost;\n}\n\nfunction matchDynamicRedirects(\n config: NormalizedConfig,\n request: Request\n): { status: number; to: string } | undefined {\n const { pathname } = new URL(request.url);\n for (const [pattern, rule] of Object.entries(config.redirects.dynamic)) {\n try {\n const re = generateRuleRegExp(pattern);\n const result = re.exec(pathname);\n if (result) {\n const target = replacer(rule.to, result.groups || {}).trim();\n return { status: rule.status, to: target };\n }\n } catch {\n // Skip invalid patterns\n }\n }\n return undefined;\n}\n\nfunction handleRedirects(\n request: Request,\n config: NormalizedConfig\n): Response | { proxied: boolean; pathname: string } {\n const url = new URL(request.url);\n const { search, host } = url;\n let { pathname } = url;\n\n const staticMatch = matchStaticRedirects(config, host, pathname);\n const dynamicMatch = staticMatch\n ? undefined\n : matchDynamicRedirects(config, request);\n const match = staticMatch ?? dynamicMatch;\n\n let proxied = false;\n if (match) {\n if (match.status === 200) {\n pathname = new URL(match.to, request.url).pathname;\n proxied = true;\n } else {\n const destination = new URL(match.to, request.url);\n const location =\n destination.origin === url.origin\n ? `${destination.pathname}${destination.search || search}${destination.hash}`\n : `${destination.href}`;\n return new Response(null, {\n status: match.status,\n headers: { Location: location }\n });\n }\n }\n\n return { proxied, pathname };\n}\n\n// ── Custom headers ──────────────────────────────────────────────────\n\nfunction generateGlobRegExp(pattern: string): RegExp {\n const escaped = pattern\n .split(\"*\")\n .map((s) => escapeRegex(s))\n .join(\".*\");\n return new RegExp(\"^\" + escaped + \"$\");\n}\n\nfunction attachCustomHeaders(\n request: Request,\n response: Response,\n config: NormalizedConfig\n): Response {\n if (Object.keys(config.headers).length === 0) {\n return response;\n }\n\n const { pathname } = new URL(request.url);\n const setMap = new Set<string>();\n\n for (const [pattern, rules] of Object.entries(config.headers)) {\n try {\n const re = generateGlobRegExp(pattern);\n if (!re.test(pathname)) continue;\n } catch {\n continue;\n }\n\n if (rules.unset) {\n for (const key of rules.unset) {\n response.headers.delete(key);\n }\n }\n if (rules.set) {\n for (const [key, value] of Object.entries(rules.set)) {\n if (setMap.has(key.toLowerCase())) {\n response.headers.append(key, value);\n } else {\n response.headers.set(key, value);\n setMap.add(key.toLowerCase());\n }\n }\n }\n }\n\n return response;\n}\n\n// ── Path decoding / encoding ────────────────────────────────────────\n\nfunction decodePath(pathname: string): string {\n return pathname\n .split(\"/\")\n .map((segment) => {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n })\n .join(\"/\")\n .replaceAll(/\\/+/g, \"/\");\n}\n\nfunction encodePath(pathname: string): string {\n return pathname\n .split(\"/\")\n .map((segment) => {\n try {\n return encodeURIComponent(segment);\n } catch {\n return segment;\n }\n })\n .join(\"/\");\n}\n\n// ── HTML handling modes ─────────────────────────────────────────────\n\ntype Intent =\n | { type: \"asset\"; pathname: string; meta: AssetMetadata; status: number }\n | { type: \"redirect\"; to: string }\n | undefined;\n\nfunction getIntent(\n pathname: string,\n manifest: AssetManifest,\n config: NormalizedConfig,\n skipRedirects = false,\n acceptsHtml = true\n): Intent {\n switch (config.html_handling) {\n case \"auto-trailing-slash\":\n return htmlAutoTrailingSlash(\n pathname,\n manifest,\n config,\n skipRedirects,\n acceptsHtml\n );\n case \"force-trailing-slash\":\n return htmlForceTrailingSlash(\n pathname,\n manifest,\n config,\n skipRedirects,\n acceptsHtml\n );\n case \"drop-trailing-slash\":\n return htmlDropTrailingSlash(\n pathname,\n manifest,\n config,\n skipRedirects,\n acceptsHtml\n );\n case \"none\":\n return htmlNone(pathname, manifest, config, acceptsHtml);\n }\n}\n\nfunction assetIntent(\n pathname: string,\n meta: AssetMetadata,\n status = 200\n): Intent {\n return { type: \"asset\", pathname, meta, status };\n}\n\nfunction redirectIntent(to: string): Intent {\n return { type: \"redirect\", to };\n}\n\n/**\n * Safe redirect: only redirect if the file exists and the destination\n * itself resolves to the same asset (avoids redirect loops).\n */\nfunction safeRedirect(\n file: string,\n destination: string,\n manifest: AssetManifest,\n config: NormalizedConfig,\n skip: boolean\n): Intent {\n if (skip) return undefined;\n if (!exists(manifest, destination)) {\n const intent = getIntent(destination, manifest, config, true);\n if (\n intent?.type === \"asset\" &&\n intent.meta.etag === exists(manifest, file)?.etag\n ) {\n return redirectIntent(destination);\n }\n }\n return undefined;\n}\n\nfunction htmlAutoTrailingSlash(\n pathname: string,\n manifest: AssetManifest,\n config: NormalizedConfig,\n skipRedirects: boolean,\n acceptsHtml: boolean\n): Intent {\n let meta: AssetMetadata | undefined;\n let redirect: Intent;\n const exactMeta = exists(manifest, pathname);\n\n if (pathname.endsWith(\"/index\")) {\n if (exactMeta) {\n return assetIntent(pathname, exactMeta);\n }\n if (\n (redirect = safeRedirect(\n `${pathname}.html`,\n pathname.slice(0, -\"index\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\"/index\".length)}.html`,\n pathname.slice(0, -\"/index\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n } else if (pathname.endsWith(\"/index.html\")) {\n if (\n (redirect = safeRedirect(\n pathname,\n pathname.slice(0, -\"index.html\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\"/index.html\".length)}.html`,\n pathname.slice(0, -\"/index.html\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n } else if (pathname.endsWith(\"/\")) {\n const indexPath = `${pathname}index.html`;\n if ((meta = exists(manifest, indexPath))) {\n return assetIntent(indexPath, meta);\n }\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\"/\".length)}.html`,\n pathname.slice(0, -\"/\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n } else if (pathname.endsWith(\".html\")) {\n if (\n (redirect = safeRedirect(\n pathname,\n pathname.slice(0, -\".html\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\".html\".length)}/index.html`,\n `${pathname.slice(0, -\".html\".length)}/`,\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n }\n\n // Exact match\n if (exactMeta) {\n return assetIntent(pathname, exactMeta);\n }\n // Try .html extension\n const htmlPath = `${pathname}.html`;\n if ((meta = exists(manifest, htmlPath))) {\n return assetIntent(htmlPath, meta);\n }\n // Try /index.html\n if (\n (redirect = safeRedirect(\n `${pathname}/index.html`,\n `${pathname}/`,\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n\n return notFound(pathname, manifest, config, acceptsHtml);\n}\n\nfunction htmlForceTrailingSlash(\n pathname: string,\n manifest: AssetManifest,\n config: NormalizedConfig,\n skipRedirects: boolean,\n acceptsHtml: boolean\n): Intent {\n let meta: AssetMetadata | undefined;\n let redirect: Intent;\n const exactMeta = exists(manifest, pathname);\n\n if (pathname.endsWith(\"/index\")) {\n if (exactMeta) return assetIntent(pathname, exactMeta);\n if (\n (redirect = safeRedirect(\n `${pathname}.html`,\n pathname.slice(0, -\"index\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\"/index\".length)}.html`,\n pathname.slice(0, -\"index\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n } else if (pathname.endsWith(\"/index.html\")) {\n if (\n (redirect = safeRedirect(\n pathname,\n pathname.slice(0, -\"index.html\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\"/index.html\".length)}.html`,\n pathname.slice(0, -\"index.html\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n } else if (pathname.endsWith(\"/\")) {\n let p = `${pathname}index.html`;\n if ((meta = exists(manifest, p))) {\n return assetIntent(p, meta);\n }\n p = `${pathname.slice(0, -\"/\".length)}.html`;\n if ((meta = exists(manifest, p))) {\n return assetIntent(p, meta);\n }\n } else if (pathname.endsWith(\".html\")) {\n if (\n (redirect = safeRedirect(\n pathname,\n `${pathname.slice(0, -\".html\".length)}/`,\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (exactMeta) return assetIntent(pathname, exactMeta);\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\".html\".length)}/index.html`,\n `${pathname.slice(0, -\".html\".length)}/`,\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n }\n\n if (exactMeta) return assetIntent(pathname, exactMeta);\n if (\n (redirect = safeRedirect(\n `${pathname}.html`,\n `${pathname}/`,\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (\n (redirect = safeRedirect(\n `${pathname}/index.html`,\n `${pathname}/`,\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n\n return notFound(pathname, manifest, config, acceptsHtml);\n}\n\nfunction htmlDropTrailingSlash(\n pathname: string,\n manifest: AssetManifest,\n config: NormalizedConfig,\n skipRedirects: boolean,\n acceptsHtml: boolean\n): Intent {\n let meta: AssetMetadata | undefined;\n let redirect: Intent;\n const exactMeta = exists(manifest, pathname);\n\n if (pathname.endsWith(\"/index\")) {\n if (exactMeta) return assetIntent(pathname, exactMeta);\n if (pathname === \"/index\") {\n if (\n (redirect = safeRedirect(\n \"/index.html\",\n \"/\",\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n } else {\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\"/index\".length)}.html`,\n pathname.slice(0, -\"/index\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (\n (redirect = safeRedirect(\n `${pathname}.html`,\n pathname.slice(0, -\"/index\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n }\n } else if (pathname.endsWith(\"/index.html\")) {\n if (pathname === \"/index.html\") {\n if (\n (redirect = safeRedirect(\n \"/index.html\",\n \"/\",\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n } else {\n if (\n (redirect = safeRedirect(\n pathname,\n pathname.slice(0, -\"/index.html\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (exactMeta) return assetIntent(pathname, exactMeta);\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\"/index.html\".length)}.html`,\n pathname.slice(0, -\"/index.html\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n }\n } else if (pathname.endsWith(\"/\")) {\n if (pathname === \"/\") {\n if ((meta = exists(manifest, \"/index.html\"))) {\n return assetIntent(\"/index.html\", meta);\n }\n } else {\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\"/\".length)}.html`,\n pathname.slice(0, -\"/\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\"/\".length)}/index.html`,\n pathname.slice(0, -\"/\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n }\n } else if (pathname.endsWith(\".html\")) {\n if (\n (redirect = safeRedirect(\n pathname,\n pathname.slice(0, -\".html\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n if (\n (redirect = safeRedirect(\n `${pathname.slice(0, -\".html\".length)}/index.html`,\n pathname.slice(0, -\".html\".length),\n manifest,\n config,\n skipRedirects\n ))\n )\n return redirect;\n }\n\n if (exactMeta) return assetIntent(pathname, exactMeta);\n let p = `${pathname}.html`;\n if ((meta = exists(manifest, p))) {\n return assetIntent(p, meta);\n }\n p = `${pathname}/index.html`;\n if ((meta = exists(manifest, p))) {\n return assetIntent(p, meta);\n }\n\n return notFound(pathname, manifest, config, acceptsHtml);\n}\n\nfunction htmlNone(\n pathname: string,\n manifest: AssetManifest,\n config: NormalizedConfig,\n acceptsHtml: boolean\n): Intent {\n const meta = exists(manifest, pathname);\n return meta\n ? assetIntent(pathname, meta)\n : notFound(pathname, manifest, config, acceptsHtml);\n}\n\n// ── Not-found handling ──────────────────────────────────────────────\n\nfunction notFound(\n pathname: string,\n manifest: AssetManifest,\n config: NormalizedConfig,\n acceptsHtml = true\n): Intent {\n switch (config.not_found_handling) {\n case \"single-page-application\": {\n // Only serve the SPA fallback for requests that accept HTML\n // (browser navigation). API calls (Accept: */* or application/json)\n // should fall through to the user's server code.\n if (!acceptsHtml) return undefined;\n const meta = exists(manifest, \"/index.html\");\n if (meta) return assetIntent(\"/index.html\", meta, 200);\n return undefined;\n }\n case \"404-page\": {\n let cwd = pathname;\n while (cwd) {\n cwd = cwd.slice(0, cwd.lastIndexOf(\"/\"));\n const p = `${cwd}/404.html`;\n const meta = exists(manifest, p);\n if (meta) return assetIntent(p, meta, 404);\n }\n return undefined;\n }\n default:\n return undefined;\n }\n}\n\n// ── Cache headers ───────────────────────────────────────────────────\n\nconst CACHE_CONTROL_REVALIDATE = \"public, max-age=0, must-revalidate\";\nconst CACHE_CONTROL_IMMUTABLE = \"public, max-age=31536000, immutable\";\n\nfunction getCacheControl(pathname: string): string {\n // Hashed assets (contain content hash in filename) get long-lived caching\n // Common patterns: app.abc123.js, styles.abc123.css, image.abc123.png\n if (/\\.[a-f0-9]{8,}\\.\\w+$/.test(pathname)) {\n return CACHE_CONTROL_IMMUTABLE;\n }\n return CACHE_CONTROL_REVALIDATE;\n}\n\n// ── Main handler ────────────────────────────────────────────────────\n\n/**\n * Handle an asset request. Returns a Response if an asset matches,\n * or null if the request should fall through to the user's Worker.\n *\n * @param request - The incoming HTTP request\n * @param manifest - Asset manifest (pathname -> metadata)\n * @param storage - Storage backend for fetching content\n * @param config - Asset serving configuration\n */\nexport async function handleAssetRequest(\n request: Request,\n manifest: AssetManifest,\n storage: AssetStorage,\n config?: AssetConfig\n): Promise<Response | null> {\n const normalized = normalizeConfig(config);\n\n // Only handle GET and HEAD\n const method = request.method.toUpperCase();\n if (![\"GET\", \"HEAD\"].includes(method)) {\n return null;\n }\n\n // Check redirects first\n const redirectResult = handleRedirects(request, normalized);\n if (redirectResult instanceof Response) {\n return attachCustomHeaders(request, redirectResult, normalized);\n }\n\n const { pathname } = redirectResult;\n const decodedPathname = decodePath(pathname);\n\n // SPA fallback should only apply to navigation requests that explicitly\n // accept HTML, not to API calls (fetch/XHR) which have Accept: */*\n const accept = request.headers.get(\"Accept\") || \"\";\n const acceptsHtml = accept.includes(\"text/html\");\n\n // Resolve intent through HTML handling\n const intent = getIntent(\n decodedPathname,\n manifest,\n normalized,\n false,\n acceptsHtml\n );\n\n if (!intent) {\n return null;\n }\n\n if (intent.type === \"redirect\") {\n const url = new URL(request.url);\n const encodedDest = encodePath(intent.to);\n const response = new Response(null, {\n status: 307,\n headers: { Location: encodedDest + url.search }\n });\n return attachCustomHeaders(request, response, normalized);\n }\n\n // Check if canonical path differs (needs redirect)\n const encodedPathname = encodePath(decodedPathname);\n if (encodedPathname !== pathname) {\n const url = new URL(request.url);\n const response = new Response(null, {\n status: 307,\n headers: { Location: encodedPathname + url.search }\n });\n return attachCustomHeaders(request, response, normalized);\n }\n\n // ETag conditional request\n const { pathname: assetPath, meta, status } = intent;\n const strongETag = `\"${meta.etag}\"`;\n const weakETag = `W/${strongETag}`;\n const ifNoneMatch = request.headers.get(\"If-None-Match\") || \"\";\n const eTags = new Set(ifNoneMatch.split(\",\").map((t) => t.trim()));\n\n const headers = new Headers();\n headers.set(\"ETag\", strongETag);\n if (meta.contentType) {\n headers.set(\"Content-Type\", meta.contentType);\n }\n headers.set(\"Cache-Control\", getCacheControl(decodedPathname));\n\n if (eTags.has(weakETag) || eTags.has(strongETag)) {\n const response = new Response(null, { status: 304, headers });\n return attachCustomHeaders(request, response, normalized);\n }\n\n // Fetch content from storage (only for non-HEAD)\n let body: ReadableStream | ArrayBuffer | string | null = null;\n if (method !== \"HEAD\") {\n body = await storage.get(assetPath);\n }\n\n const response = new Response(body, { status, headers });\n return attachCustomHeaders(request, response, normalized);\n}\n","// AUTO-GENERATED by scripts/build.ts — do not edit\nexport const ASSET_RUNTIME_CODE = \"var L={\\\".html\\\":\\\"text/html; charset=utf-8\\\",\\\".htm\\\":\\\"text/html; charset=utf-8\\\",\\\".js\\\":\\\"application/javascript; charset=utf-8\\\",\\\".mjs\\\":\\\"application/javascript; charset=utf-8\\\",\\\".css\\\":\\\"text/css; charset=utf-8\\\",\\\".json\\\":\\\"application/json; charset=utf-8\\\",\\\".png\\\":\\\"image/png\\\",\\\".jpg\\\":\\\"image/jpeg\\\",\\\".jpeg\\\":\\\"image/jpeg\\\",\\\".gif\\\":\\\"image/gif\\\",\\\".svg\\\":\\\"image/svg+xml\\\",\\\".ico\\\":\\\"image/x-icon\\\",\\\".webp\\\":\\\"image/webp\\\",\\\".avif\\\":\\\"image/avif\\\",\\\".woff\\\":\\\"font/woff\\\",\\\".woff2\\\":\\\"font/woff2\\\",\\\".ttf\\\":\\\"font/ttf\\\",\\\".otf\\\":\\\"font/otf\\\",\\\".eot\\\":\\\"application/vnd.ms-fontobject\\\",\\\".mp3\\\":\\\"audio/mpeg\\\",\\\".mp4\\\":\\\"video/mp4\\\",\\\".webm\\\":\\\"video/webm\\\",\\\".ogg\\\":\\\"audio/ogg\\\",\\\".wav\\\":\\\"audio/wav\\\",\\\".pdf\\\":\\\"application/pdf\\\",\\\".xml\\\":\\\"application/xml\\\",\\\".txt\\\":\\\"text/plain; charset=utf-8\\\",\\\".csv\\\":\\\"text/csv; charset=utf-8\\\",\\\".zip\\\":\\\"application/zip\\\",\\\".gz\\\":\\\"application/gzip\\\",\\\".tar\\\":\\\"application/x-tar\\\",\\\".wasm\\\":\\\"application/wasm\\\",\\\".webmanifest\\\":\\\"application/manifest+json\\\",\\\".map\\\":\\\"application/json\\\"};function P(t){let e=t.lastIndexOf(\\\".\\\");if(e===-1)return\\\"\\\";let n=t.lastIndexOf(\\\"/\\\");return e<n?\\\"\\\":t.slice(e).toLowerCase()}function M(t){let e=P(t);return L[e]}function O(t){let e=new Map(Object.entries(t));return{get(n){return Promise.resolve(e.get(n)??null)}}}function W(t){let e={};if(t?.redirects?.static){let n=1;for(let[s,i]of Object.entries(t.redirects.static))e[s]={...i,lineNumber:n++}}return{html_handling:t?.html_handling??\\\"auto-trailing-slash\\\",not_found_handling:t?.not_found_handling??\\\"none\\\",redirects:{static:e,dynamic:t?.redirects?.dynamic??{}},headers:t?.headers??{}}}async function U(t){if(typeof t==\\\"string\\\"){let s=2166136261;for(let i=0;i<t.length;i++)s^=t.charCodeAt(i),s=s*16777619>>>0;return s.toString(16).padStart(8,\\\"0\\\")}let e=await crypto.subtle.digest(\\\"SHA-256\\\",t);return[...new Uint8Array(e).slice(0,8)].map(s=>s.toString(16).padStart(2,\\\"0\\\")).join(\\\"\\\")}async function H(t){let e=new Map,n=Object.entries(t);return await Promise.all(n.map(async([s,i])=>{let l=M(s),r=await U(i);e.set(s,{contentType:l,etag:r})})),e}async function lt(t){let e=await H(t),n=O(t);return{manifest:e,storage:n}}function d(t,e){return t.get(e)}var B=/[-/\\\\\\\\^$*+?.()|[\\\\]{}]/g,j=t=>t.replaceAll(B,String.raw`\\\\$&`),D=/:([A-Za-z]\\\\w*)/g;function G(t,e){for(let[n,s]of Object.entries(e))t=t.replaceAll(`:${n}`,s);return t}function F(t){t=t.split(\\\"*\\\").map(n=>j(n)).join(\\\"(?<splat>.*)\\\");let e=t.matchAll(D);for(let n of e)t=t.split(n[0]).join(`(?<${n[1]}>[^/]+)`);return new RegExp(\\\"^\\\"+t+\\\"$\\\")}function X(t,e,n){let s=t.redirects.static[`https://${e}${n}`],i=t.redirects.static[n];return s&&i?s.lineNumber<i.lineNumber?s:i:s||i}function V(t,e){let{pathname:n}=new URL(e.url);for(let[s,i]of Object.entries(t.redirects.dynamic))try{let r=F(s).exec(n);if(r){let o=G(i.to,r.groups||{}).trim();return{status:i.status,to:o}}}catch{}}function Y(t,e){let n=new URL(t.url),{search:s,host:i}=n,{pathname:l}=n,r=X(e,i,l),o=r?void 0:V(e,t),c=r??o,h=!1;if(c)if(c.status===200)l=new URL(c.to,t.url).pathname,h=!0;else{let g=new URL(c.to,t.url),x=g.origin===n.origin?`${g.pathname}${g.search||s}${g.hash}`:`${g.href}`;return new Response(null,{status:c.status,headers:{Location:x}})}return{proxied:h,pathname:l}}function Z(t){let e=t.split(\\\"*\\\").map(n=>j(n)).join(\\\".*\\\");return new RegExp(\\\"^\\\"+e+\\\"$\\\")}function A(t,e,n){if(Object.keys(n.headers).length===0)return e;let{pathname:s}=new URL(t.url),i=new Set;for(let[l,r]of Object.entries(n.headers)){try{if(!Z(l).test(s))continue}catch{continue}if(r.unset)for(let o of r.unset)e.headers.delete(o);if(r.set)for(let[o,c]of Object.entries(r.set))i.has(o.toLowerCase())?e.headers.append(o,c):(e.headers.set(o,c),i.add(o.toLowerCase()))}return e}function J(t){return t.split(\\\"/\\\").map(e=>{try{return decodeURIComponent(e)}catch{return e}}).join(\\\"/\\\").replaceAll(/\\\\/+/g,\\\"/\\\")}function E(t){return t.split(\\\"/\\\").map(e=>{try{return encodeURIComponent(e)}catch{return e}}).join(\\\"/\\\")}function I(t,e,n,s=!1,i=!0){switch(n.html_handling){case\\\"auto-trailing-slash\\\":return Q(t,e,n,s,i);case\\\"force-trailing-slash\\\":return q(t,e,n,s,i);case\\\"drop-trailing-slash\\\":return k(t,e,n,s,i);case\\\"none\\\":return tt(t,e,n,i)}}function a(t,e,n=200){return{type:\\\"asset\\\",pathname:t,meta:e,status:n}}function K(t){return{type:\\\"redirect\\\",to:t}}function u(t,e,n,s,i){if(!i&&!d(n,e)){let l=I(e,n,s,!0);if(l?.type===\\\"asset\\\"&&l.meta.etag===d(n,t)?.etag)return K(e)}}function Q(t,e,n,s,i){let l,r,o=d(e,t);if(t.endsWith(\\\"/index\\\")){if(o)return a(t,o);if((r=u(`${t}.html`,t.slice(0,-5),e,n,s))||(r=u(`${t.slice(0,-6)}.html`,t.slice(0,-6),e,n,s)))return r}else if(t.endsWith(\\\"/index.html\\\")){if((r=u(t,t.slice(0,-10),e,n,s))||(r=u(`${t.slice(0,-11)}.html`,t.slice(0,-11),e,n,s)))return r}else if(t.endsWith(\\\"/\\\")){let h=`${t}index.html`;if(l=d(e,h))return a(h,l);if(r=u(`${t.slice(0,-1)}.html`,t.slice(0,-1),e,n,s))return r}else if(t.endsWith(\\\".html\\\")&&((r=u(t,t.slice(0,-5),e,n,s))||(r=u(`${t.slice(0,-5)}/index.html`,`${t.slice(0,-5)}/`,e,n,s))))return r;if(o)return a(t,o);let c=`${t}.html`;return(l=d(e,c))?a(c,l):(r=u(`${t}/index.html`,`${t}/`,e,n,s))?r:b(t,e,n,i)}function q(t,e,n,s,i){let l,r,o=d(e,t);if(t.endsWith(\\\"/index\\\")){if(o)return a(t,o);if((r=u(`${t}.html`,t.slice(0,-5),e,n,s))||(r=u(`${t.slice(0,-6)}.html`,t.slice(0,-5),e,n,s)))return r}else if(t.endsWith(\\\"/index.html\\\")){if((r=u(t,t.slice(0,-10),e,n,s))||(r=u(`${t.slice(0,-11)}.html`,t.slice(0,-10),e,n,s)))return r}else if(t.endsWith(\\\"/\\\")){let c=`${t}index.html`;if((l=d(e,c))||(c=`${t.slice(0,-1)}.html`,l=d(e,c)))return a(c,l)}else if(t.endsWith(\\\".html\\\")){if(r=u(t,`${t.slice(0,-5)}/`,e,n,s))return r;if(o)return a(t,o);if(r=u(`${t.slice(0,-5)}/index.html`,`${t.slice(0,-5)}/`,e,n,s))return r}return o?a(t,o):(r=u(`${t}.html`,`${t}/`,e,n,s))||(r=u(`${t}/index.html`,`${t}/`,e,n,s))?r:b(t,e,n,i)}function k(t,e,n,s,i){let l,r,o=d(e,t);if(t.endsWith(\\\"/index\\\")){if(o)return a(t,o);if(t===\\\"/index\\\"){if(r=u(\\\"/index.html\\\",\\\"/\\\",e,n,s))return r}else if((r=u(`${t.slice(0,-6)}.html`,t.slice(0,-6),e,n,s))||(r=u(`${t}.html`,t.slice(0,-6),e,n,s)))return r}else if(t.endsWith(\\\"/index.html\\\"))if(t===\\\"/index.html\\\"){if(r=u(\\\"/index.html\\\",\\\"/\\\",e,n,s))return r}else{if(r=u(t,t.slice(0,-11),e,n,s))return r;if(o)return a(t,o);if(r=u(`${t.slice(0,-11)}.html`,t.slice(0,-11),e,n,s))return r}else if(t.endsWith(\\\"/\\\")){if(t===\\\"/\\\"){if(l=d(e,\\\"/index.html\\\"))return a(\\\"/index.html\\\",l)}else if((r=u(`${t.slice(0,-1)}.html`,t.slice(0,-1),e,n,s))||(r=u(`${t.slice(0,-1)}/index.html`,t.slice(0,-1),e,n,s)))return r}else if(t.endsWith(\\\".html\\\")&&((r=u(t,t.slice(0,-5),e,n,s))||(r=u(`${t.slice(0,-5)}/index.html`,t.slice(0,-5),e,n,s))))return r;if(o)return a(t,o);let c=`${t}.html`;return(l=d(e,c))||(c=`${t}/index.html`,l=d(e,c))?a(c,l):b(t,e,n,i)}function tt(t,e,n,s){let i=d(e,t);return i?a(t,i):b(t,e,n,s)}function b(t,e,n,s=!0){switch(n.not_found_handling){case\\\"single-page-application\\\":{if(!s)return;let i=d(e,\\\"/index.html\\\");return i?a(\\\"/index.html\\\",i,200):void 0}case\\\"404-page\\\":{let i=t;for(;i;){i=i.slice(0,i.lastIndexOf(\\\"/\\\"));let l=`${i}/404.html`,r=d(e,l);if(r)return a(l,r,404)}return}default:return}}var et=\\\"public, max-age=0, must-revalidate\\\",nt=\\\"public, max-age=31536000, immutable\\\";function rt(t){return/\\\\.[a-f0-9]{8,}\\\\.\\\\w+$/.test(t)?nt:et}async function ot(t,e,n,s){let i=W(s),l=t.method.toUpperCase();if(![\\\"GET\\\",\\\"HEAD\\\"].includes(l))return null;let r=Y(t,i);if(r instanceof Response)return A(t,r,i);let{pathname:o}=r,c=J(o),g=(t.headers.get(\\\"Accept\\\")||\\\"\\\").includes(\\\"text/html\\\"),x=I(c,e,i,!1,g);if(!x)return null;if(x.type===\\\"redirect\\\"){let f=new URL(t.url),y=E(x.to),v=new Response(null,{status:307,headers:{Location:y+f.search}});return A(t,v,i)}let $=E(c);if($!==o){let f=new URL(t.url),y=new Response(null,{status:307,headers:{Location:$+f.search}});return A(t,y,i)}let{pathname:N,meta:p,status:S}=x,w=`\\\"${p.etag}\\\"`,_=`W/${w}`,z=t.headers.get(\\\"If-None-Match\\\")||\\\"\\\",C=new Set(z.split(\\\",\\\").map(f=>f.trim())),m=new Headers;if(m.set(\\\"ETag\\\",w),p.contentType&&m.set(\\\"Content-Type\\\",p.contentType),m.set(\\\"Cache-Control\\\",rt(c)),C.has(_)||C.has(w)){let f=new Response(null,{status:304,headers:m});return A(t,f,i)}let R=null;l!==\\\"HEAD\\\"&&(R=await n.get(N));let T=new Response(R,{status:S,headers:m});return A(t,T,i)}export{H as buildAssetManifest,lt as buildAssets,U as computeETag,O as createMemoryStorage,ot as handleAssetRequest,W as normalizeConfig};\\n\";\n","/**\n * App bundler: builds a full-stack app (server Worker + client bundle + static assets)\n * for the Worker Loader binding.\n */\n\nimport { bundleWithEsbuild } from \"./bundler\";\nimport { hasNodejsCompat, parseWranglerConfig } from \"./config\";\nimport { hasDependencies, installDependencies } from \"./installer\";\nimport { transformAndResolve } from \"./transformer\";\nimport type { AssetConfig, AssetManifest } from \"./asset-handler\";\nimport { buildAssetManifest } from \"./asset-handler\";\nimport type { CreateWorkerResult, Files, Modules } from \"./types\";\nimport { detectEntryPoint } from \"./utils\";\nimport { ASSET_RUNTIME_CODE } from \"./_asset-runtime-code\";\nimport { showExperimentalWarning } from \"./experimental\";\n\n/**\n * Options for createApp\n */\nexport interface CreateAppOptions {\n /**\n * Input files — keys are paths relative to project root, values are file contents.\n * Should include both server and client source files.\n */\n files: Files;\n\n /**\n * Server entry point (the Worker fetch handler).\n * If not specified, detected from wrangler config / package.json / defaults.\n */\n server?: string;\n\n /**\n * Client entry point(s) to bundle for the browser.\n * These are bundled with esbuild targeting the browser.\n */\n client?: string | string[];\n\n /**\n * Static assets to serve as-is (pathname -> content).\n * Keys should be URL pathnames (e.g., \"/favicon.ico\", \"/robots.txt\").\n * These are NOT processed by the bundler.\n */\n assets?: Record<string, string | ArrayBuffer>;\n\n /**\n * Asset serving configuration.\n */\n assetConfig?: AssetConfig;\n\n /**\n * Whether to bundle server dependencies.\n * @default true\n */\n bundle?: boolean;\n\n /**\n * External modules that should not be bundled.\n */\n externals?: string[];\n\n /**\n * Target environment for server bundle.\n * @default 'es2022'\n */\n target?: string;\n\n /**\n * Whether to minify the output.\n * @default false\n */\n minify?: boolean;\n\n /**\n * Generate source maps.\n * @default false\n */\n sourcemap?: boolean;\n\n /**\n * npm registry URL for fetching packages.\n */\n registry?: string;\n\n /**\n * Generate a Durable Object class wrapper instead of a module worker.\n * When set, the output exports a named class that can be used with\n * ctx.facets.get() / getDurableObjectClass() for persistent storage.\n *\n * If the user's server exports a DurableObject subclass (default export),\n * the wrapper extends it. Otherwise, it wraps the fetch handler in a DO.\n *\n * Pass `true` for className \"App\", or an object with a custom className.\n */\n durableObject?: { className?: string } | boolean;\n}\n\n/**\n * Result from createApp\n */\nexport interface CreateAppResult extends CreateWorkerResult {\n /**\n * The asset manifest for runtime request handling.\n * Contains metadata (content types, ETags) for each asset.\n */\n assetManifest: AssetManifest;\n\n /**\n * The asset config for runtime request handling.\n */\n assetConfig?: AssetConfig;\n\n /**\n * Client bundle output paths (relative to asset root).\n */\n clientBundles?: string[];\n\n /**\n * The Durable Object class name exported by the wrapper.\n * Only set when `durableObject` option was used.\n * Use with `worker.getDurableObjectClass(className)` and `ctx.facets.get()`.\n */\n durableObjectClassName?: string;\n}\n\n/**\n * Creates a full-stack app bundle from source files.\n *\n * This function:\n * 1. Bundles client entry point(s) for the browser (if provided)\n * 2. Collects static assets\n * 3. Bundles the server Worker\n * 4. Generates a server wrapper that serves assets and falls through to user code\n * 5. Returns everything ready for the Worker Loader\n */\nexport async function createApp(\n options: CreateAppOptions\n): Promise<CreateAppResult> {\n showExperimentalWarning(\"createApp\");\n let {\n files,\n bundle = true,\n externals = [],\n target = \"es2022\",\n minify = false,\n sourcemap = false,\n registry\n } = options;\n\n // Always treat cloudflare:* as external\n externals = [\"cloudflare:\", ...externals];\n\n // Parse wrangler config\n const wranglerConfig = parseWranglerConfig(files);\n const nodejsCompat = hasNodejsCompat(wranglerConfig);\n\n // Install npm dependencies if needed\n const installWarnings: string[] = [];\n if (hasDependencies(files)) {\n const installResult = await installDependencies(\n files,\n registry ? { registry } : {}\n );\n files = installResult.files;\n installWarnings.push(...installResult.warnings);\n }\n\n // ── Step 1: Build client bundles ──────────────────────────────────\n const clientEntries = options.client\n ? Array.isArray(options.client)\n ? options.client\n : [options.client]\n : [];\n\n const clientOutputs: Record<string, string> = {};\n const clientBundles: string[] = [];\n\n for (const clientEntry of clientEntries) {\n if (!(clientEntry in files)) {\n throw new Error(\n `Client entry point \"${clientEntry}\" not found in files.`\n );\n }\n\n // Bundle the client with esbuild targeting browser\n const clientResult = await bundleWithEsbuild(\n files,\n clientEntry,\n externals,\n \"es2022\", // Browser target\n minify,\n sourcemap,\n false // No nodejs_compat for client\n );\n\n // Extract the bundled output\n const bundleModule = clientResult.modules[\"bundle.js\"];\n if (typeof bundleModule === \"string\") {\n // Derive output name from entry\n const baseName = clientEntry\n .replace(/^src\\//, \"\")\n .replace(/\\.(tsx?|jsx?)$/, \".js\");\n const outputPath = `/${baseName}`;\n clientOutputs[outputPath] = bundleModule;\n clientBundles.push(outputPath);\n }\n }\n\n // ── Step 2: Collect all assets ────────────────────────────────────\n const allAssets: Record<string, string | ArrayBuffer> = {};\n\n // Add user-provided static assets\n if (options.assets) {\n for (const [pathname, content] of Object.entries(options.assets)) {\n const normalizedPath = pathname.startsWith(\"/\")\n ? pathname\n : `/${pathname}`;\n allAssets[normalizedPath] = content;\n }\n }\n\n // Add client bundle outputs\n for (const [pathname, content] of Object.entries(clientOutputs)) {\n allAssets[pathname] = content;\n }\n\n // Build the asset manifest (metadata only — no content stored)\n const assetManifest = await buildAssetManifest(allAssets);\n\n // ── Step 3: Build server Worker ───────────────────────────────────\n const serverEntry = options.server ?? detectEntryPoint(files, wranglerConfig);\n\n if (!serverEntry) {\n throw new Error(\n \"Could not determine server entry point. Specify the 'server' option.\"\n );\n }\n\n if (!(serverEntry in files)) {\n throw new Error(`Server entry point \"${serverEntry}\" not found in files.`);\n }\n\n // Build the server\n let serverResult: CreateWorkerResult;\n if (bundle) {\n serverResult = await bundleWithEsbuild(\n files,\n serverEntry,\n externals,\n target,\n minify,\n sourcemap,\n nodejsCompat\n );\n } else {\n serverResult = await transformAndResolve(files, serverEntry, externals);\n }\n\n // ── Step 4: Build combined modules ────────────────────────────────\n const modules: Modules = { ...serverResult.modules };\n\n // Add assets as text or binary modules under __assets/ prefix\n for (const [pathname, content] of Object.entries(allAssets)) {\n const moduleName = `__assets${pathname}`;\n if (typeof content === \"string\") {\n modules[moduleName] = { text: content };\n } else {\n modules[moduleName] = { data: content };\n }\n }\n\n // Add the asset manifest as a JSON module\n const manifestJson: Record<\n string,\n { contentType: string | undefined; etag: string }\n > = {};\n for (const [pathname, meta] of assetManifest) {\n manifestJson[pathname] = {\n contentType: meta.contentType,\n etag: meta.etag\n };\n }\n modules[\"__asset-manifest.json\"] = { json: manifestJson };\n\n // ── Step 5: Generate the app wrapper ──────────────────────────────\n const assetPathnames = [...assetManifest.keys()];\n\n // Resolve DO class name if durableObject option is set\n const doOption = options.durableObject;\n const doClassName = doOption\n ? typeof doOption === \"object\" && doOption.className\n ? doOption.className\n : \"App\"\n : undefined;\n\n const wrapperCode = doClassName\n ? generateDOAppWrapper(\n serverResult.mainModule,\n assetPathnames,\n doClassName,\n options.assetConfig\n )\n : generateAppWrapper(\n serverResult.mainModule,\n assetPathnames,\n options.assetConfig\n );\n modules[\"__app-wrapper.js\"] = wrapperCode;\n\n // Include the pre-built asset handler runtime module\n modules[\"__asset-runtime.js\"] = ASSET_RUNTIME_CODE;\n\n const result: CreateAppResult = {\n mainModule: \"__app-wrapper.js\",\n modules,\n assetManifest,\n assetConfig: options.assetConfig,\n clientBundles: clientBundles.length > 0 ? clientBundles : undefined,\n durableObjectClassName: doClassName\n };\n\n if (wranglerConfig !== undefined) {\n result.wranglerConfig = wranglerConfig;\n }\n\n if (installWarnings.length > 0) {\n result.warnings = [...(serverResult.warnings ?? []), ...installWarnings];\n } else if (serverResult.warnings) {\n result.warnings = serverResult.warnings;\n }\n\n return result;\n}\n\n/**\n * Generate the asset imports + initialization preamble shared by both wrappers.\n * Returns the import statements and the initialization code that creates\n * the manifest Map, memory storage, and ASSET_CONFIG for handleAssetRequest.\n */\nfunction generateAssetPreamble(\n assetPathnames: string[],\n assetConfig?: AssetConfig\n): { importsBlock: string; initBlock: string } {\n const configJson = JSON.stringify(assetConfig ?? {});\n\n const imports: string[] = [];\n const mapEntries: string[] = [];\n for (let i = 0; i < assetPathnames.length; i++) {\n const pathname = assetPathnames[i];\n const moduleName = `__assets${pathname}`;\n const varName = `__asset_${i}`;\n imports.push(`import ${varName} from \"./${moduleName}\";`);\n mapEntries.push(` ${JSON.stringify(pathname)}: ${varName}`);\n }\n\n const importsBlock = [\n 'import { handleAssetRequest, createMemoryStorage } from \"./__asset-runtime.js\";',\n 'import manifestJson from \"./__asset-manifest.json\";',\n ...imports\n ].join(\"\\n\");\n\n const contentMapBlock = `const ASSET_CONTENT = {\\n${mapEntries.join(\",\\n\")}\\n};`;\n\n const initBlock = `\nconst ASSET_CONFIG = ${configJson};\n${contentMapBlock}\n\n// Build manifest Map and storage at module init time\nconst manifest = new Map(Object.entries(manifestJson));\nconst storage = createMemoryStorage(ASSET_CONTENT);\n`.trimStart();\n\n return { importsBlock, initBlock };\n}\n\n/**\n * Generate the app wrapper module source.\n * This Worker serves assets first, then falls through to the user's server.\n *\n * Uses the pre-built __asset-runtime.js module for full asset handling\n * (all HTML modes, redirects, custom headers, ETag caching, etc.)\n */\nfunction generateAppWrapper(\n userServerModule: string,\n assetPathnames: string[],\n assetConfig?: AssetConfig\n): string {\n const { importsBlock, initBlock } = generateAssetPreamble(\n assetPathnames,\n assetConfig\n );\n\n return `\nimport userWorker from \"./${userServerModule}\";\n${importsBlock}\n\n${initBlock}\nexport default {\n async fetch(request, env, ctx) {\n const assetResponse = await handleAssetRequest(request, manifest, storage, ASSET_CONFIG);\n if (assetResponse) return assetResponse;\n\n // Fall through to user's Worker\n if (typeof userWorker === \"object\" && userWorker !== null && typeof userWorker.fetch === \"function\") {\n return userWorker.fetch(request, env, ctx);\n }\n if (typeof userWorker === \"function\") {\n return userWorker(request, env, ctx);\n }\n\n return new Response(\"Not Found\", { status: 404 });\n }\n};\n`.trim();\n}\n\n/**\n * Generate a Durable Object class wrapper module source.\n * Exports a named class that serves assets first, then delegates to the\n * user's server code. If the user's default export is a class (DurableObject\n * subclass), the wrapper extends it so `this.ctx.storage` works naturally.\n * Otherwise, it wraps the fetch handler in a DurableObject.\n *\n * Uses the pre-built __asset-runtime.js module for full asset handling.\n */\nfunction generateDOAppWrapper(\n userServerModule: string,\n assetPathnames: string[],\n className: string,\n assetConfig?: AssetConfig\n): string {\n const { importsBlock, initBlock } = generateAssetPreamble(\n assetPathnames,\n assetConfig\n );\n\n return `\nimport { DurableObject } from \"cloudflare:workers\";\nimport userExport from \"./${userServerModule}\";\n${importsBlock}\n\n${initBlock}\n// Determine base class: if user exported a DurableObject subclass, extend it\n// so this.ctx.storage works naturally. Regular functions and plain objects are\n// wrapped in a minimal DurableObject that delegates fetch().\n// NOTE: This check uses prototype presence — regular (non-arrow) functions also\n// have .prototype, but the system prompt instructs class exports for DO mode.\nconst BaseClass = (typeof userExport === \"function\" && userExport.prototype)\n ? userExport\n : class extends DurableObject {\n async fetch(request) {\n if (typeof userExport === \"object\" && userExport !== null && typeof userExport.fetch === \"function\") {\n return userExport.fetch(request, this.env, this.ctx);\n }\n return new Response(\"Not Found\", { status: 404 });\n }\n };\n\nexport class ${className} extends BaseClass {\n async fetch(request) {\n const assetResponse = await handleAssetRequest(request, manifest, storage, ASSET_CONFIG);\n if (assetResponse) return assetResponse;\n return super.fetch(request);\n }\n}\n`.trim();\n}\n","/**\n * Dynamic Worker Bundler\n *\n * Creates worker bundles from source files for Cloudflare's Worker Loader binding.\n */\n\nimport { bundleWithEsbuild } from \"./bundler\";\nimport { hasNodejsCompat, parseWranglerConfig } from \"./config\";\nimport { hasDependencies, installDependencies } from \"./installer\";\nimport { transformAndResolve } from \"./transformer\";\nimport type { CreateWorkerOptions, CreateWorkerResult } from \"./types\";\nimport { detectEntryPoint } from \"./utils\";\nimport { showExperimentalWarning } from \"./experimental\";\n\n// Re-export types\nexport type {\n CreateWorkerOptions,\n CreateWorkerResult,\n Files,\n Modules,\n WranglerConfig\n} from \"./types\";\n\n// Re-export app bundler\nexport { createApp } from \"./app\";\nexport type { CreateAppOptions, CreateAppResult } from \"./app\";\n\n// Re-export asset handler\nexport {\n handleAssetRequest,\n buildAssetManifest,\n buildAssets,\n createMemoryStorage\n} from \"./asset-handler\";\nexport type {\n AssetConfig,\n AssetMetadata,\n AssetManifest,\n AssetStorage\n} from \"./asset-handler\";\n\n// Re-export MIME utilities\nexport { inferContentType, isTextContentType } from \"./mime\";\n\n/**\n * Creates a worker bundle from source files.\n *\n * This function performs:\n * 1. Entry point detection (from package.json or defaults)\n * 2. Auto-installation of npm dependencies (if package.json has dependencies)\n * 3. TypeScript/JSX transformation (via Sucrase)\n * 4. Module resolution (handling imports/exports)\n * 5. Optional bundling (combining all modules into one)\n *\n * @param options - Configuration options\n * @returns The main module path and all modules\n */\nexport async function createWorker(\n options: CreateWorkerOptions\n): Promise<CreateWorkerResult> {\n showExperimentalWarning(\"createWorker\");\n let {\n files,\n bundle = true,\n externals = [],\n target = \"es2022\",\n minify = false,\n sourcemap = false,\n registry\n } = options;\n\n // Always treat cloudflare:* modules as external (runtime-provided)\n externals = [\"cloudflare:\", ...externals];\n\n // Parse wrangler config for compatibility settings\n const wranglerConfig = parseWranglerConfig(files);\n const nodejsCompat = hasNodejsCompat(wranglerConfig);\n\n // Auto-install dependencies if package.json has dependencies\n const installWarnings: string[] = [];\n if (hasDependencies(files)) {\n const installResult = await installDependencies(\n files,\n registry ? { registry } : {}\n );\n files = installResult.files;\n installWarnings.push(...installResult.warnings);\n }\n\n // Detect entry point (priority: explicit option > wrangler main > package.json > defaults)\n const entryPoint =\n options.entryPoint ?? detectEntryPoint(files, wranglerConfig);\n\n if (!entryPoint) {\n throw new Error(\n \"Could not determine entry point. Please specify entryPoint option.\"\n );\n }\n\n if (!(entryPoint in files)) {\n throw new Error(`Entry point \"${entryPoint}\" not found in files.`);\n }\n\n if (bundle) {\n // Try bundling with esbuild-wasm\n const result = await bundleWithEsbuild(\n files,\n entryPoint,\n externals,\n target,\n minify,\n sourcemap,\n nodejsCompat\n );\n\n // Add wrangler config if a config file was found\n if (wranglerConfig !== undefined) {\n result.wranglerConfig = wranglerConfig;\n }\n\n // Add install warnings to result\n if (installWarnings.length > 0) {\n result.warnings = [...(result.warnings ?? []), ...installWarnings];\n }\n\n return result;\n } else {\n // No bundling - transform files and resolve dependencies\n // Note: sourcemaps are not supported in transform mode (output mirrors input structure)\n const result = await transformAndResolve(files, entryPoint, externals);\n\n // Add wrangler config if a config file was found\n if (wranglerConfig !== undefined) {\n result.wranglerConfig = wranglerConfig;\n }\n\n // Add install warnings to result\n if (installWarnings.length > 0) {\n result.warnings = [...(result.warnings ?? []), ...installWarnings];\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudflare/worker-bundler",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"description": "Build and bundle Workers at runtime for Cloudflare Worker Loader binding",
|
|
4
|
+
"version": "0.0.3",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"directory": "packages/worker-bundler",
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/cloudflare/agents.git"
|
|
11
|
+
},
|
|
12
|
+
"author": "Cloudflare Inc.",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/cloudflare/agents/issues"
|
|
15
|
+
},
|
|
16
|
+
"types": "dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"README.md"
|
|
26
|
+
],
|
|
6
27
|
"scripts": {
|
|
7
|
-
"
|
|
28
|
+
"build": "tsx ./scripts/build.ts",
|
|
29
|
+
"test": "vitest run --config src/tests/vitest.config.ts"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"es-module-lexer": "^2.0.0",
|
|
33
|
+
"esbuild-wasm": "0.27.3",
|
|
34
|
+
"resolve.exports": "^2.0.3",
|
|
35
|
+
"semver": "^7.7.4",
|
|
36
|
+
"smol-toml": "^1.6.0",
|
|
37
|
+
"sucrase": "^3.35.1"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/semver": "^7.7.1"
|
|
8
41
|
},
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"type": "commonjs"
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22"
|
|
44
|
+
}
|
|
13
45
|
}
|