@opennextjs/aws 3.1.6 → 3.2.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.
Files changed (152) hide show
  1. package/README.md +27 -22
  2. package/dist/adapters/binary.js +2 -0
  3. package/dist/adapters/cache.d.ts +4 -2
  4. package/dist/adapters/cache.js +14 -8
  5. package/dist/adapters/config/util.d.ts +2 -2
  6. package/dist/adapters/image-optimization-adapter.d.ts +2 -2
  7. package/dist/adapters/middleware.js +5 -52
  8. package/dist/adapters/plugins/image-optimization/image-optimization.d.ts +7 -4
  9. package/dist/adapters/plugins/image-optimization/image-optimization.js +2 -3
  10. package/dist/adapters/plugins/image-optimization/image-optimization.replacement.d.ts +3 -0
  11. package/dist/adapters/plugins/image-optimization/image-optimization.replacement.js +4 -7
  12. package/dist/adapters/warmer-function.js +2 -67
  13. package/dist/build/buildNextApp.d.ts +3 -0
  14. package/dist/build/buildNextApp.js +19 -0
  15. package/dist/build/bundleNextServer.js +2 -2
  16. package/dist/build/compileCache.d.ts +9 -0
  17. package/dist/build/compileCache.js +30 -0
  18. package/dist/build/compileConfig.d.ts +17 -3
  19. package/dist/build/compileConfig.js +56 -34
  20. package/dist/build/compileTagCacheProvider.d.ts +2 -0
  21. package/dist/build/compileTagCacheProvider.js +26 -0
  22. package/dist/build/copyTracedFiles.js +2 -2
  23. package/dist/build/createAssets.d.ts +11 -0
  24. package/dist/build/createAssets.js +161 -0
  25. package/dist/build/createImageOptimizationBundle.d.ts +2 -0
  26. package/dist/build/createImageOptimizationBundle.js +82 -0
  27. package/dist/build/createMiddleware.d.ts +10 -0
  28. package/dist/build/createMiddleware.js +47 -0
  29. package/dist/build/createRevalidationBundle.d.ts +2 -0
  30. package/dist/build/createRevalidationBundle.js +35 -0
  31. package/dist/build/createServerBundle.d.ts +2 -2
  32. package/dist/build/createServerBundle.js +35 -39
  33. package/dist/build/createWarmerBundle.d.ts +2 -0
  34. package/dist/build/createWarmerBundle.js +44 -0
  35. package/dist/build/edge/createEdgeBundle.d.ts +6 -8
  36. package/dist/build/edge/createEdgeBundle.js +11 -15
  37. package/dist/build/helper.d.ts +22 -5
  38. package/dist/build/helper.js +42 -11
  39. package/dist/build/installDeps.d.ts +2 -0
  40. package/dist/build/installDeps.js +46 -0
  41. package/dist/build/utils.d.ts +5 -0
  42. package/dist/build/utils.js +22 -0
  43. package/dist/build/validateConfig.d.ts +1 -1
  44. package/dist/build.d.ts +0 -4
  45. package/dist/build.js +26 -486
  46. package/dist/core/createGenericHandler.js +5 -5
  47. package/dist/core/createMainHandler.d.ts +3 -3
  48. package/dist/core/createMainHandler.js +5 -5
  49. package/dist/core/requestHandler.d.ts +2 -2
  50. package/dist/core/requestHandler.js +2 -2
  51. package/dist/core/resolve.d.ts +13 -4
  52. package/dist/core/resolve.js +30 -5
  53. package/dist/core/routing/cacheInterceptor.d.ts +1 -1
  54. package/dist/core/routing/i18n/index.d.ts +1 -1
  55. package/dist/core/routing/i18n/index.js +3 -0
  56. package/dist/core/routing/matcher.d.ts +2 -1
  57. package/dist/core/routing/matcher.js +13 -6
  58. package/dist/core/routing/middleware.d.ts +6 -2
  59. package/dist/core/routing/middleware.js +13 -7
  60. package/dist/core/routing/util.d.ts +3 -2
  61. package/dist/core/routing/util.js +16 -7
  62. package/dist/core/routingHandler.d.ts +1 -1
  63. package/dist/core/routingHandler.js +1 -1
  64. package/dist/helpers/withCloudflare.d.ts +1 -1
  65. package/dist/helpers/withSST.d.ts +1 -1
  66. package/dist/http/openNextResponse.d.ts +10 -2
  67. package/dist/http/openNextResponse.js +27 -0
  68. package/dist/http/request.d.ts +1 -0
  69. package/dist/http/util.d.ts +1 -1
  70. package/dist/{converters → overrides/converters}/aws-apigw-v1.d.ts +1 -1
  71. package/dist/{converters → overrides/converters}/aws-apigw-v1.js +2 -2
  72. package/dist/{converters → overrides/converters}/aws-apigw-v2.d.ts +1 -1
  73. package/dist/{converters → overrides/converters}/aws-apigw-v2.js +4 -4
  74. package/dist/{converters → overrides/converters}/aws-cloudfront.d.ts +1 -1
  75. package/dist/{converters → overrides/converters}/aws-cloudfront.js +6 -7
  76. package/dist/{converters → overrides/converters}/dummy.d.ts +1 -1
  77. package/dist/overrides/converters/edge.d.ts +9 -0
  78. package/dist/{converters → overrides/converters}/edge.js +6 -3
  79. package/dist/{converters → overrides/converters}/node.d.ts +1 -1
  80. package/dist/{converters → overrides/converters}/node.js +1 -1
  81. package/dist/overrides/converters/sqs-revalidate.d.ts +4 -0
  82. package/dist/overrides/imageLoader/dummy.d.ts +3 -0
  83. package/dist/overrides/imageLoader/dummy.js +8 -0
  84. package/dist/overrides/imageLoader/host.d.ts +1 -1
  85. package/dist/overrides/imageLoader/s3.d.ts +1 -1
  86. package/dist/overrides/incrementalCache/dummy.d.ts +3 -0
  87. package/dist/overrides/incrementalCache/dummy.js +13 -0
  88. package/dist/{cache/incremental → overrides/incrementalCache}/s3-lite.d.ts +1 -1
  89. package/dist/{cache/incremental → overrides/incrementalCache}/s3.d.ts +1 -1
  90. package/dist/{cache/incremental → overrides/incrementalCache}/types.d.ts +1 -1
  91. package/dist/overrides/originResolver/dummy.d.ts +3 -0
  92. package/dist/overrides/originResolver/dummy.js +7 -0
  93. package/dist/overrides/originResolver/pattern-env.d.ts +3 -0
  94. package/dist/overrides/originResolver/pattern-env.js +39 -0
  95. package/dist/overrides/queue/dummy.d.ts +3 -0
  96. package/dist/overrides/queue/dummy.js +7 -0
  97. package/dist/{queue → overrides/queue}/sqs-lite.d.ts +1 -1
  98. package/dist/{queue → overrides/queue}/sqs-lite.js +3 -3
  99. package/dist/{queue → overrides/queue}/sqs.d.ts +1 -1
  100. package/dist/{queue → overrides/queue}/sqs.js +1 -1
  101. package/dist/overrides/tagCache/dummy.d.ts +3 -0
  102. package/dist/overrides/tagCache/dummy.js +17 -0
  103. package/dist/{cache/tag → overrides/tagCache}/dynamodb-lite.d.ts +1 -1
  104. package/dist/{cache/tag → overrides/tagCache}/dynamodb-lite.js +1 -1
  105. package/dist/{cache/tag → overrides/tagCache}/dynamodb.d.ts +1 -1
  106. package/dist/{cache/tag → overrides/tagCache}/dynamodb.js +1 -1
  107. package/dist/overrides/warmer/aws-lambda.d.ts +3 -0
  108. package/dist/overrides/warmer/aws-lambda.js +59 -0
  109. package/dist/overrides/warmer/dummy.d.ts +3 -0
  110. package/dist/overrides/warmer/dummy.js +7 -0
  111. package/dist/overrides/wrappers/aws-lambda-streaming.d.ts +7 -0
  112. package/dist/{wrappers → overrides/wrappers}/aws-lambda-streaming.js +1 -1
  113. package/dist/overrides/wrappers/aws-lambda.d.ts +7 -0
  114. package/dist/{wrappers → overrides/wrappers}/cloudflare.d.ts +2 -2
  115. package/dist/{wrappers → overrides/wrappers}/cloudflare.js +1 -1
  116. package/dist/overrides/wrappers/dummy.d.ts +7 -0
  117. package/dist/overrides/wrappers/dummy.js +6 -0
  118. package/dist/overrides/wrappers/node.d.ts +7 -0
  119. package/dist/{wrappers → overrides/wrappers}/node.js +1 -1
  120. package/dist/plugins/edge.d.ts +5 -4
  121. package/dist/plugins/edge.js +27 -29
  122. package/dist/plugins/replacement.d.ts +2 -2
  123. package/dist/plugins/replacement.js +4 -5
  124. package/dist/plugins/resolve.d.ts +4 -2
  125. package/dist/plugins/resolve.js +32 -20
  126. package/dist/types/aws-lambda.d.ts +3 -2
  127. package/dist/{cache/next-types.d.ts → types/cache.d.ts} +1 -0
  128. package/dist/types/next-types.d.ts +3 -1
  129. package/dist/types/open-next.d.ts +44 -13
  130. package/package.json +2 -2
  131. package/dist/adapters/plugins/without-routing/requestHandler.d.ts +0 -2
  132. package/dist/adapters/plugins/without-routing/requestHandler.js +0 -10
  133. package/dist/converters/edge.d.ts +0 -6
  134. package/dist/converters/sqs-revalidate.d.ts +0 -4
  135. package/dist/wrappers/aws-lambda-streaming.d.ts +0 -7
  136. package/dist/wrappers/aws-lambda.d.ts +0 -7
  137. package/dist/wrappers/node.d.ts +0 -7
  138. /package/dist/{converters → overrides/converters}/dummy.js +0 -0
  139. /package/dist/{converters → overrides/converters}/sqs-revalidate.js +0 -0
  140. /package/dist/{converters → overrides/converters}/utils.d.ts +0 -0
  141. /package/dist/{converters → overrides/converters}/utils.js +0 -0
  142. /package/dist/{cache/incremental → overrides/incrementalCache}/s3-lite.js +0 -0
  143. /package/dist/{cache/incremental → overrides/incrementalCache}/s3.js +0 -0
  144. /package/dist/{cache/incremental → overrides/incrementalCache}/types.js +0 -0
  145. /package/dist/{queue → overrides/queue}/types.d.ts +0 -0
  146. /package/dist/{cache/tag → overrides/queue}/types.js +0 -0
  147. /package/dist/{cache/tag → overrides/tagCache}/constants.d.ts +0 -0
  148. /package/dist/{cache/tag → overrides/tagCache}/constants.js +0 -0
  149. /package/dist/{cache/tag → overrides/tagCache}/types.d.ts +0 -0
  150. /package/dist/{queue → overrides/tagCache}/types.js +0 -0
  151. /package/dist/{wrappers → overrides/wrappers}/aws-lambda.js +0 -0
  152. /package/dist/{cache/next-types.js → types/cache.js} +0 -0
@@ -0,0 +1,13 @@
1
+ const dummyIncrementalCache = {
2
+ name: "dummy",
3
+ get: async () => {
4
+ throw new Error("Dummy cache is not implemented");
5
+ },
6
+ set: async () => {
7
+ throw new Error("Dummy cache is not implemented");
8
+ },
9
+ delete: async () => {
10
+ throw new Error("Dummy cache is not implemented");
11
+ },
12
+ };
13
+ export default dummyIncrementalCache;
@@ -1,3 +1,3 @@
1
- import { IncrementalCache } from "./types";
1
+ import type { IncrementalCache } from "./types";
2
2
  declare const incrementalCache: IncrementalCache;
3
3
  export default incrementalCache;
@@ -1,3 +1,3 @@
1
- import { IncrementalCache } from "./types";
1
+ import type { IncrementalCache } from "./types";
2
2
  declare const incrementalCache: IncrementalCache;
3
3
  export default incrementalCache;
@@ -1,4 +1,4 @@
1
- import { Meta } from "../next-types";
1
+ import type { Meta } from "../../types/cache";
2
2
  export type S3CachedFile = {
3
3
  type: "redirect";
4
4
  props?: Object;
@@ -0,0 +1,3 @@
1
+ import type { OriginResolver } from "../../types/open-next";
2
+ declare const dummyOriginResolver: OriginResolver;
3
+ export default dummyOriginResolver;
@@ -0,0 +1,7 @@
1
+ const dummyOriginResolver = {
2
+ name: "dummy",
3
+ resolve: async (_path) => {
4
+ return false;
5
+ },
6
+ };
7
+ export default dummyOriginResolver;
@@ -0,0 +1,3 @@
1
+ import type { OriginResolver } from "../../types/open-next";
2
+ declare const envLoader: OriginResolver;
3
+ export default envLoader;
@@ -0,0 +1,39 @@
1
+ import { debug, error } from "../../adapters/logger";
2
+ const envLoader = {
3
+ name: "env",
4
+ resolve: async (_path) => {
5
+ try {
6
+ const origin = JSON.parse(process.env.OPEN_NEXT_ORIGIN ?? "{}");
7
+ for (const [key, value] of Object.entries(globalThis.openNextConfig.functions ?? {}).filter(([key]) => key !== "default")) {
8
+ if (value.patterns.some((pattern) => {
9
+ // Convert cloudfront pattern to regex
10
+ return new RegExp(
11
+ // transform glob pattern to regex
12
+ "/" +
13
+ pattern
14
+ .replace(/\*\*/g, "(.*)")
15
+ .replace(/\*/g, "([^/]*)")
16
+ .replace(/\//g, "\\/")
17
+ .replace(/\?/g, ".")).test(_path);
18
+ })) {
19
+ debug("Using origin", key, value.patterns);
20
+ return origin[key];
21
+ }
22
+ }
23
+ if (_path.startsWith("/_next/image") && origin["imageOptimizer"]) {
24
+ debug("Using origin", "imageOptimizer", _path);
25
+ return origin["imageOptimizer"];
26
+ }
27
+ if (origin["default"]) {
28
+ debug("Using default origin", origin["default"], _path);
29
+ return origin["default"];
30
+ }
31
+ return false;
32
+ }
33
+ catch (e) {
34
+ error("Error while resolving origin", e);
35
+ return false;
36
+ }
37
+ },
38
+ };
39
+ export default envLoader;
@@ -0,0 +1,3 @@
1
+ import type { Queue } from "./types";
2
+ declare const dummyQueue: Queue;
3
+ export default dummyQueue;
@@ -0,0 +1,7 @@
1
+ const dummyQueue = {
2
+ name: "dummy",
3
+ send: async () => {
4
+ throw new Error("Dummy queue is not implemented");
5
+ },
6
+ };
7
+ export default dummyQueue;
@@ -1,3 +1,3 @@
1
- import { Queue } from "./types";
1
+ import type { Queue } from "./types";
2
2
  declare const queue: Queue;
3
3
  export default queue;
@@ -1,7 +1,7 @@
1
1
  import { AwsClient } from "aws4fetch";
2
- import { RecoverableError } from "../utils/error";
3
- import { customFetchClient } from "../utils/fetch";
4
- import { error } from "../adapters/logger";
2
+ import { RecoverableError } from "../../utils/error";
3
+ import { customFetchClient } from "../../utils/fetch";
4
+ import { error } from "../../adapters/logger";
5
5
  let awsClient = null;
6
6
  const getAwsClient = () => {
7
7
  if (awsClient) {
@@ -1,3 +1,3 @@
1
- import { Queue } from "./types";
1
+ import type { Queue } from "./types";
2
2
  declare const queue: Queue;
3
3
  export default queue;
@@ -1,5 +1,5 @@
1
1
  import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs";
2
- import { awsLogger } from "../adapters/logger";
2
+ import { awsLogger } from "../../adapters/logger";
3
3
  // Expected environment variables
4
4
  const { REVALIDATION_QUEUE_REGION, REVALIDATION_QUEUE_URL } = process.env;
5
5
  const sqsClient = new SQSClient({
@@ -0,0 +1,3 @@
1
+ import type { TagCache } from "./types";
2
+ declare const dummyTagCache: TagCache;
3
+ export default dummyTagCache;
@@ -0,0 +1,17 @@
1
+ // We don't want to throw error on this one because we might use it when we don't need tag cache
2
+ const dummyTagCache = {
3
+ name: "dummy",
4
+ getByPath: async () => {
5
+ return [];
6
+ },
7
+ getByTag: async () => {
8
+ return [];
9
+ },
10
+ getLastModified: async (_, lastModified) => {
11
+ return lastModified ?? Date.now();
12
+ },
13
+ writeTags: async () => {
14
+ return;
15
+ },
16
+ };
17
+ export default dummyTagCache;
@@ -1,3 +1,3 @@
1
- import { TagCache } from "./types";
1
+ import type { TagCache } from "./types";
2
2
  declare const tagCache: TagCache;
3
3
  export default tagCache;
@@ -131,7 +131,7 @@ const tagCache = {
131
131
  const revalidatedTags = (await result.json()).Items ?? [];
132
132
  debug("revalidatedTags", revalidatedTags);
133
133
  // If we have revalidated tags we return -1 to force revalidation
134
- return revalidatedTags.length > 0 ? -1 : lastModified ?? Date.now();
134
+ return revalidatedTags.length > 0 ? -1 : (lastModified ?? Date.now());
135
135
  }
136
136
  catch (e) {
137
137
  error("Failed to get revalidated tags", e);
@@ -1,3 +1,3 @@
1
- import { TagCache } from "./types";
1
+ import type { TagCache } from "./types";
2
2
  declare const tagCache: TagCache;
3
3
  export default tagCache;
@@ -93,7 +93,7 @@ const tagCache = {
93
93
  const revalidatedTags = result.Items ?? [];
94
94
  debug("revalidatedTags", revalidatedTags);
95
95
  // If we have revalidated tags we return -1 to force revalidation
96
- return revalidatedTags.length > 0 ? -1 : lastModified ?? Date.now();
96
+ return revalidatedTags.length > 0 ? -1 : (lastModified ?? Date.now());
97
97
  }
98
98
  catch (e) {
99
99
  error("Failed to get revalidated tags", e);
@@ -0,0 +1,3 @@
1
+ import type { Warmer } from "../../types/open-next";
2
+ declare const lambdaWarmerInvoke: Warmer;
3
+ export default lambdaWarmerInvoke;
@@ -0,0 +1,59 @@
1
+ import { debug, error } from "../../adapters/logger";
2
+ const lambdaWarmerInvoke = {
3
+ name: "aws-invoke",
4
+ invoke: async (warmerId) => {
5
+ const { InvokeCommand, LambdaClient } = await import("@aws-sdk/client-lambda");
6
+ const lambda = new LambdaClient({});
7
+ const warmParams = JSON.parse(process.env.WARM_PARAMS);
8
+ for (const warmParam of warmParams) {
9
+ const { concurrency: CONCURRENCY, function: FUNCTION_NAME } = warmParam;
10
+ debug({
11
+ event: "warmer invoked",
12
+ functionName: FUNCTION_NAME,
13
+ concurrency: CONCURRENCY,
14
+ warmerId,
15
+ });
16
+ const ret = await Promise.all(Array.from({ length: CONCURRENCY }, (_v, i) => i).map((i) => {
17
+ try {
18
+ return lambda.send(new InvokeCommand({
19
+ FunctionName: FUNCTION_NAME,
20
+ InvocationType: "RequestResponse",
21
+ Payload: Buffer.from(JSON.stringify({
22
+ type: "warmer",
23
+ warmerId,
24
+ index: i,
25
+ concurrency: CONCURRENCY,
26
+ delay: 75,
27
+ })),
28
+ }));
29
+ }
30
+ catch (e) {
31
+ error(`failed to warm up #${i}`, e);
32
+ // ignore error
33
+ }
34
+ }));
35
+ // Print status
36
+ const warmedServerIds = ret
37
+ .map((r, i) => {
38
+ if (r?.StatusCode !== 200 || !r?.Payload) {
39
+ error(`failed to warm up #${i}:`, r?.Payload?.toString());
40
+ return;
41
+ }
42
+ const payload = JSON.parse(Buffer.from(r.Payload).toString());
43
+ return {
44
+ statusCode: r.StatusCode,
45
+ payload,
46
+ type: "warmer",
47
+ };
48
+ })
49
+ .filter((r) => !!r);
50
+ debug({
51
+ event: "warmer result",
52
+ sent: CONCURRENCY,
53
+ success: warmedServerIds.length,
54
+ uniqueServersWarmed: [...new Set(warmedServerIds)].length,
55
+ });
56
+ }
57
+ },
58
+ };
59
+ export default lambdaWarmerInvoke;
@@ -0,0 +1,3 @@
1
+ import type { Warmer } from "../../types/open-next";
2
+ declare const dummyWarmer: Warmer;
3
+ export default dummyWarmer;
@@ -0,0 +1,7 @@
1
+ const dummyWarmer = {
2
+ name: "dummy",
3
+ invoke: async (_) => {
4
+ throw new Error("Dummy warmer is not implemented");
5
+ },
6
+ };
7
+ export default dummyWarmer;
@@ -0,0 +1,7 @@
1
+ import type { WrapperHandler } from "../../types/open-next";
2
+ declare const _default: {
3
+ wrapper: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
4
+ name: string;
5
+ supportStreaming: boolean;
6
+ };
7
+ export default _default;
@@ -1,6 +1,6 @@
1
1
  import { Readable } from "node:stream";
2
2
  import zlib from "node:zlib";
3
- import { debug, error } from "../adapters/logger";
3
+ import { debug, error } from "../../adapters/logger";
4
4
  function formatWarmerResponse(event) {
5
5
  const result = new Promise((resolve) => {
6
6
  setTimeout(() => {
@@ -0,0 +1,7 @@
1
+ import type { WrapperHandler } from "../../types/open-next";
2
+ declare const _default: {
3
+ wrapper: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
4
+ name: string;
5
+ supportStreaming: boolean;
6
+ };
7
+ export default _default;
@@ -1,5 +1,5 @@
1
- import type { InternalEvent, InternalResult, WrapperHandler } from "../types/open-next";
2
- import { MiddlewareOutputEvent } from "../core/routingHandler";
1
+ import type { InternalEvent, InternalResult, WrapperHandler } from "../../types/open-next";
2
+ import type { MiddlewareOutputEvent } from "../../core/routingHandler";
3
3
  declare const _default: {
4
4
  wrapper: WrapperHandler<InternalEvent, InternalResult | ({
5
5
  type: "middleware";
@@ -1,7 +1,7 @@
1
1
  const handler = async (handler, converter) => async (event, env) => {
2
2
  globalThis.process = process;
3
3
  // Set the environment variables
4
- // Cloudlare suggests to not override the process.env object but instead apply the values to it
4
+ // Cloudflare suggests to not override the process.env object but instead apply the values to it
5
5
  for (const [key, value] of Object.entries(env)) {
6
6
  if (typeof value === "string") {
7
7
  process.env[key] = value;
@@ -0,0 +1,7 @@
1
+ import type { WrapperHandler } from "../../types/open-next";
2
+ declare const _default: {
3
+ name: string;
4
+ handler: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
5
+ supportStreaming: boolean;
6
+ };
7
+ export default _default;
@@ -0,0 +1,6 @@
1
+ const dummyWrapper = async () => async () => undefined;
2
+ export default {
3
+ name: "dummy",
4
+ handler: dummyWrapper,
5
+ supportStreaming: false,
6
+ };
@@ -0,0 +1,7 @@
1
+ import type { WrapperHandler } from "../../types/open-next";
2
+ declare const _default: {
3
+ wrapper: WrapperHandler<import("../../types/open-next").InternalEvent, import("../../types/open-next").InternalResult>;
4
+ name: string;
5
+ supportStreaming: boolean;
6
+ };
7
+ export default _default;
@@ -1,5 +1,5 @@
1
1
  import { createServer } from "node:http";
2
- import { debug, error } from "../adapters/logger";
2
+ import { debug, error } from "../../adapters/logger";
3
3
  const wrapper = async (handler, converter) => {
4
4
  const server = createServer(async (req, res) => {
5
5
  const internalEvent = await converter.convertFrom(req);
@@ -1,15 +1,16 @@
1
- import { Plugin } from "esbuild";
2
- import { MiddlewareInfo } from "../types/next-types.js";
1
+ import type { Plugin } from "esbuild";
2
+ import type { MiddlewareInfo } from "../types/next-types.js";
3
3
  export interface IPluginSettings {
4
4
  nextDir: string;
5
5
  edgeFunctionHandlerPath?: string;
6
- middlewareInfo: MiddlewareInfo;
6
+ middlewareInfo?: MiddlewareInfo;
7
7
  isInCloudfare?: boolean;
8
8
  }
9
9
  /**
10
10
  * @param opts.nextDir - The path to the .next directory
11
11
  * @param opts.edgeFunctionHandlerPath - The path to the edgeFunctionHandler.js file that we'll use to bundle the routing
12
- * @param opts.entryFiles - The entry files that we'll inject into the edgeFunctionHandler.js file
12
+ * @param opts.middlewareInfo - Information about the middleware
13
+ * @param opts.isInCloudfare - Whether the code runs on the cloudflare runtime
13
14
  * @returns
14
15
  */
15
16
  export declare function openNextEdgePlugins({ nextDir, edgeFunctionHandlerPath, middlewareInfo, isInCloudfare, }: IPluginSettings): Plugin;
@@ -4,19 +4,22 @@ import { loadAppPathsManifestKeys, loadBuildId, loadConfig, loadConfigHeaders, l
4
4
  /**
5
5
  * @param opts.nextDir - The path to the .next directory
6
6
  * @param opts.edgeFunctionHandlerPath - The path to the edgeFunctionHandler.js file that we'll use to bundle the routing
7
- * @param opts.entryFiles - The entry files that we'll inject into the edgeFunctionHandler.js file
7
+ * @param opts.middlewareInfo - Information about the middleware
8
+ * @param opts.isInCloudfare - Whether the code runs on the cloudflare runtime
8
9
  * @returns
9
10
  */
10
11
  export function openNextEdgePlugins({ nextDir, edgeFunctionHandlerPath, middlewareInfo, isInCloudfare, }) {
11
- const entryFiles = middlewareInfo.files.map((file) => path.join(nextDir, file));
12
- const routes = [
13
- {
14
- name: middlewareInfo.name || "/",
15
- page: middlewareInfo.page,
16
- regex: middlewareInfo.matchers.map((m) => m.regexp),
17
- },
18
- ];
19
- const wasmFiles = middlewareInfo.wasm ?? [];
12
+ const entryFiles = middlewareInfo?.files.map((file) => path.join(nextDir, file)) ?? [];
13
+ const routes = middlewareInfo
14
+ ? [
15
+ {
16
+ name: middlewareInfo.name || "/",
17
+ page: middlewareInfo.page,
18
+ regex: middlewareInfo.matchers.map((m) => m.regexp),
19
+ },
20
+ ]
21
+ : [];
22
+ const wasmFiles = middlewareInfo?.wasm ?? [];
20
23
  return {
21
24
  name: "opennext-edge",
22
25
  setup(build) {
@@ -44,12 +47,10 @@ export function openNextEdgePlugins({ nextDir, edgeFunctionHandlerPath, middlewa
44
47
  });
45
48
  // we convert the imports we tagged with the node-built-in-modules namespace so that instead of `require("node:*")`
46
49
  // they import from `export * from "node:*";`
47
- build.onLoad({ filter: /.*/, namespace: "node-built-in-modules" }, ({ path }) => {
48
- return {
49
- contents: `export * from '${path}'`,
50
- loader: "js",
51
- };
52
- });
50
+ build.onLoad({ filter: /.*/, namespace: "node-built-in-modules" }, ({ path }) => ({
51
+ contents: `export * from '${path}'`,
52
+ loader: "js",
53
+ }));
53
54
  // We inject the entry files into the edgeFunctionHandler
54
55
  build.onLoad({ filter: /\/edgeFunctionHandler.js/g }, async (args) => {
55
56
  let contents = readFileSync(args.path, "utf-8");
@@ -97,7 +98,7 @@ if(!globalThis.Crypto) {
97
98
  globalThis.Crypto = webcrypto.Crypto
98
99
  }
99
100
  // We also need to polyfill URLPattern
100
- if (!globalThis.URLPattern) {
101
+ if (!globalThis.URLPattern) {
101
102
  await import("urlpattern-polyfill");
102
103
  }
103
104
  `}
@@ -106,8 +107,8 @@ ${wasmFiles
106
107
  ? `import ${file.name} from './wasm/${file.name}.wasm';`
107
108
  : `const ${file.name} = readFileSync(path.join(__dirname,'/wasm/${file.name}.wasm'));`)
108
109
  .join("\n")}
109
- ${entryFiles?.map((file) => `require("${file}");`).join("\n")}
110
- ${contents}
110
+ ${entryFiles.map((file) => `require("${file}");`).join("\n")}
111
+ ${contents}
111
112
  `;
112
113
  return {
113
114
  contents,
@@ -124,18 +125,18 @@ ${contents}
124
125
  const MiddlewareManifest = loadMiddlewareManifest(nextDir);
125
126
  const contents = `
126
127
  import path from "path";
127
-
128
+
128
129
  import { debug } from "../logger";
129
-
130
+
130
131
  if(!globalThis.__dirname) {
131
132
  globalThis.__dirname = ""
132
133
  }
133
-
134
+
134
135
  export const NEXT_DIR = path.join(__dirname, ".next");
135
136
  export const OPEN_NEXT_DIR = path.join(__dirname, ".open-next");
136
-
137
+
137
138
  debug({ NEXT_DIR, OPEN_NEXT_DIR });
138
-
139
+
139
140
  export const NextConfig = ${JSON.stringify(NextConfig)};
140
141
  export const BuildId = ${JSON.stringify(BuildId)};
141
142
  export const HtmlPages = ${JSON.stringify(HtmlPages)};
@@ -146,11 +147,8 @@ ${contents}
146
147
  export const MiddlewareManifest = ${JSON.stringify(MiddlewareManifest)};
147
148
 
148
149
  process.env.NEXT_BUILD_ID = BuildId;
149
-
150
- `;
151
- return {
152
- contents,
153
- };
150
+ `;
151
+ return { contents };
154
152
  });
155
153
  },
156
154
  };
@@ -1,4 +1,4 @@
1
- import { Plugin } from "esbuild";
1
+ import type { Plugin } from "esbuild";
2
2
  export interface IPluginSettings {
3
3
  target: RegExp;
4
4
  replacements?: string[];
@@ -13,7 +13,7 @@ export interface IPluginSettings {
13
13
  * deletes: ["id1"],
14
14
  * })
15
15
  *
16
- * To inject arbritary code by using (import at top of file):
16
+ * To inject arbitrary code by using (import at top of file):
17
17
  *
18
18
  * //#import
19
19
  *
@@ -11,7 +11,7 @@ const importPattern = /\/\/#import([\s\S]*?)\n\/\/#endImport/gm;
11
11
  * deletes: ["id1"],
12
12
  * })
13
13
  *
14
- * To inject arbritary code by using (import at top of file):
14
+ * To inject arbitrary code by using (import at top of file):
15
15
  *
16
16
  * //#import
17
17
  *
@@ -49,9 +49,8 @@ export function openNextReplacementPlugin({ target, replacements, deletes, name,
49
49
  logger.debug(chalk.blue(`Open-next replacement plugin ${name}`), ` -- Deleting override for ${id}`);
50
50
  contents = contents.replace(pattern, "");
51
51
  }),
52
- ...(replacements ?? []).map(async (fp) => {
53
- const p = fp;
54
- const replacementFile = await readFile(p, "utf-8");
52
+ ...(replacements ?? []).map(async (filename) => {
53
+ const replacementFile = await readFile(filename, "utf-8");
55
54
  const matches = replacementFile.matchAll(overridePattern);
56
55
  const importMatch = replacementFile.match(importPattern);
57
56
  const addedImport = importMatch ? importMatch[0] : "";
@@ -60,7 +59,7 @@ export function openNextReplacementPlugin({ target, replacements, deletes, name,
60
59
  const replacement = match[2];
61
60
  const id = match[1];
62
61
  const pattern = new RegExp(`\/\/#override (${id})\n([\\s\\S]*?)\/\/#endOverride`, "g");
63
- logger.debug(chalk.blue(`Open-next replacement plugin ${name}`), `-- Applying override for ${id} from ${fp}`);
62
+ logger.debug(chalk.blue(`Open-next replacement plugin ${name}`), `-- Applying override for ${id} from ${filename}`);
64
63
  contents = contents.replace(pattern, replacement);
65
64
  }
66
65
  }),
@@ -1,5 +1,5 @@
1
- import { Plugin } from "esbuild";
2
- import type { DefaultOverrideOptions, ImageLoader, IncludedImageLoader, LazyLoadedOverride, OverrideOptions } from "../types/open-next";
1
+ import type { Plugin } from "esbuild";
2
+ import type { DefaultOverrideOptions, ImageLoader, IncludedImageLoader, IncludedOriginResolver, IncludedWarmer, LazyLoadedOverride, OriginResolver, OverrideOptions, Warmer } from "../types/open-next";
3
3
  export interface IPluginSettings {
4
4
  overrides?: {
5
5
  wrapper?: DefaultOverrideOptions<any, any>["wrapper"];
@@ -8,6 +8,8 @@ export interface IPluginSettings {
8
8
  queue?: OverrideOptions["queue"];
9
9
  incrementalCache?: OverrideOptions["incrementalCache"];
10
10
  imageLoader?: LazyLoadedOverride<ImageLoader> | IncludedImageLoader;
11
+ originResolver?: LazyLoadedOverride<OriginResolver> | IncludedOriginResolver;
12
+ warmer?: LazyLoadedOverride<Warmer> | IncludedWarmer;
11
13
  };
12
14
  fnName?: string;
13
15
  }
@@ -1,11 +1,33 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import logger from "../logger.js";
3
- function getOverrideOrDefault(override, defaultOverride) {
3
+ function getOverrideOrDummy(override) {
4
4
  if (typeof override === "string") {
5
5
  return override;
6
6
  }
7
- return defaultOverride;
7
+ // We can return dummy here because if it's not a string, it's a LazyLoadedOverride
8
+ return "dummy";
8
9
  }
10
+ // This could be useful in the future to map overrides to nested folders
11
+ const nameToFolder = {
12
+ wrapper: "wrappers",
13
+ converter: "converters",
14
+ tagCache: "tagCache",
15
+ queue: "queue",
16
+ incrementalCache: "incrementalCache",
17
+ imageLoader: "imageLoader",
18
+ originResolver: "originResolver",
19
+ warmer: "warmer",
20
+ };
21
+ const defaultOverrides = {
22
+ wrapper: "aws-lambda",
23
+ converter: "aws-apigw-v2",
24
+ tagCache: "dynamodb",
25
+ queue: "sqs",
26
+ incrementalCache: "s3",
27
+ imageLoader: "s3",
28
+ originResolver: "pattern-env",
29
+ warmer: "aws-lambda",
30
+ };
9
31
  /**
10
32
  * @param opts.overrides - The name of the overrides to use
11
33
  * @returns
@@ -17,24 +39,14 @@ export function openNextResolvePlugin({ overrides, fnName, }) {
17
39
  logger.debug(`OpenNext Resolve plugin for ${fnName}`);
18
40
  build.onLoad({ filter: /core(\/|\\)resolve\.js/g }, async (args) => {
19
41
  let contents = readFileSync(args.path, "utf-8");
20
- //TODO: refactor this. Every override should be at the same place so we can generate this dynamically
21
- if (overrides?.wrapper) {
22
- contents = contents.replace("../wrappers/aws-lambda.js", `../wrappers/${getOverrideOrDefault(overrides.wrapper, "aws-lambda")}.js`);
23
- }
24
- if (overrides?.converter) {
25
- contents = contents.replace("../converters/aws-apigw-v2.js", `../converters/${getOverrideOrDefault(overrides.converter, "dummy")}.js`);
26
- }
27
- if (overrides?.tagCache) {
28
- contents = contents.replace("../cache/tag/dynamodb.js", `../cache/tag/${getOverrideOrDefault(overrides.tagCache, "dynamodb-lite")}.js`);
29
- }
30
- if (overrides?.queue) {
31
- contents = contents.replace("../queue/sqs.js", `../queue/${getOverrideOrDefault(overrides.queue, "sqs-lite")}.js`);
32
- }
33
- if (overrides?.incrementalCache) {
34
- contents = contents.replace("../cache/incremental/s3.js", `../cache/incremental/${getOverrideOrDefault(overrides.incrementalCache, "s3-lite")}.js`);
35
- }
36
- if (overrides?.imageLoader) {
37
- contents = contents.replace("../overrides/imageLoader/s3.js", `../overrides/imageLoader/${getOverrideOrDefault(overrides.imageLoader, "s3")}.js`);
42
+ const overridesEntries = Object.entries(overrides ?? {});
43
+ for (const [overrideName, overrideValue] of overridesEntries) {
44
+ if (!overrideValue) {
45
+ continue;
46
+ }
47
+ const folder = nameToFolder[overrideName];
48
+ const defaultOverride = defaultOverrides[overrideName];
49
+ contents = contents.replace(`../overrides/${folder}/${defaultOverride}.js`, `../overrides/${folder}/${getOverrideOrDummy(overrideValue)}.js`);
38
50
  }
39
51
  return {
40
52
  contents,
@@ -1,7 +1,8 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
- import { APIGatewayProxyEventV2, Context } from "aws-lambda";
4
- import { Writable } from "stream";
3
+ /// <reference types="node" />
4
+ import type { APIGatewayProxyEventV2, Context } from "aws-lambda";
5
+ import type { Writable } from "stream";
5
6
  export interface ResponseStream extends Writable {
6
7
  getBufferedData(): Buffer;
7
8
  setContentType(contentType: string): void;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  interface CachedFetchValue {
3
4
  kind: "FETCH";
4
5
  data: {