@gigadrive/network-config 3.3.2 → 3.4.1
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/index.d.mts +187 -1
- package/dist/index.d.ts +187 -1
- package/dist/index.js +280 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +279 -18
- package/dist/index.mjs.map +1 -1
- package/dist/nextjs-adapter.d.mts +7 -33
- package/dist/nextjs-adapter.d.ts +6 -34
- package/dist/nextjs-adapter.js +324 -21
- package/dist/nextjs-adapter.js.map +1 -1
- package/dist/nextjs-adapter.mjs +324 -22
- package/dist/nextjs-adapter.mjs.map +1 -1
- package/dist/nextjs-cache-components-handler.d.mts +20 -0
- package/dist/nextjs-cache-components-handler.d.ts +20 -0
- package/dist/nextjs-cache-components-handler.js +200 -0
- package/dist/nextjs-cache-components-handler.js.map +1 -0
- package/dist/nextjs-cache-components-handler.mjs +177 -0
- package/dist/nextjs-cache-components-handler.mjs.map +1 -0
- package/dist/nextjs-cache-handler.d.mts +12 -0
- package/dist/nextjs-cache-handler.d.ts +12 -0
- package/dist/nextjs-cache-handler.js +141 -0
- package/dist/nextjs-cache-handler.js.map +1 -0
- package/dist/nextjs-cache-handler.mjs +118 -0
- package/dist/nextjs-cache-handler.mjs.map +1 -0
- package/dist/nextjs-image-loader.d.mts +9 -0
- package/dist/nextjs-image-loader.d.ts +9 -0
- package/dist/nextjs-image-loader.js +36 -0
- package/dist/nextjs-image-loader.js.map +1 -0
- package/dist/nextjs-image-loader.mjs +15 -0
- package/dist/nextjs-image-loader.mjs.map +1 -0
- package/dist/v4/schema.json +85 -0
- package/package.json +19 -3
- package/src/v4/schema.json +85 -0
|
@@ -1,37 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
[key: string]: unknown;
|
|
4
|
-
}
|
|
5
|
-
interface ModifyConfigContext {
|
|
6
|
-
phase: string;
|
|
7
|
-
nextVersion: string;
|
|
8
|
-
}
|
|
9
|
-
interface BuildCompleteContext {
|
|
10
|
-
projectDir: string;
|
|
11
|
-
repoRoot: string;
|
|
12
|
-
distDir: string;
|
|
13
|
-
config: NextConfig;
|
|
14
|
-
nextVersion: string;
|
|
15
|
-
buildId: string;
|
|
16
|
-
}
|
|
17
|
-
interface GigadriveNextBuildManifest {
|
|
18
|
-
version: 1;
|
|
19
|
-
output: 'standalone' | 'export';
|
|
20
|
-
distDir: string;
|
|
21
|
-
repoRootToProject: string;
|
|
22
|
-
nextVersion: string;
|
|
23
|
-
buildId: string;
|
|
24
|
-
}
|
|
1
|
+
import { NextAdapter } from 'next';
|
|
2
|
+
|
|
25
3
|
/**
|
|
26
|
-
* Next.js
|
|
4
|
+
* Next.js deployment adapter used automatically by Gigadrive Network build workers.
|
|
27
5
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
6
|
+
* Next 16 emits a portable, versioned runtime plan. Older Next versions retain the
|
|
7
|
+
* standalone-server behavior so existing deployments remain compatible.
|
|
30
8
|
*/
|
|
31
|
-
declare const gigadriveNextAdapter:
|
|
32
|
-
name: string;
|
|
33
|
-
modifyConfig(config: NextConfig, { phase }: ModifyConfigContext): NextConfig;
|
|
34
|
-
onBuildComplete({ projectDir, repoRoot, distDir, config, nextVersion, buildId, }: BuildCompleteContext): Promise<void>;
|
|
35
|
-
};
|
|
9
|
+
declare const gigadriveNextAdapter: NextAdapter;
|
|
36
10
|
|
|
37
|
-
export {
|
|
11
|
+
export { gigadriveNextAdapter as default };
|
package/dist/nextjs-adapter.d.ts
CHANGED
|
@@ -1,39 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
[key: string]: unknown;
|
|
4
|
-
}
|
|
5
|
-
interface ModifyConfigContext {
|
|
6
|
-
phase: string;
|
|
7
|
-
nextVersion: string;
|
|
8
|
-
}
|
|
9
|
-
interface BuildCompleteContext {
|
|
10
|
-
projectDir: string;
|
|
11
|
-
repoRoot: string;
|
|
12
|
-
distDir: string;
|
|
13
|
-
config: NextConfig;
|
|
14
|
-
nextVersion: string;
|
|
15
|
-
buildId: string;
|
|
16
|
-
}
|
|
17
|
-
interface GigadriveNextBuildManifest {
|
|
18
|
-
version: 1;
|
|
19
|
-
output: 'standalone' | 'export';
|
|
20
|
-
distDir: string;
|
|
21
|
-
repoRootToProject: string;
|
|
22
|
-
nextVersion: string;
|
|
23
|
-
buildId: string;
|
|
24
|
-
}
|
|
1
|
+
import { NextAdapter } from 'next';
|
|
2
|
+
|
|
25
3
|
/**
|
|
26
|
-
* Next.js
|
|
4
|
+
* Next.js deployment adapter used automatically by Gigadrive Network build workers.
|
|
27
5
|
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
6
|
+
* Next 16 emits a portable, versioned runtime plan. Older Next versions retain the
|
|
7
|
+
* standalone-server behavior so existing deployments remain compatible.
|
|
30
8
|
*/
|
|
31
|
-
declare const gigadriveNextAdapter:
|
|
32
|
-
name: string;
|
|
33
|
-
modifyConfig(config: NextConfig, { phase }: ModifyConfigContext): NextConfig;
|
|
34
|
-
onBuildComplete({ projectDir, repoRoot, distDir, config, nextVersion, buildId, }: BuildCompleteContext): Promise<void>;
|
|
35
|
-
};
|
|
9
|
+
declare const gigadriveNextAdapter: NextAdapter;
|
|
36
10
|
|
|
37
|
-
// @ts-ignore
|
|
38
11
|
export = gigadriveNextAdapter;
|
|
39
|
-
export type { GigadriveNextBuildManifest };
|
package/dist/nextjs-adapter.js
CHANGED
|
@@ -35,41 +35,344 @@ __export(nextjs_adapter_exports, {
|
|
|
35
35
|
module.exports = __toCommonJS(nextjs_adapter_exports);
|
|
36
36
|
var import_promises = require("fs/promises");
|
|
37
37
|
var import_node_path = __toESM(require("path"));
|
|
38
|
+
var import_node_url = require("url");
|
|
39
|
+
var import_meta = {};
|
|
38
40
|
var PRODUCTION_BUILD_PHASE = "phase-production-build";
|
|
39
|
-
var
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
var runtimeDirectory = typeof __dirname === "string" ? __dirname : import_node_path.default.dirname((0, import_node_url.fileURLToPath)(import_meta.url));
|
|
42
|
+
var runtimeModulePath = (environmentName, fileName) => process.env[environmentName] ?? import_node_path.default.join(runtimeDirectory, fileName);
|
|
43
|
+
var CACHE_HANDLER_PATH = () => runtimeModulePath("GIGADRIVE_NEXT_CACHE_HANDLER_PATH", "nextjs-cache-handler.js");
|
|
44
|
+
var CACHE_COMPONENTS_HANDLER_PATH = () => runtimeModulePath("GIGADRIVE_NEXT_CACHE_COMPONENTS_HANDLER_PATH", "nextjs-cache-components-handler.js");
|
|
45
|
+
var IMAGE_LOADER_PATH = () => runtimeModulePath("GIGADRIVE_NEXT_IMAGE_LOADER_PATH", "nextjs-image-loader.js");
|
|
46
|
+
var toJsonValue = (value) => {
|
|
47
|
+
const serialized = JSON.stringify(value);
|
|
48
|
+
return serialized === void 0 ? null : JSON.parse(serialized);
|
|
49
|
+
};
|
|
50
|
+
var isNext16OrNewer = (nextVersion) => {
|
|
51
|
+
const major = Number.parseInt(nextVersion.split(".")[0] ?? "", 10);
|
|
52
|
+
return Number.isFinite(major) && major >= 16;
|
|
53
|
+
};
|
|
54
|
+
var toPortableRelativePath = (from, to, allowCurrentDirectory = false) => {
|
|
55
|
+
const resolvedFrom = import_node_path.default.resolve(from);
|
|
56
|
+
const resolvedTo = import_node_path.default.resolve(import_node_path.default.isAbsolute(to) ? to : import_node_path.default.join(from, to));
|
|
57
|
+
const relativePath = import_node_path.default.relative(resolvedFrom, resolvedTo).replaceAll(import_node_path.default.sep, "/");
|
|
58
|
+
const normalized = relativePath === "" ? "." : relativePath;
|
|
59
|
+
if (!allowCurrentDirectory && normalized === "." || normalized.startsWith("/") || /^[A-Za-z]:/.test(normalized) || normalized.split("/").some((segment) => segment === "..")) {
|
|
60
|
+
throw new Error(`Next.js adapter output is outside the repository root: ${to}`);
|
|
61
|
+
}
|
|
62
|
+
return normalized;
|
|
63
|
+
};
|
|
64
|
+
async function resolveReadablePath(repoRoot, filePath) {
|
|
65
|
+
const absolutePath = import_node_path.default.resolve(import_node_path.default.isAbsolute(filePath) ? filePath : import_node_path.default.join(repoRoot, filePath));
|
|
66
|
+
const portablePath = toPortableRelativePath(repoRoot, absolutePath);
|
|
67
|
+
await (0, import_promises.access)(absolutePath);
|
|
68
|
+
const resolvedPath = await (0, import_promises.realpath)(absolutePath);
|
|
69
|
+
toPortableRelativePath(repoRoot, resolvedPath);
|
|
70
|
+
const fileStat = await (0, import_promises.stat)(absolutePath);
|
|
71
|
+
return { portablePath, fileStat };
|
|
72
|
+
}
|
|
73
|
+
async function requireReadableFile(repoRoot, filePath) {
|
|
74
|
+
const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath);
|
|
75
|
+
if (!fileStat.isFile()) throw new Error(`Next.js adapter output is not a readable file: ${filePath}`);
|
|
76
|
+
return portablePath;
|
|
77
|
+
}
|
|
78
|
+
async function requireReadableAsset(repoRoot, filePath) {
|
|
79
|
+
const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath);
|
|
80
|
+
if (!fileStat.isFile() && !fileStat.isDirectory()) {
|
|
81
|
+
throw new Error(`Next.js adapter asset is not a readable file or directory: ${filePath}`);
|
|
82
|
+
}
|
|
83
|
+
return portablePath;
|
|
84
|
+
}
|
|
85
|
+
async function serializeFileMap(repoRoot, files) {
|
|
86
|
+
const entries = await Promise.all(
|
|
87
|
+
Object.entries(files).map(async ([targetPath, sourcePath]) => [
|
|
88
|
+
toPortableRelativePath(repoRoot, targetPath),
|
|
89
|
+
await requireReadableAsset(repoRoot, sourcePath)
|
|
90
|
+
])
|
|
91
|
+
);
|
|
92
|
+
return Object.fromEntries(entries);
|
|
93
|
+
}
|
|
94
|
+
var serializeRouteOutput = async (repoRoot, output) => {
|
|
95
|
+
const matchers = output.config.matchers;
|
|
96
|
+
return {
|
|
97
|
+
id: output.id,
|
|
98
|
+
type: String(output.type),
|
|
99
|
+
filePath: await requireReadableFile(repoRoot, output.filePath),
|
|
100
|
+
pathname: output.pathname,
|
|
101
|
+
sourcePage: output.sourcePage,
|
|
102
|
+
runtime: output.runtime,
|
|
103
|
+
assets: await serializeFileMap(repoRoot, output.assets),
|
|
104
|
+
...output.wasmAssets ? { wasmAssets: await serializeFileMap(repoRoot, output.wasmAssets) } : {},
|
|
105
|
+
...output.edgeRuntime ? {
|
|
106
|
+
edgeRuntime: {
|
|
107
|
+
modulePath: await requireReadableFile(repoRoot, output.edgeRuntime.modulePath),
|
|
108
|
+
entryKey: output.edgeRuntime.entryKey,
|
|
109
|
+
handlerExport: output.edgeRuntime.handlerExport
|
|
110
|
+
}
|
|
111
|
+
} : {},
|
|
112
|
+
config: {
|
|
113
|
+
maxDuration: output.config.maxDuration,
|
|
114
|
+
preferredRegion: output.config.preferredRegion,
|
|
115
|
+
env: output.config.env,
|
|
116
|
+
...matchers ? {
|
|
117
|
+
matchers: matchers.map((matcher) => ({
|
|
118
|
+
source: matcher.source,
|
|
119
|
+
sourceRegex: matcher.sourceRegex,
|
|
120
|
+
...matcher.has ? { has: toJsonValue(matcher.has) } : {},
|
|
121
|
+
...matcher.missing ? { missing: toJsonValue(matcher.missing) } : {}
|
|
122
|
+
}))
|
|
123
|
+
} : {}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
var serializeStaticOutput = async (repoRoot, output) => ({
|
|
128
|
+
id: output.id,
|
|
129
|
+
type: "STATIC_FILE",
|
|
130
|
+
filePath: await requireReadableFile(repoRoot, output.filePath),
|
|
131
|
+
pathname: output.pathname,
|
|
132
|
+
...output.immutableHash ? { immutableHash: output.immutableHash } : {}
|
|
133
|
+
});
|
|
134
|
+
var buildEntrypointPlan = (outputs) => {
|
|
135
|
+
const byIdentity = /* @__PURE__ */ new Map();
|
|
136
|
+
const outputEntrypoints = {};
|
|
137
|
+
for (const output of outputs) {
|
|
138
|
+
const identity = JSON.stringify([
|
|
139
|
+
output.runtime,
|
|
140
|
+
output.filePath,
|
|
141
|
+
output.edgeRuntime?.modulePath,
|
|
142
|
+
output.edgeRuntime?.entryKey,
|
|
143
|
+
output.edgeRuntime?.handlerExport
|
|
144
|
+
]);
|
|
145
|
+
const existingEntrypoint = byIdentity.get(identity);
|
|
146
|
+
const entrypoint = existingEntrypoint ?? {
|
|
147
|
+
id: `next-${byIdentity.size}`,
|
|
148
|
+
runtime: output.runtime,
|
|
149
|
+
filePath: output.filePath,
|
|
150
|
+
outputIds: [],
|
|
151
|
+
assets: { ...output.assets },
|
|
152
|
+
...output.wasmAssets ? { wasmAssets: { ...output.wasmAssets } } : {},
|
|
153
|
+
...output.edgeRuntime ? { edgeRuntime: { ...output.edgeRuntime } } : {},
|
|
154
|
+
config: {
|
|
155
|
+
maxDuration: output.config.maxDuration,
|
|
156
|
+
preferredRegion: output.config.preferredRegion,
|
|
157
|
+
env: output.config.env
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
if (!existingEntrypoint) {
|
|
161
|
+
byIdentity.set(identity, entrypoint);
|
|
162
|
+
} else {
|
|
163
|
+
Object.assign(entrypoint.assets, output.assets);
|
|
164
|
+
if (output.wasmAssets) entrypoint.wasmAssets = { ...entrypoint.wasmAssets, ...output.wasmAssets };
|
|
165
|
+
if (output.config.maxDuration !== void 0) {
|
|
166
|
+
entrypoint.config.maxDuration = Math.max(entrypoint.config.maxDuration ?? 0, output.config.maxDuration);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
entrypoint.outputIds.push(output.id);
|
|
170
|
+
outputEntrypoints[output.id] = entrypoint.id;
|
|
171
|
+
}
|
|
172
|
+
return { entrypoints: [...byIdentity.values()], outputEntrypoints };
|
|
173
|
+
};
|
|
174
|
+
var writeEntrypointWrappers = async (projectDir, repoRoot, entrypoints) => {
|
|
175
|
+
const wrapperDirectory = import_node_path.default.join(projectDir, ".gigadrive", "nextjs", "entrypoints");
|
|
176
|
+
await (0, import_promises.mkdir)(wrapperDirectory, { recursive: true });
|
|
177
|
+
await Promise.all(
|
|
178
|
+
entrypoints.map(async (entrypoint) => {
|
|
179
|
+
const wrapperPath = import_node_path.default.join(wrapperDirectory, `${entrypoint.id}.mjs`);
|
|
180
|
+
const executablePath = import_node_path.default.join(repoRoot, entrypoint.edgeRuntime?.modulePath ?? entrypoint.filePath);
|
|
181
|
+
const relativeImport = import_node_path.default.relative(wrapperDirectory, executablePath).replaceAll(import_node_path.default.sep, "/");
|
|
182
|
+
const importSpecifier = relativeImport.startsWith(".") ? relativeImport : `./${relativeImport}`;
|
|
183
|
+
const source = entrypoint.runtime === "edge" && entrypoint.edgeRuntime ? `import ${JSON.stringify(importSpecifier)};
|
|
184
|
+
|
|
185
|
+
export async function fetch(request) {
|
|
186
|
+
const pending = [];
|
|
187
|
+
const registry = globalThis._ENTRIES;
|
|
188
|
+
if (!registry) throw new Error('Next.js edge entry registry is unavailable');
|
|
189
|
+
const entry = await registry[${JSON.stringify(entrypoint.edgeRuntime.entryKey)}];
|
|
190
|
+
const handler = entry?.[${JSON.stringify(entrypoint.edgeRuntime.handlerExport)}];
|
|
191
|
+
if (typeof handler !== 'function') throw new Error('Next.js edge handler is unavailable');
|
|
192
|
+
const url = new URL(request.url);
|
|
193
|
+
const response = await handler(request, {
|
|
194
|
+
signal: request.signal,
|
|
195
|
+
waitUntil(promise) { pending.push(Promise.resolve(promise)); },
|
|
196
|
+
requestMeta: { hostname: url.hostname, invocationTarget: request.headers.get('x-gigadrive-next-invocation-target') ?? url.pathname, routeMatches: Object.fromEntries(new URLSearchParams(request.headers.get('x-now-route-matches') ?? '')), relativeProjectDir: ${JSON.stringify(
|
|
197
|
+
toPortableRelativePath(repoRoot, projectDir, true)
|
|
198
|
+
)} },
|
|
199
|
+
});
|
|
200
|
+
if (!response.body) { await Promise.allSettled(pending); return response; }
|
|
201
|
+
const reader = response.body.getReader();
|
|
202
|
+
const body = new ReadableStream({
|
|
203
|
+
async pull(controller) {
|
|
204
|
+
const result = await reader.read();
|
|
205
|
+
if (result.done) { await Promise.allSettled(pending); controller.close(); return; }
|
|
206
|
+
controller.enqueue(result.value);
|
|
207
|
+
},
|
|
208
|
+
cancel(reason) { return reader.cancel(reason); },
|
|
209
|
+
});
|
|
210
|
+
return new Response(body, response);
|
|
211
|
+
}
|
|
212
|
+
` : `import * as nextEntrypoint from ${JSON.stringify(importSpecifier)};
|
|
213
|
+
|
|
214
|
+
export default async function handler(req, res) {
|
|
215
|
+
const pending = [];
|
|
216
|
+
const nextHandler = nextEntrypoint.handler ?? nextEntrypoint.default?.handler ?? nextEntrypoint.default;
|
|
217
|
+
if (typeof nextHandler !== 'function') throw new Error('Next.js Node handler is unavailable');
|
|
218
|
+
await nextHandler(req, res, {
|
|
219
|
+
waitUntil(promise) { pending.push(Promise.resolve(promise)); },
|
|
220
|
+
requestMeta: { hostname: req.headers.host, invocationTarget: req.headers['x-gigadrive-next-invocation-target'] ?? req.url, routeMatches: Object.fromEntries(new URLSearchParams(req.headers['x-now-route-matches'] ?? '')), relativeProjectDir: ${JSON.stringify(
|
|
221
|
+
toPortableRelativePath(repoRoot, projectDir, true)
|
|
222
|
+
)} },
|
|
223
|
+
});
|
|
224
|
+
await Promise.allSettled(pending);
|
|
225
|
+
}
|
|
226
|
+
`;
|
|
227
|
+
await (0, import_promises.writeFile)(wrapperPath, source, "utf8");
|
|
228
|
+
const portableWrapperPath = toPortableRelativePath(repoRoot, wrapperPath);
|
|
229
|
+
entrypoint.assets[portableWrapperPath] = portableWrapperPath;
|
|
230
|
+
entrypoint.filePath = portableWrapperPath;
|
|
231
|
+
})
|
|
232
|
+
);
|
|
233
|
+
};
|
|
234
|
+
var normalizeImages = (config) => {
|
|
235
|
+
if (config.images.unoptimized) return void 0;
|
|
236
|
+
return {
|
|
237
|
+
localPatterns: config.images.localPatterns ?? [{ pathname: "/**" }],
|
|
238
|
+
remotePatterns: config.images.remotePatterns.map((pattern) => {
|
|
239
|
+
if (pattern instanceof URL) {
|
|
240
|
+
return {
|
|
241
|
+
protocol: pattern.protocol === "http:" ? "http" : "https",
|
|
242
|
+
hostname: pattern.hostname,
|
|
243
|
+
port: pattern.port,
|
|
244
|
+
pathname: pattern.pathname,
|
|
245
|
+
search: pattern.search
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
return { ...pattern };
|
|
249
|
+
}),
|
|
250
|
+
widths: [.../* @__PURE__ */ new Set([...config.images.deviceSizes, ...config.images.imageSizes])].sort((a, b) => a - b),
|
|
251
|
+
heights: [],
|
|
252
|
+
qualities: config.images.qualities ?? [75],
|
|
253
|
+
formats: config.images.formats,
|
|
254
|
+
minimumCacheTTL: config.images.minimumCacheTTL,
|
|
255
|
+
dangerouslyAllowSVG: config.images.dangerouslyAllowSVG,
|
|
256
|
+
contentSecurityPolicy: config.images.contentSecurityPolicy,
|
|
257
|
+
contentDispositionType: config.images.contentDispositionType,
|
|
258
|
+
maximumRedirects: config.images.maximumRedirects,
|
|
259
|
+
maximumResponseBody: config.images.maximumResponseBody,
|
|
260
|
+
variants: {}
|
|
261
|
+
};
|
|
42
262
|
};
|
|
43
263
|
var gigadriveNextAdapter = {
|
|
44
264
|
name: "Gigadrive Network",
|
|
45
|
-
modifyConfig(config, { phase }) {
|
|
46
|
-
if (phase !== PRODUCTION_BUILD_PHASE)
|
|
47
|
-
return config;
|
|
48
|
-
}
|
|
265
|
+
modifyConfig(config, { phase, nextVersion }) {
|
|
266
|
+
if (phase !== PRODUCTION_BUILD_PHASE) return config;
|
|
49
267
|
const deploymentId = config.deploymentId ?? process.env.GIGADRIVE_DEPLOYMENT_ID;
|
|
268
|
+
if (!isNext16OrNewer(nextVersion)) {
|
|
269
|
+
return {
|
|
270
|
+
...config,
|
|
271
|
+
...deploymentId ? { deploymentId } : {},
|
|
272
|
+
output: config.output === "export" ? "export" : "standalone"
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
if (config.output === "export") {
|
|
276
|
+
return { ...config, ...deploymentId ? { deploymentId } : {} };
|
|
277
|
+
}
|
|
278
|
+
const injectCacheHandler = config.cacheHandler === void 0;
|
|
279
|
+
const injectCacheComponentHandlers = config.cacheHandlers === void 0;
|
|
280
|
+
const images = config.images;
|
|
281
|
+
const injectImageLoader = images !== void 0 && images.unoptimized !== true && images.loader === "default" && !images.loaderFile;
|
|
50
282
|
return {
|
|
51
283
|
...config,
|
|
52
284
|
...deploymentId ? { deploymentId } : {},
|
|
53
|
-
|
|
285
|
+
...injectCacheHandler ? { cacheHandler: CACHE_HANDLER_PATH() } : {},
|
|
286
|
+
...injectCacheComponentHandlers ? {
|
|
287
|
+
cacheHandlers: {
|
|
288
|
+
default: CACHE_COMPONENTS_HANDLER_PATH(),
|
|
289
|
+
remote: CACHE_COMPONENTS_HANDLER_PATH()
|
|
290
|
+
}
|
|
291
|
+
} : {},
|
|
292
|
+
...injectCacheHandler || injectCacheComponentHandlers ? { cacheMaxMemorySize: 0 } : {},
|
|
293
|
+
...injectImageLoader ? {
|
|
294
|
+
images: {
|
|
295
|
+
...images,
|
|
296
|
+
loader: "custom",
|
|
297
|
+
loaderFile: IMAGE_LOADER_PATH()
|
|
298
|
+
}
|
|
299
|
+
} : {}
|
|
54
300
|
};
|
|
55
301
|
},
|
|
56
|
-
async onBuildComplete({
|
|
57
|
-
projectDir,
|
|
58
|
-
repoRoot,
|
|
59
|
-
distDir,
|
|
60
|
-
config,
|
|
61
|
-
nextVersion,
|
|
62
|
-
buildId
|
|
63
|
-
}) {
|
|
64
|
-
const output = config.output === "export" ? "export" : "standalone";
|
|
302
|
+
async onBuildComplete({ projectDir, repoRoot, distDir, config, nextVersion, buildId, routing, outputs }) {
|
|
65
303
|
const metadataDirectory = import_node_path.default.join(projectDir, ".gigadrive");
|
|
304
|
+
const portableOutputs = {
|
|
305
|
+
pages: await Promise.all(outputs.pages.map((output) => serializeRouteOutput(repoRoot, output))),
|
|
306
|
+
...outputs.middleware ? { middleware: await serializeRouteOutput(repoRoot, outputs.middleware) } : {},
|
|
307
|
+
appPages: await Promise.all(outputs.appPages.map((output) => serializeRouteOutput(repoRoot, output))),
|
|
308
|
+
pagesApi: await Promise.all(outputs.pagesApi.map((output) => serializeRouteOutput(repoRoot, output))),
|
|
309
|
+
appRoutes: await Promise.all(outputs.appRoutes.map((output) => serializeRouteOutput(repoRoot, output))),
|
|
310
|
+
prerenders: await Promise.all(
|
|
311
|
+
outputs.prerenders.map(async (output) => {
|
|
312
|
+
const { bypassFor, ...prerenderConfig } = output.config;
|
|
313
|
+
return {
|
|
314
|
+
id: output.id,
|
|
315
|
+
type: "PRERENDER",
|
|
316
|
+
pathname: output.pathname,
|
|
317
|
+
parentOutputId: output.parentOutputId,
|
|
318
|
+
groupId: output.groupId,
|
|
319
|
+
...output.pprChain ? { pprChain: output.pprChain } : {},
|
|
320
|
+
...output.parentFallbackMode !== void 0 ? { parentFallbackMode: toJsonValue(output.parentFallbackMode) } : {},
|
|
321
|
+
...output.fallback ? {
|
|
322
|
+
fallback: {
|
|
323
|
+
...output.fallback.filePath ? { filePath: await requireReadableFile(repoRoot, output.fallback.filePath) } : {},
|
|
324
|
+
...output.fallback.initialStatus !== void 0 ? { initialStatus: output.fallback.initialStatus } : {},
|
|
325
|
+
...output.fallback.initialHeaders ? { initialHeaders: output.fallback.initialHeaders } : {},
|
|
326
|
+
...output.fallback.initialExpiration !== void 0 ? { initialExpiration: output.fallback.initialExpiration } : {},
|
|
327
|
+
...output.fallback.initialRevalidate !== void 0 ? { initialRevalidate: output.fallback.initialRevalidate } : {},
|
|
328
|
+
...output.fallback.postponedState !== void 0 ? { postponedState: output.fallback.postponedState } : {}
|
|
329
|
+
}
|
|
330
|
+
} : {},
|
|
331
|
+
config: {
|
|
332
|
+
...prerenderConfig,
|
|
333
|
+
...bypassFor ? { bypassFor: toJsonValue(bypassFor) } : {}
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
})
|
|
337
|
+
),
|
|
338
|
+
staticFiles: await Promise.all(outputs.staticFiles.map((output) => serializeStaticOutput(repoRoot, output)))
|
|
339
|
+
};
|
|
340
|
+
const executableOutputs = [
|
|
341
|
+
...portableOutputs.pages,
|
|
342
|
+
...portableOutputs.pagesApi,
|
|
343
|
+
...portableOutputs.appPages,
|
|
344
|
+
...portableOutputs.appRoutes,
|
|
345
|
+
...portableOutputs.middleware ? [portableOutputs.middleware] : []
|
|
346
|
+
];
|
|
347
|
+
const entrypointPlan = buildEntrypointPlan(executableOutputs);
|
|
348
|
+
await writeEntrypointWrappers(projectDir, repoRoot, entrypointPlan.entrypoints);
|
|
349
|
+
const images = normalizeImages(config);
|
|
66
350
|
const manifest = {
|
|
67
|
-
version:
|
|
68
|
-
output,
|
|
351
|
+
version: 2,
|
|
352
|
+
mode: config.output === "export" ? "export" : "adapter-v2",
|
|
69
353
|
distDir: toPortableRelativePath(projectDir, distDir),
|
|
70
|
-
repoRootToProject: toPortableRelativePath(repoRoot, projectDir),
|
|
354
|
+
repoRootToProject: toPortableRelativePath(repoRoot, projectDir, true),
|
|
71
355
|
nextVersion,
|
|
72
|
-
buildId
|
|
356
|
+
buildId,
|
|
357
|
+
config: {
|
|
358
|
+
basePath: config.basePath,
|
|
359
|
+
trailingSlash: config.trailingSlash,
|
|
360
|
+
cacheComponents: config.cacheComponents,
|
|
361
|
+
...config.i18n ? { i18n: toJsonValue(config.i18n) } : {},
|
|
362
|
+
...images ? { images } : {}
|
|
363
|
+
},
|
|
364
|
+
routing: {
|
|
365
|
+
beforeMiddleware: toJsonValue(routing.beforeMiddleware),
|
|
366
|
+
beforeFiles: toJsonValue(routing.beforeFiles),
|
|
367
|
+
afterFiles: toJsonValue(routing.afterFiles),
|
|
368
|
+
dynamicRoutes: toJsonValue(routing.dynamicRoutes),
|
|
369
|
+
onMatch: toJsonValue(routing.onMatch),
|
|
370
|
+
fallback: toJsonValue(routing.fallback),
|
|
371
|
+
shouldNormalizeNextData: routing.shouldNormalizeNextData,
|
|
372
|
+
rsc: toJsonValue(routing.rsc)
|
|
373
|
+
},
|
|
374
|
+
outputs: portableOutputs,
|
|
375
|
+
...entrypointPlan
|
|
73
376
|
};
|
|
74
377
|
await (0, import_promises.mkdir)(metadataDirectory, { recursive: true });
|
|
75
378
|
await (0, import_promises.writeFile)(import_node_path.default.join(metadataDirectory, "nextjs.json"), `${JSON.stringify(manifest, null, 2)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/nextjs-adapter.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\ninterface NextConfig {\n output?: string;\n [key: string]: unknown;\n}\n\ninterface ModifyConfigContext {\n phase: string;\n nextVersion: string;\n}\n\ninterface BuildCompleteContext {\n projectDir: string;\n repoRoot: string;\n distDir: string;\n config: NextConfig;\n nextVersion: string;\n buildId: string;\n}\n\nexport interface GigadriveNextBuildManifest {\n version: 1;\n output: 'standalone' | 'export';\n distDir: string;\n repoRootToProject: string;\n nextVersion: string;\n buildId: string;\n}\n\nconst PRODUCTION_BUILD_PHASE = 'phase-production-build';\n\nconst toPortableRelativePath = (from: string, to: string): string => {\n const relativePath = path.relative(from, to).replaceAll(path.sep, '/');\n return relativePath === '' ? '.' : relativePath;\n};\n\n/**\n * Next.js build adapter used automatically by Gigadrive Network build workers.\n *\n * It requests standalone output without changing user-owned Next.js config and\n * records the resolved build paths for post-build Network framework detection.\n */\nconst gigadriveNextAdapter = {\n name: 'Gigadrive Network',\n\n modifyConfig(config: NextConfig, { phase }: ModifyConfigContext): NextConfig {\n if (phase !== PRODUCTION_BUILD_PHASE) {\n return config;\n }\n\n const deploymentId = config.deploymentId ?? process.env.GIGADRIVE_DEPLOYMENT_ID;\n\n return {\n ...config,\n ...(deploymentId ? { deploymentId } : {}),\n output: config.output === 'export' ? 'export' : 'standalone',\n };\n },\n\n async onBuildComplete({\n projectDir,\n repoRoot,\n distDir,\n config,\n nextVersion,\n buildId,\n }: BuildCompleteContext): Promise<void> {\n const output = config.output === 'export' ? 'export' : 'standalone';\n const metadataDirectory = path.join(projectDir, '.gigadrive');\n const manifest: GigadriveNextBuildManifest = {\n version: 1,\n output,\n distDir: toPortableRelativePath(projectDir, distDir),\n repoRootToProject: toPortableRelativePath(repoRoot, projectDir),\n nextVersion,\n buildId,\n };\n\n await mkdir(metadataDirectory, { recursive: true });\n await writeFile(path.join(metadataDirectory, 'nextjs.json'), `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n },\n};\n\nexport default gigadriveNextAdapter;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAiC;AACjC,uBAAiB;AA8BjB,IAAM,yBAAyB;AAE/B,IAAM,yBAAyB,CAAC,MAAc,OAAuB;AACnE,QAAM,eAAe,iBAAAA,QAAK,SAAS,MAAM,EAAE,EAAE,WAAW,iBAAAA,QAAK,KAAK,GAAG;AACrE,SAAO,iBAAiB,KAAK,MAAM;AACrC;AAQA,IAAM,uBAAuB;AAAA,EAC3B,MAAM;AAAA,EAEN,aAAa,QAAoB,EAAE,MAAM,GAAoC;AAC3E,QAAI,UAAU,wBAAwB;AACpC,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,OAAO,gBAAgB,QAAQ,IAAI;AAExD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,QAAQ,OAAO,WAAW,WAAW,WAAW;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAwC;AACtC,UAAM,SAAS,OAAO,WAAW,WAAW,WAAW;AACvD,UAAM,oBAAoB,iBAAAA,QAAK,KAAK,YAAY,YAAY;AAC5D,UAAM,WAAuC;AAAA,MAC3C,SAAS;AAAA,MACT;AAAA,MACA,SAAS,uBAAuB,YAAY,OAAO;AAAA,MACnD,mBAAmB,uBAAuB,UAAU,UAAU;AAAA,MAC9D;AAAA,MACA;AAAA,IACF;AAEA,cAAM,uBAAM,mBAAmB,EAAE,WAAW,KAAK,CAAC;AAClD,cAAM,2BAAU,iBAAAA,QAAK,KAAK,mBAAmB,aAAa,GAAG,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,EAC/G;AACF;AAEA,IAAO,yBAAQ;","names":["path"]}
|
|
1
|
+
{"version":3,"sources":["../src/nextjs-adapter.ts"],"sourcesContent":["import type { NextAdapter } from 'next';\nimport { access, mkdir, realpath, stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { NormalizedImagePolicy } from './image-policy';\nimport type {\n GigadriveNextBuildManifestV2,\n GigadriveNextEntrypoint,\n GigadriveNextRouteOutput,\n GigadriveNextStaticOutput,\n JsonValue,\n} from './nextjs-manifest';\n\ntype BuildCompleteContext = Parameters<NonNullable<NextAdapter['onBuildComplete']>>[0];\ntype NextRouteOutput =\n | BuildCompleteContext['outputs']['pages'][number]\n | BuildCompleteContext['outputs']['pagesApi'][number]\n | BuildCompleteContext['outputs']['appPages'][number]\n | BuildCompleteContext['outputs']['appRoutes'][number]\n | NonNullable<BuildCompleteContext['outputs']['middleware']>;\ntype NextStaticOutput = BuildCompleteContext['outputs']['staticFiles'][number];\n\nconst PRODUCTION_BUILD_PHASE = 'phase-production-build';\nconst runtimeDirectory = typeof __dirname === 'string' ? __dirname : path.dirname(fileURLToPath(import.meta.url));\n\nconst runtimeModulePath = (environmentName: string, fileName: string): string =>\n process.env[environmentName] ?? path.join(runtimeDirectory, fileName);\n\nconst CACHE_HANDLER_PATH = () => runtimeModulePath('GIGADRIVE_NEXT_CACHE_HANDLER_PATH', 'nextjs-cache-handler.js');\nconst CACHE_COMPONENTS_HANDLER_PATH = () =>\n runtimeModulePath('GIGADRIVE_NEXT_CACHE_COMPONENTS_HANDLER_PATH', 'nextjs-cache-components-handler.js');\nconst IMAGE_LOADER_PATH = () => runtimeModulePath('GIGADRIVE_NEXT_IMAGE_LOADER_PATH', 'nextjs-image-loader.js');\n\nconst toJsonValue = (value: unknown): JsonValue => {\n const serialized = JSON.stringify(value);\n return serialized === undefined ? null : (JSON.parse(serialized) as JsonValue);\n};\n\nconst isNext16OrNewer = (nextVersion: string): boolean => {\n const major = Number.parseInt(nextVersion.split('.')[0] ?? '', 10);\n return Number.isFinite(major) && major >= 16;\n};\n\nconst toPortableRelativePath = (from: string, to: string, allowCurrentDirectory = false): string => {\n const resolvedFrom = path.resolve(from);\n const resolvedTo = path.resolve(path.isAbsolute(to) ? to : path.join(from, to));\n const relativePath = path.relative(resolvedFrom, resolvedTo).replaceAll(path.sep, '/');\n const normalized = relativePath === '' ? '.' : relativePath;\n if (\n (!allowCurrentDirectory && normalized === '.') ||\n normalized.startsWith('/') ||\n /^[A-Za-z]:/.test(normalized) ||\n normalized.split('/').some((segment) => segment === '..')\n ) {\n throw new Error(`Next.js adapter output is outside the repository root: ${to}`);\n }\n return normalized;\n};\n\nasync function resolveReadablePath(repoRoot: string, filePath: string) {\n const absolutePath = path.resolve(path.isAbsolute(filePath) ? filePath : path.join(repoRoot, filePath));\n const portablePath = toPortableRelativePath(repoRoot, absolutePath);\n await access(absolutePath);\n const resolvedPath = await realpath(absolutePath);\n toPortableRelativePath(repoRoot, resolvedPath);\n const fileStat = await stat(absolutePath);\n return { portablePath, fileStat };\n}\n\nasync function requireReadableFile(repoRoot: string, filePath: string): Promise<string> {\n const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath);\n if (!fileStat.isFile()) throw new Error(`Next.js adapter output is not a readable file: ${filePath}`);\n return portablePath;\n}\n\nasync function requireReadableAsset(repoRoot: string, filePath: string): Promise<string> {\n const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath);\n if (!fileStat.isFile() && !fileStat.isDirectory()) {\n throw new Error(`Next.js adapter asset is not a readable file or directory: ${filePath}`);\n }\n return portablePath;\n}\n\nasync function serializeFileMap(repoRoot: string, files: Record<string, string>): Promise<Record<string, string>> {\n const entries = await Promise.all(\n Object.entries(files).map(async ([targetPath, sourcePath]) => [\n toPortableRelativePath(repoRoot, targetPath),\n await requireReadableAsset(repoRoot, sourcePath),\n ])\n );\n return Object.fromEntries(entries);\n}\n\nconst serializeRouteOutput = async (repoRoot: string, output: NextRouteOutput): Promise<GigadriveNextRouteOutput> => {\n const matchers = (\n output.config as typeof output.config & {\n matchers?: Array<{\n source: string;\n sourceRegex: string;\n has?: unknown[];\n missing?: unknown[];\n }>;\n }\n ).matchers;\n return {\n id: output.id,\n type: String(output.type) as GigadriveNextRouteOutput['type'],\n filePath: await requireReadableFile(repoRoot, output.filePath),\n pathname: output.pathname,\n sourcePage: output.sourcePage,\n runtime: output.runtime,\n assets: await serializeFileMap(repoRoot, output.assets),\n ...(output.wasmAssets ? { wasmAssets: await serializeFileMap(repoRoot, output.wasmAssets) } : {}),\n ...(output.edgeRuntime\n ? {\n edgeRuntime: {\n modulePath: await requireReadableFile(repoRoot, output.edgeRuntime.modulePath),\n entryKey: output.edgeRuntime.entryKey,\n handlerExport: output.edgeRuntime.handlerExport,\n },\n }\n : {}),\n config: {\n maxDuration: output.config.maxDuration,\n preferredRegion: output.config.preferredRegion,\n env: output.config.env,\n ...(matchers\n ? {\n matchers: matchers.map((matcher) => ({\n source: matcher.source,\n sourceRegex: matcher.sourceRegex,\n ...(matcher.has ? { has: toJsonValue(matcher.has) as JsonValue[] } : {}),\n ...(matcher.missing ? { missing: toJsonValue(matcher.missing) as JsonValue[] } : {}),\n })),\n }\n : {}),\n },\n };\n};\n\nconst serializeStaticOutput = async (\n repoRoot: string,\n output: NextStaticOutput\n): Promise<GigadriveNextStaticOutput> => ({\n id: output.id,\n type: 'STATIC_FILE',\n filePath: await requireReadableFile(repoRoot, output.filePath),\n pathname: output.pathname,\n ...(output.immutableHash ? { immutableHash: output.immutableHash } : {}),\n});\n\nconst buildEntrypointPlan = (\n outputs: GigadriveNextRouteOutput[]\n): Pick<GigadriveNextBuildManifestV2, 'entrypoints' | 'outputEntrypoints'> => {\n const byIdentity = new Map<string, GigadriveNextEntrypoint>();\n const outputEntrypoints: Record<string, string> = {};\n\n for (const output of outputs) {\n const identity = JSON.stringify([\n output.runtime,\n output.filePath,\n output.edgeRuntime?.modulePath,\n output.edgeRuntime?.entryKey,\n output.edgeRuntime?.handlerExport,\n ]);\n const existingEntrypoint = byIdentity.get(identity);\n const entrypoint: GigadriveNextEntrypoint = existingEntrypoint ?? {\n id: `next-${byIdentity.size}`,\n runtime: output.runtime,\n filePath: output.filePath,\n outputIds: [],\n assets: { ...output.assets },\n ...(output.wasmAssets ? { wasmAssets: { ...output.wasmAssets } } : {}),\n ...(output.edgeRuntime ? { edgeRuntime: { ...output.edgeRuntime } } : {}),\n config: {\n maxDuration: output.config.maxDuration,\n preferredRegion: output.config.preferredRegion,\n env: output.config.env,\n },\n };\n if (!existingEntrypoint) {\n byIdentity.set(identity, entrypoint);\n } else {\n Object.assign(entrypoint.assets, output.assets);\n if (output.wasmAssets) entrypoint.wasmAssets = { ...entrypoint.wasmAssets, ...output.wasmAssets };\n if (output.config.maxDuration !== undefined) {\n entrypoint.config.maxDuration = Math.max(entrypoint.config.maxDuration ?? 0, output.config.maxDuration);\n }\n }\n entrypoint.outputIds.push(output.id);\n outputEntrypoints[output.id] = entrypoint.id;\n }\n\n return { entrypoints: [...byIdentity.values()], outputEntrypoints };\n};\n\nconst writeEntrypointWrappers = async (\n projectDir: string,\n repoRoot: string,\n entrypoints: GigadriveNextEntrypoint[]\n): Promise<void> => {\n const wrapperDirectory = path.join(projectDir, '.gigadrive', 'nextjs', 'entrypoints');\n await mkdir(wrapperDirectory, { recursive: true });\n\n await Promise.all(\n entrypoints.map(async (entrypoint) => {\n const wrapperPath = path.join(wrapperDirectory, `${entrypoint.id}.mjs`);\n const executablePath = path.join(repoRoot, entrypoint.edgeRuntime?.modulePath ?? entrypoint.filePath);\n const relativeImport = path.relative(wrapperDirectory, executablePath).replaceAll(path.sep, '/');\n const importSpecifier = relativeImport.startsWith('.') ? relativeImport : `./${relativeImport}`;\n const source =\n entrypoint.runtime === 'edge' && entrypoint.edgeRuntime\n ? `import ${JSON.stringify(importSpecifier)};\\n\\nexport async function fetch(request) {\\n const pending = [];\\n const registry = globalThis._ENTRIES;\\n if (!registry) throw new Error('Next.js edge entry registry is unavailable');\\n const entry = await registry[${JSON.stringify(entrypoint.edgeRuntime.entryKey)}];\\n const handler = entry?.[${JSON.stringify(entrypoint.edgeRuntime.handlerExport)}];\\n if (typeof handler !== 'function') throw new Error('Next.js edge handler is unavailable');\\n const url = new URL(request.url);\\n const response = await handler(request, {\\n signal: request.signal,\\n waitUntil(promise) { pending.push(Promise.resolve(promise)); },\\n requestMeta: { hostname: url.hostname, invocationTarget: request.headers.get('x-gigadrive-next-invocation-target') ?? url.pathname, routeMatches: Object.fromEntries(new URLSearchParams(request.headers.get('x-now-route-matches') ?? '')), relativeProjectDir: ${JSON.stringify(\n toPortableRelativePath(repoRoot, projectDir, true)\n )} },\\n });\\n if (!response.body) { await Promise.allSettled(pending); return response; }\\n const reader = response.body.getReader();\\n const body = new ReadableStream({\\n async pull(controller) {\\n const result = await reader.read();\\n if (result.done) { await Promise.allSettled(pending); controller.close(); return; }\\n controller.enqueue(result.value);\\n },\\n cancel(reason) { return reader.cancel(reason); },\\n });\\n return new Response(body, response);\\n}\\n`\n : `import * as nextEntrypoint from ${JSON.stringify(importSpecifier)};\\n\\nexport default async function handler(req, res) {\\n const pending = [];\\n const nextHandler = nextEntrypoint.handler ?? nextEntrypoint.default?.handler ?? nextEntrypoint.default;\\n if (typeof nextHandler !== 'function') throw new Error('Next.js Node handler is unavailable');\\n await nextHandler(req, res, {\\n waitUntil(promise) { pending.push(Promise.resolve(promise)); },\\n requestMeta: { hostname: req.headers.host, invocationTarget: req.headers['x-gigadrive-next-invocation-target'] ?? req.url, routeMatches: Object.fromEntries(new URLSearchParams(req.headers['x-now-route-matches'] ?? '')), relativeProjectDir: ${JSON.stringify(\n toPortableRelativePath(repoRoot, projectDir, true)\n )} },\\n });\\n await Promise.allSettled(pending);\\n}\\n`;\n await writeFile(wrapperPath, source, 'utf8');\n const portableWrapperPath = toPortableRelativePath(repoRoot, wrapperPath);\n entrypoint.assets[portableWrapperPath] = portableWrapperPath;\n entrypoint.filePath = portableWrapperPath;\n })\n );\n};\n\nconst normalizeImages = (config: BuildCompleteContext['config']): NormalizedImagePolicy | undefined => {\n if (config.images.unoptimized) return undefined;\n return {\n localPatterns: config.images.localPatterns ?? [{ pathname: '/**' }],\n remotePatterns: config.images.remotePatterns.map((pattern) => {\n if (pattern instanceof URL) {\n return {\n protocol: pattern.protocol === 'http:' ? ('http' as const) : ('https' as const),\n hostname: pattern.hostname,\n port: pattern.port,\n pathname: pattern.pathname,\n search: pattern.search,\n };\n }\n return { ...pattern };\n }),\n widths: [...new Set([...config.images.deviceSizes, ...config.images.imageSizes])].sort((a, b) => a - b),\n heights: [],\n qualities: config.images.qualities ?? [75],\n formats: config.images.formats,\n minimumCacheTTL: config.images.minimumCacheTTL,\n dangerouslyAllowSVG: config.images.dangerouslyAllowSVG,\n contentSecurityPolicy: config.images.contentSecurityPolicy,\n contentDispositionType: config.images.contentDispositionType,\n maximumRedirects: config.images.maximumRedirects,\n maximumResponseBody: config.images.maximumResponseBody,\n variants: {},\n };\n};\n\n/**\n * Next.js deployment adapter used automatically by Gigadrive Network build workers.\n *\n * Next 16 emits a portable, versioned runtime plan. Older Next versions retain the\n * standalone-server behavior so existing deployments remain compatible.\n */\nconst gigadriveNextAdapter: NextAdapter = {\n name: 'Gigadrive Network',\n\n modifyConfig(config, { phase, nextVersion }) {\n if (phase !== PRODUCTION_BUILD_PHASE) return config;\n\n const deploymentId = config.deploymentId ?? process.env.GIGADRIVE_DEPLOYMENT_ID;\n if (!isNext16OrNewer(nextVersion)) {\n return {\n ...config,\n ...(deploymentId ? { deploymentId } : {}),\n output: config.output === 'export' ? 'export' : 'standalone',\n };\n }\n if (config.output === 'export') {\n return { ...config, ...(deploymentId ? { deploymentId } : {}) };\n }\n\n const injectCacheHandler = config.cacheHandler === undefined;\n const injectCacheComponentHandlers = config.cacheHandlers === undefined;\n const images = config.images;\n const injectImageLoader =\n images !== undefined && images.unoptimized !== true && images.loader === 'default' && !images.loaderFile;\n\n return {\n ...config,\n ...(deploymentId ? { deploymentId } : {}),\n ...(injectCacheHandler ? { cacheHandler: CACHE_HANDLER_PATH() } : {}),\n ...(injectCacheComponentHandlers\n ? {\n cacheHandlers: {\n default: CACHE_COMPONENTS_HANDLER_PATH(),\n remote: CACHE_COMPONENTS_HANDLER_PATH(),\n },\n }\n : {}),\n ...(injectCacheHandler || injectCacheComponentHandlers ? { cacheMaxMemorySize: 0 } : {}),\n ...(injectImageLoader\n ? {\n images: {\n ...images,\n loader: 'custom',\n loaderFile: IMAGE_LOADER_PATH(),\n },\n }\n : {}),\n };\n },\n\n async onBuildComplete({ projectDir, repoRoot, distDir, config, nextVersion, buildId, routing, outputs }) {\n const metadataDirectory = path.join(projectDir, '.gigadrive');\n const portableOutputs = {\n pages: await Promise.all(outputs.pages.map((output) => serializeRouteOutput(repoRoot, output))),\n ...(outputs.middleware ? { middleware: await serializeRouteOutput(repoRoot, outputs.middleware) } : {}),\n appPages: await Promise.all(outputs.appPages.map((output) => serializeRouteOutput(repoRoot, output))),\n pagesApi: await Promise.all(outputs.pagesApi.map((output) => serializeRouteOutput(repoRoot, output))),\n appRoutes: await Promise.all(outputs.appRoutes.map((output) => serializeRouteOutput(repoRoot, output))),\n prerenders: await Promise.all(\n outputs.prerenders.map(async (output) => {\n const { bypassFor, ...prerenderConfig } = output.config;\n return {\n id: output.id,\n type: 'PRERENDER' as const,\n pathname: output.pathname,\n parentOutputId: output.parentOutputId,\n groupId: output.groupId,\n ...(output.pprChain ? { pprChain: output.pprChain } : {}),\n ...(output.parentFallbackMode !== undefined\n ? { parentFallbackMode: toJsonValue(output.parentFallbackMode) }\n : {}),\n ...(output.fallback\n ? {\n fallback: {\n ...(output.fallback.filePath\n ? { filePath: await requireReadableFile(repoRoot, output.fallback.filePath) }\n : {}),\n ...(output.fallback.initialStatus !== undefined\n ? { initialStatus: output.fallback.initialStatus }\n : {}),\n ...(output.fallback.initialHeaders ? { initialHeaders: output.fallback.initialHeaders } : {}),\n ...(output.fallback.initialExpiration !== undefined\n ? { initialExpiration: output.fallback.initialExpiration }\n : {}),\n ...(output.fallback.initialRevalidate !== undefined\n ? { initialRevalidate: output.fallback.initialRevalidate }\n : {}),\n ...(output.fallback.postponedState !== undefined\n ? { postponedState: output.fallback.postponedState }\n : {}),\n },\n }\n : {}),\n config: {\n ...prerenderConfig,\n ...(bypassFor ? { bypassFor: toJsonValue(bypassFor) as JsonValue[] } : {}),\n },\n };\n })\n ),\n staticFiles: await Promise.all(outputs.staticFiles.map((output) => serializeStaticOutput(repoRoot, output))),\n };\n const executableOutputs = [\n ...portableOutputs.pages,\n ...portableOutputs.pagesApi,\n ...portableOutputs.appPages,\n ...portableOutputs.appRoutes,\n ...(portableOutputs.middleware ? [portableOutputs.middleware] : []),\n ];\n const entrypointPlan = buildEntrypointPlan(executableOutputs);\n await writeEntrypointWrappers(projectDir, repoRoot, entrypointPlan.entrypoints);\n const images = normalizeImages(config);\n const manifest: GigadriveNextBuildManifestV2 = {\n version: 2,\n mode: config.output === 'export' ? 'export' : 'adapter-v2',\n distDir: toPortableRelativePath(projectDir, distDir),\n repoRootToProject: toPortableRelativePath(repoRoot, projectDir, true),\n nextVersion,\n buildId,\n config: {\n basePath: config.basePath,\n trailingSlash: config.trailingSlash,\n cacheComponents: config.cacheComponents,\n ...(config.i18n ? { i18n: toJsonValue(config.i18n) } : {}),\n ...(images ? { images } : {}),\n },\n routing: {\n beforeMiddleware: toJsonValue(routing.beforeMiddleware) as JsonValue[],\n beforeFiles: toJsonValue(routing.beforeFiles) as JsonValue[],\n afterFiles: toJsonValue(routing.afterFiles) as JsonValue[],\n dynamicRoutes: toJsonValue(routing.dynamicRoutes) as JsonValue[],\n onMatch: toJsonValue(routing.onMatch) as JsonValue[],\n fallback: toJsonValue(routing.fallback) as JsonValue[],\n shouldNormalizeNextData: routing.shouldNormalizeNextData,\n rsc: toJsonValue(routing.rsc),\n },\n outputs: portableOutputs,\n ...entrypointPlan,\n };\n\n await mkdir(metadataDirectory, { recursive: true });\n await writeFile(path.join(metadataDirectory, 'nextjs.json'), `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n },\n};\n\nexport default gigadriveNextAdapter;\n"],"mappings":"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","names":["path"]}
|