next-bun-compile 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,14 +26,24 @@ Add the adapter to your `next.config.ts`:
26
26
  ```ts
27
27
  import type { NextConfig } from "next";
28
28
 
29
+ const nextConfig: NextConfig = {
30
+ adapterPath: require.resolve("next-bun-compile"),
31
+ };
32
+
33
+ export default nextConfig;
34
+ ```
35
+
36
+ <details>
37
+ <summary>Using Next.js 16.1? Use the experimental config instead</summary>
38
+
39
+ ```ts
29
40
  const nextConfig: NextConfig = {
30
41
  experimental: {
31
42
  adapterPath: require.resolve("next-bun-compile"),
32
43
  },
33
44
  };
34
-
35
- export default nextConfig;
36
45
  ```
46
+ </details>
37
47
 
38
48
  Update your build script in `package.json`:
39
49
 
@@ -81,9 +91,7 @@ If you configure `assetPrefix` in your `next.config.ts`, static assets (`/_next/
81
91
  ```ts
82
92
  const nextConfig: NextConfig = {
83
93
  assetPrefix: "https://cdn.example.com",
84
- experimental: {
85
- adapterPath: require.resolve("next-bun-compile"),
86
- },
94
+ adapterPath: require.resolve("next-bun-compile"),
87
95
  };
88
96
  ```
89
97
 
@@ -133,9 +141,7 @@ Failed to load external module pino-142500b1eb3f4baf: Cannot find package ...
133
141
  ```ts
134
142
  const nextConfig: NextConfig = {
135
143
  transpilePackages: ["pino", "pino-pretty"],
136
- experimental: {
137
- adapterPath: require.resolve("next-bun-compile"),
138
- },
144
+ adapterPath: require.resolve("next-bun-compile"),
139
145
  };
140
146
  ```
141
147
 
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  compile,
4
4
  generateEntryPoint
5
- } from "./index-k6q8xg22.js";
5
+ } from "./index-5m65k8kw.js";
6
6
 
7
7
  // src/cli.ts
8
8
  import { existsSync } from "node:fs";
@@ -147,61 +147,100 @@ let resolve = (id) => { try { return _resolve(id); } catch { return ''; } };`;
147
147
  console.log("next-bun-compile: Patched require-hook.js for compiled binary compatibility");
148
148
  }
149
149
  }
150
- function collectExternalModules(standaloneDir, serverDir) {
151
- const chunksDir = join(serverDir, ".next/server/chunks");
152
- if (!existsSync(chunksDir))
150
+ function collectExternalModules(standaloneDir) {
151
+ const nodeModulesDir = join(standaloneDir, "node_modules");
152
+ if (!existsSync(nodeModulesDir))
153
153
  return [];
154
- const seeds = new Set;
155
- for (const { absolutePath } of walkDir(chunksDir)) {
156
- if (!absolutePath.endsWith(".js"))
157
- continue;
158
- const content = readFileSync(absolutePath, "utf-8");
159
- for (const match of content.matchAll(/require\("(next\/dist\/[^"]+)"\)/g)) {
160
- seeds.add(match[1]);
161
- }
154
+ const pkgRoots = new Map;
155
+ function addPkg(name, path) {
156
+ if (!pkgRoots.has(name))
157
+ pkgRoots.set(name, path);
162
158
  }
163
- const deps = new Set;
164
- function trace(file) {
165
- if (deps.has(file))
159
+ function scanDir(dir) {
160
+ if (!existsSync(dir))
166
161
  return;
167
- let fullPath = join(standaloneDir, "node_modules", file);
168
- if (existsSync(fullPath) && statSync(fullPath).isDirectory()) {
169
- const pkgJson = join(fullPath, "package.json");
170
- if (existsSync(pkgJson)) {
171
- deps.add(file + "/package.json");
162
+ for (const entry of readdirSync(dir)) {
163
+ if (entry.startsWith(".") || entry === "next-bun-compile")
164
+ continue;
165
+ const entryPath = join(dir, entry);
166
+ if (!statSync(entryPath).isDirectory())
167
+ continue;
168
+ if (entry.startsWith("@")) {
169
+ for (const sub of readdirSync(entryPath)) {
170
+ const subPath = join(entryPath, sub);
171
+ if (statSync(subPath).isDirectory())
172
+ addPkg(`${entry}/${sub}`, subPath);
173
+ }
174
+ } else {
175
+ addPkg(entry, entryPath);
172
176
  }
173
- file = file + "/index.js";
174
- fullPath = join(standaloneDir, "node_modules", file);
175
177
  }
176
- if (!existsSync(fullPath))
177
- return;
178
- deps.add(file);
179
- const content = readFileSync(fullPath, "utf-8");
180
- for (const match of content.matchAll(/require\("([^"]+)"\)/g)) {
181
- const req = match[1];
182
- let resolved;
183
- if (req.startsWith(".")) {
184
- resolved = join(file, "..", req).replace(/\\/g, "/");
185
- if (!resolved.endsWith(".js"))
186
- resolved += ".js";
187
- } else if (req.startsWith("next/")) {
188
- resolved = req;
189
- if (!resolved.endsWith(".js"))
190
- resolved += ".js";
178
+ }
179
+ scanDir(nodeModulesDir);
180
+ for (const store of [".bun", ".pnpm"]) {
181
+ const storeDir = join(nodeModulesDir, store);
182
+ if (!existsSync(storeDir))
183
+ continue;
184
+ for (const storeEntry of readdirSync(storeDir)) {
185
+ const nested = join(storeDir, storeEntry, "node_modules");
186
+ if (existsSync(nested))
187
+ scanDir(nested);
188
+ }
189
+ }
190
+ const results = [];
191
+ for (const [name, pkgPath] of pkgRoots) {
192
+ for (const f of walkDir(pkgPath)) {
193
+ results.push({
194
+ mod: `${name}/${f.relativePath.replace(/\\/g, "/")}`,
195
+ src: f.absolutePath
196
+ });
197
+ }
198
+ }
199
+ return results;
200
+ }
201
+ function fixModuleResolution(standaloneDir) {
202
+ const nodeModulesDir = join(standaloneDir, "node_modules");
203
+ for (const pkgDir of findPackageDirs(nodeModulesDir, "next")) {
204
+ const compiledDir = join(pkgDir, "dist/compiled");
205
+ if (!existsSync(compiledDir))
206
+ continue;
207
+ for (const entry of readdirSync(compiledDir)) {
208
+ const dir = join(compiledDir, entry);
209
+ if (!statSync(dir).isDirectory())
210
+ continue;
211
+ const pkgJsonPath = join(dir, "package.json");
212
+ const indexPath = join(dir, "index.js");
213
+ if (!existsSync(pkgJsonPath) || existsSync(indexPath))
214
+ continue;
215
+ const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
216
+ if (pkg.main && pkg.main !== "index.js") {
217
+ writeFileSync(indexPath, `module.exports = require("./${pkg.main}");`);
191
218
  }
192
- if (resolved)
193
- trace(resolved);
194
219
  }
195
220
  }
196
- for (const seed of seeds)
197
- trace(seed);
198
- return [...deps];
221
+ for (const helpersDir of findPackageDirs(nodeModulesDir, "@swc/helpers")) {
222
+ const cjsDir = join(helpersDir, "cjs");
223
+ if (!existsSync(cjsDir))
224
+ continue;
225
+ for (const file of readdirSync(cjsDir)) {
226
+ if (!file.endsWith(".cjs"))
227
+ continue;
228
+ const name = file.slice(0, -4);
229
+ const shimDir = join(helpersDir, "_", name);
230
+ const shimFile = join(shimDir, "index.js");
231
+ if (existsSync(shimFile))
232
+ continue;
233
+ mkdirSync(shimDir, { recursive: true });
234
+ writeFileSync(shimFile, `module.exports = require("../../cjs/${file}");`);
235
+ }
236
+ }
199
237
  }
200
238
  function generateEntryPoint(options) {
201
239
  const { standaloneDir, distDir, projectDir } = options;
202
240
  const serverDir = findServerDir(standaloneDir);
203
241
  generateStubs(standaloneDir);
204
242
  patchRequireHook(standaloneDir);
243
+ fixModuleResolution(standaloneDir);
205
244
  const staticDir = join(distDir, "static");
206
245
  const staticFiles = walkDir(staticDir).map((f) => ({
207
246
  ...f,
@@ -217,11 +256,9 @@ function generateEntryPoint(options) {
217
256
  ...f,
218
257
  urlPath: `__runtime/.next/${f.relativePath.replace(/\\/g, "/")}`
219
258
  }));
220
- const externalModules = collectExternalModules(standaloneDir, serverDir);
221
- const externalPaths = ["next/package.json", ...externalModules];
259
+ const externalModules = collectExternalModules(standaloneDir);
222
260
  const externalDir = join(serverDir, ".next/__external");
223
- for (const mod of externalPaths) {
224
- const src = join(standaloneDir, "node_modules", mod);
261
+ for (const { mod, src } of externalModules) {
225
262
  if (!existsSync(src))
226
263
  continue;
227
264
  const dest = join(externalDir, mod);
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  __require,
3
3
  compile,
4
4
  generateEntryPoint
5
- } from "./index-k6q8xg22.js";
5
+ } from "./index-5m65k8kw.js";
6
6
 
7
7
  // src/index.ts
8
8
  import { join } from "node:path";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-bun-compile",
3
- "version": "0.5.2",
3
+ "version": "0.6.0",
4
4
  "description": "Next.js Build Adapter that compiles your app into a Bun single-file executable",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",