@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.
- package/README.md +27 -22
- package/dist/adapters/binary.js +2 -0
- package/dist/adapters/cache.d.ts +4 -2
- package/dist/adapters/cache.js +14 -8
- package/dist/adapters/config/util.d.ts +2 -2
- package/dist/adapters/image-optimization-adapter.d.ts +2 -2
- package/dist/adapters/middleware.js +5 -52
- package/dist/adapters/plugins/image-optimization/image-optimization.d.ts +7 -4
- package/dist/adapters/plugins/image-optimization/image-optimization.js +2 -3
- package/dist/adapters/plugins/image-optimization/image-optimization.replacement.d.ts +3 -0
- package/dist/adapters/plugins/image-optimization/image-optimization.replacement.js +4 -7
- package/dist/adapters/warmer-function.js +2 -67
- package/dist/build/buildNextApp.d.ts +3 -0
- package/dist/build/buildNextApp.js +19 -0
- package/dist/build/bundleNextServer.js +2 -2
- package/dist/build/compileCache.d.ts +9 -0
- package/dist/build/compileCache.js +30 -0
- package/dist/build/compileConfig.d.ts +17 -3
- package/dist/build/compileConfig.js +56 -34
- package/dist/build/compileTagCacheProvider.d.ts +2 -0
- package/dist/build/compileTagCacheProvider.js +26 -0
- package/dist/build/copyTracedFiles.js +2 -2
- package/dist/build/createAssets.d.ts +11 -0
- package/dist/build/createAssets.js +161 -0
- package/dist/build/createImageOptimizationBundle.d.ts +2 -0
- package/dist/build/createImageOptimizationBundle.js +82 -0
- package/dist/build/createMiddleware.d.ts +10 -0
- package/dist/build/createMiddleware.js +47 -0
- package/dist/build/createRevalidationBundle.d.ts +2 -0
- package/dist/build/createRevalidationBundle.js +35 -0
- package/dist/build/createServerBundle.d.ts +2 -2
- package/dist/build/createServerBundle.js +35 -39
- package/dist/build/createWarmerBundle.d.ts +2 -0
- package/dist/build/createWarmerBundle.js +44 -0
- package/dist/build/edge/createEdgeBundle.d.ts +6 -8
- package/dist/build/edge/createEdgeBundle.js +11 -15
- package/dist/build/helper.d.ts +22 -5
- package/dist/build/helper.js +42 -11
- package/dist/build/installDeps.d.ts +2 -0
- package/dist/build/installDeps.js +46 -0
- package/dist/build/utils.d.ts +5 -0
- package/dist/build/utils.js +22 -0
- package/dist/build/validateConfig.d.ts +1 -1
- package/dist/build.d.ts +0 -4
- package/dist/build.js +26 -486
- package/dist/core/createGenericHandler.js +5 -5
- package/dist/core/createMainHandler.d.ts +3 -3
- package/dist/core/createMainHandler.js +5 -5
- package/dist/core/requestHandler.d.ts +2 -2
- package/dist/core/requestHandler.js +2 -2
- package/dist/core/resolve.d.ts +13 -4
- package/dist/core/resolve.js +30 -5
- package/dist/core/routing/cacheInterceptor.d.ts +1 -1
- package/dist/core/routing/i18n/index.d.ts +1 -1
- package/dist/core/routing/i18n/index.js +3 -0
- package/dist/core/routing/matcher.d.ts +2 -1
- package/dist/core/routing/matcher.js +13 -6
- package/dist/core/routing/middleware.d.ts +6 -2
- package/dist/core/routing/middleware.js +13 -7
- package/dist/core/routing/util.d.ts +3 -2
- package/dist/core/routing/util.js +16 -7
- package/dist/core/routingHandler.d.ts +1 -1
- package/dist/core/routingHandler.js +1 -1
- package/dist/helpers/withCloudflare.d.ts +1 -1
- package/dist/helpers/withSST.d.ts +1 -1
- package/dist/http/openNextResponse.d.ts +10 -2
- package/dist/http/openNextResponse.js +27 -0
- package/dist/http/request.d.ts +1 -0
- package/dist/http/util.d.ts +1 -1
- package/dist/{converters → overrides/converters}/aws-apigw-v1.d.ts +1 -1
- package/dist/{converters → overrides/converters}/aws-apigw-v1.js +2 -2
- package/dist/{converters → overrides/converters}/aws-apigw-v2.d.ts +1 -1
- package/dist/{converters → overrides/converters}/aws-apigw-v2.js +4 -4
- package/dist/{converters → overrides/converters}/aws-cloudfront.d.ts +1 -1
- package/dist/{converters → overrides/converters}/aws-cloudfront.js +6 -7
- package/dist/{converters → overrides/converters}/dummy.d.ts +1 -1
- package/dist/overrides/converters/edge.d.ts +9 -0
- package/dist/{converters → overrides/converters}/edge.js +6 -3
- package/dist/{converters → overrides/converters}/node.d.ts +1 -1
- package/dist/{converters → overrides/converters}/node.js +1 -1
- package/dist/overrides/converters/sqs-revalidate.d.ts +4 -0
- package/dist/overrides/imageLoader/dummy.d.ts +3 -0
- package/dist/overrides/imageLoader/dummy.js +8 -0
- package/dist/overrides/imageLoader/host.d.ts +1 -1
- package/dist/overrides/imageLoader/s3.d.ts +1 -1
- package/dist/overrides/incrementalCache/dummy.d.ts +3 -0
- package/dist/overrides/incrementalCache/dummy.js +13 -0
- package/dist/{cache/incremental → overrides/incrementalCache}/s3-lite.d.ts +1 -1
- package/dist/{cache/incremental → overrides/incrementalCache}/s3.d.ts +1 -1
- package/dist/{cache/incremental → overrides/incrementalCache}/types.d.ts +1 -1
- package/dist/overrides/originResolver/dummy.d.ts +3 -0
- package/dist/overrides/originResolver/dummy.js +7 -0
- package/dist/overrides/originResolver/pattern-env.d.ts +3 -0
- package/dist/overrides/originResolver/pattern-env.js +39 -0
- package/dist/overrides/queue/dummy.d.ts +3 -0
- package/dist/overrides/queue/dummy.js +7 -0
- package/dist/{queue → overrides/queue}/sqs-lite.d.ts +1 -1
- package/dist/{queue → overrides/queue}/sqs-lite.js +3 -3
- package/dist/{queue → overrides/queue}/sqs.d.ts +1 -1
- package/dist/{queue → overrides/queue}/sqs.js +1 -1
- package/dist/overrides/tagCache/dummy.d.ts +3 -0
- package/dist/overrides/tagCache/dummy.js +17 -0
- package/dist/{cache/tag → overrides/tagCache}/dynamodb-lite.d.ts +1 -1
- package/dist/{cache/tag → overrides/tagCache}/dynamodb-lite.js +1 -1
- package/dist/{cache/tag → overrides/tagCache}/dynamodb.d.ts +1 -1
- package/dist/{cache/tag → overrides/tagCache}/dynamodb.js +1 -1
- package/dist/overrides/warmer/aws-lambda.d.ts +3 -0
- package/dist/overrides/warmer/aws-lambda.js +59 -0
- package/dist/overrides/warmer/dummy.d.ts +3 -0
- package/dist/overrides/warmer/dummy.js +7 -0
- package/dist/overrides/wrappers/aws-lambda-streaming.d.ts +7 -0
- package/dist/{wrappers → overrides/wrappers}/aws-lambda-streaming.js +1 -1
- package/dist/overrides/wrappers/aws-lambda.d.ts +7 -0
- package/dist/{wrappers → overrides/wrappers}/cloudflare.d.ts +2 -2
- package/dist/{wrappers → overrides/wrappers}/cloudflare.js +1 -1
- package/dist/overrides/wrappers/dummy.d.ts +7 -0
- package/dist/overrides/wrappers/dummy.js +6 -0
- package/dist/overrides/wrappers/node.d.ts +7 -0
- package/dist/{wrappers → overrides/wrappers}/node.js +1 -1
- package/dist/plugins/edge.d.ts +5 -4
- package/dist/plugins/edge.js +27 -29
- package/dist/plugins/replacement.d.ts +2 -2
- package/dist/plugins/replacement.js +4 -5
- package/dist/plugins/resolve.d.ts +4 -2
- package/dist/plugins/resolve.js +32 -20
- package/dist/types/aws-lambda.d.ts +3 -2
- package/dist/{cache/next-types.d.ts → types/cache.d.ts} +1 -0
- package/dist/types/next-types.d.ts +3 -1
- package/dist/types/open-next.d.ts +44 -13
- package/package.json +2 -2
- package/dist/adapters/plugins/without-routing/requestHandler.d.ts +0 -2
- package/dist/adapters/plugins/without-routing/requestHandler.js +0 -10
- package/dist/converters/edge.d.ts +0 -6
- package/dist/converters/sqs-revalidate.d.ts +0 -4
- package/dist/wrappers/aws-lambda-streaming.d.ts +0 -7
- package/dist/wrappers/aws-lambda.d.ts +0 -7
- package/dist/wrappers/node.d.ts +0 -7
- /package/dist/{converters → overrides/converters}/dummy.js +0 -0
- /package/dist/{converters → overrides/converters}/sqs-revalidate.js +0 -0
- /package/dist/{converters → overrides/converters}/utils.d.ts +0 -0
- /package/dist/{converters → overrides/converters}/utils.js +0 -0
- /package/dist/{cache/incremental → overrides/incrementalCache}/s3-lite.js +0 -0
- /package/dist/{cache/incremental → overrides/incrementalCache}/s3.js +0 -0
- /package/dist/{cache/incremental → overrides/incrementalCache}/types.js +0 -0
- /package/dist/{queue → overrides/queue}/types.d.ts +0 -0
- /package/dist/{cache/tag → overrides/queue}/types.js +0 -0
- /package/dist/{cache/tag → overrides/tagCache}/constants.d.ts +0 -0
- /package/dist/{cache/tag → overrides/tagCache}/constants.js +0 -0
- /package/dist/{cache/tag → overrides/tagCache}/types.d.ts +0 -0
- /package/dist/{queue → overrides/tagCache}/types.js +0 -0
- /package/dist/{wrappers → overrides/wrappers}/aws-lambda.js +0 -0
- /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;
|
|
@@ -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;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AwsClient } from "aws4fetch";
|
|
2
|
-
import { RecoverableError } from "
|
|
3
|
-
import { customFetchClient } from "
|
|
4
|
-
import { error } from "
|
|
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,5 +1,5 @@
|
|
|
1
1
|
import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs";
|
|
2
|
-
import { awsLogger } from "
|
|
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,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;
|
|
@@ -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);
|
|
@@ -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,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,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 "
|
|
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 "
|
|
2
|
-
import { MiddlewareOutputEvent } from "
|
|
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
|
-
//
|
|
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,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 "
|
|
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);
|
package/dist/plugins/edge.d.ts
CHANGED
|
@@ -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
|
|
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.
|
|
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;
|
package/dist/plugins/edge.js
CHANGED
|
@@ -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.
|
|
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
|
|
12
|
-
const routes =
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
53
|
-
const
|
|
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 ${
|
|
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
|
}
|
package/dist/plugins/resolve.js
CHANGED
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import logger from "../logger.js";
|
|
3
|
-
function
|
|
3
|
+
function getOverrideOrDummy(override) {
|
|
4
4
|
if (typeof override === "string") {
|
|
5
5
|
return override;
|
|
6
6
|
}
|
|
7
|
-
return
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
4
|
-
import {
|
|
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;
|