@gigadrive/network-config 4.4.0 → 4.5.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/dist/index.d.mts +295 -107
- package/dist/index.d.ts +295 -107
- package/dist/index.js +418 -196
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +302 -93
- package/dist/index.mjs.map +1 -1
- package/dist/nextjs-adapter.js +188 -9
- package/dist/nextjs-adapter.js.map +1 -1
- package/dist/nextjs-adapter.mjs +189 -10
- package/dist/nextjs-adapter.mjs.map +1 -1
- package/package.json +1 -1
package/dist/nextjs-adapter.mjs
CHANGED
|
@@ -1,9 +1,59 @@
|
|
|
1
1
|
// src/nextjs-adapter.ts
|
|
2
|
-
import {
|
|
2
|
+
import { Schema as Schema2 } from "effect";
|
|
3
|
+
import { access, mkdir, readFile, realpath, stat, writeFile } from "fs/promises";
|
|
3
4
|
import { createRequire } from "module";
|
|
4
5
|
import path from "path";
|
|
5
6
|
import { fileURLToPath } from "url";
|
|
7
|
+
|
|
8
|
+
// src/manifest-schema.ts
|
|
9
|
+
import { Option, Schema } from "effect";
|
|
10
|
+
var HTTP_HEADER_NAME = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
11
|
+
var HTTP_HEADER_VALUE = /^[\t\x20-\x7e\x80-\xff]*$/;
|
|
12
|
+
var URL_PATHNAME_FORBIDDEN_CHARACTER = /[\x00-\x1f\x7f?#\\]/;
|
|
13
|
+
var isUrlDotSegment = (segment) => {
|
|
14
|
+
const decodedDots = segment.replace(/%2e/gi, ".");
|
|
15
|
+
return decodedDots === "." || decodedDots === "..";
|
|
16
|
+
};
|
|
17
|
+
var isPortableRelativePath = (value, allowCurrentDirectory = false) => {
|
|
18
|
+
const normalized = value.replaceAll("\\", "/").replace(/^\.\//, "").replace(/\/+$/, "");
|
|
19
|
+
return (allowCurrentDirectory || normalized !== "" && normalized !== ".") && !normalized.startsWith("/") && !/^[A-Za-z]:/.test(normalized) && !normalized.includes(":") && !normalized.split("/").includes("..");
|
|
20
|
+
};
|
|
21
|
+
var PortableRelativePathSchema = Schema.String.pipe(Schema.filter((value) => isPortableRelativePath(value)));
|
|
22
|
+
var RepositoryRelativePathSchema = Schema.String.pipe(
|
|
23
|
+
Schema.filter((value) => isPortableRelativePath(value, true))
|
|
24
|
+
);
|
|
25
|
+
var UrlPathnameSchema = Schema.String.pipe(
|
|
26
|
+
Schema.filter(
|
|
27
|
+
(value) => value.startsWith("/") && !URL_PATHNAME_FORBIDDEN_CHARACTER.test(value) && !value.split("/").some(isUrlDotSegment)
|
|
28
|
+
)
|
|
29
|
+
);
|
|
30
|
+
var HttpHeaderValueSchema = Schema.String.pipe(Schema.pattern(HTTP_HEADER_VALUE));
|
|
31
|
+
var HttpHeadersSchema = Schema.mutable(
|
|
32
|
+
Schema.Record({
|
|
33
|
+
key: Schema.String,
|
|
34
|
+
value: Schema.Union(HttpHeaderValueSchema, Schema.mutable(Schema.Array(HttpHeaderValueSchema)))
|
|
35
|
+
})
|
|
36
|
+
).pipe(Schema.filter((headers) => Object.keys(headers).every((name) => HTTP_HEADER_NAME.test(name))));
|
|
37
|
+
var HttpSingleValueHeadersSchema = Schema.mutable(
|
|
38
|
+
Schema.Record({ key: Schema.String, value: HttpHeaderValueSchema })
|
|
39
|
+
).pipe(Schema.filter((headers) => Object.keys(headers).every((name) => HTTP_HEADER_NAME.test(name))));
|
|
40
|
+
var decodeUnknown = (schema, value) => Schema.decodeUnknownOption(schema, { onExcessProperty: "preserve" })(value).pipe(Option.getOrUndefined);
|
|
41
|
+
var decodeJson = (schema, content) => decodeUnknown(Schema.parseJson(schema), content);
|
|
42
|
+
|
|
43
|
+
// src/nextjs-constants.ts
|
|
44
|
+
var MAXIMUM_ENTRY_PAGE_PATHS = 50;
|
|
45
|
+
|
|
46
|
+
// src/nextjs-adapter.ts
|
|
6
47
|
var PRODUCTION_BUILD_PHASE = "phase-production-build";
|
|
48
|
+
var NEXT_ASSET_MANIFEST_PATH = ".gigadrive/assets/nextjs.json";
|
|
49
|
+
var NEXT_PRERENDER_MANIFEST_PATH = ".gigadrive/nextjs-prerenders.json";
|
|
50
|
+
var HTML_CONTENT_TYPE = "text/html; charset=utf-8";
|
|
51
|
+
var DEFAULT_RSC_CONTENT_TYPE = "text/x-component";
|
|
52
|
+
var INTERNAL_STATIC_RESPONSE_HEADERS = /* @__PURE__ */ new Set(["x-next-cache-tags", "x-nextjs-prerender"]);
|
|
53
|
+
var NextStaticFileMetaSchema = Schema2.Struct({
|
|
54
|
+
status: Schema2.optional(Schema2.Int.pipe(Schema2.between(100, 599))),
|
|
55
|
+
headers: Schema2.mutable(Schema2.Record({ key: Schema2.String, value: Schema2.Unknown }))
|
|
56
|
+
});
|
|
7
57
|
var runtimeDirectory = typeof __dirname === "string" ? __dirname : path.dirname(fileURLToPath(import.meta.url));
|
|
8
58
|
var runtimeModulePath = (environmentName, fileName) => process.env[environmentName] ?? path.join(runtimeDirectory, fileName);
|
|
9
59
|
var CACHE_HANDLER_PATH = () => runtimeModulePath("GIGADRIVE_NEXT_CACHE_HANDLER_PATH", "nextjs-cache-handler.js");
|
|
@@ -31,21 +81,123 @@ var toPortableRelativePath = (from, to, allowCurrentDirectory = false) => {
|
|
|
31
81
|
}
|
|
32
82
|
return normalized;
|
|
33
83
|
};
|
|
34
|
-
async function resolveReadablePath(repoRoot, filePath) {
|
|
84
|
+
async function resolveReadablePath(repoRoot, filePath, resolvedRoot) {
|
|
35
85
|
const absolutePath = path.resolve(path.isAbsolute(filePath) ? filePath : path.join(repoRoot, filePath));
|
|
36
86
|
const portablePath = toPortableRelativePath(repoRoot, absolutePath);
|
|
37
87
|
await access(absolutePath);
|
|
38
88
|
const resolvedPath = await realpath(absolutePath);
|
|
39
|
-
void toPortableRelativePath(repoRoot, resolvedPath);
|
|
89
|
+
void toPortableRelativePath(resolvedRoot ?? await realpath(repoRoot), resolvedPath);
|
|
40
90
|
const fileStat = await stat(absolutePath);
|
|
41
91
|
return { portablePath, fileStat };
|
|
42
92
|
}
|
|
43
|
-
async function requireReadableFile(repoRoot, filePath) {
|
|
44
|
-
const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath);
|
|
93
|
+
async function requireReadableFile(repoRoot, filePath, resolvedRoot) {
|
|
94
|
+
const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath, resolvedRoot);
|
|
45
95
|
if (!fileStat.isFile()) throw new Error(`Next.js adapter output is not a readable file: ${filePath}`);
|
|
46
96
|
return portablePath;
|
|
47
97
|
}
|
|
48
|
-
|
|
98
|
+
async function mapInBatches(values, mapper, batchSize = 64) {
|
|
99
|
+
const results = [];
|
|
100
|
+
for (let index = 0; index < values.length; index += batchSize) {
|
|
101
|
+
results.push(...await Promise.all(values.slice(index, index + batchSize).map((value) => mapper(value))));
|
|
102
|
+
}
|
|
103
|
+
return results;
|
|
104
|
+
}
|
|
105
|
+
var isInsideDirectory = (directory, filePath) => {
|
|
106
|
+
const relativePath = path.relative(path.resolve(directory), path.resolve(filePath));
|
|
107
|
+
return relativePath !== "" && !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
|
|
108
|
+
};
|
|
109
|
+
var isDynamicRoutePathname = (pathname) => pathname.includes("[");
|
|
110
|
+
var normalizeStaticFilePathname = (pathname, basePath) => pathname === `${basePath}/index` ? basePath || "/" : pathname;
|
|
111
|
+
var getStaticStatus = (pathname, basePath, locales) => {
|
|
112
|
+
const routePathname = basePath && pathname.startsWith(`${basePath}/`) ? pathname.slice(basePath.length) : pathname;
|
|
113
|
+
const segments = routePathname.split("/").filter(Boolean);
|
|
114
|
+
const [firstSegment, secondSegment] = segments;
|
|
115
|
+
const statusPage = segments.length === 1 ? firstSegment : segments.length === 2 && firstSegment && locales.includes(firstSegment) ? secondSegment : void 0;
|
|
116
|
+
return statusPage === "404" ? 404 : statusPage === "500" ? 500 : void 0;
|
|
117
|
+
};
|
|
118
|
+
var hasContentType = (headers) => Object.keys(headers).some((name) => name.toLowerCase() === "content-type");
|
|
119
|
+
var getPublicStaticResponseHeaders = (headers) => {
|
|
120
|
+
const publicHeaders = Object.fromEntries(
|
|
121
|
+
Object.entries(headers).filter(([name]) => !INTERNAL_STATIC_RESPONSE_HEADERS.has(name.toLowerCase()))
|
|
122
|
+
);
|
|
123
|
+
return decodeUnknown(HttpHeadersSchema, publicHeaders);
|
|
124
|
+
};
|
|
125
|
+
async function getStaticFileResponseMetadata(projectDir, resolvedProjectDir, output, rscContentType, basePath, locales) {
|
|
126
|
+
if (output.filePath.endsWith(".body")) {
|
|
127
|
+
const metaPath = `${output.filePath.slice(0, -".body".length)}.meta`;
|
|
128
|
+
await requireReadableFile(projectDir, metaPath, resolvedProjectDir);
|
|
129
|
+
const meta = decodeJson(NextStaticFileMetaSchema, await readFile(metaPath, "utf8"));
|
|
130
|
+
const headers = meta ? getPublicStaticResponseHeaders(meta.headers) : void 0;
|
|
131
|
+
if (!meta || !headers || !hasContentType(headers)) return void 0;
|
|
132
|
+
return {
|
|
133
|
+
...meta.status !== void 0 ? { status: meta.status } : {},
|
|
134
|
+
headers
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (output.filePath.endsWith(".html")) {
|
|
138
|
+
const status = getStaticStatus(output.pathname, basePath, locales);
|
|
139
|
+
return {
|
|
140
|
+
...status !== void 0 ? { status } : {},
|
|
141
|
+
headers: { "content-type": HTML_CONTENT_TYPE }
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (output.pathname.endsWith(".rsc")) return { headers: { "content-type": rscContentType } };
|
|
145
|
+
return {};
|
|
146
|
+
}
|
|
147
|
+
var serializeStaticFileAsset = async (projectDir, resolvedProjectDir, basePath, rscContentType, locales, output) => {
|
|
148
|
+
const [source, responseMetadata] = await Promise.all([
|
|
149
|
+
requireReadableFile(projectDir, output.filePath, resolvedProjectDir),
|
|
150
|
+
getStaticFileResponseMetadata(projectDir, resolvedProjectDir, output, rscContentType, basePath, locales)
|
|
151
|
+
]);
|
|
152
|
+
if (!responseMetadata) return void 0;
|
|
153
|
+
return {
|
|
154
|
+
source,
|
|
155
|
+
path: normalizeStaticFilePathname(output.pathname, basePath),
|
|
156
|
+
...responseMetadata,
|
|
157
|
+
...output.immutableHash ? { immutable: true } : {}
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
var serializePrerenderAsset = (projectDir, repoRoot, distDir, output) => {
|
|
161
|
+
const { fallback } = output;
|
|
162
|
+
const hasNoTimeBasedRevalidation = fallback?.initialRevalidate === false;
|
|
163
|
+
if (!fallback?.filePath || !hasNoTimeBasedRevalidation || fallback.postponedState !== void 0 || output.config.bypassFor !== void 0 || isInsideDirectory(path.join(distDir, "server", "pages"), path.resolve(repoRoot, fallback.filePath)) || isDynamicRoutePathname(output.pathname)) {
|
|
164
|
+
return void 0;
|
|
165
|
+
}
|
|
166
|
+
const headers = fallback.initialHeaders ? getPublicStaticResponseHeaders(fallback.initialHeaders) : void 0;
|
|
167
|
+
return {
|
|
168
|
+
source: toPortableRelativePath(projectDir, path.join(repoRoot, fallback.filePath)),
|
|
169
|
+
path: output.pathname,
|
|
170
|
+
...fallback.initialStatus !== void 0 ? { status: fallback.initialStatus } : {},
|
|
171
|
+
...headers ? { headers } : {}
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
async function serializeAssetManifest(projectDir, resolvedProjectDir, repoRoot, distDir, basePath, rscContentType, locales, staticFiles, prerenders) {
|
|
175
|
+
const staticDirectory = path.join(distDir, "static");
|
|
176
|
+
const staticEntries = await mapInBatches(
|
|
177
|
+
staticFiles.filter(
|
|
178
|
+
// The complete immutable subtree is already represented by a prefix.
|
|
179
|
+
(output) => !isInsideDirectory(staticDirectory, output.filePath) && !isDynamicRoutePathname(output.pathname)
|
|
180
|
+
),
|
|
181
|
+
(output) => serializeStaticFileAsset(projectDir, resolvedProjectDir, basePath, rscContentType, locales, output)
|
|
182
|
+
);
|
|
183
|
+
const entries = [
|
|
184
|
+
...staticEntries,
|
|
185
|
+
...prerenders.map((output) => serializePrerenderAsset(projectDir, repoRoot, distDir, output))
|
|
186
|
+
];
|
|
187
|
+
const assetsByPath = /* @__PURE__ */ new Map();
|
|
188
|
+
for (const entry of entries) {
|
|
189
|
+
if (!entry) continue;
|
|
190
|
+
if (assetsByPath.has(entry.path)) throw new Error(`Duplicate Next.js static asset path: ${entry.path}`);
|
|
191
|
+
assetsByPath.set(entry.path, entry);
|
|
192
|
+
}
|
|
193
|
+
return { version: 1, assets: [...assetsByPath.values()] };
|
|
194
|
+
}
|
|
195
|
+
var getEntryPagePaths = (prerenders) => [
|
|
196
|
+
...new Set(
|
|
197
|
+
prerenders.filter((output) => output.fallback?.postponedState === void 0).map((output) => output.pathname).filter((pathname) => pathname.startsWith("/") && !isDynamicRoutePathname(pathname))
|
|
198
|
+
)
|
|
199
|
+
].sort((left, right) => left.split("/").length - right.split("/").length || left.localeCompare(right)).slice(0, MAXIMUM_ENTRY_PAGE_PATHS);
|
|
200
|
+
var serializePrerenderOutput = async (repoRoot, resolvedRepoRoot, output) => {
|
|
49
201
|
const { bypassFor, ...prerenderConfig } = output.config;
|
|
50
202
|
return {
|
|
51
203
|
id: output.id,
|
|
@@ -57,7 +209,7 @@ var serializePrerenderOutput = async (repoRoot, output) => {
|
|
|
57
209
|
...output.parentFallbackMode !== void 0 ? { parentFallbackMode: toJsonValue(output.parentFallbackMode) } : {},
|
|
58
210
|
...output.fallback ? {
|
|
59
211
|
fallback: {
|
|
60
|
-
...output.fallback.filePath ? { filePath: await requireReadableFile(repoRoot, output.fallback.filePath) } : {},
|
|
212
|
+
...output.fallback.filePath ? { filePath: await requireReadableFile(repoRoot, output.fallback.filePath, resolvedRepoRoot) } : {},
|
|
61
213
|
...output.fallback.initialStatus !== void 0 ? { initialStatus: output.fallback.initialStatus } : {},
|
|
62
214
|
...output.fallback.initialHeaders ? { initialHeaders: output.fallback.initialHeaders } : {},
|
|
63
215
|
...output.fallback.initialExpiration !== void 0 ? { initialExpiration: output.fallback.initialExpiration } : {},
|
|
@@ -227,9 +379,30 @@ var gigadriveNextAdapter = {
|
|
|
227
379
|
if (config.output === "standalone") {
|
|
228
380
|
await ensureStandaloneServerTraces(projectDir, repoRoot, distDir, config);
|
|
229
381
|
}
|
|
230
|
-
const
|
|
231
|
-
|
|
382
|
+
const [resolvedRepoRoot, resolvedProjectDir] = await Promise.all([realpath(repoRoot), realpath(projectDir)]);
|
|
383
|
+
const prerenders = await mapInBatches(
|
|
384
|
+
outputs.prerenders,
|
|
385
|
+
(output) => serializePrerenderOutput(repoRoot, resolvedRepoRoot, output)
|
|
232
386
|
);
|
|
387
|
+
const assetManifest = await serializeAssetManifest(
|
|
388
|
+
projectDir,
|
|
389
|
+
resolvedProjectDir,
|
|
390
|
+
repoRoot,
|
|
391
|
+
distDir,
|
|
392
|
+
config.basePath,
|
|
393
|
+
routing.rsc.contentTypeHeader ?? DEFAULT_RSC_CONTENT_TYPE,
|
|
394
|
+
config.i18n?.locales ?? [],
|
|
395
|
+
outputs.staticFiles,
|
|
396
|
+
prerenders
|
|
397
|
+
);
|
|
398
|
+
const prerenderManifest = { version: 1, prerenders };
|
|
399
|
+
await mkdir(path.join(metadataDirectory, "assets"), { recursive: true });
|
|
400
|
+
await Promise.all([
|
|
401
|
+
writeFile(path.join(projectDir, NEXT_ASSET_MANIFEST_PATH), `${JSON.stringify(assetManifest)}
|
|
402
|
+
`, "utf8"),
|
|
403
|
+
writeFile(path.join(projectDir, NEXT_PRERENDER_MANIFEST_PATH), `${JSON.stringify(prerenderManifest)}
|
|
404
|
+
`, "utf8")
|
|
405
|
+
]);
|
|
233
406
|
const server = aggregateServerDescriptor([
|
|
234
407
|
...outputs.pages,
|
|
235
408
|
...outputs.pagesApi,
|
|
@@ -266,7 +439,13 @@ var gigadriveNextAdapter = {
|
|
|
266
439
|
shouldNormalizeNextData: routing.shouldNormalizeNextData,
|
|
267
440
|
rsc: toJsonValue(routing.rsc)
|
|
268
441
|
},
|
|
269
|
-
outputs: {
|
|
442
|
+
outputs: {
|
|
443
|
+
prerenders: [],
|
|
444
|
+
prerenderManifest: NEXT_PRERENDER_MANIFEST_PATH,
|
|
445
|
+
assetManifest: NEXT_ASSET_MANIFEST_PATH,
|
|
446
|
+
entryPagePaths: getEntryPagePaths(prerenders),
|
|
447
|
+
staticAssets
|
|
448
|
+
}
|
|
270
449
|
};
|
|
271
450
|
await writeManifest(manifest);
|
|
272
451
|
}
|
|
@@ -1 +1 @@
|
|
|
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 { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { NormalizedImagePolicy } from './image-policy';\nimport type {\n GigadriveNextBuildManifestV1,\n GigadriveNextBuildManifestV2Export,\n GigadriveNextBuildManifestV2Standalone,\n GigadriveNextPrerenderOutput,\n GigadriveNextServerDescriptor,\n GigadriveNextStaticAssetPrefix,\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 NextPrerenderOutput = BuildCompleteContext['outputs']['prerenders'][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\n/**\n * Next 16.2 introduced the adapter hooks (`modifyConfig` + `onBuildComplete`) and\n * the `cacheHandler`/`cacheHandlers`/`cacheComponents` config fields we inject.\n * Earlier releases keep the legacy standalone-only behavior with no injection.\n */\nconst supportsManagedRuntime = (nextVersion: string | undefined): boolean => {\n if (!nextVersion) return false;\n const [majorPart, minorPart] = nextVersion.split('.');\n const major = Number.parseInt(majorPart ?? '', 10);\n const minor = Number.parseInt(minorPart ?? '', 10);\n return Number.isFinite(major) && Number.isFinite(minor) && (major > 16 || (major === 16 && minor >= 2));\n};\n\n/**\n * Highest Next major validated to allow `output: 'standalone'` together with an\n * adapter. Next's own build source warns the combination \"might not be allowed\"\n * in a future release. We always emit `output: 'standalone'` on the managed path\n * (there is no per-route fallback to degrade to), so if a future major forbids\n * it the build fails loudly at `next build` rather than silently misdeploying.\n * The network canary drift test tracks releases past this bound.\n */\nconst MANAGED_STANDALONE_VALIDATED_MAX_MAJOR = 16;\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 // Validate the symlink-resolved location as well; the call throws when the\n // real path escapes the repository root.\n const resolvedPath = await realpath(absolutePath);\n void 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\nconst serializePrerenderOutput = async (\n repoRoot: string,\n output: NextPrerenderOutput\n): Promise<GigadriveNextPrerenderOutput> => {\n const { bypassFor, ...prerenderConfig } = output.config;\n return {\n id: output.id,\n type: 'PRERENDER',\n pathname: output.pathname,\n parentOutputId: output.parentOutputId,\n groupId: output.groupId,\n ...(output.pprChain ? { pprChain: output.pprChain } : {}),\n ...(output.parentFallbackMode !== undefined ? { parentFallbackMode: toJsonValue(output.parentFallbackMode) } : {}),\n ...(output.fallback\n ? {\n fallback: {\n ...(output.fallback.filePath\n ? { filePath: await requireReadableFile(repoRoot, output.fallback.filePath) }\n : {}),\n ...(output.fallback.initialStatus !== undefined ? { initialStatus: output.fallback.initialStatus } : {}),\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 ? { postponedState: output.fallback.postponedState } : {}),\n },\n }\n : {}),\n config: {\n ...prerenderConfig,\n ...(bypassFor ? { bypassFor: toJsonValue(bypassFor) as JsonValue[] } : {}),\n },\n };\n};\n\n/**\n * Collapses per-route runtime config onto the one standalone server. `maxDuration`\n * becomes the max across routes (one function honors one limit); `env` is the union\n * of every route's declared env (the single server runs them all in-process).\n */\nconst aggregateServerDescriptor = (outputs: NextRouteOutput[]): GigadriveNextServerDescriptor => {\n let maxDuration: number | undefined;\n const env: Record<string, string> = {};\n for (const output of outputs) {\n if (output.config.maxDuration !== undefined) {\n maxDuration = Math.max(maxDuration ?? 0, output.config.maxDuration);\n }\n if (output.config.env) Object.assign(env, output.config.env);\n }\n return {\n ...(maxDuration !== undefined ? { maxDuration } : {}),\n ...(Object.keys(env).length > 0 ? { env } : {}),\n };\n};\n\ntype CollectBuildTracesModule = {\n collectBuildTraces: (options: {\n dir: string;\n config: BuildCompleteContext['config'];\n distDir: string;\n edgeRuntimeRoutes: Record<string, never>;\n staticPages: string[];\n outputFileTracingRoot: string;\n }) => Promise<void>;\n};\n\n/**\n * Next 16.3 stopped emitting the aggregated `next-server.js.nft.json` /\n * `next-minimal-server.js.nft.json` traces from Turbopack builds whenever an\n * adapter is configured, yet `next build` still runs the `output: 'standalone'`\n * writer after `onBuildComplete` — and that writer reads exactly this file, so\n * the build dies with ENOENT. Next 16.2 and all webpack builds still emit the\n * file, making this a no-op there. When the file is missing, regenerate both\n * aggregate traces with Next's own `collectBuildTraces` (the module the webpack\n * pipeline runs); without `buildTraceContext` it only writes the two aggregate\n * trace files and leaves Turbopack's per-entry traces untouched.\n */\nasync function ensureStandaloneServerTraces(\n projectDir: string,\n repoRoot: string,\n distDir: string,\n config: BuildCompleteContext['config']\n): Promise<void> {\n const aggregateTracePath = path.join(distDir, 'next-server.js.nft.json');\n try {\n await access(aggregateTracePath);\n return;\n } catch {\n // Missing — Next will crash in its standalone writer unless we regenerate it.\n }\n let collectBuildTracesModule: CollectBuildTracesModule;\n try {\n const projectRequire = createRequire(path.join(projectDir, 'package.json'));\n collectBuildTracesModule = projectRequire('next/dist/build/collect-build-traces') as CollectBuildTracesModule;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Next.js did not emit ${aggregateTracePath} and the Gigadrive adapter could not load ` +\n `next/dist/build/collect-build-traces from the project to regenerate it: ${message}`\n );\n }\n try {\n await collectBuildTracesModule.collectBuildTraces({\n dir: projectDir,\n config,\n distDir,\n edgeRuntimeRoutes: {},\n staticPages: [],\n outputFileTracingRoot: (config as { outputFileTracingRoot?: string }).outputFileTracingRoot ?? repoRoot,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Regenerating the Next.js standalone server traces (${aggregateTracePath}) failed: ${message}`);\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.2 and newer run the entire deployment as a single `output: 'standalone'`\n * server (one function per deployment) while the injected cache handlers, image\n * loader, and this hook's `onBuildComplete` metadata keep ISR, PPR, `use cache`,\n * and image optimization working through the platform's durable runtime-cache and\n * edge image services. Older releases retain the legacy standalone behavior without\n * the managed-runtime injections.\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 (!supportsManagedRuntime(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 // Run the whole deployment as one standalone Next server rather than a\n // serverless function per route. `onBuildComplete` still fires under\n // standalone (Next >= 16.2), and the standalone server natively honors the\n // injected cache handlers and resumes PPR from its incremental cache, so\n // ISR/PPR/`use cache` stay durable via the remote runtime-cache service.\n // Validated on Next 16.2.x (see MANAGED_STANDALONE_VALIDATED_MAX_MAJOR);\n // a future major that forbids adapter + standalone fails loudly at build.\n output: 'standalone',\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 await mkdir(metadataDirectory, { recursive: true });\n const manifestPath = path.join(metadataDirectory, 'nextjs.json');\n const writeManifest = (manifest: unknown) =>\n writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n\n if (!supportsManagedRuntime(nextVersion)) {\n const manifest: GigadriveNextBuildManifestV1 = {\n version: 1,\n output: config.output === 'export' ? 'export' : 'standalone',\n distDir: toPortableRelativePath(projectDir, distDir),\n repoRootToProject: toPortableRelativePath(repoRoot, projectDir, true),\n nextVersion,\n buildId,\n };\n await writeManifest(manifest);\n return;\n }\n\n const portableDistDir = toPortableRelativePath(projectDir, distDir);\n const repoRootToProject = toPortableRelativePath(repoRoot, projectDir, true);\n\n if (config.output === 'export') {\n const manifest: GigadriveNextBuildManifestV2Export = {\n version: 2,\n mode: 'export',\n distDir: portableDistDir,\n repoRootToProject,\n nextVersion,\n buildId,\n };\n await writeManifest(manifest);\n return;\n }\n\n if (config.output === 'standalone') {\n await ensureStandaloneServerTraces(projectDir, repoRoot, distDir, config);\n }\n\n const prerenders = await Promise.all(\n outputs.prerenders.map((output) => serializePrerenderOutput(repoRoot, output))\n );\n const server = aggregateServerDescriptor([\n ...outputs.pages,\n ...outputs.pagesApi,\n ...outputs.appPages,\n ...outputs.appRoutes,\n ...(outputs.middleware ? [outputs.middleware] : []),\n ]);\n const images = normalizeImages(config);\n // `.next/static` is thousands of content-hashed, immutable chunks. Register\n // the whole subtree as one edge-served prefix instead of enumerating files.\n const staticAssets: GigadriveNextStaticAssetPrefix[] = [\n { sourceDir: `${portableDistDir}/static`, urlPrefix: '_next/static', immutable: true },\n ];\n\n const manifest: GigadriveNextBuildManifestV2Standalone = {\n version: 2,\n mode: 'standalone-v2',\n distDir: portableDistDir,\n repoRootToProject,\n nextVersion,\n buildId,\n server,\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: { prerenders, staticAssets },\n };\n await writeManifest(manifest);\n },\n};\n\nexport { MANAGED_STANDALONE_VALIDATED_MAX_MAJOR };\nexport default gigadriveNextAdapter;\n"],"mappings":"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","names":["manifest"]}
|
|
1
|
+
{"version":3,"sources":["../src/nextjs-adapter.ts","../src/manifest-schema.ts","../src/nextjs-constants.ts"],"sourcesContent":["import { Schema } from 'effect';\nimport type { NextAdapter } from 'next';\nimport { access, mkdir, readFile, realpath, stat, writeFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { StaticAssetHeaders, StaticAssetManifestEntry, StaticAssetManifestV1 } from './asset-manifest';\nimport type { NormalizedImagePolicy } from './image-policy';\nimport { decodeJson, decodeUnknown, HttpHeadersSchema } from './manifest-schema';\nimport { MAXIMUM_ENTRY_PAGE_PATHS } from './nextjs-constants';\nimport type {\n GigadriveNextBuildManifestV1,\n GigadriveNextBuildManifestV2Export,\n GigadriveNextBuildManifestV2Standalone,\n GigadriveNextPrerenderManifestV1,\n GigadriveNextPrerenderOutput,\n GigadriveNextServerDescriptor,\n GigadriveNextStaticAssetPrefix,\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 NextPrerenderOutput = BuildCompleteContext['outputs']['prerenders'][number];\ntype NextStaticFileOutput = BuildCompleteContext['outputs']['staticFiles'][number];\n\nconst PRODUCTION_BUILD_PHASE = 'phase-production-build';\nconst NEXT_ASSET_MANIFEST_PATH = '.gigadrive/assets/nextjs.json';\nconst NEXT_PRERENDER_MANIFEST_PATH = '.gigadrive/nextjs-prerenders.json';\nconst HTML_CONTENT_TYPE = 'text/html; charset=utf-8';\nconst DEFAULT_RSC_CONTENT_TYPE = 'text/x-component';\nconst INTERNAL_STATIC_RESPONSE_HEADERS = new Set(['x-next-cache-tags', 'x-nextjs-prerender']);\nconst NextStaticFileMetaSchema = Schema.Struct({\n status: Schema.optional(Schema.Int.pipe(Schema.between(100, 599))),\n headers: Schema.mutable(Schema.Record({ key: Schema.String, value: Schema.Unknown })),\n});\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\n/**\n * Next 16.2 introduced the adapter hooks (`modifyConfig` + `onBuildComplete`) and\n * the `cacheHandler`/`cacheHandlers`/`cacheComponents` config fields we inject.\n * Earlier releases keep the legacy standalone-only behavior with no injection.\n */\nconst supportsManagedRuntime = (nextVersion: string | undefined): boolean => {\n if (!nextVersion) return false;\n const [majorPart, minorPart] = nextVersion.split('.');\n const major = Number.parseInt(majorPart ?? '', 10);\n const minor = Number.parseInt(minorPart ?? '', 10);\n return Number.isFinite(major) && Number.isFinite(minor) && (major > 16 || (major === 16 && minor >= 2));\n};\n\n/**\n * Highest Next major validated to allow `output: 'standalone'` together with an\n * adapter. Next's own build source warns the combination \"might not be allowed\"\n * in a future release. We always emit `output: 'standalone'` on the managed path\n * (there is no per-route fallback to degrade to), so if a future major forbids\n * it the build fails loudly at `next build` rather than silently misdeploying.\n * The network canary drift test tracks releases past this bound.\n */\nconst MANAGED_STANDALONE_VALIDATED_MAX_MAJOR = 16;\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, resolvedRoot?: 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 // Validate the symlink-resolved location as well; the call throws when the\n // real path escapes the repository root.\n const resolvedPath = await realpath(absolutePath);\n void toPortableRelativePath(resolvedRoot ?? (await realpath(repoRoot)), resolvedPath);\n const fileStat = await stat(absolutePath);\n return { portablePath, fileStat };\n}\n\nasync function requireReadableFile(repoRoot: string, filePath: string, resolvedRoot?: string): Promise<string> {\n const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath, resolvedRoot);\n if (!fileStat.isFile()) throw new Error(`Next.js adapter output is not a readable file: ${filePath}`);\n return portablePath;\n}\n\nasync function mapInBatches<Input, Output>(\n values: Input[],\n mapper: (value: Input) => Promise<Output>,\n batchSize = 64\n): Promise<Output[]> {\n const results: Output[] = [];\n for (let index = 0; index < values.length; index += batchSize) {\n results.push(...(await Promise.all(values.slice(index, index + batchSize).map((value) => mapper(value)))));\n }\n return results;\n}\n\nconst isInsideDirectory = (directory: string, filePath: string): boolean => {\n const relativePath = path.relative(path.resolve(directory), path.resolve(filePath));\n return relativePath !== '' && !relativePath.startsWith('..') && !path.isAbsolute(relativePath);\n};\n\nconst isDynamicRoutePathname = (pathname: string): boolean => pathname.includes('[');\n\n// Next reports the Pages Router root as `<basePath>/index`, while its public URL\n// is the base path itself (or `/` when no base path is configured).\nconst normalizeStaticFilePathname = (pathname: string, basePath: string): string =>\n pathname === `${basePath}/index` ? basePath || '/' : pathname;\n\nconst getStaticStatus = (pathname: string, basePath: string, locales: readonly string[]): number | undefined => {\n const routePathname = basePath && pathname.startsWith(`${basePath}/`) ? pathname.slice(basePath.length) : pathname;\n const segments = routePathname.split('/').filter(Boolean);\n const [firstSegment, secondSegment] = segments;\n const statusPage =\n segments.length === 1\n ? firstSegment\n : segments.length === 2 && firstSegment && locales.includes(firstSegment)\n ? secondSegment\n : undefined;\n return statusPage === '404' ? 404 : statusPage === '500' ? 500 : undefined;\n};\n\nconst hasContentType = (headers: StaticAssetHeaders): boolean =>\n Object.keys(headers).some((name) => name.toLowerCase() === 'content-type');\n\nconst getPublicStaticResponseHeaders = (headers: Record<string, unknown>): StaticAssetHeaders | undefined => {\n const publicHeaders = Object.fromEntries(\n Object.entries(headers).filter(([name]) => !INTERNAL_STATIC_RESPONSE_HEADERS.has(name.toLowerCase()))\n );\n return decodeUnknown(HttpHeadersSchema, publicHeaders);\n};\n\nasync function getStaticFileResponseMetadata(\n projectDir: string,\n resolvedProjectDir: string,\n output: NextStaticFileOutput,\n rscContentType: string,\n basePath: string,\n locales: readonly string[]\n): Promise<Pick<StaticAssetManifestEntry, 'status' | 'headers'> | undefined> {\n if (output.filePath.endsWith('.body')) {\n const metaPath = `${output.filePath.slice(0, -'.body'.length)}.meta`;\n await requireReadableFile(projectDir, metaPath, resolvedProjectDir);\n const meta = decodeJson(NextStaticFileMetaSchema, await readFile(metaPath, 'utf8'));\n const headers = meta ? getPublicStaticResponseHeaders(meta.headers) : undefined;\n if (!meta || !headers || !hasContentType(headers)) return undefined;\n return {\n ...(meta.status !== undefined ? { status: meta.status } : {}),\n headers,\n };\n }\n if (output.filePath.endsWith('.html')) {\n const status = getStaticStatus(output.pathname, basePath, locales);\n return {\n ...(status !== undefined ? { status } : {}),\n headers: { 'content-type': HTML_CONTENT_TYPE },\n };\n }\n if (output.pathname.endsWith('.rsc')) return { headers: { 'content-type': rscContentType } };\n return {};\n}\n\nconst serializeStaticFileAsset = async (\n projectDir: string,\n resolvedProjectDir: string,\n basePath: string,\n rscContentType: string,\n locales: readonly string[],\n output: NextStaticFileOutput\n): Promise<StaticAssetManifestEntry | undefined> => {\n const [source, responseMetadata] = await Promise.all([\n requireReadableFile(projectDir, output.filePath, resolvedProjectDir),\n getStaticFileResponseMetadata(projectDir, resolvedProjectDir, output, rscContentType, basePath, locales),\n ]);\n if (!responseMetadata) return undefined;\n return {\n source,\n path: normalizeStaticFilePathname(output.pathname, basePath),\n ...responseMetadata,\n ...(output.immutableHash ? { immutable: true } : {}),\n };\n};\n\nconst serializePrerenderAsset = (\n projectDir: string,\n repoRoot: string,\n distDir: string,\n output: GigadriveNextPrerenderOutput\n): StaticAssetManifestEntry | undefined => {\n const { fallback } = output;\n // `false` disables scheduled ISR. Per-route bypass conditions still require\n // runtime; Pages Router prerenders also stay server-backed because they may\n // be updated through on-demand ISR even without a time-based revalidation.\n const hasNoTimeBasedRevalidation = fallback?.initialRevalidate === false;\n if (\n !fallback?.filePath ||\n !hasNoTimeBasedRevalidation ||\n fallback.postponedState !== undefined ||\n output.config.bypassFor !== undefined ||\n isInsideDirectory(path.join(distDir, 'server', 'pages'), path.resolve(repoRoot, fallback.filePath)) ||\n isDynamicRoutePathname(output.pathname)\n ) {\n return undefined;\n }\n const headers = fallback.initialHeaders ? getPublicStaticResponseHeaders(fallback.initialHeaders) : undefined;\n return {\n source: toPortableRelativePath(projectDir, path.join(repoRoot, fallback.filePath)),\n path: output.pathname,\n ...(fallback.initialStatus !== undefined ? { status: fallback.initialStatus } : {}),\n ...(headers ? { headers } : {}),\n };\n};\n\nasync function serializeAssetManifest(\n projectDir: string,\n resolvedProjectDir: string,\n repoRoot: string,\n distDir: string,\n basePath: string,\n rscContentType: string,\n locales: readonly string[],\n staticFiles: NextStaticFileOutput[],\n prerenders: GigadriveNextPrerenderOutput[]\n): Promise<StaticAssetManifestV1> {\n const staticDirectory = path.join(distDir, 'static');\n const staticEntries = await mapInBatches(\n staticFiles.filter(\n // The complete immutable subtree is already represented by a prefix.\n (output) => !isInsideDirectory(staticDirectory, output.filePath) && !isDynamicRoutePathname(output.pathname)\n ),\n (output) => serializeStaticFileAsset(projectDir, resolvedProjectDir, basePath, rscContentType, locales, output)\n );\n const entries = [\n ...staticEntries,\n ...prerenders.map((output) => serializePrerenderAsset(projectDir, repoRoot, distDir, output)),\n ];\n const assetsByPath = new Map<string, StaticAssetManifestEntry>();\n for (const entry of entries) {\n if (!entry) continue;\n if (assetsByPath.has(entry.path)) throw new Error(`Duplicate Next.js static asset path: ${entry.path}`);\n assetsByPath.set(entry.path, entry);\n }\n return { version: 1, assets: [...assetsByPath.values()] };\n}\n\nconst getEntryPagePaths = (prerenders: GigadriveNextPrerenderOutput[]): string[] =>\n [\n ...new Set(\n prerenders\n .filter((output) => output.fallback?.postponedState === undefined)\n .map((output) => output.pathname)\n .filter((pathname) => pathname.startsWith('/') && !isDynamicRoutePathname(pathname))\n ),\n ]\n .sort((left, right) => left.split('/').length - right.split('/').length || left.localeCompare(right))\n .slice(0, MAXIMUM_ENTRY_PAGE_PATHS);\n\nconst serializePrerenderOutput = async (\n repoRoot: string,\n resolvedRepoRoot: string,\n output: NextPrerenderOutput\n): Promise<GigadriveNextPrerenderOutput> => {\n const { bypassFor, ...prerenderConfig } = output.config;\n return {\n id: output.id,\n type: 'PRERENDER',\n pathname: output.pathname,\n parentOutputId: output.parentOutputId,\n groupId: output.groupId,\n ...(output.pprChain ? { pprChain: output.pprChain } : {}),\n ...(output.parentFallbackMode !== undefined ? { parentFallbackMode: toJsonValue(output.parentFallbackMode) } : {}),\n ...(output.fallback\n ? {\n fallback: {\n ...(output.fallback.filePath\n ? { filePath: await requireReadableFile(repoRoot, output.fallback.filePath, resolvedRepoRoot) }\n : {}),\n ...(output.fallback.initialStatus !== undefined ? { initialStatus: output.fallback.initialStatus } : {}),\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 ? { postponedState: output.fallback.postponedState } : {}),\n },\n }\n : {}),\n config: {\n ...prerenderConfig,\n ...(bypassFor ? { bypassFor: toJsonValue(bypassFor) as JsonValue[] } : {}),\n },\n };\n};\n\n/**\n * Collapses per-route runtime config onto the one standalone server. `maxDuration`\n * becomes the max across routes (one function honors one limit); `env` is the union\n * of every route's declared env (the single server runs them all in-process).\n */\nconst aggregateServerDescriptor = (outputs: NextRouteOutput[]): GigadriveNextServerDescriptor => {\n let maxDuration: number | undefined;\n const env: Record<string, string> = {};\n for (const output of outputs) {\n if (output.config.maxDuration !== undefined) {\n maxDuration = Math.max(maxDuration ?? 0, output.config.maxDuration);\n }\n if (output.config.env) Object.assign(env, output.config.env);\n }\n return {\n ...(maxDuration !== undefined ? { maxDuration } : {}),\n ...(Object.keys(env).length > 0 ? { env } : {}),\n };\n};\n\ntype CollectBuildTracesModule = {\n collectBuildTraces: (options: {\n dir: string;\n config: BuildCompleteContext['config'];\n distDir: string;\n edgeRuntimeRoutes: Record<string, never>;\n staticPages: string[];\n outputFileTracingRoot: string;\n }) => Promise<void>;\n};\n\n/**\n * Next 16.3 stopped emitting the aggregated `next-server.js.nft.json` /\n * `next-minimal-server.js.nft.json` traces from Turbopack builds whenever an\n * adapter is configured, yet `next build` still runs the `output: 'standalone'`\n * writer after `onBuildComplete` — and that writer reads exactly this file, so\n * the build dies with ENOENT. Next 16.2 and all webpack builds still emit the\n * file, making this a no-op there. When the file is missing, regenerate both\n * aggregate traces with Next's own `collectBuildTraces` (the module the webpack\n * pipeline runs); without `buildTraceContext` it only writes the two aggregate\n * trace files and leaves Turbopack's per-entry traces untouched.\n */\nasync function ensureStandaloneServerTraces(\n projectDir: string,\n repoRoot: string,\n distDir: string,\n config: BuildCompleteContext['config']\n): Promise<void> {\n const aggregateTracePath = path.join(distDir, 'next-server.js.nft.json');\n try {\n await access(aggregateTracePath);\n return;\n } catch {\n // Missing — Next will crash in its standalone writer unless we regenerate it.\n }\n let collectBuildTracesModule: CollectBuildTracesModule;\n try {\n const projectRequire = createRequire(path.join(projectDir, 'package.json'));\n collectBuildTracesModule = projectRequire('next/dist/build/collect-build-traces') as CollectBuildTracesModule;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Next.js did not emit ${aggregateTracePath} and the Gigadrive adapter could not load ` +\n `next/dist/build/collect-build-traces from the project to regenerate it: ${message}`\n );\n }\n try {\n await collectBuildTracesModule.collectBuildTraces({\n dir: projectDir,\n config,\n distDir,\n edgeRuntimeRoutes: {},\n staticPages: [],\n outputFileTracingRoot: (config as { outputFileTracingRoot?: string }).outputFileTracingRoot ?? repoRoot,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Regenerating the Next.js standalone server traces (${aggregateTracePath}) failed: ${message}`);\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.2 and newer run the entire deployment as a single `output: 'standalone'`\n * server (one function per deployment) while the injected cache handlers, image\n * loader, and this hook's `onBuildComplete` metadata keep ISR, PPR, `use cache`,\n * and image optimization working through the platform's durable runtime-cache and\n * edge image services. Older releases retain the legacy standalone behavior without\n * the managed-runtime injections.\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 (!supportsManagedRuntime(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 // Run the whole deployment as one standalone Next server rather than a\n // serverless function per route. `onBuildComplete` still fires under\n // standalone (Next >= 16.2), and the standalone server natively honors the\n // injected cache handlers and resumes PPR from its incremental cache, so\n // ISR/PPR/`use cache` stay durable via the remote runtime-cache service.\n // Validated on Next 16.2.x (see MANAGED_STANDALONE_VALIDATED_MAX_MAJOR);\n // a future major that forbids adapter + standalone fails loudly at build.\n output: 'standalone',\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 await mkdir(metadataDirectory, { recursive: true });\n const manifestPath = path.join(metadataDirectory, 'nextjs.json');\n const writeManifest = (manifest: unknown) =>\n writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n\n if (!supportsManagedRuntime(nextVersion)) {\n const manifest: GigadriveNextBuildManifestV1 = {\n version: 1,\n output: config.output === 'export' ? 'export' : 'standalone',\n distDir: toPortableRelativePath(projectDir, distDir),\n repoRootToProject: toPortableRelativePath(repoRoot, projectDir, true),\n nextVersion,\n buildId,\n };\n await writeManifest(manifest);\n return;\n }\n\n const portableDistDir = toPortableRelativePath(projectDir, distDir);\n const repoRootToProject = toPortableRelativePath(repoRoot, projectDir, true);\n\n if (config.output === 'export') {\n const manifest: GigadriveNextBuildManifestV2Export = {\n version: 2,\n mode: 'export',\n distDir: portableDistDir,\n repoRootToProject,\n nextVersion,\n buildId,\n };\n await writeManifest(manifest);\n return;\n }\n\n if (config.output === 'standalone') {\n await ensureStandaloneServerTraces(projectDir, repoRoot, distDir, config);\n }\n\n const [resolvedRepoRoot, resolvedProjectDir] = await Promise.all([realpath(repoRoot), realpath(projectDir)]);\n const prerenders = await mapInBatches(outputs.prerenders, (output) =>\n serializePrerenderOutput(repoRoot, resolvedRepoRoot, output)\n );\n const assetManifest = await serializeAssetManifest(\n projectDir,\n resolvedProjectDir,\n repoRoot,\n distDir,\n config.basePath,\n routing.rsc.contentTypeHeader ?? DEFAULT_RSC_CONTENT_TYPE,\n config.i18n?.locales ?? [],\n outputs.staticFiles,\n prerenders\n );\n const prerenderManifest: GigadriveNextPrerenderManifestV1 = { version: 1, prerenders };\n await mkdir(path.join(metadataDirectory, 'assets'), { recursive: true });\n await Promise.all([\n writeFile(path.join(projectDir, NEXT_ASSET_MANIFEST_PATH), `${JSON.stringify(assetManifest)}\\n`, 'utf8'),\n writeFile(path.join(projectDir, NEXT_PRERENDER_MANIFEST_PATH), `${JSON.stringify(prerenderManifest)}\\n`, 'utf8'),\n ]);\n const server = aggregateServerDescriptor([\n ...outputs.pages,\n ...outputs.pagesApi,\n ...outputs.appPages,\n ...outputs.appRoutes,\n ...(outputs.middleware ? [outputs.middleware] : []),\n ]);\n const images = normalizeImages(config);\n // `.next/static` is thousands of content-hashed, immutable chunks. Register\n // the whole subtree as one edge-served prefix instead of enumerating files.\n const staticAssets: GigadriveNextStaticAssetPrefix[] = [\n { sourceDir: `${portableDistDir}/static`, urlPrefix: '_next/static', immutable: true },\n ];\n\n const manifest: GigadriveNextBuildManifestV2Standalone = {\n version: 2,\n mode: 'standalone-v2',\n distDir: portableDistDir,\n repoRootToProject,\n nextVersion,\n buildId,\n server,\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: {\n prerenders: [],\n prerenderManifest: NEXT_PRERENDER_MANIFEST_PATH,\n assetManifest: NEXT_ASSET_MANIFEST_PATH,\n entryPagePaths: getEntryPagePaths(prerenders),\n staticAssets,\n },\n };\n await writeManifest(manifest);\n },\n};\n\nexport { MANAGED_STANDALONE_VALIDATED_MAX_MAJOR };\nexport default gigadriveNextAdapter;\n","import { Option, Schema } from 'effect';\n\nconst HTTP_HEADER_NAME = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\nconst HTTP_HEADER_VALUE = /^[\\t\\x20-\\x7e\\x80-\\xff]*$/;\nconst URL_PATHNAME_FORBIDDEN_CHARACTER = /[\\x00-\\x1f\\x7f?#\\\\]/;\n\nconst isUrlDotSegment = (segment: string): boolean => {\n const decodedDots = segment.replace(/%2e/gi, '.');\n return decodedDots === '.' || decodedDots === '..';\n};\n\nconst isPortableRelativePath = (value: string, allowCurrentDirectory = false): boolean => {\n const normalized = value.replaceAll('\\\\', '/').replace(/^\\.\\//, '').replace(/\\/+$/, '');\n return (\n (allowCurrentDirectory || (normalized !== '' && normalized !== '.')) &&\n !normalized.startsWith('/') &&\n !/^[A-Za-z]:/.test(normalized) &&\n !normalized.includes(':') &&\n !normalized.split('/').includes('..')\n );\n};\n\nexport const PortableRelativePathSchema = Schema.String.pipe(Schema.filter((value) => isPortableRelativePath(value)));\n\nexport const RepositoryRelativePathSchema = Schema.String.pipe(\n Schema.filter((value) => isPortableRelativePath(value, true))\n);\n\nexport const UrlPathnameSchema = Schema.String.pipe(\n Schema.filter(\n (value) =>\n value.startsWith('/') && !URL_PATHNAME_FORBIDDEN_CHARACTER.test(value) && !value.split('/').some(isUrlDotSegment)\n )\n);\n\nexport const HttpHeaderValueSchema = Schema.String.pipe(Schema.pattern(HTTP_HEADER_VALUE));\nexport const HttpHeadersSchema = Schema.mutable(\n Schema.Record({\n key: Schema.String,\n value: Schema.Union(HttpHeaderValueSchema, Schema.mutable(Schema.Array(HttpHeaderValueSchema))),\n })\n).pipe(Schema.filter((headers) => Object.keys(headers).every((name) => HTTP_HEADER_NAME.test(name))));\nexport const HttpSingleValueHeadersSchema = Schema.mutable(\n Schema.Record({ key: Schema.String, value: HttpHeaderValueSchema })\n).pipe(Schema.filter((headers) => Object.keys(headers).every((name) => HTTP_HEADER_NAME.test(name))));\n\n/**\n * Decode an unknown value with an Effect schema.\n *\n * @param schema - Schema used to validate and decode the value.\n * @param value - Unknown input to decode.\n * @returns The decoded value, or `undefined` when validation fails.\n * @example\n * decodeUnknown(Schema.String, 'value');\n */\nexport const decodeUnknown = <A, I>(schema: Schema.Schema<A, I, never>, value: unknown): A | undefined =>\n Schema.decodeUnknownOption(schema, { onExcessProperty: 'preserve' })(value).pipe(Option.getOrUndefined);\n\n/**\n * Decode a JSON string with an Effect schema.\n *\n * @param schema - Schema used to validate and decode the parsed JSON value.\n * @param content - JSON string to parse and decode.\n * @returns The decoded value, or `undefined` when parsing or validation fails.\n * @example\n * decodeJson(Schema.Struct({ version: Schema.Number }), '{\"version\":1}');\n */\nexport const decodeJson = <A, I>(schema: Schema.Schema<A, I, never>, content: string): A | undefined =>\n decodeUnknown(Schema.parseJson(schema), content);\n","/**\n * A representative sample is enough for cache warming. The complete prerender\n * table stays in its sidecar so it cannot expand gateway configuration by\n * thousands of paths.\n */\nexport const MAXIMUM_ENTRY_PAGE_PATHS = 50;\n"],"mappings":"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","names":["Schema","Schema","manifest"]}
|