@opennextjs/aws 3.2.1 → 3.3.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.
Files changed (155) hide show
  1. package/README.md +21 -2
  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.d.ts +1 -2
  10. package/dist/adapters/image-optimization-adapter.js +4 -4
  11. package/dist/adapters/logger.d.ts +0 -3
  12. package/dist/adapters/logger.js +32 -13
  13. package/dist/adapters/middleware.js +42 -18
  14. package/dist/adapters/plugins/image-optimization/image-optimization.d.ts +1 -3
  15. package/dist/adapters/plugins/image-optimization/image-optimization.js +0 -1
  16. package/dist/adapters/plugins/image-optimization/image-optimization.replacement.d.ts +1 -3
  17. package/dist/adapters/revalidate.js +2 -2
  18. package/dist/adapters/server-adapter.d.ts +0 -3
  19. package/dist/adapters/server-adapter.js +3 -1
  20. package/dist/adapters/util.js +2 -2
  21. package/dist/build/bundleNextServer.d.ts +3 -1
  22. package/dist/build/bundleNextServer.js +3 -3
  23. package/dist/build/compileConfig.js +1 -1
  24. package/dist/build/copyTracedFiles.js +15 -26
  25. package/dist/build/createAssets.js +36 -27
  26. package/dist/build/createImageOptimizationBundle.js +1 -1
  27. package/dist/build/createMiddleware.js +8 -3
  28. package/dist/build/createRevalidationBundle.js +1 -1
  29. package/dist/build/createServerBundle.js +25 -31
  30. package/dist/build/createWarmerBundle.js +1 -1
  31. package/dist/build/edge/createEdgeBundle.d.ts +8 -4
  32. package/dist/build/edge/createEdgeBundle.js +34 -16
  33. package/dist/build/generateOutput.js +7 -13
  34. package/dist/build/helper.d.ts +28 -5
  35. package/dist/build/helper.js +44 -15
  36. package/dist/build/installDeps.js +1 -1
  37. package/dist/build/patch/patchedAsyncStorage.js +1 -1
  38. package/dist/build/utils.js +3 -2
  39. package/dist/build/validateConfig.js +4 -1
  40. package/dist/core/createGenericHandler.d.ts +2 -4
  41. package/dist/core/createGenericHandler.js +1 -2
  42. package/dist/core/createMainHandler.d.ts +0 -17
  43. package/dist/core/createMainHandler.js +5 -4
  44. package/dist/core/edgeFunctionHandler.d.ts +1 -51
  45. package/dist/core/patchAsyncStorage.js +5 -6
  46. package/dist/core/requestHandler.d.ts +1 -2
  47. package/dist/core/requestHandler.js +99 -90
  48. package/dist/core/require-hooks.js +8 -7
  49. package/dist/core/resolve.d.ts +13 -7
  50. package/dist/core/resolve.js +29 -35
  51. package/dist/core/routing/cacheInterceptor.js +12 -13
  52. package/dist/core/routing/i18n/accept-header.js +3 -2
  53. package/dist/core/routing/matcher.d.ts +2 -4
  54. package/dist/core/routing/matcher.js +18 -27
  55. package/dist/core/routing/middleware.d.ts +3 -3
  56. package/dist/core/routing/middleware.js +20 -20
  57. package/dist/core/routing/util.d.ts +2 -15
  58. package/dist/core/routing/util.js +26 -88
  59. package/dist/core/routingHandler.d.ts +4 -8
  60. package/dist/core/routingHandler.js +36 -18
  61. package/dist/core/util.js +5 -3
  62. package/dist/helpers/withCloudflare.d.ts +1 -1
  63. package/dist/helpers/withCloudflare.js +2 -2
  64. package/dist/helpers/withSST.d.ts +1 -1
  65. package/dist/http/openNextResponse.d.ts +6 -18
  66. package/dist/http/openNextResponse.js +32 -32
  67. package/dist/http/request.d.ts +0 -3
  68. package/dist/http/request.js +4 -2
  69. package/dist/http/util.d.ts +1 -1
  70. package/dist/http/util.js +8 -12
  71. package/dist/minimize-js.js +19 -19
  72. package/dist/overrides/converters/aws-apigw-v1.d.ts +2 -2
  73. package/dist/overrides/converters/aws-apigw-v1.js +2 -1
  74. package/dist/overrides/converters/aws-apigw-v2.d.ts +2 -2
  75. package/dist/overrides/converters/aws-apigw-v2.js +8 -8
  76. package/dist/overrides/converters/aws-cloudfront.d.ts +2 -2
  77. package/dist/overrides/converters/aws-cloudfront.js +11 -30
  78. package/dist/overrides/converters/dummy.d.ts +1 -1
  79. package/dist/overrides/converters/edge.d.ts +3 -5
  80. package/dist/overrides/converters/edge.js +15 -18
  81. package/dist/overrides/converters/node.d.ts +1 -1
  82. package/dist/overrides/converters/node.js +1 -1
  83. package/dist/overrides/converters/sqs-revalidate.d.ts +1 -1
  84. package/dist/overrides/imageLoader/dummy.d.ts +1 -1
  85. package/dist/overrides/imageLoader/host.d.ts +1 -1
  86. package/dist/overrides/imageLoader/s3.d.ts +1 -1
  87. package/dist/overrides/imageLoader/s3.js +1 -1
  88. package/dist/overrides/incrementalCache/dummy.d.ts +1 -1
  89. package/dist/overrides/incrementalCache/dummy.js +4 -3
  90. package/dist/overrides/incrementalCache/s3-lite.d.ts +1 -1
  91. package/dist/overrides/incrementalCache/s3-lite.js +15 -19
  92. package/dist/overrides/incrementalCache/s3.d.ts +1 -1
  93. package/dist/overrides/incrementalCache/s3.js +1 -1
  94. package/dist/overrides/originResolver/dummy.d.ts +1 -1
  95. package/dist/overrides/originResolver/pattern-env.d.ts +1 -1
  96. package/dist/overrides/originResolver/pattern-env.js +10 -11
  97. package/dist/overrides/proxyExternalRequest/dummy.d.ts +3 -0
  98. package/dist/overrides/proxyExternalRequest/dummy.js +8 -0
  99. package/dist/overrides/proxyExternalRequest/fetch.d.ts +3 -0
  100. package/dist/overrides/proxyExternalRequest/fetch.js +25 -0
  101. package/dist/overrides/proxyExternalRequest/node.d.ts +3 -0
  102. package/dist/overrides/proxyExternalRequest/node.js +67 -0
  103. package/dist/overrides/queue/dummy.d.ts +1 -1
  104. package/dist/overrides/queue/dummy.js +2 -1
  105. package/dist/overrides/queue/sqs-lite.d.ts +1 -1
  106. package/dist/overrides/queue/sqs-lite.js +7 -9
  107. package/dist/overrides/queue/sqs.d.ts +1 -1
  108. package/dist/overrides/queue/sqs.js +1 -1
  109. package/dist/overrides/tagCache/constants.js +2 -2
  110. package/dist/overrides/tagCache/dummy.d.ts +1 -1
  111. package/dist/overrides/tagCache/dynamodb-lite.d.ts +1 -1
  112. package/dist/overrides/tagCache/dynamodb-lite.js +10 -12
  113. package/dist/overrides/tagCache/dynamodb.d.ts +1 -1
  114. package/dist/overrides/tagCache/dynamodb.js +2 -2
  115. package/dist/overrides/warmer/aws-lambda.d.ts +1 -1
  116. package/dist/overrides/warmer/dummy.d.ts +1 -1
  117. package/dist/overrides/warmer/dummy.js +2 -1
  118. package/dist/overrides/wrappers/aws-lambda-streaming.d.ts +3 -3
  119. package/dist/overrides/wrappers/aws-lambda-streaming.js +0 -4
  120. package/dist/overrides/wrappers/aws-lambda.d.ts +2 -2
  121. package/dist/overrides/wrappers/aws-lambda.js +0 -3
  122. package/dist/overrides/wrappers/cloudflare-edge.d.ts +9 -0
  123. package/dist/overrides/wrappers/cloudflare-edge.js +38 -0
  124. package/dist/overrides/wrappers/cloudflare-node.d.ts +8 -0
  125. package/dist/overrides/wrappers/cloudflare-node.js +47 -0
  126. package/dist/overrides/wrappers/dummy.d.ts +3 -3
  127. package/dist/overrides/wrappers/dummy.js +1 -1
  128. package/dist/overrides/wrappers/node.d.ts +3 -3
  129. package/dist/overrides/wrappers/node.js +3 -6
  130. package/dist/plugins/edge.js +6 -5
  131. package/dist/plugins/replacement.js +2 -2
  132. package/dist/plugins/resolve.d.ts +3 -1
  133. package/dist/plugins/resolve.js +9 -2
  134. package/dist/types/aws-lambda.d.ts +2 -5
  135. package/dist/types/cache.d.ts +0 -2
  136. package/dist/types/global.d.ts +188 -0
  137. package/dist/types/next-types.d.ts +1 -3
  138. package/dist/types/open-next.d.ts +33 -41
  139. package/dist/types/overrides.d.ts +86 -0
  140. package/dist/{adapters → utils}/binary.js +1 -0
  141. package/dist/utils/error.d.ts +1 -0
  142. package/dist/utils/error.js +8 -0
  143. package/dist/utils/promise.d.ts +3 -0
  144. package/dist/utils/promise.js +44 -0
  145. package/dist/utils/stream.d.ts +0 -1
  146. package/package.json +3 -3
  147. package/dist/overrides/incrementalCache/types.d.ts +0 -34
  148. package/dist/overrides/queue/types.d.ts +0 -12
  149. package/dist/overrides/tagCache/types.d.ts +0 -11
  150. package/dist/overrides/tagCache/types.js +0 -1
  151. package/dist/overrides/wrappers/cloudflare.d.ts +0 -11
  152. package/dist/overrides/wrappers/cloudflare.js +0 -20
  153. /package/dist/{overrides/incrementalCache/types.js → types/global.js} +0 -0
  154. /package/dist/{overrides/queue/types.js → types/overrides.js} +0 -0
  155. /package/dist/{adapters → utils}/binary.d.ts +0 -0
@@ -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,7 +1,8 @@
1
+ import { FatalError } from "../../utils/error";
1
2
  const dummyQueue = {
2
3
  name: "dummy",
3
4
  send: async () => {
4
- throw new Error("Dummy queue is not implemented");
5
+ throw new FatalError("Dummy queue is not implemented");
5
6
  },
6
7
  };
7
8
  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,7 +1,8 @@
1
+ import { FatalError } from "../../utils/error";
1
2
  const dummyWarmer = {
2
3
  name: "dummy",
3
4
  invoke: async (_) => {
4
- throw new Error("Dummy warmer is not implemented");
5
+ throw new FatalError("Dummy warmer is not implemented");
5
6
  },
6
7
  };
7
8
  export default dummyWarmer;
@@ -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
- wrapper: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
3
+ wrapper: WrapperHandler;
4
4
  name: string;
5
- supportStreaming: boolean;
5
+ supportStreaming: true;
6
6
  };
7
7
  export default _default;
@@ -62,10 +62,6 @@ const handler = async (handler, converter) => awslambda.streamifyResponse(async
62
62
  responseStream.write(new Uint8Array(8));
63
63
  return compressedStream ?? responseStream;
64
64
  },
65
- onWrite: () => {
66
- // _hasWriten = true;
67
- },
68
- onFinish: () => { },
69
65
  };
70
66
  const response = await handler(internalEvent, streamCreator);
71
67
  const isUsingEdge = globalThis.isEdgeRuntime ?? false;
@@ -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
  };
@@ -25,9 +25,6 @@ const handler = async (handler, converter) => async (event) => {
25
25
  },
26
26
  });
27
27
  },
28
- onFinish: () => {
29
- // Do nothing
30
- },
31
28
  };
32
29
  const response = await handler(internalEvent, fakeStream);
33
30
  return converter.convertTo(response, event);
@@ -0,0 +1,9 @@
1
+ import type { InternalEvent, InternalResult, MiddlewareResult } from "../../types/open-next";
2
+ import type { WrapperHandler } from "../../types/overrides";
3
+ declare const _default: {
4
+ wrapper: WrapperHandler<InternalEvent, InternalResult | MiddlewareResult>;
5
+ name: string;
6
+ supportStreaming: true;
7
+ edgeRuntime: true;
8
+ };
9
+ export default _default;
@@ -0,0 +1,38 @@
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) => {
9
+ globalThis.process = process;
10
+ globalThis.openNextWaitUntil = ctx.waitUntil.bind(ctx);
11
+ // Set the environment variables
12
+ // Cloudflare suggests to not override the process.env object but instead apply the values to it
13
+ for (const [key, value] of Object.entries(env)) {
14
+ if (typeof value === "string") {
15
+ process.env[key] = value;
16
+ }
17
+ }
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
+ }
29
+ const response = await handler(internalEvent);
30
+ const result = await converter.convertTo(response);
31
+ return result;
32
+ };
33
+ export default {
34
+ wrapper: handler,
35
+ name: "cloudflare-edge",
36
+ supportStreaming: true,
37
+ edgeRuntime: true,
38
+ };
@@ -0,0 +1,8 @@
1
+ import type { InternalEvent, InternalResult } from "../../types/open-next";
2
+ import type { WrapperHandler } from "../../types/overrides";
3
+ declare const _default: {
4
+ wrapper: WrapperHandler<InternalEvent, InternalResult>;
5
+ name: string;
6
+ supportStreaming: true;
7
+ };
8
+ export default _default;
@@ -0,0 +1,47 @@
1
+ import { Writable } from "node:stream";
2
+ const handler = async (handler, converter) => async (request, env, ctx) => {
3
+ globalThis.process = process;
4
+ globalThis.openNextWaitUntil = ctx.waitUntil.bind(ctx);
5
+ // Set the environment variables
6
+ // Cloudflare suggests to not override the process.env object but instead apply the values to it
7
+ for (const [key, value] of Object.entries(env)) {
8
+ if (typeof value === "string") {
9
+ process.env[key] = value;
10
+ }
11
+ }
12
+ const internalEvent = await converter.convertFrom(request);
13
+ // TODO:
14
+ // The edge converter populate event.url with the url including the origin.
15
+ // This is required for middleware to keep track of the protocol (i.e. http with wrangler dev).
16
+ // However the server expects that the origin is not included.
17
+ const url = new URL(internalEvent.url);
18
+ internalEvent.url = url.href.slice(url.origin.length);
19
+ const { promise: promiseResponse, resolve: resolveResponse } = Promise.withResolvers();
20
+ const streamCreator = {
21
+ writeHeaders(prelude) {
22
+ const { statusCode, cookies, headers } = prelude;
23
+ const responseHeaders = new Headers(headers);
24
+ for (const cookie of cookies) {
25
+ responseHeaders.append("Set-Cookie", cookie);
26
+ }
27
+ const { readable, writable } = new TransformStream({
28
+ transform(chunk, controller) {
29
+ controller.enqueue(Uint8Array.from(chunk.chunk ?? chunk));
30
+ },
31
+ });
32
+ const response = new Response(readable, {
33
+ status: statusCode,
34
+ headers: responseHeaders,
35
+ });
36
+ resolveResponse(response);
37
+ return Writable.fromWeb(writable);
38
+ },
39
+ };
40
+ ctx.waitUntil(handler(internalEvent, streamCreator));
41
+ return promiseResponse;
42
+ };
43
+ export default {
44
+ wrapper: handler,
45
+ name: "cloudflare-node",
46
+ supportStreaming: true,
47
+ };
@@ -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>;
5
- supportStreaming: boolean;
4
+ wrapper: WrapperHandler;
5
+ supportStreaming: false;
6
6
  };
7
7
  export default _default;
@@ -1,6 +1,6 @@
1
1
  const dummyWrapper = async () => async () => undefined;
2
2
  export default {
3
3
  name: "dummy",
4
- handler: dummyWrapper,
4
+ wrapper: dummyWrapper,
5
5
  supportStreaming: false,
6
6
  };
@@ -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
- wrapper: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
3
+ wrapper: WrapperHandler;
4
4
  name: string;
5
- supportStreaming: boolean;
5
+ supportStreaming: true;
6
6
  };
7
7
  export default _default;
@@ -11,9 +11,6 @@ const wrapper = async (handler, converter) => {
11
11
  res.uncork();
12
12
  return res;
13
13
  },
14
- onFinish: () => {
15
- // Is it necessary to do something here?
16
- },
17
14
  };
18
15
  if (internalEvent.rawPath === "/__health") {
19
16
  res.writeHead(200, {
@@ -28,9 +25,9 @@ const wrapper = async (handler, converter) => {
28
25
  await new Promise((resolve) => {
29
26
  server.on("listening", () => {
30
27
  const cleanup = (code) => {
31
- debug(`Closing server`);
28
+ debug("Closing server");
32
29
  server.close(() => {
33
- debug(`Server closed`);
30
+ debug("Server closed");
34
31
  process.exit(code);
35
32
  });
36
33
  };
@@ -41,7 +38,7 @@ const wrapper = async (handler, converter) => {
41
38
  process.on("SIGTERM", () => cleanup(0));
42
39
  resolve();
43
40
  });
44
- server.listen(parseInt(process.env.PORT ?? "3000", 10));
41
+ server.listen(Number.parseInt(process.env.PORT ?? "3000", 10));
45
42
  });
46
43
  server.on("error", (err) => {
47
44
  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,14 +39,18 @@ 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 ?? {});
43
- for (const [overrideName, overrideValue] of overridesEntries) {
46
+ for (let [overrideName, overrideValue] of overridesEntries) {
44
47
  if (!overrideValue) {
45
48
  continue;
46
49
  }
50
+ if (overrideName === "wrapper" && overrideValue === "cloudflare") {
51
+ // "cloudflare" is deprecated and replaced by "cloudflare-edge".
52
+ overrideValue = "cloudflare-edge";
53
+ }
47
54
  const folder = nameToFolder[overrideName];
48
55
  const defaultOverride = defaultOverrides[overrideName];
49
56
  contents = contents.replace(`../overrides/${folder}/${defaultOverride}.js`, `../overrides/${folder}/${getOverrideOrDummy(overrideValue)}.js`);
@@ -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: {