@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.
@@ -1,41 +1,343 @@
1
1
  // src/nextjs-adapter.ts
2
- import { mkdir, writeFile } from "fs/promises";
2
+ import { access, mkdir, realpath, stat, writeFile } from "fs/promises";
3
3
  import path from "path";
4
+ import { fileURLToPath } from "url";
4
5
  var PRODUCTION_BUILD_PHASE = "phase-production-build";
5
- var toPortableRelativePath = (from, to) => {
6
- const relativePath = path.relative(from, to).replaceAll(path.sep, "/");
7
- return relativePath === "" ? "." : relativePath;
6
+ var runtimeDirectory = typeof __dirname === "string" ? __dirname : path.dirname(fileURLToPath(import.meta.url));
7
+ var runtimeModulePath = (environmentName, fileName) => process.env[environmentName] ?? path.join(runtimeDirectory, fileName);
8
+ var CACHE_HANDLER_PATH = () => runtimeModulePath("GIGADRIVE_NEXT_CACHE_HANDLER_PATH", "nextjs-cache-handler.js");
9
+ var CACHE_COMPONENTS_HANDLER_PATH = () => runtimeModulePath("GIGADRIVE_NEXT_CACHE_COMPONENTS_HANDLER_PATH", "nextjs-cache-components-handler.js");
10
+ var IMAGE_LOADER_PATH = () => runtimeModulePath("GIGADRIVE_NEXT_IMAGE_LOADER_PATH", "nextjs-image-loader.js");
11
+ var toJsonValue = (value) => {
12
+ const serialized = JSON.stringify(value);
13
+ return serialized === void 0 ? null : JSON.parse(serialized);
14
+ };
15
+ var isNext16OrNewer = (nextVersion) => {
16
+ const major = Number.parseInt(nextVersion.split(".")[0] ?? "", 10);
17
+ return Number.isFinite(major) && major >= 16;
18
+ };
19
+ var toPortableRelativePath = (from, to, allowCurrentDirectory = false) => {
20
+ const resolvedFrom = path.resolve(from);
21
+ const resolvedTo = path.resolve(path.isAbsolute(to) ? to : path.join(from, to));
22
+ const relativePath = path.relative(resolvedFrom, resolvedTo).replaceAll(path.sep, "/");
23
+ const normalized = relativePath === "" ? "." : relativePath;
24
+ if (!allowCurrentDirectory && normalized === "." || normalized.startsWith("/") || /^[A-Za-z]:/.test(normalized) || normalized.split("/").some((segment) => segment === "..")) {
25
+ throw new Error(`Next.js adapter output is outside the repository root: ${to}`);
26
+ }
27
+ return normalized;
28
+ };
29
+ async function resolveReadablePath(repoRoot, filePath) {
30
+ const absolutePath = path.resolve(path.isAbsolute(filePath) ? filePath : path.join(repoRoot, filePath));
31
+ const portablePath = toPortableRelativePath(repoRoot, absolutePath);
32
+ await access(absolutePath);
33
+ const resolvedPath = await realpath(absolutePath);
34
+ toPortableRelativePath(repoRoot, resolvedPath);
35
+ const fileStat = await stat(absolutePath);
36
+ return { portablePath, fileStat };
37
+ }
38
+ async function requireReadableFile(repoRoot, filePath) {
39
+ const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath);
40
+ if (!fileStat.isFile()) throw new Error(`Next.js adapter output is not a readable file: ${filePath}`);
41
+ return portablePath;
42
+ }
43
+ async function requireReadableAsset(repoRoot, filePath) {
44
+ const { portablePath, fileStat } = await resolveReadablePath(repoRoot, filePath);
45
+ if (!fileStat.isFile() && !fileStat.isDirectory()) {
46
+ throw new Error(`Next.js adapter asset is not a readable file or directory: ${filePath}`);
47
+ }
48
+ return portablePath;
49
+ }
50
+ async function serializeFileMap(repoRoot, files) {
51
+ const entries = await Promise.all(
52
+ Object.entries(files).map(async ([targetPath, sourcePath]) => [
53
+ toPortableRelativePath(repoRoot, targetPath),
54
+ await requireReadableAsset(repoRoot, sourcePath)
55
+ ])
56
+ );
57
+ return Object.fromEntries(entries);
58
+ }
59
+ var serializeRouteOutput = async (repoRoot, output) => {
60
+ const matchers = output.config.matchers;
61
+ return {
62
+ id: output.id,
63
+ type: String(output.type),
64
+ filePath: await requireReadableFile(repoRoot, output.filePath),
65
+ pathname: output.pathname,
66
+ sourcePage: output.sourcePage,
67
+ runtime: output.runtime,
68
+ assets: await serializeFileMap(repoRoot, output.assets),
69
+ ...output.wasmAssets ? { wasmAssets: await serializeFileMap(repoRoot, output.wasmAssets) } : {},
70
+ ...output.edgeRuntime ? {
71
+ edgeRuntime: {
72
+ modulePath: await requireReadableFile(repoRoot, output.edgeRuntime.modulePath),
73
+ entryKey: output.edgeRuntime.entryKey,
74
+ handlerExport: output.edgeRuntime.handlerExport
75
+ }
76
+ } : {},
77
+ config: {
78
+ maxDuration: output.config.maxDuration,
79
+ preferredRegion: output.config.preferredRegion,
80
+ env: output.config.env,
81
+ ...matchers ? {
82
+ matchers: matchers.map((matcher) => ({
83
+ source: matcher.source,
84
+ sourceRegex: matcher.sourceRegex,
85
+ ...matcher.has ? { has: toJsonValue(matcher.has) } : {},
86
+ ...matcher.missing ? { missing: toJsonValue(matcher.missing) } : {}
87
+ }))
88
+ } : {}
89
+ }
90
+ };
91
+ };
92
+ var serializeStaticOutput = async (repoRoot, output) => ({
93
+ id: output.id,
94
+ type: "STATIC_FILE",
95
+ filePath: await requireReadableFile(repoRoot, output.filePath),
96
+ pathname: output.pathname,
97
+ ...output.immutableHash ? { immutableHash: output.immutableHash } : {}
98
+ });
99
+ var buildEntrypointPlan = (outputs) => {
100
+ const byIdentity = /* @__PURE__ */ new Map();
101
+ const outputEntrypoints = {};
102
+ for (const output of outputs) {
103
+ const identity = JSON.stringify([
104
+ output.runtime,
105
+ output.filePath,
106
+ output.edgeRuntime?.modulePath,
107
+ output.edgeRuntime?.entryKey,
108
+ output.edgeRuntime?.handlerExport
109
+ ]);
110
+ const existingEntrypoint = byIdentity.get(identity);
111
+ const entrypoint = existingEntrypoint ?? {
112
+ id: `next-${byIdentity.size}`,
113
+ runtime: output.runtime,
114
+ filePath: output.filePath,
115
+ outputIds: [],
116
+ assets: { ...output.assets },
117
+ ...output.wasmAssets ? { wasmAssets: { ...output.wasmAssets } } : {},
118
+ ...output.edgeRuntime ? { edgeRuntime: { ...output.edgeRuntime } } : {},
119
+ config: {
120
+ maxDuration: output.config.maxDuration,
121
+ preferredRegion: output.config.preferredRegion,
122
+ env: output.config.env
123
+ }
124
+ };
125
+ if (!existingEntrypoint) {
126
+ byIdentity.set(identity, entrypoint);
127
+ } else {
128
+ Object.assign(entrypoint.assets, output.assets);
129
+ if (output.wasmAssets) entrypoint.wasmAssets = { ...entrypoint.wasmAssets, ...output.wasmAssets };
130
+ if (output.config.maxDuration !== void 0) {
131
+ entrypoint.config.maxDuration = Math.max(entrypoint.config.maxDuration ?? 0, output.config.maxDuration);
132
+ }
133
+ }
134
+ entrypoint.outputIds.push(output.id);
135
+ outputEntrypoints[output.id] = entrypoint.id;
136
+ }
137
+ return { entrypoints: [...byIdentity.values()], outputEntrypoints };
138
+ };
139
+ var writeEntrypointWrappers = async (projectDir, repoRoot, entrypoints) => {
140
+ const wrapperDirectory = path.join(projectDir, ".gigadrive", "nextjs", "entrypoints");
141
+ await mkdir(wrapperDirectory, { recursive: true });
142
+ await Promise.all(
143
+ entrypoints.map(async (entrypoint) => {
144
+ const wrapperPath = path.join(wrapperDirectory, `${entrypoint.id}.mjs`);
145
+ const executablePath = path.join(repoRoot, entrypoint.edgeRuntime?.modulePath ?? entrypoint.filePath);
146
+ const relativeImport = path.relative(wrapperDirectory, executablePath).replaceAll(path.sep, "/");
147
+ const importSpecifier = relativeImport.startsWith(".") ? relativeImport : `./${relativeImport}`;
148
+ const source = entrypoint.runtime === "edge" && entrypoint.edgeRuntime ? `import ${JSON.stringify(importSpecifier)};
149
+
150
+ export async function fetch(request) {
151
+ const pending = [];
152
+ const registry = globalThis._ENTRIES;
153
+ if (!registry) throw new Error('Next.js edge entry registry is unavailable');
154
+ const entry = await registry[${JSON.stringify(entrypoint.edgeRuntime.entryKey)}];
155
+ const handler = entry?.[${JSON.stringify(entrypoint.edgeRuntime.handlerExport)}];
156
+ if (typeof handler !== 'function') throw new Error('Next.js edge handler is unavailable');
157
+ const url = new URL(request.url);
158
+ const response = await handler(request, {
159
+ signal: request.signal,
160
+ waitUntil(promise) { pending.push(Promise.resolve(promise)); },
161
+ 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(
162
+ toPortableRelativePath(repoRoot, projectDir, true)
163
+ )} },
164
+ });
165
+ if (!response.body) { await Promise.allSettled(pending); return response; }
166
+ const reader = response.body.getReader();
167
+ const body = new ReadableStream({
168
+ async pull(controller) {
169
+ const result = await reader.read();
170
+ if (result.done) { await Promise.allSettled(pending); controller.close(); return; }
171
+ controller.enqueue(result.value);
172
+ },
173
+ cancel(reason) { return reader.cancel(reason); },
174
+ });
175
+ return new Response(body, response);
176
+ }
177
+ ` : `import * as nextEntrypoint from ${JSON.stringify(importSpecifier)};
178
+
179
+ export default async function handler(req, res) {
180
+ const pending = [];
181
+ const nextHandler = nextEntrypoint.handler ?? nextEntrypoint.default?.handler ?? nextEntrypoint.default;
182
+ if (typeof nextHandler !== 'function') throw new Error('Next.js Node handler is unavailable');
183
+ await nextHandler(req, res, {
184
+ waitUntil(promise) { pending.push(Promise.resolve(promise)); },
185
+ 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(
186
+ toPortableRelativePath(repoRoot, projectDir, true)
187
+ )} },
188
+ });
189
+ await Promise.allSettled(pending);
190
+ }
191
+ `;
192
+ await writeFile(wrapperPath, source, "utf8");
193
+ const portableWrapperPath = toPortableRelativePath(repoRoot, wrapperPath);
194
+ entrypoint.assets[portableWrapperPath] = portableWrapperPath;
195
+ entrypoint.filePath = portableWrapperPath;
196
+ })
197
+ );
198
+ };
199
+ var normalizeImages = (config) => {
200
+ if (config.images.unoptimized) return void 0;
201
+ return {
202
+ localPatterns: config.images.localPatterns ?? [{ pathname: "/**" }],
203
+ remotePatterns: config.images.remotePatterns.map((pattern) => {
204
+ if (pattern instanceof URL) {
205
+ return {
206
+ protocol: pattern.protocol === "http:" ? "http" : "https",
207
+ hostname: pattern.hostname,
208
+ port: pattern.port,
209
+ pathname: pattern.pathname,
210
+ search: pattern.search
211
+ };
212
+ }
213
+ return { ...pattern };
214
+ }),
215
+ widths: [.../* @__PURE__ */ new Set([...config.images.deviceSizes, ...config.images.imageSizes])].sort((a, b) => a - b),
216
+ heights: [],
217
+ qualities: config.images.qualities ?? [75],
218
+ formats: config.images.formats,
219
+ minimumCacheTTL: config.images.minimumCacheTTL,
220
+ dangerouslyAllowSVG: config.images.dangerouslyAllowSVG,
221
+ contentSecurityPolicy: config.images.contentSecurityPolicy,
222
+ contentDispositionType: config.images.contentDispositionType,
223
+ maximumRedirects: config.images.maximumRedirects,
224
+ maximumResponseBody: config.images.maximumResponseBody,
225
+ variants: {}
226
+ };
8
227
  };
9
228
  var gigadriveNextAdapter = {
10
229
  name: "Gigadrive Network",
11
- modifyConfig(config, { phase }) {
12
- if (phase !== PRODUCTION_BUILD_PHASE) {
13
- return config;
14
- }
230
+ modifyConfig(config, { phase, nextVersion }) {
231
+ if (phase !== PRODUCTION_BUILD_PHASE) return config;
15
232
  const deploymentId = config.deploymentId ?? process.env.GIGADRIVE_DEPLOYMENT_ID;
233
+ if (!isNext16OrNewer(nextVersion)) {
234
+ return {
235
+ ...config,
236
+ ...deploymentId ? { deploymentId } : {},
237
+ output: config.output === "export" ? "export" : "standalone"
238
+ };
239
+ }
240
+ if (config.output === "export") {
241
+ return { ...config, ...deploymentId ? { deploymentId } : {} };
242
+ }
243
+ const injectCacheHandler = config.cacheHandler === void 0;
244
+ const injectCacheComponentHandlers = config.cacheHandlers === void 0;
245
+ const images = config.images;
246
+ const injectImageLoader = images !== void 0 && images.unoptimized !== true && images.loader === "default" && !images.loaderFile;
16
247
  return {
17
248
  ...config,
18
249
  ...deploymentId ? { deploymentId } : {},
19
- output: config.output === "export" ? "export" : "standalone"
250
+ ...injectCacheHandler ? { cacheHandler: CACHE_HANDLER_PATH() } : {},
251
+ ...injectCacheComponentHandlers ? {
252
+ cacheHandlers: {
253
+ default: CACHE_COMPONENTS_HANDLER_PATH(),
254
+ remote: CACHE_COMPONENTS_HANDLER_PATH()
255
+ }
256
+ } : {},
257
+ ...injectCacheHandler || injectCacheComponentHandlers ? { cacheMaxMemorySize: 0 } : {},
258
+ ...injectImageLoader ? {
259
+ images: {
260
+ ...images,
261
+ loader: "custom",
262
+ loaderFile: IMAGE_LOADER_PATH()
263
+ }
264
+ } : {}
20
265
  };
21
266
  },
22
- async onBuildComplete({
23
- projectDir,
24
- repoRoot,
25
- distDir,
26
- config,
27
- nextVersion,
28
- buildId
29
- }) {
30
- const output = config.output === "export" ? "export" : "standalone";
267
+ async onBuildComplete({ projectDir, repoRoot, distDir, config, nextVersion, buildId, routing, outputs }) {
31
268
  const metadataDirectory = path.join(projectDir, ".gigadrive");
269
+ const portableOutputs = {
270
+ pages: await Promise.all(outputs.pages.map((output) => serializeRouteOutput(repoRoot, output))),
271
+ ...outputs.middleware ? { middleware: await serializeRouteOutput(repoRoot, outputs.middleware) } : {},
272
+ appPages: await Promise.all(outputs.appPages.map((output) => serializeRouteOutput(repoRoot, output))),
273
+ pagesApi: await Promise.all(outputs.pagesApi.map((output) => serializeRouteOutput(repoRoot, output))),
274
+ appRoutes: await Promise.all(outputs.appRoutes.map((output) => serializeRouteOutput(repoRoot, output))),
275
+ prerenders: await Promise.all(
276
+ outputs.prerenders.map(async (output) => {
277
+ const { bypassFor, ...prerenderConfig } = output.config;
278
+ return {
279
+ id: output.id,
280
+ type: "PRERENDER",
281
+ pathname: output.pathname,
282
+ parentOutputId: output.parentOutputId,
283
+ groupId: output.groupId,
284
+ ...output.pprChain ? { pprChain: output.pprChain } : {},
285
+ ...output.parentFallbackMode !== void 0 ? { parentFallbackMode: toJsonValue(output.parentFallbackMode) } : {},
286
+ ...output.fallback ? {
287
+ fallback: {
288
+ ...output.fallback.filePath ? { filePath: await requireReadableFile(repoRoot, output.fallback.filePath) } : {},
289
+ ...output.fallback.initialStatus !== void 0 ? { initialStatus: output.fallback.initialStatus } : {},
290
+ ...output.fallback.initialHeaders ? { initialHeaders: output.fallback.initialHeaders } : {},
291
+ ...output.fallback.initialExpiration !== void 0 ? { initialExpiration: output.fallback.initialExpiration } : {},
292
+ ...output.fallback.initialRevalidate !== void 0 ? { initialRevalidate: output.fallback.initialRevalidate } : {},
293
+ ...output.fallback.postponedState !== void 0 ? { postponedState: output.fallback.postponedState } : {}
294
+ }
295
+ } : {},
296
+ config: {
297
+ ...prerenderConfig,
298
+ ...bypassFor ? { bypassFor: toJsonValue(bypassFor) } : {}
299
+ }
300
+ };
301
+ })
302
+ ),
303
+ staticFiles: await Promise.all(outputs.staticFiles.map((output) => serializeStaticOutput(repoRoot, output)))
304
+ };
305
+ const executableOutputs = [
306
+ ...portableOutputs.pages,
307
+ ...portableOutputs.pagesApi,
308
+ ...portableOutputs.appPages,
309
+ ...portableOutputs.appRoutes,
310
+ ...portableOutputs.middleware ? [portableOutputs.middleware] : []
311
+ ];
312
+ const entrypointPlan = buildEntrypointPlan(executableOutputs);
313
+ await writeEntrypointWrappers(projectDir, repoRoot, entrypointPlan.entrypoints);
314
+ const images = normalizeImages(config);
32
315
  const manifest = {
33
- version: 1,
34
- output,
316
+ version: 2,
317
+ mode: config.output === "export" ? "export" : "adapter-v2",
35
318
  distDir: toPortableRelativePath(projectDir, distDir),
36
- repoRootToProject: toPortableRelativePath(repoRoot, projectDir),
319
+ repoRootToProject: toPortableRelativePath(repoRoot, projectDir, true),
37
320
  nextVersion,
38
- buildId
321
+ buildId,
322
+ config: {
323
+ basePath: config.basePath,
324
+ trailingSlash: config.trailingSlash,
325
+ cacheComponents: config.cacheComponents,
326
+ ...config.i18n ? { i18n: toJsonValue(config.i18n) } : {},
327
+ ...images ? { images } : {}
328
+ },
329
+ routing: {
330
+ beforeMiddleware: toJsonValue(routing.beforeMiddleware),
331
+ beforeFiles: toJsonValue(routing.beforeFiles),
332
+ afterFiles: toJsonValue(routing.afterFiles),
333
+ dynamicRoutes: toJsonValue(routing.dynamicRoutes),
334
+ onMatch: toJsonValue(routing.onMatch),
335
+ fallback: toJsonValue(routing.fallback),
336
+ shouldNormalizeNextData: routing.shouldNormalizeNextData,
337
+ rsc: toJsonValue(routing.rsc)
338
+ },
339
+ outputs: portableOutputs,
340
+ ...entrypointPlan
39
341
  };
40
342
  await mkdir(metadataDirectory, { recursive: true });
41
343
  await writeFile(path.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,SAAS,OAAO,iBAAiB;AACjC,OAAO,UAAU;AA8BjB,IAAM,yBAAyB;AAE/B,IAAM,yBAAyB,CAAC,MAAc,OAAuB;AACnE,QAAM,eAAe,KAAK,SAAS,MAAM,EAAE,EAAE,WAAW,KAAK,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,KAAK,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,UAAM,MAAM,mBAAmB,EAAE,WAAW,KAAK,CAAC;AAClD,UAAM,UAAU,KAAK,KAAK,mBAAmB,aAAa,GAAG,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,EAC/G;AACF;AAEA,IAAO,yBAAQ;","names":[]}
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":[]}
@@ -0,0 +1,20 @@
1
+ interface CacheComponentEntry {
2
+ value: ReadableStream<Uint8Array>;
3
+ tags: string[];
4
+ stale: number;
5
+ timestamp: number;
6
+ expire: number;
7
+ revalidate: number;
8
+ }
9
+ /** Shared Network cache handler for Next.js Cache Components and `use cache`. */
10
+ declare const cacheHandler: {
11
+ get(cacheKey: string, softTags: string[]): Promise<CacheComponentEntry | undefined>;
12
+ set(cacheKey: string, pendingEntry: Promise<CacheComponentEntry>): Promise<void>;
13
+ refreshTags(): Promise<void>;
14
+ getExpiration(tags: string[]): Promise<number>;
15
+ updateTags(tags: string[], durations?: {
16
+ expire?: number;
17
+ }): Promise<void>;
18
+ };
19
+
20
+ export { cacheHandler as default };
@@ -0,0 +1,20 @@
1
+ interface CacheComponentEntry {
2
+ value: ReadableStream<Uint8Array>;
3
+ tags: string[];
4
+ stale: number;
5
+ timestamp: number;
6
+ expire: number;
7
+ revalidate: number;
8
+ }
9
+ /** Shared Network cache handler for Next.js Cache Components and `use cache`. */
10
+ declare const cacheHandler: {
11
+ get(cacheKey: string, softTags: string[]): Promise<CacheComponentEntry | undefined>;
12
+ set(cacheKey: string, pendingEntry: Promise<CacheComponentEntry>): Promise<void>;
13
+ refreshTags(): Promise<void>;
14
+ getExpiration(tags: string[]): Promise<number>;
15
+ updateTags(tags: string[], durations?: {
16
+ expire?: number;
17
+ }): Promise<void>;
18
+ };
19
+
20
+ export = cacheHandler;