vinext 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/init.d.ts CHANGED
@@ -51,5 +51,20 @@ export declare function generateViteConfig(_isAppRouter: boolean): string;
51
51
  export declare function addScripts(root: string, port: number): string[];
52
52
  export declare function getInitDeps(isAppRouter: boolean): string[];
53
53
  export declare function isDepInstalled(root: string, dep: string): boolean;
54
+ /**
55
+ * Check if react/react-dom need upgrading for react-server-dom-webpack compatibility.
56
+ *
57
+ * react-server-dom-webpack versions are pinned to match their React version
58
+ * (e.g. rsdw@19.2.4 requires react@^19.2.4). When a project has an older
59
+ * React (e.g. create-next-app ships react@19.2.3), we need to upgrade
60
+ * react/react-dom BEFORE installing rsdw to avoid peer-dep conflicts.
61
+ *
62
+ * Uses createRequire to resolve react's package.json through Node's module
63
+ * resolution, which works correctly across all package managers (npm, pnpm,
64
+ * yarn, Yarn PnP) and monorepo layouts with hoisting/symlinking.
65
+ *
66
+ * Returns ["react@latest", "react-dom@latest"] if upgrade is needed, [] otherwise.
67
+ */
68
+ export declare function getReactUpgradeDeps(root: string): string[];
54
69
  export declare function init(options: InitOptions): Promise<InitResult>;
55
70
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAiBH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,yCAAyC;IACzC,eAAe,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,cAAc,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxC,iDAAiD;IACjD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2CAA2C;IAC3C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qEAAqE;IACrE,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAID,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAQhE;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgC/D;AAID,wBAAgB,WAAW,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,EAAE,CAM1D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAcjE;AAoBD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAoGpE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAkBH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACrE;AAED,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,yCAAyC;IACzC,eAAe,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,cAAc,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxC,iDAAiD;IACjD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2CAA2C;IAC3C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,qEAAqE;IACrE,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAID,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,CAQhE;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgC/D;AAID,wBAAgB,WAAW,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,EAAE,CAO1D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAcjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB1D;AA4CD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAgHpE"}
package/dist/init.js CHANGED
@@ -16,6 +16,7 @@
16
16
  */
17
17
  import fs from "node:fs";
18
18
  import path from "node:path";
19
+ import { createRequire } from "node:module";
19
20
  import { execSync } from "node:child_process";
20
21
  import { runCheck, formatReport } from "./check.js";
21
22
  import { ensureESModule, renameCJSConfigs, detectPackageManager, detectPackageManagerName, hasViteConfig, hasAppDir, } from "./utils/project.js";
@@ -67,6 +68,7 @@ export function getInitDeps(isAppRouter) {
67
68
  const deps = ["vinext", "vite"];
68
69
  if (isAppRouter) {
69
70
  deps.push("@vitejs/plugin-rsc");
71
+ deps.push("react-server-dom-webpack");
70
72
  }
71
73
  return deps;
72
74
  }
@@ -87,10 +89,71 @@ export function isDepInstalled(root, dep) {
87
89
  return false;
88
90
  }
89
91
  }
90
- function installDeps(root, deps, exec) {
92
+ /**
93
+ * Check if react/react-dom need upgrading for react-server-dom-webpack compatibility.
94
+ *
95
+ * react-server-dom-webpack versions are pinned to match their React version
96
+ * (e.g. rsdw@19.2.4 requires react@^19.2.4). When a project has an older
97
+ * React (e.g. create-next-app ships react@19.2.3), we need to upgrade
98
+ * react/react-dom BEFORE installing rsdw to avoid peer-dep conflicts.
99
+ *
100
+ * Uses createRequire to resolve react's package.json through Node's module
101
+ * resolution, which works correctly across all package managers (npm, pnpm,
102
+ * yarn, Yarn PnP) and monorepo layouts with hoisting/symlinking.
103
+ *
104
+ * Returns ["react@latest", "react-dom@latest"] if upgrade is needed, [] otherwise.
105
+ */
106
+ export function getReactUpgradeDeps(root) {
107
+ try {
108
+ const req = createRequire(path.join(root, "package.json"));
109
+ // Resolve react's entry, then walk up to its package.json.
110
+ // We can't use require.resolve("react/package.json") because not all
111
+ // packages export ./package.json in their exports map.
112
+ const resolved = req.resolve("react");
113
+ const version = findPackageVersion(resolved, "react");
114
+ if (!version)
115
+ return [];
116
+ // react-server-dom-webpack@latest currently requires react@^19.2.4
117
+ const parts = version.split(".");
118
+ const major = parseInt(parts[0], 10);
119
+ const minor = parseInt(parts[1], 10);
120
+ const patch = parseInt(parts[2], 10);
121
+ if (major < 19 || (major === 19 && minor < 2) || (major === 19 && minor === 2 && patch < 4)) {
122
+ return ["react@latest", "react-dom@latest"];
123
+ }
124
+ return [];
125
+ }
126
+ catch {
127
+ return [];
128
+ }
129
+ }
130
+ /**
131
+ * Walk up from a resolved module entry to find its package.json and return
132
+ * the version field. Uses the same approach as PR #18's findReactServerPackages.
133
+ */
134
+ function findPackageVersion(resolvedEntry, packageName) {
135
+ let dir = path.dirname(resolvedEntry);
136
+ while (dir !== path.dirname(dir)) {
137
+ const candidate = path.join(dir, "package.json");
138
+ try {
139
+ const pkg = JSON.parse(fs.readFileSync(candidate, "utf-8"));
140
+ if (pkg.name === packageName) {
141
+ return pkg.version ?? null;
142
+ }
143
+ }
144
+ catch {
145
+ // no package.json at this level, keep walking up
146
+ }
147
+ dir = path.dirname(dir);
148
+ }
149
+ return null;
150
+ }
151
+ function installDeps(root, deps, exec, { dev = true } = {}) {
91
152
  if (deps.length === 0)
92
153
  return;
93
- const installCmd = detectPackageManager(root);
154
+ const baseCmd = detectPackageManager(root);
155
+ // Strip " -D" for non-dev installs (keeps deps in "dependencies", not "devDependencies")
156
+ const installCmd = dev ? baseCmd : baseCmd.replace(/ -D$/, "");
94
157
  const depsStr = deps.join(" ");
95
158
  exec(`${installCmd} ${depsStr}`, {
96
159
  cwd: root,
@@ -126,6 +189,17 @@ export async function init(options) {
126
189
  // ── Step 2: Install dependencies ───────────────────────────────────────
127
190
  const neededDeps = getInitDeps(isApp);
128
191
  const missingDeps = neededDeps.filter((dep) => !isDepInstalled(root, dep));
192
+ // For App Router: react-server-dom-webpack requires react/react-dom versions
193
+ // to match exactly (e.g. rsdw@19.2.4 needs react@^19.2.4). If the installed
194
+ // React is too old (common with create-next-app), upgrade it first as a
195
+ // regular dependency to avoid ERESOLVE peer-dep conflicts.
196
+ if (isApp && missingDeps.includes("react-server-dom-webpack")) {
197
+ const reactUpgrade = getReactUpgradeDeps(root);
198
+ if (reactUpgrade.length > 0) {
199
+ console.log(` Upgrading ${reactUpgrade.map(d => d.replace(/@latest$/, "")).join(", ")}...`);
200
+ installDeps(root, reactUpgrade, exec, { dev: false });
201
+ }
202
+ }
129
203
  if (missingDeps.length > 0) {
130
204
  console.log(` Installing ${missingDeps.join(", ")}...`);
131
205
  installDeps(root, missingDeps, exec);
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext init — one-command project migration for Next.js apps.\n *\n * Automates the steps needed to run a Next.js app under vinext:\n *\n * 1. Run `vinext check` to show compatibility report\n * 2. Install dependencies (vite, @vitejs/plugin-rsc for App Router)\n * 3. Add \"type\": \"module\" to package.json\n * 4. Rename CJS config files to .cjs\n * 5. Add vinext scripts to package.json\n * 6. Generate vite.config.ts\n * 7. Print summary\n *\n * Non-destructive: does NOT modify next.config, tsconfig, or source files.\n * The project should work with both Next.js and vinext simultaneously.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { runCheck, formatReport } from \"./check.js\";\nimport {\n ensureESModule,\n renameCJSConfigs,\n detectPackageManager,\n detectPackageManagerName,\n hasViteConfig,\n hasAppDir,\n} from \"./utils/project.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface InitOptions {\n /** Project root directory */\n root: string;\n /** Dev server port (default: 3001) */\n port?: number;\n /** Skip the compatibility check step */\n skipCheck?: boolean;\n /** Force overwrite even if vite.config.ts exists */\n force?: boolean;\n /** @internal — override exec for testing (avoids ESM spy issues) */\n _exec?: (cmd: string, opts: { cwd: string; stdio: string }) => void;\n}\n\nexport interface InitResult {\n /** Whether dependencies were installed */\n installedDeps: string[];\n /** Whether \"type\": \"module\" was added */\n addedTypeModule: boolean;\n /** CJS config files that were renamed ([old, new] pairs) */\n renamedConfigs: Array<[string, string]>;\n /** Whether scripts were added to package.json */\n addedScripts: string[];\n /** Whether vite.config.ts was generated */\n generatedViteConfig: boolean;\n /** Whether vite.config.ts generation was skipped (already exists) */\n skippedViteConfig: boolean;\n}\n\n// ─── Vite Config Generation (minimal, non-Cloudflare) ────────────────────────\n\nexport function generateViteConfig(_isAppRouter: boolean): string {\n return `import vinext from \"vinext\";\nimport { defineConfig } from \"vite\";\n\nexport default defineConfig({\n plugins: [vinext()],\n});\n`;\n}\n\n// ─── Script Addition ─────────────────────────────────────────────────────────\n\n/**\n * Add vinext scripts to package.json without overwriting existing scripts.\n * Returns the list of script names that were added.\n */\nexport function addScripts(root: string, port: number): string[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n try {\n const raw = fs.readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw);\n\n if (!pkg.scripts) {\n pkg.scripts = {};\n }\n\n const added: string[] = [];\n\n if (!pkg.scripts[\"dev:vinext\"]) {\n pkg.scripts[\"dev:vinext\"] = `vite dev --port ${port}`;\n added.push(\"dev:vinext\");\n }\n\n if (!pkg.scripts[\"build:vinext\"]) {\n pkg.scripts[\"build:vinext\"] = \"vite build\";\n added.push(\"build:vinext\");\n }\n\n if (added.length > 0) {\n fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\", \"utf-8\");\n }\n\n return added;\n } catch {\n return [];\n }\n}\n\n// ─── Dependency Installation ─────────────────────────────────────────────────\n\nexport function getInitDeps(isAppRouter: boolean): string[] {\n const deps = [\"vinext\", \"vite\"];\n if (isAppRouter) {\n deps.push(\"@vitejs/plugin-rsc\");\n }\n return deps;\n}\n\nexport function isDepInstalled(root: string, dep: string): boolean {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return false;\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n ...pkg.peerDependencies,\n };\n return dep in allDeps;\n } catch {\n return false;\n }\n}\n\nfunction installDeps(\n root: string,\n deps: string[],\n exec: (cmd: string, opts: { cwd: string; stdio: string }) => void,\n): void {\n if (deps.length === 0) return;\n\n const installCmd = detectPackageManager(root);\n const depsStr = deps.join(\" \");\n\n exec(`${installCmd} ${depsStr}`, {\n cwd: root,\n stdio: \"inherit\",\n });\n}\n\n// ─── Main Entry ──────────────────────────────────────────────────────────────\n\nexport async function init(options: InitOptions): Promise<InitResult> {\n const root = path.resolve(options.root);\n const port = options.port ?? 3001;\n const exec = options._exec ?? ((cmd: string, opts: { cwd: string; stdio: string }) => {\n execSync(cmd, opts as Parameters<typeof execSync>[1]);\n });\n\n // ── Pre-flight checks ──────────────────────────────────────────────────\n\n // Ensure package.json exists\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) {\n console.error(\" Error: No package.json found in the current directory.\");\n console.error(\" Run this command from the root of a Next.js project.\\n\");\n process.exit(1);\n }\n\n // Check if vite.config already exists — skip generation later, but continue\n const viteConfigExists = hasViteConfig(root);\n\n const isApp = hasAppDir(root);\n const pmName = detectPackageManagerName(root);\n\n // ── Step 1: Compatibility check ────────────────────────────────────────\n\n if (!options.skipCheck) {\n console.log(\" Running compatibility check...\\n\");\n const checkResult = runCheck(root);\n console.log(formatReport(checkResult, { calledFromInit: true }));\n console.log(); // blank line before migration steps\n }\n\n // ── Step 2: Install dependencies ───────────────────────────────────────\n\n const neededDeps = getInitDeps(isApp);\n const missingDeps = neededDeps.filter((dep) => !isDepInstalled(root, dep));\n\n if (missingDeps.length > 0) {\n console.log(` Installing ${missingDeps.join(\", \")}...`);\n installDeps(root, missingDeps, exec);\n console.log();\n }\n\n // ── Step 3: Add \"type\": \"module\" ───────────────────────────────────────\n\n // Rename CJS configs first (before adding \"type\": \"module\") to avoid breakage\n const renamedConfigs = renameCJSConfigs(root);\n const addedTypeModule = ensureESModule(root);\n\n // ── Step 4: Add scripts ────────────────────────────────────────────────\n\n const addedScripts = addScripts(root, port);\n\n // ── Step 5: Generate vite.config.ts ────────────────────────────────────\n\n let generatedViteConfig = false;\n const skippedViteConfig = viteConfigExists && !options.force;\n if (!skippedViteConfig) {\n const configContent = generateViteConfig(isApp);\n fs.writeFileSync(path.join(root, \"vite.config.ts\"), configContent, \"utf-8\");\n generatedViteConfig = true;\n }\n\n // ── Step 6: Print summary ──────────────────────────────────────────────\n\n console.log(\" vinext init complete!\\n\");\n\n if (missingDeps.length > 0) {\n console.log(` \\u2713 Added ${missingDeps.join(\", \")} to devDependencies`);\n }\n if (addedTypeModule) {\n console.log(` \\u2713 Added \"type\": \"module\" to package.json`);\n }\n for (const [oldName, newName] of renamedConfigs) {\n console.log(` \\u2713 Renamed ${oldName} \\u2192 ${newName}`);\n }\n for (const script of addedScripts) {\n console.log(` \\u2713 Added ${script} script`);\n }\n if (generatedViteConfig) {\n console.log(` \\u2713 Generated vite.config.ts`);\n }\n if (skippedViteConfig) {\n console.log(` - Skipped vite.config.ts (already exists, use --force to overwrite)`);\n }\n\n console.log(`\n Next steps:\n ${pmName} run dev:vinext Start the vinext dev server\n ${pmName} run dev Start Next.js (still works as before)\n`);\n\n return {\n installedDeps: missingDeps,\n addedTypeModule,\n renamedConfigs,\n addedScripts,\n generatedViteConfig,\n skippedViteConfig,\n };\n}\n"]}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * vinext init — one-command project migration for Next.js apps.\n *\n * Automates the steps needed to run a Next.js app under vinext:\n *\n * 1. Run `vinext check` to show compatibility report\n * 2. Install dependencies (vite, @vitejs/plugin-rsc for App Router)\n * 3. Add \"type\": \"module\" to package.json\n * 4. Rename CJS config files to .cjs\n * 5. Add vinext scripts to package.json\n * 6. Generate vite.config.ts\n * 7. Print summary\n *\n * Non-destructive: does NOT modify next.config, tsconfig, or source files.\n * The project should work with both Next.js and vinext simultaneously.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { execSync } from \"node:child_process\";\nimport { runCheck, formatReport } from \"./check.js\";\nimport {\n ensureESModule,\n renameCJSConfigs,\n detectPackageManager,\n detectPackageManagerName,\n hasViteConfig,\n hasAppDir,\n} from \"./utils/project.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface InitOptions {\n /** Project root directory */\n root: string;\n /** Dev server port (default: 3001) */\n port?: number;\n /** Skip the compatibility check step */\n skipCheck?: boolean;\n /** Force overwrite even if vite.config.ts exists */\n force?: boolean;\n /** @internal — override exec for testing (avoids ESM spy issues) */\n _exec?: (cmd: string, opts: { cwd: string; stdio: string }) => void;\n}\n\nexport interface InitResult {\n /** Whether dependencies were installed */\n installedDeps: string[];\n /** Whether \"type\": \"module\" was added */\n addedTypeModule: boolean;\n /** CJS config files that were renamed ([old, new] pairs) */\n renamedConfigs: Array<[string, string]>;\n /** Whether scripts were added to package.json */\n addedScripts: string[];\n /** Whether vite.config.ts was generated */\n generatedViteConfig: boolean;\n /** Whether vite.config.ts generation was skipped (already exists) */\n skippedViteConfig: boolean;\n}\n\n// ─── Vite Config Generation (minimal, non-Cloudflare) ────────────────────────\n\nexport function generateViteConfig(_isAppRouter: boolean): string {\n return `import vinext from \"vinext\";\nimport { defineConfig } from \"vite\";\n\nexport default defineConfig({\n plugins: [vinext()],\n});\n`;\n}\n\n// ─── Script Addition ─────────────────────────────────────────────────────────\n\n/**\n * Add vinext scripts to package.json without overwriting existing scripts.\n * Returns the list of script names that were added.\n */\nexport function addScripts(root: string, port: number): string[] {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return [];\n\n try {\n const raw = fs.readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw);\n\n if (!pkg.scripts) {\n pkg.scripts = {};\n }\n\n const added: string[] = [];\n\n if (!pkg.scripts[\"dev:vinext\"]) {\n pkg.scripts[\"dev:vinext\"] = `vite dev --port ${port}`;\n added.push(\"dev:vinext\");\n }\n\n if (!pkg.scripts[\"build:vinext\"]) {\n pkg.scripts[\"build:vinext\"] = \"vite build\";\n added.push(\"build:vinext\");\n }\n\n if (added.length > 0) {\n fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\", \"utf-8\");\n }\n\n return added;\n } catch {\n return [];\n }\n}\n\n// ─── Dependency Installation ─────────────────────────────────────────────────\n\nexport function getInitDeps(isAppRouter: boolean): string[] {\n const deps = [\"vinext\", \"vite\"];\n if (isAppRouter) {\n deps.push(\"@vitejs/plugin-rsc\");\n deps.push(\"react-server-dom-webpack\");\n }\n return deps;\n}\n\nexport function isDepInstalled(root: string, dep: string): boolean {\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) return false;\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n ...pkg.peerDependencies,\n };\n return dep in allDeps;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if react/react-dom need upgrading for react-server-dom-webpack compatibility.\n *\n * react-server-dom-webpack versions are pinned to match their React version\n * (e.g. rsdw@19.2.4 requires react@^19.2.4). When a project has an older\n * React (e.g. create-next-app ships react@19.2.3), we need to upgrade\n * react/react-dom BEFORE installing rsdw to avoid peer-dep conflicts.\n *\n * Uses createRequire to resolve react's package.json through Node's module\n * resolution, which works correctly across all package managers (npm, pnpm,\n * yarn, Yarn PnP) and monorepo layouts with hoisting/symlinking.\n *\n * Returns [\"react@latest\", \"react-dom@latest\"] if upgrade is needed, [] otherwise.\n */\nexport function getReactUpgradeDeps(root: string): string[] {\n try {\n const req = createRequire(path.join(root, \"package.json\"));\n // Resolve react's entry, then walk up to its package.json.\n // We can't use require.resolve(\"react/package.json\") because not all\n // packages export ./package.json in their exports map.\n const resolved = req.resolve(\"react\");\n const version = findPackageVersion(resolved, \"react\");\n if (!version) return [];\n // react-server-dom-webpack@latest currently requires react@^19.2.4\n const parts = version.split(\".\");\n const major = parseInt(parts[0], 10);\n const minor = parseInt(parts[1], 10);\n const patch = parseInt(parts[2], 10);\n if (major < 19 || (major === 19 && minor < 2) || (major === 19 && minor === 2 && patch < 4)) {\n return [\"react@latest\", \"react-dom@latest\"];\n }\n return [];\n } catch {\n return [];\n }\n}\n\n/**\n * Walk up from a resolved module entry to find its package.json and return\n * the version field. Uses the same approach as PR #18's findReactServerPackages.\n */\nfunction findPackageVersion(resolvedEntry: string, packageName: string): string | null {\n let dir = path.dirname(resolvedEntry);\n while (dir !== path.dirname(dir)) {\n const candidate = path.join(dir, \"package.json\");\n try {\n const pkg = JSON.parse(fs.readFileSync(candidate, \"utf-8\"));\n if (pkg.name === packageName) {\n return pkg.version ?? null;\n }\n } catch {\n // no package.json at this level, keep walking up\n }\n dir = path.dirname(dir);\n }\n return null;\n}\n\nfunction installDeps(\n root: string,\n deps: string[],\n exec: (cmd: string, opts: { cwd: string; stdio: string }) => void,\n { dev = true }: { dev?: boolean } = {},\n): void {\n if (deps.length === 0) return;\n\n const baseCmd = detectPackageManager(root);\n // Strip \" -D\" for non-dev installs (keeps deps in \"dependencies\", not \"devDependencies\")\n const installCmd = dev ? baseCmd : baseCmd.replace(/ -D$/, \"\");\n const depsStr = deps.join(\" \");\n\n exec(`${installCmd} ${depsStr}`, {\n cwd: root,\n stdio: \"inherit\",\n });\n}\n\n// ─── Main Entry ──────────────────────────────────────────────────────────────\n\nexport async function init(options: InitOptions): Promise<InitResult> {\n const root = path.resolve(options.root);\n const port = options.port ?? 3001;\n const exec = options._exec ?? ((cmd: string, opts: { cwd: string; stdio: string }) => {\n execSync(cmd, opts as Parameters<typeof execSync>[1]);\n });\n\n // ── Pre-flight checks ──────────────────────────────────────────────────\n\n // Ensure package.json exists\n const pkgPath = path.join(root, \"package.json\");\n if (!fs.existsSync(pkgPath)) {\n console.error(\" Error: No package.json found in the current directory.\");\n console.error(\" Run this command from the root of a Next.js project.\\n\");\n process.exit(1);\n }\n\n // Check if vite.config already exists — skip generation later, but continue\n const viteConfigExists = hasViteConfig(root);\n\n const isApp = hasAppDir(root);\n const pmName = detectPackageManagerName(root);\n\n // ── Step 1: Compatibility check ────────────────────────────────────────\n\n if (!options.skipCheck) {\n console.log(\" Running compatibility check...\\n\");\n const checkResult = runCheck(root);\n console.log(formatReport(checkResult, { calledFromInit: true }));\n console.log(); // blank line before migration steps\n }\n\n // ── Step 2: Install dependencies ───────────────────────────────────────\n\n const neededDeps = getInitDeps(isApp);\n const missingDeps = neededDeps.filter((dep) => !isDepInstalled(root, dep));\n\n // For App Router: react-server-dom-webpack requires react/react-dom versions\n // to match exactly (e.g. rsdw@19.2.4 needs react@^19.2.4). If the installed\n // React is too old (common with create-next-app), upgrade it first as a\n // regular dependency to avoid ERESOLVE peer-dep conflicts.\n if (isApp && missingDeps.includes(\"react-server-dom-webpack\")) {\n const reactUpgrade = getReactUpgradeDeps(root);\n if (reactUpgrade.length > 0) {\n console.log(` Upgrading ${reactUpgrade.map(d => d.replace(/@latest$/, \"\")).join(\", \")}...`);\n installDeps(root, reactUpgrade, exec, { dev: false });\n }\n }\n\n if (missingDeps.length > 0) {\n console.log(` Installing ${missingDeps.join(\", \")}...`);\n installDeps(root, missingDeps, exec);\n console.log();\n }\n\n // ── Step 3: Add \"type\": \"module\" ───────────────────────────────────────\n\n // Rename CJS configs first (before adding \"type\": \"module\") to avoid breakage\n const renamedConfigs = renameCJSConfigs(root);\n const addedTypeModule = ensureESModule(root);\n\n // ── Step 4: Add scripts ────────────────────────────────────────────────\n\n const addedScripts = addScripts(root, port);\n\n // ── Step 5: Generate vite.config.ts ────────────────────────────────────\n\n let generatedViteConfig = false;\n const skippedViteConfig = viteConfigExists && !options.force;\n if (!skippedViteConfig) {\n const configContent = generateViteConfig(isApp);\n fs.writeFileSync(path.join(root, \"vite.config.ts\"), configContent, \"utf-8\");\n generatedViteConfig = true;\n }\n\n // ── Step 6: Print summary ──────────────────────────────────────────────\n\n console.log(\" vinext init complete!\\n\");\n\n if (missingDeps.length > 0) {\n console.log(` \\u2713 Added ${missingDeps.join(\", \")} to devDependencies`);\n }\n if (addedTypeModule) {\n console.log(` \\u2713 Added \"type\": \"module\" to package.json`);\n }\n for (const [oldName, newName] of renamedConfigs) {\n console.log(` \\u2713 Renamed ${oldName} \\u2192 ${newName}`);\n }\n for (const script of addedScripts) {\n console.log(` \\u2713 Added ${script} script`);\n }\n if (generatedViteConfig) {\n console.log(` \\u2713 Generated vite.config.ts`);\n }\n if (skippedViteConfig) {\n console.log(` - Skipped vite.config.ts (already exists, use --force to overwrite)`);\n }\n\n console.log(`\n Next steps:\n ${pmName} run dev:vinext Start the vinext dev server\n ${pmName} run dev Start Next.js (still works as before)\n`);\n\n return {\n installedDeps: missingDeps,\n addedTypeModule,\n renamedConfigs,\n addedScripts,\n generatedViteConfig,\n skippedViteConfig,\n };\n}\n"]}
@@ -642,7 +642,7 @@ async function startPagesRouterServer(options) {
642
642
  response = new Response("404 - API route not found", { status: 404 });
643
643
  }
644
644
  // Merge middleware + config headers into the response
645
- const responseBody = await response.text();
645
+ const responseBody = Buffer.from(await response.arrayBuffer());
646
646
  const ct = response.headers.get("content-type") ?? "text/html";
647
647
  const responseHeaders = { ...middlewareHeaders };
648
648
  response.headers.forEach((v, k) => { responseHeaders[k] = v; });
@@ -685,7 +685,7 @@ async function startPagesRouterServer(options) {
685
685
  return;
686
686
  }
687
687
  // Merge middleware + config headers into the response
688
- const responseBody = await response.text();
688
+ const responseBody = Buffer.from(await response.arrayBuffer());
689
689
  const ct = response.headers.get("content-type") ?? "text/html";
690
690
  const responseHeaders = { ...middlewareHeaders };
691
691
  response.headers.forEach((v, k) => { responseHeaders[k] = v; });
@@ -1 +1 @@
1
- {"version":3,"file":"prod-server.js","sourceRoot":"","sources":["../../src/server/prod-server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Production server for vinext.\n *\n * Serves the built output from `vinext build`. Handles:\n * - Static asset serving from client build output\n * - Pages Router: SSR rendering + API route handling\n * - App Router: RSC/SSR rendering, route handlers, server actions\n * - Gzip/Brotli compression for text-based responses\n * - Streaming SSR for App Router\n *\n * Build output for Pages Router:\n * - dist/client/ — static assets (JS, CSS, images) + .vite/ssr-manifest.json\n * - dist/server/entry.js — SSR entry point (virtual:vinext-server-entry)\n *\n * Build output for App Router:\n * - dist/client/ — static assets (JS, CSS, images)\n * - dist/server/index.js — RSC entry (default export: handler(Request) → Response)\n * - dist/server/ssr/index.js — SSR entry (imported by RSC entry at runtime)\n */\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { Readable, pipeline } from \"node:stream\";\nimport { pathToFileURL } from \"node:url\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport zlib from \"node:zlib\";\nimport { matchRedirect, matchRewrite, matchHeaders, requestContextFromRequest, isExternalUrl, proxyExternalRequest } from \"../config/config-matchers.js\";\nimport type { RequestContext } from \"../config/config-matchers.js\";\nimport { IMAGE_OPTIMIZATION_PATH, parseImageParams } from \"./image-optimization.js\";\nimport { computeLazyChunks } from \"../index.js\";\n\n/** Convert a Node.js IncomingMessage into a ReadableStream for Web Request body. */\nfunction readNodeStream(req: IncomingMessage): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n req.on(\"data\", (chunk: Buffer) => controller.enqueue(new Uint8Array(chunk)));\n req.on(\"end\", () => controller.close());\n req.on(\"error\", (err) => controller.error(err));\n },\n });\n}\n\nexport interface ProdServerOptions {\n /** Port to listen on */\n port?: number;\n /** Host to bind to */\n host?: string;\n /** Path to the build output directory */\n outDir?: string;\n /** Disable compression (default: false) */\n noCompression?: boolean;\n}\n\n/** Content types that benefit from compression. */\nconst COMPRESSIBLE_TYPES = new Set([\n \"text/html\",\n \"text/css\",\n \"text/plain\",\n \"text/xml\",\n \"text/javascript\",\n \"application/javascript\",\n \"application/json\",\n \"application/xml\",\n \"application/xhtml+xml\",\n \"application/rss+xml\",\n \"application/atom+xml\",\n \"image/svg+xml\",\n \"application/manifest+json\",\n \"application/wasm\",\n]);\n\n/** Minimum size threshold for compression (in bytes). Below this, compression overhead isn't worth it. */\nconst COMPRESS_THRESHOLD = 1024;\n\n/**\n * Parse the Accept-Encoding header and return the best supported encoding.\n * Preference order: br > gzip > deflate > identity.\n */\nfunction negotiateEncoding(req: IncomingMessage): \"br\" | \"gzip\" | \"deflate\" | null {\n const accept = req.headers[\"accept-encoding\"];\n if (!accept || typeof accept !== \"string\") return null;\n const lower = accept.toLowerCase();\n if (lower.includes(\"br\")) return \"br\";\n if (lower.includes(\"gzip\")) return \"gzip\";\n if (lower.includes(\"deflate\")) return \"deflate\";\n return null;\n}\n\n/**\n * Create a compression stream for the given encoding.\n */\nfunction createCompressor(encoding: \"br\" | \"gzip\" | \"deflate\"): zlib.BrotliCompress | zlib.Gzip | zlib.Deflate {\n switch (encoding) {\n case \"br\":\n return zlib.createBrotliCompress({\n params: {\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4, // Fast compression (1-11, 4 is a good balance)\n },\n });\n case \"gzip\":\n return zlib.createGzip({ level: 6 }); // Default level, good balance\n case \"deflate\":\n return zlib.createDeflate({ level: 6 });\n }\n}\n\n/**\n * Send a compressed response if the content type is compressible and the\n * client supports compression. Otherwise send uncompressed.\n */\nfunction sendCompressed(\n req: IncomingMessage,\n res: ServerResponse,\n body: string | Buffer,\n contentType: string,\n statusCode: number,\n extraHeaders: Record<string, string> = {},\n compress: boolean = true,\n): void {\n const buf = typeof body === \"string\" ? Buffer.from(body) : body;\n const baseType = contentType.split(\";\")[0].trim();\n const encoding = compress ? negotiateEncoding(req) : null;\n\n if (encoding && COMPRESSIBLE_TYPES.has(baseType) && buf.length >= COMPRESS_THRESHOLD) {\n const compressor = createCompressor(encoding);\n res.writeHead(statusCode, {\n ...extraHeaders,\n \"Content-Type\": contentType,\n \"Content-Encoding\": encoding,\n Vary: \"Accept-Encoding\",\n });\n compressor.end(buf);\n pipeline(compressor, res, () => { /* ignore pipeline errors on closed connections */ });\n } else {\n res.writeHead(statusCode, {\n ...extraHeaders,\n \"Content-Type\": contentType,\n \"Content-Length\": String(buf.length),\n });\n res.end(buf);\n }\n}\n\n/** Content-type lookup for static assets. */\nconst CONTENT_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n \".webp\": \"image/webp\",\n \".avif\": \"image/avif\",\n \".map\": \"application/json\",\n};\n\n/**\n * Try to serve a static file from the client build directory.\n * Returns true if the file was served, false otherwise.\n */\nfunction tryServeStatic(\n req: IncomingMessage,\n res: ServerResponse,\n clientDir: string,\n pathname: string,\n compress: boolean,\n): boolean {\n // Resolve the path and guard against directory traversal (e.g. /../../../etc/passwd)\n const resolvedClient = path.resolve(clientDir);\n let decodedPathname: string;\n try {\n decodedPathname = decodeURIComponent(pathname);\n } catch {\n return false;\n }\n const staticFile = path.resolve(clientDir, \".\" + decodedPathname);\n if (!staticFile.startsWith(resolvedClient + path.sep) && staticFile !== resolvedClient) {\n return false;\n }\n if (\n pathname === \"/\" ||\n !fs.existsSync(staticFile) ||\n !fs.statSync(staticFile).isFile()\n ) {\n return false;\n }\n\n const ext = path.extname(staticFile);\n const ct = CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n const isHashed = pathname.startsWith(\"/assets/\");\n const cacheControl = isHashed\n ? \"public, max-age=31536000, immutable\"\n : \"public, max-age=3600\";\n\n const baseType = ct.split(\";\")[0].trim();\n if (compress && COMPRESSIBLE_TYPES.has(baseType)) {\n const encoding = negotiateEncoding(req);\n if (encoding) {\n const fileStream = fs.createReadStream(staticFile);\n const compressor = createCompressor(encoding);\n res.writeHead(200, {\n \"Content-Type\": ct,\n \"Content-Encoding\": encoding,\n \"Cache-Control\": cacheControl,\n Vary: \"Accept-Encoding\",\n });\n pipeline(fileStream, compressor, res, () => { /* ignore */ });\n return true;\n }\n }\n\n res.writeHead(200, {\n \"Content-Type\": ct,\n \"Cache-Control\": cacheControl,\n });\n fs.createReadStream(staticFile).pipe(res);\n return true;\n}\n\n/**\n * Resolve the host for a request, ignoring X-Forwarded-Host to prevent\n * host header poisoning attacks (open redirects, cache poisoning).\n *\n * X-Forwarded-Host is only trusted when the VINEXT_TRUSTED_HOSTS env var\n * lists the forwarded host value. Without this, an attacker can send\n * X-Forwarded-Host: evil.com and poison any redirect that resolves\n * against request.url.\n *\n * On Cloudflare Workers, X-Forwarded-Host is always set by Cloudflare\n * itself, so this is only a concern for the Node.js prod-server.\n */\nfunction resolveHost(req: IncomingMessage, fallback: string): string {\n const rawForwarded = req.headers[\"x-forwarded-host\"] as string | undefined;\n const hostHeader = req.headers.host;\n\n if (rawForwarded) {\n // X-Forwarded-Host can be comma-separated when passing through\n // multiple proxies — take only the first (client-facing) value.\n const forwardedHost = rawForwarded.split(\",\")[0].trim().toLowerCase();\n if (forwardedHost && trustedHosts.has(forwardedHost)) {\n return forwardedHost;\n }\n }\n\n return hostHeader || fallback;\n}\n\n/** Hosts that are allowed as X-Forwarded-Host values (stored lowercase). */\nconst trustedHosts: Set<string> = new Set(\n (process.env.VINEXT_TRUSTED_HOSTS ?? \"\")\n .split(\",\")\n .map((h) => h.trim().toLowerCase())\n .filter(Boolean),\n);\n\n/**\n * Whether to trust X-Forwarded-Proto from upstream proxies.\n * Enabled when VINEXT_TRUST_PROXY=1 or when VINEXT_TRUSTED_HOSTS is set\n * (having trusted hosts implies a trusted proxy).\n */\nconst trustProxy = process.env.VINEXT_TRUST_PROXY === \"1\" || trustedHosts.size > 0;\n\n/**\n * Convert a Node.js IncomingMessage to a Web Request object.\n */\nfunction nodeToWebRequest(req: IncomingMessage): Request {\n const rawProto = trustProxy\n ? (req.headers[\"x-forwarded-proto\"] as string)?.split(\",\")[0]?.trim()\n : undefined;\n const proto = rawProto === \"https\" || rawProto === \"http\" ? rawProto : \"http\";\n const host = resolveHost(req, \"localhost\");\n const origin = `${proto}://${host}`;\n const url = new URL(req.url ?? \"/\", origin);\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n\n const method = req.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n\n const init: RequestInit & { duplex?: string } = {\n method,\n headers,\n };\n\n if (hasBody) {\n // Convert Node.js readable stream to Web ReadableStream for request body.\n // Readable.toWeb() is available since Node.js 17.\n init.body = Readable.toWeb(req) as ReadableStream;\n init.duplex = \"half\"; // Required for streaming request bodies\n }\n\n return new Request(url, init);\n}\n\n/**\n * Stream a Web Response back to a Node.js ServerResponse.\n * Supports streaming compression for SSR responses.\n */\nasync function sendWebResponse(\n webResponse: Response,\n req: IncomingMessage,\n res: ServerResponse,\n compress: boolean,\n): Promise<void> {\n const status = webResponse.status;\n\n // Collect headers, handling multi-value headers (e.g. Set-Cookie)\n const nodeHeaders: Record<string, string | string[]> = {};\n webResponse.headers.forEach((value, key) => {\n const existing = nodeHeaders[key];\n if (existing !== undefined) {\n nodeHeaders[key] = Array.isArray(existing)\n ? [...existing, value]\n : [existing, value];\n } else {\n nodeHeaders[key] = value;\n }\n });\n\n if (!webResponse.body) {\n res.writeHead(status, nodeHeaders);\n res.end();\n return;\n }\n\n // Check if we should compress the response.\n // Skip if the upstream already compressed (avoid double-compression).\n const alreadyEncoded = webResponse.headers.has(\"content-encoding\");\n const contentType = webResponse.headers.get(\"content-type\") ?? \"\";\n const baseType = contentType.split(\";\")[0].trim();\n const encoding = (compress && !alreadyEncoded) ? negotiateEncoding(req) : null;\n const shouldCompress = !!(encoding && COMPRESSIBLE_TYPES.has(baseType));\n\n if (shouldCompress) {\n delete nodeHeaders[\"content-length\"];\n delete nodeHeaders[\"Content-Length\"];\n nodeHeaders[\"Content-Encoding\"] = encoding!;\n nodeHeaders[\"Vary\"] = \"Accept-Encoding\";\n }\n\n res.writeHead(status, nodeHeaders);\n\n // HEAD requests: send headers only, skip the body\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n\n // Convert Web ReadableStream to Node.js Readable and pipe to response.\n // Readable.fromWeb() is available since Node.js 17.\n const nodeStream = Readable.fromWeb(webResponse.body as import(\"stream/web\").ReadableStream);\n\n if (shouldCompress) {\n const compressor = createCompressor(encoding!);\n pipeline(nodeStream, compressor, res, () => { /* ignore pipeline errors on closed connections */ });\n } else {\n pipeline(nodeStream, res, () => { /* ignore pipeline errors on closed connections */ });\n }\n}\n\n/**\n * Start the production server.\n *\n * Automatically detects whether the build is App Router (dist/server/index.js) or\n * Pages Router (dist/server/entry.js) and configures the appropriate handler.\n */\nexport async function startProdServer(options: ProdServerOptions = {}) {\n const {\n port = process.env.PORT ? parseInt(process.env.PORT) : 3000,\n host = \"0.0.0.0\",\n outDir = path.resolve(\"dist\"),\n noCompression = false,\n } = options;\n\n const compress = !noCompression;\n // Always resolve outDir to absolute to ensure dynamic import() works\n const resolvedOutDir = path.resolve(outDir);\n const clientDir = path.join(resolvedOutDir, \"client\");\n\n // Detect build type\n const rscEntryPath = path.join(resolvedOutDir, \"server\", \"index.js\");\n const serverEntryPath = path.join(resolvedOutDir, \"server\", \"entry.js\");\n const isAppRouter = fs.existsSync(rscEntryPath);\n\n if (!isAppRouter && !fs.existsSync(serverEntryPath)) {\n console.error(`[vinext] No build output found in ${outDir}`);\n console.error(\"Run `vinext build` first.\");\n process.exit(1);\n }\n\n if (isAppRouter) {\n return startAppRouterServer({ port, host, clientDir, rscEntryPath, compress });\n }\n\n return startPagesRouterServer({ port, host, clientDir, serverEntryPath, compress });\n}\n\n// ─── App Router Production Server ─────────────────────────────────────────────\n\ninterface AppRouterServerOptions {\n port: number;\n host: string;\n clientDir: string;\n rscEntryPath: string;\n compress: boolean;\n}\n\n/**\n * Start the App Router production server.\n *\n * The RSC entry (dist/server/index.js) exports a default handler function:\n * handler(request: Request) → Promise<Response>\n *\n * This handler already does everything: route matching, RSC rendering,\n * SSR HTML generation (via import(\"./ssr/index.js\")), route handlers,\n * server actions, ISR caching, 404s, redirects, etc.\n *\n * The production server's job is simply to:\n * 1. Serve static assets from dist/client/\n * 2. Convert Node.js IncomingMessage → Web Request\n * 3. Call the RSC handler\n * 4. Stream the Web Response back (with optional compression)\n */\nasync function startAppRouterServer(options: AppRouterServerOptions) {\n const { port, host, clientDir, rscEntryPath, compress } = options;\n\n // Import the RSC handler (use file:// URL for reliable dynamic import)\n const rscModule = await import(pathToFileURL(rscEntryPath).href);\n const rscHandler: (request: Request) => Promise<Response> = rscModule.default;\n\n if (typeof rscHandler !== \"function\") {\n console.error(\"[vinext] RSC entry does not export a default handler function\");\n process.exit(1);\n }\n\n const server = createServer(async (req, res) => {\n const url = req.url ?? \"/\";\n const pathname = url.split(\"?\")[0];\n\n // Guard against protocol-relative URL open redirect attacks.\n // See comment in app-dev-server.ts _handleRequest for full explanation.\n if (pathname.startsWith(\"//\")) {\n res.writeHead(404);\n res.end(\"404 Not Found\");\n return;\n }\n\n // Serve static assets from client build\n if (pathname !== \"/\" && tryServeStatic(req, res, clientDir, pathname, compress)) {\n return;\n }\n\n // Image optimization passthrough (Node.js prod server has no Images binding;\n // serves the original file with cache headers)\n if (pathname === IMAGE_OPTIMIZATION_PATH) {\n const parsedUrl = new URL(url, \"http://localhost\");\n const params = parseImageParams(parsedUrl);\n if (!params) {\n res.writeHead(400);\n res.end(\"Bad Request\");\n return;\n }\n // Serve the original image from the client build directory\n if (tryServeStatic(req, res, clientDir, params.imageUrl, false)) {\n return;\n }\n res.writeHead(404);\n res.end(\"Image not found\");\n return;\n }\n\n try {\n // Convert Node.js request to Web Request and call the RSC handler\n const request = nodeToWebRequest(req);\n const response = await rscHandler(request);\n\n // Stream the Web Response back to the Node.js response\n await sendWebResponse(response, req, res, compress);\n } catch (e) {\n console.error(\"[vinext] Server error:\", e);\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n }\n });\n\n await new Promise<void>((resolve) => {\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n console.log(`[vinext] Production server running at http://${host}:${actualPort}`);\n resolve();\n });\n });\n\n return server;\n}\n\n// ─── Pages Router Production Server ───────────────────────────────────────────\n\ninterface PagesRouterServerOptions {\n port: number;\n host: string;\n clientDir: string;\n serverEntryPath: string;\n compress: boolean;\n}\n\n/**\n * Start the Pages Router production server.\n *\n * Uses the server entry (dist/server/entry.js) which exports:\n * - renderPage(request, url, manifest) — SSR rendering (Web Request → Response)\n * - handleApiRoute(request, url) — API route handling (Web Request → Response)\n * - runMiddleware(request) — middleware execution\n * - vinextConfig — embedded next.config.js settings\n */\nasync function startPagesRouterServer(options: PagesRouterServerOptions) {\n const { port, host, clientDir, serverEntryPath, compress } = options;\n\n // Load the SSR manifest (maps module URLs to client asset URLs)\n let ssrManifest: Record<string, string[]> = {};\n const manifestPath = path.join(clientDir, \".vite\", \"ssr-manifest.json\");\n if (fs.existsSync(manifestPath)) {\n ssrManifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\n }\n\n // Load the build manifest to compute lazy chunks — chunks only reachable via\n // dynamic imports (React.lazy, next/dynamic). These should not be\n // modulepreloaded since they are fetched on demand.\n const buildManifestPath = path.join(clientDir, \".vite\", \"manifest.json\");\n if (fs.existsSync(buildManifestPath)) {\n try {\n const buildManifest = JSON.parse(fs.readFileSync(buildManifestPath, \"utf-8\"));\n const lazyChunks = computeLazyChunks(buildManifest);\n if (lazyChunks.length > 0) {\n (globalThis as any).__VINEXT_LAZY_CHUNKS__ = lazyChunks;\n }\n } catch { /* ignore parse errors */ }\n }\n\n // Import the server entry module (use file:// URL for reliable dynamic import)\n const serverEntry = await import(pathToFileURL(serverEntryPath).href);\n const { renderPage, handleApiRoute: handleApi, runMiddleware, vinextConfig } = serverEntry;\n\n // Extract config values (embedded at build time in the server entry)\n const basePath: string = vinextConfig?.basePath ?? \"\";\n const trailingSlash: boolean = vinextConfig?.trailingSlash ?? false;\n const configRedirects = vinextConfig?.redirects ?? [];\n const configRewrites = vinextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] };\n const configHeaders = vinextConfig?.headers ?? [];\n\n const server = createServer(async (req, res) => {\n const rawUrl = req.url ?? \"/\";\n let url = rawUrl;\n let pathname = url.split(\"?\")[0];\n\n // Guard against protocol-relative URL open redirect attacks.\n // See comment in app-dev-server.ts _handleRequest for full explanation.\n if (pathname.startsWith(\"//\")) {\n res.writeHead(404);\n res.end(\"404 Not Found\");\n return;\n }\n\n // ── 1. Static assets ──────────────────────────────────────────\n // Serve static files from client build. When basePath is configured,\n // Vite's `base` config ensures assets are under basePath/assets/.\n // We check both with and without basePath.\n const staticLookupPath = basePath && pathname.startsWith(basePath)\n ? pathname.slice(basePath.length) || \"/\"\n : pathname;\n if (\n staticLookupPath !== \"/\" &&\n !staticLookupPath.startsWith(\"/api/\") &&\n tryServeStatic(req, res, clientDir, staticLookupPath, compress)\n ) {\n return;\n }\n\n // ── Image optimization passthrough ──────────────────────────────\n if (pathname === IMAGE_OPTIMIZATION_PATH || staticLookupPath === IMAGE_OPTIMIZATION_PATH) {\n const parsedUrl = new URL(rawUrl, \"http://localhost\");\n const params = parseImageParams(parsedUrl);\n if (!params) {\n res.writeHead(400);\n res.end(\"Bad Request\");\n return;\n }\n if (tryServeStatic(req, res, clientDir, params.imageUrl, false)) {\n return;\n }\n res.writeHead(404);\n res.end(\"Image not found\");\n return;\n }\n\n try {\n // ── 2. Strip basePath ─────────────────────────────────────────\n if (basePath && pathname.startsWith(basePath)) {\n const stripped = pathname.slice(basePath.length) || \"/\";\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n url = stripped + qs;\n pathname = stripped;\n }\n\n // ── 3. Trailing slash normalization ───────────────────────────\n if (pathname !== \"/\" && !pathname.startsWith(\"/api\")) {\n const hasTrailing = pathname.endsWith(\"/\");\n if (trailingSlash && !hasTrailing) {\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n res.writeHead(308, { Location: basePath + pathname + \"/\" + qs });\n res.end();\n return;\n } else if (!trailingSlash && hasTrailing) {\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n res.writeHead(308, { Location: basePath + pathname.replace(/\\/+$/, \"\") + qs });\n res.end();\n return;\n }\n }\n\n // Convert Node.js req to Web Request for the server entry\n const rawProtocol = trustProxy\n ? (req.headers[\"x-forwarded-proto\"] as string)?.split(\",\")[0]?.trim()\n : undefined;\n const protocol = rawProtocol === \"https\" || rawProtocol === \"http\" ? rawProtocol : \"http\";\n const hostHeader = resolveHost(req, `${host}:${port}`);\n const reqHeaders = Object.entries(req.headers).reduce((h, [k, v]) => {\n if (v) h.set(k, Array.isArray(v) ? v.join(\", \") : v);\n return h;\n }, new Headers());\n const method = req.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const webRequest = new Request(`${protocol}://${hostHeader}${url}`, {\n method,\n headers: reqHeaders,\n body: hasBody ? readNodeStream(req) : undefined,\n // @ts-expect-error — duplex needed for streaming request bodies\n duplex: hasBody ? \"half\" : undefined,\n });\n\n // Build request context for has/missing condition matching\n const reqCtx: RequestContext = requestContextFromRequest(webRequest);\n\n // ── 4. Run middleware ─────────────────────────────────────────\n let resolvedUrl = url;\n const middlewareHeaders: Record<string, string> = {};\n let middlewareRewriteStatus: number | undefined;\n if (typeof runMiddleware === \"function\") {\n const result = await runMiddleware(webRequest);\n\n if (!result.continue) {\n if (result.redirectUrl) {\n res.writeHead(result.redirectStatus ?? 307, {\n Location: result.redirectUrl,\n });\n res.end();\n return;\n }\n if (result.response) {\n // Use arrayBuffer() to handle binary response bodies correctly\n const body = Buffer.from(await result.response.arrayBuffer());\n res.writeHead(result.response.status, Object.fromEntries(result.response.headers));\n res.end(body);\n return;\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 // (e.g. NextResponse.rewrite(url, { status: 403 }))\n middlewareRewriteStatus = result.rewriteStatus;\n }\n\n // Unpack x-middleware-request-* headers into the actual request so that\n // renderPage / handleApiRoute see the middleware-modified headers.\n // Also remove them from middlewareHeaders to prevent leaking as response headers.\n const mwReqPrefix = \"x-middleware-request-\";\n for (const key of Object.keys(middlewareHeaders)) {\n if (key.startsWith(mwReqPrefix)) {\n const realName = key.slice(mwReqPrefix.length);\n webRequest.headers.set(realName, middlewareHeaders[key]);\n delete middlewareHeaders[key];\n }\n }\n\n let resolvedPathname = resolvedUrl.split(\"?\")[0];\n\n // ── 5. Apply custom headers from next.config.js ───────────────\n if (configHeaders.length) {\n const matched = matchHeaders(resolvedPathname, configHeaders);\n for (const h of matched) {\n middlewareHeaders[h.key.toLowerCase()] = h.value;\n }\n }\n\n // ── 6. Apply redirects from next.config.js ────────────────────\n if (configRedirects.length) {\n const redirect = matchRedirect(resolvedPathname, configRedirects, reqCtx);\n if (redirect) {\n // Guard against double-prefixing: only add basePath if destination\n // doesn't already start with it.\n const dest = basePath && !redirect.destination.startsWith(basePath)\n ? basePath + redirect.destination\n : redirect.destination;\n res.writeHead(redirect.permanent ? 308 : 307, { Location: dest });\n res.end();\n return;\n }\n }\n\n // ── 7. 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 const proxyResponse = await proxyExternalRequest(webRequest, rewritten);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 8. API routes ─────────────────────────────────────────────\n if (resolvedPathname.startsWith(\"/api/\") || resolvedPathname === \"/api\") {\n let response: Response;\n if (typeof handleApi === \"function\") {\n response = await handleApi(webRequest, resolvedUrl);\n } else {\n response = new Response(\"404 - API route not found\", { status: 404 });\n }\n\n // Merge middleware + config headers into the response\n const responseBody = await response.text();\n const ct = response.headers.get(\"content-type\") ?? \"text/html\";\n const responseHeaders: Record<string, string> = { ...middlewareHeaders };\n response.headers.forEach((v, k) => { responseHeaders[k] = v; });\n\n sendCompressed(req, res, responseBody, ct, middlewareRewriteStatus ?? response.status, responseHeaders, compress);\n return;\n }\n\n // ── 9. 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 const proxyResponse = await proxyExternalRequest(webRequest, rewritten);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 10. SSR page rendering ────────────────────────────────────\n let response: Response | undefined;\n if (typeof renderPage === \"function\") {\n response = await renderPage(webRequest, resolvedUrl, ssrManifest);\n\n // ── 11. 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 const proxyResponse = await proxyExternalRequest(webRequest, fallbackRewrite);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n response = await renderPage(webRequest, fallbackRewrite, ssrManifest);\n }\n }\n }\n\n if (!response) {\n res.writeHead(404);\n res.end(\"404 - Not found\");\n return;\n }\n\n // Merge middleware + config headers into the response\n const responseBody = await response.text();\n const ct = response.headers.get(\"content-type\") ?? \"text/html\";\n const responseHeaders: Record<string, string> = { ...middlewareHeaders };\n response.headers.forEach((v, k) => { responseHeaders[k] = v; });\n\n sendCompressed(req, res, responseBody, ct, middlewareRewriteStatus ?? response.status, responseHeaders, compress);\n } catch (e) {\n console.error(\"[vinext] Server error:\", e);\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n });\n\n await new Promise<void>((resolve) => {\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n console.log(`[vinext] Production server running at http://${host}:${actualPort}`);\n resolve();\n });\n });\n\n return server;\n}\n\n// Export helpers for testing\nexport { sendCompressed, negotiateEncoding, COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, resolveHost, trustedHosts, trustProxy, nodeToWebRequest };\n"]}
1
+ {"version":3,"file":"prod-server.js","sourceRoot":"","sources":["../../src/server/prod-server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Production server for vinext.\n *\n * Serves the built output from `vinext build`. Handles:\n * - Static asset serving from client build output\n * - Pages Router: SSR rendering + API route handling\n * - App Router: RSC/SSR rendering, route handlers, server actions\n * - Gzip/Brotli compression for text-based responses\n * - Streaming SSR for App Router\n *\n * Build output for Pages Router:\n * - dist/client/ — static assets (JS, CSS, images) + .vite/ssr-manifest.json\n * - dist/server/entry.js — SSR entry point (virtual:vinext-server-entry)\n *\n * Build output for App Router:\n * - dist/client/ — static assets (JS, CSS, images)\n * - dist/server/index.js — RSC entry (default export: handler(Request) → Response)\n * - dist/server/ssr/index.js — SSR entry (imported by RSC entry at runtime)\n */\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { Readable, pipeline } from \"node:stream\";\nimport { pathToFileURL } from \"node:url\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport zlib from \"node:zlib\";\nimport { matchRedirect, matchRewrite, matchHeaders, requestContextFromRequest, isExternalUrl, proxyExternalRequest } from \"../config/config-matchers.js\";\nimport type { RequestContext } from \"../config/config-matchers.js\";\nimport { IMAGE_OPTIMIZATION_PATH, parseImageParams } from \"./image-optimization.js\";\nimport { computeLazyChunks } from \"../index.js\";\n\n/** Convert a Node.js IncomingMessage into a ReadableStream for Web Request body. */\nfunction readNodeStream(req: IncomingMessage): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n req.on(\"data\", (chunk: Buffer) => controller.enqueue(new Uint8Array(chunk)));\n req.on(\"end\", () => controller.close());\n req.on(\"error\", (err) => controller.error(err));\n },\n });\n}\n\nexport interface ProdServerOptions {\n /** Port to listen on */\n port?: number;\n /** Host to bind to */\n host?: string;\n /** Path to the build output directory */\n outDir?: string;\n /** Disable compression (default: false) */\n noCompression?: boolean;\n}\n\n/** Content types that benefit from compression. */\nconst COMPRESSIBLE_TYPES = new Set([\n \"text/html\",\n \"text/css\",\n \"text/plain\",\n \"text/xml\",\n \"text/javascript\",\n \"application/javascript\",\n \"application/json\",\n \"application/xml\",\n \"application/xhtml+xml\",\n \"application/rss+xml\",\n \"application/atom+xml\",\n \"image/svg+xml\",\n \"application/manifest+json\",\n \"application/wasm\",\n]);\n\n/** Minimum size threshold for compression (in bytes). Below this, compression overhead isn't worth it. */\nconst COMPRESS_THRESHOLD = 1024;\n\n/**\n * Parse the Accept-Encoding header and return the best supported encoding.\n * Preference order: br > gzip > deflate > identity.\n */\nfunction negotiateEncoding(req: IncomingMessage): \"br\" | \"gzip\" | \"deflate\" | null {\n const accept = req.headers[\"accept-encoding\"];\n if (!accept || typeof accept !== \"string\") return null;\n const lower = accept.toLowerCase();\n if (lower.includes(\"br\")) return \"br\";\n if (lower.includes(\"gzip\")) return \"gzip\";\n if (lower.includes(\"deflate\")) return \"deflate\";\n return null;\n}\n\n/**\n * Create a compression stream for the given encoding.\n */\nfunction createCompressor(encoding: \"br\" | \"gzip\" | \"deflate\"): zlib.BrotliCompress | zlib.Gzip | zlib.Deflate {\n switch (encoding) {\n case \"br\":\n return zlib.createBrotliCompress({\n params: {\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4, // Fast compression (1-11, 4 is a good balance)\n },\n });\n case \"gzip\":\n return zlib.createGzip({ level: 6 }); // Default level, good balance\n case \"deflate\":\n return zlib.createDeflate({ level: 6 });\n }\n}\n\n/**\n * Send a compressed response if the content type is compressible and the\n * client supports compression. Otherwise send uncompressed.\n */\nfunction sendCompressed(\n req: IncomingMessage,\n res: ServerResponse,\n body: string | Buffer,\n contentType: string,\n statusCode: number,\n extraHeaders: Record<string, string> = {},\n compress: boolean = true,\n): void {\n const buf = typeof body === \"string\" ? Buffer.from(body) : body;\n const baseType = contentType.split(\";\")[0].trim();\n const encoding = compress ? negotiateEncoding(req) : null;\n\n if (encoding && COMPRESSIBLE_TYPES.has(baseType) && buf.length >= COMPRESS_THRESHOLD) {\n const compressor = createCompressor(encoding);\n res.writeHead(statusCode, {\n ...extraHeaders,\n \"Content-Type\": contentType,\n \"Content-Encoding\": encoding,\n Vary: \"Accept-Encoding\",\n });\n compressor.end(buf);\n pipeline(compressor, res, () => { /* ignore pipeline errors on closed connections */ });\n } else {\n res.writeHead(statusCode, {\n ...extraHeaders,\n \"Content-Type\": contentType,\n \"Content-Length\": String(buf.length),\n });\n res.end(buf);\n }\n}\n\n/** Content-type lookup for static assets. */\nconst CONTENT_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n \".webp\": \"image/webp\",\n \".avif\": \"image/avif\",\n \".map\": \"application/json\",\n};\n\n/**\n * Try to serve a static file from the client build directory.\n * Returns true if the file was served, false otherwise.\n */\nfunction tryServeStatic(\n req: IncomingMessage,\n res: ServerResponse,\n clientDir: string,\n pathname: string,\n compress: boolean,\n): boolean {\n // Resolve the path and guard against directory traversal (e.g. /../../../etc/passwd)\n const resolvedClient = path.resolve(clientDir);\n let decodedPathname: string;\n try {\n decodedPathname = decodeURIComponent(pathname);\n } catch {\n return false;\n }\n const staticFile = path.resolve(clientDir, \".\" + decodedPathname);\n if (!staticFile.startsWith(resolvedClient + path.sep) && staticFile !== resolvedClient) {\n return false;\n }\n if (\n pathname === \"/\" ||\n !fs.existsSync(staticFile) ||\n !fs.statSync(staticFile).isFile()\n ) {\n return false;\n }\n\n const ext = path.extname(staticFile);\n const ct = CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n const isHashed = pathname.startsWith(\"/assets/\");\n const cacheControl = isHashed\n ? \"public, max-age=31536000, immutable\"\n : \"public, max-age=3600\";\n\n const baseType = ct.split(\";\")[0].trim();\n if (compress && COMPRESSIBLE_TYPES.has(baseType)) {\n const encoding = negotiateEncoding(req);\n if (encoding) {\n const fileStream = fs.createReadStream(staticFile);\n const compressor = createCompressor(encoding);\n res.writeHead(200, {\n \"Content-Type\": ct,\n \"Content-Encoding\": encoding,\n \"Cache-Control\": cacheControl,\n Vary: \"Accept-Encoding\",\n });\n pipeline(fileStream, compressor, res, () => { /* ignore */ });\n return true;\n }\n }\n\n res.writeHead(200, {\n \"Content-Type\": ct,\n \"Cache-Control\": cacheControl,\n });\n fs.createReadStream(staticFile).pipe(res);\n return true;\n}\n\n/**\n * Resolve the host for a request, ignoring X-Forwarded-Host to prevent\n * host header poisoning attacks (open redirects, cache poisoning).\n *\n * X-Forwarded-Host is only trusted when the VINEXT_TRUSTED_HOSTS env var\n * lists the forwarded host value. Without this, an attacker can send\n * X-Forwarded-Host: evil.com and poison any redirect that resolves\n * against request.url.\n *\n * On Cloudflare Workers, X-Forwarded-Host is always set by Cloudflare\n * itself, so this is only a concern for the Node.js prod-server.\n */\nfunction resolveHost(req: IncomingMessage, fallback: string): string {\n const rawForwarded = req.headers[\"x-forwarded-host\"] as string | undefined;\n const hostHeader = req.headers.host;\n\n if (rawForwarded) {\n // X-Forwarded-Host can be comma-separated when passing through\n // multiple proxies — take only the first (client-facing) value.\n const forwardedHost = rawForwarded.split(\",\")[0].trim().toLowerCase();\n if (forwardedHost && trustedHosts.has(forwardedHost)) {\n return forwardedHost;\n }\n }\n\n return hostHeader || fallback;\n}\n\n/** Hosts that are allowed as X-Forwarded-Host values (stored lowercase). */\nconst trustedHosts: Set<string> = new Set(\n (process.env.VINEXT_TRUSTED_HOSTS ?? \"\")\n .split(\",\")\n .map((h) => h.trim().toLowerCase())\n .filter(Boolean),\n);\n\n/**\n * Whether to trust X-Forwarded-Proto from upstream proxies.\n * Enabled when VINEXT_TRUST_PROXY=1 or when VINEXT_TRUSTED_HOSTS is set\n * (having trusted hosts implies a trusted proxy).\n */\nconst trustProxy = process.env.VINEXT_TRUST_PROXY === \"1\" || trustedHosts.size > 0;\n\n/**\n * Convert a Node.js IncomingMessage to a Web Request object.\n */\nfunction nodeToWebRequest(req: IncomingMessage): Request {\n const rawProto = trustProxy\n ? (req.headers[\"x-forwarded-proto\"] as string)?.split(\",\")[0]?.trim()\n : undefined;\n const proto = rawProto === \"https\" || rawProto === \"http\" ? rawProto : \"http\";\n const host = resolveHost(req, \"localhost\");\n const origin = `${proto}://${host}`;\n const url = new URL(req.url ?? \"/\", origin);\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n\n const method = req.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n\n const init: RequestInit & { duplex?: string } = {\n method,\n headers,\n };\n\n if (hasBody) {\n // Convert Node.js readable stream to Web ReadableStream for request body.\n // Readable.toWeb() is available since Node.js 17.\n init.body = Readable.toWeb(req) as ReadableStream;\n init.duplex = \"half\"; // Required for streaming request bodies\n }\n\n return new Request(url, init);\n}\n\n/**\n * Stream a Web Response back to a Node.js ServerResponse.\n * Supports streaming compression for SSR responses.\n */\nasync function sendWebResponse(\n webResponse: Response,\n req: IncomingMessage,\n res: ServerResponse,\n compress: boolean,\n): Promise<void> {\n const status = webResponse.status;\n\n // Collect headers, handling multi-value headers (e.g. Set-Cookie)\n const nodeHeaders: Record<string, string | string[]> = {};\n webResponse.headers.forEach((value, key) => {\n const existing = nodeHeaders[key];\n if (existing !== undefined) {\n nodeHeaders[key] = Array.isArray(existing)\n ? [...existing, value]\n : [existing, value];\n } else {\n nodeHeaders[key] = value;\n }\n });\n\n if (!webResponse.body) {\n res.writeHead(status, nodeHeaders);\n res.end();\n return;\n }\n\n // Check if we should compress the response.\n // Skip if the upstream already compressed (avoid double-compression).\n const alreadyEncoded = webResponse.headers.has(\"content-encoding\");\n const contentType = webResponse.headers.get(\"content-type\") ?? \"\";\n const baseType = contentType.split(\";\")[0].trim();\n const encoding = (compress && !alreadyEncoded) ? negotiateEncoding(req) : null;\n const shouldCompress = !!(encoding && COMPRESSIBLE_TYPES.has(baseType));\n\n if (shouldCompress) {\n delete nodeHeaders[\"content-length\"];\n delete nodeHeaders[\"Content-Length\"];\n nodeHeaders[\"Content-Encoding\"] = encoding!;\n nodeHeaders[\"Vary\"] = \"Accept-Encoding\";\n }\n\n res.writeHead(status, nodeHeaders);\n\n // HEAD requests: send headers only, skip the body\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n\n // Convert Web ReadableStream to Node.js Readable and pipe to response.\n // Readable.fromWeb() is available since Node.js 17.\n const nodeStream = Readable.fromWeb(webResponse.body as import(\"stream/web\").ReadableStream);\n\n if (shouldCompress) {\n const compressor = createCompressor(encoding!);\n pipeline(nodeStream, compressor, res, () => { /* ignore pipeline errors on closed connections */ });\n } else {\n pipeline(nodeStream, res, () => { /* ignore pipeline errors on closed connections */ });\n }\n}\n\n/**\n * Start the production server.\n *\n * Automatically detects whether the build is App Router (dist/server/index.js) or\n * Pages Router (dist/server/entry.js) and configures the appropriate handler.\n */\nexport async function startProdServer(options: ProdServerOptions = {}) {\n const {\n port = process.env.PORT ? parseInt(process.env.PORT) : 3000,\n host = \"0.0.0.0\",\n outDir = path.resolve(\"dist\"),\n noCompression = false,\n } = options;\n\n const compress = !noCompression;\n // Always resolve outDir to absolute to ensure dynamic import() works\n const resolvedOutDir = path.resolve(outDir);\n const clientDir = path.join(resolvedOutDir, \"client\");\n\n // Detect build type\n const rscEntryPath = path.join(resolvedOutDir, \"server\", \"index.js\");\n const serverEntryPath = path.join(resolvedOutDir, \"server\", \"entry.js\");\n const isAppRouter = fs.existsSync(rscEntryPath);\n\n if (!isAppRouter && !fs.existsSync(serverEntryPath)) {\n console.error(`[vinext] No build output found in ${outDir}`);\n console.error(\"Run `vinext build` first.\");\n process.exit(1);\n }\n\n if (isAppRouter) {\n return startAppRouterServer({ port, host, clientDir, rscEntryPath, compress });\n }\n\n return startPagesRouterServer({ port, host, clientDir, serverEntryPath, compress });\n}\n\n// ─── App Router Production Server ─────────────────────────────────────────────\n\ninterface AppRouterServerOptions {\n port: number;\n host: string;\n clientDir: string;\n rscEntryPath: string;\n compress: boolean;\n}\n\n/**\n * Start the App Router production server.\n *\n * The RSC entry (dist/server/index.js) exports a default handler function:\n * handler(request: Request) → Promise<Response>\n *\n * This handler already does everything: route matching, RSC rendering,\n * SSR HTML generation (via import(\"./ssr/index.js\")), route handlers,\n * server actions, ISR caching, 404s, redirects, etc.\n *\n * The production server's job is simply to:\n * 1. Serve static assets from dist/client/\n * 2. Convert Node.js IncomingMessage → Web Request\n * 3. Call the RSC handler\n * 4. Stream the Web Response back (with optional compression)\n */\nasync function startAppRouterServer(options: AppRouterServerOptions) {\n const { port, host, clientDir, rscEntryPath, compress } = options;\n\n // Import the RSC handler (use file:// URL for reliable dynamic import)\n const rscModule = await import(pathToFileURL(rscEntryPath).href);\n const rscHandler: (request: Request) => Promise<Response> = rscModule.default;\n\n if (typeof rscHandler !== \"function\") {\n console.error(\"[vinext] RSC entry does not export a default handler function\");\n process.exit(1);\n }\n\n const server = createServer(async (req, res) => {\n const url = req.url ?? \"/\";\n const pathname = url.split(\"?\")[0];\n\n // Guard against protocol-relative URL open redirect attacks.\n // See comment in app-dev-server.ts _handleRequest for full explanation.\n if (pathname.startsWith(\"//\")) {\n res.writeHead(404);\n res.end(\"404 Not Found\");\n return;\n }\n\n // Serve static assets from client build\n if (pathname !== \"/\" && tryServeStatic(req, res, clientDir, pathname, compress)) {\n return;\n }\n\n // Image optimization passthrough (Node.js prod server has no Images binding;\n // serves the original file with cache headers)\n if (pathname === IMAGE_OPTIMIZATION_PATH) {\n const parsedUrl = new URL(url, \"http://localhost\");\n const params = parseImageParams(parsedUrl);\n if (!params) {\n res.writeHead(400);\n res.end(\"Bad Request\");\n return;\n }\n // Serve the original image from the client build directory\n if (tryServeStatic(req, res, clientDir, params.imageUrl, false)) {\n return;\n }\n res.writeHead(404);\n res.end(\"Image not found\");\n return;\n }\n\n try {\n // Convert Node.js request to Web Request and call the RSC handler\n const request = nodeToWebRequest(req);\n const response = await rscHandler(request);\n\n // Stream the Web Response back to the Node.js response\n await sendWebResponse(response, req, res, compress);\n } catch (e) {\n console.error(\"[vinext] Server error:\", e);\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n }\n });\n\n await new Promise<void>((resolve) => {\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n console.log(`[vinext] Production server running at http://${host}:${actualPort}`);\n resolve();\n });\n });\n\n return server;\n}\n\n// ─── Pages Router Production Server ───────────────────────────────────────────\n\ninterface PagesRouterServerOptions {\n port: number;\n host: string;\n clientDir: string;\n serverEntryPath: string;\n compress: boolean;\n}\n\n/**\n * Start the Pages Router production server.\n *\n * Uses the server entry (dist/server/entry.js) which exports:\n * - renderPage(request, url, manifest) — SSR rendering (Web Request → Response)\n * - handleApiRoute(request, url) — API route handling (Web Request → Response)\n * - runMiddleware(request) — middleware execution\n * - vinextConfig — embedded next.config.js settings\n */\nasync function startPagesRouterServer(options: PagesRouterServerOptions) {\n const { port, host, clientDir, serverEntryPath, compress } = options;\n\n // Load the SSR manifest (maps module URLs to client asset URLs)\n let ssrManifest: Record<string, string[]> = {};\n const manifestPath = path.join(clientDir, \".vite\", \"ssr-manifest.json\");\n if (fs.existsSync(manifestPath)) {\n ssrManifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\n }\n\n // Load the build manifest to compute lazy chunks — chunks only reachable via\n // dynamic imports (React.lazy, next/dynamic). These should not be\n // modulepreloaded since they are fetched on demand.\n const buildManifestPath = path.join(clientDir, \".vite\", \"manifest.json\");\n if (fs.existsSync(buildManifestPath)) {\n try {\n const buildManifest = JSON.parse(fs.readFileSync(buildManifestPath, \"utf-8\"));\n const lazyChunks = computeLazyChunks(buildManifest);\n if (lazyChunks.length > 0) {\n (globalThis as any).__VINEXT_LAZY_CHUNKS__ = lazyChunks;\n }\n } catch { /* ignore parse errors */ }\n }\n\n // Import the server entry module (use file:// URL for reliable dynamic import)\n const serverEntry = await import(pathToFileURL(serverEntryPath).href);\n const { renderPage, handleApiRoute: handleApi, runMiddleware, vinextConfig } = serverEntry;\n\n // Extract config values (embedded at build time in the server entry)\n const basePath: string = vinextConfig?.basePath ?? \"\";\n const trailingSlash: boolean = vinextConfig?.trailingSlash ?? false;\n const configRedirects = vinextConfig?.redirects ?? [];\n const configRewrites = vinextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] };\n const configHeaders = vinextConfig?.headers ?? [];\n\n const server = createServer(async (req, res) => {\n const rawUrl = req.url ?? \"/\";\n let url = rawUrl;\n let pathname = url.split(\"?\")[0];\n\n // Guard against protocol-relative URL open redirect attacks.\n // See comment in app-dev-server.ts _handleRequest for full explanation.\n if (pathname.startsWith(\"//\")) {\n res.writeHead(404);\n res.end(\"404 Not Found\");\n return;\n }\n\n // ── 1. Static assets ──────────────────────────────────────────\n // Serve static files from client build. When basePath is configured,\n // Vite's `base` config ensures assets are under basePath/assets/.\n // We check both with and without basePath.\n const staticLookupPath = basePath && pathname.startsWith(basePath)\n ? pathname.slice(basePath.length) || \"/\"\n : pathname;\n if (\n staticLookupPath !== \"/\" &&\n !staticLookupPath.startsWith(\"/api/\") &&\n tryServeStatic(req, res, clientDir, staticLookupPath, compress)\n ) {\n return;\n }\n\n // ── Image optimization passthrough ──────────────────────────────\n if (pathname === IMAGE_OPTIMIZATION_PATH || staticLookupPath === IMAGE_OPTIMIZATION_PATH) {\n const parsedUrl = new URL(rawUrl, \"http://localhost\");\n const params = parseImageParams(parsedUrl);\n if (!params) {\n res.writeHead(400);\n res.end(\"Bad Request\");\n return;\n }\n if (tryServeStatic(req, res, clientDir, params.imageUrl, false)) {\n return;\n }\n res.writeHead(404);\n res.end(\"Image not found\");\n return;\n }\n\n try {\n // ── 2. Strip basePath ─────────────────────────────────────────\n if (basePath && pathname.startsWith(basePath)) {\n const stripped = pathname.slice(basePath.length) || \"/\";\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n url = stripped + qs;\n pathname = stripped;\n }\n\n // ── 3. Trailing slash normalization ───────────────────────────\n if (pathname !== \"/\" && !pathname.startsWith(\"/api\")) {\n const hasTrailing = pathname.endsWith(\"/\");\n if (trailingSlash && !hasTrailing) {\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n res.writeHead(308, { Location: basePath + pathname + \"/\" + qs });\n res.end();\n return;\n } else if (!trailingSlash && hasTrailing) {\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n res.writeHead(308, { Location: basePath + pathname.replace(/\\/+$/, \"\") + qs });\n res.end();\n return;\n }\n }\n\n // Convert Node.js req to Web Request for the server entry\n const rawProtocol = trustProxy\n ? (req.headers[\"x-forwarded-proto\"] as string)?.split(\",\")[0]?.trim()\n : undefined;\n const protocol = rawProtocol === \"https\" || rawProtocol === \"http\" ? rawProtocol : \"http\";\n const hostHeader = resolveHost(req, `${host}:${port}`);\n const reqHeaders = Object.entries(req.headers).reduce((h, [k, v]) => {\n if (v) h.set(k, Array.isArray(v) ? v.join(\", \") : v);\n return h;\n }, new Headers());\n const method = req.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const webRequest = new Request(`${protocol}://${hostHeader}${url}`, {\n method,\n headers: reqHeaders,\n body: hasBody ? readNodeStream(req) : undefined,\n // @ts-expect-error — duplex needed for streaming request bodies\n duplex: hasBody ? \"half\" : undefined,\n });\n\n // Build request context for has/missing condition matching\n const reqCtx: RequestContext = requestContextFromRequest(webRequest);\n\n // ── 4. Run middleware ─────────────────────────────────────────\n let resolvedUrl = url;\n const middlewareHeaders: Record<string, string> = {};\n let middlewareRewriteStatus: number | undefined;\n if (typeof runMiddleware === \"function\") {\n const result = await runMiddleware(webRequest);\n\n if (!result.continue) {\n if (result.redirectUrl) {\n res.writeHead(result.redirectStatus ?? 307, {\n Location: result.redirectUrl,\n });\n res.end();\n return;\n }\n if (result.response) {\n // Use arrayBuffer() to handle binary response bodies correctly\n const body = Buffer.from(await result.response.arrayBuffer());\n res.writeHead(result.response.status, Object.fromEntries(result.response.headers));\n res.end(body);\n return;\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 // (e.g. NextResponse.rewrite(url, { status: 403 }))\n middlewareRewriteStatus = result.rewriteStatus;\n }\n\n // Unpack x-middleware-request-* headers into the actual request so that\n // renderPage / handleApiRoute see the middleware-modified headers.\n // Also remove them from middlewareHeaders to prevent leaking as response headers.\n const mwReqPrefix = \"x-middleware-request-\";\n for (const key of Object.keys(middlewareHeaders)) {\n if (key.startsWith(mwReqPrefix)) {\n const realName = key.slice(mwReqPrefix.length);\n webRequest.headers.set(realName, middlewareHeaders[key]);\n delete middlewareHeaders[key];\n }\n }\n\n let resolvedPathname = resolvedUrl.split(\"?\")[0];\n\n // ── 5. Apply custom headers from next.config.js ───────────────\n if (configHeaders.length) {\n const matched = matchHeaders(resolvedPathname, configHeaders);\n for (const h of matched) {\n middlewareHeaders[h.key.toLowerCase()] = h.value;\n }\n }\n\n // ── 6. Apply redirects from next.config.js ────────────────────\n if (configRedirects.length) {\n const redirect = matchRedirect(resolvedPathname, configRedirects, reqCtx);\n if (redirect) {\n // Guard against double-prefixing: only add basePath if destination\n // doesn't already start with it.\n const dest = basePath && !redirect.destination.startsWith(basePath)\n ? basePath + redirect.destination\n : redirect.destination;\n res.writeHead(redirect.permanent ? 308 : 307, { Location: dest });\n res.end();\n return;\n }\n }\n\n // ── 7. 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 const proxyResponse = await proxyExternalRequest(webRequest, rewritten);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 8. API routes ─────────────────────────────────────────────\n if (resolvedPathname.startsWith(\"/api/\") || resolvedPathname === \"/api\") {\n let response: Response;\n if (typeof handleApi === \"function\") {\n response = await handleApi(webRequest, resolvedUrl);\n } else {\n response = new Response(\"404 - API route not found\", { status: 404 });\n }\n\n // Merge middleware + config headers into the response\n const responseBody = Buffer.from(await response.arrayBuffer());\n const ct = response.headers.get(\"content-type\") ?? \"text/html\";\n const responseHeaders: Record<string, string> = { ...middlewareHeaders };\n response.headers.forEach((v, k) => { responseHeaders[k] = v; });\n\n sendCompressed(req, res, responseBody, ct, middlewareRewriteStatus ?? response.status, responseHeaders, compress);\n return;\n }\n\n // ── 9. 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 const proxyResponse = await proxyExternalRequest(webRequest, rewritten);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 10. SSR page rendering ────────────────────────────────────\n let response: Response | undefined;\n if (typeof renderPage === \"function\") {\n response = await renderPage(webRequest, resolvedUrl, ssrManifest);\n\n // ── 11. 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 const proxyResponse = await proxyExternalRequest(webRequest, fallbackRewrite);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n response = await renderPage(webRequest, fallbackRewrite, ssrManifest);\n }\n }\n }\n\n if (!response) {\n res.writeHead(404);\n res.end(\"404 - Not found\");\n return;\n }\n\n // Merge middleware + config headers into the response\n const responseBody = Buffer.from(await response.arrayBuffer());\n const ct = response.headers.get(\"content-type\") ?? \"text/html\";\n const responseHeaders: Record<string, string> = { ...middlewareHeaders };\n response.headers.forEach((v, k) => { responseHeaders[k] = v; });\n\n sendCompressed(req, res, responseBody, ct, middlewareRewriteStatus ?? response.status, responseHeaders, compress);\n } catch (e) {\n console.error(\"[vinext] Server error:\", e);\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n });\n\n await new Promise<void>((resolve) => {\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n console.log(`[vinext] Production server running at http://${host}:${actualPort}`);\n resolve();\n });\n });\n\n return server;\n}\n\n// Export helpers for testing\nexport { sendCompressed, negotiateEncoding, COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, resolveHost, trustedHosts, trustProxy, nodeToWebRequest };\n"]}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "vinext",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Run Next.js apps on Vite. Drop-in replacement for the next CLI.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "https://github.com/cloudflare/vinext"
8
+ "url": "git+https://github.com/cloudflare/vinext.git"
9
9
  },
10
10
  "type": "module",
11
11
  "main": "dist/index.js",
@@ -44,7 +44,7 @@
44
44
  ],
45
45
  "scripts": {
46
46
  "build": "tsc",
47
- "prepack": "pnpm run build",
47
+ "prepack": "cp ../../README.md README.md && pnpm run build",
48
48
  "dev": "tsc --watch"
49
49
  },
50
50
  "peerDependencies": {