cdk-nextjs 0.6.1 → 0.7.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.
- package/.jsii +2467 -2714
- package/.jsii.tabl.json +1 -1
- package/API.md +1725 -1909
- package/CLAUDE.md +2 -1
- package/README.md +429 -130
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +152 -170
- package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
- package/docs/adapter-runtime.md +185 -0
- package/docs/breaking-changes.md +687 -4
- package/docs/caching-guide.md +156 -112
- package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
- package/docs/development-guide.md +1 -1
- package/docs/harness-coverage.md +598 -0
- package/docs/init-cache-deployment.md +32 -1
- package/docs/next-build-output-guide.md +30 -20
- package/examples/README.md +5 -1
- package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
- package/lib/adapter/__fixtures__/app-playground.json +4917 -0
- package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
- package/lib/adapter/adapter.mjs +1548 -185
- package/lib/adapter/adapter.test.js +106 -0
- package/lib/adapter/aws-cache-store.d.ts +489 -0
- package/lib/adapter/aws-cache-store.js +1004 -0
- package/lib/adapter/aws-cache-store.test.d.ts +1 -0
- package/lib/adapter/aws-cache-store.test.js +361 -0
- package/lib/adapter/build-outputs.d.ts +80 -0
- package/lib/adapter/build-outputs.js +852 -0
- package/lib/adapter/build-outputs.test.d.ts +1 -0
- package/lib/adapter/build-outputs.test.js +861 -0
- package/lib/adapter/cache-handler.d.ts +9 -2
- package/lib/adapter/cache-handler.js +72 -96
- package/lib/adapter/cache-handler.mjs +18956 -17774
- package/lib/adapter/cache-handler.test.js +263 -31
- package/lib/adapter/cache-kinds.d.ts +32 -0
- package/lib/adapter/cache-kinds.js +35 -0
- package/lib/adapter/cache-kinds.test.d.ts +1 -0
- package/lib/adapter/cache-kinds.test.js +69 -0
- package/lib/adapter/cache-utils.d.ts +90 -0
- package/lib/adapter/cache-utils.js +199 -4
- package/lib/adapter/cache-utils.test.d.ts +1 -0
- package/lib/adapter/cache-utils.test.js +179 -0
- package/lib/adapter/function-groups.d.ts +215 -0
- package/lib/adapter/function-groups.js +1099 -0
- package/lib/adapter/function-groups.test.d.ts +1 -0
- package/lib/adapter/function-groups.test.js +743 -0
- package/lib/adapter/init-cache.d.ts +6 -0
- package/lib/adapter/init-cache.js +245 -0
- package/lib/adapter/init-cache.test.d.ts +1 -0
- package/lib/adapter/init-cache.test.js +137 -0
- package/lib/adapter/local-file-cache-handler.d.ts +23 -0
- package/lib/adapter/local-file-cache-handler.js +52 -1
- package/lib/adapter/memory-cache-handler.d.ts +26 -17
- package/lib/adapter/memory-cache-handler.js +32 -50
- package/lib/adapter/memory-cache-handler.test.js +105 -85
- package/lib/adapter/s3-cache-handler.d.ts +179 -40
- package/lib/adapter/s3-cache-handler.js +807 -277
- package/lib/adapter/s3-cache-handler.test.js +1186 -31
- package/lib/adapter/use-cache-common.d.ts +90 -0
- package/lib/adapter/use-cache-common.js +250 -0
- package/lib/adapter/use-cache-common.test.d.ts +1 -0
- package/lib/adapter/use-cache-common.test.js +646 -0
- package/lib/adapter/use-cache-default-handler.d.ts +24 -0
- package/lib/adapter/use-cache-default-handler.js +90 -0
- package/lib/adapter/use-cache-default-handler.mjs +38645 -0
- package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
- package/lib/adapter/use-cache-handlers.test.js +349 -0
- package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
- package/lib/adapter/use-cache-remote-handler.js +186 -0
- package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
- package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
- package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +13 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +11 -2
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
- package/lib/index.d.ts +6 -7
- package/lib/index.js +2 -4
- package/lib/lambdas/post-deploy/post-deploy.lambda.js +3 -2
- package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
- package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
- package/lib/lambdas/post-deploy/prune-s3.d.ts +19 -3
- package/lib/lambdas/post-deploy/prune-s3.js +54 -15
- package/lib/lambdas/post-deploy/prune-s3.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-s3.test.js +255 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
- package/lib/nextjs-api.d.ts +107 -18
- package/lib/nextjs-api.js +349 -39
- package/lib/nextjs-api.test.js +582 -1
- package/lib/nextjs-build/global-containers.Dockerfile +15 -10
- package/lib/nextjs-build/nextjs-build.d.ts +339 -63
- package/lib/nextjs-build/nextjs-build.js +684 -327
- package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
- package/lib/nextjs-build/nextjs-build.test.js +412 -0
- package/lib/nextjs-build/patch-fetch.js +1 -1
- package/lib/nextjs-build/patch-fetch.test.js +166 -11
- package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
- package/lib/nextjs-cache.d.ts +82 -4
- package/lib/nextjs-cache.js +186 -10
- package/lib/nextjs-cache.test.js +176 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
- package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
- package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
- package/lib/nextjs-compute/nextjs-containers.js +57 -20
- package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
- package/lib/nextjs-compute/nextjs-functions.js +113 -67
- package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
- package/lib/nextjs-distribution.d.ts +194 -23
- package/lib/nextjs-distribution.js +535 -62
- package/lib/nextjs-distribution.test.d.ts +1 -0
- package/lib/nextjs-distribution.test.js +697 -0
- package/lib/nextjs-post-deploy.d.ts +23 -3
- package/lib/nextjs-post-deploy.js +14 -10
- package/lib/nextjs-post-deploy.test.d.ts +1 -0
- package/lib/nextjs-post-deploy.test.js +34 -0
- package/lib/nextjs-static-assets.d.ts +23 -4
- package/lib/nextjs-static-assets.js +29 -6
- package/lib/nextjs-static-assets.test.js +20 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +105 -45
- package/lib/root-constructs/nextjs-base-construct.js +144 -34
- package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
- package/lib/root-constructs/nextjs-global-containers.js +20 -70
- package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
- package/lib/root-constructs/nextjs-global-functions.js +52 -69
- package/lib/root-constructs/nextjs-regional-containers.d.ts +25 -5
- package/lib/root-constructs/nextjs-regional-containers.js +17 -15
- package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
- package/lib/root-constructs/nextjs-regional-functions.js +8 -25
- package/lib/runtime/api-gateway-path.d.ts +34 -0
- package/lib/runtime/api-gateway-path.js +71 -0
- package/lib/runtime/api-gateway-path.test.d.ts +1 -0
- package/lib/runtime/api-gateway-path.test.js +65 -0
- package/lib/runtime/case-redirect.d.ts +22 -0
- package/lib/runtime/case-redirect.js +63 -0
- package/lib/runtime/case-redirect.test.d.ts +1 -0
- package/lib/runtime/case-redirect.test.js +32 -0
- package/lib/runtime/core.d.ts +234 -0
- package/lib/runtime/core.js +1213 -0
- package/lib/runtime/core.test.d.ts +1 -0
- package/lib/runtime/core.test.js +1678 -0
- package/lib/runtime/deployment-root.d.ts +13 -0
- package/lib/runtime/deployment-root.js +29 -0
- package/lib/runtime/dispatch.d.ts +331 -0
- package/lib/runtime/dispatch.js +751 -0
- package/lib/runtime/dispatch.test.d.ts +1 -0
- package/lib/runtime/dispatch.test.js +853 -0
- package/lib/runtime/entrypoints.d.ts +57 -0
- package/lib/runtime/entrypoints.js +115 -0
- package/lib/runtime/http/abort-signal.d.ts +6 -0
- package/lib/runtime/http/abort-signal.js +19 -0
- package/lib/runtime/http/abort-signal.test.d.ts +1 -0
- package/lib/runtime/http/abort-signal.test.js +49 -0
- package/lib/runtime/http/node-server.d.ts +38 -0
- package/lib/runtime/http/node-server.js +99 -0
- package/lib/runtime/http/node-server.test.d.ts +1 -0
- package/lib/runtime/http/node-server.test.js +96 -0
- package/lib/runtime/http/node-sink.d.ts +16 -0
- package/lib/runtime/http/node-sink.js +48 -0
- package/lib/runtime/http/node-sink.test.d.ts +1 -0
- package/lib/runtime/http/node-sink.test.js +66 -0
- package/lib/runtime/http/request.d.ts +62 -0
- package/lib/runtime/http/request.js +134 -0
- package/lib/runtime/http/request.test.d.ts +1 -0
- package/lib/runtime/http/request.test.js +103 -0
- package/lib/runtime/http/response.d.ts +77 -0
- package/lib/runtime/http/response.js +229 -0
- package/lib/runtime/http/response.test.d.ts +1 -0
- package/lib/runtime/http/response.test.js +178 -0
- package/lib/runtime/http/sink.d.ts +73 -0
- package/lib/runtime/http/sink.js +188 -0
- package/lib/runtime/http/sink.test.d.ts +1 -0
- package/lib/runtime/http/sink.test.js +257 -0
- package/lib/runtime/image-utils.d.ts +78 -0
- package/lib/runtime/image-utils.js +129 -0
- package/lib/runtime/image-utils.test.d.ts +1 -0
- package/lib/runtime/image-utils.test.js +237 -0
- package/lib/runtime/image.d.ts +76 -0
- package/lib/runtime/image.js +296 -0
- package/lib/runtime/image.test.d.ts +1 -0
- package/lib/runtime/image.test.js +405 -0
- package/lib/runtime/lambda-event.d.ts +4 -0
- package/lib/runtime/lambda-event.js +113 -0
- package/lib/runtime/lambda-event.test.d.ts +1 -0
- package/lib/runtime/lambda-event.test.js +119 -0
- package/lib/runtime/lambda.mjs +41595 -0
- package/lib/runtime/load-module.d.ts +8 -0
- package/lib/runtime/load-module.js +35 -0
- package/lib/runtime/manifest.d.ts +215 -0
- package/lib/runtime/manifest.js +118 -0
- package/lib/runtime/middleware.d.ts +43 -0
- package/lib/runtime/middleware.js +113 -0
- package/lib/runtime/middleware.test.d.ts +1 -0
- package/lib/runtime/middleware.test.js +259 -0
- package/lib/runtime/next-modules.d.ts +55 -0
- package/lib/runtime/next-modules.js +124 -0
- package/lib/runtime/next-modules.test.d.ts +1 -0
- package/lib/runtime/next-modules.test.js +34 -0
- package/lib/runtime/public-files.d.ts +32 -0
- package/lib/runtime/public-files.js +117 -0
- package/lib/runtime/public-files.test.d.ts +1 -0
- package/lib/runtime/public-files.test.js +97 -0
- package/lib/runtime/server.mjs +41588 -0
- package/lib/runtime/static-files.d.ts +50 -0
- package/lib/runtime/static-files.js +266 -0
- package/lib/runtime/static-files.test.d.ts +1 -0
- package/lib/runtime/static-files.test.js +118 -0
- package/lib/runtime/util.d.ts +28 -0
- package/lib/runtime/util.js +79 -0
- package/lib/utils/base-path.d.ts +123 -11
- package/lib/utils/base-path.js +276 -39
- package/lib/utils/base-path.test.js +275 -50
- package/lib/utils/get-architecture.d.ts +7 -8
- package/lib/utils/get-architecture.js +12 -13
- package/lib/utils/zip-directory.d.ts +14 -0
- package/lib/utils/zip-directory.js +121 -0
- package/lib/utils/zip-directory.test.d.ts +1 -0
- package/lib/utils/zip-directory.test.js +99 -0
- package/package.json +22 -3
- package/scripts/capture-adapter-fixture.mjs +325 -0
- package/scripts/e2e-deploy.sh +398 -0
- package/scripts/e2e-harness/README.md +707 -0
- package/scripts/e2e-harness/app.js +370 -0
- package/scripts/e2e-harness/common.sh +249 -0
- package/scripts/e2e-harness/screen.mjs +302 -0
- package/scripts/e2e-harness/stage-proxy.mjs +145 -0
- package/scripts/e2e-harness/type-filters.mjs +47 -0
- package/scripts/e2e-logs.sh +75 -0
- package/scripts/e2e-offline.sh +91 -0
- package/scripts/e2e-sweep.sh +370 -0
- package/scripts/e2e-warm.sh +114 -0
- package/scripts/zero-config-build.mjs +418 -0
- package/docs/1k-concurrent-users-executions.png +0 -0
- package/docs/plans/adapter-runtime-release.md +0 -362
- package/docs/plans/phase-0-image-function-opt-in.md +0 -295
- package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
- package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
- package/lib/image-optimization/handler-utils.d.ts +0 -34
- package/lib/image-optimization/handler-utils.js +0 -83
- package/lib/image-optimization/handler-utils.test.js +0 -178
- package/lib/nextjs-build/functions.Dockerfile +0 -31
- package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
- package/lib/nextjs-compute/nextjs-image-function.js +0 -59
- package/lib/utils/experimental-flags.d.ts +0 -24
- package/lib/utils/experimental-flags.js +0 -30
- /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
/* eslint-disable import/no-extraneous-dependencies */
|
|
4
|
-
jest.mock("@aws-sdk/client-s3");
|
|
5
|
-
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
6
|
-
const image_optimizer_js_1 = require("next/dist/server/image-optimizer.js");
|
|
7
|
-
const handler_utils_1 = require("./handler-utils");
|
|
8
|
-
function asyncIterableFrom(chunks) {
|
|
9
|
-
return {
|
|
10
|
-
[Symbol.asyncIterator]() {
|
|
11
|
-
let i = 0;
|
|
12
|
-
return {
|
|
13
|
-
next: async () => i < chunks.length
|
|
14
|
-
? { done: false, value: chunks[i++] }
|
|
15
|
-
: { done: true, value: undefined },
|
|
16
|
-
};
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
describe("fetchFromS3", () => {
|
|
21
|
-
const mockSend = jest.fn();
|
|
22
|
-
const s3 = new client_s3_1.S3Client({});
|
|
23
|
-
beforeEach(() => {
|
|
24
|
-
s3.send = mockSend;
|
|
25
|
-
mockSend.mockReset();
|
|
26
|
-
});
|
|
27
|
-
it("strips the leading slash and uses url as-is for the S3 key", async () => {
|
|
28
|
-
mockSend.mockResolvedValue({
|
|
29
|
-
Body: asyncIterableFrom([Buffer.from("data")]),
|
|
30
|
-
ContentType: "image/png",
|
|
31
|
-
ETag: '"abc123"',
|
|
32
|
-
});
|
|
33
|
-
await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/base/foo.png", "");
|
|
34
|
-
const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
|
|
35
|
-
expect(params).toEqual({
|
|
36
|
-
Bucket: "my-bucket",
|
|
37
|
-
Key: "base/foo.png",
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
it("applies the key prefix once when the url already includes the app basePath", async () => {
|
|
41
|
-
mockSend.mockResolvedValue({
|
|
42
|
-
Body: asyncIterableFrom([Buffer.from("data")]),
|
|
43
|
-
ContentType: "image/png",
|
|
44
|
-
ETag: '"abc123"',
|
|
45
|
-
});
|
|
46
|
-
// next-image-loader bakes "/base" into the href for statically imported
|
|
47
|
-
// images, and NextjsStaticAssets uploads under the same prefix, so the
|
|
48
|
-
// key must carry it exactly once.
|
|
49
|
-
await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/base/_next/static/media/a.png", "/base", "/base");
|
|
50
|
-
const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
|
|
51
|
-
expect(params.Key).toBe("base/_next/static/media/a.png");
|
|
52
|
-
});
|
|
53
|
-
it("applies the key prefix when the url omits the app basePath", async () => {
|
|
54
|
-
mockSend.mockResolvedValue({
|
|
55
|
-
Body: asyncIterableFrom([Buffer.from("data")]),
|
|
56
|
-
ContentType: "image/png",
|
|
57
|
-
ETag: '"abc123"',
|
|
58
|
-
});
|
|
59
|
-
// Plain string paths (e.g. `<Image src="/static/foo.jpg">`) are passed
|
|
60
|
-
// through by next/image as written, without basePath baked in, but the
|
|
61
|
-
// S3 key still has it.
|
|
62
|
-
await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/static/foo.jpg", "/base", "/base");
|
|
63
|
-
const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
|
|
64
|
-
expect(params.Key).toBe("base/static/foo.jpg");
|
|
65
|
-
});
|
|
66
|
-
it("only matches basePath on a path boundary", async () => {
|
|
67
|
-
mockSend.mockResolvedValue({
|
|
68
|
-
Body: asyncIterableFrom([Buffer.from("data")]),
|
|
69
|
-
ContentType: "image/png",
|
|
70
|
-
ETag: '"abc123"',
|
|
71
|
-
});
|
|
72
|
-
// "/basement" merely shares a prefix with basePath "/base"; treating it
|
|
73
|
-
// as a match would produce the key "base/ment/logo.png".
|
|
74
|
-
await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/basement/logo.png", "/base", "/base");
|
|
75
|
-
const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
|
|
76
|
-
expect(params.Key).toBe("base/basement/logo.png");
|
|
77
|
-
});
|
|
78
|
-
// regression test: the Next.js app's own `basePath` (e.g. set to match an
|
|
79
|
-
// API Gateway stage) and the CDK `NextjsStaticAssets` `basePath` prop (key
|
|
80
|
-
// namespacing) are unrelated and don't have to match. A deployment that
|
|
81
|
-
// only sets the former must not leak it into the S3 key.
|
|
82
|
-
it("doesn't apply nextBasePath as a key prefix when the key prefix differs", async () => {
|
|
83
|
-
mockSend.mockResolvedValue({
|
|
84
|
-
Body: asyncIterableFrom([Buffer.from("data")]),
|
|
85
|
-
ContentType: "image/png",
|
|
86
|
-
ETag: '"abc123"',
|
|
87
|
-
});
|
|
88
|
-
await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/static/nextjs-icon-light-background.png", "/prod", "");
|
|
89
|
-
const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
|
|
90
|
-
expect(params.Key).toBe("static/nextjs-icon-light-background.png");
|
|
91
|
-
});
|
|
92
|
-
it("strips nextBasePath from a baked-in href before applying a different key prefix", async () => {
|
|
93
|
-
mockSend.mockResolvedValue({
|
|
94
|
-
Body: asyncIterableFrom([Buffer.from("data")]),
|
|
95
|
-
ContentType: "image/png",
|
|
96
|
-
ETag: '"abc123"',
|
|
97
|
-
});
|
|
98
|
-
await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/prod/_next/static/media/imported-logo.png", "/prod", "");
|
|
99
|
-
const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
|
|
100
|
-
expect(params.Key).toBe("_next/static/media/imported-logo.png");
|
|
101
|
-
});
|
|
102
|
-
it("doesn't double the separator when the key prefix has a trailing slash", async () => {
|
|
103
|
-
mockSend.mockResolvedValue({
|
|
104
|
-
Body: asyncIterableFrom([Buffer.from("data")]),
|
|
105
|
-
ContentType: "image/png",
|
|
106
|
-
ETag: '"abc123"',
|
|
107
|
-
});
|
|
108
|
-
// BucketDeployment collapses the trailing slash when uploading, so the
|
|
109
|
-
// object is at "base/static/foo.jpg", not "base//static/foo.jpg".
|
|
110
|
-
await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/static/foo.jpg", "", "/base/");
|
|
111
|
-
const params = client_s3_1.GetObjectCommand.mock.calls[0][0];
|
|
112
|
-
expect(params.Key).toBe("base/static/foo.jpg");
|
|
113
|
-
});
|
|
114
|
-
it("returns the concatenated buffer, content type, and etag", async () => {
|
|
115
|
-
mockSend.mockResolvedValue({
|
|
116
|
-
Body: asyncIterableFrom([Buffer.from("hel"), Buffer.from("lo")]),
|
|
117
|
-
ContentType: "image/jpeg",
|
|
118
|
-
ETag: '"the-etag"',
|
|
119
|
-
});
|
|
120
|
-
const result = await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/foo.jpg", "");
|
|
121
|
-
expect(result.buffer.toString()).toBe("hello");
|
|
122
|
-
expect(result.contentType).toBe("image/jpeg");
|
|
123
|
-
expect(result.etag).toBe('"the-etag"');
|
|
124
|
-
});
|
|
125
|
-
it("returns an empty etag when S3 doesn't provide one", async () => {
|
|
126
|
-
mockSend.mockResolvedValue({
|
|
127
|
-
Body: asyncIterableFrom([Buffer.from("data")]),
|
|
128
|
-
ContentType: null,
|
|
129
|
-
ETag: undefined,
|
|
130
|
-
});
|
|
131
|
-
const result = await (0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/foo.png", "");
|
|
132
|
-
expect(result.etag).toBe("");
|
|
133
|
-
expect(result.contentType).toBeNull();
|
|
134
|
-
});
|
|
135
|
-
it("throws when S3 returns no body", async () => {
|
|
136
|
-
mockSend.mockResolvedValue({ Body: undefined });
|
|
137
|
-
await expect((0, handler_utils_1.fetchFromS3)(s3, "my-bucket", "/missing.png", "")).rejects.toThrow(/Empty response from S3/);
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
describe("getFileNameWithExtension", () => {
|
|
141
|
-
it("derives filename and extension from the url and content type", () => {
|
|
142
|
-
expect((0, handler_utils_1.getFileNameWithExtension)("/foo/bar.png?w=100&q=75", "image/webp")).toBe("bar.webp");
|
|
143
|
-
});
|
|
144
|
-
it("falls back to image.bin when contentType is missing", () => {
|
|
145
|
-
expect((0, handler_utils_1.getFileNameWithExtension)("/foo/bar.png", null)).toBe("image.bin");
|
|
146
|
-
});
|
|
147
|
-
it("falls back to image.bin when the url has no filename segment", () => {
|
|
148
|
-
expect((0, handler_utils_1.getFileNameWithExtension)("/", "image/png")).toBe("image.bin");
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
describe("resolveErrorResponse", () => {
|
|
152
|
-
it("preserves the status code and message from an ImageError", () => {
|
|
153
|
-
const error = new image_optimizer_js_1.ImageError(400, '"url" parameter is not allowed');
|
|
154
|
-
expect((0, handler_utils_1.resolveErrorResponse)(error)).toEqual({
|
|
155
|
-
statusCode: 400,
|
|
156
|
-
message: '"url" parameter is not allowed',
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
it("maps a missing S3 object to the same 400 Next.js's own local-image fetch produces", () => {
|
|
160
|
-
const error = new Error("NoSuchKey: does not exist");
|
|
161
|
-
error.name = "NoSuchKey";
|
|
162
|
-
expect((0, handler_utils_1.resolveErrorResponse)(error)).toEqual({
|
|
163
|
-
statusCode: 400,
|
|
164
|
-
message: "The requested resource isn't a valid image.",
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
it("falls back to 500 for unrecognized errors", () => {
|
|
168
|
-
expect((0, handler_utils_1.resolveErrorResponse)(new Error("boom"))).toEqual({
|
|
169
|
-
statusCode: 500,
|
|
170
|
-
message: "Internal Server Error",
|
|
171
|
-
});
|
|
172
|
-
expect((0, handler_utils_1.resolveErrorResponse)("not an error")).toEqual({
|
|
173
|
-
statusCode: 500,
|
|
174
|
-
message: "Internal Server Error",
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci11dGlscy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltYWdlLW9wdGltaXphdGlvbi9oYW5kbGVyLXV0aWxzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBRWhDLGtEQUFnRTtBQUNoRSw0RUFBaUU7QUFDakUsbURBSXlCO0FBRXpCLFNBQVMsaUJBQWlCLENBQUMsTUFBb0I7SUFDN0MsT0FBTztRQUNMLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixPQUFPO2dCQUNMLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUNmLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTTtvQkFDZixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDckMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2FBQ3ZDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxvQkFBUSxDQUFDLEVBQUUsQ0FBd0IsQ0FBQztJQUVuRCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2IsRUFBMkMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQzdELFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRSxRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBQSwyQkFBVyxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXhELE1BQU0sTUFBTSxHQUFJLDRCQUF5QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyQixNQUFNLEVBQUUsV0FBVztZQUNuQixHQUFHLEVBQUUsY0FBYztTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRixRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztRQUVILHdFQUF3RTtRQUN4RSx1RUFBdUU7UUFDdkUsa0NBQWtDO1FBQ2xDLE1BQU0sSUFBQSwyQkFBVyxFQUNmLEVBQUUsRUFDRixXQUFXLEVBQ1gsZ0NBQWdDLEVBQ2hDLE9BQU8sRUFDUCxPQUFPLENBQ1IsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFJLDRCQUF5QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRSxRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztRQUVILHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsdUJBQXVCO1FBQ3ZCLE1BQU0sSUFBQSwyQkFBVyxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXhFLE1BQU0sTUFBTSxHQUFJLDRCQUF5QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RCxRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztRQUVILHdFQUF3RTtRQUN4RSx5REFBeUQ7UUFDekQsTUFBTSxJQUFBLDJCQUFXLEVBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFM0UsTUFBTSxNQUFNLEdBQUksNEJBQXlDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBRUgsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUseURBQXlEO0lBQ3pELEVBQUUsQ0FBQyx3RUFBd0UsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RixRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBQSwyQkFBVyxFQUNmLEVBQUUsRUFDRixXQUFXLEVBQ1gsMENBQTBDLEVBQzFDLE9BQU8sRUFDUCxFQUFFLENBQ0gsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFJLDRCQUF5QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUNyRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpRkFBaUYsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMvRixRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBQSwyQkFBVyxFQUNmLEVBQUUsRUFDRixXQUFXLEVBQ1gsNENBQTRDLEVBQzVDLE9BQU8sRUFDUCxFQUFFLENBQ0gsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFJLDRCQUF5QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx1RUFBdUUsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNyRixRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLElBQUksRUFBRSxVQUFVO1NBQ2pCLENBQUMsQ0FBQztRQUVILHVFQUF1RTtRQUN2RSxrRUFBa0U7UUFDbEUsTUFBTSxJQUFBLDJCQUFXLEVBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFcEUsTUFBTSxNQUFNLEdBQUksNEJBQXlDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlEQUF5RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3ZFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztZQUN6QixJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRSxXQUFXLEVBQUUsWUFBWTtZQUN6QixJQUFJLEVBQUUsWUFBWTtTQUNuQixDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsMkJBQVcsRUFBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVsRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNqRSxRQUFRLENBQUMsaUJBQWlCLENBQUM7WUFDekIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSwyQkFBVyxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDOUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFaEQsTUFBTSxNQUFNLENBQ1YsSUFBQSwyQkFBVyxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUNqRCxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxFQUFFLENBQUMsOERBQThELEVBQUUsR0FBRyxFQUFFO1FBQ3RFLE1BQU0sQ0FDSixJQUFBLHdDQUF3QixFQUFDLHlCQUF5QixFQUFFLFlBQVksQ0FBQyxDQUNsRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7UUFDN0QsTUFBTSxDQUFDLElBQUEsd0NBQXdCLEVBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLEdBQUcsRUFBRTtRQUN0RSxNQUFNLENBQUMsSUFBQSx3Q0FBd0IsRUFBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7SUFDcEMsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLEdBQUcsRUFBRTtRQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLCtCQUFVLENBQUMsR0FBRyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFFcEUsTUFBTSxDQUFDLElBQUEsb0NBQW9CLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDMUMsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsZ0NBQWdDO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1GQUFtRixFQUFFLEdBQUcsRUFBRTtRQUMzRixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3JELEtBQUssQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO1FBRXpCLE1BQU0sQ0FBQyxJQUFBLG9DQUFvQixFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzFDLFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTyxFQUFFLDZDQUE2QztTQUN2RCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7UUFDbkQsTUFBTSxDQUFDLElBQUEsb0NBQW9CLEVBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUN0RCxVQUFVLEVBQUUsR0FBRztZQUNmLE9BQU8sRUFBRSx1QkFBdUI7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUEsb0NBQW9CLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkQsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsdUJBQXVCO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcblxuaW1wb3J0IHsgR2V0T2JqZWN0Q29tbWFuZCwgUzNDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgeyBJbWFnZUVycm9yIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCI7XG5pbXBvcnQge1xuICBmZXRjaEZyb21TMyxcbiAgZ2V0RmlsZU5hbWVXaXRoRXh0ZW5zaW9uLFxuICByZXNvbHZlRXJyb3JSZXNwb25zZSxcbn0gZnJvbSBcIi4vaGFuZGxlci11dGlsc1wiO1xuXG5mdW5jdGlvbiBhc3luY0l0ZXJhYmxlRnJvbShjaHVua3M6IFVpbnQ4QXJyYXlbXSk6IEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4ge1xuICByZXR1cm4ge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PlxuICAgICAgICAgIGkgPCBjaHVua3MubGVuZ3RoXG4gICAgICAgICAgICA/IHsgZG9uZTogZmFsc2UsIHZhbHVlOiBjaHVua3NbaSsrXSB9XG4gICAgICAgICAgICA6IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5kZXNjcmliZShcImZldGNoRnJvbVMzXCIsICgpID0+IHtcbiAgY29uc3QgbW9ja1NlbmQgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IHMzID0gbmV3IFMzQ2xpZW50KHt9KSBhcyB1bmtub3duIGFzIFMzQ2xpZW50O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIChzMyBhcyB1bmtub3duIGFzIHsgc2VuZDogdHlwZW9mIG1vY2tTZW5kIH0pLnNlbmQgPSBtb2NrU2VuZDtcbiAgICBtb2NrU2VuZC5tb2NrUmVzZXQoKTtcbiAgfSk7XG5cbiAgaXQoXCJzdHJpcHMgdGhlIGxlYWRpbmcgc2xhc2ggYW5kIHVzZXMgdXJsIGFzLWlzIGZvciB0aGUgUzMga2V5XCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJkYXRhXCIpXSksXG4gICAgICBDb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIEVUYWc6ICdcImFiYzEyM1wiJyxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9iYXNlL2Zvby5wbmdcIiwgXCJcIik7XG5cbiAgICBjb25zdCBwYXJhbXMgPSAoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXTtcbiAgICBleHBlY3QocGFyYW1zKS50b0VxdWFsKHtcbiAgICAgIEJ1Y2tldDogXCJteS1idWNrZXRcIixcbiAgICAgIEtleTogXCJiYXNlL2Zvby5wbmdcIixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJhcHBsaWVzIHRoZSBrZXkgcHJlZml4IG9uY2Ugd2hlbiB0aGUgdXJsIGFscmVhZHkgaW5jbHVkZXMgdGhlIGFwcCBiYXNlUGF0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiZGF0YVwiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICBFVGFnOiAnXCJhYmMxMjNcIicsXG4gICAgfSk7XG5cbiAgICAvLyBuZXh0LWltYWdlLWxvYWRlciBiYWtlcyBcIi9iYXNlXCIgaW50byB0aGUgaHJlZiBmb3Igc3RhdGljYWxseSBpbXBvcnRlZFxuICAgIC8vIGltYWdlcywgYW5kIE5leHRqc1N0YXRpY0Fzc2V0cyB1cGxvYWRzIHVuZGVyIHRoZSBzYW1lIHByZWZpeCwgc28gdGhlXG4gICAgLy8ga2V5IG11c3QgY2FycnkgaXQgZXhhY3RseSBvbmNlLlxuICAgIGF3YWl0IGZldGNoRnJvbVMzKFxuICAgICAgczMsXG4gICAgICBcIm15LWJ1Y2tldFwiLFxuICAgICAgXCIvYmFzZS9fbmV4dC9zdGF0aWMvbWVkaWEvYS5wbmdcIixcbiAgICAgIFwiL2Jhc2VcIixcbiAgICAgIFwiL2Jhc2VcIixcbiAgICApO1xuXG4gICAgY29uc3QgcGFyYW1zID0gKEdldE9iamVjdENvbW1hbmQgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2suY2FsbHNbMF1bMF07XG4gICAgZXhwZWN0KHBhcmFtcy5LZXkpLnRvQmUoXCJiYXNlL19uZXh0L3N0YXRpYy9tZWRpYS9hLnBuZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJhcHBsaWVzIHRoZSBrZXkgcHJlZml4IHdoZW4gdGhlIHVybCBvbWl0cyB0aGUgYXBwIGJhc2VQYXRoXCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJkYXRhXCIpXSksXG4gICAgICBDb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIEVUYWc6ICdcImFiYzEyM1wiJyxcbiAgICB9KTtcblxuICAgIC8vIFBsYWluIHN0cmluZyBwYXRocyAoZS5nLiBgPEltYWdlIHNyYz1cIi9zdGF0aWMvZm9vLmpwZ1wiPmApIGFyZSBwYXNzZWRcbiAgICAvLyB0aHJvdWdoIGJ5IG5leHQvaW1hZ2UgYXMgd3JpdHRlbiwgd2l0aG91dCBiYXNlUGF0aCBiYWtlZCBpbiwgYnV0IHRoZVxuICAgIC8vIFMzIGtleSBzdGlsbCBoYXMgaXQuXG4gICAgYXdhaXQgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL3N0YXRpYy9mb28uanBnXCIsIFwiL2Jhc2VcIiwgXCIvYmFzZVwiKTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IChHZXRPYmplY3RDb21tYW5kIGFzIHVua25vd24gYXMgamVzdC5Nb2NrKS5tb2NrLmNhbGxzWzBdWzBdO1xuICAgIGV4cGVjdChwYXJhbXMuS2V5KS50b0JlKFwiYmFzZS9zdGF0aWMvZm9vLmpwZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJvbmx5IG1hdGNoZXMgYmFzZVBhdGggb24gYSBwYXRoIGJvdW5kYXJ5XCIsIGFzeW5jICgpID0+IHtcbiAgICBtb2NrU2VuZC5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICBCb2R5OiBhc3luY0l0ZXJhYmxlRnJvbShbQnVmZmVyLmZyb20oXCJkYXRhXCIpXSksXG4gICAgICBDb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIEVUYWc6ICdcImFiYzEyM1wiJyxcbiAgICB9KTtcblxuICAgIC8vIFwiL2Jhc2VtZW50XCIgbWVyZWx5IHNoYXJlcyBhIHByZWZpeCB3aXRoIGJhc2VQYXRoIFwiL2Jhc2VcIjsgdHJlYXRpbmcgaXRcbiAgICAvLyBhcyBhIG1hdGNoIHdvdWxkIHByb2R1Y2UgdGhlIGtleSBcImJhc2UvbWVudC9sb2dvLnBuZ1wiLlxuICAgIGF3YWl0IGZldGNoRnJvbVMzKHMzLCBcIm15LWJ1Y2tldFwiLCBcIi9iYXNlbWVudC9sb2dvLnBuZ1wiLCBcIi9iYXNlXCIsIFwiL2Jhc2VcIik7XG5cbiAgICBjb25zdCBwYXJhbXMgPSAoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXTtcbiAgICBleHBlY3QocGFyYW1zLktleSkudG9CZShcImJhc2UvYmFzZW1lbnQvbG9nby5wbmdcIik7XG4gIH0pO1xuXG4gIC8vIHJlZ3Jlc3Npb24gdGVzdDogdGhlIE5leHQuanMgYXBwJ3Mgb3duIGBiYXNlUGF0aGAgKGUuZy4gc2V0IHRvIG1hdGNoIGFuXG4gIC8vIEFQSSBHYXRld2F5IHN0YWdlKSBhbmQgdGhlIENESyBgTmV4dGpzU3RhdGljQXNzZXRzYCBgYmFzZVBhdGhgIHByb3AgKGtleVxuICAvLyBuYW1lc3BhY2luZykgYXJlIHVucmVsYXRlZCBhbmQgZG9uJ3QgaGF2ZSB0byBtYXRjaC4gQSBkZXBsb3ltZW50IHRoYXRcbiAgLy8gb25seSBzZXRzIHRoZSBmb3JtZXIgbXVzdCBub3QgbGVhayBpdCBpbnRvIHRoZSBTMyBrZXkuXG4gIGl0KFwiZG9lc24ndCBhcHBseSBuZXh0QmFzZVBhdGggYXMgYSBrZXkgcHJlZml4IHdoZW4gdGhlIGtleSBwcmVmaXggZGlmZmVyc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiZGF0YVwiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICBFVGFnOiAnXCJhYmMxMjNcIicsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3N0YXRpYy9uZXh0anMtaWNvbi1saWdodC1iYWNrZ3JvdW5kLnBuZ1wiLFxuICAgICAgXCIvcHJvZFwiLFxuICAgICAgXCJcIixcbiAgICApO1xuXG4gICAgY29uc3QgcGFyYW1zID0gKEdldE9iamVjdENvbW1hbmQgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2suY2FsbHNbMF1bMF07XG4gICAgZXhwZWN0KHBhcmFtcy5LZXkpLnRvQmUoXCJzdGF0aWMvbmV4dGpzLWljb24tbGlnaHQtYmFja2dyb3VuZC5wbmdcIik7XG4gIH0pO1xuXG4gIGl0KFwic3RyaXBzIG5leHRCYXNlUGF0aCBmcm9tIGEgYmFrZWQtaW4gaHJlZiBiZWZvcmUgYXBwbHlpbmcgYSBkaWZmZXJlbnQga2V5IHByZWZpeFwiLCBhc3luYyAoKSA9PiB7XG4gICAgbW9ja1NlbmQubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgQm9keTogYXN5bmNJdGVyYWJsZUZyb20oW0J1ZmZlci5mcm9tKFwiZGF0YVwiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICBFVGFnOiAnXCJhYmMxMjNcIicsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmZXRjaEZyb21TMyhcbiAgICAgIHMzLFxuICAgICAgXCJteS1idWNrZXRcIixcbiAgICAgIFwiL3Byb2QvX25leHQvc3RhdGljL21lZGlhL2ltcG9ydGVkLWxvZ28ucG5nXCIsXG4gICAgICBcIi9wcm9kXCIsXG4gICAgICBcIlwiLFxuICAgICk7XG5cbiAgICBjb25zdCBwYXJhbXMgPSAoR2V0T2JqZWN0Q29tbWFuZCBhcyB1bmtub3duIGFzIGplc3QuTW9jaykubW9jay5jYWxsc1swXVswXTtcbiAgICBleHBlY3QocGFyYW1zLktleSkudG9CZShcIl9uZXh0L3N0YXRpYy9tZWRpYS9pbXBvcnRlZC1sb2dvLnBuZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJkb2Vzbid0IGRvdWJsZSB0aGUgc2VwYXJhdG9yIHdoZW4gdGhlIGtleSBwcmVmaXggaGFzIGEgdHJhaWxpbmcgc2xhc2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImRhdGFcIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBcImltYWdlL3BuZ1wiLFxuICAgICAgRVRhZzogJ1wiYWJjMTIzXCInLFxuICAgIH0pO1xuXG4gICAgLy8gQnVja2V0RGVwbG95bWVudCBjb2xsYXBzZXMgdGhlIHRyYWlsaW5nIHNsYXNoIHdoZW4gdXBsb2FkaW5nLCBzbyB0aGVcbiAgICAvLyBvYmplY3QgaXMgYXQgXCJiYXNlL3N0YXRpYy9mb28uanBnXCIsIG5vdCBcImJhc2UvL3N0YXRpYy9mb28uanBnXCIuXG4gICAgYXdhaXQgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL3N0YXRpYy9mb28uanBnXCIsIFwiXCIsIFwiL2Jhc2UvXCIpO1xuXG4gICAgY29uc3QgcGFyYW1zID0gKEdldE9iamVjdENvbW1hbmQgYXMgdW5rbm93biBhcyBqZXN0Lk1vY2spLm1vY2suY2FsbHNbMF1bMF07XG4gICAgZXhwZWN0KHBhcmFtcy5LZXkpLnRvQmUoXCJiYXNlL3N0YXRpYy9mb28uanBnXCIpO1xuICB9KTtcblxuICBpdChcInJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBidWZmZXIsIGNvbnRlbnQgdHlwZSwgYW5kIGV0YWdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImhlbFwiKSwgQnVmZmVyLmZyb20oXCJsb1wiKV0pLFxuICAgICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvanBlZ1wiLFxuICAgICAgRVRhZzogJ1widGhlLWV0YWdcIicsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaEZyb21TMyhzMywgXCJteS1idWNrZXRcIiwgXCIvZm9vLmpwZ1wiLCBcIlwiKTtcblxuICAgIGV4cGVjdChyZXN1bHQuYnVmZmVyLnRvU3RyaW5nKCkpLnRvQmUoXCJoZWxsb1wiKTtcbiAgICBleHBlY3QocmVzdWx0LmNvbnRlbnRUeXBlKS50b0JlKFwiaW1hZ2UvanBlZ1wiKTtcbiAgICBleHBlY3QocmVzdWx0LmV0YWcpLnRvQmUoJ1widGhlLWV0YWdcIicpO1xuICB9KTtcblxuICBpdChcInJldHVybnMgYW4gZW1wdHkgZXRhZyB3aGVuIFMzIGRvZXNuJ3QgcHJvdmlkZSBvbmVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIEJvZHk6IGFzeW5jSXRlcmFibGVGcm9tKFtCdWZmZXIuZnJvbShcImRhdGFcIildKSxcbiAgICAgIENvbnRlbnRUeXBlOiBudWxsLFxuICAgICAgRVRhZzogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL2Zvby5wbmdcIiwgXCJcIik7XG5cbiAgICBleHBlY3QocmVzdWx0LmV0YWcpLnRvQmUoXCJcIik7XG4gICAgZXhwZWN0KHJlc3VsdC5jb250ZW50VHlwZSkudG9CZU51bGwoKTtcbiAgfSk7XG5cbiAgaXQoXCJ0aHJvd3Mgd2hlbiBTMyByZXR1cm5zIG5vIGJvZHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIG1vY2tTZW5kLm1vY2tSZXNvbHZlZFZhbHVlKHsgQm9keTogdW5kZWZpbmVkIH0pO1xuXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgZmV0Y2hGcm9tUzMoczMsIFwibXktYnVja2V0XCIsIFwiL21pc3NpbmcucG5nXCIsIFwiXCIpLFxuICAgICkucmVqZWN0cy50b1Rocm93KC9FbXB0eSByZXNwb25zZSBmcm9tIFMzLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiZ2V0RmlsZU5hbWVXaXRoRXh0ZW5zaW9uXCIsICgpID0+IHtcbiAgaXQoXCJkZXJpdmVzIGZpbGVuYW1lIGFuZCBleHRlbnNpb24gZnJvbSB0aGUgdXJsIGFuZCBjb250ZW50IHR5cGVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGdldEZpbGVOYW1lV2l0aEV4dGVuc2lvbihcIi9mb28vYmFyLnBuZz93PTEwMCZxPTc1XCIsIFwiaW1hZ2Uvd2VicFwiKSxcbiAgICApLnRvQmUoXCJiYXIud2VicFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJmYWxscyBiYWNrIHRvIGltYWdlLmJpbiB3aGVuIGNvbnRlbnRUeXBlIGlzIG1pc3NpbmdcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChnZXRGaWxlTmFtZVdpdGhFeHRlbnNpb24oXCIvZm9vL2Jhci5wbmdcIiwgbnVsbCkpLnRvQmUoXCJpbWFnZS5iaW5cIik7XG4gIH0pO1xuXG4gIGl0KFwiZmFsbHMgYmFjayB0byBpbWFnZS5iaW4gd2hlbiB0aGUgdXJsIGhhcyBubyBmaWxlbmFtZSBzZWdtZW50XCIsICgpID0+IHtcbiAgICBleHBlY3QoZ2V0RmlsZU5hbWVXaXRoRXh0ZW5zaW9uKFwiL1wiLCBcImltYWdlL3BuZ1wiKSkudG9CZShcImltYWdlLmJpblwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJyZXNvbHZlRXJyb3JSZXNwb25zZVwiLCAoKSA9PiB7XG4gIGl0KFwicHJlc2VydmVzIHRoZSBzdGF0dXMgY29kZSBhbmQgbWVzc2FnZSBmcm9tIGFuIEltYWdlRXJyb3JcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEltYWdlRXJyb3IoNDAwLCAnXCJ1cmxcIiBwYXJhbWV0ZXIgaXMgbm90IGFsbG93ZWQnKTtcblxuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShlcnJvcikpLnRvRXF1YWwoe1xuICAgICAgc3RhdHVzQ29kZTogNDAwLFxuICAgICAgbWVzc2FnZTogJ1widXJsXCIgcGFyYW1ldGVyIGlzIG5vdCBhbGxvd2VkJyxcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJtYXBzIGEgbWlzc2luZyBTMyBvYmplY3QgdG8gdGhlIHNhbWUgNDAwIE5leHQuanMncyBvd24gbG9jYWwtaW1hZ2UgZmV0Y2ggcHJvZHVjZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwiTm9TdWNoS2V5OiBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICBlcnJvci5uYW1lID0gXCJOb1N1Y2hLZXlcIjtcblxuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShlcnJvcikpLnRvRXF1YWwoe1xuICAgICAgc3RhdHVzQ29kZTogNDAwLFxuICAgICAgbWVzc2FnZTogXCJUaGUgcmVxdWVzdGVkIHJlc291cmNlIGlzbid0IGEgdmFsaWQgaW1hZ2UuXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiZmFsbHMgYmFjayB0byA1MDAgZm9yIHVucmVjb2duaXplZCBlcnJvcnNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShuZXcgRXJyb3IoXCJib29tXCIpKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIH0pO1xuICAgIGV4cGVjdChyZXNvbHZlRXJyb3JSZXNwb25zZShcIm5vdCBhbiBlcnJvclwiKSkudG9FcXVhbCh7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# ~~ Generated by cdk-nextjs ~~
|
|
2
|
-
# Modified from: https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile
|
|
3
|
-
|
|
4
|
-
# Production image, copy all the files and run next
|
|
5
|
-
FROM public.ecr.aws/docker/library/node:24-alpine AS runner
|
|
6
|
-
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
|
7
|
-
RUN apk add --no-cache libc6-compat
|
|
8
|
-
|
|
9
|
-
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.1 /lambda-adapter /opt/extensions/lambda-adapter
|
|
10
|
-
WORKDIR /app
|
|
11
|
-
|
|
12
|
-
ENV NODE_ENV=production
|
|
13
|
-
# Uncomment the following line in case you want to disable telemetry during runtime.
|
|
14
|
-
# ENV NEXT_TELEMETRY_DISABLED 1
|
|
15
|
-
|
|
16
|
-
RUN addgroup --system --gid 1001 nodejs
|
|
17
|
-
RUN adduser --system --uid 1001 nextjs
|
|
18
|
-
|
|
19
|
-
ARG RELATIVE_PATH_TO_PACKAGE
|
|
20
|
-
# Copy from local build output instead of builder image
|
|
21
|
-
COPY --chown=nextjs:nodejs .next/standalone ./
|
|
22
|
-
# Copy .next/static so image optimization can read imported images (e.g. /_next/static/media/*)
|
|
23
|
-
COPY --chown=nextjs:nodejs .next/static ./$RELATIVE_PATH_TO_PACKAGE/.next/static
|
|
24
|
-
# Copy public directory for image optimization (Next.js needs source images)
|
|
25
|
-
COPY --chown=nextjs:nodejs public ./$RELATIVE_PATH_TO_PACKAGE/public
|
|
26
|
-
|
|
27
|
-
USER nextjs
|
|
28
|
-
|
|
29
|
-
EXPOSE 3000
|
|
30
|
-
|
|
31
|
-
ENV PORT=3000
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { IVpc } from "aws-cdk-lib/aws-ec2";
|
|
2
|
-
import { Function as LambdaFunction, FunctionUrl } from "aws-cdk-lib/aws-lambda";
|
|
3
|
-
import { IBucket } from "aws-cdk-lib/aws-s3";
|
|
4
|
-
import { Construct } from "constructs";
|
|
5
|
-
import { NextjsType } from "../constants";
|
|
6
|
-
import { OptionalFunctionProps } from "../generated-structs/OptionalFunctionProps";
|
|
7
|
-
import { OptionalFunctionUrlProps } from "../generated-structs/OptionalFunctionUrlProps";
|
|
8
|
-
export interface NextjsImageFunctionOverrides {
|
|
9
|
-
readonly functionProps?: OptionalFunctionProps;
|
|
10
|
-
readonly functionUrlProps?: OptionalFunctionUrlProps;
|
|
11
|
-
}
|
|
12
|
-
export interface NextjsImageFunctionProps {
|
|
13
|
-
readonly nextjsType: NextjsType;
|
|
14
|
-
/**
|
|
15
|
-
* Absolute path to the asset prepared by `NextjsBuild`: bundled handler,
|
|
16
|
-
* glibc `sharp` binaries, and `required-server-files.json`.
|
|
17
|
-
* @see {@link NextjsBuild.imageOptimizationAssetPath}
|
|
18
|
-
*/
|
|
19
|
-
readonly imageOptimizationAssetPath: string;
|
|
20
|
-
/**
|
|
21
|
-
* S3 bucket containing static assets, read by the handler to serve
|
|
22
|
-
* non-absolute image URLs.
|
|
23
|
-
*/
|
|
24
|
-
readonly staticAssetsBucket: IBucket;
|
|
25
|
-
/**
|
|
26
|
-
* S3 key prefix the static assets were uploaded under, i.e.
|
|
27
|
-
* `NextjsStaticAssets.keyPrefix`, which namespaces a shared bucket.
|
|
28
|
-
*
|
|
29
|
-
* Threaded through explicitly rather than read from the app's bundled config,
|
|
30
|
-
* because it's distinct from the app's own `basePath` (which next-image-loader
|
|
31
|
-
* bakes into hrefs) — the two diverge when the app's `basePath` comes from
|
|
32
|
-
* elsewhere, e.g. an API Gateway stage under `NextjsRegionalFunctions`.
|
|
33
|
-
*/
|
|
34
|
-
readonly staticAssetsKeyPrefix?: string;
|
|
35
|
-
readonly vpc?: IVpc;
|
|
36
|
-
/**
|
|
37
|
-
* Override props of any construct.
|
|
38
|
-
*/
|
|
39
|
-
readonly overrides?: NextjsImageFunctionOverrides;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Dedicated Lambda function for Next.js image optimization
|
|
43
|
-
* (`src/image-optimization/handler.mts`). Kept separate from the server
|
|
44
|
-
* function so image requests get a lightweight, natively-streaming zip
|
|
45
|
-
* Lambda instead of paying the Docker/Lambda Web Adapter cold-start cost.
|
|
46
|
-
*/
|
|
47
|
-
export declare class NextjsImageFunction extends Construct {
|
|
48
|
-
function: LambdaFunction;
|
|
49
|
-
functionUrl?: FunctionUrl;
|
|
50
|
-
private props;
|
|
51
|
-
constructor(scope: Construct, id: string, props: NextjsImageFunctionProps);
|
|
52
|
-
private createFunction;
|
|
53
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NextjsImageFunction = void 0;
|
|
4
|
-
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
7
|
-
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
8
|
-
const constructs_1 = require("constructs");
|
|
9
|
-
const constants_1 = require("../constants");
|
|
10
|
-
const get_architecture_1 = require("../utils/get-architecture");
|
|
11
|
-
/**
|
|
12
|
-
* Dedicated Lambda function for Next.js image optimization
|
|
13
|
-
* (`src/image-optimization/handler.mts`). Kept separate from the server
|
|
14
|
-
* function so image requests get a lightweight, natively-streaming zip
|
|
15
|
-
* Lambda instead of paying the Docker/Lambda Web Adapter cold-start cost.
|
|
16
|
-
*/
|
|
17
|
-
class NextjsImageFunction extends constructs_1.Construct {
|
|
18
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsImageFunction", version: "0.6.1" };
|
|
19
|
-
function;
|
|
20
|
-
functionUrl;
|
|
21
|
-
props;
|
|
22
|
-
constructor(scope, id, props) {
|
|
23
|
-
super(scope, id);
|
|
24
|
-
this.props = props;
|
|
25
|
-
this.function = this.createFunction();
|
|
26
|
-
if (props.nextjsType === constants_1.NextjsType.GLOBAL_FUNCTIONS) {
|
|
27
|
-
this.function.grantInvoke(new aws_iam_1.ServicePrincipal("cloudfront.amazonaws.com"));
|
|
28
|
-
this.functionUrl = this.function.addFunctionUrl({
|
|
29
|
-
authType: aws_lambda_1.FunctionUrlAuthType.AWS_IAM,
|
|
30
|
-
invokeMode: aws_lambda_1.InvokeMode.RESPONSE_STREAM,
|
|
31
|
-
...this.props.overrides?.functionUrlProps,
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
createFunction() {
|
|
36
|
-
const fn = new aws_lambda_1.Function(this, "Fn", {
|
|
37
|
-
code: aws_lambda_1.Code.fromAsset(this.props.imageOptimizationAssetPath),
|
|
38
|
-
handler: "handler.handler",
|
|
39
|
-
memorySize: 2048,
|
|
40
|
-
runtime: new aws_lambda_1.Runtime("nodejs24.x", aws_lambda_1.RuntimeFamily.NODEJS),
|
|
41
|
-
timeout: aws_cdk_lib_1.Duration.seconds(30),
|
|
42
|
-
vpc: this.props.vpc,
|
|
43
|
-
...this.props.overrides?.functionProps,
|
|
44
|
-
// Must not be overridable: NextjsBuild bundles glibc `sharp` binaries
|
|
45
|
-
// matching the synth machine's architecture, so the deployed Lambda's
|
|
46
|
-
// architecture must always match what was bundled.
|
|
47
|
-
architecture: (0, get_architecture_1.getLambdaArchitecture)(),
|
|
48
|
-
environment: {
|
|
49
|
-
CDK_NEXTJS_STATIC_ASSETS_BUCKET_NAME: this.props.staticAssetsBucket.bucketName,
|
|
50
|
-
CDK_NEXTJS_STATIC_ASSETS_KEY_PREFIX: this.props.staticAssetsKeyPrefix ?? "",
|
|
51
|
-
...this.props.overrides?.functionProps?.environment,
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
this.props.staticAssetsBucket.grantRead(fn);
|
|
55
|
-
return fn;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
exports.NextjsImageFunction = NextjsImageFunction;
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWltYWdlLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1jb21wdXRlL25leHRqcy1pbWFnZS1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsNkNBQXVDO0FBRXZDLGlEQUF1RDtBQUN2RCx1REFRZ0M7QUFFaEMsMkNBQXVDO0FBQ3ZDLDRDQUEwQztBQUcxQyxnRUFBa0U7QUFxQ2xFOzs7OztHQUtHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUzs7SUFDaEQsUUFBUSxDQUFpQjtJQUN6QixXQUFXLENBQWU7SUFFbEIsS0FBSyxDQUEyQjtJQUV4QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEMsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLHNCQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FDdkIsSUFBSSwwQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUNqRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztnQkFDOUMsUUFBUSxFQUFFLGdDQUFtQixDQUFDLE9BQU87Z0JBQ3JDLFVBQVUsRUFBRSx1QkFBVSxDQUFDLGVBQWU7Z0JBQ3RDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCO2FBQzFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU8sY0FBYztRQUNwQixNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtZQUN4QyxJQUFJLEVBQUUsaUJBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQztZQUMzRCxPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLE9BQU8sRUFBRSxJQUFJLG9CQUFPLENBQUMsWUFBWSxFQUFFLDBCQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3hELE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0IsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztZQUNuQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGFBQWE7WUFDdEMsc0VBQXNFO1lBQ3RFLHNFQUFzRTtZQUN0RSxtREFBbUQ7WUFDbkQsWUFBWSxFQUFFLElBQUEsd0NBQXFCLEdBQUU7WUFDckMsV0FBVyxFQUFFO2dCQUNYLG9DQUFvQyxFQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQVU7Z0JBQzFDLG1DQUFtQyxFQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixJQUFJLEVBQUU7Z0JBQ3hDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFdBQVc7YUFDcEQ7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU1QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7O0FBaERILGtEQWlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgQ29kZSxcbiAgRnVuY3Rpb24gYXMgTGFtYmRhRnVuY3Rpb24sXG4gIEZ1bmN0aW9uVXJsLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxuICBJbnZva2VNb2RlLFxuICBSdW50aW1lLFxuICBSdW50aW1lRmFtaWx5LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRnVuY3Rpb25Qcm9wc1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxGdW5jdGlvblVybFByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRnVuY3Rpb25VcmxQcm9wc1wiO1xuaW1wb3J0IHsgZ2V0TGFtYmRhQXJjaGl0ZWN0dXJlIH0gZnJvbSBcIi4uL3V0aWxzL2dldC1hcmNoaXRlY3R1cmVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNJbWFnZUZ1bmN0aW9uT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgZnVuY3Rpb25Qcm9wcz86IE9wdGlvbmFsRnVuY3Rpb25Qcm9wcztcbiAgcmVhZG9ubHkgZnVuY3Rpb25VcmxQcm9wcz86IE9wdGlvbmFsRnVuY3Rpb25VcmxQcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNJbWFnZUZ1bmN0aW9uUHJvcHMge1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgYXNzZXQgcHJlcGFyZWQgYnkgYE5leHRqc0J1aWxkYDogYnVuZGxlZCBoYW5kbGVyLFxuICAgKiBnbGliYyBgc2hhcnBgIGJpbmFyaWVzLCBhbmQgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYC5cbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQnVpbGQuaW1hZ2VPcHRpbWl6YXRpb25Bc3NldFBhdGh9XG4gICAqL1xuICByZWFkb25seSBpbWFnZU9wdGltaXphdGlvbkFzc2V0UGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUzMgYnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0cywgcmVhZCBieSB0aGUgaGFuZGxlciB0byBzZXJ2ZVxuICAgKiBub24tYWJzb2x1dGUgaW1hZ2UgVVJMcy5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0J1Y2tldDogSUJ1Y2tldDtcbiAgLyoqXG4gICAqIFMzIGtleSBwcmVmaXggdGhlIHN0YXRpYyBhc3NldHMgd2VyZSB1cGxvYWRlZCB1bmRlciwgaS5lLlxuICAgKiBgTmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeGAsIHdoaWNoIG5hbWVzcGFjZXMgYSBzaGFyZWQgYnVja2V0LlxuICAgKlxuICAgKiBUaHJlYWRlZCB0aHJvdWdoIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gcmVhZCBmcm9tIHRoZSBhcHAncyBidW5kbGVkIGNvbmZpZyxcbiAgICogYmVjYXVzZSBpdCdzIGRpc3RpbmN0IGZyb20gdGhlIGFwcCdzIG93biBgYmFzZVBhdGhgICh3aGljaCBuZXh0LWltYWdlLWxvYWRlclxuICAgKiBiYWtlcyBpbnRvIGhyZWZzKSDigJQgdGhlIHR3byBkaXZlcmdlIHdoZW4gdGhlIGFwcCdzIGBiYXNlUGF0aGAgY29tZXMgZnJvbVxuICAgKiBlbHNld2hlcmUsIGUuZy4gYW4gQVBJIEdhdGV3YXkgc3RhZ2UgdW5kZXIgYE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0tleVByZWZpeD86IHN0cmluZztcbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIG9mIGFueSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNJbWFnZUZ1bmN0aW9uT3ZlcnJpZGVzO1xufVxuXG4vKipcbiAqIERlZGljYXRlZCBMYW1iZGEgZnVuY3Rpb24gZm9yIE5leHQuanMgaW1hZ2Ugb3B0aW1pemF0aW9uXG4gKiAoYHNyYy9pbWFnZS1vcHRpbWl6YXRpb24vaGFuZGxlci5tdHNgKS4gS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBzZXJ2ZXJcbiAqIGZ1bmN0aW9uIHNvIGltYWdlIHJlcXVlc3RzIGdldCBhIGxpZ2h0d2VpZ2h0LCBuYXRpdmVseS1zdHJlYW1pbmcgemlwXG4gKiBMYW1iZGEgaW5zdGVhZCBvZiBwYXlpbmcgdGhlIERvY2tlci9MYW1iZGEgV2ViIEFkYXB0ZXIgY29sZC1zdGFydCBjb3N0LlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzSW1hZ2VGdW5jdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGZ1bmN0aW9uOiBMYW1iZGFGdW5jdGlvbjtcbiAgZnVuY3Rpb25Vcmw/OiBGdW5jdGlvblVybDtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNJbWFnZUZ1bmN0aW9uUHJvcHM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0ltYWdlRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uKCk7XG5cbiAgICBpZiAocHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TKSB7XG4gICAgICB0aGlzLmZ1bmN0aW9uLmdyYW50SW52b2tlKFxuICAgICAgICBuZXcgU2VydmljZVByaW5jaXBhbChcImNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmZ1bmN0aW9uVXJsID0gdGhpcy5mdW5jdGlvbi5hZGRGdW5jdGlvblVybCh7XG4gICAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICAgIGludm9rZU1vZGU6IEludm9rZU1vZGUuUkVTUE9OU0VfU1RSRUFNLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZnVuY3Rpb25VcmxQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRnVuY3Rpb24oKTogTGFtYmRhRnVuY3Rpb24ge1xuICAgIGNvbnN0IGZuID0gbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMsIFwiRm5cIiwge1xuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQodGhpcy5wcm9wcy5pbWFnZU9wdGltaXphdGlvbkFzc2V0UGF0aCksXG4gICAgICBoYW5kbGVyOiBcImhhbmRsZXIuaGFuZGxlclwiLFxuICAgICAgbWVtb3J5U2l6ZTogMjA0OCxcbiAgICAgIHJ1bnRpbWU6IG5ldyBSdW50aW1lKFwibm9kZWpzMjQueFwiLCBSdW50aW1lRmFtaWx5Lk5PREVKUyksXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIHZwYzogdGhpcy5wcm9wcy52cGMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZnVuY3Rpb25Qcm9wcyxcbiAgICAgIC8vIE11c3Qgbm90IGJlIG92ZXJyaWRhYmxlOiBOZXh0anNCdWlsZCBidW5kbGVzIGdsaWJjIGBzaGFycGAgYmluYXJpZXNcbiAgICAgIC8vIG1hdGNoaW5nIHRoZSBzeW50aCBtYWNoaW5lJ3MgYXJjaGl0ZWN0dXJlLCBzbyB0aGUgZGVwbG95ZWQgTGFtYmRhJ3NcbiAgICAgIC8vIGFyY2hpdGVjdHVyZSBtdXN0IGFsd2F5cyBtYXRjaCB3aGF0IHdhcyBidW5kbGVkLlxuICAgICAgYXJjaGl0ZWN0dXJlOiBnZXRMYW1iZGFBcmNoaXRlY3R1cmUoKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIENES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRTpcbiAgICAgICAgICB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWDpcbiAgICAgICAgICB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0tleVByZWZpeCA/PyBcIlwiLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZnVuY3Rpb25Qcm9wcz8uZW52aXJvbm1lbnQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnRSZWFkKGZuKTtcblxuICAgIHJldHVybiBmbjtcbiAgfVxufVxuIl19
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Undocumented, unsupported gates for work in progress.
|
|
3
|
-
*
|
|
4
|
-
* These are deliberately env vars rather than construct props: they select
|
|
5
|
-
* between an existing code path and one that is still being built, so they
|
|
6
|
-
* carry no JSII public surface to document, deprecate, or remove. Each one is
|
|
7
|
-
* deleted in the PR that makes its new path the only path.
|
|
8
|
-
*
|
|
9
|
-
* Not part of this package's public API. Do not reference them from README or
|
|
10
|
-
* `docs/`, and do not use them in a real deployment.
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* Serve `_next/image` from a dedicated image optimization Lambda
|
|
14
|
-
* (`NextjsImageFunction`) instead of the Next.js server function, for the two
|
|
15
|
-
* Functions `NextjsType`s.
|
|
16
|
-
*
|
|
17
|
-
* Off by default because the dedicated Lambda is not the Next.js server, so
|
|
18
|
-
* Next.js middleware does not run for image requests — Next's default matcher
|
|
19
|
-
* (`/:path*`) covers `/_next/image`. The adapter runtime release
|
|
20
|
-
* (`docs/plans/adapter-runtime-release.md`) resolves that by dispatching
|
|
21
|
-
* `_next/image` in-process after middleware, at which point the separate
|
|
22
|
-
* Lambda and this flag both go away.
|
|
23
|
-
*/
|
|
24
|
-
export declare function useDedicatedImageFunction(): boolean;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Undocumented, unsupported gates for work in progress.
|
|
4
|
-
*
|
|
5
|
-
* These are deliberately env vars rather than construct props: they select
|
|
6
|
-
* between an existing code path and one that is still being built, so they
|
|
7
|
-
* carry no JSII public surface to document, deprecate, or remove. Each one is
|
|
8
|
-
* deleted in the PR that makes its new path the only path.
|
|
9
|
-
*
|
|
10
|
-
* Not part of this package's public API. Do not reference them from README or
|
|
11
|
-
* `docs/`, and do not use them in a real deployment.
|
|
12
|
-
*/
|
|
13
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.useDedicatedImageFunction = useDedicatedImageFunction;
|
|
15
|
-
/**
|
|
16
|
-
* Serve `_next/image` from a dedicated image optimization Lambda
|
|
17
|
-
* (`NextjsImageFunction`) instead of the Next.js server function, for the two
|
|
18
|
-
* Functions `NextjsType`s.
|
|
19
|
-
*
|
|
20
|
-
* Off by default because the dedicated Lambda is not the Next.js server, so
|
|
21
|
-
* Next.js middleware does not run for image requests — Next's default matcher
|
|
22
|
-
* (`/:path*`) covers `/_next/image`. The adapter runtime release
|
|
23
|
-
* (`docs/plans/adapter-runtime-release.md`) resolves that by dispatching
|
|
24
|
-
* `_next/image` in-process after middleware, at which point the separate
|
|
25
|
-
* Lambda and this flag both go away.
|
|
26
|
-
*/
|
|
27
|
-
function useDedicatedImageFunction() {
|
|
28
|
-
return process.env.CDK_NEXTJS_EXPERIMENTAL_DEDICATED_IMAGE_FUNCTION === "1";
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZXJpbWVudGFsLWZsYWdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2V4cGVyaW1lbnRhbC1mbGFncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7QUFjSCw4REFFQztBQWREOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IseUJBQXlCO0lBQ3ZDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsS0FBSyxHQUFHLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5kb2N1bWVudGVkLCB1bnN1cHBvcnRlZCBnYXRlcyBmb3Igd29yayBpbiBwcm9ncmVzcy5cbiAqXG4gKiBUaGVzZSBhcmUgZGVsaWJlcmF0ZWx5IGVudiB2YXJzIHJhdGhlciB0aGFuIGNvbnN0cnVjdCBwcm9wczogdGhleSBzZWxlY3RcbiAqIGJldHdlZW4gYW4gZXhpc3RpbmcgY29kZSBwYXRoIGFuZCBvbmUgdGhhdCBpcyBzdGlsbCBiZWluZyBidWlsdCwgc28gdGhleVxuICogY2Fycnkgbm8gSlNJSSBwdWJsaWMgc3VyZmFjZSB0byBkb2N1bWVudCwgZGVwcmVjYXRlLCBvciByZW1vdmUuIEVhY2ggb25lIGlzXG4gKiBkZWxldGVkIGluIHRoZSBQUiB0aGF0IG1ha2VzIGl0cyBuZXcgcGF0aCB0aGUgb25seSBwYXRoLlxuICpcbiAqIE5vdCBwYXJ0IG9mIHRoaXMgcGFja2FnZSdzIHB1YmxpYyBBUEkuIERvIG5vdCByZWZlcmVuY2UgdGhlbSBmcm9tIFJFQURNRSBvclxuICogYGRvY3MvYCwgYW5kIGRvIG5vdCB1c2UgdGhlbSBpbiBhIHJlYWwgZGVwbG95bWVudC5cbiAqL1xuXG4vKipcbiAqIFNlcnZlIGBfbmV4dC9pbWFnZWAgZnJvbSBhIGRlZGljYXRlZCBpbWFnZSBvcHRpbWl6YXRpb24gTGFtYmRhXG4gKiAoYE5leHRqc0ltYWdlRnVuY3Rpb25gKSBpbnN0ZWFkIG9mIHRoZSBOZXh0LmpzIHNlcnZlciBmdW5jdGlvbiwgZm9yIHRoZSB0d29cbiAqIEZ1bmN0aW9ucyBgTmV4dGpzVHlwZWBzLlxuICpcbiAqIE9mZiBieSBkZWZhdWx0IGJlY2F1c2UgdGhlIGRlZGljYXRlZCBMYW1iZGEgaXMgbm90IHRoZSBOZXh0LmpzIHNlcnZlciwgc29cbiAqIE5leHQuanMgbWlkZGxld2FyZSBkb2VzIG5vdCBydW4gZm9yIGltYWdlIHJlcXVlc3RzIOKAlCBOZXh0J3MgZGVmYXVsdCBtYXRjaGVyXG4gKiAoYC86cGF0aCpgKSBjb3ZlcnMgYC9fbmV4dC9pbWFnZWAuIFRoZSBhZGFwdGVyIHJ1bnRpbWUgcmVsZWFzZVxuICogKGBkb2NzL3BsYW5zL2FkYXB0ZXItcnVudGltZS1yZWxlYXNlLm1kYCkgcmVzb2x2ZXMgdGhhdCBieSBkaXNwYXRjaGluZ1xuICogYF9uZXh0L2ltYWdlYCBpbi1wcm9jZXNzIGFmdGVyIG1pZGRsZXdhcmUsIGF0IHdoaWNoIHBvaW50IHRoZSBzZXBhcmF0ZVxuICogTGFtYmRhIGFuZCB0aGlzIGZsYWcgYm90aCBnbyBhd2F5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGVkaWNhdGVkSW1hZ2VGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkNES19ORVhUSlNfRVhQRVJJTUVOVEFMX0RFRElDQVRFRF9JTUFHRV9GVU5DVElPTiA9PT0gXCIxXCI7XG59XG4iXX0=
|
|
File without changes
|