vinext 0.0.19 → 0.0.21

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.
Files changed (71) hide show
  1. package/README.md +1 -1
  2. package/dist/check.d.ts.map +1 -1
  3. package/dist/check.js +2 -1
  4. package/dist/check.js.map +1 -1
  5. package/dist/cli.js +4 -4
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config/next-config.d.ts +6 -0
  8. package/dist/config/next-config.d.ts.map +1 -1
  9. package/dist/config/next-config.js.map +1 -1
  10. package/dist/deploy.d.ts.map +1 -1
  11. package/dist/deploy.js +15 -1
  12. package/dist/deploy.js.map +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +142 -18
  15. package/dist/index.js.map +1 -1
  16. package/dist/init.d.ts +9 -1
  17. package/dist/init.d.ts.map +1 -1
  18. package/dist/init.js +31 -2
  19. package/dist/init.js.map +1 -1
  20. package/dist/server/app-dev-server.d.ts.map +1 -1
  21. package/dist/server/app-dev-server.js +104 -13
  22. package/dist/server/app-dev-server.js.map +1 -1
  23. package/dist/server/dev-server.d.ts.map +1 -1
  24. package/dist/server/dev-server.js +31 -5
  25. package/dist/server/dev-server.js.map +1 -1
  26. package/dist/server/image-optimization.d.ts +17 -3
  27. package/dist/server/image-optimization.d.ts.map +1 -1
  28. package/dist/server/image-optimization.js +31 -13
  29. package/dist/server/image-optimization.js.map +1 -1
  30. package/dist/server/middleware.d.ts.map +1 -1
  31. package/dist/server/middleware.js +13 -4
  32. package/dist/server/middleware.js.map +1 -1
  33. package/dist/server/prod-server.d.ts.map +1 -1
  34. package/dist/server/prod-server.js +25 -8
  35. package/dist/server/prod-server.js.map +1 -1
  36. package/dist/shims/compat-router.d.ts +12 -0
  37. package/dist/shims/compat-router.d.ts.map +1 -0
  38. package/dist/shims/compat-router.js +23 -0
  39. package/dist/shims/compat-router.js.map +1 -0
  40. package/dist/shims/font-google.generated.d.ts.map +1 -1
  41. package/dist/shims/font-google.generated.js +1923 -1923
  42. package/dist/shims/font-google.generated.js.map +1 -1
  43. package/dist/shims/image.d.ts.map +1 -1
  44. package/dist/shims/image.js +16 -3
  45. package/dist/shims/image.js.map +1 -1
  46. package/dist/shims/link.d.ts.map +1 -1
  47. package/dist/shims/link.js +15 -13
  48. package/dist/shims/link.js.map +1 -1
  49. package/dist/shims/metadata.d.ts.map +1 -1
  50. package/dist/shims/metadata.js +15 -4
  51. package/dist/shims/metadata.js.map +1 -1
  52. package/dist/shims/navigation.d.ts +1 -0
  53. package/dist/shims/navigation.d.ts.map +1 -1
  54. package/dist/shims/navigation.js +16 -0
  55. package/dist/shims/navigation.js.map +1 -1
  56. package/dist/shims/router.d.ts +18 -0
  57. package/dist/shims/router.d.ts.map +1 -1
  58. package/dist/shims/router.js +63 -30
  59. package/dist/shims/router.js.map +1 -1
  60. package/dist/shims/script.d.ts.map +1 -1
  61. package/dist/shims/script.js +18 -18
  62. package/dist/shims/script.js.map +1 -1
  63. package/dist/shims/server.d.ts +11 -2
  64. package/dist/shims/server.d.ts.map +1 -1
  65. package/dist/shims/server.js +11 -2
  66. package/dist/shims/server.js.map +1 -1
  67. package/dist/utils/project.d.ts +12 -6
  68. package/dist/utils/project.d.ts.map +1 -1
  69. package/dist/utils/project.js +56 -21
  70. package/dist/utils/project.js.map +1 -1
  71. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"next-config.js","sourceRoot":"","sources":["../../src/config/next-config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * next.config.js / next.config.mjs / next.config.ts parser\n *\n * Loads the Next.js config file (if present) and extracts supported options.\n * Unsupported options are logged as warnings.\n */\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\n\nexport interface HasCondition {\n type: \"header\" | \"cookie\" | \"query\" | \"host\";\n key: string;\n value?: string;\n}\n\nexport interface NextRedirect {\n source: string;\n destination: string;\n permanent: boolean;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextRewrite {\n source: string;\n destination: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextHeader {\n source: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n headers: Array<{ key: string; value: string }>;\n}\n\nexport interface NextI18nConfig {\n /** List of supported locales */\n locales: string[];\n /** The default locale (used when no locale prefix is in the URL) */\n defaultLocale: string;\n /**\n * Whether to auto-detect locale from Accept-Language header.\n * Defaults to true in Next.js.\n */\n localeDetection?: boolean;\n /**\n * Domain-based routing. Each domain maps to a specific locale.\n */\n domains?: Array<{\n domain: string;\n defaultLocale: string;\n locales?: string[];\n http?: boolean;\n }>;\n}\n\n/**\n * MDX compilation options extracted from @next/mdx config.\n * These are passed through to @mdx-js/rollup so that custom\n * remark/rehype/recma plugins configured in next.config work with Vite.\n */\nexport interface MdxOptions {\n remarkPlugins?: unknown[];\n rehypePlugins?: unknown[];\n recmaPlugins?: unknown[];\n}\n\nexport interface NextConfig {\n /** Additional env variables */\n env?: Record<string, string>;\n /** Base URL path prefix */\n basePath?: string;\n /** Whether to add trailing slashes */\n trailingSlash?: boolean;\n /** Internationalization routing config */\n i18n?: NextI18nConfig;\n /** URL redirect rules */\n redirects?: () => Promise<NextRedirect[]> | NextRedirect[];\n /** URL rewrite rules */\n rewrites?: () =>\n | Promise<NextRewrite[] | { beforeFiles: NextRewrite[]; afterFiles: NextRewrite[]; fallback: NextRewrite[] }>\n | NextRewrite[]\n | { beforeFiles: NextRewrite[]; afterFiles: NextRewrite[]; fallback: NextRewrite[] };\n /** Custom response headers */\n headers?: () => Promise<NextHeader[]> | NextHeader[];\n /** Image optimization config */\n images?: {\n remotePatterns?: Array<{\n protocol?: string;\n hostname: string;\n port?: string;\n pathname?: string;\n search?: string;\n }>;\n domains?: string[];\n unoptimized?: boolean;\n /** Allowed device widths for image optimization. Defaults to Next.js defaults: [640, 750, 828, 1080, 1200, 1920, 2048, 3840] */\n deviceSizes?: number[];\n /** Allowed image sizes for fixed-width images. Defaults to Next.js defaults: [16, 32, 48, 64, 96, 128, 256, 384] */\n imageSizes?: number[];\n };\n /** Build output mode: 'export' for full static export, 'standalone' for single server */\n output?: \"export\" | \"standalone\";\n /**\n * Enable Cache Components (Next.js 16).\n * When true, enables the \"use cache\" directive for pages, components, and functions.\n * Replaces the removed experimental.ppr and experimental.dynamicIO flags.\n */\n cacheComponents?: boolean;\n /** Transpile packages (Vite handles this natively) */\n transpilePackages?: string[];\n /** Webpack config (ignored — we use Vite) */\n webpack?: unknown;\n /** Any other options */\n [key: string]: unknown;\n}\n\n/**\n * Resolved configuration with all async values awaited.\n */\nexport interface ResolvedNextConfig {\n env: Record<string, string>;\n basePath: string;\n trailingSlash: boolean;\n output: \"\" | \"export\" | \"standalone\";\n cacheComponents: boolean;\n redirects: NextRedirect[];\n rewrites: {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n };\n headers: NextHeader[];\n images: NextConfig[\"images\"];\n i18n: NextI18nConfig | null;\n /** MDX remark/rehype/recma plugins extracted from @next/mdx config */\n mdx: MdxOptions | null;\n /** Extra allowed origins for server action CSRF validation (from experimental.serverActions.allowedOrigins). */\n serverActionsAllowedOrigins: string[];\n}\n\nconst CONFIG_FILES = [\n \"next.config.ts\",\n \"next.config.mjs\",\n \"next.config.js\",\n \"next.config.cjs\",\n];\n\n/**\n * Check whether an error indicates a CJS module was loaded in an ESM context\n * (i.e. the file uses `require()` which is not available in ESM).\n */\nfunction isCjsError(e: unknown): boolean {\n if (!(e instanceof Error)) return false;\n const msg = e.message;\n return (\n msg.includes(\"require is not a function\") ||\n msg.includes(\"require is not defined\") ||\n msg.includes(\"exports is not defined\") ||\n msg.includes(\"module is not defined\") ||\n msg.includes(\"__dirname is not defined\") ||\n msg.includes(\"__filename is not defined\")\n );\n}\n\n/**\n * Unwrap the config value from a loaded module, calling it if it's a\n * function-form config (Next.js supports `module.exports = (phase, opts) => config`).\n */\nasync function unwrapConfig(mod: any): Promise<NextConfig> {\n const config = mod.default ?? mod;\n if (typeof config === \"function\") {\n const result = await config(\"phase-development-server\", {\n defaultConfig: {},\n });\n return result as NextConfig;\n }\n return config as NextConfig;\n}\n\n/**\n * Find and load the next.config file from the project root.\n * Returns null if no config file is found.\n *\n * Attempts ESM dynamic `import()` first. If the file uses CJS constructs\n * (`require`, `module.exports`) that aren't available in ESM context, falls\n * back to loading it via `createRequire` so that CJS config files (common in\n * the Next.js ecosystem for plugin wrappers like nextra, @next/mdx, etc.) work.\n */\nexport async function loadNextConfig(root: string): Promise<NextConfig | null> {\n for (const filename of CONFIG_FILES) {\n const configPath = path.join(root, filename);\n if (!fs.existsSync(configPath)) continue;\n\n try {\n // Use dynamic import for ESM/TS config files\n const fileUrl = pathToFileURL(configPath).href;\n const mod = await import(fileUrl);\n return await unwrapConfig(mod);\n } catch (e) {\n // If the error indicates a CJS file loaded in ESM context, retry with\n // createRequire which provides a proper CommonJS environment.\n if (isCjsError(e) && (filename.endsWith(\".js\") || filename.endsWith(\".cjs\"))) {\n try {\n const require = createRequire(path.join(root, \"package.json\"));\n const mod = require(configPath);\n return await unwrapConfig({ default: mod });\n } catch (e2) {\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e2 as Error).message}`,\n );\n return null;\n }\n }\n\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e as Error).message}`,\n );\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * Resolve a NextConfig into a fully-resolved ResolvedNextConfig.\n * Awaits async functions for redirects/rewrites/headers.\n */\nexport async function resolveNextConfig(\n config: NextConfig | null,\n): Promise<ResolvedNextConfig> {\n if (!config) {\n return {\n env: {},\n basePath: \"\",\n trailingSlash: false,\n output: \"\",\n cacheComponents: false,\n redirects: [],\n rewrites: { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: [],\n images: undefined,\n i18n: null,\n mdx: null,\n serverActionsAllowedOrigins: [],\n };\n }\n\n // Resolve redirects\n let redirects: NextRedirect[] = [];\n if (config.redirects) {\n const result = await config.redirects();\n redirects = Array.isArray(result) ? result : [];\n }\n\n // Resolve rewrites\n let rewrites = { beforeFiles: [] as NextRewrite[], afterFiles: [] as NextRewrite[], fallback: [] as NextRewrite[] };\n if (config.rewrites) {\n const result = await config.rewrites();\n if (Array.isArray(result)) {\n rewrites.afterFiles = result;\n } else {\n rewrites = {\n beforeFiles: result.beforeFiles ?? [],\n afterFiles: result.afterFiles ?? [],\n fallback: result.fallback ?? [],\n };\n }\n }\n\n // Resolve headers\n let headers: NextHeader[] = [];\n if (config.headers) {\n headers = await config.headers();\n }\n\n // Extract MDX remark/rehype plugins from @next/mdx's webpack wrapper\n const mdx = extractMdxOptions(config);\n\n // Resolve serverActions.allowedOrigins from experimental config\n const experimental = config.experimental as Record<string, unknown> | undefined;\n const serverActionsConfig = experimental?.serverActions as Record<string, unknown> | undefined;\n const serverActionsAllowedOrigins = Array.isArray(serverActionsConfig?.allowedOrigins)\n ? (serverActionsConfig.allowedOrigins as string[])\n : [];\n\n // Warn about unsupported options (skip webpack if we extracted MDX from it)\n const unsupported = mdx ? [] : [\"webpack\"];\n for (const key of unsupported) {\n if (config[key] !== undefined) {\n console.warn(\n `[vinext] next.config option \"${key}\" is not yet supported and will be ignored`,\n );\n }\n }\n\n const output = config.output ?? \"\";\n if (output && output !== \"export\" && output !== \"standalone\") {\n console.warn(`[vinext] Unknown output mode \"${output as string}\", ignoring`);\n }\n\n // Parse i18n config\n let i18n: NextI18nConfig | null = null;\n if (config.i18n) {\n i18n = {\n locales: config.i18n.locales,\n defaultLocale: config.i18n.defaultLocale,\n localeDetection: config.i18n.localeDetection ?? true,\n domains: config.i18n.domains,\n };\n }\n\n return {\n env: config.env ?? {},\n basePath: config.basePath ?? \"\",\n trailingSlash: config.trailingSlash ?? false,\n output: output === \"export\" || output === \"standalone\" ? output : \"\",\n cacheComponents: config.cacheComponents ?? false,\n redirects,\n rewrites,\n headers,\n images: config.images,\n i18n,\n mdx,\n serverActionsAllowedOrigins,\n };\n}\n\n/**\n * Extract MDX compilation options (remark/rehype/recma plugins) from\n * a Next.js config that uses @next/mdx.\n *\n * @next/mdx wraps the config with a webpack function that injects an MDX\n * loader rule. The remark/rehype plugins are captured in that closure.\n * We probe the webpack function with a mock config to extract them.\n */\nexport function extractMdxOptions(config: NextConfig): MdxOptions | null {\n if (typeof config.webpack !== \"function\") return null;\n\n // Build a mock webpack config object that @next/mdx's wrapper will mutate\n const mockModuleRules: any[] = [];\n const mockConfig = {\n resolve: { alias: {} as Record<string, string> },\n module: { rules: mockModuleRules },\n plugins: [] as any[],\n };\n const mockOptions = {\n defaultLoaders: { babel: { loader: \"next-babel-loader\" } },\n isServer: false,\n dev: false,\n dir: \"/mock\",\n };\n\n try {\n const result = (config.webpack as Function)(mockConfig, mockOptions);\n // @next/mdx may return the config or mutate in place\n const finalConfig = result ?? mockConfig;\n const rules: any[] = finalConfig.module?.rules ?? mockModuleRules;\n\n // Search through webpack rules for the MDX loader injected by @next/mdx\n for (const rule of rules) {\n const loaders = extractMdxLoaders(rule);\n if (loaders) return loaders;\n }\n } catch {\n // If the webpack function throws (e.g. expects real webpack internals),\n // silently skip — we'll fall back to bare mdx() with no plugins.\n }\n\n return null;\n}\n\n/**\n * Recursively search a webpack rule (which may have nested `oneOf` arrays)\n * for an MDX loader and extract its remark/rehype/recma plugin options.\n */\nfunction extractMdxLoaders(rule: any): MdxOptions | null {\n if (!rule) return null;\n\n // Check `oneOf` arrays (Next.js uses these extensively)\n if (Array.isArray(rule.oneOf)) {\n for (const child of rule.oneOf) {\n const result = extractMdxLoaders(child);\n if (result) return result;\n }\n }\n\n // Check `use` array (loader chain)\n const use = Array.isArray(rule.use) ? rule.use : rule.use ? [rule.use] : [];\n for (const loader of use) {\n const loaderPath = typeof loader === \"string\" ? loader : loader?.loader;\n if (typeof loaderPath === \"string\" && isMdxLoader(loaderPath)) {\n const opts = typeof loader === \"object\" ? loader.options : {};\n return extractPluginsFromOptions(opts);\n }\n }\n\n // Check direct `loader` field\n if (typeof rule.loader === \"string\" && isMdxLoader(rule.loader)) {\n return extractPluginsFromOptions(rule.options);\n }\n\n return null;\n}\n\nfunction isMdxLoader(loaderPath: string): boolean {\n return (\n loaderPath.includes(\"mdx\") &&\n (loaderPath.includes(\"@next\") ||\n loaderPath.includes(\"@mdx-js\") ||\n loaderPath.includes(\"mdx-js-loader\") ||\n loaderPath.includes(\"next-mdx\"))\n );\n}\n\nfunction extractPluginsFromOptions(opts: any): MdxOptions | null {\n if (!opts || typeof opts !== \"object\") return null;\n\n const remarkPlugins = Array.isArray(opts.remarkPlugins) ? opts.remarkPlugins : undefined;\n const rehypePlugins = Array.isArray(opts.rehypePlugins) ? opts.rehypePlugins : undefined;\n const recmaPlugins = Array.isArray(opts.recmaPlugins) ? opts.recmaPlugins : undefined;\n\n // Only return if at least one plugin array is non-empty\n if (\n (remarkPlugins && remarkPlugins.length > 0) ||\n (rehypePlugins && rehypePlugins.length > 0) ||\n (recmaPlugins && recmaPlugins.length > 0)\n ) {\n return {\n ...(remarkPlugins && remarkPlugins.length > 0 ? { remarkPlugins } : {}),\n ...(rehypePlugins && rehypePlugins.length > 0 ? { rehypePlugins } : {}),\n ...(recmaPlugins && recmaPlugins.length > 0 ? { recmaPlugins } : {}),\n };\n }\n\n return null;\n}\n"]}
1
+ {"version":3,"file":"next-config.js","sourceRoot":"","sources":["../../src/config/next-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,SAAS,CAAC;AA8IzB,MAAM,YAAY,GAAG;IACnB,gBAAgB;IAChB,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;CAClB,CAAC;AAEF;;;GAGG;AACH,SAAS,UAAU,CAAC,CAAU;IAC5B,IAAI,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC;IACtB,OAAO,CACL,GAAG,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACzC,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACtC,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACtC,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACxC,GAAG,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAC1C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY,CAAC,GAAQ;IAClC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;IAClC,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,0BAA0B,EAAE;YACtD,aAAa,EAAE,EAAE;SAClB,CAAC,CAAC;QACH,OAAO,MAAoB,CAAC;IAC9B,CAAC;IACD,OAAO,MAAoB,CAAC;AAC9B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS;QAEzC,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC/C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YAClC,OAAO,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,sEAAsE;YACtE,8DAA8D;YAC9D,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC7E,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;oBAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;oBAChC,OAAO,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC9C,CAAC;gBAAC,OAAO,EAAE,EAAE,CAAC;oBACZ,OAAO,CAAC,IAAI,CACV,2BAA2B,QAAQ,KAAM,EAAY,CAAC,OAAO,EAAE,CAChE,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAED,OAAO,CAAC,IAAI,CACV,2BAA2B,QAAQ,KAAM,CAAW,CAAC,OAAO,EAAE,CAC/D,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAyB;IAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,GAAG,EAAE,EAAE;YACP,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,KAAK;YACpB,MAAM,EAAE,EAAE;YACV,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC3D,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,IAAI;YACT,2BAA2B,EAAE,EAAE;SAChC,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,IAAI,SAAS,GAAmB,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC;IAED,mBAAmB;IACnB,IAAI,QAAQ,GAAG,EAAE,WAAW,EAAE,EAAmB,EAAE,UAAU,EAAE,EAAmB,EAAE,QAAQ,EAAE,EAAmB,EAAE,CAAC;IACpH,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG;gBACT,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;gBACrC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;gBACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;aAChC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,OAAO,GAAiB,EAAE,CAAC;IAC/B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAED,qEAAqE;IACrE,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEtC,gEAAgE;IAChE,MAAM,YAAY,GAAG,MAAM,CAAC,YAAmD,CAAC;IAChF,MAAM,mBAAmB,GAAG,YAAY,EAAE,aAAoD,CAAC;IAC/F,MAAM,2BAA2B,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,cAAc,CAAC;QACpF,CAAC,CAAE,mBAAmB,CAAC,cAA2B;QAClD,CAAC,CAAC,EAAE,CAAC;IAEP,4EAA4E;IAC5E,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CACV,gCAAgC,GAAG,4CAA4C,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,IAAI,MAAM,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,iCAAiC,MAAgB,aAAa,CAAC,CAAC;IAC/E,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,GAA0B,IAAI,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,GAAG;YACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;YAC5B,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa;YACxC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI;YACpD,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;QAC/B,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,KAAK;QAC5C,MAAM,EAAE,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACpE,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,KAAK;QAChD,SAAS;QACT,QAAQ;QACR,OAAO;QACP,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI;QACJ,GAAG;QACH,2BAA2B;KAC5B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAkB;IAClD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAEtD,0EAA0E;IAC1E,MAAM,eAAe,GAAU,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG;QACjB,OAAO,EAAE,EAAE,KAAK,EAAE,EAA4B,EAAE;QAChD,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE;QAClC,OAAO,EAAE,EAAW;KACrB,CAAC;IACF,MAAM,WAAW,GAAG;QAClB,cAAc,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE;QAC1D,QAAQ,EAAE,KAAK;QACf,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,OAAO;KACb,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAI,MAAM,CAAC,OAAoB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACrE,qDAAqD;QACrD,MAAM,WAAW,GAAG,MAAM,IAAI,UAAU,CAAC;QACzC,MAAM,KAAK,GAAU,WAAW,CAAC,MAAM,EAAE,KAAK,IAAI,eAAe,CAAC;QAElE,wEAAwE;QACxE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,iEAAiE;IACnE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,IAAS;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,wDAAwD;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,KAAK,MAAM,MAAM,IAAI,GAAG,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;QACxE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,OAAO,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB;IACrC,OAAO,CACL,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC1B,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5B,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC9B,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC;YACpC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAS;IAC1C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEnD,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtF,wDAAwD;IACxD,IACE,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EACzC,CAAC;QACD,OAAO;YACL,GAAG,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/**\n * next.config.js / next.config.mjs / next.config.ts parser\n *\n * Loads the Next.js config file (if present) and extracts supported options.\n * Unsupported options are logged as warnings.\n */\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport fs from \"node:fs\";\n\nexport interface HasCondition {\n type: \"header\" | \"cookie\" | \"query\" | \"host\";\n key: string;\n value?: string;\n}\n\nexport interface NextRedirect {\n source: string;\n destination: string;\n permanent: boolean;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextRewrite {\n source: string;\n destination: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n}\n\nexport interface NextHeader {\n source: string;\n has?: HasCondition[];\n missing?: HasCondition[];\n headers: Array<{ key: string; value: string }>;\n}\n\nexport interface NextI18nConfig {\n /** List of supported locales */\n locales: string[];\n /** The default locale (used when no locale prefix is in the URL) */\n defaultLocale: string;\n /**\n * Whether to auto-detect locale from Accept-Language header.\n * Defaults to true in Next.js.\n */\n localeDetection?: boolean;\n /**\n * Domain-based routing. Each domain maps to a specific locale.\n */\n domains?: Array<{\n domain: string;\n defaultLocale: string;\n locales?: string[];\n http?: boolean;\n }>;\n}\n\n/**\n * MDX compilation options extracted from @next/mdx config.\n * These are passed through to @mdx-js/rollup so that custom\n * remark/rehype/recma plugins configured in next.config work with Vite.\n */\nexport interface MdxOptions {\n remarkPlugins?: unknown[];\n rehypePlugins?: unknown[];\n recmaPlugins?: unknown[];\n}\n\nexport interface NextConfig {\n /** Additional env variables */\n env?: Record<string, string>;\n /** Base URL path prefix */\n basePath?: string;\n /** Whether to add trailing slashes */\n trailingSlash?: boolean;\n /** Internationalization routing config */\n i18n?: NextI18nConfig;\n /** URL redirect rules */\n redirects?: () => Promise<NextRedirect[]> | NextRedirect[];\n /** URL rewrite rules */\n rewrites?: () =>\n | Promise<NextRewrite[] | { beforeFiles: NextRewrite[]; afterFiles: NextRewrite[]; fallback: NextRewrite[] }>\n | NextRewrite[]\n | { beforeFiles: NextRewrite[]; afterFiles: NextRewrite[]; fallback: NextRewrite[] };\n /** Custom response headers */\n headers?: () => Promise<NextHeader[]> | NextHeader[];\n /** Image optimization config */\n images?: {\n remotePatterns?: Array<{\n protocol?: string;\n hostname: string;\n port?: string;\n pathname?: string;\n search?: string;\n }>;\n domains?: string[];\n unoptimized?: boolean;\n /** Allowed device widths for image optimization. Defaults to Next.js defaults: [640, 750, 828, 1080, 1200, 1920, 2048, 3840] */\n deviceSizes?: number[];\n /** Allowed image sizes for fixed-width images. Defaults to Next.js defaults: [16, 32, 48, 64, 96, 128, 256, 384] */\n imageSizes?: number[];\n /** Allow SVG images through the image optimization endpoint. SVG can contain scripts, so only enable if you trust all image sources. */\n dangerouslyAllowSVG?: boolean;\n /** Content-Disposition header for image responses. Defaults to \"inline\". */\n contentDispositionType?: \"inline\" | \"attachment\";\n /** Content-Security-Policy header for image responses. Defaults to \"script-src 'none'; frame-src 'none'; sandbox;\" */\n contentSecurityPolicy?: string;\n };\n /** Build output mode: 'export' for full static export, 'standalone' for single server */\n output?: \"export\" | \"standalone\";\n /**\n * Enable Cache Components (Next.js 16).\n * When true, enables the \"use cache\" directive for pages, components, and functions.\n * Replaces the removed experimental.ppr and experimental.dynamicIO flags.\n */\n cacheComponents?: boolean;\n /** Transpile packages (Vite handles this natively) */\n transpilePackages?: string[];\n /** Webpack config (ignored — we use Vite) */\n webpack?: unknown;\n /** Any other options */\n [key: string]: unknown;\n}\n\n/**\n * Resolved configuration with all async values awaited.\n */\nexport interface ResolvedNextConfig {\n env: Record<string, string>;\n basePath: string;\n trailingSlash: boolean;\n output: \"\" | \"export\" | \"standalone\";\n cacheComponents: boolean;\n redirects: NextRedirect[];\n rewrites: {\n beforeFiles: NextRewrite[];\n afterFiles: NextRewrite[];\n fallback: NextRewrite[];\n };\n headers: NextHeader[];\n images: NextConfig[\"images\"];\n i18n: NextI18nConfig | null;\n /** MDX remark/rehype/recma plugins extracted from @next/mdx config */\n mdx: MdxOptions | null;\n /** Extra allowed origins for server action CSRF validation (from experimental.serverActions.allowedOrigins). */\n serverActionsAllowedOrigins: string[];\n}\n\nconst CONFIG_FILES = [\n \"next.config.ts\",\n \"next.config.mjs\",\n \"next.config.js\",\n \"next.config.cjs\",\n];\n\n/**\n * Check whether an error indicates a CJS module was loaded in an ESM context\n * (i.e. the file uses `require()` which is not available in ESM).\n */\nfunction isCjsError(e: unknown): boolean {\n if (!(e instanceof Error)) return false;\n const msg = e.message;\n return (\n msg.includes(\"require is not a function\") ||\n msg.includes(\"require is not defined\") ||\n msg.includes(\"exports is not defined\") ||\n msg.includes(\"module is not defined\") ||\n msg.includes(\"__dirname is not defined\") ||\n msg.includes(\"__filename is not defined\")\n );\n}\n\n/**\n * Unwrap the config value from a loaded module, calling it if it's a\n * function-form config (Next.js supports `module.exports = (phase, opts) => config`).\n */\nasync function unwrapConfig(mod: any): Promise<NextConfig> {\n const config = mod.default ?? mod;\n if (typeof config === \"function\") {\n const result = await config(\"phase-development-server\", {\n defaultConfig: {},\n });\n return result as NextConfig;\n }\n return config as NextConfig;\n}\n\n/**\n * Find and load the next.config file from the project root.\n * Returns null if no config file is found.\n *\n * Attempts ESM dynamic `import()` first. If the file uses CJS constructs\n * (`require`, `module.exports`) that aren't available in ESM context, falls\n * back to loading it via `createRequire` so that CJS config files (common in\n * the Next.js ecosystem for plugin wrappers like nextra, @next/mdx, etc.) work.\n */\nexport async function loadNextConfig(root: string): Promise<NextConfig | null> {\n for (const filename of CONFIG_FILES) {\n const configPath = path.join(root, filename);\n if (!fs.existsSync(configPath)) continue;\n\n try {\n // Use dynamic import for ESM/TS config files\n const fileUrl = pathToFileURL(configPath).href;\n const mod = await import(fileUrl);\n return await unwrapConfig(mod);\n } catch (e) {\n // If the error indicates a CJS file loaded in ESM context, retry with\n // createRequire which provides a proper CommonJS environment.\n if (isCjsError(e) && (filename.endsWith(\".js\") || filename.endsWith(\".cjs\"))) {\n try {\n const require = createRequire(path.join(root, \"package.json\"));\n const mod = require(configPath);\n return await unwrapConfig({ default: mod });\n } catch (e2) {\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e2 as Error).message}`,\n );\n return null;\n }\n }\n\n console.warn(\n `[vinext] Failed to load ${filename}: ${(e as Error).message}`,\n );\n return null;\n }\n }\n\n return null;\n}\n\n/**\n * Resolve a NextConfig into a fully-resolved ResolvedNextConfig.\n * Awaits async functions for redirects/rewrites/headers.\n */\nexport async function resolveNextConfig(\n config: NextConfig | null,\n): Promise<ResolvedNextConfig> {\n if (!config) {\n return {\n env: {},\n basePath: \"\",\n trailingSlash: false,\n output: \"\",\n cacheComponents: false,\n redirects: [],\n rewrites: { beforeFiles: [], afterFiles: [], fallback: [] },\n headers: [],\n images: undefined,\n i18n: null,\n mdx: null,\n serverActionsAllowedOrigins: [],\n };\n }\n\n // Resolve redirects\n let redirects: NextRedirect[] = [];\n if (config.redirects) {\n const result = await config.redirects();\n redirects = Array.isArray(result) ? result : [];\n }\n\n // Resolve rewrites\n let rewrites = { beforeFiles: [] as NextRewrite[], afterFiles: [] as NextRewrite[], fallback: [] as NextRewrite[] };\n if (config.rewrites) {\n const result = await config.rewrites();\n if (Array.isArray(result)) {\n rewrites.afterFiles = result;\n } else {\n rewrites = {\n beforeFiles: result.beforeFiles ?? [],\n afterFiles: result.afterFiles ?? [],\n fallback: result.fallback ?? [],\n };\n }\n }\n\n // Resolve headers\n let headers: NextHeader[] = [];\n if (config.headers) {\n headers = await config.headers();\n }\n\n // Extract MDX remark/rehype plugins from @next/mdx's webpack wrapper\n const mdx = extractMdxOptions(config);\n\n // Resolve serverActions.allowedOrigins from experimental config\n const experimental = config.experimental as Record<string, unknown> | undefined;\n const serverActionsConfig = experimental?.serverActions as Record<string, unknown> | undefined;\n const serverActionsAllowedOrigins = Array.isArray(serverActionsConfig?.allowedOrigins)\n ? (serverActionsConfig.allowedOrigins as string[])\n : [];\n\n // Warn about unsupported options (skip webpack if we extracted MDX from it)\n const unsupported = mdx ? [] : [\"webpack\"];\n for (const key of unsupported) {\n if (config[key] !== undefined) {\n console.warn(\n `[vinext] next.config option \"${key}\" is not yet supported and will be ignored`,\n );\n }\n }\n\n const output = config.output ?? \"\";\n if (output && output !== \"export\" && output !== \"standalone\") {\n console.warn(`[vinext] Unknown output mode \"${output as string}\", ignoring`);\n }\n\n // Parse i18n config\n let i18n: NextI18nConfig | null = null;\n if (config.i18n) {\n i18n = {\n locales: config.i18n.locales,\n defaultLocale: config.i18n.defaultLocale,\n localeDetection: config.i18n.localeDetection ?? true,\n domains: config.i18n.domains,\n };\n }\n\n return {\n env: config.env ?? {},\n basePath: config.basePath ?? \"\",\n trailingSlash: config.trailingSlash ?? false,\n output: output === \"export\" || output === \"standalone\" ? output : \"\",\n cacheComponents: config.cacheComponents ?? false,\n redirects,\n rewrites,\n headers,\n images: config.images,\n i18n,\n mdx,\n serverActionsAllowedOrigins,\n };\n}\n\n/**\n * Extract MDX compilation options (remark/rehype/recma plugins) from\n * a Next.js config that uses @next/mdx.\n *\n * @next/mdx wraps the config with a webpack function that injects an MDX\n * loader rule. The remark/rehype plugins are captured in that closure.\n * We probe the webpack function with a mock config to extract them.\n */\nexport function extractMdxOptions(config: NextConfig): MdxOptions | null {\n if (typeof config.webpack !== \"function\") return null;\n\n // Build a mock webpack config object that @next/mdx's wrapper will mutate\n const mockModuleRules: any[] = [];\n const mockConfig = {\n resolve: { alias: {} as Record<string, string> },\n module: { rules: mockModuleRules },\n plugins: [] as any[],\n };\n const mockOptions = {\n defaultLoaders: { babel: { loader: \"next-babel-loader\" } },\n isServer: false,\n dev: false,\n dir: \"/mock\",\n };\n\n try {\n const result = (config.webpack as Function)(mockConfig, mockOptions);\n // @next/mdx may return the config or mutate in place\n const finalConfig = result ?? mockConfig;\n const rules: any[] = finalConfig.module?.rules ?? mockModuleRules;\n\n // Search through webpack rules for the MDX loader injected by @next/mdx\n for (const rule of rules) {\n const loaders = extractMdxLoaders(rule);\n if (loaders) return loaders;\n }\n } catch {\n // If the webpack function throws (e.g. expects real webpack internals),\n // silently skip — we'll fall back to bare mdx() with no plugins.\n }\n\n return null;\n}\n\n/**\n * Recursively search a webpack rule (which may have nested `oneOf` arrays)\n * for an MDX loader and extract its remark/rehype/recma plugin options.\n */\nfunction extractMdxLoaders(rule: any): MdxOptions | null {\n if (!rule) return null;\n\n // Check `oneOf` arrays (Next.js uses these extensively)\n if (Array.isArray(rule.oneOf)) {\n for (const child of rule.oneOf) {\n const result = extractMdxLoaders(child);\n if (result) return result;\n }\n }\n\n // Check `use` array (loader chain)\n const use = Array.isArray(rule.use) ? rule.use : rule.use ? [rule.use] : [];\n for (const loader of use) {\n const loaderPath = typeof loader === \"string\" ? loader : loader?.loader;\n if (typeof loaderPath === \"string\" && isMdxLoader(loaderPath)) {\n const opts = typeof loader === \"object\" ? loader.options : {};\n return extractPluginsFromOptions(opts);\n }\n }\n\n // Check direct `loader` field\n if (typeof rule.loader === \"string\" && isMdxLoader(rule.loader)) {\n return extractPluginsFromOptions(rule.options);\n }\n\n return null;\n}\n\nfunction isMdxLoader(loaderPath: string): boolean {\n return (\n loaderPath.includes(\"mdx\") &&\n (loaderPath.includes(\"@next\") ||\n loaderPath.includes(\"@mdx-js\") ||\n loaderPath.includes(\"mdx-js-loader\") ||\n loaderPath.includes(\"next-mdx\"))\n );\n}\n\nfunction extractPluginsFromOptions(opts: any): MdxOptions | null {\n if (!opts || typeof opts !== \"object\") return null;\n\n const remarkPlugins = Array.isArray(opts.remarkPlugins) ? opts.remarkPlugins : undefined;\n const rehypePlugins = Array.isArray(opts.rehypePlugins) ? opts.rehypePlugins : undefined;\n const recmaPlugins = Array.isArray(opts.recmaPlugins) ? opts.recmaPlugins : undefined;\n\n // Only return if at least one plugin array is non-empty\n if (\n (remarkPlugins && remarkPlugins.length > 0) ||\n (rehypePlugins && rehypePlugins.length > 0) ||\n (recmaPlugins && recmaPlugins.length > 0)\n ) {\n return {\n ...(remarkPlugins && remarkPlugins.length > 0 ? { remarkPlugins } : {}),\n ...(rehypePlugins && rehypePlugins.length > 0 ? { rehypePlugins } : {}),\n ...(recmaPlugins && recmaPlugins.length > 0 ? { recmaPlugins } : {}),\n };\n }\n\n return null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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"}
package/dist/deploy.js CHANGED
@@ -83,6 +83,7 @@ export function detectProject(root) {
83
83
  // Sanitize: Workers names must be lowercase alphanumeric + hyphens
84
84
  projectName = pkg.name
85
85
  .replace(/^@[^/]+\//, "") // strip npm scope
86
+ .toLowerCase() // lowercase BEFORE stripping invalid chars
86
87
  .replace(/[^a-z0-9-]/g, "-")
87
88
  .replace(/-+/g, "-")
88
89
  .replace(/^-|-$/g, "");
@@ -307,6 +308,7 @@ export function generateAppRouterWorkerEntry() {
307
308
  * directly in wrangler.jsonc: "main": "vinext/server/app-router-entry"
308
309
  */
309
310
  import { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from "vinext/server/image-optimization";
311
+ import type { ImageConfig } from "vinext/server/image-optimization";
310
312
  import handler from "vinext/server/app-router-entry";
311
313
 
312
314
  interface Env {
@@ -320,6 +322,12 @@ interface Env {
320
322
  };
321
323
  }
322
324
 
325
+ // Image security config. SVG sources with .svg extension auto-skip the
326
+ // optimization endpoint on the client side (served directly, no proxy).
327
+ // To route SVGs through the optimizer (with security headers), set
328
+ // dangerouslyAllowSVG: true in next.config.js and uncomment below:
329
+ // const imageConfig: ImageConfig = { dangerouslyAllowSVG: true };
330
+
323
331
  export default {
324
332
  async fetch(request: Request, env: Env): Promise<Response> {
325
333
  const url = new URL(request.url);
@@ -351,6 +359,7 @@ export function generatePagesRouterWorkerEntry() {
351
359
  * Edit freely or delete to regenerate on next deploy.
352
360
  */
353
361
  import { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from "vinext/server/image-optimization";
362
+ import type { ImageConfig } from "vinext/server/image-optimization";
354
363
  import {
355
364
  matchRedirect,
356
365
  matchRewrite,
@@ -380,6 +389,11 @@ const trailingSlash: boolean = vinextConfig?.trailingSlash ?? false;
380
389
  const configRedirects = vinextConfig?.redirects ?? [];
381
390
  const configRewrites = vinextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] };
382
391
  const configHeaders = vinextConfig?.headers ?? [];
392
+ const imageConfig: ImageConfig | undefined = vinextConfig?.images ? {
393
+ dangerouslyAllowSVG: vinextConfig.images.dangerouslyAllowSVG,
394
+ contentDispositionType: vinextConfig.images.contentDispositionType,
395
+ contentSecurityPolicy: vinextConfig.images.contentSecurityPolicy,
396
+ } : undefined;
383
397
 
384
398
  export default {
385
399
  async fetch(request: Request, env: Env): Promise<Response> {
@@ -412,7 +426,7 @@ export default {
412
426
  const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality });
413
427
  return result.response();
414
428
  },
415
- }, allowedWidths);
429
+ }, allowedWidths, imageConfig);
416
430
  }
417
431
 
418
432
  // ── 2. Trailing slash normalization ────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext deploy — one-command Cloudflare Workers deployment.\n *\n * Takes any Next.js app and deploys it to Cloudflare Workers:\n *\n * 1. Detects App Router vs Pages Router\n * 2. Auto-generates missing config files (wrangler.jsonc, worker/index.ts, vite.config.ts)\n * 3. Ensures dependencies are installed (@cloudflare/vite-plugin, wrangler, @vitejs/plugin-rsc)\n * 4. Runs the Vite build\n * 5. Deploys to Cloudflare Workers via wrangler\n *\n * Design: Everything is auto-generated into a `.vinext/` directory (not the\n * project root) to avoid cluttering the user's project. If the user already\n * has these files, we use theirs.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { execFileSync, type ExecSyncOptions } from \"node:child_process\";\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { createBuilder, build } from \"vite\";\nimport {\n ensureESModule as _ensureESModule,\n renameCJSConfigs as _renameCJSConfigs,\n detectPackageManager as _detectPackageManager,\n} from \"./utils/project.js\";\nimport { getReactUpgradeDeps } from \"./init.js\";\nimport { runTPR } from \"./cloudflare/tpr.js\";\nimport { loadDotenv } from \"./config/dotenv.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface DeployOptions {\n /** Project root directory */\n root: string;\n /** Deploy to preview environment (default: production) */\n preview?: boolean;\n /** Wrangler environment name from wrangler.jsonc env.<name> */\n env?: string;\n /** Custom project name for the Worker */\n name?: string;\n /** Skip the build step (assume already built) */\n skipBuild?: boolean;\n /** Dry run — generate config files but don't build or deploy */\n dryRun?: boolean;\n /** Enable experimental TPR (Traffic-aware Pre-Rendering) */\n experimentalTPR?: boolean;\n /** TPR: traffic coverage percentage target (0–100, default: 90) */\n tprCoverage?: number;\n /** TPR: hard cap on number of pages to pre-render (default: 1000) */\n tprLimit?: number;\n /** TPR: analytics lookback window in hours (default: 24) */\n tprWindow?: number;\n}\n\n// ─── CLI arg parsing (uses Node.js util.parseArgs) ──────────────────────────\n\n/** Deploy command flag definitions for util.parseArgs. */\nconst deployArgOptions = {\n help: { type: \"boolean\", short: \"h\", default: false },\n preview: { type: \"boolean\", default: false },\n env: { type: \"string\" },\n name: { type: \"string\" },\n \"skip-build\": { type: \"boolean\", default: false },\n \"dry-run\": { type: \"boolean\", default: false },\n \"experimental-tpr\": { type: \"boolean\", default: false },\n \"tpr-coverage\": { type: \"string\" },\n \"tpr-limit\": { type: \"string\" },\n \"tpr-window\": { type: \"string\" },\n} as const;\n\nexport function parseDeployArgs(args: string[]) {\n const { values } = nodeParseArgs({ args, options: deployArgOptions, strict: true });\n return {\n help: values.help,\n preview: values.preview,\n env: values.env?.trim() || undefined,\n name: values.name?.trim() || undefined,\n skipBuild: values[\"skip-build\"],\n dryRun: values[\"dry-run\"],\n experimentalTPR: values[\"experimental-tpr\"],\n tprCoverage: values[\"tpr-coverage\"] ? parseInt(values[\"tpr-coverage\"], 10) : undefined,\n tprLimit: values[\"tpr-limit\"] ? parseInt(values[\"tpr-limit\"], 10) : undefined,\n tprWindow: values[\"tpr-window\"] ? parseInt(values[\"tpr-window\"], 10) : undefined,\n };\n}\n\n// ─── Project Detection ──────────────────────────────────────────────────────\n\ninterface ProjectInfo {\n root: string;\n isAppRouter: boolean;\n isPagesRouter: boolean;\n hasViteConfig: boolean;\n hasWranglerConfig: boolean;\n hasWorkerEntry: boolean;\n hasCloudflarePlugin: boolean;\n hasRscPlugin: boolean;\n hasWrangler: boolean;\n projectName: string;\n /** Pages that use `revalidate` (ISR) */\n hasISR: boolean;\n /** package.json has \"type\": \"module\" */\n hasTypeModule: boolean;\n /** .mdx files detected in app/ or pages/ */\n hasMDX: boolean;\n /** CodeHike is a dependency */\n hasCodeHike: boolean;\n /** Native Node modules that need stubbing for Workers */\n nativeModulesToStub: string[];\n}\n\n// ─── Detection ───────────────────────────────────────────────────────────────\n\nexport function detectProject(root: string): ProjectInfo {\n const hasApp =\n fs.existsSync(path.join(root, \"app\")) ||\n fs.existsSync(path.join(root, \"src\", \"app\"));\n const hasPages =\n fs.existsSync(path.join(root, \"pages\")) ||\n fs.existsSync(path.join(root, \"src\", \"pages\"));\n\n // Prefer App Router if both exist\n const isAppRouter = hasApp;\n const isPagesRouter = !hasApp && hasPages;\n\n const hasViteConfig =\n fs.existsSync(path.join(root, \"vite.config.ts\")) ||\n fs.existsSync(path.join(root, \"vite.config.js\")) ||\n fs.existsSync(path.join(root, \"vite.config.mjs\"));\n\n const hasWranglerConfig =\n fs.existsSync(path.join(root, \"wrangler.jsonc\")) ||\n fs.existsSync(path.join(root, \"wrangler.json\")) ||\n fs.existsSync(path.join(root, \"wrangler.toml\"));\n\n const hasWorkerEntry =\n fs.existsSync(path.join(root, \"worker\", \"index.ts\")) ||\n fs.existsSync(path.join(root, \"worker\", \"index.js\"));\n\n // Check node_modules for installed packages\n const hasCloudflarePlugin = fs.existsSync(\n path.join(root, \"node_modules\", \"@cloudflare\", \"vite-plugin\"),\n );\n const hasRscPlugin = fs.existsSync(\n path.join(root, \"node_modules\", \"@vitejs\", \"plugin-rsc\"),\n );\n const hasWrangler = fs.existsSync(\n path.join(root, \"node_modules\", \".bin\", \"wrangler\"),\n );\n\n // Derive project name from package.json or directory name\n let projectName = path.basename(root);\n const pkgPath = path.join(root, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (pkg.name) {\n // Sanitize: Workers names must be lowercase alphanumeric + hyphens\n projectName = pkg.name\n .replace(/^@[^/]+\\//, \"\") // strip npm scope\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // Detect ISR usage (rough heuristic: search for `revalidate` exports)\n const hasISR = detectISR(root, isAppRouter);\n\n // Detect \"type\": \"module\" in package.json\n let hasTypeModule = false;\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n hasTypeModule = pkg.type === \"module\";\n } catch {\n // ignore\n }\n }\n\n // Detect MDX usage\n const hasMDX = detectMDX(root, isAppRouter, hasPages);\n\n // Detect CodeHike dependency\n let hasCodeHike = false;\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n hasCodeHike = \"codehike\" in allDeps;\n } catch {\n // ignore\n }\n }\n\n // Detect native Node modules that need stubbing for Workers\n const nativeModulesToStub = detectNativeModules(root);\n\n return {\n root,\n isAppRouter,\n isPagesRouter,\n hasViteConfig,\n hasWranglerConfig,\n hasWorkerEntry,\n hasCloudflarePlugin,\n hasRscPlugin,\n hasWrangler,\n projectName,\n hasISR,\n hasTypeModule,\n hasMDX,\n hasCodeHike,\n nativeModulesToStub,\n };\n}\n\nfunction detectISR(root: string, isAppRouter: boolean): boolean {\n if (!isAppRouter) return false;\n try {\n // Check root-level app/ first, then fall back to src/app/\n let appDir = path.join(root, \"app\");\n if (!fs.existsSync(appDir)) {\n appDir = path.join(root, \"src\", \"app\");\n }\n if (!fs.existsSync(appDir)) return false;\n // Quick check: search .ts/.tsx files in app/ for `export const revalidate`\n return scanDirForPattern(appDir, /export\\s+const\\s+revalidate\\s*=/);\n } catch {\n return false;\n }\n}\n\nfunction scanDirForPattern(dir: string, pattern: RegExp): boolean {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n if (scanDirForPattern(fullPath, pattern)) return true;\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx)$/.test(entry.name)) {\n try {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n if (pattern.test(content)) return true;\n } catch {\n // skip unreadable files\n }\n }\n }\n return false;\n}\n\n/**\n * Detect .mdx files in the project's app/ or pages/ directory,\n * or `pageExtensions` including \"mdx\" in next.config.\n */\nfunction detectMDX(root: string, isAppRouter: boolean, hasPages: boolean): boolean {\n // Check next.config for pageExtensions with mdx\n const configFiles = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n for (const f of configFiles) {\n const p = path.join(root, f);\n if (fs.existsSync(p)) {\n try {\n const content = fs.readFileSync(p, \"utf-8\");\n if (/pageExtensions.*mdx/i.test(content) || /@next\\/mdx/.test(content)) return true;\n } catch {\n // ignore\n }\n }\n }\n\n // Check for .mdx files in app/ or pages/ (with src/ fallback)\n const dirs: string[] = [];\n if (isAppRouter) {\n const appDir = fs.existsSync(path.join(root, \"app\"))\n ? path.join(root, \"app\")\n : path.join(root, \"src\", \"app\");\n dirs.push(appDir);\n }\n if (hasPages) {\n const pagesDir = fs.existsSync(path.join(root, \"pages\"))\n ? path.join(root, \"pages\")\n : path.join(root, \"src\", \"pages\");\n dirs.push(pagesDir);\n }\n\n for (const dir of dirs) {\n if (fs.existsSync(dir) && scanDirForExtension(dir, \".mdx\")) return true;\n }\n\n return false;\n}\n\nfunction scanDirForExtension(dir: string, ext: string): boolean {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n if (scanDirForExtension(fullPath, ext)) return true;\n } else if (entry.isFile() && entry.name.endsWith(ext)) {\n return true;\n }\n }\n return false;\n}\n\n/** Known native Node modules that can't run in Workers */\nconst NATIVE_MODULES_TO_STUB = [\n \"@resvg/resvg-js\",\n \"satori\",\n \"lightningcss\",\n \"@napi-rs/canvas\",\n \"sharp\",\n];\n\n/**\n * Detect native Node modules in dependencies that need stubbing for Workers.\n */\nfunction detectNativeModules(root: string): string[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n return NATIVE_MODULES_TO_STUB.filter((mod) => mod in allDeps);\n } catch {\n return [];\n }\n}\n\n// ─── Project Preparation (pre-build transforms) ─────────────────────────────\n//\n// These are delegated to shared utilities in ./utils/project.ts so they can\n// be reused by both `vinext deploy` and `vinext init`.\n\n/** @see {@link _ensureESModule} */\nexport const ensureESModule = _ensureESModule;\n\n/** @see {@link _renameCJSConfigs} */\nexport const renameCJSConfigs = _renameCJSConfigs;\n\n// ─── File Generation ─────────────────────────────────────────────────────────\n\n/** Generate wrangler.jsonc content */\nexport function generateWranglerConfig(info: ProjectInfo): string {\n const today = new Date().toISOString().split(\"T\")[0];\n\n const config: Record<string, unknown> = {\n $schema: \"node_modules/wrangler/config-schema.json\",\n name: info.projectName,\n compatibility_date: today,\n compatibility_flags: [\"nodejs_compat\"],\n main: \"./worker/index.ts\",\n assets: {\n not_found_handling: \"none\",\n // Expose static assets to the Worker via env.ASSETS so the image\n // optimization handler can fetch source images programmatically.\n binding: \"ASSETS\",\n },\n // Cloudflare Images binding for next/image optimization.\n // Enables resize, format negotiation (AVIF/WebP), and quality transforms\n // at the edge. No user setup needed — wrangler creates the binding automatically.\n images: {\n binding: \"IMAGES\",\n },\n };\n\n if (info.hasISR) {\n config.kv_namespaces = [\n {\n binding: \"VINEXT_CACHE\",\n id: \"<your-kv-namespace-id>\",\n },\n ];\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\n/** Generate worker/index.ts for App Router */\nexport function generateAppRouterWorkerEntry(): string {\n return `/**\n * Cloudflare Worker entry point — auto-generated by vinext deploy.\n * Edit freely or delete to regenerate on next deploy.\n *\n * For apps without image optimization, you can use vinext/server/app-router-entry\n * directly in wrangler.jsonc: \"main\": \"vinext/server/app-router-entry\"\n */\nimport { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from \"vinext/server/image-optimization\";\nimport handler from \"vinext/server/app-router-entry\";\n\ninterface Env {\n ASSETS: Fetcher;\n IMAGES: {\n input(stream: ReadableStream): {\n transform(options: Record<string, unknown>): {\n output(options: { format: string; quality: number }): Promise<{ response(): Response }>;\n };\n };\n };\n}\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n const url = new URL(request.url);\n\n // Image optimization via Cloudflare Images binding.\n // The parseImageParams validation inside handleImageOptimization\n // normalizes backslashes and validates the origin hasn't changed.\n if (url.pathname === \"/_vinext/image\") {\n const allowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES];\n return handleImageOptimization(request, {\n fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))),\n transformImage: async (body, { width, format, quality }) => {\n const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality });\n return result.response();\n },\n }, allowedWidths);\n }\n\n // Delegate everything else to vinext\n return handler.fetch(request);\n },\n};\n`;\n}\n\n/** Generate worker/index.ts for Pages Router */\nexport function generatePagesRouterWorkerEntry(): string {\n return `/**\n * Cloudflare Worker entry point -- auto-generated by vinext deploy.\n * Edit freely or delete to regenerate on next deploy.\n */\nimport { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from \"vinext/server/image-optimization\";\nimport {\n matchRedirect,\n matchRewrite,\n matchHeaders,\n requestContextFromRequest,\n isExternalUrl,\n proxyExternalRequest,\n} from \"vinext/config/config-matchers\";\n\n// @ts-expect-error -- virtual module resolved by vinext at build time\nimport { renderPage, handleApiRoute, runMiddleware, vinextConfig } from \"virtual:vinext-server-entry\";\n\ninterface Env {\n ASSETS: Fetcher;\n IMAGES: {\n input(stream: ReadableStream): {\n transform(options: Record<string, unknown>): {\n output(options: { format: string; quality: number }): Promise<{ response(): Response }>;\n };\n };\n };\n}\n\n// Extract config values (embedded at build time in the server entry)\nconst basePath: string = vinextConfig?.basePath ?? \"\";\nconst trailingSlash: boolean = vinextConfig?.trailingSlash ?? false;\nconst configRedirects = vinextConfig?.redirects ?? [];\nconst configRewrites = vinextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] };\nconst configHeaders = vinextConfig?.headers ?? [];\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n try {\n const url = new URL(request.url);\n let pathname = url.pathname;\n let urlWithQuery = pathname + url.search;\n\n // Block protocol-relative URL open redirects (//evil.com/ or /\\\\evil.com/).\n // Normalize backslashes: browsers treat /\\\\ as // in URL context.\n const safePath = pathname.replaceAll(\"\\\\\\\\\", \"/\");\n if (safePath.startsWith(\"//\")) {\n return new Response(\"404 Not Found\", { status: 404 });\n }\n\n // ── 1. Strip basePath ─────────────────────────────────────────\n if (basePath && pathname.startsWith(basePath)) {\n const stripped = pathname.slice(basePath.length) || \"/\";\n urlWithQuery = stripped + url.search;\n pathname = stripped;\n }\n\n // ── Image optimization via Cloudflare Images binding ──────────\n // Checked after basePath stripping so /<basePath>/_vinext/image works.\n if (pathname === \"/_vinext/image\") {\n const allowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES];\n return handleImageOptimization(request, {\n fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))),\n transformImage: async (body, { width, format, quality }) => {\n const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality });\n return result.response();\n },\n }, allowedWidths);\n }\n\n // ── 2. Trailing slash normalization ────────────────────────────\n if (pathname !== \"/\" && !pathname.startsWith(\"/api\")) {\n const hasTrailing = pathname.endsWith(\"/\");\n if (trailingSlash && !hasTrailing) {\n return new Response(null, {\n status: 308,\n headers: { Location: basePath + pathname + \"/\" + url.search },\n });\n } else if (!trailingSlash && hasTrailing) {\n return new Response(null, {\n status: 308,\n headers: { Location: basePath + pathname.replace(/\\\\/+$/, \"\") + url.search },\n });\n }\n }\n\n // Build a request with the basePath-stripped URL for middleware and\n // downstream handlers. In Workers the incoming request URL still\n // contains basePath; prod-server constructs its webRequest from\n // the already-stripped URL, so we replicate that here.\n if (basePath) {\n const strippedUrl = new URL(request.url);\n strippedUrl.pathname = pathname;\n request = new Request(strippedUrl, request);\n }\n\n // Build request context for has/missing condition matching.\n // Created before middleware runs, matching prod-server ordering.\n const reqCtx = requestContextFromRequest(request);\n\n // ── 3. Run middleware ──────────────────────────────────────────\n let resolvedUrl = urlWithQuery;\n const middlewareHeaders: Record<string, string> = {};\n let middlewareRewriteStatus: number | undefined;\n if (typeof runMiddleware === \"function\") {\n const result = await runMiddleware(request);\n\n if (!result.continue) {\n if (result.redirectUrl) {\n return new Response(null, {\n status: result.redirectStatus ?? 307,\n headers: { Location: result.redirectUrl },\n });\n }\n if (result.response) {\n return result.response;\n }\n }\n\n // Collect middleware response headers to merge into final response\n if (result.responseHeaders) {\n for (const [key, value] of result.responseHeaders) {\n middlewareHeaders[key] = value;\n }\n }\n\n // Apply middleware rewrite\n if (result.rewriteUrl) {\n resolvedUrl = result.rewriteUrl;\n }\n\n // Apply custom status code from middleware rewrite\n middlewareRewriteStatus = result.rewriteStatus;\n }\n\n // Unpack x-middleware-request-* headers into the actual request so\n // that renderPage / handleApiRoute see middleware-modified headers.\n // Workers incoming request headers are immutable, so clone if needed.\n const mwReqPrefix = \"x-middleware-request-\";\n const mwReqHeaders: Record<string, string> = {};\n for (const key of Object.keys(middlewareHeaders)) {\n if (key.startsWith(mwReqPrefix)) {\n const realName = key.slice(mwReqPrefix.length);\n mwReqHeaders[realName] = middlewareHeaders[key];\n delete middlewareHeaders[key];\n } else if (key.startsWith(\"x-middleware-\")) {\n delete middlewareHeaders[key];\n }\n }\n if (Object.keys(mwReqHeaders).length > 0) {\n const newHeaders = new Headers(request.headers);\n for (const [k, v] of Object.entries(mwReqHeaders)) {\n newHeaders.set(k, v);\n }\n request = new Request(request.url, {\n method: request.method,\n headers: newHeaders,\n body: request.body,\n // @ts-expect-error -- duplex needed for streaming request bodies\n duplex: request.body ? \"half\" : undefined,\n });\n }\n\n let resolvedPathname = resolvedUrl.split(\"?\")[0];\n\n // ── 4. Apply custom headers from next.config.js ───────────────\n if (configHeaders.length) {\n const matched = matchHeaders(resolvedPathname, configHeaders, reqCtx);\n for (const h of matched) {\n middlewareHeaders[h.key.toLowerCase()] = h.value;\n }\n }\n\n // ── 5. Apply redirects from next.config.js ────────────────────\n if (configRedirects.length) {\n const redirect = matchRedirect(resolvedPathname, configRedirects, reqCtx);\n if (redirect) {\n const dest = basePath && !redirect.destination.startsWith(basePath)\n ? basePath + redirect.destination\n : redirect.destination;\n return new Response(null, {\n status: redirect.permanent ? 308 : 307,\n headers: { Location: dest },\n });\n }\n }\n\n // ��─ 6. Apply beforeFiles rewrites from next.config.js ─────────\n if (configRewrites.beforeFiles?.length) {\n const rewritten = matchRewrite(resolvedPathname, configRewrites.beforeFiles, reqCtx);\n if (rewritten) {\n if (isExternalUrl(rewritten)) {\n return proxyExternalRequest(request, rewritten);\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 7. API routes ─────────────────────────────────────────────\n if (resolvedPathname.startsWith(\"/api/\") || resolvedPathname === \"/api\") {\n const response = typeof handleApiRoute === \"function\"\n ? await handleApiRoute(request, resolvedUrl)\n : new Response(\"404 - API route not found\", { status: 404 });\n return mergeHeaders(response, middlewareHeaders, middlewareRewriteStatus);\n }\n\n // ── 8. Apply afterFiles rewrites from next.config.js ──────────\n if (configRewrites.afterFiles?.length) {\n const rewritten = matchRewrite(resolvedPathname, configRewrites.afterFiles, reqCtx);\n if (rewritten) {\n if (isExternalUrl(rewritten)) {\n return proxyExternalRequest(request, rewritten);\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 9. Page routes ────────────────────────────────────────────\n let response: Response | undefined;\n if (typeof renderPage === \"function\") {\n response = await renderPage(request, resolvedUrl, null);\n\n // ── 10. Fallback rewrites (if SSR returned 404) ─────────────\n if (response && response.status === 404 && configRewrites.fallback?.length) {\n const fallbackRewrite = matchRewrite(resolvedPathname, configRewrites.fallback, reqCtx);\n if (fallbackRewrite) {\n if (isExternalUrl(fallbackRewrite)) {\n return proxyExternalRequest(request, fallbackRewrite);\n }\n response = await renderPage(request, fallbackRewrite, null);\n }\n }\n }\n\n if (!response) {\n return new Response(\"404 - Not found\", { status: 404 });\n }\n\n return mergeHeaders(response, middlewareHeaders, middlewareRewriteStatus);\n } catch (error) {\n console.error(\"[vinext] Worker error:\", error);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n },\n};\n\n/**\n * Merge middleware/config headers into a response.\n * Response headers take precedence over middleware headers, matching\n * the behavior in prod-server.ts.\n */\nfunction mergeHeaders(\n response: Response,\n extraHeaders: Record<string, string>,\n statusOverride?: number,\n): Response {\n if (!Object.keys(extraHeaders).length && !statusOverride) return response;\n // Middleware/config headers go in first (lower precedence), then\n // response headers overlay them (higher precedence).\n const merged: Record<string, string> = { ...extraHeaders };\n response.headers.forEach((v, k) => { merged[k] = v; });\n return new Response(response.body, {\n status: statusOverride ?? response.status,\n statusText: response.statusText,\n headers: merged,\n });\n}\n`;\n}\n\n/** Generate vite.config.ts for App Router */\nexport function generateAppRouterViteConfig(info?: ProjectInfo): string {\n const imports: string[] = [\n `import { defineConfig } from \"vite\";`,\n `import vinext from \"vinext\";`,\n `import { cloudflare } from \"@cloudflare/vite-plugin\";`,\n ];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n imports.push(`import path from \"node:path\";`);\n }\n\n const plugins: string[] = [];\n\n if (info?.hasMDX) {\n plugins.push(` // vinext auto-injects @mdx-js/rollup with plugins from next.config`);\n }\n plugins.push(` vinext(),`);\n\n plugins.push(` cloudflare({\n viteEnvironment: {\n name: \"rsc\",\n childEnvironments: [\"ssr\"],\n },\n }),`);\n\n // Build resolve.alias for native module stubs (tsconfig paths are handled\n // automatically by vite-tsconfig-paths inside the vinext plugin)\n let resolveBlock = \"\";\n const aliases: string[] = [];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n for (const mod of info.nativeModulesToStub) {\n aliases.push(` \"${mod}\": path.resolve(__dirname, \"empty-stub.js\"),`);\n }\n }\n\n if (aliases.length > 0) {\n resolveBlock = `\\n resolve: {\\n alias: {\\n${aliases.join(\"\\n\")}\\n },\\n },`;\n }\n\n return `${imports.join(\"\\n\")}\n\nexport default defineConfig({\n plugins: [\n${plugins.join(\"\\n\")}\n ],${resolveBlock}\n});\n`;\n}\n\n/** Generate vite.config.ts for Pages Router */\nexport function generatePagesRouterViteConfig(info?: ProjectInfo): string {\n const imports: string[] = [\n `import { defineConfig } from \"vite\";`,\n `import vinext from \"vinext\";`,\n `import { cloudflare } from \"@cloudflare/vite-plugin\";`,\n ];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n imports.push(`import path from \"node:path\";`);\n }\n\n // Build resolve.alias for native module stubs (tsconfig paths are handled\n // automatically by vite-tsconfig-paths inside the vinext plugin)\n let resolveBlock = \"\";\n const aliases: string[] = [];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n for (const mod of info.nativeModulesToStub) {\n aliases.push(` \"${mod}\": path.resolve(__dirname, \"empty-stub.js\"),`);\n }\n }\n\n if (aliases.length > 0) {\n resolveBlock = `\\n resolve: {\\n alias: {\\n${aliases.join(\"\\n\")}\\n },\\n },`;\n }\n\n return `${imports.join(\"\\n\")}\n\nexport default defineConfig({\n plugins: [\n vinext(),\n cloudflare(),\n ],${resolveBlock}\n});\n`;\n}\n\n// ─── Dependency Management ───────────────────────────────────────────────────\n\ninterface MissingDep {\n name: string;\n version: string;\n}\n\n/**\n * Check if a package is resolvable from a given root directory using\n * Node's module resolution (createRequire). Handles hoisting, pnpm\n * symlinks, monorepos, and Yarn PnP correctly.\n */\nexport function isPackageResolvable(root: string, packageName: string): boolean {\n try {\n const req = createRequire(path.join(root, \"package.json\"));\n req.resolve(packageName);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getMissingDeps(\n info: ProjectInfo,\n /** Override for testing — defaults to `isPackageResolvable` */\n _isResolvable: (root: string, pkg: string) => boolean = isPackageResolvable,\n): MissingDep[] {\n const missing: MissingDep[] = [];\n\n if (!info.hasCloudflarePlugin) {\n missing.push({ name: \"@cloudflare/vite-plugin\", version: \"latest\" });\n }\n if (!info.hasWrangler) {\n missing.push({ name: \"wrangler\", version: \"latest\" });\n }\n if (info.isAppRouter && !info.hasRscPlugin) {\n missing.push({ name: \"@vitejs/plugin-rsc\", version: \"latest\" });\n }\n if (info.isAppRouter) {\n // react-server-dom-webpack must be resolvable from the project root for Vite.\n if (!_isResolvable(info.root, \"react-server-dom-webpack\")) {\n missing.push({ name: \"react-server-dom-webpack\", version: \"latest\" });\n }\n }\n if (info.hasMDX) {\n // Check if @mdx-js/rollup is already installed\n const hasMdxRollup = fs.existsSync(\n path.join(info.root, \"node_modules\", \"@mdx-js\", \"rollup\"),\n );\n if (!hasMdxRollup) {\n missing.push({ name: \"@mdx-js/rollup\", version: \"latest\" });\n }\n }\n\n return missing;\n}\n\nfunction installDeps(root: string, deps: MissingDep[]): void {\n if (deps.length === 0) return;\n\n const depSpecs = deps.map((d) => `${d.name}@${d.version}`);\n const installCmd = detectPackageManager(root);\n const [pm, ...pmArgs] = installCmd.split(\" \");\n\n console.log(` Installing: ${deps.map((d) => d.name).join(\", \")}`);\n execFileSync(pm, [...pmArgs, ...depSpecs], {\n cwd: root,\n stdio: \"inherit\",\n });\n}\n\nconst detectPackageManager = _detectPackageManager;\n\n// ─── File Writing ────────────────────────────────────────────────────────────\n\ninterface GeneratedFile {\n path: string;\n content: string;\n description: string;\n}\n\nexport function getFilesToGenerate(info: ProjectInfo): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n if (!info.hasWranglerConfig) {\n files.push({\n path: path.join(info.root, \"wrangler.jsonc\"),\n content: generateWranglerConfig(info),\n description: \"wrangler.jsonc\",\n });\n }\n\n if (!info.hasWorkerEntry) {\n const workerContent = info.isAppRouter\n ? generateAppRouterWorkerEntry()\n : generatePagesRouterWorkerEntry();\n files.push({\n path: path.join(info.root, \"worker\", \"index.ts\"),\n content: workerContent,\n description: \"worker/index.ts\",\n });\n }\n\n if (!info.hasViteConfig) {\n const viteContent = info.isAppRouter\n ? generateAppRouterViteConfig(info)\n : generatePagesRouterViteConfig(info);\n files.push({\n path: path.join(info.root, \"vite.config.ts\"),\n content: viteContent,\n description: \"vite.config.ts\",\n });\n }\n\n return files;\n}\n\nfunction writeGeneratedFiles(files: GeneratedFile[]): void {\n for (const file of files) {\n const dir = path.dirname(file.path);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(file.path, file.content, \"utf-8\");\n console.log(` Created ${file.description}`);\n }\n}\n\n// ─── Build ───────────────────────────────────────────────────────────────────\n\nasync function runBuild(info: ProjectInfo): Promise<void> {\n console.log(\"\\n Building for Cloudflare Workers...\\n\");\n\n // Use Vite's JS API for the build. The user's vite.config.ts (or our\n // generated one) has the cloudflare() plugin which handles the Worker\n // output format. We just need to trigger the build.\n //\n // For App Router, createBuilder().buildApp() handles multi-environment builds.\n // For Pages Router, a single build() call suffices (cloudflare plugin manages it).\n\n if (info.isAppRouter) {\n const builder = await createBuilder({ root: info.root });\n await builder.buildApp();\n } else {\n await build({ root: info.root });\n }\n}\n\n// ─── Deploy ──────────────────────────────────────────────────────────────────\n\nexport interface WranglerDeployArgs {\n args: string[];\n env: string | undefined;\n}\n\nexport function buildWranglerDeployArgs(options: Pick<DeployOptions, \"preview\" | \"env\">): WranglerDeployArgs {\n const args = [\"deploy\"];\n const env = options.env || (options.preview ? \"preview\" : undefined);\n if (env) {\n args.push(\"--env\", env);\n }\n return { args, env };\n}\n\nfunction runWranglerDeploy(root: string, options: Pick<DeployOptions, \"preview\" | \"env\">): string {\n const wranglerBin = path.join(root, \"node_modules\", \".bin\", \"wrangler\");\n\n const execOpts: ExecSyncOptions = {\n cwd: root,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n };\n\n const { args, env } = buildWranglerDeployArgs(options);\n\n if (env) {\n console.log(`\\n Deploying to env: ${env}...`);\n } else {\n console.log(\"\\n Deploying to production...\");\n }\n\n // Use execFileSync to avoid shell injection — args are passed as an array,\n // never interpolated into a shell command string.\n const output = execFileSync(wranglerBin, args, execOpts) as string;\n\n // Parse the deployed URL from wrangler output\n // Wrangler prints: \"Published <name> (version_id)\\n https://<name>.<subdomain>.workers.dev\"\n const urlMatch = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev[^\\s]*/);\n const deployedUrl = urlMatch ? urlMatch[0] : null;\n\n // Also print raw output for transparency\n if (output.trim()) {\n for (const line of output.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n }\n\n return deployedUrl ?? \"(URL not detected in wrangler output)\";\n}\n\n// ─── Main Entry ──────────────────────────────────────────────────────────────\n\nexport async function deploy(options: DeployOptions): Promise<void> {\n const root = path.resolve(options.root);\n loadDotenv({ root, mode: \"production\" });\n\n console.log(\"\\n vinext deploy\\n\");\n\n // Step 1: Detect project structure\n const info = detectProject(root);\n\n if (!info.isAppRouter && !info.isPagesRouter) {\n console.error(\" Error: No app/ or pages/ directory found.\");\n console.error(\" vinext deploy requires a Next.js project with an app/ or pages/ directory\");\n console.error(\" (also checks src/app/ and src/pages/).\\n\");\n process.exit(1);\n }\n\n if (options.name) {\n info.projectName = options.name;\n }\n\n console.log(` Project: ${info.projectName}`);\n console.log(` Router: ${info.isAppRouter ? \"App Router\" : \"Pages Router\"}`);\n console.log(` ISR: ${info.hasISR ? \"detected\" : \"none\"}`);\n\n // Step 2: Check and install missing dependencies\n // For App Router: upgrade React first if needed for react-server-dom-webpack compatibility\n if (info.isAppRouter) {\n const reactUpgrade = getReactUpgradeDeps(root);\n if (reactUpgrade.length > 0) {\n const installCmd = detectPackageManager(root).replace(/ -D$/, \"\");\n const [pm, ...pmArgs] = installCmd.split(\" \");\n console.log(` Upgrading ${reactUpgrade.map(d => d.replace(/@latest$/, \"\")).join(\", \")}...`);\n execFileSync(pm, [...pmArgs, ...reactUpgrade], { cwd: root, stdio: \"inherit\" });\n }\n }\n const missingDeps = getMissingDeps(info);\n if (missingDeps.length > 0) {\n console.log();\n installDeps(root, missingDeps);\n // Re-detect after install\n info.hasCloudflarePlugin = true;\n info.hasWrangler = true;\n if (info.isAppRouter) info.hasRscPlugin = true;\n }\n\n // Step 3: Ensure ESM + rename CJS configs\n if (!info.hasTypeModule) {\n const renamedConfigs = renameCJSConfigs(root);\n for (const [oldName, newName] of renamedConfigs) {\n console.log(` Renamed ${oldName} → ${newName} (CJS → .cjs)`);\n }\n if (ensureESModule(root)) {\n console.log(` Added \"type\": \"module\" to package.json`);\n info.hasTypeModule = true;\n }\n }\n\n // Step 4: Generate missing config files\n const filesToGenerate = getFilesToGenerate(info);\n if (filesToGenerate.length > 0) {\n console.log();\n writeGeneratedFiles(filesToGenerate);\n }\n\n if (options.dryRun) {\n console.log(\"\\n Dry run complete. Files generated but no build or deploy performed.\\n\");\n return;\n }\n\n // Step 5: Build\n if (!options.skipBuild) {\n await runBuild(info);\n } else {\n console.log(\"\\n Skipping build (--skip-build)\");\n }\n\n // Step 6: TPR — pre-render hot pages into KV cache (experimental, opt-in)\n if (options.experimentalTPR) {\n console.log();\n const tprResult = await runTPR({\n root,\n coverage: Math.max(1, Math.min(100, options.tprCoverage ?? 90)),\n limit: Math.max(1, options.tprLimit ?? 1000),\n window: Math.max(1, options.tprWindow ?? 24),\n });\n\n if (tprResult.skipped) {\n console.log(` TPR: Skipped (${tprResult.skipped})`);\n }\n }\n\n // Step 7: Deploy via wrangler\n const url = runWranglerDeploy(root, {\n preview: options.preview ?? false,\n env: options.env,\n });\n\n console.log(\"\\n ─────────────────────────────────────────\");\n console.log(` Deployed to: ${url}`);\n console.log(\" ─────────────────────────────────────────\\n\");\n}\n"]}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext deploy — one-command Cloudflare Workers deployment.\n *\n * Takes any Next.js app and deploys it to Cloudflare Workers:\n *\n * 1. Detects App Router vs Pages Router\n * 2. Auto-generates missing config files (wrangler.jsonc, worker/index.ts, vite.config.ts)\n * 3. Ensures dependencies are installed (@cloudflare/vite-plugin, wrangler, @vitejs/plugin-rsc)\n * 4. Runs the Vite build\n * 5. Deploys to Cloudflare Workers via wrangler\n *\n * Design: Everything is auto-generated into a `.vinext/` directory (not the\n * project root) to avoid cluttering the user's project. If the user already\n * has these files, we use theirs.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { execFileSync, type ExecSyncOptions } from \"node:child_process\";\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { createBuilder, build } from \"vite\";\nimport {\n ensureESModule as _ensureESModule,\n renameCJSConfigs as _renameCJSConfigs,\n detectPackageManager as _detectPackageManager,\n} from \"./utils/project.js\";\nimport { getReactUpgradeDeps } from \"./init.js\";\nimport { runTPR } from \"./cloudflare/tpr.js\";\nimport { loadDotenv } from \"./config/dotenv.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface DeployOptions {\n /** Project root directory */\n root: string;\n /** Deploy to preview environment (default: production) */\n preview?: boolean;\n /** Wrangler environment name from wrangler.jsonc env.<name> */\n env?: string;\n /** Custom project name for the Worker */\n name?: string;\n /** Skip the build step (assume already built) */\n skipBuild?: boolean;\n /** Dry run — generate config files but don't build or deploy */\n dryRun?: boolean;\n /** Enable experimental TPR (Traffic-aware Pre-Rendering) */\n experimentalTPR?: boolean;\n /** TPR: traffic coverage percentage target (0–100, default: 90) */\n tprCoverage?: number;\n /** TPR: hard cap on number of pages to pre-render (default: 1000) */\n tprLimit?: number;\n /** TPR: analytics lookback window in hours (default: 24) */\n tprWindow?: number;\n}\n\n// ─── CLI arg parsing (uses Node.js util.parseArgs) ──────────────────────────\n\n/** Deploy command flag definitions for util.parseArgs. */\nconst deployArgOptions = {\n help: { type: \"boolean\", short: \"h\", default: false },\n preview: { type: \"boolean\", default: false },\n env: { type: \"string\" },\n name: { type: \"string\" },\n \"skip-build\": { type: \"boolean\", default: false },\n \"dry-run\": { type: \"boolean\", default: false },\n \"experimental-tpr\": { type: \"boolean\", default: false },\n \"tpr-coverage\": { type: \"string\" },\n \"tpr-limit\": { type: \"string\" },\n \"tpr-window\": { type: \"string\" },\n} as const;\n\nexport function parseDeployArgs(args: string[]) {\n const { values } = nodeParseArgs({ args, options: deployArgOptions, strict: true });\n return {\n help: values.help,\n preview: values.preview,\n env: values.env?.trim() || undefined,\n name: values.name?.trim() || undefined,\n skipBuild: values[\"skip-build\"],\n dryRun: values[\"dry-run\"],\n experimentalTPR: values[\"experimental-tpr\"],\n tprCoverage: values[\"tpr-coverage\"] ? parseInt(values[\"tpr-coverage\"], 10) : undefined,\n tprLimit: values[\"tpr-limit\"] ? parseInt(values[\"tpr-limit\"], 10) : undefined,\n tprWindow: values[\"tpr-window\"] ? parseInt(values[\"tpr-window\"], 10) : undefined,\n };\n}\n\n// ─── Project Detection ──────────────────────────────────────────────────────\n\ninterface ProjectInfo {\n root: string;\n isAppRouter: boolean;\n isPagesRouter: boolean;\n hasViteConfig: boolean;\n hasWranglerConfig: boolean;\n hasWorkerEntry: boolean;\n hasCloudflarePlugin: boolean;\n hasRscPlugin: boolean;\n hasWrangler: boolean;\n projectName: string;\n /** Pages that use `revalidate` (ISR) */\n hasISR: boolean;\n /** package.json has \"type\": \"module\" */\n hasTypeModule: boolean;\n /** .mdx files detected in app/ or pages/ */\n hasMDX: boolean;\n /** CodeHike is a dependency */\n hasCodeHike: boolean;\n /** Native Node modules that need stubbing for Workers */\n nativeModulesToStub: string[];\n}\n\n// ─── Detection ───────────────────────────────────────────────────────────────\n\nexport function detectProject(root: string): ProjectInfo {\n const hasApp =\n fs.existsSync(path.join(root, \"app\")) ||\n fs.existsSync(path.join(root, \"src\", \"app\"));\n const hasPages =\n fs.existsSync(path.join(root, \"pages\")) ||\n fs.existsSync(path.join(root, \"src\", \"pages\"));\n\n // Prefer App Router if both exist\n const isAppRouter = hasApp;\n const isPagesRouter = !hasApp && hasPages;\n\n const hasViteConfig =\n fs.existsSync(path.join(root, \"vite.config.ts\")) ||\n fs.existsSync(path.join(root, \"vite.config.js\")) ||\n fs.existsSync(path.join(root, \"vite.config.mjs\"));\n\n const hasWranglerConfig =\n fs.existsSync(path.join(root, \"wrangler.jsonc\")) ||\n fs.existsSync(path.join(root, \"wrangler.json\")) ||\n fs.existsSync(path.join(root, \"wrangler.toml\"));\n\n const hasWorkerEntry =\n fs.existsSync(path.join(root, \"worker\", \"index.ts\")) ||\n fs.existsSync(path.join(root, \"worker\", \"index.js\"));\n\n // Check node_modules for installed packages\n const hasCloudflarePlugin = fs.existsSync(\n path.join(root, \"node_modules\", \"@cloudflare\", \"vite-plugin\"),\n );\n const hasRscPlugin = fs.existsSync(\n path.join(root, \"node_modules\", \"@vitejs\", \"plugin-rsc\"),\n );\n const hasWrangler = fs.existsSync(\n path.join(root, \"node_modules\", \".bin\", \"wrangler\"),\n );\n\n // Derive project name from package.json or directory name\n let projectName = path.basename(root);\n const pkgPath = path.join(root, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (pkg.name) {\n // Sanitize: Workers names must be lowercase alphanumeric + hyphens\n projectName = pkg.name\n .replace(/^@[^/]+\\//, \"\") // strip npm scope\n .toLowerCase() // lowercase BEFORE stripping invalid chars\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // Detect ISR usage (rough heuristic: search for `revalidate` exports)\n const hasISR = detectISR(root, isAppRouter);\n\n // Detect \"type\": \"module\" in package.json\n let hasTypeModule = false;\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n hasTypeModule = pkg.type === \"module\";\n } catch {\n // ignore\n }\n }\n\n // Detect MDX usage\n const hasMDX = detectMDX(root, isAppRouter, hasPages);\n\n // Detect CodeHike dependency\n let hasCodeHike = false;\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n hasCodeHike = \"codehike\" in allDeps;\n } catch {\n // ignore\n }\n }\n\n // Detect native Node modules that need stubbing for Workers\n const nativeModulesToStub = detectNativeModules(root);\n\n return {\n root,\n isAppRouter,\n isPagesRouter,\n hasViteConfig,\n hasWranglerConfig,\n hasWorkerEntry,\n hasCloudflarePlugin,\n hasRscPlugin,\n hasWrangler,\n projectName,\n hasISR,\n hasTypeModule,\n hasMDX,\n hasCodeHike,\n nativeModulesToStub,\n };\n}\n\nfunction detectISR(root: string, isAppRouter: boolean): boolean {\n if (!isAppRouter) return false;\n try {\n // Check root-level app/ first, then fall back to src/app/\n let appDir = path.join(root, \"app\");\n if (!fs.existsSync(appDir)) {\n appDir = path.join(root, \"src\", \"app\");\n }\n if (!fs.existsSync(appDir)) return false;\n // Quick check: search .ts/.tsx files in app/ for `export const revalidate`\n return scanDirForPattern(appDir, /export\\s+const\\s+revalidate\\s*=/);\n } catch {\n return false;\n }\n}\n\nfunction scanDirForPattern(dir: string, pattern: RegExp): boolean {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n if (scanDirForPattern(fullPath, pattern)) return true;\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx)$/.test(entry.name)) {\n try {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n if (pattern.test(content)) return true;\n } catch {\n // skip unreadable files\n }\n }\n }\n return false;\n}\n\n/**\n * Detect .mdx files in the project's app/ or pages/ directory,\n * or `pageExtensions` including \"mdx\" in next.config.\n */\nfunction detectMDX(root: string, isAppRouter: boolean, hasPages: boolean): boolean {\n // Check next.config for pageExtensions with mdx\n const configFiles = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n for (const f of configFiles) {\n const p = path.join(root, f);\n if (fs.existsSync(p)) {\n try {\n const content = fs.readFileSync(p, \"utf-8\");\n if (/pageExtensions.*mdx/i.test(content) || /@next\\/mdx/.test(content)) return true;\n } catch {\n // ignore\n }\n }\n }\n\n // Check for .mdx files in app/ or pages/ (with src/ fallback)\n const dirs: string[] = [];\n if (isAppRouter) {\n const appDir = fs.existsSync(path.join(root, \"app\"))\n ? path.join(root, \"app\")\n : path.join(root, \"src\", \"app\");\n dirs.push(appDir);\n }\n if (hasPages) {\n const pagesDir = fs.existsSync(path.join(root, \"pages\"))\n ? path.join(root, \"pages\")\n : path.join(root, \"src\", \"pages\");\n dirs.push(pagesDir);\n }\n\n for (const dir of dirs) {\n if (fs.existsSync(dir) && scanDirForExtension(dir, \".mdx\")) return true;\n }\n\n return false;\n}\n\nfunction scanDirForExtension(dir: string, ext: string): boolean {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory() && !entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n if (scanDirForExtension(fullPath, ext)) return true;\n } else if (entry.isFile() && entry.name.endsWith(ext)) {\n return true;\n }\n }\n return false;\n}\n\n/** Known native Node modules that can't run in Workers */\nconst NATIVE_MODULES_TO_STUB = [\n \"@resvg/resvg-js\",\n \"satori\",\n \"lightningcss\",\n \"@napi-rs/canvas\",\n \"sharp\",\n];\n\n/**\n * Detect native Node modules in dependencies that need stubbing for Workers.\n */\nfunction detectNativeModules(root: string): string[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n return NATIVE_MODULES_TO_STUB.filter((mod) => mod in allDeps);\n } catch {\n return [];\n }\n}\n\n// ─── Project Preparation (pre-build transforms) ─────────────────────────────\n//\n// These are delegated to shared utilities in ./utils/project.ts so they can\n// be reused by both `vinext deploy` and `vinext init`.\n\n/** @see {@link _ensureESModule} */\nexport const ensureESModule = _ensureESModule;\n\n/** @see {@link _renameCJSConfigs} */\nexport const renameCJSConfigs = _renameCJSConfigs;\n\n// ─── File Generation ─────────────────────────────────────────────────────────\n\n/** Generate wrangler.jsonc content */\nexport function generateWranglerConfig(info: ProjectInfo): string {\n const today = new Date().toISOString().split(\"T\")[0];\n\n const config: Record<string, unknown> = {\n $schema: \"node_modules/wrangler/config-schema.json\",\n name: info.projectName,\n compatibility_date: today,\n compatibility_flags: [\"nodejs_compat\"],\n main: \"./worker/index.ts\",\n assets: {\n not_found_handling: \"none\",\n // Expose static assets to the Worker via env.ASSETS so the image\n // optimization handler can fetch source images programmatically.\n binding: \"ASSETS\",\n },\n // Cloudflare Images binding for next/image optimization.\n // Enables resize, format negotiation (AVIF/WebP), and quality transforms\n // at the edge. No user setup needed — wrangler creates the binding automatically.\n images: {\n binding: \"IMAGES\",\n },\n };\n\n if (info.hasISR) {\n config.kv_namespaces = [\n {\n binding: \"VINEXT_CACHE\",\n id: \"<your-kv-namespace-id>\",\n },\n ];\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\n/** Generate worker/index.ts for App Router */\nexport function generateAppRouterWorkerEntry(): string {\n return `/**\n * Cloudflare Worker entry point — auto-generated by vinext deploy.\n * Edit freely or delete to regenerate on next deploy.\n *\n * For apps without image optimization, you can use vinext/server/app-router-entry\n * directly in wrangler.jsonc: \"main\": \"vinext/server/app-router-entry\"\n */\nimport { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from \"vinext/server/image-optimization\";\nimport type { ImageConfig } from \"vinext/server/image-optimization\";\nimport handler from \"vinext/server/app-router-entry\";\n\ninterface Env {\n ASSETS: Fetcher;\n IMAGES: {\n input(stream: ReadableStream): {\n transform(options: Record<string, unknown>): {\n output(options: { format: string; quality: number }): Promise<{ response(): Response }>;\n };\n };\n };\n}\n\n// Image security config. SVG sources with .svg extension auto-skip the\n// optimization endpoint on the client side (served directly, no proxy).\n// To route SVGs through the optimizer (with security headers), set\n// dangerouslyAllowSVG: true in next.config.js and uncomment below:\n// const imageConfig: ImageConfig = { dangerouslyAllowSVG: true };\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n const url = new URL(request.url);\n\n // Image optimization via Cloudflare Images binding.\n // The parseImageParams validation inside handleImageOptimization\n // normalizes backslashes and validates the origin hasn't changed.\n if (url.pathname === \"/_vinext/image\") {\n const allowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES];\n return handleImageOptimization(request, {\n fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))),\n transformImage: async (body, { width, format, quality }) => {\n const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality });\n return result.response();\n },\n }, allowedWidths);\n }\n\n // Delegate everything else to vinext\n return handler.fetch(request);\n },\n};\n`;\n}\n\n/** Generate worker/index.ts for Pages Router */\nexport function generatePagesRouterWorkerEntry(): string {\n return `/**\n * Cloudflare Worker entry point -- auto-generated by vinext deploy.\n * Edit freely or delete to regenerate on next deploy.\n */\nimport { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from \"vinext/server/image-optimization\";\nimport type { ImageConfig } from \"vinext/server/image-optimization\";\nimport {\n matchRedirect,\n matchRewrite,\n matchHeaders,\n requestContextFromRequest,\n isExternalUrl,\n proxyExternalRequest,\n} from \"vinext/config/config-matchers\";\n\n// @ts-expect-error -- virtual module resolved by vinext at build time\nimport { renderPage, handleApiRoute, runMiddleware, vinextConfig } from \"virtual:vinext-server-entry\";\n\ninterface Env {\n ASSETS: Fetcher;\n IMAGES: {\n input(stream: ReadableStream): {\n transform(options: Record<string, unknown>): {\n output(options: { format: string; quality: number }): Promise<{ response(): Response }>;\n };\n };\n };\n}\n\n// Extract config values (embedded at build time in the server entry)\nconst basePath: string = vinextConfig?.basePath ?? \"\";\nconst trailingSlash: boolean = vinextConfig?.trailingSlash ?? false;\nconst configRedirects = vinextConfig?.redirects ?? [];\nconst configRewrites = vinextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] };\nconst configHeaders = vinextConfig?.headers ?? [];\nconst imageConfig: ImageConfig | undefined = vinextConfig?.images ? {\n dangerouslyAllowSVG: vinextConfig.images.dangerouslyAllowSVG,\n contentDispositionType: vinextConfig.images.contentDispositionType,\n contentSecurityPolicy: vinextConfig.images.contentSecurityPolicy,\n} : undefined;\n\nexport default {\n async fetch(request: Request, env: Env): Promise<Response> {\n try {\n const url = new URL(request.url);\n let pathname = url.pathname;\n let urlWithQuery = pathname + url.search;\n\n // Block protocol-relative URL open redirects (//evil.com/ or /\\\\evil.com/).\n // Normalize backslashes: browsers treat /\\\\ as // in URL context.\n const safePath = pathname.replaceAll(\"\\\\\\\\\", \"/\");\n if (safePath.startsWith(\"//\")) {\n return new Response(\"404 Not Found\", { status: 404 });\n }\n\n // ── 1. Strip basePath ─────────────────────────────────────────\n if (basePath && pathname.startsWith(basePath)) {\n const stripped = pathname.slice(basePath.length) || \"/\";\n urlWithQuery = stripped + url.search;\n pathname = stripped;\n }\n\n // ── Image optimization via Cloudflare Images binding ──────────\n // Checked after basePath stripping so /<basePath>/_vinext/image works.\n if (pathname === \"/_vinext/image\") {\n const allowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES];\n return handleImageOptimization(request, {\n fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))),\n transformImage: async (body, { width, format, quality }) => {\n const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality });\n return result.response();\n },\n }, allowedWidths, imageConfig);\n }\n\n // ── 2. Trailing slash normalization ────────────────────────────\n if (pathname !== \"/\" && !pathname.startsWith(\"/api\")) {\n const hasTrailing = pathname.endsWith(\"/\");\n if (trailingSlash && !hasTrailing) {\n return new Response(null, {\n status: 308,\n headers: { Location: basePath + pathname + \"/\" + url.search },\n });\n } else if (!trailingSlash && hasTrailing) {\n return new Response(null, {\n status: 308,\n headers: { Location: basePath + pathname.replace(/\\\\/+$/, \"\") + url.search },\n });\n }\n }\n\n // Build a request with the basePath-stripped URL for middleware and\n // downstream handlers. In Workers the incoming request URL still\n // contains basePath; prod-server constructs its webRequest from\n // the already-stripped URL, so we replicate that here.\n if (basePath) {\n const strippedUrl = new URL(request.url);\n strippedUrl.pathname = pathname;\n request = new Request(strippedUrl, request);\n }\n\n // Build request context for has/missing condition matching.\n // Created before middleware runs, matching prod-server ordering.\n const reqCtx = requestContextFromRequest(request);\n\n // ── 3. Run middleware ──────────────────────────────────────────\n let resolvedUrl = urlWithQuery;\n const middlewareHeaders: Record<string, string> = {};\n let middlewareRewriteStatus: number | undefined;\n if (typeof runMiddleware === \"function\") {\n const result = await runMiddleware(request);\n\n if (!result.continue) {\n if (result.redirectUrl) {\n return new Response(null, {\n status: result.redirectStatus ?? 307,\n headers: { Location: result.redirectUrl },\n });\n }\n if (result.response) {\n return result.response;\n }\n }\n\n // Collect middleware response headers to merge into final response\n if (result.responseHeaders) {\n for (const [key, value] of result.responseHeaders) {\n middlewareHeaders[key] = value;\n }\n }\n\n // Apply middleware rewrite\n if (result.rewriteUrl) {\n resolvedUrl = result.rewriteUrl;\n }\n\n // Apply custom status code from middleware rewrite\n middlewareRewriteStatus = result.rewriteStatus;\n }\n\n // Unpack x-middleware-request-* headers into the actual request so\n // that renderPage / handleApiRoute see middleware-modified headers.\n // Workers incoming request headers are immutable, so clone if needed.\n const mwReqPrefix = \"x-middleware-request-\";\n const mwReqHeaders: Record<string, string> = {};\n for (const key of Object.keys(middlewareHeaders)) {\n if (key.startsWith(mwReqPrefix)) {\n const realName = key.slice(mwReqPrefix.length);\n mwReqHeaders[realName] = middlewareHeaders[key];\n delete middlewareHeaders[key];\n } else if (key.startsWith(\"x-middleware-\")) {\n delete middlewareHeaders[key];\n }\n }\n if (Object.keys(mwReqHeaders).length > 0) {\n const newHeaders = new Headers(request.headers);\n for (const [k, v] of Object.entries(mwReqHeaders)) {\n newHeaders.set(k, v);\n }\n request = new Request(request.url, {\n method: request.method,\n headers: newHeaders,\n body: request.body,\n // @ts-expect-error -- duplex needed for streaming request bodies\n duplex: request.body ? \"half\" : undefined,\n });\n }\n\n let resolvedPathname = resolvedUrl.split(\"?\")[0];\n\n // ── 4. Apply custom headers from next.config.js ───────────────\n if (configHeaders.length) {\n const matched = matchHeaders(resolvedPathname, configHeaders, reqCtx);\n for (const h of matched) {\n middlewareHeaders[h.key.toLowerCase()] = h.value;\n }\n }\n\n // ── 5. Apply redirects from next.config.js ────────────────────\n if (configRedirects.length) {\n const redirect = matchRedirect(resolvedPathname, configRedirects, reqCtx);\n if (redirect) {\n const dest = basePath && !redirect.destination.startsWith(basePath)\n ? basePath + redirect.destination\n : redirect.destination;\n return new Response(null, {\n status: redirect.permanent ? 308 : 307,\n headers: { Location: dest },\n });\n }\n }\n\n // ��─ 6. Apply beforeFiles rewrites from next.config.js ─────────\n if (configRewrites.beforeFiles?.length) {\n const rewritten = matchRewrite(resolvedPathname, configRewrites.beforeFiles, reqCtx);\n if (rewritten) {\n if (isExternalUrl(rewritten)) {\n return proxyExternalRequest(request, rewritten);\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 7. API routes ─────────────────────────────────────────────\n if (resolvedPathname.startsWith(\"/api/\") || resolvedPathname === \"/api\") {\n const response = typeof handleApiRoute === \"function\"\n ? await handleApiRoute(request, resolvedUrl)\n : new Response(\"404 - API route not found\", { status: 404 });\n return mergeHeaders(response, middlewareHeaders, middlewareRewriteStatus);\n }\n\n // ── 8. Apply afterFiles rewrites from next.config.js ──────────\n if (configRewrites.afterFiles?.length) {\n const rewritten = matchRewrite(resolvedPathname, configRewrites.afterFiles, reqCtx);\n if (rewritten) {\n if (isExternalUrl(rewritten)) {\n return proxyExternalRequest(request, rewritten);\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 9. Page routes ────────────────────────────────────────────\n let response: Response | undefined;\n if (typeof renderPage === \"function\") {\n response = await renderPage(request, resolvedUrl, null);\n\n // ── 10. Fallback rewrites (if SSR returned 404) ─────────────\n if (response && response.status === 404 && configRewrites.fallback?.length) {\n const fallbackRewrite = matchRewrite(resolvedPathname, configRewrites.fallback, reqCtx);\n if (fallbackRewrite) {\n if (isExternalUrl(fallbackRewrite)) {\n return proxyExternalRequest(request, fallbackRewrite);\n }\n response = await renderPage(request, fallbackRewrite, null);\n }\n }\n }\n\n if (!response) {\n return new Response(\"404 - Not found\", { status: 404 });\n }\n\n return mergeHeaders(response, middlewareHeaders, middlewareRewriteStatus);\n } catch (error) {\n console.error(\"[vinext] Worker error:\", error);\n return new Response(\"Internal Server Error\", { status: 500 });\n }\n },\n};\n\n/**\n * Merge middleware/config headers into a response.\n * Response headers take precedence over middleware headers, matching\n * the behavior in prod-server.ts.\n */\nfunction mergeHeaders(\n response: Response,\n extraHeaders: Record<string, string>,\n statusOverride?: number,\n): Response {\n if (!Object.keys(extraHeaders).length && !statusOverride) return response;\n // Middleware/config headers go in first (lower precedence), then\n // response headers overlay them (higher precedence).\n const merged: Record<string, string> = { ...extraHeaders };\n response.headers.forEach((v, k) => { merged[k] = v; });\n return new Response(response.body, {\n status: statusOverride ?? response.status,\n statusText: response.statusText,\n headers: merged,\n });\n}\n`;\n}\n\n/** Generate vite.config.ts for App Router */\nexport function generateAppRouterViteConfig(info?: ProjectInfo): string {\n const imports: string[] = [\n `import { defineConfig } from \"vite\";`,\n `import vinext from \"vinext\";`,\n `import { cloudflare } from \"@cloudflare/vite-plugin\";`,\n ];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n imports.push(`import path from \"node:path\";`);\n }\n\n const plugins: string[] = [];\n\n if (info?.hasMDX) {\n plugins.push(` // vinext auto-injects @mdx-js/rollup with plugins from next.config`);\n }\n plugins.push(` vinext(),`);\n\n plugins.push(` cloudflare({\n viteEnvironment: {\n name: \"rsc\",\n childEnvironments: [\"ssr\"],\n },\n }),`);\n\n // Build resolve.alias for native module stubs (tsconfig paths are handled\n // automatically by vite-tsconfig-paths inside the vinext plugin)\n let resolveBlock = \"\";\n const aliases: string[] = [];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n for (const mod of info.nativeModulesToStub) {\n aliases.push(` \"${mod}\": path.resolve(__dirname, \"empty-stub.js\"),`);\n }\n }\n\n if (aliases.length > 0) {\n resolveBlock = `\\n resolve: {\\n alias: {\\n${aliases.join(\"\\n\")}\\n },\\n },`;\n }\n\n return `${imports.join(\"\\n\")}\n\nexport default defineConfig({\n plugins: [\n${plugins.join(\"\\n\")}\n ],${resolveBlock}\n});\n`;\n}\n\n/** Generate vite.config.ts for Pages Router */\nexport function generatePagesRouterViteConfig(info?: ProjectInfo): string {\n const imports: string[] = [\n `import { defineConfig } from \"vite\";`,\n `import vinext from \"vinext\";`,\n `import { cloudflare } from \"@cloudflare/vite-plugin\";`,\n ];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n imports.push(`import path from \"node:path\";`);\n }\n\n // Build resolve.alias for native module stubs (tsconfig paths are handled\n // automatically by vite-tsconfig-paths inside the vinext plugin)\n let resolveBlock = \"\";\n const aliases: string[] = [];\n\n if (info?.nativeModulesToStub && info.nativeModulesToStub.length > 0) {\n for (const mod of info.nativeModulesToStub) {\n aliases.push(` \"${mod}\": path.resolve(__dirname, \"empty-stub.js\"),`);\n }\n }\n\n if (aliases.length > 0) {\n resolveBlock = `\\n resolve: {\\n alias: {\\n${aliases.join(\"\\n\")}\\n },\\n },`;\n }\n\n return `${imports.join(\"\\n\")}\n\nexport default defineConfig({\n plugins: [\n vinext(),\n cloudflare(),\n ],${resolveBlock}\n});\n`;\n}\n\n// ─── Dependency Management ───────────────────────────────────────────────────\n\ninterface MissingDep {\n name: string;\n version: string;\n}\n\n/**\n * Check if a package is resolvable from a given root directory using\n * Node's module resolution (createRequire). Handles hoisting, pnpm\n * symlinks, monorepos, and Yarn PnP correctly.\n */\nexport function isPackageResolvable(root: string, packageName: string): boolean {\n try {\n const req = createRequire(path.join(root, \"package.json\"));\n req.resolve(packageName);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getMissingDeps(\n info: ProjectInfo,\n /** Override for testing — defaults to `isPackageResolvable` */\n _isResolvable: (root: string, pkg: string) => boolean = isPackageResolvable,\n): MissingDep[] {\n const missing: MissingDep[] = [];\n\n if (!info.hasCloudflarePlugin) {\n missing.push({ name: \"@cloudflare/vite-plugin\", version: \"latest\" });\n }\n if (!info.hasWrangler) {\n missing.push({ name: \"wrangler\", version: \"latest\" });\n }\n if (info.isAppRouter && !info.hasRscPlugin) {\n missing.push({ name: \"@vitejs/plugin-rsc\", version: \"latest\" });\n }\n if (info.isAppRouter) {\n // react-server-dom-webpack must be resolvable from the project root for Vite.\n if (!_isResolvable(info.root, \"react-server-dom-webpack\")) {\n missing.push({ name: \"react-server-dom-webpack\", version: \"latest\" });\n }\n }\n if (info.hasMDX) {\n // Check if @mdx-js/rollup is already installed\n const hasMdxRollup = fs.existsSync(\n path.join(info.root, \"node_modules\", \"@mdx-js\", \"rollup\"),\n );\n if (!hasMdxRollup) {\n missing.push({ name: \"@mdx-js/rollup\", version: \"latest\" });\n }\n }\n\n return missing;\n}\n\nfunction installDeps(root: string, deps: MissingDep[]): void {\n if (deps.length === 0) return;\n\n const depSpecs = deps.map((d) => `${d.name}@${d.version}`);\n const installCmd = detectPackageManager(root);\n const [pm, ...pmArgs] = installCmd.split(\" \");\n\n console.log(` Installing: ${deps.map((d) => d.name).join(\", \")}`);\n execFileSync(pm, [...pmArgs, ...depSpecs], {\n cwd: root,\n stdio: \"inherit\",\n });\n}\n\nconst detectPackageManager = _detectPackageManager;\n\n// ─── File Writing ────────────────────────────────────────────────────────────\n\ninterface GeneratedFile {\n path: string;\n content: string;\n description: string;\n}\n\nexport function getFilesToGenerate(info: ProjectInfo): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n\n if (!info.hasWranglerConfig) {\n files.push({\n path: path.join(info.root, \"wrangler.jsonc\"),\n content: generateWranglerConfig(info),\n description: \"wrangler.jsonc\",\n });\n }\n\n if (!info.hasWorkerEntry) {\n const workerContent = info.isAppRouter\n ? generateAppRouterWorkerEntry()\n : generatePagesRouterWorkerEntry();\n files.push({\n path: path.join(info.root, \"worker\", \"index.ts\"),\n content: workerContent,\n description: \"worker/index.ts\",\n });\n }\n\n if (!info.hasViteConfig) {\n const viteContent = info.isAppRouter\n ? generateAppRouterViteConfig(info)\n : generatePagesRouterViteConfig(info);\n files.push({\n path: path.join(info.root, \"vite.config.ts\"),\n content: viteContent,\n description: \"vite.config.ts\",\n });\n }\n\n return files;\n}\n\nfunction writeGeneratedFiles(files: GeneratedFile[]): void {\n for (const file of files) {\n const dir = path.dirname(file.path);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(file.path, file.content, \"utf-8\");\n console.log(` Created ${file.description}`);\n }\n}\n\n// ─── Build ───────────────────────────────────────────────────────────────────\n\nasync function runBuild(info: ProjectInfo): Promise<void> {\n console.log(\"\\n Building for Cloudflare Workers...\\n\");\n\n // Use Vite's JS API for the build. The user's vite.config.ts (or our\n // generated one) has the cloudflare() plugin which handles the Worker\n // output format. We just need to trigger the build.\n //\n // For App Router, createBuilder().buildApp() handles multi-environment builds.\n // For Pages Router, a single build() call suffices (cloudflare plugin manages it).\n\n if (info.isAppRouter) {\n const builder = await createBuilder({ root: info.root });\n await builder.buildApp();\n } else {\n await build({ root: info.root });\n }\n}\n\n// ─── Deploy ──────────────────────────────────────────────────────────────────\n\nexport interface WranglerDeployArgs {\n args: string[];\n env: string | undefined;\n}\n\nexport function buildWranglerDeployArgs(options: Pick<DeployOptions, \"preview\" | \"env\">): WranglerDeployArgs {\n const args = [\"deploy\"];\n const env = options.env || (options.preview ? \"preview\" : undefined);\n if (env) {\n args.push(\"--env\", env);\n }\n return { args, env };\n}\n\nfunction runWranglerDeploy(root: string, options: Pick<DeployOptions, \"preview\" | \"env\">): string {\n const wranglerBin = path.join(root, \"node_modules\", \".bin\", \"wrangler\");\n\n const execOpts: ExecSyncOptions = {\n cwd: root,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n };\n\n const { args, env } = buildWranglerDeployArgs(options);\n\n if (env) {\n console.log(`\\n Deploying to env: ${env}...`);\n } else {\n console.log(\"\\n Deploying to production...\");\n }\n\n // Use execFileSync to avoid shell injection — args are passed as an array,\n // never interpolated into a shell command string.\n const output = execFileSync(wranglerBin, args, execOpts) as string;\n\n // Parse the deployed URL from wrangler output\n // Wrangler prints: \"Published <name> (version_id)\\n https://<name>.<subdomain>.workers.dev\"\n const urlMatch = output.match(/https:\\/\\/[^\\s]+\\.workers\\.dev[^\\s]*/);\n const deployedUrl = urlMatch ? urlMatch[0] : null;\n\n // Also print raw output for transparency\n if (output.trim()) {\n for (const line of output.trim().split(\"\\n\")) {\n console.log(` ${line}`);\n }\n }\n\n return deployedUrl ?? \"(URL not detected in wrangler output)\";\n}\n\n// ─── Main Entry ──────────────────────────────────────────────────────────────\n\nexport async function deploy(options: DeployOptions): Promise<void> {\n const root = path.resolve(options.root);\n loadDotenv({ root, mode: \"production\" });\n\n console.log(\"\\n vinext deploy\\n\");\n\n // Step 1: Detect project structure\n const info = detectProject(root);\n\n if (!info.isAppRouter && !info.isPagesRouter) {\n console.error(\" Error: No app/ or pages/ directory found.\");\n console.error(\" vinext deploy requires a Next.js project with an app/ or pages/ directory\");\n console.error(\" (also checks src/app/ and src/pages/).\\n\");\n process.exit(1);\n }\n\n if (options.name) {\n info.projectName = options.name;\n }\n\n console.log(` Project: ${info.projectName}`);\n console.log(` Router: ${info.isAppRouter ? \"App Router\" : \"Pages Router\"}`);\n console.log(` ISR: ${info.hasISR ? \"detected\" : \"none\"}`);\n\n // Step 2: Check and install missing dependencies\n // For App Router: upgrade React first if needed for react-server-dom-webpack compatibility\n if (info.isAppRouter) {\n const reactUpgrade = getReactUpgradeDeps(root);\n if (reactUpgrade.length > 0) {\n const installCmd = detectPackageManager(root).replace(/ -D$/, \"\");\n const [pm, ...pmArgs] = installCmd.split(\" \");\n console.log(` Upgrading ${reactUpgrade.map(d => d.replace(/@latest$/, \"\")).join(\", \")}...`);\n execFileSync(pm, [...pmArgs, ...reactUpgrade], { cwd: root, stdio: \"inherit\" });\n }\n }\n const missingDeps = getMissingDeps(info);\n if (missingDeps.length > 0) {\n console.log();\n installDeps(root, missingDeps);\n // Re-detect after install\n info.hasCloudflarePlugin = true;\n info.hasWrangler = true;\n if (info.isAppRouter) info.hasRscPlugin = true;\n }\n\n // Step 3: Ensure ESM + rename CJS configs\n if (!info.hasTypeModule) {\n const renamedConfigs = renameCJSConfigs(root);\n for (const [oldName, newName] of renamedConfigs) {\n console.log(` Renamed ${oldName} → ${newName} (CJS → .cjs)`);\n }\n if (ensureESModule(root)) {\n console.log(` Added \"type\": \"module\" to package.json`);\n info.hasTypeModule = true;\n }\n }\n\n // Step 4: Generate missing config files\n const filesToGenerate = getFilesToGenerate(info);\n if (filesToGenerate.length > 0) {\n console.log();\n writeGeneratedFiles(filesToGenerate);\n }\n\n if (options.dryRun) {\n console.log(\"\\n Dry run complete. Files generated but no build or deploy performed.\\n\");\n return;\n }\n\n // Step 5: Build\n if (!options.skipBuild) {\n await runBuild(info);\n } else {\n console.log(\"\\n Skipping build (--skip-build)\");\n }\n\n // Step 6: TPR — pre-render hot pages into KV cache (experimental, opt-in)\n if (options.experimentalTPR) {\n console.log();\n const tprResult = await runTPR({\n root,\n coverage: Math.max(1, Math.min(100, options.tprCoverage ?? 90)),\n limit: Math.max(1, options.tprLimit ?? 1000),\n window: Math.max(1, options.tprWindow ?? 24),\n });\n\n if (tprResult.skipped) {\n console.log(` TPR: Skipped (${tprResult.skipped})`);\n }\n }\n\n // Step 7: Deploy via wrangler\n const url = runWranglerDeploy(root, {\n preview: options.preview ?? false,\n env: options.env,\n });\n\n console.log(\"\\n ─────────────────────────────────────────\");\n console.log(` Deployed to: ${url}`);\n console.log(\" ─────────────────────────────────────────\\n\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAA6B,MAAM,MAAM,CAAC;AAmH9D;;;;;;;;GAQG;AACH,iBAAS,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAkBnF;AAuGD;;;;;;;;;;;GAWG;AACH,iBAAe,2BAA2B,CACxC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,EAAE,CAAA;CAAE,GAAG,SAAS,CAAC,CAqEzC;AA0CD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iBAAS,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA8B1D;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,kBAAkB;;;CAGvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,QAAA,MAAM,qBAAqB;;;CAG1B,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,iBAAS,iBAAiB,CACxB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC,GACD,MAAM,EAAE,CAwDV;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,EAAE,CAsqFpE;AAoCD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAuG/B;AA8KD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGhH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,CAAC;AAC5F,OAAO,EAAE,2BAA2B,IAAI,4BAA4B,EAAE,CAAC;AACvE,OAAO,EAAE,wBAAwB,IAAI,yBAAyB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAA6B,MAAM,MAAM,CAAC;AAoH9D;;;;;;;;GAQG;AACH,iBAAS,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAkBnF;AAuGD;;;;;;;;;;;GAWG;AACH,iBAAe,2BAA2B,CACxC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,EAAE,CAAA;CAAE,GAAG,SAAS,CAAC,CAqEzC;AA0CD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iBAAS,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA8B1D;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,kBAAkB;;;CAGvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,QAAA,MAAM,qBAAqB;;;CAG1B,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,iBAAS,iBAAiB,CACxB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC,GACD,MAAM,EAAE,CAwDV;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,EAAE,CAoyFpE;AAoCD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAuG/B;AA8KD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGhH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,CAAC;AAC5F,OAAO,EAAE,2BAA2B,IAAI,4BAA4B,EAAE,CAAC;AACvE,OAAO,EAAE,wBAAwB,IAAI,yBAAyB,EAAE,CAAC"}