@opennextjs/aws 3.2.1 → 3.2.2

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.
Files changed (135) hide show
  1. package/README.md +15 -1
  2. package/dist/adapters/cache.d.ts +0 -23
  3. package/dist/adapters/cache.js +10 -12
  4. package/dist/adapters/config/index.js +1 -1
  5. package/dist/adapters/config/util.js +2 -2
  6. package/dist/adapters/dynamo-provider.js +3 -5
  7. package/dist/adapters/edge-adapter.d.ts +0 -3
  8. package/dist/adapters/edge-adapter.js +43 -38
  9. package/dist/adapters/image-optimization-adapter.js +4 -4
  10. package/dist/adapters/logger.d.ts +0 -3
  11. package/dist/adapters/logger.js +3 -5
  12. package/dist/adapters/middleware.js +42 -18
  13. package/dist/adapters/plugins/image-optimization/image-optimization.d.ts +0 -3
  14. package/dist/adapters/plugins/image-optimization/image-optimization.replacement.d.ts +0 -3
  15. package/dist/adapters/revalidate.js +2 -2
  16. package/dist/adapters/server-adapter.d.ts +0 -3
  17. package/dist/adapters/server-adapter.js +3 -1
  18. package/dist/adapters/util.js +2 -2
  19. package/dist/build/bundleNextServer.d.ts +3 -1
  20. package/dist/build/bundleNextServer.js +3 -3
  21. package/dist/build/compileConfig.js +1 -1
  22. package/dist/build/copyTracedFiles.js +14 -25
  23. package/dist/build/createAssets.js +35 -26
  24. package/dist/build/createImageOptimizationBundle.js +1 -1
  25. package/dist/build/createMiddleware.js +7 -2
  26. package/dist/build/createRevalidationBundle.js +1 -1
  27. package/dist/build/createServerBundle.js +23 -29
  28. package/dist/build/createWarmerBundle.js +1 -1
  29. package/dist/build/edge/createEdgeBundle.d.ts +7 -3
  30. package/dist/build/edge/createEdgeBundle.js +12 -5
  31. package/dist/build/generateOutput.js +7 -13
  32. package/dist/build/helper.d.ts +22 -4
  33. package/dist/build/helper.js +26 -12
  34. package/dist/build/installDeps.js +1 -1
  35. package/dist/build/patch/patchedAsyncStorage.js +1 -1
  36. package/dist/build/utils.js +3 -2
  37. package/dist/build/validateConfig.js +1 -0
  38. package/dist/core/createGenericHandler.d.ts +2 -4
  39. package/dist/core/createGenericHandler.js +1 -2
  40. package/dist/core/createMainHandler.d.ts +0 -17
  41. package/dist/core/createMainHandler.js +5 -4
  42. package/dist/core/edgeFunctionHandler.d.ts +1 -51
  43. package/dist/core/patchAsyncStorage.js +5 -6
  44. package/dist/core/requestHandler.js +98 -89
  45. package/dist/core/require-hooks.js +8 -7
  46. package/dist/core/resolve.d.ts +13 -7
  47. package/dist/core/resolve.js +29 -35
  48. package/dist/core/routing/cacheInterceptor.js +12 -13
  49. package/dist/core/routing/i18n/accept-header.js +3 -2
  50. package/dist/core/routing/matcher.d.ts +2 -4
  51. package/dist/core/routing/matcher.js +17 -26
  52. package/dist/core/routing/middleware.js +17 -16
  53. package/dist/core/routing/util.d.ts +0 -13
  54. package/dist/core/routing/util.js +25 -87
  55. package/dist/core/routingHandler.d.ts +2 -0
  56. package/dist/core/routingHandler.js +30 -12
  57. package/dist/core/util.js +5 -3
  58. package/dist/helpers/withSST.d.ts +1 -1
  59. package/dist/http/openNextResponse.d.ts +5 -9
  60. package/dist/http/openNextResponse.js +29 -31
  61. package/dist/http/request.d.ts +0 -3
  62. package/dist/http/request.js +4 -2
  63. package/dist/http/util.d.ts +1 -1
  64. package/dist/http/util.js +8 -12
  65. package/dist/minimize-js.js +19 -19
  66. package/dist/overrides/converters/aws-apigw-v1.d.ts +2 -2
  67. package/dist/overrides/converters/aws-apigw-v1.js +2 -1
  68. package/dist/overrides/converters/aws-apigw-v2.d.ts +2 -2
  69. package/dist/overrides/converters/aws-apigw-v2.js +6 -7
  70. package/dist/overrides/converters/aws-cloudfront.d.ts +2 -2
  71. package/dist/overrides/converters/aws-cloudfront.js +11 -30
  72. package/dist/overrides/converters/dummy.d.ts +1 -1
  73. package/dist/overrides/converters/edge.d.ts +2 -1
  74. package/dist/overrides/converters/edge.js +11 -15
  75. package/dist/overrides/converters/node.d.ts +1 -1
  76. package/dist/overrides/converters/node.js +1 -1
  77. package/dist/overrides/converters/sqs-revalidate.d.ts +1 -1
  78. package/dist/overrides/imageLoader/dummy.d.ts +1 -1
  79. package/dist/overrides/imageLoader/host.d.ts +1 -1
  80. package/dist/overrides/imageLoader/s3.d.ts +1 -1
  81. package/dist/overrides/imageLoader/s3.js +1 -1
  82. package/dist/overrides/incrementalCache/dummy.d.ts +1 -1
  83. package/dist/overrides/incrementalCache/s3-lite.d.ts +1 -1
  84. package/dist/overrides/incrementalCache/s3-lite.js +15 -19
  85. package/dist/overrides/incrementalCache/s3.d.ts +1 -1
  86. package/dist/overrides/incrementalCache/s3.js +1 -1
  87. package/dist/overrides/originResolver/dummy.d.ts +1 -1
  88. package/dist/overrides/originResolver/pattern-env.d.ts +1 -1
  89. package/dist/overrides/originResolver/pattern-env.js +10 -11
  90. package/dist/overrides/proxyExternalRequest/dummy.d.ts +3 -0
  91. package/dist/overrides/proxyExternalRequest/dummy.js +7 -0
  92. package/dist/overrides/proxyExternalRequest/fetch.d.ts +3 -0
  93. package/dist/overrides/proxyExternalRequest/fetch.js +25 -0
  94. package/dist/overrides/proxyExternalRequest/node.d.ts +3 -0
  95. package/dist/overrides/proxyExternalRequest/node.js +67 -0
  96. package/dist/overrides/queue/dummy.d.ts +1 -1
  97. package/dist/overrides/queue/sqs-lite.d.ts +1 -1
  98. package/dist/overrides/queue/sqs-lite.js +7 -9
  99. package/dist/overrides/queue/sqs.d.ts +1 -1
  100. package/dist/overrides/queue/sqs.js +1 -1
  101. package/dist/overrides/tagCache/constants.js +2 -2
  102. package/dist/overrides/tagCache/dummy.d.ts +1 -1
  103. package/dist/overrides/tagCache/dynamodb-lite.d.ts +1 -1
  104. package/dist/overrides/tagCache/dynamodb-lite.js +10 -12
  105. package/dist/overrides/tagCache/dynamodb.d.ts +1 -1
  106. package/dist/overrides/tagCache/dynamodb.js +2 -2
  107. package/dist/overrides/warmer/aws-lambda.d.ts +1 -1
  108. package/dist/overrides/warmer/dummy.d.ts +1 -1
  109. package/dist/overrides/wrappers/aws-lambda-streaming.d.ts +2 -2
  110. package/dist/overrides/wrappers/aws-lambda.d.ts +2 -2
  111. package/dist/overrides/wrappers/cloudflare.d.ts +2 -1
  112. package/dist/overrides/wrappers/cloudflare.js +20 -2
  113. package/dist/overrides/wrappers/dummy.d.ts +2 -2
  114. package/dist/overrides/wrappers/node.d.ts +2 -2
  115. package/dist/overrides/wrappers/node.js +3 -3
  116. package/dist/plugins/edge.js +6 -5
  117. package/dist/plugins/replacement.js +2 -2
  118. package/dist/plugins/resolve.d.ts +3 -1
  119. package/dist/plugins/resolve.js +4 -1
  120. package/dist/types/aws-lambda.d.ts +2 -5
  121. package/dist/types/cache.d.ts +0 -2
  122. package/dist/types/global.d.ts +188 -0
  123. package/dist/types/next-types.d.ts +1 -3
  124. package/dist/types/open-next.d.ts +15 -41
  125. package/dist/types/overrides.d.ts +87 -0
  126. package/dist/utils/promise.d.ts +3 -0
  127. package/dist/utils/promise.js +44 -0
  128. package/dist/utils/stream.d.ts +0 -1
  129. package/package.json +2 -2
  130. package/dist/overrides/incrementalCache/types.d.ts +0 -34
  131. package/dist/overrides/queue/types.d.ts +0 -12
  132. package/dist/overrides/tagCache/types.d.ts +0 -11
  133. package/dist/overrides/tagCache/types.js +0 -1
  134. /package/dist/{overrides/incrementalCache/types.js → types/global.js} +0 -0
  135. /package/dist/{overrides/queue/types.js → types/overrides.js} +0 -0
@@ -0,0 +1,67 @@
1
+ import { debug, error } from "node:console";
2
+ import { request } from "node:https";
3
+ import { Readable } from "node:stream";
4
+ import { isBinaryContentType } from "../../adapters/binary";
5
+ function filterHeadersForProxy(headers) {
6
+ const filteredHeaders = {};
7
+ const disallowedHeaders = [
8
+ "host",
9
+ "connection",
10
+ "via",
11
+ "x-cache",
12
+ "transfer-encoding",
13
+ "content-encoding",
14
+ "content-length",
15
+ ];
16
+ Object.entries(headers)
17
+ .filter(([key, _]) => {
18
+ const lowerKey = key.toLowerCase();
19
+ return !(disallowedHeaders.includes(lowerKey) || lowerKey.startsWith("x-amz"));
20
+ })
21
+ .forEach(([key, value]) => {
22
+ filteredHeaders[key] = value?.toString() ?? "";
23
+ });
24
+ return filteredHeaders;
25
+ }
26
+ const nodeProxy = {
27
+ name: "node-proxy",
28
+ proxy: (internalEvent) => {
29
+ const { url, headers, method, body } = internalEvent;
30
+ debug("proxyRequest", url);
31
+ return new Promise((resolve, reject) => {
32
+ const filteredHeaders = filterHeadersForProxy(headers);
33
+ debug("filteredHeaders", filteredHeaders);
34
+ const req = request(url, {
35
+ headers: filteredHeaders,
36
+ method,
37
+ rejectUnauthorized: false,
38
+ }, (_res) => {
39
+ const nodeReadableStream = _res.headers["content-encoding"] === "br"
40
+ ? _res.pipe(require("node:zlib").createBrotliDecompress())
41
+ : _res.headers["content-encoding"] === "gzip"
42
+ ? _res.pipe(require("node:zlib").createGunzip())
43
+ : _res;
44
+ const isBase64Encoded = isBinaryContentType(headers["content-type"]) ||
45
+ !!headers["content-encoding"];
46
+ const result = {
47
+ type: "core",
48
+ headers: filterHeadersForProxy(_res.headers),
49
+ statusCode: _res.statusCode ?? 200,
50
+ // TODO: check base64 encoding
51
+ isBase64Encoded,
52
+ body: Readable.toWeb(nodeReadableStream),
53
+ };
54
+ resolve(result);
55
+ _res.on("error", (e) => {
56
+ error("proxyRequest error", e);
57
+ reject(e);
58
+ });
59
+ });
60
+ if (body && method !== "GET" && method !== "HEAD") {
61
+ req.write(body);
62
+ }
63
+ req.end();
64
+ });
65
+ },
66
+ };
67
+ export default nodeProxy;
@@ -1,3 +1,3 @@
1
- import type { Queue } from "./types";
1
+ import type { Queue } from "../../types/overrides";
2
2
  declare const dummyQueue: Queue;
3
3
  export default dummyQueue;
@@ -1,3 +1,3 @@
1
- import type { Queue } from "./types";
1
+ import type { Queue } from "../../types/overrides";
2
2
  declare const queue: Queue;
3
3
  export default queue;
@@ -7,15 +7,13 @@ const getAwsClient = () => {
7
7
  if (awsClient) {
8
8
  return awsClient;
9
9
  }
10
- else {
11
- awsClient = new AwsClient({
12
- accessKeyId: process.env.AWS_ACCESS_KEY_ID,
13
- secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
14
- sessionToken: process.env.AWS_SESSION_TOKEN,
15
- region: process.env.REVALIDATION_QUEUE_REGION,
16
- });
17
- return awsClient;
18
- }
10
+ awsClient = new AwsClient({
11
+ accessKeyId: process.env.AWS_ACCESS_KEY_ID,
12
+ secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
13
+ sessionToken: process.env.AWS_SESSION_TOKEN,
14
+ region: process.env.REVALIDATION_QUEUE_REGION,
15
+ });
16
+ return awsClient;
19
17
  };
20
18
  const awsFetch = (body) => {
21
19
  const { REVALIDATION_QUEUE_REGION } = process.env;
@@ -1,3 +1,3 @@
1
- import type { Queue } from "./types";
1
+ import type { Queue } from "../../types/overrides";
2
2
  declare const queue: Queue;
3
3
  export default queue;
@@ -1,4 +1,4 @@
1
- import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs";
1
+ import { SQSClient, SendMessageCommand } from "@aws-sdk/client-sqs";
2
2
  import { awsLogger } from "../../adapters/logger";
3
3
  // Expected environment variables
4
4
  const { REVALIDATION_QUEUE_REGION, REVALIDATION_QUEUE_URL } = process.env;
@@ -7,10 +7,10 @@ const DEFAULT_DYNAMO_BATCH_WRITE_COMMAND_CONCURRENCY = 4;
7
7
  export const getDynamoBatchWriteCommandConcurrency = () => {
8
8
  const dynamoBatchWriteCommandConcurrencyFromEnv = process.env.DYNAMO_BATCH_WRITE_COMMAND_CONCURRENCY;
9
9
  const parsedDynamoBatchWriteCommandConcurrencyFromEnv = dynamoBatchWriteCommandConcurrencyFromEnv
10
- ? parseInt(dynamoBatchWriteCommandConcurrencyFromEnv)
10
+ ? Number.parseInt(dynamoBatchWriteCommandConcurrencyFromEnv)
11
11
  : undefined;
12
12
  if (parsedDynamoBatchWriteCommandConcurrencyFromEnv &&
13
- !isNaN(parsedDynamoBatchWriteCommandConcurrencyFromEnv)) {
13
+ !Number.isNaN(parsedDynamoBatchWriteCommandConcurrencyFromEnv)) {
14
14
  return parsedDynamoBatchWriteCommandConcurrencyFromEnv;
15
15
  }
16
16
  return DEFAULT_DYNAMO_BATCH_WRITE_COMMAND_CONCURRENCY;
@@ -1,3 +1,3 @@
1
- import type { TagCache } from "./types";
1
+ import type { TagCache } from "../../types/overrides";
2
2
  declare const dummyTagCache: TagCache;
3
3
  export default dummyTagCache;
@@ -1,3 +1,3 @@
1
- import type { TagCache } from "./types";
1
+ import type { TagCache } from "../../types/overrides";
2
2
  declare const tagCache: TagCache;
3
3
  export default tagCache;
@@ -1,27 +1,25 @@
1
1
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
+ import path from "node:path";
2
3
  import { AwsClient } from "aws4fetch";
3
- import path from "path";
4
4
  import { RecoverableError } from "../../utils/error";
5
5
  import { customFetchClient } from "../../utils/fetch";
6
6
  import { debug, error } from "../../adapters/logger";
7
7
  import { chunk, parseNumberFromEnv } from "../../adapters/util";
8
- import { getDynamoBatchWriteCommandConcurrency, MAX_DYNAMO_BATCH_WRITE_ITEM_COUNT, } from "./constants";
8
+ import { MAX_DYNAMO_BATCH_WRITE_ITEM_COUNT, getDynamoBatchWriteCommandConcurrency, } from "./constants";
9
9
  let awsClient = null;
10
10
  const getAwsClient = () => {
11
11
  const { CACHE_BUCKET_REGION } = process.env;
12
12
  if (awsClient) {
13
13
  return awsClient;
14
14
  }
15
- else {
16
- awsClient = new AwsClient({
17
- accessKeyId: process.env.AWS_ACCESS_KEY_ID,
18
- secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
19
- sessionToken: process.env.AWS_SESSION_TOKEN,
20
- region: CACHE_BUCKET_REGION,
21
- retries: parseNumberFromEnv(process.env.AWS_SDK_S3_MAX_ATTEMPTS),
22
- });
23
- return awsClient;
24
- }
15
+ awsClient = new AwsClient({
16
+ accessKeyId: process.env.AWS_ACCESS_KEY_ID,
17
+ secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
18
+ sessionToken: process.env.AWS_SESSION_TOKEN,
19
+ region: CACHE_BUCKET_REGION,
20
+ retries: parseNumberFromEnv(process.env.AWS_SDK_S3_MAX_ATTEMPTS),
21
+ });
22
+ return awsClient;
25
23
  };
26
24
  const awsFetch = (body, type = "query") => {
27
25
  const { CACHE_BUCKET_REGION } = process.env;
@@ -1,3 +1,3 @@
1
- import type { TagCache } from "./types";
1
+ import type { TagCache } from "../../types/overrides";
2
2
  declare const tagCache: TagCache;
3
3
  export default tagCache;
@@ -1,8 +1,8 @@
1
+ import path from "node:path";
1
2
  import { BatchWriteItemCommand, DynamoDBClient, QueryCommand, } from "@aws-sdk/client-dynamodb";
2
- import path from "path";
3
3
  import { awsLogger, debug, error } from "../../adapters/logger";
4
4
  import { chunk, parseNumberFromEnv } from "../../adapters/util";
5
- import { getDynamoBatchWriteCommandConcurrency, MAX_DYNAMO_BATCH_WRITE_ITEM_COUNT, } from "./constants";
5
+ import { MAX_DYNAMO_BATCH_WRITE_ITEM_COUNT, getDynamoBatchWriteCommandConcurrency, } from "./constants";
6
6
  const { CACHE_BUCKET_REGION, CACHE_DYNAMO_TABLE, NEXT_BUILD_ID } = process.env;
7
7
  function parseDynamoClientConfigFromEnv() {
8
8
  return {
@@ -1,3 +1,3 @@
1
- import type { Warmer } from "../../types/open-next";
1
+ import type { Warmer } from "../../types/overrides";
2
2
  declare const lambdaWarmerInvoke: Warmer;
3
3
  export default lambdaWarmerInvoke;
@@ -1,3 +1,3 @@
1
- import type { Warmer } from "../../types/open-next";
1
+ import type { Warmer } from "../../types/overrides";
2
2
  declare const dummyWarmer: Warmer;
3
3
  export default dummyWarmer;
@@ -1,6 +1,6 @@
1
- import type { WrapperHandler } from "../../types/open-next";
1
+ import type { WrapperHandler } from "../../types/overrides";
2
2
  declare const _default: {
3
- wrapper: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
3
+ wrapper: WrapperHandler;
4
4
  name: string;
5
5
  supportStreaming: boolean;
6
6
  };
@@ -1,6 +1,6 @@
1
- import type { WrapperHandler } from "../../types/open-next";
1
+ import type { WrapperHandler } from "../../types/overrides";
2
2
  declare const _default: {
3
- wrapper: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
3
+ wrapper: WrapperHandler;
4
4
  name: string;
5
5
  supportStreaming: boolean;
6
6
  };
@@ -1,4 +1,5 @@
1
- import type { InternalEvent, InternalResult, WrapperHandler } from "../../types/open-next";
1
+ import type { InternalEvent, InternalResult } from "../../types/open-next";
2
+ import type { WrapperHandler } from "../../types/overrides";
2
3
  import type { MiddlewareOutputEvent } from "../../core/routingHandler";
3
4
  declare const _default: {
4
5
  wrapper: WrapperHandler<InternalEvent, InternalResult | ({
@@ -1,5 +1,13 @@
1
- const handler = async (handler, converter) => async (event, env) => {
1
+ const cfPropNameToHeaderName = {
2
+ city: "x-open-next-city",
3
+ country: "x-open-next-country",
4
+ regionCode: "x-open-next-region",
5
+ latitude: "x-open-next-latitude",
6
+ longitude: "x-open-next-longitude",
7
+ };
8
+ const handler = async (handler, converter) => async (request, env, ctx) => {
2
9
  globalThis.process = process;
10
+ globalThis.openNextWaitUntil = ctx.waitUntil.bind(ctx);
3
11
  // Set the environment variables
4
12
  // Cloudflare suggests to not override the process.env object but instead apply the values to it
5
13
  for (const [key, value] of Object.entries(env)) {
@@ -7,7 +15,17 @@ const handler = async (handler, converter) => async (event, env) => {
7
15
  process.env[key] = value;
8
16
  }
9
17
  }
10
- const internalEvent = await converter.convertFrom(event);
18
+ const internalEvent = await converter.convertFrom(request);
19
+ // Retrieve geo information from the cloudflare request
20
+ // See https://developers.cloudflare.com/workers/runtime-apis/request
21
+ // Note: This code could be moved to a cloudflare specific converter when one is created.
22
+ const cfProperties = request.cf;
23
+ for (const [propName, headerName] of Object.entries(cfPropNameToHeaderName)) {
24
+ const propValue = cfProperties[propName];
25
+ if (propValue !== null) {
26
+ internalEvent.headers[headerName] = propValue;
27
+ }
28
+ }
11
29
  const response = await handler(internalEvent);
12
30
  const result = await converter.convertTo(response);
13
31
  return result;
@@ -1,7 +1,7 @@
1
- import type { WrapperHandler } from "../../types/open-next";
1
+ import type { WrapperHandler } from "../../types/overrides";
2
2
  declare const _default: {
3
3
  name: string;
4
- handler: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
4
+ handler: WrapperHandler;
5
5
  supportStreaming: boolean;
6
6
  };
7
7
  export default _default;
@@ -1,6 +1,6 @@
1
- import type { WrapperHandler } from "../../types/open-next";
1
+ import type { WrapperHandler } from "../../types/overrides";
2
2
  declare const _default: {
3
- wrapper: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
3
+ wrapper: WrapperHandler;
4
4
  name: string;
5
5
  supportStreaming: boolean;
6
6
  };
@@ -28,9 +28,9 @@ const wrapper = async (handler, converter) => {
28
28
  await new Promise((resolve) => {
29
29
  server.on("listening", () => {
30
30
  const cleanup = (code) => {
31
- debug(`Closing server`);
31
+ debug("Closing server");
32
32
  server.close(() => {
33
- debug(`Server closed`);
33
+ debug("Server closed");
34
34
  process.exit(code);
35
35
  });
36
36
  };
@@ -41,7 +41,7 @@ const wrapper = async (handler, converter) => {
41
41
  process.on("SIGTERM", () => cleanup(0));
42
42
  resolve();
43
43
  });
44
- server.listen(parseInt(process.env.PORT ?? "3000", 10));
44
+ server.listen(Number.parseInt(process.env.PORT ?? "3000", 10));
45
45
  });
46
46
  server.on("error", (err) => {
47
47
  error(err);
@@ -1,6 +1,8 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import path from "node:path";
3
+ import chalk from "chalk";
3
4
  import { loadAppPathsManifestKeys, loadBuildId, loadConfig, loadConfigHeaders, loadHtmlPages, loadMiddlewareManifest, loadPrerenderManifest, loadRoutesManifest, } from "../adapters/config/util.js";
5
+ import logger from "../logger.js";
4
6
  /**
5
7
  * @param opts.nextDir - The path to the .next directory
6
8
  * @param opts.edgeFunctionHandlerPath - The path to the edgeFunctionHandler.js file that we'll use to bundle the routing
@@ -23,6 +25,7 @@ export function openNextEdgePlugins({ nextDir, edgeFunctionHandlerPath, middlewa
23
25
  return {
24
26
  name: "opennext-edge",
25
27
  setup(build) {
28
+ logger.debug(chalk.blue("OpenNext Edge plugin"));
26
29
  if (edgeFunctionHandlerPath) {
27
30
  // If we bundle the routing, we need to resolve the middleware
28
31
  build.onResolve({ filter: /\.\/middleware.mjs/g }, () => {
@@ -60,7 +63,7 @@ globalThis.self = globalThis;
60
63
  globalThis._ROUTES = ${JSON.stringify(routes)};
61
64
 
62
65
  ${isInCloudfare
63
- ? ``
66
+ ? ""
64
67
  : `
65
68
  import {readFileSync} from "node:fs";
66
69
  import path from "node:path";
@@ -124,13 +127,11 @@ ${contents}
124
127
  const AppPathsManifestKeys = loadAppPathsManifestKeys(nextDir);
125
128
  const MiddlewareManifest = loadMiddlewareManifest(nextDir);
126
129
  const contents = `
127
- import path from "path";
130
+ import path from "node:path";
128
131
 
129
132
  import { debug } from "../logger";
130
133
 
131
- if(!globalThis.__dirname) {
132
- globalThis.__dirname = ""
133
- }
134
+ globalThis.__dirname ??= "";
134
135
 
135
136
  export const NEXT_DIR = path.join(__dirname, ".next");
136
137
  export const OPEN_NEXT_DIR = path.join(__dirname, ".open-next");
@@ -46,7 +46,7 @@ export function openNextReplacementPlugin({ target, replacements, deletes, name,
46
46
  await Promise.all([
47
47
  ...(deletes ?? []).map(async (id) => {
48
48
  const pattern = new RegExp(`\/\/#override (${id})\n([\\s\\S]*?)\/\/#endOverride`);
49
- logger.debug(chalk.blue(`Open-next replacement plugin ${name}`), ` -- Deleting override for ${id}`);
49
+ logger.debug(chalk.blue(`OpenNext Replacement plugin ${name}`), `Delete override ${id}`);
50
50
  contents = contents.replace(pattern, "");
51
51
  }),
52
52
  ...(replacements ?? []).map(async (filename) => {
@@ -59,7 +59,7 @@ export function openNextReplacementPlugin({ target, replacements, deletes, name,
59
59
  const replacement = match[2];
60
60
  const id = match[1];
61
61
  const pattern = new RegExp(`\/\/#override (${id})\n([\\s\\S]*?)\/\/#endOverride`, "g");
62
- logger.debug(chalk.blue(`Open-next replacement plugin ${name}`), `-- Applying override for ${id} from ${filename}`);
62
+ logger.debug(chalk.blue(`Open-next replacement plugin ${name}`), `Apply override ${id} from ${filename}`);
63
63
  contents = contents.replace(pattern, replacement);
64
64
  }
65
65
  }),
@@ -1,5 +1,6 @@
1
1
  import type { Plugin } from "esbuild";
2
- import type { DefaultOverrideOptions, ImageLoader, IncludedImageLoader, IncludedOriginResolver, IncludedWarmer, LazyLoadedOverride, OriginResolver, OverrideOptions, Warmer } from "../types/open-next";
2
+ import type { DefaultOverrideOptions, IncludedImageLoader, IncludedOriginResolver, IncludedWarmer, LazyLoadedOverride, OverrideOptions } from "../types/open-next";
3
+ import type { ImageLoader, OriginResolver, Warmer } from "../types/overrides";
3
4
  export interface IPluginSettings {
4
5
  overrides?: {
5
6
  wrapper?: DefaultOverrideOptions<any, any>["wrapper"];
@@ -10,6 +11,7 @@ export interface IPluginSettings {
10
11
  imageLoader?: LazyLoadedOverride<ImageLoader> | IncludedImageLoader;
11
12
  originResolver?: LazyLoadedOverride<OriginResolver> | IncludedOriginResolver;
12
13
  warmer?: LazyLoadedOverride<Warmer> | IncludedWarmer;
14
+ proxyExternalRequest?: OverrideOptions["proxyExternalRequest"];
13
15
  };
14
16
  fnName?: string;
15
17
  }
@@ -1,4 +1,5 @@
1
1
  import { readFileSync } from "node:fs";
2
+ import chalk from "chalk";
2
3
  import logger from "../logger.js";
3
4
  function getOverrideOrDummy(override) {
4
5
  if (typeof override === "string") {
@@ -17,6 +18,7 @@ const nameToFolder = {
17
18
  imageLoader: "imageLoader",
18
19
  originResolver: "originResolver",
19
20
  warmer: "warmer",
21
+ proxyExternalRequest: "proxyExternalRequest",
20
22
  };
21
23
  const defaultOverrides = {
22
24
  wrapper: "aws-lambda",
@@ -27,6 +29,7 @@ const defaultOverrides = {
27
29
  imageLoader: "s3",
28
30
  originResolver: "pattern-env",
29
31
  warmer: "aws-lambda",
32
+ proxyExternalRequest: "node",
30
33
  };
31
34
  /**
32
35
  * @param opts.overrides - The name of the overrides to use
@@ -36,7 +39,7 @@ export function openNextResolvePlugin({ overrides, fnName, }) {
36
39
  return {
37
40
  name: "opennext-resolve",
38
41
  setup(build) {
39
- logger.debug(`OpenNext Resolve plugin for ${fnName}`);
42
+ logger.debug(chalk.blue("OpenNext Resolve plugin"), fnName ? `for ${fnName}` : "");
40
43
  build.onLoad({ filter: /core(\/|\\)resolve\.js/g }, async (args) => {
41
44
  let contents = readFileSync(args.path, "utf-8");
42
45
  const overridesEntries = Object.entries(overrides ?? {});
@@ -1,8 +1,5 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- /// <reference types="node" />
1
+ import type { Writable } from "node:stream";
4
2
  import type { APIGatewayProxyEventV2, Context } from "aws-lambda";
5
- import type { Writable } from "stream";
6
3
  export interface ResponseStream extends Writable {
7
4
  getBufferedData(): Buffer;
8
5
  setContentType(contentType: string): void;
@@ -15,7 +12,7 @@ interface Metadata {
15
12
  declare global {
16
13
  namespace awslambda {
17
14
  function streamifyResponse(handler: Handler): Handler;
18
- module HttpResponseStream {
15
+ namespace HttpResponseStream {
19
16
  function from(res: Writable, metadata: Metadata): ResponseStream;
20
17
  }
21
18
  }
@@ -1,5 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
1
  interface CachedFetchValue {
4
2
  kind: "FETCH";
5
3
  data: {
@@ -0,0 +1,188 @@
1
+ import type { AsyncLocalStorage } from "node:async_hooks";
2
+ import type { OutgoingHttpHeaders } from "node:http";
3
+ import type { IncrementalCache, ProxyExternalRequest, Queue, TagCache } from "./overrides";
4
+ import type { DetachedPromiseRunner } from "../utils/promise";
5
+ import type { OpenNextConfig } from "./open-next";
6
+ export interface RequestData {
7
+ geo?: {
8
+ city?: string;
9
+ country?: string;
10
+ region?: string;
11
+ latitude?: string;
12
+ longitude?: string;
13
+ };
14
+ headers: OutgoingHttpHeaders;
15
+ ip?: string;
16
+ method: string;
17
+ nextConfig?: {
18
+ basePath?: string;
19
+ i18n?: any;
20
+ trailingSlash?: boolean;
21
+ };
22
+ page?: {
23
+ name?: string;
24
+ params?: {
25
+ [key: string]: string | string[];
26
+ };
27
+ };
28
+ url: string;
29
+ body?: ReadableStream<Uint8Array>;
30
+ signal: AbortSignal;
31
+ }
32
+ interface Entries {
33
+ [k: string]: {
34
+ default: (props: {
35
+ page: string;
36
+ request: RequestData;
37
+ }) => Promise<{
38
+ response: Response;
39
+ waitUntil: Promise<void>;
40
+ }>;
41
+ };
42
+ }
43
+ export interface EdgeRoute {
44
+ name: string;
45
+ page: string;
46
+ regex: string[];
47
+ }
48
+ interface OpenNextRequestContext {
49
+ requestId: string;
50
+ pendingPromiseRunner: DetachedPromiseRunner;
51
+ isISRRevalidation?: boolean;
52
+ mergeHeadersPriority?: "middleware" | "handler";
53
+ }
54
+ declare global {
55
+ /**
56
+ * The cache adapter for incremental static regeneration.
57
+ * Only available in main functions or in the external middleware with `enableCacheInterception` set to `true`.
58
+ * Defined in `createMainHandler` or in `adapter/middleware.ts`.
59
+ */
60
+ var incrementalCache: IncrementalCache;
61
+ /**
62
+ * The cache adapter for the tag cache.
63
+ * Only available in main functions, the initializationFunction or in the external middleware with `enableCacheInterception` set to `true`.
64
+ * Defined in `createMainHandler` or in `adapter/middleware.ts`.
65
+ */
66
+ var tagCache: TagCache;
67
+ /**
68
+ * A boolean that indicates if the DynamoDB cache is disabled.
69
+ * TODO: Remove this, we already have access to the config file
70
+ * Defined in esbuild banner for the cache adapter.
71
+ */
72
+ var disableDynamoDBCache: boolean;
73
+ /**
74
+ * A boolean that indicates if the incremental cache is disabled.
75
+ * TODO: Remove this, we already have access to the config file
76
+ * Defined in esbuild banner for the cache adapter.
77
+ */
78
+ var disableIncrementalCache: boolean;
79
+ /**
80
+ * An object that contains the last modified time of the pages.
81
+ * Only available in main functions.
82
+ * TODO: Integrate this directly in the AsyncLocalStorage context
83
+ * Defined in `createMainHandler`.
84
+ */
85
+ var lastModified: Record<string, number>;
86
+ /**
87
+ * A boolean that indicates if Next is V15 or higher.
88
+ * Only available in the cache adapter.
89
+ * Defined in the esbuild banner for the cache adapter.
90
+ */
91
+ var isNextAfter15: boolean;
92
+ /**
93
+ * A boolean that indicates if the runtime is Edge.
94
+ * Only available in `edge` runtime functions (i.e. external middleware or function with edge runtime).
95
+ * Defined in the `edge-adapter.ts`.
96
+ */
97
+ var isEdgeRuntime: true;
98
+ /**
99
+ * A boolean that indicates if we are running in debug mode.
100
+ * Available in all functions.
101
+ * Defined in the esbuild banner.
102
+ */
103
+ var openNextDebug: boolean;
104
+ /**
105
+ * The fetch function that should be used to make requests during the execution of the function.
106
+ * Used to bypass Next intercepting and caching the fetch calls. Only available in main functions.
107
+ * Defined in the `server-adapter.ts` and in `adapters/middleware.ts`.
108
+ */
109
+ var internalFetch: typeof fetch;
110
+ /**
111
+ * The Open Next configuration object.
112
+ * Available in all functions.
113
+ * Defined in the `createMainHandler` or in the `createGenericHandler`.
114
+ */
115
+ var openNextConfig: Partial<OpenNextConfig>;
116
+ /**
117
+ * The name of the function that is currently being executed.
118
+ * Only available in main functions.
119
+ * Defined in the `createMainHandler`.
120
+ */
121
+ var fnName: string | undefined;
122
+ /**
123
+ * The unique identifier of the server.
124
+ * Only available in main functions.
125
+ * Defined in the `createMainHandler`.
126
+ */
127
+ var serverId: string;
128
+ /**
129
+ * The AsyncLocalStorage instance that is used to store the request context.
130
+ * Only available in main, middleware and edge functions.
131
+ * TODO: should be available everywhere in the future.
132
+ * Defined in `requestHandler.ts`, `middleware.ts` and `edge-adapter.ts`.
133
+ */
134
+ var __openNextAls: AsyncLocalStorage<OpenNextRequestContext>;
135
+ /**
136
+ * The function that is used to run background tasks even after the response has been sent.
137
+ * This one is defined by the wrapper function as most of them don't need or support this feature.
138
+ * If not present, all the awaiting promises will be resolved before sending the response.
139
+ */
140
+ var openNextWaitUntil: ((promise: Promise<void>) => void) | undefined;
141
+ /**
142
+ * The entries object that contains the functions that are available in the function.
143
+ * Only available in edge runtime functions.
144
+ * Defined in the esbuild edge plugin.
145
+ */
146
+ var _ENTRIES: Entries;
147
+ /**
148
+ * The routes object that contains the routes that are available in the function.
149
+ * Only available in edge runtime functions.
150
+ * Defined in the esbuild edge plugin.
151
+ */
152
+ var _ROUTES: EdgeRoute[];
153
+ /**
154
+ * A map that is used in the edge runtime.
155
+ * Only available in edge runtime functions.
156
+ */
157
+ var __storage__: Map<unknown, unknown>;
158
+ /**
159
+ * AsyncContext available globally in the edge runtime.
160
+ * Only available in edge runtime functions.
161
+ */
162
+ var AsyncContext: any;
163
+ /**
164
+ * AsyncLocalStorage available globally in the edge runtime.
165
+ * Only available in edge runtime functions.
166
+ * Defined in createEdgeBundle.
167
+ */
168
+ var AsyncLocalStorage: any;
169
+ /**
170
+ * The version of the Open Next runtime.
171
+ * Available everywhere.
172
+ * Defined in the esbuild banner.
173
+ */
174
+ var openNextVersion: string;
175
+ /**
176
+ * The queue that is used to handle ISR revalidation requests.
177
+ * Only available in main functions and in the external middleware with `enableCacheInterception` set to `true`.
178
+ * Defined in `createMainHandler` or in `adapter/middleware.ts`.
179
+ */
180
+ var queue: Queue;
181
+ /**
182
+ * The function that is used when resolving external rewrite requests.
183
+ * Only available in main functions
184
+ * Defined in `createMainHandler`.
185
+ */
186
+ var proxyExternalRequest: ProxyExternalRequest;
187
+ }
188
+ export {};
@@ -151,7 +151,5 @@ export type Options = {
151
151
  buildId: string;
152
152
  isExternalRewrite?: boolean;
153
153
  };
154
- export interface PluginHandler {
155
- (req: IncomingMessage, res: OpenNextNodeResponse, options: Options): Promise<OpenNextNodeResponse | undefined>;
156
- }
154
+ export type PluginHandler = (req: IncomingMessage, res: OpenNextNodeResponse, options: Options) => Promise<OpenNextNodeResponse | undefined>;
157
155
  export {};